Browse Source

feat:业务管理新增 工单待办,工单回访,工单发布,工单延期,工单甄别,工单督办列表;

zhangchong 1 year ago
parent
commit
a7f48f91c8

+ 333 - 0
src/views/business/backlog/index.vue

@@ -0,0 +1,333 @@
+<template>
+  <div class="business-backlog-container layout-pd">
+    <!-- 搜索  -->
+    <el-card shadow="never">
+      <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent class="mt15" label-width="100px">
+        <el-row :gutter="10">
+          <el-col :span="8">
+            <el-form-item label="发布状态" prop="AcceptType">
+              <el-select v-model="state.queryParams.AcceptType" placeholder="请选择发布状态" multiple clearable class="w100">
+                <el-option v-for="item in state.acceptTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="工单标题" prop="Keyword">
+              <el-input v-model="state.queryParams.Keyword" placeholder="工单编码/标题" clearable @keyup.enter="queryList" />
+            </el-form-item>
+          </el-col>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="发布人" prop="Content">
+                <el-input v-model="state.queryParams.Content" placeholder="姓名/工号" clearable @keyup.enter="queryList" />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="发布范围" prop="AcceptType">
+                <el-select v-model="state.queryParams.AcceptType" placeholder="请选择发布范围" multiple clearable class="w100">
+                  <el-option v-for="item in state.acceptTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="受理类型" prop="Channel">
+                <el-select v-model="state.queryParams.Channel" placeholder="请选择受理类型" multiple clearable class="w100">
+                  <el-option v-for="item in state.channelOptions" :value="item.key" :key="item.key" :label="item.value" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="热点分类" prop="HotspotId">
+                <el-tree-select
+                    class="w100"
+                    v-model="state.queryParams.HotspotId"
+                    filterable
+                    clearable
+                    multiple
+                    :render-after-expand="false"
+                    show-checkbox
+                    placeholder="请选择热点分类"
+                    :props="HotspotProps"
+                    lazy
+                    :load="load"
+                    node-key="id"
+                    check-strictly
+                />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="受理时间" prop="crTime">
+                <el-date-picker
+                    v-model="state.queryParams.crTime"
+                    type="datetimerange"
+                    unlink-panels
+                    range-separator="至"
+                    start-placeholder="开始时间"
+                    end-placeholder="结束时间"
+                    :shortcuts="shortcuts"
+                    @change="timeStartChangeCr"
+                    value-format="YYYY-MM-DD[T]HH:mm:ss"
+                />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="归档时间" prop="exTime">
+                <el-date-picker
+                    v-model="state.queryParams.exTime"
+                    type="datetimerange"
+                    unlink-panels
+                    range-separator="至"
+                    start-placeholder="开始时间"
+                    end-placeholder="结束时间"
+                    :shortcuts="shortcuts"
+                    @change="timeStartChangeEx"
+                    value-format="YYYY-MM-DD[T]HH:mm:ss"
+                />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <el-col :span="8">
+            <div class="flex-end w100">
+              <el-button type="primary" @click="queryList" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+              <el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+              <el-button link type="primary" @click="closeSearch">
+                {{ searchCol ? '展开' : '收起' }}
+                <SvgIcon :class="{ 'is-reverse': searchCol }" name="ele-ArrowUp" class="mr5 arrow" size="18px" />
+              </el-button>
+            </div>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-card>
+    <el-card shadow="never">
+      <!-- 功能按钮 -->
+      <div class="mb20">
+          <el-button type="primary" @click="onAddWorkOrder" v-auth="'business:backlog:add'">
+            <SvgIcon name="ele-Plus" class="mr5" />新建工单
+          </el-button>
+          <el-button type="primary" @click="onExport" v-auth="'business:backlog:export'" :disabled="!multipleSelection.length">
+            <SvgIcon name="iconfont icon-daochu" class="mr5" />导出
+          </el-button>
+      </div>
+      <!-- 表格 -->
+      <el-table :data="state.tableList" v-loading="state.loading" row-key="id" ref="multipleTableRef" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" />
+        <el-table-column prop="acceptTypeText" label="工单超期间隔" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="省/市工单" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="no" label="工单编号" show-overflow-tooltip></el-table-column>
+        <el-table-column label="标题" show-overflow-tooltip width="400">
+          <template #default="{ row }">
+            <el-button link type="primary">{{ row.title }}</el-button>
+          </template>
+        </el-table-column>
+        <el-table-column prop="acceptTypeText" label="工单状态" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="当前办理节点" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="expiredTime" label="当前节点签收时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="acceptTypeText" label="受理类型" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="expiredTime" label="期满时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="hotspotName" label="热点分类" show-overflow-tooltip></el-table-column>
+        <el-table-column label="紧急程度" show-overflow-tooltip prop="emergencyLevelText" width="100">
+          <template #default="{row}">
+						<span v-if="row.emergencyLevel === 2 || row.emergencyLevel === 3" style="color: var(--el-color-danger)">{{
+                row.emergencyLevelText
+              }}</span>
+            <span v-else style="color: var(--el-color-primary)">{{ row.emergencyLevelText }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="acceptTypeText" label="来源方式" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="接办部门" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="170">
+          <template #default="{row}">
+            <span>{{ row.employeeName + '[' + row.employeeStaffNo + ']' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" width="150" fixed="right" align="center">
+          <template #default="{ row }">
+            <el-button link type="primary" @click="onOrderDetail(row)" title="查看工单详情" v-auth="'business:backlog:detail'"> 详情 </el-button>
+          </template>
+        </el-table-column>
+        <template #empty>
+          <Empty />
+        </template>
+      </el-table>
+      <!-- 分页 -->
+      <pagination
+          :total="state.total"
+          v-model:page="state.queryParams.PageIndex"
+          v-model:limit="state.queryParams.PageSize"
+          @pagination="queryList"
+      />
+    </el-card>
+    <!-- 工单详情 -->
+    <order-detail ref="OrderDetailRef" @updateList="queryList" />
+  </div>
+</template>
+<script setup lang="ts" name="orderBacklog">
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { hotSpotType, listBaseData } from '/@/api/business/order';
+import {ElButton, ElMessage, FormInstance} from 'element-plus';
+import { auth } from '/@/utils/authFunction';
+import { throttle,shortcuts } from '/@/utils/tools';
+import { formatDate } from '/@/utils/formatTime';
+import {useRouter} from "vue-router";
+// 引入组件
+const OrderDetail = defineAsyncComponent(() => import('/@/views/business/order/components/Order-detail.vue'));
+
+// 定义变量内容
+const ruleFormRef = ref<RefType>();
+const orderReleaseRef = ref<RefType>();
+const searchCol = ref(true);
+const OrderDetailRef = ref<RefType>();
+const router = useRouter();
+const state = reactive(<any>{
+  queryParams: {
+    // 查询条件
+    PageIndex: 1,
+    PageSize: 10,
+    Keyword: '', // 关键字
+    Content: '', // 工单内容
+    AcceptType: '', // 受理类型
+    Channel: '', // 渠道
+    HotspotId: [], // 热点
+    OrgCode: [], // 机构
+    NameOrNo: '', // 受理坐席
+    crTime: [], // 创建时间
+    CreationTimeStart: '', // 创建时间 开始
+    CreationTimeEnd: '', // 创建时间 结束
+    TransferPhone: '', // 转派人
+    EmergencyLevel: [], // 紧急程度
+    exTime: [], // 办理期限
+    ExpiredTimeStart: '', //办理期限 开始
+    ExpiredTimeEnd: '', //办理期限 结束
+    PhoneNo: '', // 手机号
+    Status: [], // 状态
+    pushTypeOptions: '', //
+    PushTypeCode: '', //推送类型
+  },
+  tableList: [], //表单
+  loading: false, // 加载
+  total: 0, // 总数
+  acceptTypeOptions: [], //受理类型
+  channelOptions: [], // 来源频道
+  emergencyLevelOptions: [], // 紧急程度
+  orderStatusOptions: [], // 工单状态
+  orgOptions: [], // 部门
+  pushTypeOptions: [], //推送分类
+  orgData: [], // 机构数据
+});
+// 热点分类远程搜索
+const HotspotProps = {
+  label: 'hotSpotName',
+  children: 'children',
+  isLeaf: 'isLeaf',
+};
+// 热点分类远程搜索
+const load = async (node: any, resolve: any) => {
+  if (node.isLeaf) return resolve([]);
+  let res: any = await hotSpotType({ id: node.data.id ? node.data.id : '' });
+  resolve(res.result);
+};
+
+// 展开/收起
+const closeSearch = () => {
+  searchCol.value = !searchCol.value;
+};
+const handleTimeChange = (val: string[], startKey: string, endKey: string) => {
+  if (val) {
+    state.queryParams[startKey] = val[0];
+    state.queryParams[endKey] = val[1];
+  } else {
+    state.queryParams[startKey] = '';
+    state.queryParams[endKey] = '';
+  }
+};
+// 受理时间
+const timeStartChangeCr = (val: string[]) => {
+  handleTimeChange(val, 'CreationTimeStart', 'CreationTimeEnd');
+};
+// 过期时间
+const timeStartChangeEx = (val: string[]) => {
+  handleTimeChange(val, 'ExpiredTimeStart', 'ExpiredTimeEnd');
+};
+// 获取查询条件基础信息
+const getBaseData = async () => {
+  const res: any = await listBaseData();
+  state.acceptTypeOptions = res.result?.acceptTypeOptions ?? [];
+  state.channelOptions = res.result?.channelOptions ?? [];
+  state.emergencyLevelOptions = res.result?.emergencyLevelOptions ?? [];
+  state.orgOptions = res.result?.orgOptions ?? [];
+  state.pushTypeOptions = res.result?.pushTypeOptions ?? [];
+  state.orderStatusOptions = res.result?.orderStatusOptions ?? [];
+};
+/** 获取列表 */
+const queryList = throttle(() => {
+  if (!auth('business:backlog:query')) ElMessage.error('抱歉,您没有权限查看工单待办!');
+  else {
+  }
+}, 500);
+
+/** 重置按钮操作 */
+const resetQuery = throttle((formEl: FormInstance | undefined) => {
+  orderReleaseRef.value.openDialog();
+  if (!formEl) return;
+  formEl.resetFields();
+  state.queryParams.CreationTimeStart = '';
+  state.queryParams.CreationTimeEnd = '';
+  state.queryParams.ExpiredTimeStart = '';
+  state.queryParams.ExpiredTimeStart = '';
+  queryList();
+}, 500);
+// 新增工单
+const onAddWorkOrder = () => {
+  // 跳转到录入工单页面
+  router.push('/business/order/accept');
+};
+// 表格多选
+const multipleTableRef = ref<RefType>()
+const multipleSelection = ref<any>([])
+const handleSelectionChange = (val: any[]) => {
+  multipleSelection.value = val
+}
+// 导出
+const onExport = () => {
+  console.log('导出');
+};
+// 查看详情
+const onOrderDetail = (row: any) => {
+  OrderDetailRef.value.openDialog(row);
+};
+onMounted(async () => {
+  await getBaseData();
+  queryList();
+});
+</script>
+
+<style scoped lang="scss">
+.business-backlog-container {
+  .arrow {
+    transition: transform var(--el-transition-duration);
+    cursor: pointer;
+  }
+  .arrow.is-reverse {
+    transform: rotateZ(-180deg);
+  }
+}
+</style>

+ 358 - 0
src/views/business/delay/index.vue

@@ -0,0 +1,358 @@
+<template>
+  <div class="business-delay-container layout-pd">
+    <!-- 搜索  -->
+    <el-card shadow="never">
+      <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent class="mt15" label-width="100px">
+        <el-row :gutter="10">
+          <el-col :span="8">
+            <el-form-item label="发布状态" prop="AcceptType">
+              <el-select v-model="state.queryParams.AcceptType" placeholder="请选择发布状态" multiple clearable class="w100">
+                <el-option v-for="item in state.acceptTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="工单标题" prop="Keyword">
+              <el-input v-model="state.queryParams.Keyword" placeholder="工单编码/标题" clearable @keyup.enter="queryList" />
+            </el-form-item>
+          </el-col>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="发布人" prop="Content">
+                <el-input v-model="state.queryParams.Content" placeholder="姓名/工号" clearable @keyup.enter="queryList" />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="发布范围" prop="AcceptType">
+                <el-select v-model="state.queryParams.AcceptType" placeholder="请选择发布范围" multiple clearable class="w100">
+                  <el-option v-for="item in state.acceptTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="受理类型" prop="Channel">
+                <el-select v-model="state.queryParams.Channel" placeholder="请选择受理类型" multiple clearable class="w100">
+                  <el-option v-for="item in state.channelOptions" :value="item.key" :key="item.key" :label="item.value" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="热点分类" prop="HotspotId">
+                <el-tree-select
+                    class="w100"
+                    v-model="state.queryParams.HotspotId"
+                    filterable
+                    clearable
+                    multiple
+                    :render-after-expand="false"
+                    show-checkbox
+                    placeholder="请选择热点分类"
+                    :props="HotspotProps"
+                    lazy
+                    :load="load"
+                    node-key="id"
+                    check-strictly
+                />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="受理时间" prop="crTime">
+                <el-date-picker
+                    v-model="state.queryParams.crTime"
+                    type="datetimerange"
+                    unlink-panels
+                    range-separator="至"
+                    start-placeholder="开始时间"
+                    end-placeholder="结束时间"
+                    :shortcuts="shortcuts"
+                    @change="timeStartChangeCr"
+                    value-format="YYYY-MM-DD[T]HH:mm:ss"
+                />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="归档时间" prop="exTime">
+                <el-date-picker
+                    v-model="state.queryParams.exTime"
+                    type="datetimerange"
+                    unlink-panels
+                    range-separator="至"
+                    start-placeholder="开始时间"
+                    end-placeholder="结束时间"
+                    :shortcuts="shortcuts"
+                    @change="timeStartChangeEx"
+                    value-format="YYYY-MM-DD[T]HH:mm:ss"
+                />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <el-col :span="8">
+            <div class="flex-end w100">
+              <el-button type="primary" @click="queryList" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+              <el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+              <el-button link type="primary" @click="closeSearch">
+                {{ searchCol ? '展开' : '收起' }}
+                <SvgIcon :class="{ 'is-reverse': searchCol }" name="ele-ArrowUp" class="mr5 arrow" size="18px" />
+              </el-button>
+            </div>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-card>
+    <el-card shadow="never">
+      <!-- 功能按钮 -->
+      <div class="mb20">
+          <el-button type="primary" @click="onExport" v-auth="'business:delay:export'" :disabled="!multipleSelection.length">
+            <SvgIcon name="iconfont icon-daochu" class="mr5" />导出
+          </el-button>
+      </div>
+      <!-- 表格 -->
+      <el-table :data="state.tableList" v-loading="state.loading" row-key="id" ref="multipleTableRef" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" />
+        <el-table-column prop="no" label="工单编号" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="省/市工单" show-overflow-tooltip></el-table-column>
+        <el-table-column label="工单标题" show-overflow-tooltip width="400">
+          <template #default="{ row }">
+            <el-button link type="primary">{{ row.title }}</el-button>
+          </template>
+        </el-table-column>
+        <el-table-column prop="expiredTime" label="受理时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="170">
+          <template #default="{row}">
+            <span>{{ row.employeeName + '[' + row.employeeStaffNo + ']' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="hotspotName" label="热点分类" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="受理类型" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="接办部门" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="expiredTime" label="接办时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="acceptTypeText" label="延期申请状态" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="expiredTime" label="延期申请时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="acceptTypeText" label="延期申请人" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="延期申请部门" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="延期申请时限" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="延期申请单位" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="申请理由" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="expiredTime" label="申请前期满时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="expiredTime" label="通过后期满时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" width="150" fixed="right" align="center">
+          <template #default="{ row }">
+            <el-button link type="primary" @click="onOrderDetail(row)" title="查看延期详情" v-auth="'business:delay:detail'"> 延期详情 </el-button>
+            <el-button link type="primary" @click="processDetail(row)" title="查看流程明细" v-auth="'business:delay:processDetail'"> 流程明细 </el-button>
+            <el-button link type="primary" @click="revocation(row)" title="撤销延期申请" v-auth="'business:delay:revocation'"> 撤销 </el-button>
+          </template>
+        </el-table-column>
+        <template #empty>
+          <Empty />
+        </template>
+      </el-table>
+      <!-- 分页 -->
+      <pagination
+          :total="state.total"
+          v-model:page="state.queryParams.PageIndex"
+          v-model:limit="state.queryParams.PageSize"
+          @pagination="queryList"
+      />
+    </el-card>
+    <!-- 工单详情 -->
+    <order-detail ref="OrderDetailRef" @updateList="queryList" />
+  </div>
+</template>
+<script setup lang="ts" name="orderDelay">
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import {hotSpotType, listBaseData, orderDelete} from '/@/api/business/order';
+import {ElButton, ElMessage, ElMessageBox, FormInstance} from 'element-plus';
+import { auth } from '/@/utils/authFunction';
+import { throttle,shortcuts } from '/@/utils/tools';
+import { formatDate } from '/@/utils/formatTime';
+import {useRouter} from "vue-router";
+// 引入组件
+const OrderDetail = defineAsyncComponent(() => import('/@/views/business/order/components/Order-detail.vue'));
+
+// 定义变量内容
+const ruleFormRef = ref<RefType>();
+const orderReleaseRef = ref<RefType>();
+const searchCol = ref(true);
+const OrderDetailRef = ref<RefType>();
+const router = useRouter();
+const state = reactive(<any>{
+  queryParams: {
+    // 查询条件
+    PageIndex: 1,
+    PageSize: 10,
+    Keyword: '', // 关键字
+    Content: '', // 工单内容
+    AcceptType: '', // 受理类型
+    Channel: '', // 渠道
+    HotspotId: [], // 热点
+    OrgCode: [], // 机构
+    NameOrNo: '', // 受理坐席
+    crTime: [], // 创建时间
+    CreationTimeStart: '', // 创建时间 开始
+    CreationTimeEnd: '', // 创建时间 结束
+    TransferPhone: '', // 转派人
+    EmergencyLevel: [], // 紧急程度
+    exTime: [], // 办理期限
+    ExpiredTimeStart: '', //办理期限 开始
+    ExpiredTimeEnd: '', //办理期限 结束
+    PhoneNo: '', // 手机号
+    Status: [], // 状态
+    pushTypeOptions: '', //
+    PushTypeCode: '', //推送类型
+  },
+  tableList: [], //表单
+  loading: false, // 加载
+  total: 0, // 总数
+  acceptTypeOptions: [], //受理类型
+  channelOptions: [], // 来源频道
+  emergencyLevelOptions: [], // 紧急程度
+  orderStatusOptions: [], // 工单状态
+  orgOptions: [], // 部门
+  pushTypeOptions: [], //推送分类
+  orgData: [], // 机构数据
+});
+// 热点分类远程搜索
+const HotspotProps = {
+  label: 'hotSpotName',
+  children: 'children',
+  isLeaf: 'isLeaf',
+};
+// 热点分类远程搜索
+const load = async (node: any, resolve: any) => {
+  if (node.isLeaf) return resolve([]);
+  let res: any = await hotSpotType({ id: node.data.id ? node.data.id : '' });
+  resolve(res.result);
+};
+
+// 展开/收起
+const closeSearch = () => {
+  searchCol.value = !searchCol.value;
+};
+const handleTimeChange = (val: string[], startKey: string, endKey: string) => {
+  if (val) {
+    state.queryParams[startKey] = val[0];
+    state.queryParams[endKey] = val[1];
+  } else {
+    state.queryParams[startKey] = '';
+    state.queryParams[endKey] = '';
+  }
+};
+// 受理时间
+const timeStartChangeCr = (val: string[]) => {
+  handleTimeChange(val, 'CreationTimeStart', 'CreationTimeEnd');
+};
+// 过期时间
+const timeStartChangeEx = (val: string[]) => {
+  handleTimeChange(val, 'ExpiredTimeStart', 'ExpiredTimeEnd');
+};
+// 获取查询条件基础信息
+const getBaseData = async () => {
+  const res: any = await listBaseData();
+  state.acceptTypeOptions = res.result?.acceptTypeOptions ?? [];
+  state.channelOptions = res.result?.channelOptions ?? [];
+  state.emergencyLevelOptions = res.result?.emergencyLevelOptions ?? [];
+  state.orgOptions = res.result?.orgOptions ?? [];
+  state.pushTypeOptions = res.result?.pushTypeOptions ?? [];
+  state.orderStatusOptions = res.result?.orderStatusOptions ?? [];
+};
+/** 获取列表 */
+const queryList = throttle(() => {
+  if (!auth('business:backlog:query')) ElMessage.error('抱歉,您没有权限查看工单待办!');
+  else {
+  }
+}, 500);
+
+/** 重置按钮操作 */
+const resetQuery = throttle((formEl: FormInstance | undefined) => {
+  orderReleaseRef.value.openDialog();
+  if (!formEl) return;
+  formEl.resetFields();
+  state.queryParams.CreationTimeStart = '';
+  state.queryParams.CreationTimeEnd = '';
+  state.queryParams.ExpiredTimeStart = '';
+  state.queryParams.ExpiredTimeStart = '';
+  queryList();
+}, 500);
+// 导出
+const onExport = () => {
+  console.log('导出');
+};
+// 查看延期详情
+const onOrderDetail = (row: any) => {
+  console.log(row,'查看延期详情')
+};
+// 流程明细
+const processDetail = ()=>{
+
+}
+// 撤销
+const revocation = (row:any)=>{
+  ElMessageBox.confirm(`确认撤销【${row.no}】?`, '提示', {
+    confirmButtonText: '确认',
+    cancelButtonText: '取消',
+    type: 'warning',
+    draggable: true,
+    cancelButtonClass: 'default-button',
+    autofocus: false,
+  })
+      .then(() => {
+        // orderDelete(row.id).then(() => {
+        //   ElMessage.success('操作成功');
+        //   queryList();
+        // });
+      })
+      .catch(() => {});
+}
+// 表格多选
+const multipleTableRef = ref<RefType>()
+const multipleSelection = ref<any>([])
+const handleSelectionChange = (val: any[]) => {
+  multipleSelection.value = val
+}
+onMounted(async () => {
+  await getBaseData();
+  queryList();
+});
+</script>
+
+<style scoped lang="scss">
+.business-delay-container {
+  .arrow {
+    transition: transform var(--el-transition-duration);
+    cursor: pointer;
+  }
+  .arrow.is-reverse {
+    transform: rotateZ(-180deg);
+  }
+}
+</style>

+ 0 - 13
src/views/business/extension/index.vue

@@ -1,13 +0,0 @@
-<template>
-    <div class="business-extension layout-pd">
-            延期申请
-    </div>
-</template>
-
-<script setup lang="ts" name="businessExtension">
-
-</script>
-
-<style scoped lang="scss">
-
-</style>

+ 285 - 269
src/views/business/followUp/index.vue

@@ -1,314 +1,330 @@
 <template>
-    <div class="business-followUp-container layout-pd">
-      <!-- 搜索  -->
-      <el-card shadow="never">
-        <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent class="mt15" label-width="100px">
-          <el-row :gutter="10">
-            <el-col :span="8">
-              <el-form-item label="关键字" prop="Keyword">
-                <el-input v-model="state.queryParams.Keyword" placeholder="工单编码/标题" clearable @keyup.enter="queryList" />
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="回访状态" prop="AcceptType">
-                <el-select v-model="state.queryParams.AcceptType" placeholder="请选择回访状态" multiple clearable class="w100">
-                  <el-option v-for="item in state.acceptTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
-                </el-select>
-              </el-form-item>
-            </el-col>
-            <transition name="el-zoom-in-top">
-              <el-col :span="8" v-show="!searchCol">
-                <el-form-item label="受理时间" prop="crTime">
-                  <el-date-picker
-                      v-model="state.queryParams.crTime"
-                      type="datetimerange"
-                      unlink-panels
-                      range-separator="至"
-                      start-placeholder="开始时间"
-                      end-placeholder="结束时间"
-                      :shortcuts="shortcuts"
-                      @change="timeStartChangeCr"
-                      value-format="YYYY-MM-DD[T]HH:mm:ss"
-                  />
-                </el-form-item>
-              </el-col>
-            </transition>
-            <transition name="el-zoom-in-top">
-              <el-col :span="8" v-show="!searchCol">
-                <el-form-item label="归档时间" prop="exTime">
-                  <el-date-picker
-                      v-model="state.queryParams.exTime"
-                      type="datetimerange"
-                      unlink-panels
-                      range-separator="至"
-                      start-placeholder="开始时间"
-                      end-placeholder="结束时间"
-                      :shortcuts="shortcuts"
-                      @change="timeStartChangeEx"
-                      value-format="YYYY-MM-DD[T]HH:mm:ss"
-                  />
-                </el-form-item>
-              </el-col>
-            </transition>
-            <transition name="el-zoom-in-top">
-              <el-col :span="8" v-show="!searchCol">
-                <el-form-item label="回访时间" prop="exTime">
-                  <el-date-picker
-                      v-model="state.queryParams.exTime"
-                      type="datetimerange"
-                      unlink-panels
-                      range-separator="至"
-                      start-placeholder="开始时间"
-                      end-placeholder="结束时间"
-                      :shortcuts="shortcuts"
-                      @change="timeStartChangeEx"
-                      value-format="YYYY-MM-DD[T]HH:mm:ss"
-                  />
-                </el-form-item>
-              </el-col>
-            </transition>
-            <transition name="el-zoom-in-top">
-              <el-col :span="8" v-show="!searchCol">
-                <el-form-item label="回访方式" prop="AcceptType">
-                  <el-select v-model="state.queryParams.AcceptType" placeholder="请选择回访方式" multiple clearable class="w100">
-                    <el-option v-for="item in state.acceptTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
-                  </el-select>
-                </el-form-item>
-              </el-col>
-            </transition>
-            <el-col :span="8">
-              <div class="flex-end w100">
-                <el-button type="primary" @click="queryList" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-                <el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
-                <el-button link type="primary" @click="closeSearch">
-                  {{ searchCol ? '展开' : '收起' }}
-                  <SvgIcon :class="{ 'is-reverse': searchCol }" name="ele-ArrowUp" class="mr5 arrow" size="18px" />
-                </el-button>
-              </div>
-            </el-col>
-          </el-row>
-        </el-form>
-      </el-card>
-      <el-card shadow="never">
-          <!-- 功能按钮 -->
-          <div class="flex-center-between mb20 mt20">
-            <p class="table-title">信息列表</p>
-            <div>
-              <el-button type="primary" @click="onTextMessageFollowUp" :disabled="!multipleSelection.length" v-auth="'business:followUp:textMessage'">短信回访</el-button>
-            </div>
-          </div>
-          <!-- 表格 -->
-          <el-table :data="state.tableList" v-loading="state.loading" row-key="id" ref="multipleTableRef" @selection-change="handleSelectionChange">
-            <el-table-column type="selection" width="55" />
-            <el-table-column type="index" width="60" label="序号" />
-            <el-table-column label="工单标题" show-overflow-tooltip width="400">
-              <template #default="{ row }">
-                <el-button link type="primary">{{ row.title }}</el-button>
-              </template>
-            </el-table-column>
-            <el-table-column label="工单编码" prop="no" show-overflow-tooltip width="150">
-              <template #default="{row}">
-                <span>{{ row.no }}</span>
-              </template>
-            </el-table-column>
-            <el-table-column prop="employeeName" label="受理坐席" show-overflow-tooltip width="170">
-              <template #default="{row}">
-                <span>{{ row.employeeName + '[' + row.employeeStaffNo + ']' }}</span>
-              </template>
-            </el-table-column>
-            <el-table-column prop="expiredTime" label="受理时间" show-overflow-tooltip width="170">
-              <template #default="{row}">
-                <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-              </template>
-            </el-table-column>
-            <el-table-column prop="expiredTime" label="归档时间" show-overflow-tooltip width="170">
-              <template #default="{ row }">
-                <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-              </template>
-            </el-table-column>
-            <el-table-column prop="employeeName" label="回访状态" show-overflow-tooltip width="170">
-              <template #default="{row}">
-                <!-- 已回访 -->
-                <span style="color: var(--el-color-info)" v-if="row.status === 0">{{ row.statusText }}</span>
-                <el-button v-else link v-auth="'business:followUp:phone'" type="primary">回访</el-button>
-              </template>
-            </el-table-column>
-            <el-table-column label="回访人" prop="no" show-overflow-tooltip width="150">
-              <template #default="{row}">
-                <span>{{ row.no }}</span>
-              </template>
-            </el-table-column>
-            <el-table-column prop="expiredTime" label="回访时间" show-overflow-tooltip width="170">
-              <template #default="{ row }">
-                <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-              </template>
-            </el-table-column>
-            <el-table-column label="回访方式" prop="no" show-overflow-tooltip width="150">
-              <template #default="{row}">
-                <span>{{ row.no }}</span>
-              </template>
-            </el-table-column>
-            <el-table-column label="操作" width="150" fixed="right" align="center">
-              <template #default="{ row }">
-                <el-button link v-if="row.status === 0" type="danger" @click="onDetail(row)" title="删除工单" v-auth="'business:followUp:detail'">
-                  详情
-                </el-button>
-              </template>
-            </el-table-column>
-            <template #empty>
-              <Empty />
-            </template>
-          </el-table>
-          <!-- 分页 -->
-          <pagination
-              :total="state.total"
-              v-model:page="state.queryParams.PageIndex"
-              v-model:limit="state.queryParams.PageSize"
-              @pagination="queryList"
-          />
-      </el-card>
-        <!-- 电话回访 -->
-      <follow-up-phone ref="followUpPhoneRef" @updateList="queryList" />
-    </div>
+	<div class="business-followUp-container layout-pd">
+		<!-- 搜索  -->
+		<el-card shadow="never">
+			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent class="mt15" label-width="100px">
+				<el-row :gutter="10">
+					<el-col :span="8">
+						<el-form-item label="关键字" prop="Keyword">
+							<el-input v-model="state.queryParams.Keyword" placeholder="工单编码/标题" clearable @keyup.enter="queryList" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="8">
+						<el-form-item label="回访状态" prop="AcceptType">
+							<el-select v-model="state.queryParams.AcceptType" placeholder="请选择回访状态" multiple clearable class="w100">
+								<el-option v-for="item in state.acceptTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<transition name="el-zoom-in-top">
+						<el-col :span="8" v-show="!searchCol">
+							<el-form-item label="受理时间" prop="crTime">
+								<el-date-picker
+									v-model="state.queryParams.crTime"
+									type="datetimerange"
+									unlink-panels
+									range-separator="至"
+									start-placeholder="开始时间"
+									end-placeholder="结束时间"
+									:shortcuts="shortcuts"
+									@change="timeStartChangeCr"
+									value-format="YYYY-MM-DD[T]HH:mm:ss"
+								/>
+							</el-form-item>
+						</el-col>
+					</transition>
+					<transition name="el-zoom-in-top">
+						<el-col :span="8" v-show="!searchCol">
+							<el-form-item label="归档时间" prop="exTime">
+								<el-date-picker
+									v-model="state.queryParams.exTime"
+									type="datetimerange"
+									unlink-panels
+									range-separator="至"
+									start-placeholder="开始时间"
+									end-placeholder="结束时间"
+									:shortcuts="shortcuts"
+									@change="timeStartChangeEx"
+									value-format="YYYY-MM-DD[T]HH:mm:ss"
+								/>
+							</el-form-item>
+						</el-col>
+					</transition>
+					<transition name="el-zoom-in-top">
+						<el-col :span="8" v-show="!searchCol">
+							<el-form-item label="回访时间" prop="exTime">
+								<el-date-picker
+									v-model="state.queryParams.exTime"
+									type="datetimerange"
+									unlink-panels
+									range-separator="至"
+									start-placeholder="开始时间"
+									end-placeholder="结束时间"
+									:shortcuts="shortcuts"
+									@change="timeStartChangeEx"
+									value-format="YYYY-MM-DD[T]HH:mm:ss"
+								/>
+							</el-form-item>
+						</el-col>
+					</transition>
+					<transition name="el-zoom-in-top">
+						<el-col :span="8" v-show="!searchCol">
+							<el-form-item label="回访方式" prop="AcceptType">
+								<el-select v-model="state.queryParams.AcceptType" placeholder="请选择回访方式" multiple clearable class="w100">
+									<el-option v-for="item in state.acceptTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
+								</el-select>
+							</el-form-item>
+						</el-col>
+					</transition>
+					<el-col :span="8">
+						<div class="flex-end w100">
+							<el-button type="primary" @click="queryList" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+							<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading">
+								<SvgIcon name="ele-Refresh" class="mr5" />重置
+							</el-button>
+							<el-button link type="primary" @click="closeSearch">
+								{{ searchCol ? '展开' : '收起' }}
+								<SvgIcon :class="{ 'is-reverse': searchCol }" name="ele-ArrowUp" class="mr5 arrow" size="18px" />
+							</el-button>
+						</div>
+					</el-col>
+				</el-row>
+			</el-form>
+		</el-card>
+		<el-card shadow="never">
+			<!-- 功能按钮 -->
+			<div class="mb20">
+				<el-button type="primary" @click="onTextMessageFollowUp" :disabled="!multipleSelection.length" v-auth="'business:followUp:textMessage'">
+					<SvgIcon name="ele-Message" class="mr5" />短信回访</el-button>
+				<el-button type="primary" @click="multiplePeople" :disabled="!multipleSelection.length" v-auth="'business:followUp:multiplePeople'">
+					<SvgIcon name="ele-User" class="mr5" />批量分配</el-button>
+				<el-button type="primary" @click="smartFollowUp" :disabled="!multipleSelection.length" v-auth="'business:followUp:smart'">
+					<SvgIcon name="ele-Basketball" class="mr5" />智能回访</el-button>
+				<el-button type="primary" @click="onExport" :disabled="!multipleSelection.length" v-auth="'business:followUp:export'">
+					<SvgIcon name="iconfont icon-daochu" class="mr5" />导出</el-button>
+			</div>
+			<!-- 表格 -->
+			<el-table :data="state.tableList" v-loading="state.loading" row-key="id" ref="multipleTableRef" @selection-change="handleSelectionChange">
+				<el-table-column type="selection" width="55" />
+				<el-table-column prop="no" label="工单编码" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="no" label="回访状态" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="no" label="回访方式" show-overflow-tooltip></el-table-column>
+				<el-table-column label="工单标题" show-overflow-tooltip width="400">
+					<template #default="{ row }">
+						<el-button link type="primary">{{ row.title }}</el-button>
+					</template>
+				</el-table-column>
+				<el-table-column prop="no" label="受理类型" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="no" label="热点分类" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="expiredTime" label="受理人" show-overflow-tooltip width="170">
+					<template #default="{ row }">
+						<span>{{ row.employeeName + '[' + row.employeeStaffNo + ']' }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column prop="no" label="一级部门" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="no" label="接办部门" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="expiredTime" label="受理时间" show-overflow-tooltip width="170">
+					<template #default="{ row }">
+						<span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column prop="expiredTime" label="办结时间" show-overflow-tooltip width="170">
+					<template #default="{ row }">
+						<span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column prop="expiredTime" label="发布时间" show-overflow-tooltip width="170">
+					<template #default="{ row }">
+						<span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column prop="expiredTime" label="回访任务创建时间" show-overflow-tooltip width="170">
+					<template #default="{ row }">
+						<span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column prop="no" label="回访人" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="no" label="是否接通" show-overflow-tooltip></el-table-column>
+				<el-table-column label="操作" width="150" fixed="right" align="center">
+					<template #default="{ row }">
+						<el-button link type="primary" @click="onOrderDetail(row)" title="查看工单详情" v-auth="'business:followUp:detail'"> 工单详情 </el-button>
+						<el-button link type="primary" @click="onManpower(row)" title="工单回访" v-auth="'business:followUp:manpower'"> 回访 </el-button>
+					</template>
+				</el-table-column>
+				<template #empty>
+					<Empty />
+				</template>
+			</el-table>
+			<!-- 分页 -->
+			<pagination
+				:total="state.total"
+				v-model:page="state.queryParams.PageIndex"
+				v-model:limit="state.queryParams.PageSize"
+				@pagination="queryList"
+			/>
+		</el-card>
+		<!-- 回访 -->
+		<follow-up-phone ref="followUpPhoneRef" @updateList="queryList" />
+		<!-- 工单详情 -->
+		<order-detail ref="OrderDetailRef" @updateList="queryList" />
+	</div>
 </template>
 
 <script setup lang="ts" name="orderFollowUp">
 import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
-import {  listBaseData } from '/@/api/business/order';
-import {ElMessage, ElMessageBox, FormInstance} from 'element-plus';
+import { listBaseData } from '/@/api/business/order';
+import { ElButton, ElMessage, ElMessageBox, FormInstance } from 'element-plus';
 import { auth } from '/@/utils/authFunction';
-import { throttle,shortcuts } from '/@/utils/tools';
+import { throttle, shortcuts } from '/@/utils/tools';
 import { formatDate } from '/@/utils/formatTime';
 // 引入组件
-const FollowUpPhone = defineAsyncComponent(()=>import('/@/views/business/followUp/component/Follow-up-phone.vue'))
+const FollowUpPhone = defineAsyncComponent(() => import('/@/views/business/followUp/component/Follow-up-phone.vue'));
+// 引入组件
+const OrderDetail = defineAsyncComponent(() => import('/@/views/business/order/components/Order-detail.vue'));
 
 // 定义变量内容
 const ruleFormRef = ref<RefType>();
 const followUpPhoneRef = ref<RefType>();
 const searchCol = ref(true);
 const state = reactive(<any>{
-  queryParams: {
-    // 查询条件
-    PageIndex: 1,
-    PageSize: 10,
-    Keyword: '', // 关键字
-    Content: '', // 工单内容
-    AcceptType: '', // 受理类型
-    Channel: '', // 渠道
-    HotspotId: [], // 热点
-    OrgCode: [], // 机构
-    NameOrNo: '', // 受理坐席
-    crTime: [], // 创建时间
-    CreationTimeStart: '', // 创建时间 开始
-    CreationTimeEnd: '', // 创建时间 结束
-    TransferPhone: '', // 转派人
-    EmergencyLevel: [], // 紧急程度
-    exTime: [], // 办理期限
-    ExpiredTimeStart: '', //办理期限 开始
-    ExpiredTimeEnd: '', //办理期限 结束
-    PhoneNo: '', // 手机号
-    Status: [], // 状态
-    pushTypeOptions: '', //
-    PushTypeCode: '', //推送类型
-  },
-  tableList: [], //表单
-  loading: false, // 加载
-  total: 0, // 总数
-  acceptTypeOptions: [], //受理类型
-  channelOptions: [], // 来源频道
-  emergencyLevelOptions: [], // 紧急程度
-  orderStatusOptions: [], // 工单状态
-  orgOptions: [], // 部门
-  pushTypeOptions: [], //推送分类
-  orgData: [], // 机构数据
+	queryParams: {
+		// 查询条件
+		PageIndex: 1,
+		PageSize: 10,
+		Keyword: '', // 关键字
+		Content: '', // 工单内容
+		AcceptType: '', // 受理类型
+		Channel: '', // 渠道
+		HotspotId: [], // 热点
+		OrgCode: [], // 机构
+		NameOrNo: '', // 受理坐席
+		crTime: [], // 创建时间
+		CreationTimeStart: '', // 创建时间 开始
+		CreationTimeEnd: '', // 创建时间 结束
+		TransferPhone: '', // 转派人
+		EmergencyLevel: [], // 紧急程度
+		exTime: [], // 办理期限
+		ExpiredTimeStart: '', //办理期限 开始
+		ExpiredTimeEnd: '', //办理期限 结束
+		PhoneNo: '', // 手机号
+		Status: [], // 状态
+		pushTypeOptions: '', //
+		PushTypeCode: '', //推送类型
+	},
+	tableList: [], //表单
+	loading: false, // 加载
+	total: 0, // 总数
+	acceptTypeOptions: [], //受理类型
+	channelOptions: [], // 来源频道
+	emergencyLevelOptions: [], // 紧急程度
+	orderStatusOptions: [], // 工单状态
+	orgOptions: [], // 部门
+	pushTypeOptions: [], //推送分类
+	orgData: [], // 机构数据
 });
 // 展开/收起
 const closeSearch = () => {
-  searchCol.value = !searchCol.value;
+	searchCol.value = !searchCol.value;
 };
 const handleTimeChange = (val: string[], startKey: string, endKey: string) => {
-  if (val) {
-    state.queryParams[startKey] = val[0];
-    state.queryParams[endKey] = val[1];
-  } else {
-    state.queryParams[startKey] = '';
-    state.queryParams[endKey] = '';
-  }
+	if (val) {
+		state.queryParams[startKey] = val[0];
+		state.queryParams[endKey] = val[1];
+	} else {
+		state.queryParams[startKey] = '';
+		state.queryParams[endKey] = '';
+	}
 };
 // 受理时间
 const timeStartChangeCr = (val: string[]) => {
-  handleTimeChange(val, 'CreationTimeStart', 'CreationTimeEnd');
+	handleTimeChange(val, 'CreationTimeStart', 'CreationTimeEnd');
 };
 // 过期时间
 const timeStartChangeEx = (val: string[]) => {
-  handleTimeChange(val, 'ExpiredTimeStart', 'ExpiredTimeEnd');
+	handleTimeChange(val, 'ExpiredTimeStart', 'ExpiredTimeEnd');
 };
 // 获取查询条件基础信息
 const getBaseData = async () => {
-  const res: any = await listBaseData();
-  state.acceptTypeOptions = res.result?.acceptTypeOptions ?? [];
-  state.channelOptions = res.result?.channelOptions ?? [];
-  state.emergencyLevelOptions = res.result?.emergencyLevelOptions ?? [];
-  state.orgOptions = res.result?.orgOptions ?? [];
-  state.pushTypeOptions = res.result?.pushTypeOptions ?? [];
-  state.orderStatusOptions = res.result?.orderStatusOptions ?? [];
+	const res: any = await listBaseData();
+	state.acceptTypeOptions = res.result?.acceptTypeOptions ?? [];
+	state.channelOptions = res.result?.channelOptions ?? [];
+	state.emergencyLevelOptions = res.result?.emergencyLevelOptions ?? [];
+	state.orgOptions = res.result?.orgOptions ?? [];
+	state.pushTypeOptions = res.result?.pushTypeOptions ?? [];
+	state.orderStatusOptions = res.result?.orderStatusOptions ?? [];
 };
 /** 获取列表 */
 const queryList = throttle(() => {
-  if (!auth('business:followUp:query')) ElMessage.error('抱歉,您没有权限查看工单回访列表!');
-  else {
-  }
+	if (!auth('business:followUp:query')) ElMessage.error('抱歉,您没有权限查看工单回访列表!');
+	else {
+	}
 }, 500);
 
 /** 重置按钮操作 */
 const resetQuery = throttle((formEl: FormInstance | undefined) => {
-  followUpPhoneRef.value.openDialog();
-  if (!formEl) return;
-  formEl.resetFields();
-  state.queryParams.CreationTimeStart = '';
-  state.queryParams.CreationTimeEnd = '';
-  state.queryParams.ExpiredTimeStart = '';
-  state.queryParams.ExpiredTimeStart = '';
-  queryList();
+	if (!formEl) return;
+	formEl.resetFields();
+	state.queryParams.CreationTimeStart = '';
+	state.queryParams.CreationTimeEnd = '';
+	state.queryParams.ExpiredTimeStart = '';
+	state.queryParams.ExpiredTimeStart = '';
+	queryList();
 }, 500);
 // 短信回访
-const onTextMessageFollowUp = ()=>{
-  ElMessageBox.confirm('您确定要短信回访吗?', '提示', {
-    confirmButtonText: '确定',
-    cancelButtonText: '取消',
-    type: 'warning',
-  })
-      .then(() => {
-        state.loading = true;
-
-      })
-      .catch(() => {
-        // 取消
-      });
-}
+const onTextMessageFollowUp = () => {
+	ElMessageBox.confirm('您确定要短信回访吗?', '提示', {
+		confirmButtonText: '确定',
+		cancelButtonText: '取消',
+		type: 'warning',
+	})
+		.then(() => {
+			state.loading = true;
+		})
+		.catch(() => {
+			// 取消
+		});
+};
+// 批量分配
+const multiplePeople = () => {
+	console.log('批量分配');
+};
+// 智能回访
+const smartFollowUp = () => {
+	console.log('智能回访');
+};
+// 表格多选
+const multipleTableRef = ref<RefType>();
+const multipleSelection = ref<any>([]);
+const handleSelectionChange = (val: any[]) => {
+	multipleSelection.value = val;
+};
+// 导出
+const onExport = () => {
+	console.log('导出');
+};
+// 工单详情
+const OrderDetailRef = ref<RefType>();
+const onOrderDetail = (row: any) => {
+	OrderDetailRef.value.openDialog(row);
+};
+// 人工回访
+const onManpower = (row: any) => {
+	followUpPhoneRef.value.openDialog(row);
+};
 onMounted(async () => {
-  await getBaseData();
-  queryList();
+	await getBaseData();
+	queryList();
 });
-// 详情
-const onDetail = ()=>{
-
-}
-const multipleTableRef = ref<RefType>()
-const multipleSelection = ref<any>([])
-const handleSelectionChange = (val: any[]) => {
-  multipleSelection.value = val
-}
 </script>
 
 <style scoped lang="scss">
 .business-followUp-container {
-  .arrow {
-    transition: transform var(--el-transition-duration);
-    cursor: pointer;
-  }
-  .arrow.is-reverse {
-    transform: rotateZ(-180deg);
-  }
+	.arrow {
+		transition: transform var(--el-transition-duration);
+		cursor: pointer;
+	}
+	.arrow.is-reverse {
+		transform: rotateZ(-180deg);
+	}
 }
 </style>

+ 9 - 10
src/views/business/order/accept/orderAdd.vue

@@ -396,16 +396,9 @@
 								</el-button>
 							</el-form-item>
 						</el-form>
-						<el-table :data="state.tableData" v-loading="state.historyOrderLoading"
-							@current-change="handleSelectionChange" max-height="300">
-							<el-table-column prop="phoneNo" label="重复件" width="70"
-								v-if="state.ruleForm.isRepeat === 'true'">
-								<template #default="{ row }">
-									<el-radio v-model="state.tableRadio" :label="row.id"
-										@change="handleRowChange(row)">&nbsp;</el-radio>
-								</template>
-							</el-table-column>
-							<el-table-column type="index" width="60" label="序号" />
+						<el-table :data="state.tableData" v-loading="state.historyOrderLoading" row-key="id"
+							@selection-change="handleSelectionChange" max-height="300" ref="multipleTableRef">
+              <el-table-column type="selection" label="重复件" width="80" v-if="state.ruleForm.isRepeat === 'true'"/>
 							<el-table-column prop="phoneNo" label="工单标题" show-overflow-tooltip width="180">
 								<template #default="{ row }">
 									<span style="color: var(--el-color-primary)">{{ row.title }}</span>
@@ -806,11 +799,14 @@ const submit = throttle(() => {
 const isRepeatChange = (val: string) => {
 	if (val === 'false') clearRepeat();
 };
+const multipleSelection = ref<any[]>([]); // 重复件表格选中项
+const multipleTableRef = ref<RefType>(); // 重复件表格ref
 // 清除重复件
 const clearRepeat = () => {
 	state.ruleForm.duplicateTitle = '';
 	state.ruleForm.duplicateId = '';
 	state.tableRadio = '';
+  multipleTableRef.value.clearSelection();
 };
 // 选择重复件
 const selectRepeat = () => {
@@ -821,6 +817,8 @@ const saveSelect = (row: any) => {
 	state.ruleForm.duplicateId = row.id;
 	state.ruleForm.duplicateTitle = row.title;
 	state.tableRadio = row.id;
+
+  multipleTableRef.value!.toggleRowSelection(row, undefined)
 	HistoryOrderRef.value.closeDialog();
 };
 // 右边表格选中重复件
@@ -829,6 +827,7 @@ const handleSelectionChange = (row: any) => {
 		state.ruleForm.duplicateId = row.id;
 		state.tableRadio = row.id;
 		state.ruleForm.duplicateTitle = row.title;
+    multipleTableRef.value = row;
 	}
 };
 // 选择重复件

+ 8 - 16
src/views/business/order/accept/orderEdit.vue

@@ -426,12 +426,8 @@
 								</el-button>
 							</el-form-item>
 						</el-form>
-						<el-table :data="state.tableData" v-loading="state.historyOrderLoading" @current-change="handleSelectionChange" max-height="300">
-							<el-table-column prop="phoneNo" label="重复件" width="70" v-if="state.ruleForm.isRepeat === 'true'">
-								<template #default="{ row }">
-									<el-radio v-model="state.tableRadio" :label="row.id" @change="handleRowChange(row)">&nbsp;</el-radio>
-								</template>
-							</el-table-column>
+						<el-table :data="state.tableData" v-loading="state.historyOrderLoading" @selection-change="handleSelectionChange" max-height="300" ref="multipleTableRef" row-key="id">
+              <el-table-column type="selection" label="重复件" width="80" v-if="state.ruleForm.isRepeat === 'true'"/>
 							<el-table-column type="index" width="60" label="序号" />
 							<el-table-column prop="phoneNo" label="工单标题" show-overflow-tooltip width="180">
 								<template #default="{ row }">
@@ -844,36 +840,32 @@ const submit = throttle(() => {
 const isRepeatChange = (val: string) => {
 	if (val === 'false') clearRepeat();
 };
+const multipleSelection = ref<any[]>([]); // 重复件表格选中项
+const multipleTableRef = ref<RefType>(); // 重复件表格ref
 // 清除重复件
 const clearRepeat = () => {
 	state.ruleForm.duplicateTitle = '';
 	state.ruleForm.duplicateId = '';
 	state.tableRadio = '';
+  multipleTableRef.value.clearSelection();
 };
 // 选择重复件
 const selectRepeat = () => {
 	HistoryOrderRef.value.openDialog(state.ruleForm);
 };
 // 弹窗确定选择重复件
-const saveSelect = (row: any) => {
-	state.ruleForm.duplicateId = row.id;
-	state.ruleForm.duplicateTitle = row.title;
-	state.tableRadio = row.id;
+const saveSelect = (multipleSelection: any) => {
+  console.log(multipleSelection)
+  multipleTableRef.value!.toggleRowSelection(row, undefined)
 	HistoryOrderRef.value.closeDialog();
 };
 // 右边表格选中重复件
 const handleSelectionChange = (row: any) => {
 	if (row) {
 		state.ruleForm.duplicateId = row.id;
-		state.tableRadio = row.id;
 		state.ruleForm.duplicateTitle = row.title;
 	}
 };
-// 选择重复件
-const handleRowChange = (row: any) => {
-	state.ruleForm.duplicateId = row.id;
-	state.ruleForm.duplicateName = row.title;
-};
 // 选中常用意见
 const chooseComment = (item: any) => {
 	state.ruleForm.content += item.content;

+ 8 - 16
src/views/business/order/components/Order-history.vue

@@ -11,12 +11,8 @@
 						<el-button @click="resetQuery(ruleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 					</el-form-item>
 				</el-form>
-				<el-table :data="state.tableData" @current-change="handleSelectionChange" max-height="500">
-					<el-table-column prop="phoneNo" label="重复件" width="70">
-						<template #default="{row}">
-							<el-radio v-model="state.tableRadio" :label="row.id" @change="handleRowChange(row)">&nbsp;</el-radio>
-						</template>
-					</el-table-column>
+				<el-table :data="state.tableData" @selection-change="handleSelectionChange" max-height="500" ref="multipleTableRef" row-key="id">
+          <el-table-column type="selection" label="请选择" width="80" />
 					<el-table-column prop="phoneNo" label="工单标题" show-overflow-tooltip>
 						<template #default="{row}">
 							<span style="color: var(--el-color-primary)">{{ row.title }}</span>
@@ -66,7 +62,7 @@
 			<template #footer>
 				<span class="dialog-footer">
 					<el-button class="default-button" @click="state.isShowDialog = false">取 消</el-button>
-					<el-button type="primary" @click="selectConfirm" :disabled="!state.tableRadio">确 定</el-button>
+					<el-button type="primary" @click="selectConfirm" :disabled="!multipleSelection.length">确 定</el-button>
 				</span>
 			</template>
 		</el-dialog>
@@ -98,7 +94,6 @@ const state = reactive<any>({
 	tableData: [],
 	total: 0,
 	loading: false,
-	tableRadio: null as any,
 	selectRow: null as any,
 	ruleForm: {},
 });
@@ -106,10 +101,12 @@ const ruleFormRef = ref<RefType>();
 const orderSupplyRef = ref<RefType>()
 const orderRevokeRef = ref<RefType>()
 const route = useRoute();
+const multipleSelection = ref<any[]>([]);
+const multipleTableRef = ref<RefType>();
 // 打开弹窗
 const openDialog = (row: any) => {
 	state.ruleForm = row;
-	state.tableRadio = row.duplicateId ?? '';
+  multipleSelection.value = [];
 	getList();
 	state.isShowDialog = true;
 };
@@ -151,14 +148,9 @@ const getList = () => {
 // 选择重复件
 const handleSelectionChange = (row: any) => {
 	if (row) {
-		state.tableRadio = row.id;
-		state.selectRow = row;
+    multipleSelection.value = row
 	}
 };
-const handleRowChange = (row: any) => {
-	state.tableRadio = row.id;
-	state.selectRow = row;
-};
 // 补充
 const onSupply = (row: any) => {
   // 穿入当前流程id
@@ -184,7 +176,7 @@ const onRevokeSuccess = ()=>{
 }
 // 确定选择历史工单
 const selectConfirm = () => {
-	emit('saveSelect', state.selectRow);
+	emit('saveSelect', multipleSelection.value);
 };
 // 暴露变量
 defineExpose({

+ 61 - 145
src/views/business/order/index.vue

@@ -1,10 +1,6 @@
 <template>
 	<div class="business-order-container layout-pd">
     <el-card shadow="never">
-        <el-tabs v-model="state.activeName" @tab-change="handleClick">
-          <el-tab-pane :name="item.value" v-for="item in state.tabPaneList" :key="item.value" :label="item.label">
-          </el-tab-pane>
-        </el-tabs>
         <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent class="mt15" label-width="100px">
           <el-row :gutter="10">
             <el-col :span="8">
@@ -164,8 +160,8 @@
             <el-col :span="8">
               <div class="flex-end w100">
                 <el-button type="primary" @click="queryList" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-                <el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
-                <el-button link type="primary" @click="closeSearch">
+                <el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+                <el-button link type="primary" @click="closeSearch" :loading="state.loading">
                   {{ searchCol ? '展开' : '收起' }}
                   <SvgIcon :class="{ 'is-reverse': searchCol }" name="ele-ArrowUp" class="mr5 arrow" size="18px" />
                 </el-button>
@@ -176,18 +172,18 @@
     </el-card>
     <el-card shadow="never">
       <!-- 功能按钮 -->
-      <div class="flex-center-between mb20 mt20">
-        <p class="table-title">信息列表</p>
-        <div>
+      <div class="mb20">
           <el-button type="primary" @click="onAddWorkOrder" v-auth="'business:order:add'">
             <SvgIcon name="ele-Plus" class="mr5" />新建工单
           </el-button>
-        </div>
+        <el-button type="primary" @click="onExport" v-auth="'business:order:export'" :disabled="!multipleSelection.length">
+          <SvgIcon name="iconfont icon-daochu" class="mr5" />导出
+        </el-button>
       </div>
       <!-- 表格 -->
-        <el-table :data="state.tableList" v-loading="state.loading" row-key="id" @sort-change="sortChange">
-          <el-table-column type="index" width="60" label="序号" />
-          <!--  sortable="custom" 工单编码排序 -->
+        <el-table :data="state.tableList" v-loading="state.loading" row-key="id" @sort-change="sortChange" ref="multipleTableRef" @selection-change="handleSelectionChange">
+          <el-table-column type="selection" width="55" />
+          <el-table-column width="100" label="省/市工单" prop="statusText"/>
           <el-table-column label="工单编码" prop="no" show-overflow-tooltip width="150">
             <template #default="{row}">
               <span>{{ row.no }}</span>
@@ -216,10 +212,26 @@
               <span style="color: var(--el-color-info)" v-if="row.status === 60">{{ row.statusText }}</span>
             </template>
           </el-table-column>
-          <el-table-column prop="currentStepName" label="当前环节" show-overflow-tooltip width="150"></el-table-column>
+          <el-table-column prop="currentStepName" label="当前办理节点" show-overflow-tooltip width="150"></el-table-column>
+          <el-table-column prop="currentStepName" label="接办人" show-overflow-tooltip width="150"></el-table-column>
           <el-table-column prop="acceptTypeText" label="受理类型" show-overflow-tooltip width="150"></el-table-column>
+          <el-table-column prop="expiredTime" label="生成时间" show-overflow-tooltip width="170">
+            <template #default="{row}">
+              <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="expiredTime" label="受理时间" show-overflow-tooltip width="170">
+            <template #default="{row}">
+              <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="expiredTime" label="期满时间" show-overflow-tooltip width="170">
+            <template #default="{row}">
+              <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+            </template>
+          </el-table-column>
           <el-table-column prop="hotspotName" label="热点分类" show-overflow-tooltip width="200"></el-table-column>
-          <!--  sortable="custom" 紧急程度排序 -->
+
           <el-table-column label="紧急程度" show-overflow-tooltip prop="emergencyLevelText" width="100">
             <template #default="{row}">
 						<span v-if="row.emergencyLevel === 2 || row.emergencyLevel === 3" style="color: var(--el-color-danger)">{{
@@ -228,13 +240,21 @@
               <span v-else style="color: var(--el-color-primary)">{{ row.emergencyLevelText }}</span>
             </template>
           </el-table-column>
-          <!--  sortable="custom" 办理期限排序 -->
-          <el-table-column prop="expiredTime" label="办理期限" show-overflow-tooltip width="170">
+
+          <el-table-column prop="acceptTypeText" label="一级部门" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="acceptTypeText" label="来源方式" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="acceptTypeText" label="接办部门" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="expiredTime" label="接办时间" show-overflow-tooltip width="170">
+            <template #default="{row}">
+              <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="expiredTime" label="办结时间" show-overflow-tooltip width="170">
             <template #default="{row}">
               <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
             </template>
           </el-table-column>
-          <el-table-column prop="employeeName" label="受理坐席" show-overflow-tooltip width="170">
+          <el-table-column prop="employeeName" label="受理" show-overflow-tooltip width="170">
             <template #default="{row}">
               <span>{{ row.employeeName + '[' + row.employeeStaffNo + ']' }}</span>
             </template>
@@ -252,7 +272,6 @@
                 <el-button link type="warning" v-if="row.status === 2" @click="tempEnable(row)" title="启用">
                   启用
                 </el-button>-->
-
               <el-button link v-if="row.status === 0" type="danger" @click="onDeleteOrder(row)" title="删除工单" v-auth="'business:order:delete'">
                 删除
               </el-button>
@@ -276,7 +295,7 @@
 </template>
 <script setup lang="ts" name="order">
 import {defineAsyncComponent, ref, reactive, onMounted, onActivated} from 'vue';
-import { ElMessageBox, ElMessage } from 'element-plus';
+import {ElMessageBox, ElMessage, ElButton} from 'element-plus';
 import type { FormInstance } from 'element-plus';
 import { throttle,shortcuts } from '/@/utils/tools';
 import { auth } from '/@/utils/authFunction';
@@ -295,7 +314,6 @@ const route = useRoute();
 const router = useRouter();
 const OrderDetailRef = ref<RefType>();
 const state = reactive(<any>{
-	activeName: '0',
 	queryParams: {
 		// 查询条件
 		PageIndex: 1,
@@ -323,32 +341,7 @@ const state = reactive(<any>{
 	tableList: [], //表单
 	loading: false, // 加载
 	total: 0, // 总数
-	tabPaneList: [ //
-		{
-			label: '全部工单',
-			value: '0',
-		},
-		{
-			label: '即将超期',
-			value: '1',
-		},
-		{
-			label: '超期件',
-			value: '2',
-		},
-		{
-			label: '会签件',
-			value: '3',
-		},
-		{
-			label: '督办件',
-			value: '4',
-		},
-		{
-			label: '撤销件',
-			value: '5',
-		},
-	],
+
 	acceptTypeOptions: [], //受理类型
 	channelOptions: [], // 来源频道
 	emergencyLevelOptions: [], // 紧急程度
@@ -418,92 +411,17 @@ const queryList = () => {
 		let request = other.deepClone(state.queryParams);
 		Reflect.deleteProperty(request, 'crTime'); // 删除无用的参数
 		Reflect.deleteProperty(request, 'exTime'); // 删除无用的参数
-		switch (state.activeName) {
-			case '0':
-				state.loading = true;
-				orderList(request)
-					.then((response: any) => {
-						state.tableList = response?.result.items ?? [];
-						state.total = response?.result.total;
-						state.loading = false;
-					})
-					.catch(() => {
-						state.loading = false;
-					});
-				break;
-			case '1':
-				// workflowPaged(state.queryParams)
-				// 	.then((response: any) => {
-				// 		state.tableList = response.result?.items ?? [];
-				// 		state.total = response.result?.total ?? 0;
-				// 		state.total = 1;
-				setTimeout(() => {
-					state.loading = false;
-				}, 300);
-				// 	})
-				// 	.catch(() => {
-				// 		state.loading = false;
-				// 	});
-				break;
-			case '2':
-				// workflowPaged(state.queryParams)
-				// 	.then((response: any) => {
-				// 		state.tableList = response.result?.items ?? [];
-				// 		state.total = response.result?.total ?? 0;
-				// 		state.total = 1;
-				setTimeout(() => {
-					state.loading = false;
-				}, 300);
-				// 	})
-				// 	.catch(() => {
-				// 		state.loading = false;
-				// 	});
-				break;
-			case '3':
-				// workflowPaged(state.queryParams)
-				// 	.then((response: any) => {
-				// 		state.tableList = response.result?.items ?? [];
-				// 		state.total = response.result?.total ?? 0;
-				// 		state.total = 1;
-				setTimeout(() => {
-					state.loading = false;
-				}, 300);
-				// 	})
-				// 	.catch(() => {
-				// 		state.loading = false;
-				// 	});
-				break;
-			case '4':
-				// workflowPaged(state.queryParams)
-				// 	.then((response: any) => {
-				// 		state.tableList = response.result?.items ?? [];
-				// 		state.total = response.result?.total ?? 0;
-				// 		state.total = 1;
-				setTimeout(() => {
-					state.loading = false;
-				}, 300);
-				// 	})
-				// 	.catch(() => {
-				// 		state.loading = false;
-				// 	});
-				break;
-			case '5':
-				// workflowPaged(state.queryParams)
-				// 	.then((response: any) => {
-				// 		state.tableList = response.result?.items ?? [];
-				// 		state.total = response.result?.total ?? 0;
-				// 		state.total = 1;
-				setTimeout(() => {
-					state.loading = false;
-				}, 300);
-				// 	})
-				// 	.catch(() => {
-				// 		state.loading = false;
-				// 	});
-				break;
-			default:
-				break;
-		}
+
+    state.loading = true;
+    orderList(request)
+        .then((response: any) => {
+          state.tableList = response?.result.items ?? [];
+          state.total = response?.result.total;
+          state.loading = false;
+        })
+        .catch(() => {
+          state.loading = false;
+        });
 	}
 };
 // 表格排序
@@ -520,15 +438,21 @@ const resetQuery = throttle((formEl: FormInstance | undefined) => {
 	state.queryParams.ExpiredTimeStart = '';
 	queryList();
 }, 500);
-// 切换tab 查询列表
-const handleClick = () => {
-	queryList();
-};
 // 新增工单
 const onAddWorkOrder = () => {
 	// 跳转到录入工单页面
 	router.push('/business/order/accept');
 };
+// 表格多选
+const multipleTableRef = ref<RefType>()
+const multipleSelection = ref<any>([])
+const handleSelectionChange = (val: any[]) => {
+  multipleSelection.value = val
+}
+// 导出
+const onExport = () => {
+  console.log('导出');
+};
 // 查看详情
 const onOrderDetail = (row: any) => {
 	OrderDetailRef.value.openDialog(row);
@@ -564,14 +488,6 @@ const onDeleteOrder = (row: any) => {
 onMounted(async () => {
 	await getBaseData();
 	queryList();
-  if(route.query.tabIndex){
-    state.activeName = route.query.tabIndex as string;
-  }
-});
-onActivated(() => {
-  if(route.query.tabIndex){
-    state.activeName = route.query.tabIndex as string;
-  }
 });
 </script>
 <style scoped lang="scss">

+ 0 - 13
src/views/business/quality/index.vue

@@ -1,13 +0,0 @@
-<template>
-    <div class="business-quality layout-pd">
-            质检管理
-    </div>
-</template>
-
-<script setup lang="ts" name="businessQuality">
-
-</script>
-
-<style scoped lang="scss">
-
-</style>

+ 113 - 62
src/views/business/release/index.vue

@@ -1,7 +1,7 @@
 <template>
 	<div class="business-release-container layout-pd">
-    <!-- 搜索  -->
-    <el-card shadow="never">
+		<!-- 搜索  -->
+		<el-card shadow="never">
 			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent class="mt15" label-width="100px">
 				<el-row :gutter="10">
 					<el-col :span="8">
@@ -99,7 +99,9 @@
 					<el-col :span="8">
 						<div class="flex-end w100">
 							<el-button type="primary" @click="queryList" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-							<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+							<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading">
+								<SvgIcon name="ele-Refresh" class="mr5" />重置
+							</el-button>
 							<el-button link type="primary" @click="closeSearch">
 								{{ searchCol ? '展开' : '收起' }}
 								<SvgIcon :class="{ 'is-reverse': searchCol }" name="ele-ArrowUp" class="mr5 arrow" size="18px" />
@@ -108,53 +110,72 @@
 					</el-col>
 				</el-row>
 			</el-form>
-    </el-card>
-    <el-card shadow="never">
-      <!-- 表格 -->
-      <el-table :data="state.tableList" v-loading="state.loading" row-key="id">
-        <el-table-column type="index" width="60" label="序号" />
-        <!--  sortable="custom" 工单编码排序 -->
-        <el-table-column label="标题" show-overflow-tooltip width="400">
-          <template #default="{ row }">
-            <el-button link type="primary">{{ row.title }}</el-button>
-          </template>
-        </el-table-column>
-        <el-table-column prop="acceptTypeText" label="受理类型" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="hotspotName" label="热点分类" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="expiredTime" label="归档时间" show-overflow-tooltip width="170">
-          <template #default="{ row }">
-            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column label="发布状态" show-overflow-tooltip width="100">
-          <template #default="{ row }">
-            <!-- 已发布 -->
-            <span style="color: var(--el-color-info)" v-if="row.status === 0">{{ row.statusText }}</span>
-            <el-button v-else link v-auth="'business:order:release'" type="primary">发布</el-button>
-          </template>
-        </el-table-column>
-        <el-table-column prop="employeeName" label="发布人" show-overflow-tooltip width="170">
-          <template #default="{ row }">
-            <span>{{ row.employeeName + '[' + row.employeeStaffNo + ']' }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="expiredTime" label="发布时间" show-overflow-tooltip width="170">
-          <template #default="{ row }">
-            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-          </template>
-        </el-table-column>
-        <template #empty>
-          <Empty />
-        </template>
-      </el-table>
-      <!-- 分页 -->
-      <pagination
-          :total="state.total"
-          v-model:page="state.queryParams.PageIndex"
-          v-model:limit="state.queryParams.PageSize"
-          @pagination="queryList"
-      />
-    </el-card>
+		</el-card>
+		<el-card shadow="never">
+			<!-- 功能按钮 -->
+			<div class="mb20">
+					<el-button type="primary" @click="releaseMultiple" v-auth="'business:release:multiple'" :disabled="!multipleSelection.length">
+						<SvgIcon name="ele-Plus" class="mr5" />批量发布
+					</el-button>
+			</div>
+			<!-- 表格 -->
+			<el-table :data="state.tableList" v-loading="state.loading" row-key="id" ref="multipleTableRef" @selection-change="handleSelectionChange">
+				<el-table-column type="selection" width="55" />
+				<el-table-column prop="no" label="工单编码" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="no" label="是否会签件" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="no" label="省/市工单" show-overflow-tooltip></el-table-column>
+				<el-table-column label="工单标题" show-overflow-tooltip width="400">
+					<template #default="{ row }">
+						<el-button link type="primary">{{ row.title }}</el-button>
+					</template>
+				</el-table-column>
+				<el-table-column prop="expiredTime" label="受理时间" show-overflow-tooltip width="170">
+					<template #default="{ row }">
+						<span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column prop="expiredTime" label="受理人" show-overflow-tooltip width="170">
+					<template #default="{ row }">
+						<span>{{ row.employeeName + '[' + row.employeeStaffNo + ']' }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column prop="no" label="热点分类" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="no" label="受理类型" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="no" label="接办部门" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="expiredTime" label="接办时间" show-overflow-tooltip width="170">
+					<template #default="{ row }">
+						<span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column prop="expiredTime" label="发布时间" show-overflow-tooltip width="170">
+					<template #default="{ row }">
+						<span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column prop="no" label="发布人" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="no" label="发布状态" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="no" label="是否公开" show-overflow-tooltip></el-table-column>
+				<el-table-column label="操作" width="150" fixed="right" align="center">
+					<template #default="{ row }">
+						<el-button link type="danger" @click="release(row)" title="发布工单" v-auth="'business:release:release'"> 发布 </el-button>
+						<el-button link type="danger" @click="cancelRelease(row)" title="取消发布" v-auth="'business:release:cancel'"> 取消发布 </el-button>
+						<el-button link type="danger" @click="releaseContent(row)" title="发布内容" v-auth="'business:release:content'"> 发布内容 </el-button>
+						<el-button link type="danger" @click="releaseRedO(row)" title="重办工单" v-auth="'business:release:reDo'"> 重办 </el-button>
+						<el-button link type="danger" @click="releaseDetail(row)" title="发布详情" v-auth="'business:release:detail'"> 发布详情 </el-button>
+					</template>
+				</el-table-column>
+				<template #empty>
+					<Empty />
+				</template>
+			</el-table>
+			<!-- 分页 -->
+			<pagination
+				:total="state.total"
+				v-model:page="state.queryParams.PageIndex"
+				v-model:limit="state.queryParams.PageSize"
+				@pagination="queryList"
+			/>
+		</el-card>
 		<!-- 工单发布详情 -->
 		<order-release ref="orderReleaseRef" @updateList="queryList" />
 	</div>
@@ -162,12 +183,12 @@
 <script setup lang="ts" name="orderRelease">
 import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
 import { hotSpotType, listBaseData } from '/@/api/business/order';
-import { ElMessage, FormInstance } from 'element-plus';
+import { ElButton, ElMessage, FormInstance } from 'element-plus';
 import { auth } from '/@/utils/authFunction';
-import { throttle,shortcuts } from '/@/utils/tools';
+import { throttle, shortcuts } from '/@/utils/tools';
 import { formatDate } from '/@/utils/formatTime';
 // 引入组件
-const OrderRelease =  defineAsyncComponent(() => import('/@/views/business/release/component/Order-release.vue'));
+const OrderRelease = defineAsyncComponent(() => import('/@/views/business/release/component/Order-release.vue'));
 // 定义变量内容
 const ruleFormRef = ref<RefType>();
 const orderReleaseRef = ref<RefType>();
@@ -226,21 +247,21 @@ const closeSearch = () => {
 	searchCol.value = !searchCol.value;
 };
 const handleTimeChange = (val: string[], startKey: string, endKey: string) => {
-  if (val) {
-    state.queryParams[startKey] = val[0];
-    state.queryParams[endKey] = val[1];
-  } else {
-    state.queryParams[startKey] = '';
-    state.queryParams[endKey] = '';
-  }
+	if (val) {
+		state.queryParams[startKey] = val[0];
+		state.queryParams[endKey] = val[1];
+	} else {
+		state.queryParams[startKey] = '';
+		state.queryParams[endKey] = '';
+	}
 };
 // 受理时间
 const timeStartChangeCr = (val: string[]) => {
-  handleTimeChange(val, 'CreationTimeStart', 'CreationTimeEnd');
+	handleTimeChange(val, 'CreationTimeStart', 'CreationTimeEnd');
 };
 // 过期时间
 const timeStartChangeEx = (val: string[]) => {
-  handleTimeChange(val, 'ExpiredTimeStart', 'ExpiredTimeEnd');
+	handleTimeChange(val, 'ExpiredTimeStart', 'ExpiredTimeEnd');
 };
 // 获取查询条件基础信息
 const getBaseData = async () => {
@@ -270,6 +291,36 @@ const resetQuery = throttle((formEl: FormInstance | undefined) => {
 	state.queryParams.ExpiredTimeStart = '';
 	queryList();
 }, 500);
+// 表格多选
+const multipleTableRef = ref<RefType>()
+const multipleSelection = ref<any>([])
+const handleSelectionChange = (val: any[]) => {
+  multipleSelection.value = val
+}
+// 批量发布
+const releaseMultiple = () => {
+  console.log('批量发布');
+};
+// 发布
+const release = (row: any) => {
+  console.log('发布');
+};
+// 取消发布
+const cancelRelease = (row: any) => {
+  console.log('取消发布');
+};
+// 发布内容
+const releaseContent = (row: any) => {
+  console.log('发布内容');
+};
+// 重办
+const releaseRedO = (row: any) => {
+  console.log('重办');
+};
+// 发布详情
+const releaseDetail = (row: any) => {
+  console.log('发布详情');
+};
 onMounted(async () => {
 	await getBaseData();
 	queryList();

+ 337 - 0
src/views/business/screen/index.vue

@@ -0,0 +1,337 @@
+<template>
+  <div class="business-screen-container layout-pd">
+    <!-- 搜索  -->
+    <el-card shadow="never">
+      <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent class="mt15" label-width="100px">
+        <el-row :gutter="10">
+          <el-col :span="8">
+            <el-form-item label="发布状态" prop="AcceptType">
+              <el-select v-model="state.queryParams.AcceptType" placeholder="请选择发布状态" multiple clearable class="w100">
+                <el-option v-for="item in state.acceptTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="工单标题" prop="Keyword">
+              <el-input v-model="state.queryParams.Keyword" placeholder="工单编码/标题" clearable @keyup.enter="queryList" />
+            </el-form-item>
+          </el-col>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="发布人" prop="Content">
+                <el-input v-model="state.queryParams.Content" placeholder="姓名/工号" clearable @keyup.enter="queryList" />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="发布范围" prop="AcceptType">
+                <el-select v-model="state.queryParams.AcceptType" placeholder="请选择发布范围" multiple clearable class="w100">
+                  <el-option v-for="item in state.acceptTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="受理类型" prop="Channel">
+                <el-select v-model="state.queryParams.Channel" placeholder="请选择受理类型" multiple clearable class="w100">
+                  <el-option v-for="item in state.channelOptions" :value="item.key" :key="item.key" :label="item.value" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="热点分类" prop="HotspotId">
+                <el-tree-select
+                    class="w100"
+                    v-model="state.queryParams.HotspotId"
+                    filterable
+                    clearable
+                    multiple
+                    :render-after-expand="false"
+                    show-checkbox
+                    placeholder="请选择热点分类"
+                    :props="HotspotProps"
+                    lazy
+                    :load="load"
+                    node-key="id"
+                    check-strictly
+                />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="受理时间" prop="crTime">
+                <el-date-picker
+                    v-model="state.queryParams.crTime"
+                    type="datetimerange"
+                    unlink-panels
+                    range-separator="至"
+                    start-placeholder="开始时间"
+                    end-placeholder="结束时间"
+                    :shortcuts="shortcuts"
+                    @change="timeStartChangeCr"
+                    value-format="YYYY-MM-DD[T]HH:mm:ss"
+                />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="归档时间" prop="exTime">
+                <el-date-picker
+                    v-model="state.queryParams.exTime"
+                    type="datetimerange"
+                    unlink-panels
+                    range-separator="至"
+                    start-placeholder="开始时间"
+                    end-placeholder="结束时间"
+                    :shortcuts="shortcuts"
+                    @change="timeStartChangeEx"
+                    value-format="YYYY-MM-DD[T]HH:mm:ss"
+                />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <el-col :span="8">
+            <div class="flex-end w100">
+              <el-button type="primary" @click="queryList" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+              <el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+              <el-button link type="primary" @click="closeSearch">
+                {{ searchCol ? '展开' : '收起' }}
+                <SvgIcon :class="{ 'is-reverse': searchCol }" name="ele-ArrowUp" class="mr5 arrow" size="18px" />
+              </el-button>
+            </div>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-card>
+    <el-card shadow="never">
+      <!-- 功能按钮 -->
+      <div class="mb20">
+          <el-button type="primary" @click="onExport" v-auth="'business:screen:export'" :disabled="!multipleSelection.length">
+            <SvgIcon name="iconfont icon-daochu" class="mr5" />导出
+          </el-button>
+      </div>
+      <!-- 表格 -->
+      <el-table :data="state.tableList" v-loading="state.loading" row-key="id" ref="multipleTableRef" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" />
+        <el-table-column prop="no" label="工单编号" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="省/市工单" show-overflow-tooltip></el-table-column>
+        <el-table-column label="标题" show-overflow-tooltip width="400">
+          <template #default="{ row }">
+            <el-button link type="primary">{{ row.title }}</el-button>
+          </template>
+        </el-table-column>
+        <el-table-column prop="acceptTypeText" label="来源方式" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="受理类型" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="hotspotName" label="热点分类" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="170">
+          <template #default="{row}">
+            <span>{{ row.employeeName + '[' + row.employeeStaffNo + ']' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="acceptTypeText" label="一级部门" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="接办部门" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="expiredTime" label="受理时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="expiredTime" label="办结时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="expiredTime" label="发布时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="expiredTime" label="回访时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="acceptTypeText" label="回访人" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="中心会签" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="被回访部门" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="expiredTime" label="甄别申请时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="acceptTypeText" label="甄别申请人" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="甄别申请部门" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="甄别申请类型" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="甄别申请原因" show-overflow-tooltip></el-table-column>
+        <el-table-column label="操作" width="150" fixed="right" align="center">
+          <template #default="{ row }">
+            <el-button link type="primary" @click="onDetail(row)" title="查看甄别详情" v-auth="'business:screen:detail'"> 甄别详情 </el-button>
+          </template>
+        </el-table-column>
+        <template #empty>
+          <Empty />
+        </template>
+      </el-table>
+      <!-- 分页 -->
+      <pagination
+          :total="state.total"
+          v-model:page="state.queryParams.PageIndex"
+          v-model:limit="state.queryParams.PageSize"
+          @pagination="queryList"
+      />
+    </el-card>
+  </div>
+</template>
+<script setup lang="ts" name="businessScreen">
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { hotSpotType, listBaseData } from '/@/api/business/order';
+import {ElButton, ElMessage, FormInstance} from 'element-plus';
+import { auth } from '/@/utils/authFunction';
+import { throttle,shortcuts } from '/@/utils/tools';
+import { formatDate } from '/@/utils/formatTime';
+import {useRouter} from "vue-router";
+
+// 定义变量内容
+const ruleFormRef = ref<RefType>();
+const orderReleaseRef = ref<RefType>();
+const searchCol = ref(true);
+const router = useRouter();
+const state = reactive(<any>{
+  queryParams: {
+    // 查询条件
+    PageIndex: 1,
+    PageSize: 10,
+    Keyword: '', // 关键字
+    Content: '', // 工单内容
+    AcceptType: '', // 受理类型
+    Channel: '', // 渠道
+    HotspotId: [], // 热点
+    OrgCode: [], // 机构
+    NameOrNo: '', // 受理坐席
+    crTime: [], // 创建时间
+    CreationTimeStart: '', // 创建时间 开始
+    CreationTimeEnd: '', // 创建时间 结束
+    TransferPhone: '', // 转派人
+    EmergencyLevel: [], // 紧急程度
+    exTime: [], // 办理期限
+    ExpiredTimeStart: '', //办理期限 开始
+    ExpiredTimeEnd: '', //办理期限 结束
+    PhoneNo: '', // 手机号
+    Status: [], // 状态
+    pushTypeOptions: '', //
+    PushTypeCode: '', //推送类型
+  },
+  tableList: [], //表单
+  loading: false, // 加载
+  total: 0, // 总数
+  acceptTypeOptions: [], //受理类型
+  channelOptions: [], // 来源频道
+  emergencyLevelOptions: [], // 紧急程度
+  orderStatusOptions: [], // 工单状态
+  orgOptions: [], // 部门
+  pushTypeOptions: [], //推送分类
+  orgData: [], // 机构数据
+});
+// 热点分类远程搜索
+const HotspotProps = {
+  label: 'hotSpotName',
+  children: 'children',
+  isLeaf: 'isLeaf',
+};
+// 热点分类远程搜索
+const load = async (node: any, resolve: any) => {
+  if (node.isLeaf) return resolve([]);
+  let res: any = await hotSpotType({ id: node.data.id ? node.data.id : '' });
+  resolve(res.result);
+};
+
+// 展开/收起
+const closeSearch = () => {
+  searchCol.value = !searchCol.value;
+};
+const handleTimeChange = (val: string[], startKey: string, endKey: string) => {
+  if (val) {
+    state.queryParams[startKey] = val[0];
+    state.queryParams[endKey] = val[1];
+  } else {
+    state.queryParams[startKey] = '';
+    state.queryParams[endKey] = '';
+  }
+};
+// 受理时间
+const timeStartChangeCr = (val: string[]) => {
+  handleTimeChange(val, 'CreationTimeStart', 'CreationTimeEnd');
+};
+// 过期时间
+const timeStartChangeEx = (val: string[]) => {
+  handleTimeChange(val, 'ExpiredTimeStart', 'ExpiredTimeEnd');
+};
+// 获取查询条件基础信息
+const getBaseData = async () => {
+  const res: any = await listBaseData();
+  state.acceptTypeOptions = res.result?.acceptTypeOptions ?? [];
+  state.channelOptions = res.result?.channelOptions ?? [];
+  state.emergencyLevelOptions = res.result?.emergencyLevelOptions ?? [];
+  state.orgOptions = res.result?.orgOptions ?? [];
+  state.pushTypeOptions = res.result?.pushTypeOptions ?? [];
+  state.orderStatusOptions = res.result?.orderStatusOptions ?? [];
+};
+/** 获取列表 */
+const queryList = throttle(() => {
+  if (!auth('business:screen:query')) ElMessage.error('抱歉,您没有权限查看工单待办!');
+  else {
+  }
+}, 500);
+
+/** 重置按钮操作 */
+const resetQuery = throttle((formEl: FormInstance | undefined) => {
+  orderReleaseRef.value.openDialog();
+  if (!formEl) return;
+  formEl.resetFields();
+  state.queryParams.CreationTimeStart = '';
+  state.queryParams.CreationTimeEnd = '';
+  state.queryParams.ExpiredTimeStart = '';
+  state.queryParams.ExpiredTimeStart = '';
+  queryList();
+}, 500);
+// 新增工单
+const onAddWorkOrder = () => {
+  // 跳转到录入工单页面
+  router.push('/business/order/accept');
+};
+// 表格多选
+const multipleTableRef = ref<RefType>()
+const multipleSelection = ref<any>([])
+const handleSelectionChange = (val: any[]) => {
+  multipleSelection.value = val
+}
+// 导出
+const onExport = () => {
+  console.log('导出');
+};
+// 查看详情
+const onDetail = (row: any) => {
+  console.log('甄别详情')
+};
+onMounted(async () => {
+  await getBaseData();
+  queryList();
+});
+</script>
+
+<style scoped lang="scss">
+.business-screen-container {
+  .arrow {
+    transition: transform var(--el-transition-duration);
+    cursor: pointer;
+  }
+  .arrow.is-reverse {
+    transform: rotateZ(-180deg);
+  }
+}
+</style>

+ 0 - 13
src/views/business/screening/index.vue

@@ -1,13 +0,0 @@
-<template>
-    <div class="business-screening layout-pd">
-          甄别申请
-    </div>
-</template>
-
-<script setup lang="ts" name="businessScreening">
-
-</script>
-
-<style scoped lang="scss">
-
-</style>

+ 332 - 0
src/views/business/supervise/index.vue

@@ -0,0 +1,332 @@
+<template>
+  <div class="business-supervise-container layout-pd">
+    <!-- 搜索  -->
+    <el-card shadow="never">
+      <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent class="mt15" label-width="100px">
+        <el-row :gutter="10">
+          <el-col :span="8">
+            <el-form-item label="发布状态" prop="AcceptType">
+              <el-select v-model="state.queryParams.AcceptType" placeholder="请选择发布状态" multiple clearable class="w100">
+                <el-option v-for="item in state.acceptTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="工单标题" prop="Keyword">
+              <el-input v-model="state.queryParams.Keyword" placeholder="工单编码/标题" clearable @keyup.enter="queryList" />
+            </el-form-item>
+          </el-col>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="发布人" prop="Content">
+                <el-input v-model="state.queryParams.Content" placeholder="姓名/工号" clearable @keyup.enter="queryList" />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="发布范围" prop="AcceptType">
+                <el-select v-model="state.queryParams.AcceptType" placeholder="请选择发布范围" multiple clearable class="w100">
+                  <el-option v-for="item in state.acceptTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="受理类型" prop="Channel">
+                <el-select v-model="state.queryParams.Channel" placeholder="请选择受理类型" multiple clearable class="w100">
+                  <el-option v-for="item in state.channelOptions" :value="item.key" :key="item.key" :label="item.value" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="热点分类" prop="HotspotId">
+                <el-tree-select
+                    class="w100"
+                    v-model="state.queryParams.HotspotId"
+                    filterable
+                    clearable
+                    multiple
+                    :render-after-expand="false"
+                    show-checkbox
+                    placeholder="请选择热点分类"
+                    :props="HotspotProps"
+                    lazy
+                    :load="load"
+                    node-key="id"
+                    check-strictly
+                />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="受理时间" prop="crTime">
+                <el-date-picker
+                    v-model="state.queryParams.crTime"
+                    type="datetimerange"
+                    unlink-panels
+                    range-separator="至"
+                    start-placeholder="开始时间"
+                    end-placeholder="结束时间"
+                    :shortcuts="shortcuts"
+                    @change="timeStartChangeCr"
+                    value-format="YYYY-MM-DD[T]HH:mm:ss"
+                />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :span="8" v-show="!searchCol">
+              <el-form-item label="归档时间" prop="exTime">
+                <el-date-picker
+                    v-model="state.queryParams.exTime"
+                    type="datetimerange"
+                    unlink-panels
+                    range-separator="至"
+                    start-placeholder="开始时间"
+                    end-placeholder="结束时间"
+                    :shortcuts="shortcuts"
+                    @change="timeStartChangeEx"
+                    value-format="YYYY-MM-DD[T]HH:mm:ss"
+                />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <el-col :span="8">
+            <div class="flex-end w100">
+              <el-button type="primary" @click="queryList" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+              <el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+              <el-button link type="primary" @click="closeSearch">
+                {{ searchCol ? '展开' : '收起' }}
+                <SvgIcon :class="{ 'is-reverse': searchCol }" name="ele-ArrowUp" class="mr5 arrow" size="18px" />
+              </el-button>
+            </div>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-card>
+    <el-card shadow="never">
+      <!-- 功能按钮 -->
+      <div class="mb20">
+          <el-button type="primary" @click="onExport" v-auth="'business:supervise:export'" :disabled="!multipleSelection.length">
+            <SvgIcon name="iconfont icon-daochu" class="mr5" />导出
+          </el-button>
+      </div>
+      <!-- 表格 -->
+      <el-table :data="state.tableList" v-loading="state.loading" row-key="id" ref="multipleTableRef" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" />
+        <el-table-column prop="no" label="工单编号" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="省/市工单" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="no" label="工单编号" show-overflow-tooltip></el-table-column>
+        <el-table-column label="标题" show-overflow-tooltip width="400">
+          <template #default="{ row }">
+            <el-button link type="primary">{{ row.title }}</el-button>
+          </template>
+        </el-table-column>
+        <el-table-column prop="acceptTypeText" label="工单状态" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="受理类型" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="hotspotName" label="热点分类" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="170">
+          <template #default="{row}">
+            <span>{{ row.employeeName + '[' + row.employeeStaffNo + ']' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="acceptTypeText" label="接办部门" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="expiredTime" label="受理时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="expiredTime" label="工单期满时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="expiredTime" label="督办时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="acceptTypeText" label="督办回复时限" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="督办部门" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="督办人" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="被督办部门" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="督办意见" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="督办回复时间" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="acceptTypeText" label="督办回复内容" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="expiredTime" label="督办签收时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" width="150" fixed="right" align="center">
+          <template #default="{ row }">
+            <el-button link type="primary" @click="onDetail(row)" title="查看督办详情" v-auth="'business:supervise:detail'"> 详情 </el-button>
+          </template>
+        </el-table-column>
+        <template #empty>
+          <Empty />
+        </template>
+      </el-table>
+      <!-- 分页 -->
+      <pagination
+          :total="state.total"
+          v-model:page="state.queryParams.PageIndex"
+          v-model:limit="state.queryParams.PageSize"
+          @pagination="queryList"
+      />
+    </el-card>
+    <!-- 工单详情 -->
+    <order-detail ref="OrderDetailRef" @updateList="queryList" />
+  </div>
+</template>
+<script setup lang="ts" name="businessSupervise">
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { hotSpotType, listBaseData } from '/@/api/business/order';
+import {ElButton, ElMessage, FormInstance} from 'element-plus';
+import { auth } from '/@/utils/authFunction';
+import { throttle,shortcuts } from '/@/utils/tools';
+import { formatDate } from '/@/utils/formatTime';
+import {useRouter} from "vue-router";
+// 引入组件
+const OrderDetail = defineAsyncComponent(() => import('/@/views/business/order/components/Order-detail.vue'));
+
+// 定义变量内容
+const ruleFormRef = ref<RefType>();
+const orderReleaseRef = ref<RefType>();
+const searchCol = ref(true);
+const OrderDetailRef = ref<RefType>();
+const router = useRouter();
+const state = reactive(<any>{
+  queryParams: {
+    // 查询条件
+    PageIndex: 1,
+    PageSize: 10,
+    Keyword: '', // 关键字
+    Content: '', // 工单内容
+    AcceptType: '', // 受理类型
+    Channel: '', // 渠道
+    HotspotId: [], // 热点
+    OrgCode: [], // 机构
+    NameOrNo: '', // 受理坐席
+    crTime: [], // 创建时间
+    CreationTimeStart: '', // 创建时间 开始
+    CreationTimeEnd: '', // 创建时间 结束
+    TransferPhone: '', // 转派人
+    EmergencyLevel: [], // 紧急程度
+    exTime: [], // 办理期限
+    ExpiredTimeStart: '', //办理期限 开始
+    ExpiredTimeEnd: '', //办理期限 结束
+    PhoneNo: '', // 手机号
+    Status: [], // 状态
+    pushTypeOptions: '', //
+    PushTypeCode: '', //推送类型
+  },
+  tableList: [], //表单
+  loading: false, // 加载
+  total: 0, // 总数
+  acceptTypeOptions: [], //受理类型
+  channelOptions: [], // 来源频道
+  emergencyLevelOptions: [], // 紧急程度
+  orderStatusOptions: [], // 工单状态
+  orgOptions: [], // 部门
+  pushTypeOptions: [], //推送分类
+  orgData: [], // 机构数据
+});
+// 热点分类远程搜索
+const HotspotProps = {
+  label: 'hotSpotName',
+  children: 'children',
+  isLeaf: 'isLeaf',
+};
+// 热点分类远程搜索
+const load = async (node: any, resolve: any) => {
+  if (node.isLeaf) return resolve([]);
+  let res: any = await hotSpotType({ id: node.data.id ? node.data.id : '' });
+  resolve(res.result);
+};
+
+// 展开/收起
+const closeSearch = () => {
+  searchCol.value = !searchCol.value;
+};
+const handleTimeChange = (val: string[], startKey: string, endKey: string) => {
+  if (val) {
+    state.queryParams[startKey] = val[0];
+    state.queryParams[endKey] = val[1];
+  } else {
+    state.queryParams[startKey] = '';
+    state.queryParams[endKey] = '';
+  }
+};
+// 受理时间
+const timeStartChangeCr = (val: string[]) => {
+  handleTimeChange(val, 'CreationTimeStart', 'CreationTimeEnd');
+};
+// 过期时间
+const timeStartChangeEx = (val: string[]) => {
+  handleTimeChange(val, 'ExpiredTimeStart', 'ExpiredTimeEnd');
+};
+// 获取查询条件基础信息
+const getBaseData = async () => {
+  const res: any = await listBaseData();
+  state.acceptTypeOptions = res.result?.acceptTypeOptions ?? [];
+  state.channelOptions = res.result?.channelOptions ?? [];
+  state.emergencyLevelOptions = res.result?.emergencyLevelOptions ?? [];
+  state.orgOptions = res.result?.orgOptions ?? [];
+  state.pushTypeOptions = res.result?.pushTypeOptions ?? [];
+  state.orderStatusOptions = res.result?.orderStatusOptions ?? [];
+};
+/** 获取列表 */
+const queryList = throttle(() => {
+  if (!auth('business:supervise:query')) ElMessage.error('抱歉,您没有权限查看工单待办!');
+  else {
+  }
+}, 500);
+
+/** 重置按钮操作 */
+const resetQuery = throttle((formEl: FormInstance | undefined) => {
+  orderReleaseRef.value.openDialog();
+  if (!formEl) return;
+  formEl.resetFields();
+  state.queryParams.CreationTimeStart = '';
+  state.queryParams.CreationTimeEnd = '';
+  state.queryParams.ExpiredTimeStart = '';
+  state.queryParams.ExpiredTimeStart = '';
+  queryList();
+}, 500);
+// 表格多选
+const multipleTableRef = ref<RefType>()
+const multipleSelection = ref<any>([])
+const handleSelectionChange = (val: any[]) => {
+  multipleSelection.value = val
+}
+// 导出
+const onExport = () => {
+  console.log('导出');
+};
+// 查看督办详情
+const onDetail = (row: any) => {
+
+};
+onMounted(async () => {
+  await getBaseData();
+  queryList();
+});
+</script>
+
+<style scoped lang="scss">
+.business-supervise-container {
+  .arrow {
+    transition: transform var(--el-transition-duration);
+    cursor: pointer;
+  }
+  .arrow.is-reverse {
+    transform: rotateZ(-180deg);
+  }
+}
+</style>

+ 0 - 0
src/views/home/component/Entrance.vue → src/views/home/component/Home-entrance.vue


+ 3 - 2
src/views/home/index.vue

@@ -148,7 +148,7 @@
 				</div>
 			</el-col>
 		</el-row>
-		<entrance ref="entranceRef" @updateEntrance="getEntrance" />
+		<home-entrance ref="entranceRef" @updateEntrance="getEntrance" />
 	</div>
 </template>
 
@@ -159,7 +159,8 @@ import { Vue3SeamlessScroll } from 'vue3-seamless-scroll';
 import { getImageUrl } from '/@/utils/tools';
 import { formatDate } from '/@/utils/formatTime';
 import { geFastMenu } from '/@/api/home';
-const Entrance = defineAsyncComponent(() => import('/@/views/home/component/Entrance.vue'));
+// 引入组件
+const HomeEntrance = defineAsyncComponent(() => import('/src/views/home/component/Home-entrance.vue'));
 
 const router = useRouter();
 const state = reactive({

+ 1 - 1
src/views/knowledge/apply/index.vue

@@ -35,7 +35,7 @@
 					</el-form-item>
 					<el-form-item>
 						<el-button type="primary" @click="queryList" :loading="state.loading" v-waves> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-						<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+						<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 					</el-form-item>
 				</el-form>
 			</el-tabs>

+ 1 - 1
src/views/knowledge/apply/my/index.vue

@@ -31,7 +31,7 @@
 					</el-form-item>
 					<el-form-item>
 						<el-button type="primary" @click="queryList" :loading="state.loading" v-waves> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-						<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+						<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 					</el-form-item>
 				</el-form>
 			</el-tabs>

+ 1 - 1
src/views/knowledge/config/type/index.vue

@@ -8,7 +8,7 @@
 					</el-form-item>
 					<el-form-item class="mb0">
 						<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-						<el-button @click="resetQuery(ruleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+						<el-button @click="resetQuery(ruleFormRef)" class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 					</el-form-item>
 				</el-form>
 				<div>

+ 1 - 1
src/views/knowledge/knowledge/delApply/index.vue

@@ -31,7 +31,7 @@
 					</el-form-item>
 					<el-form-item>
 						<el-button type="primary" @click="queryList" :loading="state.loading" v-waves> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-						<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+						<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 					</el-form-item>
 				</el-form>
 			</el-tabs>

+ 1 - 1
src/views/knowledge/knowledge/draft/index.vue

@@ -37,7 +37,7 @@
 				</el-form-item>
 				<el-form-item>
 					<el-button type="primary" @click="queryList" :loading="state.loading" v-waves> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-					<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+					<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 				</el-form-item>
 			</el-form>
 		</el-card>

+ 1 - 1
src/views/knowledge/knowledge/index.vue

@@ -138,7 +138,7 @@
 									<el-button type="primary" @click="handleQuery" :loading="state.tableLoading">
 										<SvgIcon name="ele-Search" class="mr5" />查询
 									</el-button>
-									<el-button @click="resetQuery(ruleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+									<el-button @click="resetQuery(ruleFormRef)" class="default-button" :loading="state.tableLoading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 								</el-form-item>
 							</el-form>
 							<div class="flex-center-between mb20">

+ 1 - 1
src/views/knowledge/process/index.vue

@@ -15,7 +15,7 @@
 					</el-form-item>
 					<el-form-item>
 						<el-button type="primary" @click="queryList" :loading="state.loading" v-waves> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-						<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+						<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 					</el-form-item>
 				</el-form>
 			</el-tabs>

+ 1 - 1
src/views/system/config/dict/index.vue

@@ -38,7 +38,7 @@
 										<el-button type="primary" @click="handleQuery" :loading="state.tableLoading" v-waves>
 											<SvgIcon name="ele-Search" class="mr5" />查询
 										</el-button>
-										<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button">
+										<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.tableLoading">
 											<SvgIcon name="ele-Refresh" class="mr5" />重置
 										</el-button>
 									</el-form-item>

+ 2 - 2
src/views/system/config/workflow/index.vue

@@ -31,7 +31,7 @@
 							<el-button type="primary" @click="queryList" :loading="state.loading" v-waves>
 								<SvgIcon name="ele-Search" class="mr5" />查询
 							</el-button>
-							<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+							<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 						</el-form-item>
 					</el-form>
 					<div class="flex-center-between mb20">
@@ -168,7 +168,7 @@
 import { ref, reactive, onMounted, defineAsyncComponent,onActivated } from 'vue';
 import { useRouter,useRoute } from 'vue-router';
 import type { FormInstance } from 'element-plus';
-import { ElMessage, ElMessageBox } from 'element-plus';
+import {ElButton, ElMessage, ElMessageBox} from 'element-plus';
 import { formatDate } from '/@/utils/formatTime';
 import { throttle } from '/@/utils/tools';
 import {

+ 1 - 1
src/views/system/menu/index.vue

@@ -10,7 +10,7 @@
 						<el-button type="primary" @click="handleQuery" :loading="state.loading" v-waves>
 							<SvgIcon name="ele-Search" class="mr5" />查询
 						</el-button>
-						<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+						<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 					</el-form-item>
 				</el-form>
 				<div>

+ 1 - 1
src/views/system/organize/index.vue

@@ -8,7 +8,7 @@
 					</el-form-item>
 					<el-form-item class="mb0">
 						<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-						<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+						<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 					</el-form-item>
 				</el-form>
 				<div>

+ 1 - 1
src/views/system/roles/index.vue

@@ -15,7 +15,7 @@
           <el-button type="primary" @click="handleQuery" :loading="state.loading" v-waves>
             <SvgIcon name="ele-Search" class="mr5" />查询
           </el-button>
-          <el-button @click="resetQuery(ruleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+          <el-button @click="resetQuery(ruleFormRef)" class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
         </el-form-item>
       </el-form>
     </el-card>

+ 1 - 1
src/views/system/user/index.vue

@@ -43,7 +43,7 @@
 									<el-button type="primary" @click="handleQuery" :loading="state.tableLoading">
 										<SvgIcon name="ele-Search" class="mr5" />查询
 									</el-button>
-									<el-button @click="resetQuery(ruleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+									<el-button @click="resetQuery(ruleFormRef)" class="default-button" :loading="state.tableLoading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 								</el-form-item>
 							</el-form>
 							<div class="flex-center-between mb20">

+ 2 - 10
src/views/tels/blacklist/index.vue

@@ -12,7 +12,7 @@
 
 				<el-form-item>
 					<el-button type="primary" @click="handleQuery" :loading="state.loading" v-waves> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-					<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+					<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
 				</el-form-item>
 			</el-form>
 		</el-card>
@@ -23,14 +23,10 @@
 					<el-button type="primary" @click="onAddBlacklist" v-waves v-auth="'tels:blackList:add'">
 						<SvgIcon name="ele-Plus" class="mr5" />新增
 					</el-button>
-<!--					<el-button type="primary" @click="onRemove" v-waves v-auth="'tels:blackList:delete'" :disabled="!state.multipleSelection.length">-->
-<!--						<SvgIcon name="ele-Delete" class="mr5" />解除-->
-<!--					</el-button>-->
 				</div>
 			</div>
 			<!-- 表格 -->
 			<el-table :data="state.tableData" v-loading="state.loading" row-key="id">
-				<el-table-column type="index" width="60" label="序号" />
 				<el-table-column prop="telePhone" label="黑名单号码" show-overflow-tooltip></el-table-column>
 				<el-table-column label="开始时间" show-overflow-tooltip width="170">
 					<template #default="{row}">
@@ -43,11 +39,7 @@
 					</template>
 				</el-table-column>
         <el-table-column prop="remark" label="备注" show-overflow-tooltip></el-table-column>
-				<el-table-column label="创建时间" show-overflow-tooltip width="170" fixed="right" align="center">
-					<template #default="{row}">
-						<span>{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-					</template>
-				</el-table-column>
+        <el-table-column prop="platFromCode" label="平台编码" show-overflow-tooltip></el-table-column>
 				<el-table-column label="操作" width="100" fixed="right" align="center">
 					<template #default="{row}">
             <el-button type="primary" @click="onRemove(row)"  link v-auth="'tels:blackList:delete'">

+ 71 - 44
src/views/tels/callRecord/index.vue

@@ -5,32 +5,32 @@
         <el-row :gutter="10">
           <el-col :span="8">
             <el-form-item label="通话标识" prop="CallID">
-              <el-input v-model="state.queryParams.CallID" placeholder="通话标识" clearable @keyup.enter="queryList" />
+              <el-input v-model="state.queryParams.CallID" placeholder="请输入通话标识" clearable @keyup.enter="queryList" />
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item label="分机号" prop="GongHao">
-              <el-input v-model="state.queryParams.Content" placeholder="分机号" clearable @keyup.enter="queryList" />
+              <el-input v-model="state.queryParams.GongHao" placeholder="请输入分机号" clearable @keyup.enter="queryList" />
             </el-form-item>
           </el-col>
           <transition name="el-zoom-in-top">
             <el-col :span="8" v-show="!searchCol">
               <el-form-item label="电话号码" prop="Telphone">
-                <el-input v-model="state.queryParams.Telphone" placeholder="电话号码" clearable @keyup.enter="queryList" />
+                <el-input v-model="state.queryParams.Telphone" placeholder="请输入电话号码" clearable @keyup.enter="queryList" />
               </el-form-item>
             </el-col>
           </transition>
           <transition name="el-zoom-in-top">
             <el-col :span="8" v-show="!searchCol">
               <el-form-item label="姓名" prop="CustomerName">
-                <el-input v-model="state.queryParams.CustomerName" placeholder="姓名" clearable @keyup.enter="queryList" />
+                <el-input v-model="state.queryParams.CustomerName" placeholder="请输入姓名" clearable @keyup.enter="queryList" />
               </el-form-item>
             </el-col>
           </transition>
           <transition name="el-zoom-in-top">
             <el-col :span="8" v-show="!searchCol">
-              <el-form-item label="类型" prop="CallType">
-                <el-select v-model="state.queryParams.CallType" placeholder="请选择类型" clearable class="w100">
+              <el-form-item label="呼叫类型" prop="CallType">
+                <el-select v-model="state.queryParams.CallType" placeholder="请选择呼叫类型" clearable class="w100">
                   <el-option v-for="item in state.CallTypeOptions" :value="item.value" :key="item.value" :label="item.label" />
                 </el-select>
               </el-form-item>
@@ -39,7 +39,7 @@
           <transition name="el-zoom-in-top">
             <el-col :span="8" v-show="!searchCol">
               <el-form-item label="类型" prop="Result">
-                <el-select v-model="state.queryParams.Result" placeholder="结果" clearable class="w100">
+                <el-select v-model="state.queryParams.Result" placeholder="请选择结果" clearable class="w100">
                   <el-option v-for="item in state.resultOptions" :value="item.value" :key="item.value" :label="item.label" />
                 </el-select>
               </el-form-item>
@@ -58,7 +58,7 @@
                     end-placeholder="结束时间"
                     :shortcuts="shortcuts"
                     @change="timeStartChangeCr"
-                    value-format="YYYY-MM-DD[T]HH:mm:ss"
+                    value-format="YYYY-MM-DD HH:mm:ss"
                 />
               </el-form-item>
             </el-col>
@@ -66,8 +66,8 @@
           <el-col :span="8">
             <div class="flex-end w100">
               <el-button type="primary" @click="queryList" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-              <el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
-              <el-button link type="primary" @click="closeSearch">
+              <el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
+              <el-button link type="primary" @click="closeSearch" :loading="state.loading">
                 {{ searchCol ? '展开' : '收起' }}
                 <SvgIcon :class="{ 'is-reverse': searchCol }" name="ele-ArrowUp" class="mr5 arrow" size="18px" />
               </el-button>
@@ -82,39 +82,24 @@
 				<div></div>
 			</div>
 			<!-- 表格 -->
-			<el-table :data="state.tableList" v-loading="state.loading" row-key="id">
-
-				<el-table-column prop="CallID" label="通话id" show-overflow-tooltip width="120"></el-table-column>
+			<el-table :data="state.tableList" v-loading="state.loading" @sort-change="sortChange">
+<!--				<el-table-column prop="CallID" label="通话id" show-overflow-tooltip width="120"></el-table-column>-->
 				<el-table-column prop="GongHao" label="分机号" show-overflow-tooltip></el-table-column>
         <el-table-column prop="RealName" label="姓名" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="Telphone" label="号码" show-overflow-tooltip width="120"></el-table-column>
-        <el-table-column prop="PhoneType" label="类型" show-overflow-tooltip width="120"></el-table-column>
-        <el-table-column prop="PhoneTypeName" label="类型名称" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="Telphone" label="电话号码" show-overflow-tooltip width="120"></el-table-column>
+        <el-table-column prop="PhoneTypeName" label="类型名称" show-overflow-tooltip width="120"></el-table-column>
         <el-table-column prop="CustomerName" label="人员姓名" show-overflow-tooltip></el-table-column>
         <el-table-column prop="CustomerClassName" label="通讯录组名称" show-overflow-tooltip width="120"></el-table-column>
         <el-table-column prop="CallType" label="呼叫类型" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="RingTimes" label="响铃" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="RingTimes" label="响铃次数" show-overflow-tooltip></el-table-column>
         <el-table-column prop="TrunkLinePhone" label="中继号" show-overflow-tooltip></el-table-column>
         <el-table-column prop="AreaName" label="区域" show-overflow-tooltip width="160"></el-table-column>
-        <el-table-column prop="TalkLenth" label="通话时长" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="TalkLenth" label="通话时长" show-overflow-tooltip sortable="custom" width="120"></el-table-column>
         <el-table-column prop="Result" label="结果" show-overflow-tooltip></el-table-column>
         <el-table-column prop="NoAnswerResult" label="挂机类型" show-overflow-tooltip width="150"></el-table-column>
-        <el-table-column prop="Result" label="结果" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="CallTime" label="通话时间" show-overflow-tooltip width="170">
-          <template #default="{row}">
-            <span>{{ formatDate(row.CallTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-          </template>
-        </el-table-column>
-          <el-table-column prop="BeginTalking" label="开始通话时间" show-overflow-tooltip width="170">
-            <template #default="{row}">
-              <span>{{ formatDate(row.BeginTalking, 'YYYY-mm-dd HH:MM:SS') }}</span>
-            </template>
-          </el-table-column>
-            <el-table-column prop="EndTalking" label="结束通话时间" show-overflow-tooltip width="170">
-              <template #default="{row}">
-                <span>{{ formatDate(row.CallTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-              </template>
-          </el-table-column>
+				<el-table-column prop="CallTime" label="通话时间" show-overflow-tooltip width="170"  sortable="custom"></el-table-column>
+        <el-table-column prop="BeginTalking" label="开始通话时间" show-overflow-tooltip width="170"  sortable="custom"> </el-table-column>
+        <el-table-column prop="EndTalking" label="结束通话时间" show-overflow-tooltip width="170"  sortable="custom"></el-table-column>
         <el-table-column label="操作" width="180" fixed="right" align="center">
           <template #default="{row}">
             <el-button type="primary" @click="onPlaySoundRecording(row)"  title="播放录音" link>播放录音</el-button>
@@ -140,11 +125,10 @@
 <script lang="ts" setup name="callRecord">
 import { ref, reactive, onMounted, defineAsyncComponent } from 'vue';
 import type { FormInstance } from 'element-plus';
-import {ElMessage, ElMessageBox} from 'element-plus';
+import {ElButton, ElMessage, ElMessageBox} from 'element-plus';
 import { auth } from '/@/utils/authFunction';
 import {shortcuts, throttle} from '/@/utils/tools';
 import {callLogPaged} from "/@/api/public/wex";
-import {formatDate} from "/@/utils/formatTime";
 
 // 引入组件
 const PlayRecord = defineAsyncComponent(() => import('/@/views/tels/callRecord/component/Play-record.vue'));
@@ -158,7 +142,7 @@ const state = reactive(<any>{
     sortFiled: '', // 排序字段
     asAsc: false, // 是否升序
     CallID: '', // 呼叫ID
-    GongHao: '', // 
+    GongHao: '', // 分机
     Telphone: '', // 电话号码
     CustomerName:'', // 客户姓名
     CallType:'', // 呼叫类型
@@ -172,19 +156,39 @@ const state = reactive(<any>{
 	total: 0, // 总条数
   CallTypeOptions:[
     {
-      value:'0',
-      label:'来电',
+      value:'外呼',
+      label:'外呼',
     },
     {
-      value:'1',
-      label:'1外呼',
+      value:'来电',
+      label:'来电',
     },
     {
-      value:'2',
-      label:'转接',
+      value:'自动外呼',
+      label:'自动外呼',
+    },{
+      value:'会议',
+      label:'会议',
+    },{
+      value:'留言',
+      label:'留言',
     },
   ], // 呼叫类型
-  resultOptions:[] // 呼叫结果
+  resultOptions:[
+    {
+      value:'未接',
+      label:'未接',
+    },{
+      value:'接听',
+      label:'接听',
+    },{
+      value:'成功',
+      label:'成功',
+    },{
+      value:'失败',
+      label:'失败',
+    },
+  ] // 呼叫结果
 });
 const ruleFormRef = ref<FormInstance>();
 const playRecordRef = ref<RefType>();
@@ -243,6 +247,8 @@ const queryList = throttle(async () => {
 const resetQuery = throttle((formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	formEl.resetFields();
+  state.queryParams.QueryStartTime = '';
+  state.queryParams.QueryEndTime = '';
 	queryList();
 }, 500);
 // 播放录音
@@ -264,7 +270,28 @@ const onDownload = (row:any) => {
       })
       .catch(() => {});
 };
+// 排序
+const sortChange = (column:any )=>{
+  if(column.order === null){
+    state.queryParams.sortFiled = '';
+    state.queryParams.asAsc = false;
+    queryList();
+    return;
+  }
+  state.queryParams.sortFiled = column.prop;
+  state.queryParams.asAsc = column.order === 'ascending';
+  queryList();
+}
 onMounted(() => {
 	queryList();
 });
 </script>
+<style lang="scss" scoped>
+.arrow {
+  transition: transform var(--el-transition-duration);
+  cursor: pointer;
+}
+.arrow.is-reverse {
+  transform: rotateZ(-180deg);
+}
+</style>