瀏覽代碼

Merge branch 'release' into dev

zhangchong 3 月之前
父節點
當前提交
30ef8221c0

+ 11 - 0
src/api/business/delay.ts

@@ -85,4 +85,15 @@ export const delayModify = (data: object) => {
         method: 'post',
         data
     });
+}
+/**
+ * @description 延期批量审批
+ * @param {object} data
+ */
+export const delayBatchApprove = (data: object) => {
+    return request({
+        url: `/api/v1/Order/delay/batch_audit`,
+        method: 'post',
+        data
+    });
 }

+ 4 - 4
src/api/snapshot/centerMark.ts

@@ -9,7 +9,7 @@ import request from '@/utils/request';
  */
 export const centerMarkList = (params?: object) => {
   return request({
-    url: '/api/v1/SnapshotOrder/signed',
+    url: '/api/v1/SnapshotOrder/labeled',
     method: 'get',
     params,
   });
@@ -20,7 +20,7 @@ export const centerMarkList = (params?: object) => {
  */
 export const centerMarkDetail = (id: string) => {
   return request({
-    url: `/api/v1/SnapshotOrder/sign/${id}`,
+    url: `/api/v1/SnapshotOrder/label/${id}`,
     method: 'get',
   });
 };
@@ -30,7 +30,7 @@ export const centerMarkDetail = (id: string) => {
  */
 export const centerMarkUpdate = (data: object) => {
   return request({
-    url: '/api/v1/SnapshotOrder/sign',
+    url: '/api/v1/SnapshotOrder/label',
     method: 'put',
     data,
   });
@@ -41,7 +41,7 @@ export const centerMarkUpdate = (data: object) => {
  */
 export const centerMarkListLog = (params?: object) => {
   return request({
-    url: '/api/v1/SnapshotOrder/sign/log',
+    url: '/api/v1/SnapshotOrder/label/log',
     method: 'get',
     params,
   });

+ 1 - 1
src/api/snapshot/handle.ts

@@ -9,7 +9,7 @@ import request from '@/utils/request';
  */
 export const getOrderMarkList = (params?: object) =>{
 	return  request({
-		url: '/api/v1/SnapshotOrder/sign',
+		url: '/api/v1/SnapshotOrder/label',
 		method: 'get',
 		params,
 	});

+ 9 - 4
src/components/OrderDetail/index.vue

@@ -715,6 +715,8 @@
 	</process-detail>
 	<!--  自贡随手拍办理  -->
 	<z-g-s-s-p-process ref="zgSspProcessRef" @orderProcessSuccess="orderProcessSuccess" />
+	<!-- 宜宾工单办理 -->
+	<y-b-process ref="ybProcessRef" />
 </template>
 
 <script setup lang="ts" name="orderDetail">
@@ -750,6 +752,7 @@ const DelayApply = defineAsyncComponent(() => import('@/views/business/delay/com
 const ProcessDetail = defineAsyncComponent(() => import('@/components/ProcessDetail/index.vue')); // 流程明细
 const MapView = defineAsyncComponent(() => import('@/components/OrderDetail/Map-view.vue')); // 地图标点
 const ZGSSPProcess = defineAsyncComponent(() => import('@/components/ProcessAudit/ZGSSPProcess.vue')); // 自贡随手拍办理流程
+const YBProcess = defineAsyncComponent(() => import('@/components/ProcessAudit/YBProcess.vue')); // 宜宾工单办理流程
 
 type ButtonType = '' | 'default' | 'success' | 'warning' | 'info' | 'text' | 'primary' | 'danger';
 const props = defineProps({
@@ -1051,10 +1054,11 @@ const onDelayApply = () => {
 	delayApplyRef.value.openDialog(params);
 };
 // 提交流程
-const lzProcessRef = ref<RefType>();
+const lzProcessRef = ref<RefType>(); // 泸州流程办理
 const processAuditRef = ref<RefType>(); // 处理流程
-const zgProcessRef = ref<RefType>();
-const zgSspProcessRef = ref<RefType>();
+const zgProcessRef = ref<RefType>(); // 自贡流程办理
+const zgSspProcessRef = ref<RefType>(); // 自贡随手拍流程办理
+const ybProcessRef = ref<RefType>(); // 宜宾流程办理
 const onSubmit = (val: string, annexName: string = '办理附件', classify: string = '办理附件', inputPlaceholder = '办理意见') => {
 	if (['工单办理', '工单退回'].includes(val) && state.ruleForm.isReturnUnderApproval) {
 		ElMessage.warning(`该工单存在正在审核中的退回,不能办理!`);
@@ -1081,8 +1085,9 @@ const onSubmit = (val: string, annexName: string = '办理附件', classify: str
 		}
 	} else if (['LuZhou'].includes(themeConfig.value.appScope) && zgLzActions.includes(val)) {
 		lzProcessRef.value.openDialog(params);
-	} else {
+	} else { // 宜宾
 		processAuditRef.value.openDialog(params);
+		// ybProcessRef.value.openDialog(params);
 	}
 };
 // 流程提交成功

+ 9 - 0
src/components/ProcessAudit/LZProcess.vue

@@ -42,6 +42,11 @@
 				</template>
 				<!-- 办理流程 -->
 				<template v-else>
+					<el-col v-if="orderContent">
+						<el-form-item label="受理内容">
+							<text-ellipsis :content="orderContent" :rows="1"> </text-ellipsis>
+						</el-form-item>
+					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 						<el-form-item label="下一环节" prop="nextStepCode" :rules="[{ required: true, message: '请选择下一环节', trigger: 'change' }]">
 							<el-select v-model="state.ruleForm.nextStepCode" placeholder="请选择下一环节" class="w100" @change="selectNextStep">
@@ -516,6 +521,7 @@ import { useThemeConfig } from '@/stores/themeConfig';
 // 引入组件
 const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
 const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue')); // 附件列表
+const TextEllipsis = defineAsyncComponent(() => import('@/components/TextEllipsis/index.vue'));
 // 定义子组件向父组件传值/事件
 const emit = defineEmits(['orderProcessSuccess', 'orderProcessFailed']);
 // 定义变量内容
@@ -664,6 +670,7 @@ const isMainHandlerShow = ref<boolean>(false); // 是否展示主办人
 const currentParams = ref<EmptyObjectType>({}); // 当前获取到的参数(当前节点信息)
 const leaderSMS = ref<EmptyArrayType>([]); // 领导短信选择
 const transpondCity = ref<EmptyArrayType>([]); // 市州互转选择
+const orderContent = ref<string>(''); // 受理内容
 const handleResult = (res: any) => {
 	currentParams.value = res.result;
 	state.nextStepOptions = res.result.steps; //办理对象选择内容
@@ -672,6 +679,7 @@ const handleResult = (res: any) => {
 	isMainHandlerShow.value = res.result.isMainHandlerShow ?? false; // 是否展示主办人
 	leaderSMS.value = res.result.leaderSMS ?? []; // 领导短信选择
 	transpondCity.value = res.result.transpondCity ?? []; // 市州互转
+	orderContent.value = res.result.content ?? ''; // 受理内容
 	if (handelArr.includes(state.processType)) {
 		// 办理才有期满时间
 		state.ruleForm.expiredTime = res.result.expiredTime ?? null; // 期满时间
@@ -1183,6 +1191,7 @@ const afterSubmit = (emitType?: 'orderProcessSuccess' | 'orderProcessFailed', sh
 };
 const close = () => {
 	restForm(ruleFormRef.value);
+	orderContent.value = '';
 };
 // 选择是否市州互转
 const changeTransPond = (val: any) => {

+ 9 - 0
src/components/ProcessAudit/YBProcess.vue

@@ -29,6 +29,11 @@
 		{{ orgSummaryToEnd ? '部门汇总到归档' : '' }}
 		<el-form :model="state.ruleForm" label-width="110px" ref="ruleFormRef"  v-loading="state.loading">
 			<slot name="header"></slot>
+			<el-col v-if="orderContent">
+				<el-form-item label="受理内容">
+					<text-ellipsis :content="orderContent" :rows="1"> </text-ellipsis>
+				</el-form-item>
+			</el-col>
 			<el-row :gutter="10">
 					<!-- 非退回流程都需要选择 -->
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
@@ -399,6 +404,7 @@ import { useAppConfig } from '@/stores/appConfig';
 // 引入组件
 const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
 const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue')); // 附件列表
+const TextEllipsis = defineAsyncComponent(() => import('@/components/TextEllipsis/index.vue'));
 // 定义子组件向父组件传值/事件
 const emit = defineEmits(['orderProcessSuccess', 'orderProcessFailed']);
 // 定义变量内容
@@ -539,6 +545,7 @@ const canStartCountersign = ref<boolean>(false); // 是否可以发起会签
 const isMainHandlerShow = ref<boolean>(false); // 是否展示主办人
 const currentParams = ref<EmptyObjectType>({}); // 当前获取到的参数(当前节点信息)
 const transpondCity = ref<EmptyArrayType>([]); // 市州互转选择
+const orderContent = ref<string>(''); // 受理内容
 const handleResult = (res: any) => {
 	currentParams.value = res.result; // 当前获取到的参数(当前节点信息)
 	state.nextStepOptions = res.result.steps; //办理对象选择内容
@@ -546,6 +553,7 @@ const handleResult = (res: any) => {
 	canStartCountersign.value = res.result.canStartCountersign ?? false; // 是否可以发起会签
 	isMainHandlerShow.value = res.result.isMainHandlerShow ?? false; // 是否展示主办人
 	transpondCity.value = res.result.transpondCity ?? []; // 市州互转
+	orderContent.value = res.result.content ?? ''; // 受理内容
 
 	// 办理才有期满时间
 	state.ruleForm.expiredTime = res.result.expiredTime ?? null; // 期满时间
@@ -954,6 +962,7 @@ const afterSubmit = (emitType?: 'orderProcessSuccess' | 'orderProcessFailed', sh
 };
 const close = () => {
 	restForm(ruleFormRef.value);
+	orderContent.value = '';
 };
 
 // 选择是否市州互转

+ 14 - 5
src/components/ProcessAudit/ZGProcess.vue

@@ -15,7 +15,7 @@
 		:append-to-body="!isOrderAccept"
 		:modal="!isOrderAccept"
 	>
-<!--		<template  #header="{ close, titleId, titleClass }">
+		<!--		<template  #header="{ close, titleId, titleClass }">
 			<h4 :id="titleId" :class="titleClass">{{state.dialogTitle}}<el-text tag="b" type="danger" size="large" class="ml10">随手拍</el-text></h4>
 		</template>-->
 		<el-form :model="state.ruleForm" label-width="110px" ref="ruleFormRef" v-loading="state.loading">
@@ -45,6 +45,11 @@
 				</template>
 				<!-- 办理流程 -->
 				<template v-else>
+					<el-col v-if="orderContent">
+						<el-form-item label="受理内容">
+							<text-ellipsis :content="orderContent" :rows="1"> </text-ellipsis>
+						</el-form-item>
+					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 						<el-form-item label="下一环节" prop="nextStepCode" :rules="[{ required: true, message: '请选择下一环节', trigger: 'change' }]">
 							<el-select v-model="state.ruleForm.nextStepCode" placeholder="请选择下一环节" class="w100" @change="selectNextStep">
@@ -556,6 +561,7 @@ import { removeDuplicate } from '@/utils/arrayOperation';
 // 引入组件
 const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
 const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue')); // 附件列表
+const TextEllipsis = defineAsyncComponent(() => import('@/components/TextEllipsis/index.vue'));
 // 定义子组件向父组件传值/事件
 const emit = defineEmits(['orderProcessSuccess', 'orderProcessFailed']);
 // 定义变量内容
@@ -705,6 +711,7 @@ const isMainHandlerShow = ref<boolean>(false); // 是否展示主办人
 const currentParams = ref<EmptyObjectType>({}); // 当前获取到的参数(当前节点信息)
 const leaderSMS = ref<EmptyArrayType>([]); // 领导短信选择
 const transpondCity = ref<EmptyArrayType>([]); // 市州互转选择
+const orderContent = ref<string>(''); // 受理内容
 const handleResult = (res: any) => {
 	currentParams.value = res.result;
 	state.nextStepOptions = res.result.steps; //办理对象选择内容
@@ -713,6 +720,7 @@ const handleResult = (res: any) => {
 	isMainHandlerShow.value = res.result.isMainHandlerShow ?? false; // 是否展示主办人
 	leaderSMS.value = res.result.leaderSMS ?? []; // 领导短信选择
 	transpondCity.value = res.result.transpondCity ?? []; // 市州互转
+	orderContent.value = res.result.content ?? ''; // 受理内容
 	if (handelArr.includes(state.processType)) {
 		// 办理才有期满时间
 		state.ruleForm.expiredTime = res.result.expiredTime ?? null; // 期满时间
@@ -1329,6 +1337,7 @@ const afterSubmit = (emitType?: 'orderProcessSuccess' | 'orderProcessFailed', sh
 };
 const close = () => {
 	restForm(ruleFormRef.value);
+	orderContent.value = '';
 };
 // 选择是否市州互转
 const changeTransPond = (val: any) => {
@@ -1422,7 +1431,7 @@ const onSubmit = (formEl: FormInstance | undefined) => {
 			case '工单受理':
 				const request = {
 					data: { orderId: state.orderDetail.id, ...submitObj, crossSteps, secondaryOrgs: secondaryOrgs.value, copys: copys.value },
-					workflow: { ...submitObj, files: handleFiles.value,currentTag:currentParams.value.currentTag },
+					workflow: { ...submitObj, files: handleFiles.value, currentTag: currentParams.value.currentTag },
 				};
 				orderStartFlow(request)
 					.then(() => {
@@ -1436,7 +1445,7 @@ const onSubmit = (formEl: FormInstance | undefined) => {
 			case '工单代办': // 工单代办流程
 				const requestHandle = {
 					data: { orderId: state.orderDetail.id, ...submitObj, crossSteps, secondaryOrgs: secondaryOrgs.value, copys: copys.value },
-					workflow: { ...submitObj, files: handleFiles.value,currentTag:currentParams.value.currentTag },
+					workflow: { ...submitObj, files: handleFiles.value, currentTag: currentParams.value.currentTag },
 				};
 				orderHandle(requestHandle)
 					.then(() => {
@@ -1447,7 +1456,7 @@ const onSubmit = (formEl: FormInstance | undefined) => {
 					});
 				break;
 			case '工单退回':
-				const requestReturn = { ...submitObj, files: handleFiles.value,orderId: state.orderDetail.id };
+				const requestReturn = { ...submitObj, files: handleFiles.value, orderId: state.orderDetail.id };
 				orderPrevious(requestReturn)
 					.then(() => {
 						afterSubmit('orderProcessSuccess', true, '退回申请成功');
@@ -1459,7 +1468,7 @@ const onSubmit = (formEl: FormInstance | undefined) => {
 			default: // 默认工单办理
 				const requestDefault = {
 					data: { orderId: state.orderDetail.id, ...submitObj, crossSteps, secondaryOrgs: secondaryOrgs.value, copys: copys.value },
-					workflow: { ...submitObj, files: handleFiles.value,currentTag:currentParams.value.currentTag },
+					workflow: { ...submitObj, files: handleFiles.value, currentTag: currentParams.value.currentTag },
 				};
 				orderHandle(requestDefault)
 					.then(() => {

+ 10 - 1
src/components/ProcessAudit/index.vue

@@ -181,7 +181,7 @@
 				</el-row>
 			</el-form>
 		</div>
-		<el-form :model="state.ruleForm" label-width="110px" ref="ruleFormRef" v-show="activeStep === 1" v-loading="state.loading">
+		<el-form :model="state.ruleForm" label-width="110px" ref="ruleFormRef" v-show="activeStep === 1" v-loading="state.loading" :disabled="state.loading">
 			<slot name="header"></slot>
 			<el-row :gutter="10">
 				<!-- 审批流程 -->
@@ -278,6 +278,11 @@
 				</template>
 				<!-- 办理流程 -->
 				<template v-else>
+					<el-col v-if="orderContent">
+						<el-form-item label="受理内容">
+							<text-ellipsis :content="orderContent" :rows="1"> </text-ellipsis>
+						</el-form-item>
+					</el-col>
 					<!-- 非退回流程都需要选择 -->
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="!returnArr.includes(state.processType)">
 						<el-form-item label="下一环节" prop="nextStepCode" :rules="[{ required: true, message: '请选择下一环节', trigger: 'change' }]">
@@ -640,6 +645,7 @@ import { terminateNextFlowParams, terminateStartFlow, terminateStartFlowParams }
 // 引入组件
 const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
 const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue')); // 附件列表
+const TextEllipsis = defineAsyncComponent(() => import('@/components/TextEllipsis/index.vue'));
 // 定义子组件向父组件传值/事件
 const emit = defineEmits(['orderProcessSuccess', 'orderProcessFailed']);
 // 定义变量内容
@@ -844,6 +850,7 @@ const timeTypeOptions = ref<EmptyArrayType>([]); // 办理时限单位
 const canStartCountersign = ref<boolean>(false); // 是否可以发起会签
 const isMainHandlerShow = ref<boolean>(false); // 是否展示主办人
 const currentParams = ref<EmptyObjectType>({}); // 当前获取到的参数(当前节点信息)
+const orderContent = ref<string>(''); // 受理内容
 const handleResult = (res: any) => {
 	currentParams.value = res.result; // 当前获取到的参数(当前节点信息)
 	state.nextStepOptions = res.result.steps; //办理对象选择内容
@@ -851,6 +858,7 @@ const handleResult = (res: any) => {
 	timeTypeOptions.value = res.result.timeTypeOptions ?? []; // 办理时限申请单位
 	canStartCountersign.value = res.result.canStartCountersign ?? false; // 是否可以发起会签
 	isMainHandlerShow.value = res.result.isMainHandlerShow ?? false; // 是否展示主办人
+	orderContent.value = res.result.content ?? ''; // 受理内容
 	if (handelArr.includes(state.processType)) {
 		// 办理才有期满时间
 		state.ruleForm.expiredTime = res.result.expiredTime ?? null; // 期满时间
@@ -1326,6 +1334,7 @@ const close = () => {
 	restForm(discernFormRef.value);
 	restForm(terminateFormRef.value);
 	restForm(redoFormRef.value);
+	orderContent.value = '';
 };
 // 办理
 const handleFiles = ref<EmptyArrayType>([]); // 流程附件

+ 48 - 9
src/views/business/delay/audit.vue

@@ -24,6 +24,17 @@
 					queryMethod: handleQuery,
 				}"
 			>
+				<template #buttons>
+					<el-button
+						type="primary"
+						@click="onAudit"
+						:disabled="isChecked"
+						v-if="state.queryParams.IsApply === 'false'"
+						:loading="state.loading"
+						v-auth="'business:delay:audit:batch'"
+						><SvgIcon name="ele-Edit" class="mr5" />批量审批<span v-if="checkTable.length">({{ checkTable.length }})</span>
+					</el-button>
+				</template>
 			</vxe-toolbar>
 			<div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
 				<vxe-table
@@ -34,16 +45,19 @@
 					:row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true }"
 					ref="tableRef"
 					height="auto"
+					@checkbox-all="selectAllChangeEvent"
+					@checkbox-change="selectChangeEvent"
 					auto-resize
 					show-overflow
 					:print-config="{}"
-					:scrollY="{ enabled: true, gt: 100  }"
+					:scrollY="{ enabled: true, gt: 100 }"
 					id="businessDelayAudit"
 					:custom-config="{
 						storage: true,
 					}"
 					showHeaderOverflow
 				>
+					<vxe-column type="checkbox" width="50" align="center"></vxe-column>
 					<vxe-column field="order.expiredStatusText" title="状态" width="60" align="center">
 						<template #default="{ row }">
 							<span :class="'overdue-status-' + row.order?.expiredStatus" :title="row.order?.expiredStatusText"></span>
@@ -97,7 +111,7 @@
 					<vxe-column title="操作" fixed="right" width="90" align="center">
 						<template #default="{ row }">
 							<el-button link type="primary" @click="onDetail(row)" title="延期详情"> 延期详情 </el-button>
-<!--							<el-button link type="primary" @click="onAudit(row)" title="审批" v-auth="'business:delay:audit:todo'"> 审批 </el-button>-->
+							<!--							<el-button link type="primary" @click="onAudit(row)" title="审批" v-auth="'business:delay:audit:batch'"> 审批 </el-button>-->
 						</template>
 					</vxe-column>
 				</vxe-table>
@@ -114,19 +128,21 @@
 		<delay-detail-com ref="delayDetailRef" @updateList="handleQuery" />
 		<!--  延期审批  -->
 		<delay-audit ref="delayAuditRef" @updateList="handleQuery" />
+		<!--  延期审批批量  -->
+		<delay-audit-batch ref="delayAuditBatchRef" @updateList="handleQuery" />
 	</div>
 </template>
 <script setup lang="tsx" name="businessDelayAudit">
-import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { computed, defineAsyncComponent, onMounted, reactive, ref } from 'vue';
 import { FormInstance } from 'element-plus';
 import { formatDate } from '@/utils/formatTime';
 import { delayList } from '@/api/todo/delay';
-import { delayDetail } from '@/api/business/delay';
 // 引入组件
 const DelayDetailCom = defineAsyncComponent(() => import('@/views/business/delay/components/Delay-detail.vue')); // 延期详情
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
 const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 const DelayAudit = defineAsyncComponent(() => import('@/views/business/delay/components/Delay-audit.vue')); // 延期审批
+const DelayAuditBatch = defineAsyncComponent(() => import('@/views/business/delay/components/Delay-audit-batch.vue')); // 延期审批 批量
 
 // 定义变量内容
 const state = reactive({
@@ -154,9 +170,13 @@ const queryList = () => {
 		.then((res: any) => {
 			state.tableData = res.result?.items ?? [];
 			state.total = res.result?.total ?? 0;
+			tableRef.value.clearCheckboxRow();
+			checkTable.value = [];
 			state.loading = false;
 		})
 		.catch(() => {
+			tableRef.value.clearCheckboxRow();
+			checkTable.value = [];
 			state.loading = false;
 		});
 };
@@ -175,12 +195,31 @@ const delayDetailRef = ref<RefType>();
 const onDetail = async (row: any) => {
 	delayDetailRef.value.openDialog(row);
 };
-// 审批
-const delayAuditRef = ref<RefType>();
-const onAudit = (row:any)=>{
-	delayAuditRef.value.openDialog(row);
-}
 const toolbarRef = ref<RefType>();
+const checkTable = ref<EmptyArrayType>([]);
+const selectAllChangeEvent = ({ checked }) => {
+	if (tableRef.value) {
+		const records = tableRef.value.getCheckboxRecords();
+		checkTable.value = records;
+		console.log(checked ? '所有勾选事件' : '所有取消事件', records);
+	}
+};
+
+const selectChangeEvent = ({ checked }) => {
+	if (tableRef.value) {
+		const records = tableRef.value.getCheckboxRecords();
+		checkTable.value = records;
+		console.log(checked ? '勾选事件' : '取消事件', records);
+	}
+};
+const isChecked = computed(() => {
+	return !Boolean(checkTable.value.length);
+});
+// 批量审批
+const delayAuditBatchRef = ref<RefType>();
+const onAudit = () => {
+	delayAuditBatchRef.value.openDialog(checkTable.value);
+};
 const tableRef = ref<RefType>();
 onMounted(() => {
 	queryList();

+ 934 - 0
src/views/business/delay/components/Delay-audit-batch.vue

@@ -0,0 +1,934 @@
+<template>
+	<el-dialog
+		v-model="state.dialogVisible"
+		draggable
+		title="延期批量审批"
+		ref="dialogRef"
+		@mouseup="mouseup"
+		:style="'transform: ' + state.transform + ';'"
+		destroy-on-close
+		:close-on-click-modal="false"
+		@close="close"
+		append-to-body
+	>
+		<el-form :model="state.ruleForm" label-width="110px" ref="ruleFormRef" v-loading="state.loading" :disabled="state.loading">
+			<slot name="header"></slot>
+			<el-row :gutter="10">
+				<!-- 审批流程 -->
+				<template v-if="canReject">
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="审批结果" prop="isPass" :rules="[{ required: true, message: '请选择审批结果', trigger: 'change' }]">
+							<el-radio-group v-model="state.ruleForm.isPass">
+								<el-radio :value="true">同意</el-radio>
+								<el-radio :value="false">不同意</el-radio>
+							</el-radio-group>
+						</el-form-item>
+					</el-col>
+					<!-- 审批通过 -->
+					<template v-if="state.ruleForm.isPass">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item label="下一环节" prop="nextStepCode" :rules="[{ required: true, message: '请选择下一环节', trigger: 'change' }]">
+								<el-select v-model="state.ruleForm.nextStepCode" placeholder="请选择下一环节" class="w100" @change="selectNextStep">
+									<el-option v-for="item in state.nextStepOptions" :key="item.key" :label="item.value" :value="item.key" />
+								</el-select>
+								<!--								<p class="flex-center-align color-danger" v-if="showFastSendOrder">
+                                  当前推荐派单办理对象:{{ fastStepName }} <el-button type="primary" link class="ml4" @click="fastSendOrder">快捷派单</el-button>
+                                </p>-->
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="showHandlers">
+							<el-form-item
+								label="办理对象"
+								prop="nextHandlers"
+								:rules="[{ required: nextHandlersRequired, message: '请选择办理对象', trigger: 'change' }]"
+								v-if="showHandlers"
+							>
+								<el-select-v2
+									v-model="state.ruleForm.nextHandlers"
+									:options="state.handlerOptions"
+									placeholder="请选择办理对象"
+									class="w100"
+									multiple
+									clearable
+									collapse-tags
+									collapse-tags-tooltip
+									filterable
+									value-key="key"
+									@change="selectHandlers"
+									:multiple-limit="multipleLimit"
+								/>
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="showMainHandler">
+							<el-form-item label="主办" prop="nextMainHandler" :rules="[{ required: false, message: '请选择主办', trigger: 'change' }]">
+								<el-select v-model="state.ruleForm.nextMainHandler" placeholder="请选择主办" class="w100" filterable>
+									<el-option v-for="item in state.handlerMainOptions" :key="item.key" :label="item.value" :value="item.key" />
+								</el-select>
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="countersignAble">
+							<el-form-item label="发起会签" prop="isStartCountersign" :rules="[{ required: false, message: '请选择发起会签', trigger: 'change' }]">
+								<el-switch
+									v-model="state.ruleForm.isStartCountersign"
+									inline-prompt
+									active-text="是"
+									inactive-text="否"
+									@change="changeStartCountersign"
+									:disabled="countersignDisabled"
+								/>
+							</el-form-item>
+						</el-col>
+					</template>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="" prop="isSms">
+							<el-checkbox v-model="state.ruleForm.isSms" label="短信通知" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item
+							:label="state.inputPlaceholder"
+							prop="opinion"
+							:rules="[{ required: true, message: `请填写${state.inputPlaceholder}`, trigger: 'blur' }]"
+						>
+							<common-advice
+								@chooseAdvice="chooseAdvice"
+								v-model="state.ruleForm.opinion"
+								:placeholder="'请填写' + state.inputPlaceholder"
+								:loading="state.loading"
+								:commonEnum="commonEnum.Delay"
+								:maxlength="AppConfigInfo.handleOpinionWordLimit"
+							/>
+						</el-form-item>
+					</el-col>
+					<!--					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="附件" :rules="[{ required: false, message: '请填写诉求内容', trigger: 'change' }]">
+							<annex-list name="延期附件" :businessId="state.orderDetail.id" classify="延期上传" v-model:format="handleFiles" />
+						</el-form-item>
+					</el-col>-->
+				</template>
+				<!-- 办理流程 -->
+				<template v-else>
+					<el-col v-if="orderContent">
+						<el-form-item label="受理内容">
+							<text-ellipsis :content="orderContent" :rows="1"> </text-ellipsis>
+						</el-form-item>
+					</el-col>
+					<!-- 非退回流程都需要选择 -->
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="下一环节" prop="nextStepCode" :rules="[{ required: true, message: '请选择下一环节', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.nextStepCode" placeholder="请选择下一环节" class="w100" @change="selectNextStep">
+								<el-option v-for="item in state.nextStepOptions" :key="item.key" :label="item.value" :value="item.key" />
+							</el-select>
+							<!--							<p class="flex-center-align color-danger" v-if="showFastSendOrder">
+                              当前推荐派单办理对象:{{ fastStepName }} <el-button type="primary" link class="ml4" @click="fastSendOrder">快捷派单</el-button>
+                            </p>-->
+						</el-form-item>
+					</el-col>
+					<!-- 非退回流程都需要选择并且如果选择了结束节点就不需要选择办理对象 -->
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="showHandlers">
+						<el-form-item
+							label="办理对象"
+							prop="nextHandlers"
+							:rules="[{ required: nextHandlersRequired, message: '请选择办理对象', trigger: 'change' }]"
+						>
+							<el-select-v2
+								v-model="state.ruleForm.nextHandlers"
+								:options="state.handlerOptions"
+								placeholder="请选择办理对象"
+								class="w100"
+								multiple
+								clearable
+								collapse-tags
+								collapse-tags-tooltip
+								filterable
+								value-key="key"
+								@change="selectHandlers"
+								:multiple-limit="multipleLimit"
+							/>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="showMainHandler">
+						<el-form-item label="主办" prop="nextMainHandler" :rules="[{ required: false, message: '请选择主办', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.nextMainHandler" placeholder="请选择主办" class="w100" filterable>
+								<el-option v-for="item in state.handlerMainOptions" :key="item.key" :label="item.value" :value="item.key" />
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<!-- 工单办理专有参数 -->
+					<template v-if="flowDirection">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item label="办理时限" prop="timeLimit" :rules="[{ required: true, message: '请填写办理时限', trigger: 'blur' }]">
+								<el-row :gutter="10">
+									<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+										<el-input-number
+											placeholder="办理时限"
+											v-model="state.ruleForm.timeLimit"
+											controls-position="right"
+											class="w100"
+											:min="1"
+											:max="99"
+											disabled
+										></el-input-number>
+									</el-col>
+									<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-loading="state.loading">
+										<el-form-item
+											label=""
+											label-width="0"
+											prop="timeLimitUnit"
+											:rules="[{ required: true, message: '请选择办理时限单位', trigger: 'change' }]"
+										>
+											<el-select v-model="state.ruleForm.timeLimitUnit" placeholder="办理时限单位" disabled style="width: 240px">
+												<el-option v-for="item in timeTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
+											</el-select>
+										</el-form-item>
+									</el-col>
+								</el-row>
+							</el-form-item>
+						</el-col>
+					</template>
+					<!-- 话务部到一级部门  派单组到一级部门	-->
+					<template v-if="seatToOrgOne || paidanToOrgOne">
+						<el-col :span="24">
+							<el-form-item label="派单类型" prop="orderAssignMode" :rules="[{ required: true, message: '请选择派单类型', trigger: 'change' }]">
+								<el-radio-group v-model="state.ruleForm.orderAssignMode" @change="selectDispatchType">
+									<el-radio :value="0">逐级派单</el-radio>
+									<el-radio :value="1">跨级派单</el-radio>
+								</el-radio-group>
+							</el-form-item>
+						</el-col>
+						<el-col :span="12" v-if="state.ruleForm.orderAssignMode === 0">
+							<el-form-item label="接办部门" prop="nextHandlers" :rules="[{ required: true, message: '请选择接办部门', trigger: 'change' }]">
+								<!--										<el-select v-model="state.ruleForm.paidanObj" placeholder="请选择接办部门" class="w100" filterable multiple>
+                  <el-option v-for="item in state.paidanObjOptions" :key="item.key" :label="item.value" :value="item.key" />
+                </el-select>-->
+								<el-select-v2
+									v-model="state.ruleForm.nextHandlers"
+									:options="state.handlerOptions"
+									placeholder="请选择接办部门"
+									class="w100"
+									multiple
+									clearable
+									collapse-tags
+									collapse-tags-tooltip
+									filterable
+									value-key="key"
+									@change="selectHandlers"
+									:multiple-limit="multipleLimit"
+								/>
+							</el-form-item>
+						</el-col>
+						<el-col :span="24" v-if="state.ruleForm.orderAssignMode === 1">
+							<el-row class="w100" :gutter="10">
+								<el-col>
+									<el-form-item label="接办部门" prop="nextHandler" :rules="[{ required: true, message: '请选择接办部门', trigger: 'change' }]">
+										<el-select-v2
+											v-model="state.ruleForm.nextHandler"
+											:options="state.handlerOptions"
+											placeholder="请选择接办部门"
+											class="w100"
+											clearable
+											filterable
+											value-key="key"
+											@change="selectHandlers"
+										/>
+									</el-form-item>
+								</el-col>
+								<!-- 二级部门 -->
+								<template v-if="showOrgLevelTwo">
+									<el-col :span="12">
+										<el-form-item label="下一环节" prop="levelTwoStep" :rules="[{ required: false, message: '请选择下一环节', trigger: 'change' }]">
+											<el-select-v2
+												v-model="state.ruleForm.levelTwoStep"
+												:options="levelTwoStepOptions"
+												placeholder="请选择下一环节"
+												class="w100"
+												filterable
+												value-key="key"
+												clearable
+												@change="selectOrgLevelTwo"
+											/>
+										</el-form-item>
+									</el-col>
+									<el-col :span="12">
+										<el-form-item
+											label="办理对象"
+											prop="levelTwoHandlers"
+											:rules="[{ required: false, message: '请选择办理对象', trigger: 'change' }]"
+										>
+											<el-select-v2
+												v-model="state.ruleForm.levelTwoHandlers"
+												:options="levelTwoHandleOptions"
+												placeholder="请选择办理对象"
+												class="w100"
+												clearable
+												filterable
+												value-key="key"
+												multiple
+												collapse-tags
+												collapse-tags-tooltip
+												:max-collapse-tags="1"
+												@change="selectOrgLevelTwoHandler"
+											/>
+										</el-form-item>
+									</el-col>
+								</template>
+								<!-- 三级部门 -->
+								<template v-if="showOrgLevelThree">
+									<el-col :span="12">
+										<el-form-item label="下一环节" prop="levelThreeStep" :rules="[{ required: false, message: '请选择下一环节', trigger: 'change' }]">
+											<el-select-v2
+												v-model="state.ruleForm.levelThreeStep"
+												:options="levelThreeStepOptions"
+												placeholder="请选择下一环节"
+												class="w100"
+												filterable
+												value-key="key"
+												clearable
+												@change="selectOrgLevelThree"
+											/>
+										</el-form-item>
+									</el-col>
+									<el-col :span="12">
+										<el-form-item
+											label="办理对象"
+											prop="levelTwoHandlers"
+											:rules="[{ required: false, message: '请选择办理对象', trigger: 'change' }]"
+										>
+											<el-select-v2
+												v-model="state.ruleForm.levelThreeHandlers"
+												:options="levelThreeHandleOptions"
+												placeholder="请选择办理对象"
+												class="w100"
+												clearable
+												filterable
+												value-key="key"
+												multiple
+												collapse-tags
+												collapse-tags-tooltip
+												:max-collapse-tags="1"
+												@change="selectOrgLevelThreeHandler"
+											/>
+										</el-form-item>
+									</el-col>
+								</template>
+							</el-row>
+						</el-col>
+					</template>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="countersignAble">
+						<el-form-item label="发起会签" prop="isStartCountersign" :rules="[{ required: false, message: '请选择发起会签', trigger: 'change' }]">
+							<el-switch
+								v-model="state.ruleForm.isStartCountersign"
+								inline-prompt
+								active-text="是"
+								inactive-text="否"
+								@change="changeStartCountersign"
+								:disabled="countersignDisabled"
+							/>
+						</el-form-item>
+					</el-col>
+					<!--  汇总节点需要填写 并且是工单办理 -->
+					<template v-if="inputRealHandler">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item label="经办人" prop="realHandlerName" :rules="[{ required: false, message: '请填写经办人', trigger: 'blur' }]">
+								<el-input v-model="state.ruleForm.realHandlerName" placeholder="请填写经办人" clearable> </el-input>
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item label="经办人电话" prop="realHandlerPhone" :rules="[{ required: false, message: '请填写经办人电话', trigger: 'blur' }]">
+								<el-input v-model="state.ruleForm.realHandlerPhone" placeholder="请填写办理人电话" 请填写经办人电话> </el-input>
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item label="是否与市民沟通" prop="realIsContacted">
+								<el-switch v-model="state.ruleForm.realIsContacted" inline-prompt active-text="是" inactive-text="否" />
+							</el-form-item>
+						</el-col>
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item label="是否与市民现场沟通" prop="realContactLocale" label-width="150">
+								<el-switch v-model="state.ruleForm.realContactLocale" inline-prompt active-text="是" inactive-text="否" />
+							</el-form-item>
+						</el-col>
+					</template>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="isSmsSelectShow">
+						<el-form-item label="" prop="isSms">
+							<el-checkbox v-model="state.ruleForm.isSms" label="短信通知" />
+						</el-form-item>
+					</el-col>
+					<!--  选择结束节点时并且是工单办理并且不是中心,显示部门处理结果 -->
+					<template v-if="showResult">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item label="处理结果" prop="isResolved" :rules="[{ required: true, message: '请选择处理结果', trigger: 'change' }]">
+								<el-radio-group v-model="state.ruleForm.isResolved">
+									<el-radio :value="true">已得到解决</el-radio>
+									<el-radio :value="false">未得到解决</el-radio>
+								</el-radio-group>
+							</el-form-item>
+						</el-col>
+					</template>
+					<!--  选择结束节点时并且是工单办理并且工单来源是110时,显示警情退回 -->
+					<template v-if="showPoliceReturn">
+						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+							<el-form-item label="" prop="isPoliceReturn">
+								<el-checkbox v-model="state.ruleForm.isPoliceReturn" label="警情退回" />
+							</el-form-item>
+						</el-col>
+					</template>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item
+							:label="state.inputPlaceholder"
+							prop="opinion"
+							:rules="[{ required: true, message: `请填写${state.inputPlaceholder}`, trigger: 'blur' }]"
+						>
+							<common-advice
+								@chooseAdvice="chooseAdvice"
+								v-model="state.ruleForm.opinion"
+								:placeholder="'请填写' + state.inputPlaceholder"
+								:loading="state.loading"
+								:commonEnum="commonEnum.Delay"
+								:maxlength="AppConfigInfo.handleOpinionWordLimit"
+							/>
+						</el-form-item>
+					</el-col>
+					<!--            <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+              <el-form-item label="附件" :rules="[{ required: false, message: '请填写诉求内容', trigger: 'change' }]">
+                <annex-list name="延期附件" :businessId="state.orderDetail.id" classify="延期上传" v-model:format="handleFiles" />
+              </el-form-item>
+            </el-col>-->
+				</template>
+			</el-row>
+		</el-form>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">办理</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script setup lang="ts" name="processApproval">
+import { computed, defineAsyncComponent, nextTick, reactive, ref, watch } from 'vue';
+import { ElMessage, ElNotification, FormInstance } from 'element-plus';
+import other from '@/utils/other';
+import { useUserInfo } from '@/stores/userInfo';
+import { storeToRefs } from 'pinia';
+import { commonEnum } from '@/utils/constants';
+import { orderAssignParams, orderTimeConfig } from '@/api/business/order';
+import { delayApproveParams, delayBatchApprove } from '@/api/business/delay';
+import { useAppConfig } from '@/stores/appConfig';
+
+// 引入组件
+const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
+const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue')); // 附件列表
+const TextEllipsis = defineAsyncComponent(() => import('@/components/TextEllipsis/index.vue'));
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false, // 弹窗显示隐藏
+	ruleForm: {
+		isPass: true, // 审批结果
+		//流程表单
+		opinion: '', // 意见
+		nextStepCode: '', // 下一节点
+		nextStepName: '', // 下一节点名称
+		backToCountersignEnd: false, // 是否回到会签结束节点
+		nextHandlers: [], // 下一节点办理对象
+		nextMainHandler: '', // 主办人
+		isSms: false, // 是否短信通知
+		isStartCountersign: false, // 是否发起会签
+		stepId: null, // 步骤id
+		// isTransferHandle:false, // 是否转办
+		orderAssignMode: 0, // 派单类型默认逐级派单
+	},
+	delayForm: {
+		//延期申请表单
+		timeLimitCount: null, // 延期申请数量
+		content: '', // 延期申请理由
+		timeLimitUnit: 2, // 延期申请单位 默认工作日
+	},
+	discernForm: {
+		// 甄别表单
+		content: '', // 甄别理由
+	},
+	redoForm: {
+		// 重办表单
+		content: '', // 重办理由
+	},
+	terminateForm: {
+		//终止表单
+		content: '', // 终止理由
+	},
+	nextStepOptions: [], // 下一节点
+	handlerOptions: [], // 办理对象
+	transform: 'translate(0px, 0px)', // 滚动条位置
+	loading: false, // 提交按钮loading
+	workflowId: '', // 流程id
+	handlerClassifies: [], //撤回办理对象
+	handlerMainOptions: [], // 主办人
+	handleId: '', // 流程处理ID
+	inputPlaceholder: '办理意见', // 意见提示
+	orderDetail: {}, // 工单详情
+});
+const ruleFormRef = ref<RefType>(); //表单组件
+const storesUserInfo = useUserInfo();
+const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
+const appConfigStore = useAppConfig();
+const { AppConfigInfo } = storeToRefs(appConfigStore); // 系统配置信息
+
+// 打开弹窗
+const delayId = ref<EmptyArrayType>([]);
+const openDialog = async (val: any) => {
+	console.log(val);
+	selectNext.value = {};
+	currentParams.value = {};
+	state.ruleForm.nextHandlers = [];
+	state.ruleForm.nextHandler = {};
+	isSmsSelectShow.value = false;
+	state.ruleForm.isSms = false;
+	state.loading = true;
+	state.dialogVisible = true;
+	try {
+		delayId.value = val.map((item: any) => item.id);
+		state.ruleForm.workflowId = state.workflowId = val[0].workflowId ?? ''; // 流程id 默认取第一个
+		state.orderDetail = val[0].order ?? {}; // 工单详情
+
+		// 延期审批
+		const [nextResponseDelayAudit] = await Promise.all([delayApproveParams(state.workflowId)]); //获取延期审批流程参数
+		handleResult(nextResponseDelayAudit);
+
+		await nextTick(() => {
+			restForm(ruleFormRef.value);
+		});
+	} finally {
+		state.loading = false;
+	}
+};
+const canReject = ref<boolean>(false); // 是否可以驳回
+const timeTypeOptions = ref<EmptyArrayType>([]); // 办理时限单位
+const canStartCountersign = ref<boolean>(false); // 是否可以发起会签
+const isMainHandlerShow = ref<boolean>(false); // 是否展示主办人
+const currentParams = ref<EmptyObjectType>({}); // 当前获取到的参数(当前节点信息)
+const orderContent = ref<string>(''); // 受理内容
+const handleResult = (res: any) => {
+	currentParams.value = res.result; // 当前获取到的参数(当前节点信息)
+	state.nextStepOptions = res.result.steps; //办理对象选择内容
+	canReject.value = res.result.canReject ?? false; // 是否可以驳回
+	timeTypeOptions.value = res.result.timeTypeOptions ?? []; // 办理时限申请单位
+	canStartCountersign.value = res.result.canStartCountersign ?? false; // 是否可以发起会签
+	isMainHandlerShow.value = res.result.isMainHandlerShow ?? false; // 是否展示主办人
+	orderContent.value = res.result.content ?? ''; // 受理内容
+	if (state.nextStepOptions.length === 1) {
+		// 下一节点是否只有一个 默认选中第一个
+		setTimeout(() => {
+			state.ruleForm.nextStepCode = state.nextStepOptions[0].key; // 下一节点code
+			state.ruleForm.nextStepName = state.nextStepOptions[0].value; // 下一节点name
+			state.ruleForm.backToCountersignEnd = state.nextStepOptions[0].backToCountersignEnd ?? false; // 是否回到会签结束节点
+		}, 100);
+		selectNextStep(state.nextStepOptions[0].key); // 查询流程下一节点参数
+	} else {
+		state.ruleForm.nextStepCode = '';
+		state.ruleForm.nextStepName = '';
+	}
+	if (res.result.opinion) {
+		// 如果有汇总意见没有临时保存 取汇总意见 临时保存会覆盖汇总意见
+		setTimeout(() => {
+			state.ruleForm.opinion = res.result.opinion;
+		}, 100);
+	}
+	state.ruleForm.stepId = res.result.stepId;
+	state.loading = false;
+};
+// 流程选择下一环节
+// 先确定当前环节是那一步
+/*
+ * currentParams.value.currentStepBusinessType 表示当前节点到哪一步 0坐席 1派单 2部门节点 3部门领导节点
+ * */
+/*selectNext.value.businessType 表示选择节点到哪一步  0 坐席 1派单  2部门节点  3部门领导节点
+ * selectNext.value.orgLevel 表示部门等级 1 一级部门 2 二级部门 3 三级部门 4 四级部门
+ * selectNext.value.stepType  0普通节点 3汇总节点
+ * */
+// 话务部到派单组
+const seatTopaidan = computed(() => {
+	return currentParams.value.currentStepBusinessType === 0 && selectNext.value.businessType === 1;
+});
+// 话务部到一级部门
+const seatToOrgOne = computed(() => {
+	return currentParams.value.currentStepBusinessType === 0 && selectNext.value.businessType === 2 && selectNext.value.orgLevel === 1;
+});
+// 派单组到一级部门
+const paidanToOrgOne = computed(() => {
+	return currentParams.value.currentStepBusinessType === 1 && selectNext.value.businessType === 2 && selectNext.value.orgLevel === 1;
+});
+// 是否展示短信通知选择
+const isSmsSelectShow = ref(false);
+// 办理对象是否必填  0-角色 1-部门类型 2-部门类型 3-指定用户 4-指定部门
+const nextHandlersRequired = ref<Boolean>(false);
+const selectNext = ref<EmptyObjectType>({}); // 选择的下一个节点
+const selectNextStep = (val: any) => {
+	ruleFormRef.value?.resetFields('nextHandlers');
+	ruleFormRef.value?.resetFields('nextMainHandler');
+	state.ruleForm.nextHandlers = [];
+	const next = state.nextStepOptions.find((item: any) => item.key === val);
+	selectNext.value = next;
+	const items = next.items; //获取下一节点
+	state.ruleForm.nextStepName = next.value; // 下一节点name
+	state.ruleForm.handlerType = next.handlerType;
+	state.ruleForm.businessType = next.businessType;
+	state.ruleForm.flowDirection = next.flowDirection;
+	state.ruleForm.backToCountersignEnd = next.backToCountersignEnd ?? false; // 是否回到会签结束节点
+	state.handlerOptions = items ?? [];
+	state.handlerOptions = state.handlerOptions.map((item: any) => {
+		return {
+			value: {
+				...item,
+			},
+			label: item.value,
+		};
+	});
+	if (items.length === 1) {
+		// 如果办理对象只有一个默认选中
+		state.ruleForm.nextHandlers = [items[0]];
+	}
+	// 办理对象是否必填
+	nextHandlersRequired.value = ![0].includes(next.handlerType);
+
+	// 以下是默认需要吧短信勾上的场景 话务部到一级部门 派单组到一级部门
+	state.ruleForm.isSms = seatToOrgOne.value || paidanToOrgOne.value;
+	// 是否展示短信通知 (取消坐席流转至“派单组”时的短信通知选项框  )
+	isSmsSelectShow.value = !seatTopaidan.value;
+};
+
+//  会签是否可用 (配置可以会签 并且选择的是逐级派单,并且是普通节点 并且选择是部门)
+const countersignAble = computed(() => {
+	return canStartCountersign.value && state.ruleForm.orderAssignMode === 0 && selectNext.value.stepType === 0 && selectNext.value.businessType === 2;
+});
+// 办理对象是否能够选择多个(可以发起会签可以选择多个,不能发起会签只能选择一个) 加个判断 选择的下一环节必须是部门(会签必须是选择的部门)
+const multipleLimit = computed(() => {
+	return canStartCountersign.value && selectNext.value.businessType === 2 ? 0 : 1;
+});
+watch(
+	() => state.ruleForm.nextHandlers, // 监听办理对象 多个办理对象自动发起会签
+	(val) => {
+		state.ruleForm.isStartCountersign = val.length > 1;
+	}
+);
+const countersignDisabled = computed(() => {
+	// (选中的办理对象如果是一个) 因为是disabled 所以这里取反
+	return !(state.ruleForm.nextHandlers.length === 1);
+});
+// 是否发起会签
+const changeStartCountersign = (val: boolean) => {
+	/*	if (!val) {
+      // 如果不能会签清空办理对象
+      state.ruleForm.nextHandlers = [];
+      ruleFormRef.value?.resetFields('nextHandlers');
+    }*/
+};
+
+// 是否展示办理对象 (结束节点不展示: next.stepType===2 表示为结束节点,下一环节为派单组时 next.businessType === 1,办理对象下拉框隐藏:AppConfigInfo.value.isAverageSendOrder= true 表示开启了平均派单 )
+const showHandlers = computed(() => {
+	const next = state.nextStepOptions.find((item: any) => item.key === state.ruleForm.nextStepCode);
+	const isAverageSendOrder = AppConfigInfo.value.isAverageSendOrder && next?.businessType === 1; // 开启平均派单并且下一个环节是派单组  !isAverageSendOrder
+	if (!next) return true;
+	// 话务部到派单 派单组到一级部门 也不需要展示办理对象 如果下一环节是汇总节点与不需要展示办理
+	return next?.stepType !== 2 && !(seatToOrgOne.value || paidanToOrgOne.value) && selectNext.value.stepType !== 3;
+});
+// 是否展示部门处理结果 ( 选择结束节点时并且当前操作人不是中心时,显示部门处理结果 )
+const showResult = computed(() => {
+	const next = state.nextStepOptions.find((item: any) => item.key === state.ruleForm.nextStepCode);
+	return next?.stepType === 2 && !userInfos.value.isCenter;
+});
+// 是否展示警情退回 (选择结束节点时并且工单来源是110时,显示警情退回)
+const showPoliceReturn = computed(() => {
+	const next = state.nextStepOptions.find((item: any) => item.key === state.ruleForm.nextStepCode);
+	return next?.stepType === 2 && state.orderDetail?.source === 200;
+});
+// 是否是汇总节点(汇总需要填入其他参数)并且是工单办理
+const inputRealHandler = computed(() => {
+	const next = state.nextStepOptions.find((item: any) => item.key === state.ruleForm.nextStepCode);
+	return next?.inputRealHandler;
+});
+// 是否展示办理时限 flowDirection 并且是工单办理
+const flowDirection = computed(() => {
+	const next = state.nextStepOptions.find((item: any) => item.key === state.ruleForm.nextStepCode);
+	if (!next) return false;
+	return [0, 1].includes(next.flowDirection);
+});
+// 计算工单期满时间
+watch(
+	() => flowDirection.value,
+	(val) => {
+		if (val) {
+			const next = state.nextStepOptions.find((item: any) => item.key === state.ruleForm.nextStepCode);
+			state.ruleForm.flowDirection = next.flowDirection;
+			orderTimeConfig({ flowDirection: next.flowDirection, acceptTypeCode: state.orderDetail.acceptTypeCode }).then((res: any) => {
+				state.ruleForm.timeLimit = res.result.count ?? null; // 办理时限
+				state.ruleForm.timeLimitUnit = res.result.timeType ?? ''; // 办理时限单位
+			});
+		}
+	}
+);
+
+// 是否展示主办
+const showMainHandler = computed(() => {
+	return state.ruleForm.nextHandlers.length > 1 && isMainHandlerShow.value;
+});
+// 主办从办理对象中选择
+state.handlerMainOptions = computed(() => {
+	return state.ruleForm.nextHandlers;
+});
+
+// 选择派单类型 需要清空选择的内容
+const selectDispatchType = () => {
+	ruleFormRef.value.resetFields('nextHandlers');
+	ruleFormRef.value.resetFields('nextHandler');
+	state.ruleForm.nextHandlers = [];
+	state.ruleForm.nextHandler = null;
+	state.ruleForm.isStartCountersign = false;
+	showOrgLevelTwo.value = false;
+	state.ruleForm.levelTwoStep = null;
+	levelTwoStepOptions.value = [];
+	levelTwoHandleOptions.value = [];
+	state.ruleForm.levelTwoHandlers = [];
+	showOrgLevelThree.value = false;
+	state.ruleForm.levelThreeStep = null;
+	state.ruleForm.levelThreeHandlers = [];
+	levelThreeStepOptions.value = [];
+	levelThreeHandleOptions.value = [];
+};
+
+// 选择办理对象
+const showOrgLevelTwo = ref(false); // 是否展示二级部门选择
+const levelTwoStepOptions = ref<EmptyArrayType>([]); // 二级部门节点
+const levelTwoHandleOptions = ref<EmptyArrayType>([]); // 二级部门办理参数
+const selectHandlers = () => {
+	if (state.ruleForm.nextHandlers && state.ruleForm.nextHandlers.length > 1) {
+		// AppConfigInfo.value.noSignOrgCode  对应的办理对象不能参与会签
+		const isProvince12345 = state.ruleForm.nextHandlers.find((item: any) => AppConfigInfo.value.noSignOrgCode.includes(item.key));
+		if (isProvince12345) {
+			// 如果选择了省12345平台或者省12345交办就提示不能参与会签 并且从选择中移除
+			ElMessage({
+				message: '省12345平台和省12345交办不能参与会签',
+				grouping: true,
+			});
+			state.ruleForm.nextHandlers = state.ruleForm.nextHandlers.filter((item: any) => !AppConfigInfo.value.noSignOrgCode.includes(item.key));
+		}
+	}
+	if (state.ruleForm.nextHandlers && state.ruleForm.nextHandlers.length <= 1) {
+		// 如果只有一个办理对象就不需要发起会签
+		state.ruleForm.isStartCountersign = false;
+	}
+	if ((seatToOrgOne.value || paidanToOrgOne.value) && state.ruleForm.orderAssignMode === 1) {
+		showOrgLevelTwo.value = false;
+		state.ruleForm.levelTwoStep = null;
+		levelTwoStepOptions.value = [];
+		levelTwoHandleOptions.value = [];
+		state.ruleForm.levelTwoHandlers = [];
+		showOrgLevelThree.value = false;
+		state.ruleForm.levelThreeStep = null;
+		state.ruleForm.levelThreeHandlers = [];
+		levelThreeStepOptions.value = [];
+		levelThreeHandleOptions.value = [];
+		state.ruleForm.nextHandlers = [state.ruleForm.nextHandler];
+		// 话务部到一级部门 派单组到一级部门 并且是跨级派单 需要查询下一级部门
+		const request = {
+			WorkflowId: state.ruleForm.workflowId,
+			StepCode: selectNext.value.key,
+			StepType: selectNext.value.stepType,
+			BusinessType: selectNext.value.businessType,
+			HandlerType: selectNext.value.handlerType,
+			OrgIds: state.ruleForm.nextHandler ? [state.ruleForm.nextHandler.key] : [],
+		};
+		orderAssignParams(request).then((res: any) => {
+			showOrgLevelTwo.value = true;
+			levelTwoStepOptions.value = res.result.steps.map((item: any) => {
+				return {
+					value: {
+						...item,
+					},
+					label: item.value,
+				};
+			});
+			if (res.result.steps.length === 1) {
+				state.ruleForm.levelTwoStep = res.result.steps[0];
+				levelTwoHandleOptions.value = state.ruleForm.levelTwoStep.items.map((item: any) => {
+					return {
+						value: {
+							...item,
+						},
+						label: item.value,
+					};
+				});
+			}
+		});
+	} else {
+		showOrgLevelTwo.value = false;
+	}
+};
+// 选择二级部门节点
+const selectOrgLevelTwo = (val: any) => {
+	if (val) {
+		levelTwoHandleOptions.value = state.ruleForm.levelTwoStep.items.map((item: any) => {
+			return {
+				value: {
+					...item,
+				},
+				label: item.value,
+			};
+		});
+	} else {
+		levelTwoHandleOptions.value = [];
+		state.ruleForm.levelTwoHandlers = [];
+		state.ruleForm.levelThreeHandlers = [];
+		levelThreeStepOptions.value = [];
+		levelThreeHandleOptions.value = [];
+		showOrgLevelThree.value = false;
+	}
+};
+const showOrgLevelThree = ref(false);
+const levelThreeStepOptions = ref<EmptyArrayType>([]); // 三级部门节点
+const levelThreeHandleOptions = ref<EmptyArrayType>([]); // 三级部门办理参数
+// 选择二级部门办理对象 展示三级办理对象和节点
+const selectOrgLevelTwoHandler = (val: any) => {
+	const ids = val.map((item: any) => item.key);
+	if (val && val.length) {
+		const request = {
+			WorkflowId: state.ruleForm.workflowId,
+			StepCode: state.ruleForm.levelTwoStep.key,
+			StepType: state.ruleForm.levelTwoStep.stepType,
+			BusinessType: state.ruleForm.levelTwoStep.businessType,
+			HandlerType: state.ruleForm.levelTwoStep.handlerType,
+			OrgIds: ids,
+		};
+		orderAssignParams(request).then((res: any) => {
+			showOrgLevelThree.value = true;
+			levelThreeStepOptions.value = res.result.steps.map((item: any) => {
+				return {
+					value: {
+						...item,
+					},
+					label: item.value,
+				};
+			});
+			if (res.result.steps.length === 1) {
+				state.ruleForm.levelThreeStep = res.result.steps[0];
+				levelThreeHandleOptions.value = state.ruleForm.levelThreeStep.items.map((item: any) => {
+					return {
+						value: {
+							...item,
+						},
+						label: item.value,
+					};
+				});
+			}
+		});
+	} else {
+		state.ruleForm.levelThreeHandlers = [];
+		levelThreeStepOptions.value = [];
+		levelThreeHandleOptions.value = [];
+		showOrgLevelThree.value = false;
+	}
+};
+// 选择三级部门节点
+const selectOrgLevelThree = (val: any) => {
+	if (val) {
+		levelThreeHandleOptions.value = state.ruleForm.levelThreeStep.items.map((item: any) => {
+			return {
+				value: {
+					...item,
+				},
+				label: item.value,
+			};
+		});
+	} else {
+		state.ruleForm.levelThreeHandlers = [];
+		levelThreeHandleOptions.value = [];
+	}
+};
+const selectOrgLevelThreeHandler = () => {};
+
+// 设置抽屉
+const dialogRef = ref<RefType>();
+const mouseup = () => {
+	state.transform = dialogRef.value.dialogContentRef.$el.style.transform;
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+// 重置表单方法
+const restForm = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	state.ruleForm.opinion = '';
+	state.delayForm.endTime = '';
+	formEl.resetFields();
+	formEl.clearValidate();
+};
+// 选择常用意见 填入填写框 办理
+const chooseAdvice = (item: any) => {
+	state.ruleForm.opinion += item.content;
+};
+const close = () => {
+	restForm(ruleFormRef.value);
+	orderContent.value = '';
+};
+// 办理
+const handleFiles = ref<EmptyArrayType>([]); // 流程附件
+const onSubmit = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		state.loading = true;
+		let submitObj = other.deepClone(state.ruleForm);
+		if (submitObj.nextHandlers && submitObj.nextHandlers.length) {
+			if (submitObj.nextHandlers.length === 1) {
+				submitObj.nextMainHandler = submitObj.nextHandlers[0].key;
+			}
+		}
+		const request = {
+			nextWorkflow: submitObj,
+			// files: handleFiles.value,
+			delayId: delayId.value,
+			isPass: state.ruleForm.isPass,
+		};
+		console.log(request);
+		delayBatchApprove(request)
+			.then((res: any) => {
+				emit('updateList');
+				state.loading = false;
+				closeDialog();
+				ElNotification({
+					title: '提示',
+					type: 'info',
+					dangerouslyUseHTMLString: true, // 允许使用 HTML 内容
+					message: res.result,
+				});
+			})
+			.catch((err: any) => {
+				console.log(err, 'err');
+				emit('updateList');
+				closeDialog();
+			});
+	});
+};
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>
+<style lang="scss">
+.modal_class {
+	pointer-events: none;
+	height: 100%;
+}
+.dialog_class {
+	pointer-events: auto;
+	flex-direction: column;
+	margin: 0 !important;
+	position: absolute;
+	top: 20%;
+	left: 25%;
+}
+</style>

+ 10 - 3
src/views/business/order/index.vue

@@ -30,9 +30,15 @@
 										<el-checkbox value="IsSensitiveWord" border>敏感类工单</el-checkbox>
 									</el-checkbox-group>
 								</el-form-item>
-								<el-form-item>
+                <el-form-item label="受理内容" prop="ContentRetrieval">
+                  <el-input v-model.trim="state.queryParams.ContentRetrieval" placeholder="受理内容" clearable @keyup.enter="handleQuery" class="keyword-input" />
+                </el-form-item>
+                <el-form-item label="承办意见" prop="FileOption">
+                  <el-input v-model.trim="state.queryParams.FileOption" placeholder="承办意见" clearable @keyup.enter="handleQuery" class="keyword-input" />
+                </el-form-item>
+<!--								<el-form-item>
 									<el-button @click="contentRetrieval"><SvgIcon name="ele-DocumentCopy" class="mr5" />内容检索</el-button>
-								</el-form-item>
+								</el-form-item>-->
 							</el-col>
 						</el-row>
 						<el-form-item label="工单标题" prop="Keyword">
@@ -432,6 +438,7 @@ const state = reactive<any>({
 		SensitiveWord: null, // 敏感词
 		IsUrgent: null, // 是否加急
 		ContentRetrieval: null, // 内容检索
+    FileOption:null, // 承办意见
 		IsSgin: null, // 受理情况
 		OrderTagCode: null, // 工单标签
 		SortField: null,
@@ -594,7 +601,7 @@ const queryList = () => {
 		requestParams.value.ActualHandleTimeStart = state.queryParams.doneTime === null ? null : state.queryParams.doneTime[0]; // 办结时间
 		requestParams.value.ActualHandleTimeEnd = state.queryParams.doneTime === null ? null : state.queryParams.doneTime[1];
 		Reflect.deleteProperty(requestParams.value, 'doneTime'); // 删除无用的参数
-		requestParams.value.ContentRetrieval = state.ruleForm.content;
+
 		state.loading = true;
 		gridOptions.loading = true;
 		orderList(requestParams.value)

+ 3 - 2
src/views/case/index/components/Select-knowledge.vue

@@ -25,7 +25,7 @@
 		>
 			>
 			<vxe-column type="radio" fixed="left" title="请选择" width="70" align="center"></vxe-column>
-			<vxe-column field="title" title="知识标题"  min-width="200"></vxe-column>
+			<vxe-column field="title" title="知识标题" min-width="200"></vxe-column>
 			<vxe-column field="knowledgeTypeText" title="知识类型"></vxe-column>
 			<vxe-column field="creatorOrgName" title="创建部门"></vxe-column>
 			<vxe-column field="creationTime" title="创建时间" width="160">
@@ -115,7 +115,8 @@ const queryList = () => {
 const resetQuery = (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	formEl.resetFields();
-	queryList();
+	state.queryParams.Keyword = null;
+	handleQuery();
 };
 
 // 关闭弹窗

+ 4 - 4
src/views/case/index/components/Select-order.vue

@@ -58,9 +58,8 @@
 
 <script lang="tsx" setup>
 import { defineAsyncComponent, reactive, ref } from 'vue';
-import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
+import { ElMessageBox, FormInstance } from 'element-plus';
 import { publishedListFixed, publishedListFixedCount } from '@/api/business/publish';
-import { businessTagDelete } from '@/api/auxiliary/businessTag';
 
 const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
@@ -131,8 +130,9 @@ const getTotal = () => {
 const resetQuery = (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	formEl.resetFields();
-	queryList();
-	getTotal();
+	state.queryParams.Title = null;
+	state.queryParams.No = null;
+	handleQuery();
 };
 
 // 关闭弹窗

+ 2 - 1
src/views/case/index/index.vue

@@ -51,7 +51,8 @@
 						</el-form-item>
 						<el-form-item>
 							<el-button type="primary" @click="handleQuery" :loading="state.tableLoading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-							<el-button @click="drawer = true" class="default-button"> <SvgIcon name="ele-Search" class="mr5" />更多查询</el-button>
+<!--							<el-button @click="drawer = true" class="default-button"> <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-form-item>
 					</el-form>
 					<vxe-toolbar

+ 36 - 1
src/views/plan/index/edit.vue

@@ -73,6 +73,20 @@
 							</template>
 						</el-skeleton>
 					</el-col>
+					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="8">
+						<el-skeleton :loading="state.loading" animated>
+							<template #template>
+								<el-form-item label="热点分类">
+									<el-skeleton-item variant="h1" />
+								</el-form-item>
+							</template>
+							<template #default>
+								<el-form-item label="热点分类" prop="hotspotId" :rules="[{ required: false, message: '请选择热点分类', trigger: 'change' }]">
+									<hot-spot-select v-model="state.ruleForm.hotspotId" v-model:externalArr="state.hotspotExternal" @change="chooseHotSpot" clearable />
+								</el-form-item>
+							</template>
+						</el-skeleton>
+					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-skeleton :loading="state.loading" animated>
 							<template #template>
@@ -163,6 +177,7 @@ import { addPlanDraft, addPlanDraftAudit, editPlanDraft, planDetail, planRepeat
 const Editor = defineAsyncComponent(() => import('@/components/Editor/index.vue')); // 富文本编辑器
 const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue')); // 附件组件
 const EditSubmitAudit = defineAsyncComponent(() => import('@/views/plan/index/components/Edit-submit-audit.vue')); // 删除或者更新 提交审核
+const HotSpotSelect = defineAsyncComponent(() => import('@/components/Hotspot/index.vue')); // 选择热点
 
 const stores = useUserInfo(); // 用户信息
 const { userInfos } = storeToRefs(stores); // 用户信息
@@ -179,6 +194,7 @@ const state = reactive<any>({
 	},
 	typeData: [], // 分类
 	loading: false,
+	hotspotExternal: [],
 });
 const ruleFormRef = ref<any>(); // 表单ref
 const validatePassTitle = (rule: any, value: any, callback: any) => {
@@ -269,6 +285,7 @@ const processSuccess = () => {
 // 预览
 const onPreview = () => {
 	if (route.params.id) {
+		/* empty */
 	} else {
 		state.ruleForm.creatorName = userInfos.value?.name ?? '';
 		state.ruleForm.creationTime = new Date();
@@ -283,6 +300,20 @@ const onPreview = () => {
 		},
 	});
 };
+// 选择热点分类
+const chooseHotSpot = (val: any, node: any, externalArr: any) => {
+	if (val) {
+		state.ruleForm.hotspotSpliceName = val.hotSpotFullName; // 热点分类拼接名称
+		state.ruleForm.hotspotName = val.hotSpotName; // 热点分类名称
+		state.ruleForm.hotspotCode = val.provinceCode; // 热点分类code
+		state.ruleForm.hotspotExternal = externalArr.join(',') ?? ''; // 热点分类默认展开项
+	} else {
+		state.ruleForm.hotspotSpliceName = null;
+		state.ruleForm.hotspotName = null;
+		state.ruleForm.hotspotCode = null;
+		state.ruleForm.hotspotExternal = null;
+	}
+};
 // 保存到草稿箱
 const onSaveOnly = throttle(async (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
@@ -294,7 +325,7 @@ const onSaveOnly = throttle(async (formEl: FormInstance | undefined) => {
 		Reflect.deleteProperty(submitObj, 'creationTime');
 		if (route.params.id) {
 			// 更新
-			editPlanDraft( submitObj )
+			editPlanDraft(submitObj)
 				.then(handleSuccess)
 				.catch(() => {
 					state.loading = false;
@@ -346,6 +377,10 @@ const getDetail = async () => {
 	if (route.params.id) {
 		const res: any = await planDetail({ id: route.params.id }); //详情
 		state.ruleForm = res.result ?? {};
+		if (state.ruleForm.hotspotExternal) {
+			//热点分类默认展开
+			state.hotspotExternal = state.ruleForm.hotspotExternal.split(',');
+		}
 		state.ruleForm.files = transformFile(state.ruleForm.files);
 		state.ruleForm.planTypeId = state.ruleForm.planTypes?.map((item: any) => item.planTypeId);
 	}

+ 2 - 1
src/views/plan/index/index.vue

@@ -48,7 +48,8 @@
 						</el-form-item>
 						<el-form-item>
 							<el-button type="primary" @click="handleQuery" :loading="state.tableLoading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-							<el-button @click="drawer = true" class="default-button"> <SvgIcon name="ele-Search" class="mr5" />更多查询</el-button>
+<!--							<el-button @click="drawer = true" class="default-button"> <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-form-item>
 					</el-form>
 					<vxe-toolbar

+ 2 - 2
src/views/snapshot/centerMark/list.vue

@@ -192,7 +192,7 @@ const gridOptions = reactive<any>({
 			width: 160,
 		},
 		{
-			field: 'signUserName',
+			field: 'labelUserName',
 			title: '标注人',
 			width: 120,
 		},
@@ -202,7 +202,7 @@ const gridOptions = reactive<any>({
 			minWidth: 200,
 		},
 		{
-			field: 'signTime',
+			field: 'labelTime',
 			title: '标注时间',
 			formatter: 'formatDate',
 			width: 160,

+ 12 - 18
src/views/snapshot/centerMark/log.vue

@@ -38,19 +38,13 @@
 		<el-drawer v-model="drawer" title="更多查询" size="500px">
 			<el-form :model="state.queryParams" ref="drawerRuleFormRef" @submit.native.prevent label-width="100px">
 				<el-form-item label="联系电话" prop="Contact">
-					<el-input
-						v-model="state.queryParams.Contact"
-						placeholder="请填写联系电话"
-						clearable
-						@keyup.enter="handleQuery"
-						class="keyword-input"
-					/>
+					<el-input v-model="state.queryParams.Contact" placeholder="请填写联系电话" clearable @keyup.enter="handleQuery" class="keyword-input" />
 				</el-form-item>
 				<el-form-item label="来电人" prop="FromName">
 					<el-input v-model="state.queryParams.FromName" placeholder="请填写来电人" clearable @keyup.enter="handleQuery" />
 				</el-form-item>
-				<el-form-item label="标注人" prop="SignName">
-					<el-input v-model="state.queryParams.SignName" placeholder="请填写标注人" clearable @keyup.enter="handleQuery" />
+				<el-form-item label="标注人" prop="labelUserName">
+					<el-input v-model="state.queryParams.labelUserName" placeholder="请填写标注人" clearable @keyup.enter="handleQuery" />
 				</el-form-item>
 				<el-form-item label="标注类型" prop="Label">
 					<el-input v-model="state.queryParams.Label" placeholder="请填写标注类型" clearable @keyup.enter="handleQuery" />
@@ -98,13 +92,13 @@ const state = reactive<any>({
 		PageSize: 20,
 		No: null, // 工单编码
 		Title: null, // 工单标题
-		Contact:null,
-		FromName:null,
-		SignName:null,
-		Label:null,
-		bzTime:[],
-		BeginSignTime:null,
-		EndSignTime:null,
+		Contact: null,
+		FromName: null,
+		labelUserName: null,
+		Label: null,
+		bzTime: [],
+		BeginSignTime: null,
+		EndSignTime: null,
 	},
 	total: 0, // 总条数
 });
@@ -187,7 +181,7 @@ const gridOptions = reactive<any>({
 			width: 160,
 		},
 		{
-			field: 'signName',
+			field: 'labelUserName',
 			title: '标注人',
 			width: 120,
 		},
@@ -197,7 +191,7 @@ const gridOptions = reactive<any>({
 			minWidth: 200,
 		},
 		{
-			field: 'signTime',
+			field: 'labelTime',
 			title: '标注时间',
 			formatter: 'formatDate',
 			width: 160,

+ 2 - 2
src/views/snapshot/handle/orderMark.vue

@@ -157,12 +157,12 @@ const gridOptions = reactive<any>({
 			width: 180,
 		},
 		{
-			field: 'signUserName',
+			field: 'labelUserName',
 			title: '标注人员',
 			width: 120,
 		},
 		{
-			field: 'signTime',
+			field: 'labelTime',
 			title: '标注时间',
 			formatter: 'formatDate',
 			width: 160,

+ 35 - 26
src/views/statistics/call/detailSeatsMoth.vue

@@ -2,13 +2,27 @@
 	<div class="statistics-call-seats-moth-detail-container layout-padding">
 		<div class="layout-padding-auto layout-padding-view pd20">
 			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
+				<el-form-item label="振铃时间" prop="zlTime">
+					<el-date-picker
+						v-model="state.queryParams.zlTime"
+						type="datetimerange"
+						unlink-panels
+						range-separator="至"
+						start-placeholder="开始时间"
+						end-placeholder="结束时间"
+						:shortcuts="shortcuts"
+						@change="handleQuery"
+						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						:default-time="defaultTimeStartEnd"
+					/>
+				</el-form-item>
 				<el-form-item label="坐席" prop="EmpId">
 					<el-select-v2
 						v-model="state.queryParams.EmpId"
 						filterable
-						:options="state.roleOptions"
+						:options="seatUser"
 						:props="{
-							label: 'displayName',
+							label: 'name',
 							value: 'id',
 						}"
 						placeholder="请选择坐席"
@@ -16,12 +30,6 @@
 						@change="handleQuery"
 					/>
 				</el-form-item>
-				<el-form-item label="主叫号码" prop="Cpn">
-					<el-input v-model.trim="state.queryParams.Cpn" placeholder="主叫号码" clearable @keyup.enter="handleQuery" class="keyword-input" />
-				</el-form-item>
-				<el-form-item label="被叫号码" prop="Cdpn">
-					<el-input v-model.trim="state.queryParams.Cdpn" placeholder="被叫号码" clearable @keyup.enter="handleQuery" class="keyword-input" />
-				</el-form-item>
 				<el-form-item>
 					<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" :loading="state.loading">
@@ -85,6 +93,12 @@
 		<!--	更多查询	-->
 		<el-drawer v-model="drawer" title="更多查询" size="500px">
 			<el-form :model="state.queryParams" ref="drawerRuleFormRef" @submit.native.prevent label-width="100px">
+				<el-form-item label="主叫号码" prop="Cpn">
+					<el-input v-model.trim="state.queryParams.Cpn" placeholder="主叫号码" clearable @keyup.enter="handleQuery" class="keyword-input" />
+				</el-form-item>
+				<el-form-item label="被叫号码" prop="Cdpn">
+					<el-input v-model.trim="state.queryParams.Cdpn" placeholder="被叫号码" clearable @keyup.enter="handleQuery" class="keyword-input" />
+				</el-form-item>
 				<el-form-item label="响应分机" prop="TelNo">
 					<el-input v-model.trim="state.queryParams.TelNo" placeholder="响应分机" clearable @keyup.enter="handleQuery" />
 				</el-form-item>
@@ -102,20 +116,6 @@
 						:default-time="defaultTimeStartEnd"
 					/>
 				</el-form-item>
-				<el-form-item label="振铃开始时间" prop="zlTime">
-					<el-date-picker
-						v-model="state.queryParams.zlTime"
-						type="datetimerange"
-						unlink-panels
-						range-separator="至"
-						start-placeholder="开始时间"
-						end-placeholder="结束时间"
-						:shortcuts="shortcuts"
-						@change="handleQuery"
-						value-format="YYYY-MM-DD[T]HH:mm:ss"
-						:default-time="defaultTimeStartEnd"
-					/>
-				</el-form-item>
 			</el-form>
 			<template #footer>
 				<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
@@ -127,10 +127,11 @@
 <script setup lang="tsx" name="statisticsCallSeatsMothDetail">
 import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
 import { FormInstance } from 'element-plus';
-import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
+import { defaultDate, defaultTimeStartEnd, shortcuts } from '@/utils/constants';
 import Other from '@/utils/other';
 import { callAgentMonthBase, callAgentMonthDetail, callAgentMonthDetailExport } from '@/api/statistics/call';
 import { formatDate } from '@/utils/formatTime';
+import { useRoute } from 'vue-router';
 
 const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 
@@ -153,6 +154,7 @@ const state = reactive<any>({
 		// 查询参数
 		PageIndex: 1,
 		PageSize: 20,
+    QueryType:null,
 	},
 	tableData: [], //表单
 	loading: false, // 加载
@@ -161,10 +163,12 @@ const state = reactive<any>({
 });
 /** 搜索按钮操作 */
 const handleQuery = () => {
-	// state.queryParams.PageIndex = 1;
+	state.queryParams.PageIndex = 1;
 	queryList();
 };
 /** 获取列表 */
+const route = useRoute();
+const routeQueryParams = route.query;
 const requestParams = ref<EmptyObjectType>({});
 const queryList = () => {
 	state.loading = true;
@@ -205,10 +209,11 @@ const resetQuery = (formEl: FormInstance | undefined) => {
 	queryList();
 };
 // 基础数据
+const seatUser = ref<EmptyArrayType>([]);
 const getBaseData = async () => {
 	try {
 		const { result } = await callAgentMonthBase();
-		console.log(result);
+		seatUser.value = result.seatUser ?? []
 	} catch (e) {
 		console.log(e);
 	}
@@ -216,11 +221,15 @@ const getBaseData = async () => {
 const toolbarRef = ref<RefType>();
 const tableRef = ref<RefType>();
 onMounted(() => {
+	if (routeQueryParams.StartTime && routeQueryParams.EndTime && routeQueryParams.EmpId) {
+		state.queryParams.zlTime = [routeQueryParams.StartTime, routeQueryParams.EndTime];
+		state.queryParams.EmpId = routeQueryParams.EmpId;
+    state.queryParams.QueryType = routeQueryParams.QueryType;
+	}
 	queryList();
 	if (tableRef.value && toolbarRef.value) {
 		tableRef.value.connect(toolbarRef.value);
 	}
-
 	getBaseData();
 });
 </script>

+ 65 - 20
src/views/statistics/call/seatsMoth.vue

@@ -6,9 +6,9 @@
 					<el-select-v2
 						v-model="state.queryParams.EmpId"
 						filterable
-						:options="state.roleOptions"
+						:options="seatUser"
 						:props="{
-							label: 'displayName',
+							label: 'name',
 							value: 'id',
 						}"
 						placeholder="请选择坐席"
@@ -39,7 +39,7 @@
 					<el-button type="primary" @click="onLink">通话时段明细</el-button>
 					<el-popover :width="500" trigger="click">
 						<template #reference>
-							<el-button type="primary" title="口径说明"><SvgIcon name="ele-QuestionFilled" class="mr5"/>口径说明</el-button>
+							<el-button type="primary" title="口径说明"><SvgIcon name="ele-QuestionFilled" class="mr5" />口径说明</el-button>
 						</template>
 						<el-descriptions title="" :column="1" border style="max-height: 400px; overflow: auto">
 							<el-descriptions-item label="呼入总量">呼入接通量+呼入未接通总量</el-descriptions-item>
@@ -68,7 +68,7 @@
 					auto-resize
 					:scrollY="{ enabled: true, gt: 100 }"
 					show-overflow
-					id="statisticsOrderCenter"
+					id="statisticsCallSeatsMoth"
 					:custom-config="{ storage: true }"
 					show-footer
 					:footer-method="footerMethod"
@@ -77,15 +77,47 @@
 					@sort-change="sortChange"
 				>
 					<vxe-column field="name" title="坐席"></vxe-column>
-					<vxe-column title="呼入总量" field="centreArchive" sortable></vxe-column>
-					<vxe-column title="呼入接通总量" field="centreCareOf" sortable></vxe-column>
-					<vxe-column title="有效接通量" field="noCentreCareOf" sortable></vxe-column>
-					<vxe-column title="接通秒挂量" field="noCentreCareOf" sortable></vxe-column>
-					<vxe-column title="超时接通量" field="noCentreCareOf" sortable></vxe-column>
-					<vxe-column title="按时接通量" field="noCentreCareOf" sortable></vxe-column>
-					<vxe-column title="呼入未接通总量" field="noCentreCareOf" sortable></vxe-column>
-					<vxe-column title="未接通秒挂量" field="noCentreCareOf" sortable></vxe-column>
-					<vxe-column title="超时未接通量" field="noCentreCareOf" sortable></vxe-column>
+					<vxe-column title="呼入总量" field="inTotal" sortable> </vxe-column>
+					<vxe-column title="呼入接通总量" field="inAnswered" sortable>
+						<template #default="{ row }">
+							<el-button link type="primary" @click="linkDetail(row, '1')">{{ row.inAnswered }}</el-button>
+						</template>
+					</vxe-column>
+					<vxe-column title="有效接通量" field="inAvailableAnswer" sortable>
+						<template #default="{ row }">
+							<el-button link type="primary" @click="linkDetail(row, '2')">{{ row.inAvailableAnswer }}</el-button>
+						</template>
+					</vxe-column>
+					<vxe-column title="接通秒挂量" field="inHangupImmediateWhenAnswered" sortable>
+						<template #default="{ row }">
+							<el-button link type="primary" @click="linkDetail(row, '3')">{{ row.inHangupImmediateWhenAnswered }}</el-button>
+						</template>
+					</vxe-column>
+					<vxe-column title="超时接通量" field="overTimeImmediate" sortable>
+						<template #default="{ row }">
+							<el-button link type="primary" @click="linkDetail(row, '4')">{{ row.overTimeImmediate }}</el-button>
+						</template>
+					</vxe-column>
+					<vxe-column title="按时接通量" field="inTimeImmediate" sortable>
+						<template #default="{ row }">
+							<el-button link type="primary" @click="linkDetail(row, '5')">{{ row.inTimeImmediate }}</el-button>
+						</template>
+					</vxe-column>
+					<vxe-column title="呼入未接通总量" field="inHanguped" sortable>
+						<template #default="{ row }">
+							<el-button link type="primary" @click="linkDetail(row, '6')">{{ row.inHanguped }}</el-button>
+						</template>
+					</vxe-column>
+					<vxe-column title="未接通秒挂量" field="inHangupImmediate" sortable>
+						<template #default="{ row }">
+							<el-button link type="primary" @click="linkDetail(row, '7')">{{ row.inHangupImmediate }}</el-button>
+						</template>
+					</vxe-column>
+					<vxe-column title="超时未接通量" field="overTimeInHanguped" sortable>
+						<template #default="{ row }">
+							<el-button link type="primary" @click="linkDetail(row, '8')">{{ row.overTimeInHanguped }}</el-button>
+						</template>
+					</vxe-column>
 					<vxe-column title="接通率" field="inAnsweredRateString" sortable></vxe-column>
 				</vxe-table>
 			</div>
@@ -116,7 +148,7 @@ const state = reactive<any>({
 	loading: false, // 加载
 	total: 0, // 总数
 	roleOptions: [],
-	totalCount:{}
+	totalCount: {},
 });
 /** 搜索按钮操作 */
 const handleQuery = () => {
@@ -175,14 +207,27 @@ const onLink = () => {
 		path: '/statistics/call/detailSeatsMoth',
 	});
 };
+// 点击数字查询详情
+const linkDetail = (row: any, type: string) => {
+	router.push({
+		path: '/statistics/call/detailSeatsMoth',
+		query: {
+			EmpId: row.userId,
+			StartTime: state.queryParams.crTime[0],
+			EndTime: state.queryParams.crTime[1],
+			QueryType: type,
+		},
+	});
+};
 // 基础数据
+const seatUser = ref<EmptyArrayType>([]);
 const getBaseData = async () => {
-		try {
-			const { result } = await callAgentMonthBase();
-			console.log(result)
-		} catch (e) {
-			console.log(e);
-		}
+	try {
+		const { result } = await callAgentMonthBase();
+		seatUser.value = result.seatUser ?? [];
+	} catch (e) {
+		console.log(e);
+	}
 };
 const toolbarRef = ref<RefType>();
 const tableRef = ref<RefType>();

+ 9 - 10
src/views/statistics/department/delay.vue

@@ -55,39 +55,38 @@
 				>
 					<vxe-column field="orgName" title="部门名称" min-width="200"></vxe-column>
 					<vxe-column field="allTotal" title="小计" sortable>
-						<template #default="{row}">
+						<template #default="{ row }">
 							<el-button type="primary" link @click="linkDetail(row, '4')">
 								{{ row.allTotal }}
 							</el-button>
 						</template>
 					</vxe-column>
 					<vxe-column field="passTotal" title="延期已同意次数" sortable>
-						<template #default="{row}">
+						<template #default="{ row }">
 							<el-button type="primary" link @click="linkDetail(row, '1')">
 								{{ row.passTotal }}
 							</el-button>
 						</template>
 					</vxe-column>
 					<vxe-column field="noPassTotal" title="延期未同意次数" sortable>
-						<template #default="{row}">
+						<template #default="{ row }">
 							<el-button type="primary" link @click="linkDetail(row, '2')">
 								{{ row.noPassTotal }}
 							</el-button>
 						</template>
 					</vxe-column>
 					<vxe-column field="examiningTotal" title="延期审批中次数" sortable>
-						<template #default="{row}">
+						<template #default="{ row }">
 							<el-button type="primary" link @click="linkDetail(row, '3')">
 								{{ row.examiningTotal }}
 							</el-button>
 						</template>
 					</vxe-column>
 					<vxe-column field="withdrawTotal" title="取消延期次数" sortable>
-						<template #default="{row}">
-							{{ row.withdrawTotal  }}
-<!--							<el-button type="primary" link @click="linkDetail(row, '4')">
-								{{ row.withdrawTotal  }}
-							</el-button>-->
+						<template #default="{ row }">
+							<el-button type="primary" link @click="linkDetail(row, '5')">
+								{{ row.withdrawTotal }}
+							</el-button>
 						</template>
 					</vxe-column>
 				</vxe-table>
@@ -169,7 +168,7 @@ const footerMethod = ({ columns, data }) => {
 			if (columnIndex === 0) {
 				return '合计';
 			}
-			if (['allTotal', 'passTotal', 'noPassTotal', 'examiningTotal'].includes(column.property)) {
+			if (['allTotal', 'passTotal', 'noPassTotal', 'examiningTotal','withdrawTotal'].includes(column.property)) {
 				return XEUtils.sum(data, column.property);
 			}
 		}),

+ 10 - 8
src/views/todo/seats/accept/Plan.vue

@@ -56,23 +56,17 @@
 		class="pt10"
 	/>
 </template>
-<script setup lang="ts" name="orderAcceptKnowledge">
+<script setup lang="ts" name="orderAcceptPlan">
 // 定义变量内容
 import { onMounted, reactive, defineAsyncComponent, ref, watch } from 'vue';
-import { useRoute, useRouter } from 'vue-router';
+import { useRouter } from 'vue-router';
 import { formatDate } from '@/utils/formatTime';
-import { knowledgeRetrieval, knowledgeRetrievalAccept } from '@/api/knowledge/retrieval';
 import { throttle } from '@/utils/tools';
 import { planRetrieval } from '@/api/plan/retrieval';
 
 const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
 
 const props = defineProps({
-	type: {
-		// 知识库类型 (中心|部门)
-		type: String,
-		default: '',
-	},
 	formData: {
 		// 表单填写的数据
 		type: Object,
@@ -107,6 +101,7 @@ const knowledgeRetrievalPaged = throttle(async () => {
 		state.queryParams.Content = state.queryParams.Keyword;
 		const request = {
 			...state.queryParams,
+			HotspotId: props.formData.hotspotId,
 		};
 		const { result } = await planRetrieval(request);
 		state.knowledgeList = result?.items ?? [];
@@ -147,6 +142,13 @@ const querySearch = async (name: string) => {
 		state.loading = false;
 	}
 };
+watch(
+	() => props.formData.hotspotId,
+	(val: any) => {
+		knowledgeRetrievalPaged();
+	},
+	{ immediate: true, deep: true }
+);
 onMounted(() => {
 	knowledgeRetrievalPaged();
 });

+ 16 - 13
src/views/todo/seats/accept/zgAccept.vue

@@ -249,7 +249,7 @@
 												<el-col :xs="24" :sm="24" :md="24" :lg="16" :xl="16">
 													<el-input v-model="state.ruleForm.street" placeholder="请填写详细地址" clearable> </el-input>
 												</el-col>
-<!--																								<el-col :xs="24" :sm="24" :md="24" :lg="7" :xl="7" :offset="1">
+												<!--																								<el-col :xs="24" :sm="24" :md="24" :lg="7" :xl="7" :offset="1">
 													<el-button type="primary" link @click="selectLocation"><SvgIcon name="ele-Location" size="16px" /> 地图定位</el-button>
 												</el-col>-->
 											</el-form-item>
@@ -411,10 +411,10 @@
 					<el-card shadow="never">
 						<el-tabs v-model="rightBottomActive" @tab-change="handleRightBottom" stretch>
 							<el-tab-pane label="知识库" name="knowledge">
-								<Knowledge ref="knowledgeRef" :formData="state.ruleForm" @changeYYType="changeYYType"/>
+								<Knowledge ref="knowledgeRef" :formData="state.ruleForm" @changeYYType="changeYYType" />
 							</el-tab-pane>
-							<el-tab-pane label="预案库" name="plan">
-								<plan />
+							<el-tab-pane label="预案库" name="plan" >
+								<plan  ref="planRef" :formData="state.ruleForm"/>
 							</el-tab-pane>
 						</el-tabs>
 					</el-card>
@@ -535,7 +535,7 @@ const state = reactive<any>({
 		},
 		industryId: null, // 行业分类
 		industryName: null, // 行业分类名称
-		knowledgeQuote:[], // 知识库引用
+		knowledgeQuote: [], // 知识库引用
 	},
 	formLoading: false, // 表单加载状态
 	hotspotExternal: [], // 热点分类外部数据
@@ -985,9 +985,10 @@ const processOrder = (orderDetail: any, isAgent = false) => {
 					annexName: '办理附件',
 				},
 			};
-			if(state.ruleForm.sourceChannelCode === 'ZGSSP'){ // 随手拍工单办理
+			if (state.ruleForm.sourceChannelCode === 'ZGSSP') {
+				// 随手拍工单办理
 				zgSspProcessRef.value.openDialog(params);
-			}else{
+			} else {
 				zgProcessRef.value.openDialog(params);
 			}
 		} else {
@@ -1004,9 +1005,10 @@ const processOrder = (orderDetail: any, isAgent = false) => {
 							annexName: '办理附件',
 						},
 					};
-					if(state.ruleForm.sourceChannelCode === 'ZGSSP'){ // 随手拍工单办理
+					if (state.ruleForm.sourceChannelCode === 'ZGSSP') {
+						// 随手拍工单办理
 						zgSspProcessRef.value.openDialog(params);
-					}else{
+					} else {
 						zgProcessRef.value.openDialog(params);
 					}
 				});
@@ -1022,9 +1024,10 @@ const processOrder = (orderDetail: any, isAgent = false) => {
 					},
 					orderDetail,
 				};
-				if(state.ruleForm.sourceChannelCode === 'ZGSSP'){ // 随手拍工单办理
+				if (state.ruleForm.sourceChannelCode === 'ZGSSP') {
+					// 随手拍工单办理
 					zgSspProcessRef.value.openDialog(params);
-				}else{
+				} else {
 					zgProcessRef.value.openDialog(params);
 				}
 			}
@@ -1124,7 +1127,7 @@ const chooseAdvice = (item: any) => {
 };
 // 取消并关闭当前页
 const onCancel = () => {
-	mittBus.emit('clearCachePage', ['order', 'todoOrder', 'todoCenter', 'callLog','todoSeats']);
+	mittBus.emit('clearCachePage', ['order', 'todoOrder', 'todoCenter', 'callLog', 'todoSeats']);
 	// 关闭当前 tagsView
 	if (state.ruleForm.callId) {
 		const currentRoute = state.tagsViewList.find((v: any) => v.query?.callId === state.ruleForm.callId);
@@ -1258,7 +1261,7 @@ const loadForm = async () => {
 					dicDataValue: state.ruleForm.acceptTypeCode,
 					dicDataName: state.ruleForm.acceptType,
 				};
-			}else{
+			} else {
 				state.ruleForm.acceptTypeObj = {
 					// 受理类型
 					dicDataValue: state.ruleForm.acceptTypeCode,