Forráskód Böngészése

reactor:通话记录新增呼入白名单,呼入黑名单; 来电弹屏隐藏和新增部分字段调整;

zhangchong 10 hónapja
szülő
commit
4d8a06e1c1

+ 3 - 3
src/components/OrderDetail/index.vue

@@ -139,9 +139,9 @@
 									>
 								</el-form-item>
 							</el-col>
-							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
-								<el-form-item label="紧急程度"> {{ state.ruleForm.emergencyLevelText }} </el-form-item>
-							</el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+                <el-form-item label="是否紧急"> <el-text tag="b" class="color-danger">{{ state.ruleForm.emergencyLevelText }}</el-text> </el-form-item>
+              </el-col>
 							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
 								<el-form-item label="热点分类"> {{ state.ruleForm.hotspotSpliceName }} </el-form-item>
 							</el-col>

+ 69 - 65
src/layout/navBars/breadcrumb/telControl.vue

@@ -544,7 +544,7 @@ import { useUserInfo } from '@/stores/userInfo';
 import { useAppConfig } from '@/stores/appConfig';
 import { getImageUrl } from '@/utils/tools';
 import { formatDuration } from '@/utils/formatTime';
-import { commonEnum } from '@/utils/constants';
+import { commonEnum, getNowDateTime } from "@/utils/constants";
 import other from '@/utils/other';
 import { workflowStepOptions } from '@/api/system/workflow';
 import {
@@ -694,9 +694,9 @@ const removeTimerOnDuty = () => {
 };
 // 监听消息
 const signalRStart = async () => {
-	signalR.SR.on('RestApplyPass', (data) => {
+	signalR?.SR?.on('RestApplyPass', (data) => {
 		// 小休审批通过消息
-		console.log(data, '小休审批通过消息');
+		console.log(data, '小休审批通过消息',getNowDateTime());
 		RestApplyPassFn(data);
 	});
 };
@@ -748,7 +748,7 @@ const RestApplyPassFn = (data: any) => {
 	});
 	//不需要审核直接开始小休
 	ola.go_break(state.restForm.reason); //设置忙碌
-	console.log('调用示忙审核', data);
+	console.log('调用示忙审核', data,getNowDateTime());
 };
 // 查询所有分机
 const getTelsLists = async () => {
@@ -758,7 +758,7 @@ const getTelsLists = async () => {
     // state.telsList = [...result,...result,...result,...result,...result,...result,...result,...result,...result,...result,...result,...result,...result,...result,...result,...result,...result,...result,];
 		return state.telsList;
 	} catch (err) {
-		console.log(err);
+		console.log(err,getNowDateTime());
 	}
 };
 // 查询三方会议和转接的号码
@@ -767,7 +767,7 @@ const getThreeWayAndTransfer = async () => {
 		const { result } = await getDataByCode('TransferNumber');
 		state.threeWayAndTransfer = result ?? [];
 	} catch (err) {
-		console.log(err);
+		console.log(err,getNowDateTime());
 	}
 };
 // 鼠标移入移出改变图标
@@ -828,7 +828,7 @@ const onControlClick = (val: string) => {
 };
 // 链接呼叫中心
 const websocket_connect = () => {
-	console.log('链接呼叫中心');
+	console.log('链接呼叫中心',getNowDateTime());
 	if (ola.ws) {
 		// 如果已经连接 则先关闭
 		ola.close();
@@ -887,18 +887,18 @@ const sendMsg = (msg: any) => {
 const onBeginAcw = async () => {
 	try {
 		const res: any = await startAfterCall({ actionType: 1 });
-		console.log(res, '业务系统记录话后整理开始');
+		console.log(res, '业务系统记录话后整理开始',getNowDateTime());
 	} catch (err) {
-		console.log(err);
+		console.log(err,getNowDateTime());
 	}
 };
 // 业务系统记录话后整理结束
 const onEndAcw = async () => {
 	try {
 		const res: any = await endAfterCall({ actionType: 1 });
-		console.log(res, '业务系统记录话后整理结束');
+		console.log(res, '业务系统记录话后整理结束',getNowDateTime());
 	} catch (err) {
-		console.log(err);
+		console.log(err,getNowDateTime());
 	}
 };
 const router = useRouter();
@@ -921,7 +921,7 @@ const onMessage = async (event: any) => {
 			// 设置分机号和坐席组
 			useTelStatusStore.setCallInfo({ telsNo: currentTel.value.telNo });
 			setTimeout(() => {
-				console.log(`当前话机模式:${currentTel.value.telModel} 1:普通模式 2:外呼模式`);
+				console.log(`当前话机模式:${currentTel.value.telModel} 1:普通模式 2:外呼模式`,getNowDateTime());
 				if (currentTel.value.telModel == 2) {
 					// 设置示闲状态
 					ola.go_ready();
@@ -930,23 +930,23 @@ const onMessage = async (event: any) => {
 					// 设置话机状态 外呼模式中
 					useTelStatusStore.setPhoneControlState(TelStates.onCallOut);
 				} else {
-					console.log('isRest', `当前分机是否正在休息${isRest.value}`);
+					console.log('isRest', `当前分机是否正在休息${isRest.value}`,getNowDateTime());
 					if (isRest.value) {
 						// 如果是小休状态
 						ola.go_break(''); //设置忙碌
 					} else {
 						// 设置示闲状态
 						ola.go_ready();
-						console.log('呼叫中心:调用示闲');
+						console.log('呼叫中心:调用示闲',getNowDateTime());
 					}
 				}
 			}, 100);
-			console.log('呼叫中心:已签入');
+			console.log('呼叫中心:已签入',getNowDateTime());
 			ElMessage.success('签入成功');
 			stopReconnect(); // 停止重连
 		} else if (data.state == 'logout') {
 			// 签出
-			console.log('呼叫中心:已签出');
+			console.log('呼叫中心:已签出',getNowDateTime());
 			ElMessage.success('签出成功');
 			seatAssistOff(); // 坐席助手关闭
 		} else if (data.state == 'ready') {
@@ -964,7 +964,7 @@ const onMessage = async (event: any) => {
 				// 设置话机状态 修改为外呼状态
 				useTelStatusStore.setPhoneControlState(TelStates.onCallOut);
 				state.loading = false;
-				console.log('呼叫中心 外呼模式:示闲中');
+				console.log('呼叫中心 外呼模式:示闲中',getNowDateTime());
 				sendMsg('ready');
 			} else {
 				// 结束计时
@@ -983,14 +983,14 @@ const onMessage = async (event: any) => {
 					// 如果是话后整理中
 					await onEndAcw(); // 挂机后整理结束
 				}
-				console.log('呼叫中心:示闲中');
+				console.log('呼叫中心:示闲中',getNowDateTime());
 				sendMsg('ready');
 			}
 		} else if (data.state == 'unready') {
 			break_reason(data.private_data);
 			sendMsg('unready'); // 发送消息 业务系统消息通知
 
-			console.log('呼叫中心:示忙中,小休开始');
+			console.log('呼叫中心:示忙中,小休开始',getNowDateTime());
 			// 示忙中
 			useTelStatusStore.setPhoneControlState(TelStates.rest);
 			useTelStatusStore.setRest(RestStates.resting);
@@ -1032,9 +1032,9 @@ const onMessage = async (event: any) => {
 				// 挂机后 如果是外呼模式
 				// 呼出直接调用示闲
 				ola.go_ready(); // 示闲
-				console.log('外呼模式进入话后整理调用示闲');
+				console.log('外呼模式进入话后整理调用示闲',getNowDateTime());
 			} else {
-				console.log(call_direction.value, '呼入还是呼出');
+				console.log(call_direction.value, '呼入还是呼出',getNowDateTime());
 				if (call_direction.value === 'inbound') {
 					// 呼入需要进入话后整理
 					// 设置分机号和坐席组
@@ -1058,34 +1058,33 @@ const onMessage = async (event: any) => {
 						// 设置话机状态 取消话后整理修改为空闲状态
 						useTelStatusStore.setPhoneControlState(TelStates.dutyOn);
 						ola.go_ready(); // 示闲
-						console.log('呼叫中心:调用示闲');
+						console.log('呼叫中心:调用示闲',getNowDateTime());
 						onEndAcw(); // 挂机后整理结束
 						clearTimeout(talkDealTimer.value); // 清除话后整理定时器
 					}, time);
-					console.log('呼叫中心:话后整理中');
+					console.log('呼叫中心:话后整理中',getNowDateTime());
 					// 如果不是话后整理中
 					await onBeginAcw(); // 挂机后整理开始
 					sendMsg('acw');
 				} else {
 					// 呼出直接调用示闲
 					ola.go_ready(); // 示闲
-					console.log('呼叫中心:调用示闲');
+					console.log('呼叫中心:调用示闲',getNowDateTime());
 				}
 			}
 		} else if (data.state == 'busy') {
-			console.log(data.state, '其他状态');
+			console.log(data.state, '其他状态',getNowDateTime());
 			/*			// 设置振铃中
       useTelStatusStore.setPhoneControlState(TelStates.ring);
       sendMsg('busy');
       console.log('呼叫中心:转接中....');*/
 		} else {
-			console.log(data.state, '其他状态1');
+			console.log(data.state, '其他状态1',getNowDateTime());
 		}
 
 		if (data.state == 'busy') {
 			call_direction.value = data.call_direction; // 保存呼叫方向
 			if (['held', 'unheld'].includes(data.private_data)) {
-				console.log(muteModel.value, '21321');
 				if (muteModel.value || isTelMute.value) {
 					// 如果是静音状态
 					// 静音
@@ -1127,14 +1126,14 @@ const onMessage = async (event: any) => {
 				if (data.private_data == 'monitoring') {
 					// 三方来电振铃中
 					useTelStatusStore.setPhoneControlState(TelStates.ring);
-					console.log('呼叫中心:三方来电振铃中');
+					console.log('呼叫中心:三方来电振铃中',getNowDateTime());
 				} else if (data.private_data == 'three_way') {
 					// 三方来电通话中
 					// 开始计时
 					startTime();
 					// 设置电话状态 三方通话中
 					useTelStatusStore.setPhoneControlState(TelStates.onConference);
-					console.log('呼叫中心:三方来电通话中');
+					console.log('呼叫中心:三方来电通话中',getNowDateTime());
 					sendMsg('busy');
 				} else if (data.private_data == 'three_way_hangup') {
 					// 三方来电挂断
@@ -1142,19 +1141,19 @@ const onMessage = async (event: any) => {
 					useTelStatusStore.setPhoneControlState(TelStates.onCall);
 					onCallArr.value = [];
 					sendMsg('busy');
-					console.log('呼叫中心:三方来电挂断');
+					console.log('呼叫中心:三方来电挂断',getNowDateTime());
 				} else if (data.private_data == 'three_way_ring') {
 					// 三方通话呼出中
 					// 设置振铃中
 					useTelStatusStore.setPhoneControlState(TelStates.ring);
 					sendMsg('busy');
-					console.log('呼叫中心:三方通话呼出中');
+					console.log('呼叫中心:三方通话呼出中',getNowDateTime());
 				} else if (data.private_data == 'three_way_answered') {
 					// 三方通话呼出接通
 					onCallArr.value.push({ telNo: state.threeWayForm.telNo }); // 三方通话呼出接通
 					// 设置电话状态 呼出三方通话中 可以踢人和挂断通话
 					useTelStatusStore.setPhoneControlState(TelStates.onThreeWay);
-					console.log('呼叫中心:三方通话呼出接通,推送一次');
+					console.log('呼叫中心:三方通话呼出接通,推送一次',getNowDateTime());
 					sendMsg('treeWay');
 				} else if (data.call_direction == 'outbound') {
 					// 呼出
@@ -1163,13 +1162,13 @@ const onMessage = async (event: any) => {
 						// 设置电话状态 振铃中
 						useTelStatusStore.setPhoneControlState(TelStates.ring);
 						sendMsg('busy');
-						console.log('呼叫中心:呼出拨号中');
+						console.log('呼叫中心:呼出拨号中',getNowDateTime());
 					} else if (data.private_data == 'answered') {
 						//振铃中
 						if (data.other_answered == false) {
 							// 设置电话状态 振铃中
 							useTelStatusStore.setPhoneControlState(TelStates.ring);
-							console.log('呼叫中心:呼出振铃中');
+							console.log('呼叫中心:呼出振铃中',getNowDateTime());
 						} else if (data.other_answered == true) {
 							// 通话中
 							// 开始计时
@@ -1178,7 +1177,7 @@ const onMessage = async (event: any) => {
 							useTelStatusStore.setPhoneControlState(TelStates.onCall);
 
 							mittBus.emit('outboundConnect', data); // 外呼接通之后收到的消息
-							console.log('呼叫中心:呼出通话中');
+							console.log('呼叫中心:呼出通话中',getNowDateTime());
 						}
 						sendMsg('busy');
 					}
@@ -1187,7 +1186,7 @@ const onMessage = async (event: any) => {
 					if (data.private_data == 'ring') {
 						// 设置电话状态 振铃中
 						useTelStatusStore.setPhoneControlState(TelStates.ring);
-						console.log(data, '呼叫中心:来电弹单信息');
+						console.log(data, '呼叫中心:来电弹单信息',getNowDateTime());
 						// 来电才展示弹屏
 						// 跳转到录入工单页面
 						await getWithList(); // 获取白名单列表
@@ -1221,7 +1220,7 @@ const onMessage = async (event: any) => {
 						startTime();
 						// 设置电话状态 通话中
 						useTelStatusStore.setPhoneControlState(TelStates.onCall);
-						console.log('呼叫中心:呼入通话中');
+						console.log('呼叫中心:呼入通话中',getNowDateTime());
 					}
 					sendMsg('busy');
 				}
@@ -1235,17 +1234,17 @@ const onMessage = async (event: any) => {
 			// 结束计时
 			removeTimer();
 			onCallArr.value = [];
-			console.log('呼叫中心:已挂机', onCallArr.value, data);
+			console.log('呼叫中心:已挂机', onCallArr.value, data,getNowDateTime());
 			sendMsg('ready');
 		}
 	} else if (data.event_type == 'agent_caller_state') {
 		//通话状态
 		// special feature, never mind
 		if (data.action == 'in') {
-			console.log('呼叫中心:呼入', data.caller.cid_number, data.caller.iuud);
+			console.log('呼叫中心:呼入', data.caller.cid_number, data.caller.iuud,getNowDateTime());
 			// ola.take_call(data.caller.uuid);
 		} else {
-			console.log('呼叫中心:呼出', data.caller.uuid);
+			console.log('呼叫中心:呼出', data.caller.uuid,getNowDateTime());
 		}
 	} else if (data.event_type == 'command/reply') {
 		// 其他消息
@@ -1258,14 +1257,14 @@ const submitLogFn = async (request: any) => {
 		await submitLog(request);
 		Local.remove('telNo');
 	} catch (error) {
-		console.log(error);
+		console.log(error,getNowDateTime());
 	}
 };
 // 呼叫中心链接关闭
 const isReconnect = ref<boolean>(true); // 是否需要重连
 const onClose = async (event: any) => {
 	resetState();
-	console.log('呼叫中心断开链接', !event.wasClean && isReconnect.value ? '需要重连' : '不需要重连');
+	console.log('呼叫中心断开链接', !event.wasClean && isReconnect.value ? '需要重连' : '不需要重连',getNowDateTime());
 	if (!event.wasClean && isReconnect.value) {
 		// 签入状态需要重连
 		await reConnect(); // 重新链接呼叫中心
@@ -1286,14 +1285,14 @@ const reconnectTimeout = ref(); // 重连定时器
 // 避免重复连接
 let lockReconnect = false;
 const reConnect = async () => {
-	console.log(`是否锁定重连: ${lockReconnect}`);
+	console.log(`是否锁定重连: ${lockReconnect}`,getNowDateTime());
 	if (lockReconnect) {
 		return;
 	}
 	lockReconnect = true;
 	//没连接上会一直重连,设置延迟避免请求过多
 	reconnectTimeout.value && clearTimeout(reconnectTimeout.value);
-	console.log('开始重连');
+	console.log('开始重连',getNowDateTime());
 	reconnectTimeout.value = setTimeout(() => {
 		websocket_connect();
 		lockReconnect = false;
@@ -1305,7 +1304,7 @@ const stopReconnect = () => {
 		isReconnect.value = true; // 重置需要重连状态
 	}, 1000);
 	reconnectTimeout.value && clearTimeout(reconnectTimeout.value);
-	console.log('停止重连');
+	console.log('停止重连',getNowDateTime());
 };
 const dutyFormRef = ref<RefType>();
 const currentTel = ref<any>({}); // 当前分机
@@ -1411,7 +1410,7 @@ const clickOnDuty = (formEl: FormInstance | undefined) => {
 			})
 			.catch(() => {
 				resetState(); // 重置所有状态
-				console.log('业务系统:签入错误');
+				console.log('业务系统:签入错误',getNowDateTime());
 			})
 			.finally(() => {
 				state.loading = false;
@@ -1434,7 +1433,7 @@ const offDutyFn = () => {
 			isReconnect.value = false;
 			dutyOff()
 				.then(() => {
-					console.log('业务系统:签出成功');
+					console.log('业务系统:签出成功',getNowDateTime());
 					sendMsg('logout');
 					ola.logout(currentTel.value.telNo); //签出
 					state.dutyOnSrc = getImageUrl('phoneControls/dutyOn_blue.png'); //签入图片
@@ -1555,15 +1554,20 @@ const break_reason = (reason: string) => {
 			break;
 	}
 	if (telStatusInfo.value.isRest !== 'resting' && !isRest.value) {
+    // 判断当前状态是否在话后整理中 如果在话后整理中先结束话后整理
+    if (isAcw.value || telStatusInfo.value.isTalkingDeal) {
+      // 如果是话后整理中
+      onEndAcw(); // 挂机后整理结束
+    }
 		// 如果不在在小休中
 		const restReasons = state.restReasonOptions.find((item: any) => item.dicDataValue === reason);
 		busyOn({ reason: restReasons?.dicDataName ?? '' }) // 开始小休 设置示忙 业务系统统计需要
 			.then(() => {
-				console.log('业务系统调用示忙成功');
+				console.log('业务系统调用示忙成功',getNowDateTime());
 				state.loading = false;
 			})
 			.catch((err) => {
-				console.log('业务系统调用示忙失败', err);
+				console.log('业务系统调用示忙失败', err,getNowDateTime());
 				state.loading = false;
 			});
 	} else {
@@ -1600,7 +1604,7 @@ const getNextStepOption = async (DefineId: string, Code: string) => {
 		const res: any = await workflowStepOptions({ DefineId, Code });
 		state.handlerOptions = res.result ?? [];
 	} catch (error) {
-		console.log(error);
+		console.log(error,getNowDateTime());
 	}
 };
 // 小休选择处理人
@@ -1654,7 +1658,7 @@ const clickOnRest = (formEl: FormInstance | undefined) => {
 			//不需要审核直接开始小休
 			ola.go_break(state.restForm.reason); //设置忙碌
 			clearTimeout(talkDealTimer.value); // 清除话后整理定时器
-			console.log('呼叫中心:调用示忙');
+			console.log('呼叫中心:调用示忙',getNowDateTime());
 			state.restDialogVisible = false;
 			state.loading = false;
 		}
@@ -1682,7 +1686,7 @@ const onRestEnd = () => {
 		.then(() => {
 			ola.go_ready(); // 示闲
 			busyOff(); // 结束小休(调用业务系统接口,统计需要)
-			console.log('呼叫中心:调用示闲');
+			console.log('呼叫中心:调用示闲',getNowDateTime());
 		})
 		.catch(() => {});
 };
@@ -1690,7 +1694,7 @@ const onRestEnd = () => {
 const holdStart = async () => {
 	try {
 		const res: any = await startAfterCall({ actionType: 2 });
-		console.log(res, '业务系统记录保持开始');
+		console.log(res, '业务系统记录保持开始',getNowDateTime());
 	} catch (err) {
 		console.log(err);
 	}
@@ -1699,7 +1703,7 @@ const holdStart = async () => {
 const holdEnd = async () => {
 	try {
 		const res: any = await endAfterCall({ actionType: 2 });
-		console.log(res, '业务系统记录保持结束');
+		console.log(res, '业务系统记录保持结束',getNowDateTime());
 	} catch (err) {
 		console.log(err);
 	}
@@ -1740,7 +1744,7 @@ const onUnHold = () => {
 const muteStart = async () => {
 	try {
 		const res: any = await startAfterCall({ actionType: 4 });
-		console.log(res, '业务系统记录静音开始');
+		console.log(res, '业务系统记录静音开始',getNowDateTime());
 	} catch (err) {
 		console.log(err);
 	}
@@ -1749,7 +1753,7 @@ const muteStart = async () => {
 const muteEnd = async () => {
 	try {
 		const res: any = await endAfterCall({ actionType: 4 });
-		console.log(res, '业务系统记录静音结束');
+		console.log(res, '业务系统记录静音结束',getNowDateTime());
 	} catch (err) {
 		console.log(err);
 	}
@@ -1805,7 +1809,7 @@ const unTalkingDeal = () => {
 			ola.go_ready(); // 示闲
 			clearTimeout(talkDealTimer.value); // 清除话后整理定时器
 			onEndAcw(); // 挂机后整理结束
-			console.log('呼叫中心:调用示闲');
+			console.log('呼叫中心:调用示闲',getNowDateTime());
 		})
 		.catch(() => {});
 };
@@ -1905,7 +1909,7 @@ const connectVoiceAssistant = async (telNo: string) => {
 		socket.value = useSocket(import.meta.env.VITE_VOICE_ASSISTANT_SOCKET_URL, { uid, trans, notice });
 		socket.value.on('open', () => {
 			socket.value.send({ id: '', type: 1, from: uid, to: 'sys', timestamps: new Date().getTime(), body: result.userName });
-			console.log('坐席辅助连接成功');
+			console.log('坐席辅助连接成功',getNowDateTime());
 			ElMessage.success('坐席辅助连接成功');
 			const name: string = `捷通华声的websocket链接成功`;
 			const remark: string = `捷通华声的websocket链接成功`;
@@ -1919,13 +1923,13 @@ const connectVoiceAssistant = async (telNo: string) => {
 		});
 		socket.value.on('message', wsReceive);
 	} catch (err) {
-		console.log(err, '坐席辅助链接失败');
+		console.log(err, '坐席辅助链接失败',getNowDateTime());
 		ElMessage.error('坐席辅助链接失败');
 	}
 };
 // 坐席辅助关闭
 const seatAssistOff = () => {
-	console.log('坐席辅助:手动关闭,不再重连');
+	console.log('坐席辅助:手动关闭,不再重连',getNowDateTime());
 	if (socket.value) {
 		socket.value.close();
 		socket.value = null;
@@ -1987,7 +1991,7 @@ const getTelStatusFn = async () => {
 		isAcw.value = result.isCallEndArrange; // 是否话后整理中
 		isTelMute.value = result.isTelMute; // 是否静音中
 	} catch (e) {
-		console.log(e);
+		console.log(e,getNowDateTime());
 	}
 };
 // 刷新页面呼叫中心链接
@@ -2066,25 +2070,25 @@ const currentWaitValue = useTransition(currentWait, {
 });
 onMounted(async () => {
 	await getReason(); // 获取小休原因
-	await signalRStart(); //开启消息监听
 	await resetState(); // 先重置状态
 	await getTelsLists(); // 查询所有分机
 	await getThreeWayAndTransfer(); // 查询转接和三方
 	await callCenterConnect(); // 呼叫中心链接
 	await getTodayWaitNumFn(); // 查询今日等待数量
+  await signalRStart(); //开启消息监听
 	// 加入分组
 	await signalR.joinGroup('CallCenter');
-	signalR.SR.on('ToDayWaitNum', (data: number) => {
+	signalR.SR?.on('ToDayWaitNum', (data: number) => {
 		todayWait.value = data;
 	});
-	signalR.SR.on('CurrentWaitNum', (data: number) => {
+	signalR.SR?.on('CurrentWaitNum', (data: number) => {
 		currentWait.value = data;
 	});
 });
 watch(
 	() => isReconnect.value,
 	(val: boolean, oldValue: boolean) => {
-		console.log(`是否需要重连:${val},oldValue:${oldValue}`);
+		console.log(`是否需要重连:${val},oldValue:${oldValue}`,getNowDateTime());
 	},
 	{ immediate: true, deep: true }
 );

+ 6 - 6
src/stores/appConfig.ts

@@ -12,10 +12,10 @@ export const useAppConfig = defineStore('AppConfig', {
 			isNeedTelNo: false, // 分机签入是否需要选择号码
 			isTelNeedVerify: false, // 分机签入是否需要输入密码
 			isCustomEvent: false, // 是否开启自定义事件
-			isTranspondCity:false, // 是否开启市州互转
-			isAverageSendOrder:false, // 是否开启平均派单
-			isOpenRepeatedWorkOrders:false, // 是否开启重复工单
-			noSignOrgCode:[], // 不参与会签的机构code
+			isTranspondCity: false, // 是否开启市州互转
+			isAverageSendOrder: false, // 是否开启平均派单
+			isOpenRepeatedWorkOrders: false, // 是否开启重复工单
+			noSignOrgCode: [], // 不参与会签的机构code
 		},
 	}),
 	actions: {
@@ -49,6 +49,6 @@ export const useAppConfig = defineStore('AppConfig', {
 			// 	storage: sessionStorage,
 			// 	paths: ['telsNo']
 			// },
-		]
-	}
+		],
+	},
 });

+ 0 - 40
src/types/pinia.d.ts

@@ -112,44 +112,4 @@ declare interface AppConfigState {
 		isOpenRepeatedWorkOrders: boolean; // 是否开启重复工单
 		[x: string]: any
 	}
-}
-
-enum TelStates {
-	dutyOff = 'dutyOff', // 签出
-	dutyOn = 'dutyOn', // 签入
-	rest = 'rest',  // 小休
-	ring = 'ring', // 来电响铃
-	onCallOut = 'onCallOut', // 外呼模式中
-	onHold = 'onHold', // 保持中
-	onTransferSuccess = 'onTransferSuccess', // 转接成功,可以开始三方通话
-	onCall = 'onCall', // 一通电话通话中
-	onTalkingDeal = 'onTalkingDeal', 		// 事后处理中
-	onConference = 'onConference', // 一通电话通话中,会议中
-	onThreeWay = 'onThreeWay', // 三方通话中
-}
-enum RestStates {
-	resting = 'resting', // 小休中
-	InReview = 'InReview', // 小休审批中
-	unRest = 'unRest' // 未小休
-}
-declare interface TelsStateInfos {
-	telStatusInfo: {
-		isDutyOn: boolean;  // 是否签入
-		isRest: RestStates; // 是否小休
-		isTalkingDeal: boolean; // 是否事后处理
-		isMeeting: boolean; // 是否会议中
-		isHold:boolean; // 是否保持中
-		isCallOut: boolean, // 是否是外呼模式
-		phoneControlState: TelStates;  // 电话控件状态
-		groupName: string | number; // 分机组名称
-		telsNo: string | number; // 电话号码
-		telGongHao: string | number; // 电话工号
-		telArea: string | number; // 电话区号
-		telGuid: string | number; // 电话guid
-		telIVR: string | number; // 电话IVR
-		telType: string | number; //来电 外呼 转接
-		fromTel: string | number; // 来电号码
-		callTime?: number; // 通话时长
-		[x: string]: any
-	}
 }

+ 4 - 0
src/utils/constants.ts

@@ -172,6 +172,10 @@ export const commonEnum = {
 	Delay: 13,
 };
 
+// 获取当前时间(日志打印专用)
+export const getNowDateTime = () => {
+	return dayjs().format('YYYY-MM-DD HH:mm:ss');
+};
 // 限制日期选择最大时间
 export const disabledDate = (time: Date) => {
 	return time.getTime() < new Date().getTime();

+ 9 - 8
src/utils/signalR.ts

@@ -2,6 +2,7 @@
 import * as signalR from '@microsoft/signalr';
 import { Cookie, Local } from '@/utils/storage';
 import { submitLog } from "@/api/public/log";
+import { getNowDateTime } from "@/utils/constants";
 // 记录日志
 const submitLogFn = async (request: any) => {
 	try {
@@ -36,7 +37,7 @@ export default {
 				executeUrl: import.meta.env.VITE_API_SOCKET_URL,
 			};
 			await submitLogFn(request);
-			console.log('业务系统signal当前链接状态:', connection.state);
+			console.log('业务系统signal当前链接状态:', connection.state,getNowDateTime());
 			// 建议用户重新刷新浏览器
 			await this.start();
 		});
@@ -50,7 +51,7 @@ export default {
 				executeUrl: import.meta.env.VITE_API_SOCKET_URL,
 			};
 			await submitLogFn(request);
-			console.log('业务系统signal断线重连成功');
+			console.log('业务系统signal断线重连成功',getNowDateTime());
 			// location.reload();
 			/*ElNotification({
 				type: 'success',
@@ -60,15 +61,15 @@ export default {
 		});
 		// 服务端推送消息
 		connection.on('Send', (message: any) => {
-			console.log(`有用户加入分组:${message}`);
+			console.log(`有用户加入分组:${message}`,getNowDateTime());
 		});
 		// 服务端推送消息
 		connection.on('CircularRecord', (message: any) => {
-			console.log(`小红点消息:${message}`);
+			console.log(`小红点消息:${message}`,getNowDateTime());
 		});
 		// 服务端推送消息
 		connection.on('SeatState', (message: any) => {
-			console.log(`座席状态:${JSON.stringify(message)}`);
+			console.log(`座席状态:${JSON.stringify(message)}`,getNowDateTime());
 		});
 		// 服务端推送消息
 		connection.on('RestApplyPass', (message: any) => {
@@ -100,7 +101,7 @@ export default {
 		try {
 			//使用async和await 或 promise的then 和catch 处理来自服务端的异常
 			await this.SR.start();
-			console.log('业务系统signal当前链接状态:', this.SR.state);
+			console.log('业务系统signal当前链接状态:', this.SR.state,getNowDateTime());
 			const name: string = `业务系统的websocket链接成功`;
 			const remark: string = `业务系统的websocket断开链接`;
 			const request = {
@@ -196,7 +197,7 @@ export default {
 		try {
 			//使用async和await 或 promise的then 和catch 处理来自服务端的异常
 			await this.SR.stop();
-			console.log(this.SR.state, '断开链接');
+			console.log(this.SR.state, '断开链接',getNowDateTime());
 		} catch (error) {
 			console.log('signalR', error);
 		}
@@ -213,7 +214,7 @@ export default {
 			await this.leaveGroup('CallCenter');
 			await this.leaveGroup('BigScreen-SeatState');
 			await this.stop();
-			console.log(this.SR.state, '断开链接');
+			console.log(this.SR.state, '断开链接',getNowDateTime());
 		} catch (error) {
 			console.log('signalR', error);
 		}

+ 1 - 1
src/utils/websocket.ts

@@ -20,7 +20,7 @@ class Socket {
 		this.url = url;
 		this.opts = {
 			heartbeatInterval: 2 * 1000, // 心跳间隔
-			reconnectInterval: 2 * 1000, // 重连间隔
+			reconnectInterval: 4 * 1000, // 重连间隔
 			maxReconnectAttempts: 99, // 最大重连次数
 			isReconnect: true, // 是否需要重连
 			uid: '', // 用户id

+ 1 - 13
src/views/business/order/copy-index.vue

@@ -177,15 +177,6 @@
               </el-form-item>
             </el-col>
           </transition>
-          <transition name="el-zoom-in-top">
-            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
-              <el-form-item label="紧急程度" prop="EmergencyLevels">
-                <el-select v-model="state.queryParams.EmergencyLevels" placeholder="请选择紧急程度" clearable class="w100" multiple>
-                  <el-option v-for="item in state.emergencyLevelOptions" :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 :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
               <el-form-item label="来电号码" prop="FromPhone">
@@ -469,7 +460,6 @@ const state = reactive<any>({
     // 查询条件
     No: null, // 工单编码
     ProvinceNo: null, // 省本地编号
-    EmergencyLevels: [], // 紧急程度
     ActualHandlerName: null, // 接办人
     IsScreen: null, // 是否甄别
     CurrentStepCode: null, // 当前办理节点
@@ -490,7 +480,6 @@ const state = reactive<any>({
     CreationTimeStart: null, // 创建时间 开始
     CreationTimeEnd: null, // 创建时间 结束
     TransferPhone: null, // 转派人
-    EmergencyLevel: [], // 紧急程度
     exTime: [], // 过期时间
     ExpiredTimeStart: null, //办理期限 开始
     ExpiredTimeEnd: null, //办理期限 结束
@@ -507,7 +496,6 @@ const state = reactive<any>({
   total: 0, // 总数
   acceptTypeOptions: [], //受理类型
   channelOptions: [], // 来源频道
-  emergencyLevelOptions: [], // 紧急程度
   orderStatusOptions: [], // 工单状态
   currentStepOptions: [], // 当前办理节点
   identityTypeOptions: [], // 来电主体
@@ -568,6 +556,7 @@ const columns = ref<any[]>([
   { prop: 'expiredStatusText', label: '超期状态', align: 'center', width: 80 },
   { prop: 'no', label: '工单编码', width: 150 },
   { prop: 'isProvinceText', label: '省/市工单', width: 100 },
+  { prop: 'emergencyLevelText', label: '是否紧急'},
   { prop: 'actualHandleStepName', label: '办理节点', width: 150 },
   { prop: 'statusText', label: '工单状态', width: 100 },
   { prop: 'title', label: '工单标题', width: 300 },
@@ -636,7 +625,6 @@ const getBaseData = async () => {
     const mappings: any = {
       acceptTypeOptions: 'acceptTypeOptions',
       channelOptions: 'channelOptions',
-      emergencyLevelOptions: 'emergencyLevelOptions',
       orgsOptions: 'orgsOptions',
       pushTypeOptions: 'pushTypeOptions',
       orderStatusOptions: 'orderStatusOptions',

+ 1 - 13
src/views/business/order/index.vue

@@ -177,15 +177,6 @@
               </el-form-item>
             </el-col>
           </transition>
-          <transition name="el-zoom-in-top">
-            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
-              <el-form-item label="紧急程度" prop="EmergencyLevels">
-                <el-select v-model="state.queryParams.EmergencyLevels" placeholder="请选择紧急程度" clearable class="w100" multiple>
-                  <el-option v-for="item in state.emergencyLevelOptions" :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 :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
               <el-form-item label="来电号码" prop="FromPhone">
@@ -408,7 +399,6 @@ const state = reactive<any>({
     // 查询条件
     No: null, // 工单编码
     ProvinceNo: null, // 省本地编号
-    EmergencyLevels: [], // 紧急程度
     ActualHandlerName: null, // 接办人
     IsScreen: null, // 是否甄别
     CurrentStepCode: null, // 当前办理节点
@@ -428,7 +418,6 @@ const state = reactive<any>({
     CreationTimeStart: null, // 创建时间 开始
     CreationTimeEnd: null, // 创建时间 结束
     TransferPhone: null, // 转派人
-    EmergencyLevel: [], // 紧急程度
     exTime: [], // 过期时间
     ExpiredTimeStart: null, //办理期限 开始
     ExpiredTimeEnd: null, //办理期限 结束
@@ -445,7 +434,6 @@ const state = reactive<any>({
   total: 0, // 总数
   acceptTypeOptions: [], //受理类型
   channelOptions: [], // 来源频道
-  emergencyLevelOptions: [], // 紧急程度
   orderStatusOptions: [], // 工单状态
   currentStepOptions: [], // 当前办理节点
   identityTypeOptions: [], // 来电主体
@@ -499,6 +487,7 @@ const columns = ref<any[]>([
   { prop: 'expiredStatusText', label: '超期状态', align: 'center', width: 80 },
   { prop: 'no', label: '工单编码', width: 150 },
   { prop: 'isProvinceText', label: '省/市工单', width: 100 },
+  { prop: 'emergencyLevelText', label: '是否紧急'},
   { prop: 'actualHandleStepName', label: '办理节点', width: 150 },
   { prop: 'statusText', label: '工单状态', width: 100 },
   { prop: 'title', label: '工单标题', width: 300 },
@@ -567,7 +556,6 @@ const getBaseData = async () => {
     const mappings: any = {
       acceptTypeOptions: 'acceptTypeOptions',
       channelOptions: 'channelOptions',
-      emergencyLevelOptions: 'emergencyLevelOptions',
       orgsOptions: 'orgsOptions',
       pushTypeOptions: 'pushTypeOptions',
       orderStatusOptions: 'orderStatusOptions',

+ 0 - 1
src/views/business/repeatEvent/components/Repeat-event-detail.vue

@@ -68,7 +68,6 @@ const columns = ref<any[]>([
 	},
 	{ prop: 'order.actualHandleOrgName', label: '接办部门', width: 170 },
 	{ prop: 'order.acceptType', label: '受理类型', width: 150 },
-	{ prop: 'order.emergencyLevelText', label: '紧急程度', width: 100 },
 	{ prop: 'order.sourceChannel', label: '来源方式' },
 	{ prop: 'order.acceptorName', label: '受理人', width: 120 },
 ]);

+ 0 - 1
src/views/business/repeatEvent/components/Repeat-event-edit.vue

@@ -154,7 +154,6 @@ const columns = ref<any[]>([
 	},
 	{ prop: 'actualHandleOrgName', label: '接办部门', width: 170 },
 	{ prop: 'acceptType', label: '受理类型', width: 150 },
-	{ prop: 'emergencyLevelText', label: '紧急程度', width: 100 },
 	{ prop: 'sourceChannel', label: '来源方式' },
 	{ prop: 'acceptorName', label: '受理人', width: 120 },
 ]);

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

@@ -144,7 +144,6 @@ const state = reactive({
 	loading: false, // 加载
 	total: 0, // 总数
 	channelOptions: [], // 来源频道
-	emergencyLevelOptions: [], // 紧急程度
 	orderStatusOptions: [], // 工单状态
 	orgsOptions: [], // 部门
 	pushTypeOptions: [], //推送分类

+ 0 - 2
src/views/home/component/ToDo.vue

@@ -107,7 +107,6 @@ const todoColumns = [
 		},
 	},
 	{ prop: 'acceptType', label: '受理类型', width: 120 },
-	{ prop: 'emergencyLevelText', label: '紧急程度', width: 100 },
 	{ prop: 'sourceChannel', label: '来源方式', width: 100 },
 	{ prop: 'hotspotName', label: '热点分类', width: 200 },
 	{ prop: 'acceptorName', label: '受理人', width: 170 },
@@ -146,7 +145,6 @@ const seatsColumns = [
 	},
 	{ prop: 'acceptType', label: '受理类型', width: 120 },
 	{ prop: 'sourceChannel', label: '来源方式', width: 120 },
-	{ prop: 'emergencyLevelText', label: '紧急程度', width: 100 },
 	{ prop: 'hotspotName', label: '热点分类', width: 200 },
 	{ prop: 'acceptorName', label: '受理人', width: 150 },
 	{ prop: 'operation', label: '操作', fixed: 'right', width: 160, align: 'center' },

+ 0 - 13
src/views/judicial/order/index.vue

@@ -202,15 +202,6 @@
 							</el-form-item>
 						</el-col>
 					</transition>
-					<transition name="el-zoom-in-top">
-						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
-							<el-form-item label="紧急程度" prop="EmergencyLevels">
-								<el-select v-model="state.queryParams.EmergencyLevels" placeholder="请选择紧急程度" clearable class="w100" multiple>
-									<el-option v-for="item in state.emergencyLevelOptions" :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 :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
 							<el-form-item label="来电号码" prop="FromPhone">
@@ -403,7 +394,6 @@ const state = reactive<any>({
 		// 查询条件
 		No: null, // 工单编码
 		ProvinceNo: null, // 省本地编号
-		EmergencyLevels: [], // 紧急程度
 		ActualHandlerName: null, // 接办人
 		IsScreen: null, // 是否甄别
 		CurrentStepCode: null, // 当前办理节点
@@ -423,7 +413,6 @@ const state = reactive<any>({
 		CreationTimeStart: null, // 创建时间 开始
 		CreationTimeEnd: null, // 创建时间 结束
 		TransferPhone: null, // 转派人
-		EmergencyLevel: [], // 紧急程度
 		exTime: [], // 过期时间
 		ExpiredTimeStart: null, //办理期限 开始
 		ExpiredTimeEnd: null, //办理期限 结束
@@ -439,7 +428,6 @@ const state = reactive<any>({
 	total: 0, // 总数
 	acceptTypeOptions: [], //受理类型
 	channelOptions: [], // 来源频道
-	emergencyLevelOptions: [], // 紧急程度
 	orderStatusOptions: [], // 工单状态
 	currentStepOptions: [], // 当前办理节点
 	identityTypeOptions: [], // 来电主体
@@ -595,7 +583,6 @@ const getBaseData = async () => {
 		const mappings: any = {
 			acceptTypeOptions: 'acceptTypeOptions',
 			channelOptions: 'channelOptions',
-			emergencyLevelOptions: 'emergencyLevelOptions',
 			orgsOptions: 'orgsOptions',
 			pushTypeOptions: 'pushTypeOptions',
 			orderStatusOptions: 'orderStatusOptions',

+ 0 - 19
src/views/statistics/center/detailEventFrequently.vue

@@ -88,21 +88,6 @@
 							</el-form-item>
 						</el-col>
 					</transition>
-					<transition name="el-zoom-in-top">
-						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
-							<el-form-item label="紧急程度" prop="EmergencyLevels">
-								<el-select
-									v-model="state.queryParams.EmergencyLevels"
-									placeholder="请选择紧急程度"
-									clearable
-									class="w100"
-									multiple
-								>
-									<el-option v-for="item in state.emergencyLevelOptions" :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 :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
 							<el-form-item label="联系电话" prop="PhoneNo">
@@ -267,7 +252,6 @@ const state = reactive<any>({
 		// 查询条件
 		No: null, // 工单编码
 		ProvinceNo: null, // 省本地编号
-		EmergencyLevels: [], // 紧急程度
 		ActualHandlerName: null, // 接办人
 		IsScreen: null, // 是否甄别
 		CurrentStepCode: null, // 当前办理节点
@@ -286,7 +270,6 @@ const state = reactive<any>({
 		CreationTimeStart: null, // 创建时间 开始
 		CreationTimeEnd: null, // 创建时间 结束
 		TransferPhone: null, // 转派人
-		EmergencyLevel: [], // 紧急程度
 		exTime: [], // 过期时间
 		ExpiredTimeStart: null, //办理期限 开始
 		ExpiredTimeEnd: null, //办理期限 结束
@@ -301,7 +284,6 @@ const state = reactive<any>({
 	total: 0, // 总数
 	acceptTypeOptions: [], //受理类型
 	channelOptions: [], // 来源频道
-	emergencyLevelOptions: [], // 紧急程度
 	orderStatusOptions: [], // 工单状态
 	currentStepOptions: [], // 当前办理节点
 	identityTypeOptions: [], // 来电主体
@@ -391,7 +373,6 @@ const getBaseData = async () => {
 		const res: any = await listBaseData();
 		const mappings: any = {
 			channelOptions: 'channelOptions',
-			emergencyLevelOptions: 'emergencyLevelOptions',
 			orgsOptions: 'orgsOptions',
 			pushTypeOptions: 'pushTypeOptions',
 			orderStatusOptions: 'orderStatusOptions',

+ 0 - 13
src/views/statistics/center/detailTelFrequently.vue

@@ -160,15 +160,6 @@
 							</el-form-item>
 						</el-col>
 					</transition>
-					<transition name="el-zoom-in-top">
-						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
-							<el-form-item label="紧急程度" prop="EmergencyLevels">
-								<el-select v-model="state.queryParams.EmergencyLevels" placeholder="请选择紧急程度" clearable class="w100" multiple>
-									<el-option v-for="item in state.emergencyLevelOptions" :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 :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
 							<el-form-item label="联系电话" prop="PhoneNo">
@@ -335,7 +326,6 @@ const state = reactive<any>({
 		// 查询条件
 		No: null, // 工单编码
 		ProvinceNo: null, // 省本地编号
-		EmergencyLevels: [], // 紧急程度
 		ActualHandlerName: null, // 接办人
 		IsScreen: null, // 是否甄别
 		CurrentStepCode: null, // 当前办理节点
@@ -355,7 +345,6 @@ const state = reactive<any>({
 		CreationTimeStart: null, // 创建时间 开始
 		CreationTimeEnd: null, // 创建时间 结束
 		TransferPhone: null, // 转派人
-		EmergencyLevel: [], // 紧急程度
 		exTime: [], // 过期时间
 		ExpiredTimeStart: null, //办理期限 开始
 		ExpiredTimeEnd: null, //办理期限 结束
@@ -370,7 +359,6 @@ const state = reactive<any>({
 	total: 0, // 总数
 	acceptTypeOptions: [], //受理类型
 	channelOptions: [], // 来源频道
-	emergencyLevelOptions: [], // 紧急程度
 	orderStatusOptions: [], // 工单状态
 	currentStepOptions: [], // 当前办理节点
 	identityTypeOptions: [], // 来电主体
@@ -471,7 +459,6 @@ const getBaseData = async () => {
 		const mappings: any = {
 			acceptTypeOptions: 'acceptTypeOptions',
 			channelOptions: 'channelOptions',
-			emergencyLevelOptions: 'emergencyLevelOptions',
 			orgsOptions: 'orgsOptions',
 			pushTypeOptions: 'pushTypeOptions',
 			orderStatusOptions: 'orderStatusOptions',

+ 0 - 1016
src/views/system/config/timeLimit/component/Time-limit-add.vue

@@ -1,1016 +0,0 @@
-<template>
-	<div class="system-timeLimit-add-container">
-		<el-dialog v-model="state.dialogVisible" width="60%" draggable title="新增时限">
-			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="100px" scroll-to-error>
-				<el-row :gutter="5">
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="配置名称" prop="timeLimitName" :rules="[{ required: true, message: '请填写配置名称', trigger: 'blur' }]">
-							<el-input v-model="state.ruleForm.timeLimitName" placeholder="请填写配置名称" clearable max-length="50"></el-input>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="业务名称" prop="workflowObj" :rules="[{ required: true, message: '请选择业务名称', trigger: 'change' }]">
-							<el-select
-								v-model="state.ruleForm.workflowObj"
-								placeholder="请选择业务名称"
-								style="width: calc(100% - 60px)"
-								value-key="key"
-								@change="
-									(val) => {
-										state.ruleForm.workflowCode = val.key;
-										state.ruleForm.workflowName = val.value;
-									}
-								"
-							>
-								<el-option v-for="item in state.moduleOptions" :key="item.key" :label="item.value" :value="item" />
-							</el-select>
-							<el-tooltip placement="top-start" v-if="state.ruleForm.workflowCode === 'Order'">
-								<SvgIcon name="ele-InfoFilled" size="24px" color="var(--el-color-primary)" class="ml15" />
-								<template #content>
-									说明:时限计算优先级依次为指定优先级、组合、时限最短。<br />
-									若已配置指定参数优先级的,则先按指定的优先级计算办理期限;
-									<br />无指定优先级的,默认按组合最短时限计算办理期限;<br />
-									无组合配置的,则默认按已配置的参数最短时限计算办理期限;未配置时限的参数,默认为无时限要求。
-								</template>
-							</el-tooltip>
-						</el-form-item>
-					</el-col>
-				</el-row>
-			</el-form>
-			<el-collapse
-				v-model="state.collapseArr"
-				class="collapse-box mt20"
-				style="border-top: none"
-				v-loading="state.loading"
-				v-if="state.ruleForm.workflowCode === 'Order'"
-			>
-				<p class="border-title mb10">参数信息</p>
-				<!-- 参数多选 -->
-				<div class="pl20 pr20">
-					<el-checkbox-group v-model="state.parameterList" class="pd20">
-						<el-row>
-							<el-col v-for="(item, index) in state.baseData" :key="index" :xs="24" :sm="8" :md="8" :lg="6" :xl="4">
-								<el-checkbox :label="item" @change="(val) => parameterChange(val, item)">{{ item.name }}</el-checkbox>
-							</el-col>
-						</el-row>
-					</el-checkbox-group>
-					<el-collapse-item name="1">
-						<template #title>
-							<p class="pl10">
-								<b class="font14">已选参数</b>
-							</p>
-						</template>
-						<div class="parameter pl20 pr20">
-							<!-- 已选列表 -->
-							<div class="mt20 parameter-choose">
-								<el-row>
-									<el-col v-for="(item, index) in state.paramArr" :key="index" :xs="24" :sm="8" :md="8" :lg="6" :xl="4">
-										<div class="parameter-choose-one text-no-wrap" :class="{ active: item.active }" @click="chooseParameter(item)">
-											{{ item.name }}<span v-if="item.paramValue.length">({{ item.paramValue.length }})</span>
-										</div>
-									</el-col>
-								</el-row>
-							</div>
-							<!-- 参数表格 -->
-							<el-table :data="state.currentParam.paramValue" class="mt20" v-if="state.currentParam">
-								<el-table-column :label="state.currentParam.name" prop="paramTypeValue">
-									<template #default="{ row }">
-										<template v-if="state.currentParam.typeCode === 'HotPots'">
-											<el-tree-select
-												class="w100"
-												v-model="row.paramTypeValue"
-												filterable
-												placeholder="请选择热点分类"
-												:props="HotspotProps"
-												lazy
-												:load="load"
-												node-key="id"
-												check-strictly
-												:render-after-expand="false"
-												@node-click="
-													(val, e) => {
-														state.hotspotExternal = [];
-														state.external = [];
-														row.paramTypeName = val.hotSpotFullName;
-														state.hotspotExternal = getParentId(e, state.external);
-														row.hotParamParent = getParentId(e, state.external).join(',');
-													}
-												"
-												:default-expanded-keys="state.hotspotExternal"
-											/>
-										</template>
-										<template v-else>
-											<el-select
-												v-model="row.paramTypeObj"
-												:placeholder="'请选择' + state.currentParam.name"
-												value-key="key"
-												class="w100"
-												@change="
-													(val) => {
-														row.paramTypeValue = val.key;
-														row.paramTypeName = val.value;
-														getSelectedParam();
-														getEnableAcceptType();
-													}
-												"
-											>
-												<el-option v-for="item in state.selectArray" :key="item.key" :label="item.value" :value="item" :disabled="item.disabled" />
-											</el-select>
-										</template>
-									</template>
-								</el-table-column>
-								<el-table-column label="时限" prop="name">
-									<template #default="{ row }">
-										<el-input-number
-											v-model="row.timeLimitValue"
-											:min="1"
-											@change="
-												(val) => {
-													getSelectedParam();
-													getEnableAcceptType();
-													if (row.timeLimitType !== 1) row.hour = val * 24;
-													else row.hour = val;
-												}
-											"
-											placeholder="请填写时限"
-											class="w100"
-										></el-input-number>
-									</template>
-								</el-table-column>
-								<el-table-column label="单位" prop="name">
-									<template #default="{ row }">
-										<el-select
-											v-model="row.hourObj"
-											placeholder="请选择单位"
-											class="w100"
-											value-key="key"
-											@change="
-												(val) => {
-													row.timeLimitType = val.key;
-													if (val.key !== 1) row.hour = row.timeLimitValue * 24;
-													else row.hour = row.timeLimitValue;
-													row.timeLimitTypeName = val.value;
-													getSelectedParam();
-													getEnableAcceptType();
-												}
-											"
-										>
-											<el-option v-for="item in state.timeType" :key="item.key" :label="item.value" :value="item" />
-										</el-select>
-									</template>
-								</el-table-column>
-								<el-table-column align="center" width="100">
-									<template #header>
-										<el-button type="primary" @click="handleAdd"> 新增 </el-button>
-									</template>
-									<template #default="scope">
-										<el-button @click="handleDelete(scope.row, scope.$index)" type="danger" text>删除</el-button>
-									</template>
-								</el-table-column>
-							</el-table>
-							<div class="mt20"></div>
-						</div>
-					</el-collapse-item>
-					<el-collapse-item name="2">
-						<template #title>
-							<p class="pl10">
-								<b class="font14">已配置参数</b>
-							</p>
-						</template>
-						<div class="parameter-stop pd20">
-							<el-row>
-								<el-col v-for="(item, index) in state.paramSelect" :key="index" :xs="24" :sm="8" :md="8" :lg="6" :xl="4" :title="item.name">
-									<div class="parameter-stop-one text-no-wrap mb10" :class="{ active: item.active }" @click="selectParameter(item)">
-										{{ item.name }}
-									</div>
-								</el-col>
-							</el-row>
-						</div>
-					</el-collapse-item>
-					<el-collapse-item name="3">
-						<template #title>
-							<p class="flex-center-align pl10">
-								<b class="font14">指定优先级</b>
-								<el-tooltip placement="top-start" content="选中已配置参数,可自定义优先级,参数越靠前优先级越高。" trigger="hover">
-									<SvgIcon name="ele-QuestionFilled" size="16px" color="var(--el-color-info)" class="ml5"></SvgIcon>
-								</el-tooltip>
-							</p>
-						</template>
-						<div class="pd20">
-							<draggable-list :list="state.priority" :force-fallback="true" animation="300" @end="onEnd" itemKey="id" class="parameter-sort">
-								<template #item="item">
-									<div class="parameter-sort-one" :title="item.element.timeLimitValue">
-										<el-tag class="mr20"> {{ item.index + 1 }}. {{ item.element.name }} </el-tag>
-									</div>
-								</template>
-							</draggable-list>
-						</div>
-					</el-collapse-item>
-				</div>
-			</el-collapse>
-			<p class="border-title mb10 mt20" v-if="state.ruleForm.workflowCode === 'Order'">参数组合</p>
-			<!-- 组合参数表格 -->
-			<div class="pd20" v-if="state.ruleForm.workflowCode === 'Order'">
-				<el-table :data="state.combination">
-					<el-table-column label="组合名称" prop="combinationName">
-						<template #default="{ row }">
-							<el-input v-model="row.combinationName" placeholder="请填写组合名称" class="w100" max-length="30"></el-input>
-						</template>
-					</el-table-column>
-					<el-table-column label="参数" prop="combinationDisplayParam">
-						<template #default="{ row }">
-							<div class="flex-center-align">
-								<span class="omit text-no-wrap" :title="row.combinationDisplayParam">{{ row.combinationDisplayParam }}</span>
-								<el-button class="ml3" text title="配置参数" type="primary" @click="chooseCombination(row)">
-									<SvgIcon name="ele-Edit" size="16px" />
-								</el-button>
-							</div>
-						</template>
-					</el-table-column>
-					<el-table-column label="时限" prop="timeLimitValue">
-						<template #default="{ row }">
-							<el-input-number
-								v-model="row.timeLimitValue"
-								:min="1"
-								placeholder="请填写时限"
-								class="w100"
-								@change="
-									(val) => {
-										if (row.timeLimit !== 1) row.hour = val * 24;
-										else row.hour = val;
-									}
-								"
-							></el-input-number>
-						</template>
-					</el-table-column>
-					<el-table-column label="单位" prop="hourObj">
-						<template #default="{ row }">
-							<el-select
-								v-model="row.hourObj"
-								value-key="key"
-								placeholder="请选择单位"
-								class="w100"
-								@change="
-									(val) => {
-										row.timeLimit = val.key;
-										if (val.key !== 1) row.hour = row.timeLimitValue * 24;
-										else row.hour = row.timeLimitValue;
-										row.timeLimitTypeName = val.value;
-									}
-								"
-							>
-								<el-option v-for="item in state.timeType" :key="item.key" :label="item.value" :value="item" />
-							</el-select>
-						</template>
-					</el-table-column>
-					<el-table-column align="center" width="100">
-						<template #header>
-							<el-button type="primary" @click="combinationAdd"> 新增 </el-button>
-						</template>
-						<template #default="scope">
-							<el-button @click="combinationDelete(scope.row, scope.$index)" type="danger" text>删除</el-button>
-						</template>
-					</el-table-column>
-				</el-table>
-			</div>
-
-			<template #footer>
-				<span class="dialog-footer">
-					<el-button @click="onSubmit(ruleFormRef)" class="default-button">暂 存</el-button>
-					<el-button type="primary" @click="onConfirm(ruleFormRef)">确 定</el-button>
-				</span>
-			</template>
-		</el-dialog>
-		<el-dialog v-model="state.paramDialog" width="700" draggable title="参数选择">
-			<el-form :model="state.paramForm" ref="paramFormRef" label-width="100px">
-				<el-row :gutter="5">
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="受理类型" prop="acceptType" :rules="[{ required: false, message: '请选择受理类型', trigger: 'change' }]">
-							<el-select
-								v-model="state.paramForm.acceptType"
-								placeholder="请选择受理类型"
-								class="w100"
-								value-key="key"
-								clearable
-								@clear="clearCombinationParam('AcceptType')"
-							>
-								<el-option v-for="item in state.result.acceptType" :key="item.key" :label="item.value" :value="item" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="热点分类" prop="hotspot" :rules="[{ required: false, message: '请选择热点分类', trigger: 'change' }]">
-							<el-tree-select
-								class="w100"
-								v-model="state.paramForm.hotspot"
-								filterable
-								placeholder="请选择热点分类"
-								:props="HotspotProps"
-								lazy
-								:load="load"
-								node-key="id"
-								check-strictly
-								:render-after-expand="false"
-								@node-click="getComHotspot"
-								ref="hotspotComRef"
-								:default-expanded-keys="state.hotspotExternalCom"
-								clearable
-								@clear="clearCombinationParam('HotPots')"
-							/>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="来源渠道" prop="sourceChannel" :rules="[{ required: false, message: '请选择来源渠道', trigger: 'change' }]">
-							<el-select
-								v-model="state.paramForm.sourceChannel"
-								placeholder="请选择来源渠道"
-								class="w100"
-								value-key="key"
-								filterable
-								clearable
-								@clear="clearCombinationParam('SourceChannel')"
-							>
-								<el-option v-for="item in state.result.sourceChannel" :key="item.key" :label="item.value" :value="item" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="来电人身份" prop="identityType" :rules="[{ required: false, message: '请选择来电人身份', trigger: 'change' }]">
-							<el-select
-								v-model="state.paramForm.identityType"
-								placeholder="请选择来电人身份"
-								class="w100"
-								value-key="key"
-								filterable
-								clearable
-								@clear="clearCombinationParam('IdentityType')"
-							>
-								<el-option v-for="item in state.result.identityType" :key="item.key" :label="item.value" :value="item" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="工单类型" prop="orderType" :rules="[{ required: false, message: '请选择工单类型', trigger: 'change' }]">
-							<el-select
-								v-model="state.paramForm.orderType"
-								placeholder="请选择工单类型"
-								class="w100"
-								value-key="key"
-								filterable
-								clearable
-								@clear="clearCombinationParam('OrderType')"
-							>
-								<el-option v-for="item in state.result.orderType" :key="item.key" :label="item.value" :value="item" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="证件类型" prop="certType" :rules="[{ required: false, message: '请选择证件类型类', trigger: 'change' }]">
-							<el-select
-								v-model="state.paramForm.certType"
-								placeholder="请选择证件类型"
-								class="w100"
-								value-key="dicDataValue"
-								filterable
-								clearable
-								@clear="clearCombinationParam('LicenceType')"
-							>
-								<el-option v-for="item in state.result.certType" :key="item.dicDataValue" :label="item.dicDataName" :value="item" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="紧急程度" prop="emergencyLevel" :rules="[{ required: false, message: '请选择紧急程度', trigger: 'change' }]">
-							<el-select
-								v-model="state.paramForm.emergencyLevel"
-								placeholder="请选择紧急程度"
-								class="w100"
-								value-key="key"
-								filterable
-								clearable
-								@clear="clearCombinationParam('EmergencyLevel')"
-							>
-								<el-option v-for="item in state.result.emergencyLevel" :key="item.key" :label="item.value" :value="item" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<!-- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="默认参数" prop="emergencyLevel" :rules="[{ required: false, message: '请选择默认参数', trigger: 'change' }]">
-							<el-select v-model="state.paramForm.emergencyLevel" placeholder="请选择默认参数" class="w100" value-key="key" filterable clearable>
-								<el-option v-for="item in state.result.emergencyLevel" :key="item.key" :label="item.value" :value="item" @clear="clearCombinationParam('EmergencyLevel')" />
-							</el-select>
-						</el-form-item>
-					</el-col> -->
-				</el-row>
-			</el-form>
-			<template #footer>
-				<span class="dialog-footer">
-					<el-button class="default-button" @click="state.paramDialog = false">取 消</el-button>
-					<el-button type="primary" @click="onConfirmCom">确 定</el-button>
-				</span>
-			</template>
-		</el-dialog>
-	</div>
-</template>
-
-<script lang="ts" setup name="addTimeLimit">
-import { ref, reactive } from 'vue';
-import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
-import { guid } from '@/utils/tools';
-import { removeDuplicate } from '@/utils/arrayOperation';
-import other from '@/utils/other';
-import DraggableList from 'vuedraggable';
-import { hotSpotType } from '@/api/business/order';
-import { timeLimitAdd, timeLimitUpdate } from '@/api/system/timeLimit';
-// 定义子组件向父组件传值/事件
-const emit = defineEmits(['updateList', 'openDialog', 'closeDialog']);
-const paramTypeNameType: any = {
-	AcceptType: '受理类型',
-	HotPots: '热点分类',
-	SourceChannel: '来源渠道',
-	IdentityType: '来电人身份',
-	OrderType: '工单类型',
-	LicenceType: '证件类型',
-	EmergencyLevel: '紧急程度',
-	DefaultTime: '默认参数',
-};
-// 定义变量内容
-const ruleFormRef = ref<RefType>();
-const state = reactive<any>({
-	ruleForm: {},
-	paramForm: {},
-	paramDialog: false,
-	dialogVisible: false,
-	baseData: [], // 基础数据
-	parameterList: [], //选择基础数据
-	paramArr: [], //参数列表信息
-	currentParam: null as any, // 当前参数
-	collapseArr: ['1', '2', '3', '4'], //展开列表
-	result: {}, //所有基础数据
-	timeType: [], // 单位
-	moduleOptions: [], // 业务名称
-	selectArray: [], // 可选数据
-	paramSelect: [], // 已配置的数据 (可选择)
-	priority: [], // 排序参数
-	combination: [], // 组合
-	hotspotExternal: [], // 热点分类展开
-	external: [],
-	hotspotExternalCom: [], // 组合热点分类展开
-	externalCom: [],
-	timeLimitId: null as any,
-});
-
-// 热点分类远程搜索
-const HotspotProps = {
-	label: 'hotSpotFullName',
-	children: 'children',
-	isLeaf: 'isLeaf',
-};
-// 热点分类懒加载
-const load = async (node: any, resolve: any) => {
-	if (node.isLeaf) return resolve([]);
-	const res: any = await hotSpotType({ id: node.data.id ? node.data.id : '' });
-	resolve(res.result);
-};
-// 递归查找父级Id
-const getParentId = (val: any, arr: string[]) => {
-	if (val.data.parentId) {
-		arr.push(val.data.parentId);
-		getParentId(val.parent, arr);
-	}
-	return arr;
-};
-const resetState = () => {
-	state.parameterList = [];
-	state.paramArr = [];
-	state.currentParam = null;
-	state.selectArray = [];
-	state.paramSelect = [];
-	state.priority = [];
-	state.combination = [];
-	state.hotspotExternal = [];
-	state.external = [];
-	state.hotspotExternalCom = [];
-	state.externalCom = [];
-};
-const openDialog = (baseData: any) => {
-	state.ruleForm.workflowCode = '';
-	const { baseData: stateBaseData = [], timeType = [], moduleOptions = [] } = baseData;
-	state.result = baseData;
-	state.baseData = stateBaseData; //基础数据
-	state.timeType = timeType; //单位
-	state.moduleOptions = moduleOptions; //业务名称
-	resetState();
-	ruleFormRef.value?.resetFields();
-	state.dialogVisible = true;
-	emit('openDialog');
-};
-// 关闭弹窗
-const closeDialog = () => {
-	state.dialogVisible = false;
-	emit('closeDialog');
-};
-// 选择参数
-const parameterChange = (value: string | number | boolean, item: any) => {
-	let arr: any = other.deepClone(state.parameterList);
-	state.paramArr = arr.map((v: any) => {
-		let j = state.paramArr.find((j: any) => j.paramType === v.typeCode);
-		if (j) {
-			v.paramValue = j.paramValue;
-		}
-		return {
-			...v,
-			paramType: v.typeCode,
-			paramValue: v.paramValue ?? [],
-		};
-	});
-	if (value) {
-		//新增选中新增的
-		chooseParameter(item);
-	} else {
-		// 取消选中最后一个
-		chooseParameter(state.paramArr[state.paramArr.length - 1]);
-	}
-};
-// 选择参数 切换当前
-const chooseParameter = (item: any) => {
-	switch (item?.typeCode) {
-		case 'AcceptType':
-			state.selectArray = state.result.acceptType;
-			break;
-		case 'HotPots': // 热点
-			state.selectArray = [];
-			break;
-		case 'SourceChannel':
-			state.selectArray = state.result.sourceChannel;
-			break;
-		case 'IdentityType':
-			state.selectArray = state.result.identityType;
-			break;
-		case 'OrderType':
-			state.selectArray = state.result.orderType;
-			break;
-		case 'LicenceType': //证件类型
-			state.selectArray = state.result.certType.map((item: any) => {
-				return {
-					key: item.dicDataValue,
-					value: item.dicDataName,
-				};
-			});
-			break;
-		case 'EmergencyLevel':
-			state.selectArray = state.result.emergencyLevel;
-			break;
-		case 'DefaultTime': //默认参数
-			state.selectArray = [];
-			break;
-		default:
-			break;
-	}
-	// state.selectArray = state.result[state.currentParam.typeCode];
-	state.paramArr.forEach((v: any) => {
-		v.active = item.typeCode === v.paramType;
-	});
-	state.currentParam = state.paramArr.find((v: any) => v.paramType === item?.typeCode);
-	getEnableAcceptType();
-	getSelectedParam();
-};
-// 新增
-const handleAdd = () => {
-	state.currentParam.paramValue.push({
-		id: guid(),
-		paramType: state.currentParam.paramType,
-		paramTypeName: '',
-		paramTypeValue: '',
-		timeLimitValue: 1,
-		hour: '',
-	});
-	getEnableAcceptType();
-	getSelectedParam();
-};
-// 删除
-const handleDelete = (row: any, index: number) => {
-	ElMessageBox.confirm(`确定要删除?`, '提示', {
-		confirmButtonText: '确定',
-		cancelButtonText: '取消',
-		type: 'warning',
-		draggable: true,
-		cancelButtonClass: 'default-button',
-	})
-		.then(() => {
-			state.currentParam.paramValue.splice(index, 1);
-			getEnableAcceptType();
-			getSelectedParam();
-		})
-		.catch(() => {});
-};
-// 获取可用的数组
-const getEnableAcceptType = () => {
-	if (state.currentParam?.paramValue.length) {
-		const array = state.currentParam.paramValue.map((v: any) => v.paramTypeValue);
-		state.selectArray.forEach((v: any) => {
-			v.disabled = array.includes(v.key);
-		});
-	}
-};
-// 获取已经配置的列表
-const getSelectedParam = () => {
-	const arr = state.paramArr.flatMap((i: any) => i.paramValue).filter((j: any) => j.paramTypeName && j.id && j.timeLimitType);
-	state.paramSelect = arr.map((v: any) => {
-		const { id } = v;
-		const selected = state.paramSelect.find((j: any) => j.id === id);
-		return {
-			...v,
-			active: selected?.active ?? false,
-			name: paramTypeNameType[v.paramType] + '-' + v.paramTypeName,
-		};
-	});
-};
-// 选择已配置的
-const selectParameter = (item: any) => {
-	state.paramSelect.forEach((v: any) => {
-		if (item.id === v.id) {
-			v.active = !v.active;
-		}
-	});
-	// 排序数组
-	state.priority = state.paramSelect.filter((v: any) => {
-		return v.active;
-	});
-	state.priority = state.priority.map((item: any, index: number) => {
-		return {
-			...item,
-			sort: index,
-			code: item.id,
-		};
-	});
-};
-//结束拖拽事件
-const onEnd = () => {
-	state.priority = state.priority.map((item: any, index: number) => {
-		return {
-			...item,
-			sort: index,
-			code: item.id,
-		};
-	});
-};
-// 新增组合
-const combinationAdd = () => {
-	state.combination.push({
-		id: guid(),
-		combinationName: '',
-		combinationDisplayParam: '',
-		combinationParam: [],
-		timeLimitValue: 1,
-		hour: '',
-	});
-};
-// 删除组合
-const combinationDelete = (row: any, index: number) => {
-	ElMessageBox.confirm(`确定要删除?`, '提示', {
-		confirmButtonText: '确定',
-		cancelButtonText: '取消',
-		type: 'warning',
-		draggable: true,
-		cancelButtonClass: 'default-button',
-	})
-		.then(() => {
-			state.combination.splice(index, 1);
-			getEnableAcceptType();
-			getSelectedParam();
-		})
-		.catch(() => {});
-};
-// 选择组合参数
-const chooseCombination = (row: any) => {
-	state.paramForm = row;
-	state.paramDialog = true;
-};
-// 选择组合热点
-const getComHotspot = (val: any, e: any) => {
-	state.hotspotExternalCom = [];
-	state.externalCom = [];
-	state.hotspotExternalCom = getParentId(e, state.externalCom);
-	state.paramForm.hotspotSpliceName = val.hotSpotFullName;
-};
-// 删除组合参数
-const clearCombinationParam = (val: any) => {
-	let item = state.combination.find((item: any) => item.id === state.paramForm.id);
-	item.combinationParam = item.combinationParam.filter((v: any) => v.paramType !== val);
-};
-// 参数组合确定
-const onConfirmCom = () => {
-	let comName: string[] = [];
-	let item = state.combination.find((item: any) => item.id === state.paramForm.id);
-	if (item) {
-		if (item.acceptType?.value) {
-			item.combinationParam.push({
-				paramName: item.acceptType.value,
-				paramValue: item.acceptType.key,
-				hotParamParent: '',
-				paramType: 'AcceptType',
-			});
-			comName.push(`受理类型-${item.acceptType.value}`);
-		}
-		if (item?.hotspot) {
-			item.combinationParam.push({
-				paramName: item.hotspotSpliceName,
-				paramValue: item.hotspot,
-				hotParamParent: state.hotspotExternalCom.join(','),
-				paramType: 'HotPots',
-			});
-			comName.push(`热点分类-${item.hotspotSpliceName}`);
-		}
-		if (item.identityType?.value) {
-			item.combinationParam.push({
-				paramName: item.identityType.value,
-				paramValue: item.identityType.key,
-				hotParamParent: '',
-				paramType: 'IdentityType',
-			});
-			comName.push(`来电人身份-${item.identityType.value}`);
-		}
-		if (item.sourceChannel?.value) {
-			item.combinationParam.push({
-				paramName: item.sourceChannel.value,
-				paramValue: item.sourceChannel.key,
-				hotParamParent: '',
-				paramType: 'SourceChannel',
-			});
-			comName.push(`来源渠道-${item.sourceChannel.value}`);
-		}
-		if (item.orderType?.value) {
-			item.combinationParam.push({
-				paramName: item.orderType.value,
-				paramValue: item.orderType.key,
-				hotParamParent: '',
-				paramType: 'OrderType',
-			});
-			comName.push(`工单类型-${item.orderType.value}`);
-		}
-		if (item.certType?.dicDataName) {
-			item.combinationParam.push({
-				paramName: item.certType.dicDataName,
-				paramValue: item.certType.dicDataValue,
-				hotParamParent: '',
-				paramType: 'LicenceType',
-			});
-			comName.push(`证件类型-${item.certType.dicDataName}`);
-		}
-		if (item.emergencyLevel?.value) {
-			item.combinationParam.push({
-				paramName: item.emergencyLevel.value,
-				paramValue: item.emergencyLevel.key,
-				hotParamParent: '',
-				paramType: 'EmergencyLevel',
-			});
-			comName.push(`紧急程度-${item.emergencyLevel.value}`);
-		}
-		// if(state.paramForm.emergencyLevel.value){
-		// 	state.paramForm.push({
-		// 		paramName:state.paramForm.emergencyLevel.value,
-		// 		paramValue:state.paramForm.emergencyLevel.key,
-		// 		hotParamParent:'',
-		// 		paramType:'EmergencyLevel'
-		// 	})
-		// 	comName+=`默认参数-${state.paramForm.emergencyLevel.value}&`;
-		// }
-	}
-	state.paramForm.hotParamParent = state.hotspotExternalCom.join(',');
-	item.combinationParam = removeDuplicate(item.combinationParam, 'paramType');
-	if (item.combinationParam.length < 2) {
-		ElMessageBox.alert('一个组合中至少包含两个参数', '提示', {
-			confirmButtonText: '确定',
-		});
-		return;
-	}
-	item.combinationDisplayParam = comName.join('&');
-	state.paramDialog = false;
-};
-// 定义一个函数来检查某个属性是否存在,如果不存在就给出提示信息,并返回false
-const checkProperty = (obj: any, property: string, message: string) => {
-	if (!obj[property]) {
-		ElMessage.warning(message);
-		return false;
-	}
-	return true;
-};
-// 暂存
-const onSubmit = async (formEl: FormInstance | undefined) => {
-	if (!formEl) return;
-	await formEl.validate((valid: boolean) => {
-		if (!valid) return;
-		let arr: any = [];
-		for (let i of state.paramArr) {
-			if (i.paramValue.length) {
-				for (let j of i.paramValue) {
-					// 检查paramTypeName是否存在
-					if (!checkProperty(j, 'paramTypeName', `请选择${i.name}`)) return;
-					// 检查timeLimitValue是否存在
-					if (!checkProperty(j, 'timeLimitValue', `请填写${i.name}的时限`)) return;
-					// 检查timeLimitType是否存在
-					if (!checkProperty(j, 'timeLimitType', `请选择${i.name}的单位`)) return;
-					arr.push(j);
-				}
-			}
-		}
-		if (!arr.length) {
-			ElMessage.warning(`请选择参数`);
-			return;
-		}
-		for (let i of state.combination) {
-			// 检查combinationName是否存在
-			if (!checkProperty(i, 'combinationName', `请填写组合名称`)) return;
-			// 检查combinationDisplayParam是否存在
-			if (!checkProperty(i, 'combinationDisplayParam', `请选择组合参数`)) return;
-			if (i.combinationParam.length.length < 2) {
-				ElMessageBox.alert('一个组合中至少包含两个参数', '提示', {
-					confirmButtonText: '确定',
-				});
-				return;
-			}
-			// 检查timeLimitValue是否存在
-			if (!checkProperty(i, 'timeLimitValue', `请填写时限`)) return;
-			// 检查timeLimit是否存在或者为0
-			if (!checkProperty(i, 'timeLimit', `请选择组合单位`)) return;
-		}
-		let req = {
-			...state.ruleForm,
-			paramArr: arr,
-			priority: state.priority,
-			combination: state.combination,
-		};
-		if (state.timeLimitId) {
-			req.id = state.timeLimitId;
-			timeLimitUpdate(req).then(() => {
-				ElMessage.success('操作成功');
-				emit('updateList');
-				state.dialogVisible = false;
-			});
-		} else {
-			timeLimitAdd(req).then((res: any) => {
-				state.timeLimitId = res.result;
-				emit('updateList');
-				ElMessage.success('操作成功');
-			});
-		}
-	});
-};
-// 确定
-const onConfirm = async (formEl: FormInstance | undefined) => {
-	if (!formEl) return;
-	await formEl.validate((valid: boolean) => {
-		if (!valid) return;
-		let arr: any = [];
-		for (let i of state.paramArr) {
-			if (i.paramValue.length) {
-				for (let j of i.paramValue) {
-					// 检查paramTypeName是否存在
-					if (!checkProperty(j, 'paramTypeName', `请选择${i.name}`)) return;
-					// 检查timeLimitValue是否存在
-					if (!checkProperty(j, 'timeLimitValue', `请填写${i.name}的时限`)) return;
-					// 检查timeLimitType是否存在
-					if (!checkProperty(j, 'timeLimitType', `请选择${i.name}的单位`)) return;
-					arr.push(j);
-				}
-			}
-		}
-		if (!arr.length) {
-			ElMessage.warning(`请选择参数`);
-			return;
-		}
-		for (let i of state.combination) {
-			// 检查combinationName是否存在
-			if (!checkProperty(i, 'combinationName', `请填写组合名称`)) return;
-			// 检查combinationDisplayParam是否存在
-			if (!checkProperty(i, 'combinationDisplayParam', `请选择组合参数`)) return;
-			if (i.combinationParam.length.length < 2) {
-				ElMessageBox.alert('一个组合中至少包含两个参数', '提示', {
-					confirmButtonText: '确定',
-				});
-				return;
-			}
-			// 检查timeLimitValue是否存在
-			if (!checkProperty(i, 'timeLimitValue', `请填写时限`)) return;
-			// 检查timeLimit是否存在或者为0
-			if (!checkProperty(i, 'timeLimit', `请选择组合单位`)) return;
-		}
-		let req = {
-			...state.ruleForm,
-			paramArr: arr,
-			priority: state.priority,
-			combination: state.combination,
-		};
-		if (state.timeLimitId) {
-			// 更新
-			req.id = state.timeLimitId;
-			timeLimitUpdate(req).then(() => {
-				ElMessage.success('操作成功');
-				emit('updateList');
-				state.dialogVisible = false;
-			});
-		} else {
-			// 新增
-			timeLimitAdd(req).then((res: any) => {
-				state.timeLimitId = res.result;
-				ElMessage.success('操作成功');
-				emit('updateList');
-				state.dialogVisible = false;
-			});
-		}
-	});
-};
-//暴漏变量和方法
-defineExpose({ closeDialog, openDialog });
-</script>
-<style lang="scss" scoped>
-.system-timeLimit-add-container {
-	.collapse-box {
-		:deep(.el-collapse-item__header) {
-			background-color: var(--hotline-bg-main-color);
-			height: 40px;
-			border-radius: var(--el-border-radius-base);
-		}
-		:deep(.el-collapse-item__content) {
-			padding-bottom: 0 !important;
-			.el-form-item {
-				margin-bottom: 5px;
-				.el-form-item__content {
-					line-height: 24px;
-				}
-			}
-		}
-		.collapse-container {
-			padding: 10px;
-			.plug-container {
-				border: var(--el-border);
-				border-radius: var(--el-border-radius-base);
-				margin-bottom: 15px;
-				&:last-child {
-					margin-bottom: 0;
-				}
-				.plug-container-title {
-					padding: 10px 15px;
-					font-weight: bold;
-					border-bottom: var(--el-border);
-					font-size: var(--el-font-size-medium);
-				}
-			}
-		}
-	}
-	:deep(.el-collapse-item__wrap) {
-		border-bottom: 0;
-	}
-	:deep(.el-collapse) {
-		border-bottom: 0;
-	}
-	:deep(.el-tabs__nav-wrap::after) {
-		height: 100% !important;
-	}
-	.parameter-choose {
-		&-one {
-			cursor: pointer;
-			text-align: center;
-			height: 34px;
-			line-height: 34px;
-			color: var(--el-color-primary);
-			width: calc(100% - 10px);
-			padding: 0 5px;
-			border: 1px solid transparent;
-		}
-		.active {
-			border: 1px solid var(--el-color-primary);
-			border-radius: var(--el-border-radius-base);
-		}
-	}
-	.parameter-stop {
-		&-one {
-			cursor: pointer;
-			text-align: center;
-			height: 34px;
-			line-height: 34px;
-			width: calc(100% - 10px);
-			padding: 0 5px;
-		}
-		.active {
-			border: 1px solid var(--el-color-primary);
-			border-radius: var(--el-border-radius-base);
-			color: var(--el-color-primary);
-		}
-	}
-	.parameter-sort {
-		display: flex;
-		flex-wrap: wrap;
-		&-one {
-			cursor: pointer;
-			text-align: center;
-			height: 34px;
-			line-height: 34px;
-		}
-	}
-	.omit {
-		display: inline-block;
-	}
-}
-</style>

+ 0 - 479
src/views/system/config/timeLimit/component/Time-limit-detail.vue

@@ -1,479 +0,0 @@
-<template>
-	<div class="system-timeLimit-add-container">
-		<el-dialog v-model="state.dialogVisible" width="60%" draggable title="时限详情">
-			<div v-loading="state.loading">
-				<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="100px" scroll-to-error>
-					<el-row :gutter="5">
-						<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-							<el-form-item label="配置名称" prop="timeLimitName">
-								{{ state.ruleForm.timeLimitName }}
-							</el-form-item>
-						</el-col>
-						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="8">
-							<el-form-item label="业务名称" prop="workflowObj">
-								{{ state.ruleForm.workflowName }}
-								<template v-if="state.ruleForm.workflowCode === 'Order'">
-									<el-tooltip placement="top-start">
-										<SvgIcon name="ele-InfoFilled" class="ml5" size="24px" color="var(--el-color-primary)" />
-										<template #content>
-											说明:时限计算优先级依次为指定优先级、组合、时限最短。<br />
-											若已配置指定参数优先级的,则先按指定的优先级计算办理期限;
-											<br />无指定优先级的,默认按组合最短时限计算办理期限;<br />
-											无组合配置的,则默认按已配置的参数最短时限计算办理期限;未配置时限的参数,默认为无时限要求。
-										</template>
-									</el-tooltip>
-								</template>
-							</el-form-item>
-						</el-col>
-						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="8">
-							<el-form-item label="状态" prop="workflowObj">
-								{{ state.ruleForm.workflowName }}
-							</el-form-item>
-						</el-col>
-						<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="8">
-							<el-form-item label="创建人" prop="workflowObj">
-								{{ state.ruleForm.workflowName }}
-							</el-form-item>
-						</el-col>
-					</el-row>
-				</el-form>
-				<el-collapse v-model="state.collapseArr" class="collapse-box" v-loading="state.loading" v-if="state.ruleForm.workflowCode === 'Order'">
-					<el-collapse-item name="1">
-						<template #title>
-							<p class="pl10">
-								<b class="font14">参数信息</b>
-							</p>
-						</template>
-						<div class="parameter pl20 pr20">
-							<!-- 已选列表 -->
-							<div class="mt20 parameter-choose">
-								<el-row>
-									<el-col v-for="(item, index) in state.paramArr" :key="index" :xs="24" :sm="8" :md="8" :lg="6" :xl="4">
-										<div class="parameter-choose-one text-no-wrap" :class="{ active: item.active }" @click="chooseParameter(item)">
-											{{ item.name }}<span v-if="item.paramValue.length">({{ item.paramValue.length }})</span>
-										</div>
-									</el-col>
-								</el-row>
-							</div>
-							<!-- 参数表格 -->
-							<el-table :data="state.currentParam.paramValue" class="mt20" v-if="state.currentParam">
-								<el-table-column :label="state.currentParam.name" prop="paramTypeValue" align="center" show-overflow-tooltip>
-									<template #default="{row}">
-										{{ row.paramTypeName }}
-									</template>
-								</el-table-column>
-								<el-table-column label="时限" prop="timeLimitValue" width="150" align="center">
-									<template #default="{row}">
-										{{ row.timeLimitValue }}
-									</template>
-								</el-table-column>
-								<el-table-column label="单位" prop="timeLimitType" width="150" align="center">
-									<template #default="{row}">
-										{{ row.timeLimitType }}
-									</template>
-								</el-table-column>
-							</el-table>
-						</div>
-						<div class="mt20"></div>
-					</el-collapse-item>
-					<el-collapse-item name="2">
-						<template #title>
-							<p class="pl10">
-								<b class="font14">已配置参数</b>
-							</p>
-						</template>
-						<div class="parameter-stop pd20">
-							<el-row>
-								<el-col v-for="(item, index) in state.paramSelect" :key="index" :xs="24" :sm="8" :md="8" :lg="6" :xl="4" :title="item.name">
-									<div class="parameter-stop-one mb10 text-no-wrap" :class="{ active: item.active }">
-										{{ item.name }}
-									</div>
-								</el-col>
-							</el-row>
-						</div>
-					</el-collapse-item>
-					<el-collapse-item name="3">
-						<template #title>
-							<p class="flex-center-align pl10">
-								<b class="font14">指定优先级</b>
-								<el-tooltip placement="top-start" content="选中已配置参数,可自定义优先级,参数越靠前优先级越高。" trigger="hover">
-									<SvgIcon name="ele-QuestionFilled" size="16px" color="var(--el-color-info)" class="ml5"></SvgIcon>
-								</el-tooltip>
-							</p>
-						</template>
-						<div class="pd20">
-							<div class="parameter-sort">
-								<div v-for="(item, index) in state.priority" :key="index">
-									<div class="parameter-sort-one" :title="item.timeLimitValue">
-										<el-tag class="mr20"> {{ index + 1 }}. {{ item.name }} </el-tag>
-									</div>
-								</div>
-							</div>
-						</div>
-					</el-collapse-item>
-					<p class="pl10 mt20">
-						<b class="font14" style="color: var(--hotline-color-text-main)">参数组合</b>
-					</p>
-					<!-- 组合参数表格 -->
-					<div class="pd20">
-						<el-table :data="state.combination">
-							<el-table-column label="组合名称" prop="combinationName" align="center" width="300">
-								<template #default="{ row }">
-									{{ row.combinationName }}
-								</template>
-							</el-table-column>
-							<el-table-column label="参数" prop="combinationDisplayParam" align="center" width="300">
-								<template #default="{ row }">
-									<div class="flex-center-align">
-										<span class="omit text-no-wrap" :title="row.combinationDisplayParam">{{ row.combinationDisplayParam }}</span>
-										<el-button class="ml3" text title="查看组合详情" type="primary" @click="viewCombination(row)">
-											<SvgIcon name="ele-Document" size="16px" />
-										</el-button>
-									</div>
-								</template>
-							</el-table-column>
-							<el-table-column label="时限" prop="timeLimitValue" align="center">
-								<template #default="{ row }">
-									{{ row.timeLimitValue }}
-								</template>
-							</el-table-column>
-							<el-table-column label="单位" prop="hourObj">
-								<template #default="{ row }">
-									{{ row.timeLimit }}
-								</template>
-							</el-table-column>
-						</el-table>
-					</div>
-				</el-collapse>
-			</div>
-
-			<template #footer>
-				<span class="dialog-footer">
-					<el-button class="default-button" @click="state.dialogVisible = false">关闭</el-button>
-				</span>
-			</template>
-		</el-dialog>
-		<el-dialog v-model="state.paramDialog" draggable title="组合查看">
-			<el-form :model="state.paramForm" ref="paramFormRef" label-width="80px">
-				<el-row :gutter="5">
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="组合名称" prop="combinationName" class="mb10">
-							{{ state.paramForm.combinationName }}
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="参数" prop="combinationDisplayParam" class="mb10">
-							{{ state.paramForm.combinationDisplayParam }}
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="时限" prop="timeLimitValue" class="mb10">
-							{{ state.paramForm.timeLimitValue }} {{ state.paramForm.timeLimit }}
-						</el-form-item>
-					</el-col>
-				</el-row>
-			</el-form>
-		</el-dialog>
-	</div>
-</template>
-
-<script lang="ts" setup name="addTimeLimit">
-import { reactive } from 'vue';
-import { timeLimitDetail } from '@/api/system/timeLimit';
-import { removeDuplicate } from '@/utils/arrayOperation';
-import other from '@/utils/other';
-// 定义子组件向父组件传值/事件
-const emit = defineEmits(['updateList', 'openDialog', 'closeDialog']);
-const paramTypeNameType: any = {
-	AcceptType: '受理类型',
-	HotPots: '热点分类',
-	SourceChannel: '来源渠道',
-	IdentityType: '来电人身份',
-	OrderType: '工单类型',
-	LicenceType: '证件类型',
-	EmergencyLevel: '紧急程度',
-	DefaultTime: '默认参数',
-};
-// 定义变量内容
-const state = reactive<any>({
-	ruleForm: {},
-	paramForm: {},
-	paramDialog: false,
-	dialogVisible: false,
-	baseData: [], // 基础数据
-	parameterList: [], //选择基础数据
-	paramArr: [], //参数列表信息
-	currentParam: null as any, // 当前参数
-	collapseArr: ['1', '2', '3'], //展开列表
-	result: {}, //所有基础数据
-	selectArray: [], // 可选数据
-	paramSelect: [], // 已配置的数据 (可选择)
-	priority: [], // 排序参数
-	combination: [], // 组合
-	loading: false,
-	timeLimitId: null as any,
-});
-// 打开弹窗
-const openDialog = (val: any, baseData: any) => {
-	state.dialogVisible = true;
-	state.loading = true;
-	state.result = baseData; //基础数据
-	state.baseData = baseData.baseData ?? []; //基础数据 复选框
-	state.timeLimitId = val.id;
-	timeLimitDetail(val.id)
-		.then((res: any) => {
-			// 表单数据
-			state.ruleForm.timeLimitName = res.result.timeLimitName;
-			state.ruleForm.workflowObj = {
-				key: res.result.workflowCode,
-				value: res.result.workflowName,
-			};
-			state.ruleForm.workflowCode = res.result.workflowCode;
-			state.ruleForm.workflowName = res.result.workflowName;
-			// 参数
-			for (let i of res.result.paramArr) {
-				for (let j of state.baseData) {
-					if (i.paramType === j.typeCode) {
-						state.parameterList.push({
-							...j,
-						});
-						state.parameterList = removeDuplicate(state.parameterList, 'typeCode');
-						parameterChange(true, j);
-					}
-				}
-				for (let k of state.paramArr) {
-					if (i.paramType === k.paramType) {
-						k.paramValue.push({
-							paramTypeObj: {
-								key: i.paramTypeValue,
-								value: i.paramTypeName,
-							},
-							hourObj: {
-								key: i.timeLimitType,
-							},
-							...i,
-						});
-						if (i.hotParamParent) state.hotspotExternal = i.hotParamParent.split(',');
-					}
-				}
-			}
-			// 配置参数
-			getSelectedParam();
-			for (let i of state.paramSelect) {
-				for (let j of res.result.priority) {
-					if (i.id === j.code) {
-						i.active = true;
-					}
-				}
-			}
-			state.priority = res.result.priority;
-			state.priority = state.priority.map((v: any) => {
-				return {
-					...v,
-					name: paramTypeNameType[v.paramType] + '-' + v.paramTypeName,
-				};
-			});
-
-			// 组合
-			state.combination = res.result.combination;
-			state.combination = state.combination.map((v: any) => {
-				return {
-					...v,
-					hourObj: {
-						key: v.timeLimit,
-					},
-				};
-			});
-
-			state.loading = false;
-		})
-		.catch(() => {
-			state.loading = false;
-			state.dialogVisible = false;
-		});
-};
-// 关闭弹窗
-const closeDialog = () => {
-	state.dialogVisible = false;
-	emit('closeDialog');
-};
-// 选择参数
-const parameterChange = (value: string | number | boolean, item: any) => {
-	let arr: any = other.deepClone(state.parameterList);
-	state.paramArr = arr.map((v: any) => {
-		let j = state.paramArr.find((j: any) => j.paramType === v.typeCode);
-		if (j) {
-			v.paramValue = j.paramValue;
-		}
-		return {
-			...v,
-			paramType: v.typeCode,
-			paramValue: v.paramValue ?? [],
-		};
-	});
-	if (value) {
-		//新增选中新增的
-		chooseParameter(item);
-	} else {
-		// 取消选中最后一个
-		chooseParameter(state.paramArr[state.paramArr.length - 1]);
-	}
-};
-// 选择参数 切换当前
-const chooseParameter = (item: any) => {
-	switch (item?.typeCode) {
-		case 'AcceptType':
-			state.selectArray = state.result.acceptType;
-			break;
-		case 'HotPots': // 热点
-			state.selectArray = [];
-			break;
-		case 'SourceChannel':
-			state.selectArray = state.result.sourceChannel;
-			break;
-		case 'IdentityType':
-			state.selectArray = state.result.identityType;
-			break;
-		case 'OrderType':
-			state.selectArray = state.result.orderType;
-			break;
-		case 'LicenceType': //证件类型
-			state.selectArray = state.result.certType.map((item: any) => {
-				return {
-					key: item.dicDataValue,
-					value: item.dicDataName,
-				};
-			});
-			break;
-		case 'EmergencyLevel':
-			state.selectArray = state.result.emergencyLevel;
-			break;
-		case 'DefaultTime': //默认参数
-			state.selectArray = [];
-			break;
-		default:
-			break;
-	}
-	// state.selectArray = state.result[state.currentParam.typeCode];
-	state.paramArr.forEach((v: any) => {
-		if (item.typeCode === v.paramType) {
-			v.active = true;
-			state.currentParam = v;
-		} else {
-			v.active = false;
-		}
-	});
-	getSelectedParam();
-};
-// 获取已经配置的列表
-// 获取已经配置的列表
-const getSelectedParam = () => {
-	const arr = state.paramArr.flatMap((i: any) => i.paramValue).filter((j: any) => j.paramTypeName && j.id && j.timeLimitType);
-	state.paramSelect = arr.map((v: any) => {
-		const { id } = v;
-		const selected = state.paramSelect.find((j: any) => j.id === id);
-		return {
-			...v,
-			active: selected?.active ?? false,
-			name: paramTypeNameType[v.paramType] + '-' + v.paramTypeName,
-		};
-	});
-};
-// 查看组合参数
-const viewCombination = (row: any) => {
-	state.paramForm = row;
-	state.paramDialog = true;
-};
-//暴漏变量和方法
-defineExpose({ closeDialog, openDialog });
-</script>
-<style lang="scss" scoped>
-.system-timeLimit-add-container {
-	.collapse-box {
-		:deep(.el-collapse-item__header) {
-			background-color: var(--hotline-bg-main-color);
-			height: 40px;
-			border-radius: var(--el-border-radius-base);
-		}
-		:deep(.el-collapse-item__content) {
-			padding-bottom: 0 !important;
-			.el-form-item {
-				margin-bottom: 5px;
-				.el-form-item__content {
-					line-height: 24px;
-				}
-			}
-		}
-		.collapse-container {
-			padding: 10px;
-			.plug-container {
-				border: var(--el-border);
-				border-radius: var(--el-border-radius-base);
-				margin-bottom: 15px;
-				&:last-child {
-					margin-bottom: 0;
-				}
-				.plug-container-title {
-					padding: 10px 15px;
-					font-weight: bold;
-					border-bottom: var(--el-border);
-					font-size: var(--el-font-size-medium);
-				}
-			}
-		}
-	}
-	:deep(.el-collapse-item__wrap) {
-		border-bottom: 0;
-	}
-	:deep(.el-collapse) {
-		border-bottom: 0;
-	}
-	:deep(.el-tabs__nav-wrap::after) {
-		height: 100% !important;
-	}
-	.parameter-choose {
-		&-one {
-			cursor: pointer;
-			text-align: center;
-			height: 34px;
-			line-height: 34px;
-			color: var(--el-color-primary);
-			width: calc(100% - 10px);
-			padding: 0 5px;
-			border: 1px solid transparent;
-		}
-		.active {
-			border: 1px solid var(--el-color-primary);
-			border-radius: var(--el-border-radius-base);
-		}
-	}
-	.parameter-stop {
-		&-one {
-			cursor: pointer;
-			text-align: center;
-			height: 34px;
-			line-height: 34px;
-			width: calc(100% - 10px);
-			padding: 0 5px;
-		}
-		.active {
-			border: 1px solid var(--el-color-success);
-			border-radius: var(--el-border-radius-base);
-			color: var(--el-color-success);
-		}
-	}
-	.parameter-sort {
-		display: flex;
-		flex-wrap: wrap;
-		&-one {
-			cursor: pointer;
-			text-align: center;
-			height: 34px;
-			line-height: 34px;
-		}
-	}
-	.omit {
-		display: inline-block;
-	}
-}
-</style>

+ 0 - 1117
src/views/system/config/timeLimit/component/Time-limit-edit.vue

@@ -1,1117 +0,0 @@
-<template>
-	<div class="system-timeLimit-edit-container">
-		<el-dialog v-model="state.dialogVisible" width="60%" draggable title="新增时限">
-			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="100px" scroll-to-error>
-				<el-row :gutter="5">
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="配置名称" prop="timeLimitName" :rules="[{ required: true, message: '请填写配置名称', trigger: 'blur' }]">
-							<el-input v-model="state.ruleForm.timeLimitName" placeholder="请填写配置名称" clearable max-length="50"></el-input>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="业务名称" prop="workflowObj" :rules="[{ required: true, message: '请选择业务名称', trigger: 'change' }]">
-							<el-select
-								v-model="state.ruleForm.workflowObj"
-								placeholder="请选择业务名称"
-								style="width: calc(100% - 60px)"
-								value-key="key"
-								@change="
-									(val) => {
-										state.ruleForm.workflowCode = val.key;
-										state.ruleForm.workflowName = val.value;
-									}
-								"
-							>
-								<el-option v-for="item in state.moduleOptions" :key="item.key" :label="item.value" :value="item" />
-							</el-select>
-							<el-tooltip placement="top-start" v-if="state.ruleForm.workflowCode === 'Order'">
-								<SvgIcon name="ele-InfoFilled" size="24px" color="var(--el-color-primary)" class="ml15" />
-								<template #content>
-									说明:时限计算优先级依次为指定优先级、组合、时限最短。<br />
-									若已配置指定参数优先级的,则先按指定的优先级计算办理期限;
-									<br />无指定优先级的,默认按组合最短时限计算办理期限;<br />
-									无组合配置的,则默认按已配置的参数最短时限计算办理期限;未配置时限的参数,默认为无时限要求。
-								</template>
-							</el-tooltip>
-						</el-form-item>
-					</el-col>
-				</el-row>
-			</el-form>
-			<el-collapse
-				v-model="state.collapseArr"
-				class="collapse-box mt20"
-				style="border-top: none"
-				v-loading="state.loading"
-				v-if="state.ruleForm.workflowCode === 'Order'"
-			>
-				<p class="border-title mb10">参数信息</p>
-				<!-- 参数多选 -->
-				<div class="pl20 pr20">
-					<el-checkbox-group v-model="state.parameterList" class="pd20">
-						<el-row>
-							<el-col v-for="(item, index) in state.baseData" :key="index" :xs="24" :sm="8" :md="8" :lg="6" :xl="4">
-								<el-checkbox :label="item" @change="(val) => parameterChange(val, item)">{{ item.name }}</el-checkbox>
-							</el-col>
-						</el-row>
-					</el-checkbox-group>
-					<el-collapse-item name="1">
-						<template #title>
-							<p class="pl10">
-								<b class="font14">已选参数</b>
-							</p>
-						</template>
-						<div class="parameter pl20 pr20">
-							<!-- 已选列表 -->
-							<div class="mt20 parameter-choose">
-								<el-row>
-									<el-col v-for="(item, index) in state.paramArr" :key="index" :xs="24" :sm="8" :md="8" :lg="6" :xl="4">
-										<div class="parameter-choose-one text-no-wrap" :class="{ active: item.active }" @click="chooseParameter(item)">
-											{{ item.name }}<span v-if="item.paramValue.length">({{ item.paramValue.length }})</span>
-										</div>
-									</el-col>
-								</el-row>
-							</div>
-							<!-- 参数表格 -->
-							<el-table :data="state.currentParam.paramValue" class="mt20" v-if="state.currentParam">
-								<el-table-column :label="state.currentParam.name" prop="paramTypeValue">
-									<template #default="{ row }">
-										<template v-if="state.currentParam.typeCode === 'HotPots'">
-											<el-tree-select
-												class="w100"
-												v-model="row.paramTypeValue"
-												filterable
-												placeholder="请选择热点分类"
-												:props="HotspotProps"
-												lazy
-												:load="load"
-												node-key="id"
-												check-strictly
-												:render-after-expand="false"
-												@node-click="
-													(val, e) => {
-														state.hotspotExternal = [];
-														state.external = [];
-														row.paramTypeName = val.hotSpotFullName;
-														state.hotspotExternal = getParentId(e, state.external);
-														row.hotParamParent = getParentId(e, state.external).join(',');
-													}
-												"
-												:default-expanded-keys="state.hotspotExternal"
-											/>
-										</template>
-										<template v-else>
-											<el-select
-												v-model="row.paramTypeObj"
-												:placeholder="'请选择' + state.currentParam.name"
-												value-key="key"
-												class="w100"
-												@change="
-													(val) => {
-														row.paramTypeValue = val.key;
-														row.paramTypeName = val.value;
-														getSelectedParams();
-														getEnableAcceptType();
-													}
-												"
-											>
-												<el-option v-for="item in state.selectArray" :key="item.key" :label="item.value" :value="item" :disabled="item.disabled" />
-											</el-select>
-										</template>
-									</template>
-								</el-table-column>
-								<el-table-column label="时限" prop="name">
-									<template #default="{ row }">
-										<el-input-number
-											v-model="row.timeLimitValue"
-											:min="1"
-											@change="
-												(val) => {
-													getSelectedParams();
-													getEnableAcceptType();
-													if (row.timeLimitType !== 1) row.hour = val * 24;
-													else row.hour = val;
-												}
-											"
-											placeholder="请填写时限"
-											class="w100"
-										></el-input-number>
-									</template>
-								</el-table-column>
-								<el-table-column label="单位" prop="name">
-									<template #default="{ row }">
-										<el-select
-											v-model="row.hourObj"
-											placeholder="请选择单位"
-											class="w100"
-											value-key="key"
-											@change="
-												(val) => {
-													row.timeLimitType = val.key;
-													if (val.key !== 1) row.hour = row.timeLimitValue * 24;
-													else row.hour = row.timeLimitValue;
-													row.timeLimitTypeName = val.value;
-													getSelectedParams();
-													getEnableAcceptType();
-												}
-											"
-										>
-											<el-option v-for="item in state.timeType" :key="item.key" :label="item.value" :value="item" />
-										</el-select>
-									</template>
-								</el-table-column>
-								<el-table-column align="center" width="100">
-									<template #header>
-										<el-button type="primary" @click="handleAdd"> 新增 </el-button>
-									</template>
-									<template #default="scope">
-										<el-button @click="handleDelete(scope.row, scope.$index)" type="danger" text>删除</el-button>
-									</template>
-								</el-table-column>
-							</el-table>
-							<div class="mt20"></div>
-						</div>
-					</el-collapse-item>
-					<el-collapse-item name="2">
-						<template #title>
-							<p class="pl10">
-								<b class="font14">已配置参数</b>
-							</p>
-						</template>
-						<div class="parameter-stop pd20">
-							<el-row>
-								<el-col v-for="(item, index) in state.paramSelect" :key="index" :xs="24" :sm="8" :md="8" :lg="6" :xl="4" :title="item.name">
-									<div class="parameter-stop-one mb10 text-no-wrap" :class="{ active: item.active }" @click="selectParameter(item)">
-										{{ item.name }}
-									</div>
-								</el-col>
-							</el-row>
-						</div>
-					</el-collapse-item>
-					<el-collapse-item name="3">
-						<template #title>
-							<p class="flex-center-align pl10">
-								<b class="font14">指定优先级</b>
-								<el-tooltip placement="top-start" content="选中已配置参数,可自定义优先级,参数越靠前优先级越高。" trigger="hover">
-									<SvgIcon name="ele-QuestionFilled" size="16px" color="var(--el-color-info)" class="ml5"></SvgIcon>
-								</el-tooltip>
-							</p>
-						</template>
-						<div class="pd20">
-							<draggable-list :list="state.priority" :force-fallback="true" animation="300" @end="onEnd" itemKey="id" class="parameter-sort">
-								<template #item="item">
-									<div class="parameter-sort-one" :title="item.element.timeLimitValue">
-										<el-tag class="mr20"> {{ item.index + 1 }}. {{ item.element.name }} </el-tag>
-									</div>
-								</template>
-							</draggable-list>
-						</div>
-					</el-collapse-item>
-				</div>
-			</el-collapse>
-			<p class="border-title mb10 mt20" v-if="state.ruleForm.workflowCode === 'Order'">参数组合</p>
-			<!-- 组合参数表格 -->
-			<div class="pd20" v-if="state.ruleForm.workflowCode === 'Order'">
-				<el-table :data="state.combination">
-					<el-table-column label="组合名称" prop="combinationName">
-						<template #default="{ row }">
-							<el-input v-model="row.combinationName" placeholder="请填写组合名称" class="w100" max-length="30"></el-input>
-						</template>
-					</el-table-column>
-					<el-table-column label="参数" prop="combinationDisplayParam">
-						<template #default="{ row }">
-							<div class="flex-center-align">
-								<span class="omit text-no-wrap" :title="row.combinationDisplayParam">{{ row.combinationDisplayParam }}</span>
-								<el-button class="ml3" text title="配置参数" type="primary" @click="chooseCombination(row)">
-									<SvgIcon name="ele-Edit" size="16px" />
-								</el-button>
-							</div>
-						</template>
-					</el-table-column>
-					<el-table-column label="时限" prop="timeLimitValue">
-						<template #default="{ row }">
-							<el-input-number
-								v-model="row.timeLimitValue"
-								:min="1"
-								placeholder="请填写时限"
-								class="w100"
-								@change="
-									(val) => {
-										if (row.timeLimit !== 1) row.hour = val * 24;
-										else row.hour = val;
-									}
-								"
-							></el-input-number>
-						</template>
-					</el-table-column>
-					<el-table-column label="单位" prop="hourObj">
-						<template #default="{ row }">
-							<el-select
-								v-model="row.hourObj"
-								value-key="key"
-								placeholder="请选择单位"
-								class="w100"
-								@change="
-									(val) => {
-										row.timeLimit = val.key;
-										if (val.key !== 1) row.hour = row.timeLimitValue * 24;
-										else row.hour = row.timeLimitValue;
-										row.timeLimitTypeName = val.value;
-									}
-								"
-							>
-								<el-option v-for="item in state.timeType" :key="item.key" :label="item.value" :value="item" />
-							</el-select>
-						</template>
-					</el-table-column>
-					<el-table-column align="center" width="100">
-						<template #header>
-							<el-button type="primary" @click="combinationAdd"> 新增 </el-button>
-						</template>
-						<template #default="scope">
-							<el-button @click="combinationDelete(scope.row, scope.$index)" type="danger" text>删除</el-button>
-						</template>
-					</el-table-column>
-				</el-table>
-			</div>
-
-			<template #footer>
-				<span class="dialog-footer">
-					<el-button @click="onSubmit(ruleFormRef)" class="default-button">暂 存</el-button>
-					<el-button type="primary" @click="onConfirm(ruleFormRef)">确 定</el-button>
-				</span>
-			</template>
-		</el-dialog>
-		<el-dialog v-model="state.paramDialog" width="700" draggable title="参数选择">
-			<el-form :model="state.paramForm" ref="paramFormRef" label-width="100px">
-				<el-row :gutter="5">
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="受理类型" prop="acceptType" :rules="[{ required: false, message: '请选择受理类型', trigger: 'change' }]">
-							<el-select
-								v-model="state.paramForm.acceptType"
-								placeholder="请选择受理类型"
-								class="w100"
-								value-key="key"
-								clearable
-								@clear="clearCombinationParam('AcceptType')"
-							>
-								<el-option v-for="item in state.result.acceptType" :key="item.key" :label="item.value" :value="item" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="热点分类" prop="hotspot" :rules="[{ required: false, message: '请选择热点分类', trigger: 'change' }]">
-							<el-tree-select
-								class="w100"
-								v-model="state.paramForm.hotspot"
-								filterable
-								placeholder="请选择热点分类"
-								:props="HotspotProps"
-								lazy
-								:load="load"
-								node-key="id"
-								check-strictly
-								:render-after-expand="false"
-								@node-click="getComHotspot"
-								ref="hotspotComRef"
-								:default-expanded-keys="state.hotspotExternalCom"
-								clearable
-								@clear="clearCombinationParam('HotPots')"
-							/>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="来源渠道" prop="sourceChannel" :rules="[{ required: false, message: '请选择来源渠道', trigger: 'change' }]">
-							<el-select
-								v-model="state.paramForm.sourceChannel"
-								placeholder="请选择来源渠道"
-								class="w100"
-								value-key="key"
-								filterable
-								clearable
-								@clear="clearCombinationParam('SourceChannel')"
-							>
-								<el-option v-for="item in state.result.sourceChannel" :key="item.key" :label="item.value" :value="item" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="来电人身份" prop="identityType" :rules="[{ required: false, message: '请选择来电人身份', trigger: 'change' }]">
-							<el-select
-								v-model="state.paramForm.identityType"
-								placeholder="请选择来电人身份"
-								class="w100"
-								value-key="key"
-								filterable
-								clearable
-								@clear="clearCombinationParam('IdentityType')"
-							>
-								<el-option v-for="item in state.result.identityType" :key="item.key" :label="item.value" :value="item" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="工单类型" prop="orderType" :rules="[{ required: false, message: '请选择工单类型', trigger: 'change' }]">
-							<el-select
-								v-model="state.paramForm.orderType"
-								placeholder="请选择工单类型"
-								class="w100"
-								value-key="key"
-								filterable
-								clearable
-								@clear="clearCombinationParam('OrderType')"
-							>
-								<el-option v-for="item in state.result.orderType" :key="item.key" :label="item.value" :value="item" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="证件类型" prop="certType" :rules="[{ required: false, message: '请选择证件类型类', trigger: 'change' }]">
-							<el-select
-								v-model="state.paramForm.certType"
-								placeholder="请选择证件类型"
-								class="w100"
-								value-key="dicDataValue"
-								filterable
-								clearable
-								@clear="clearCombinationParam('LicenceType')"
-							>
-								<el-option v-for="item in state.result.certType" :key="item.dicDataValue" :label="item.dicDataName" :value="item" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="紧急程度" prop="emergencyLevel" :rules="[{ required: false, message: '请选择紧急程度', trigger: 'change' }]">
-							<el-select
-								v-model="state.paramForm.emergencyLevel"
-								placeholder="请选择紧急程度"
-								class="w100"
-								value-key="key"
-								filterable
-								clearable
-								@clear="clearCombinationParam('EmergencyLevel')"
-							>
-								<el-option v-for="item in state.result.emergencyLevel" :key="item.key" :label="item.value" :value="item" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<!-- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="默认参数" prop="emergencyLevel" :rules="[{ required: false, message: '请选择默认参数', trigger: 'change' }]">
-							<el-select v-model="state.paramForm.emergencyLevel" placeholder="请选择默认参数" class="w100" value-key="key" filterable>
-								<el-option v-for="item in state.result.emergencyLevel" :key="item.key" :label="item.value" :value="item"  />
-							</el-select>
-						</el-form-item>
-					</el-col> -->
-				</el-row>
-			</el-form>
-			<template #footer>
-				<span class="dialog-footer">
-					<el-button class="default-button" @click="state.paramDialog = false">取 消</el-button>
-					<el-button type="primary" @click="onConfirmCom">确 定</el-button>
-				</span>
-			</template>
-		</el-dialog>
-	</div>
-</template>
-
-<script lang="ts" setup name="EditTimeLimit">
-import { ref, reactive } from 'vue';
-import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
-import { guid } from '@/utils/tools';
-import { removeDuplicate } from '@/utils/arrayOperation';
-import DraggableList from 'vuedraggable';
-import { hotSpotType } from '@/api/business/order';
-import { timeLimitDetail, timeLimitUpdate } from '@/api/system/timeLimit';
-import other from '@/utils/other';
-// 定义子组件向父组件传值/事件
-const emit = defineEmits(['updateList', 'openDialog', 'closeDialog']);
-const paramTypeNameType: any = {
-	AcceptType: '受理类型',
-	HotPots: '热点分类',
-	SourceChannel: '来源渠道',
-	IdentityType: '来电人身份',
-	OrderType: '工单类型',
-	LicenceType: '证件类型',
-	EmergencyLevel: '紧急程度',
-	DefaultTime: '默认参数',
-};
-// 定义变量内容
-const ruleFormRef = ref<RefType>();
-const state = reactive<any>({
-	ruleForm: {},
-	paramForm: {},
-	paramDialog: false,
-	dialogVisible: false,
-	baseData: [], // 基础数据
-	parameterList: [], //选择基础数据
-	paramArr: [], //参数列表信息
-	currentParam: null as any, // 当前参数
-	collapseArr: ['1', '2', '3', '4'], //展开列表
-	result: {}, //所有基础数据
-	timeType: [], // 单位
-	moduleOptions: [], // 业务名称
-	selectArray: [], // 可选数据
-	paramSelect: [], // 已配置的数据 (可选择)
-	priority: [], // 排序参数
-	combination: [], // 组合
-	hotspotExternal: [], // 热点分类展开
-	external: [],
-	hotspotExternalCom: [], // 组合热点分类展开
-	externalCom: [],
-	loading: false,
-	timeLimitId: null as any,
-});
-
-// 热点分类远程搜索
-const HotspotProps = {
-	label: 'hotSpotFullName',
-	children: 'children',
-	isLeaf: 'isLeaf',
-};
-// 热点分类懒加载
-const load = async (node: any, resolve: any) => {
-	if (node.isLeaf) return resolve([]);
-	const res: any = await hotSpotType({ id: node.data.id ? node.data.id : '' });
-	resolve(res.result);
-};
-// 递归查找父级Id
-const getParentId = (val: any, arr: string[]) => {
-	if (val.data.parentId) {
-		arr.push(val.data.parentId);
-		getParentId(val.parent, arr);
-	}
-	return arr;
-};
-const resetState = () => {
-	state.parameterList = [];
-	state.paramArr = [];
-	state.currentParam = null;
-	state.selectArray = [];
-	state.paramSelect = [];
-	state.priority = [];
-	state.combination = [];
-	state.hotspotExternal = [];
-	state.external = [];
-	state.hotspotExternalCom = [];
-	state.externalCom = [];
-};
-// 打开弹窗
-const openDialog = (val: any, baseData: any) => {
-	state.dialogVisible = true;
-	state.loading = true;
-	resetState();
-	ruleFormRef.value?.resetFields();
-	const { baseData: stateBaseData = [], timeType = [], moduleOptions = [] } = baseData;
-	state.result = baseData;
-	state.baseData = stateBaseData; //基础数据
-	state.timeType = timeType; //单位
-	state.moduleOptions = moduleOptions; //业务名称
-	state.timeLimitId = val.id;
-	timeLimitDetail(val.id)
-		.then((res: any) => {
-			// 表单数据
-			const { timeLimitName, workflowCode, workflowName } = res.result;
-			state.ruleForm.timeLimitName = timeLimitName;
-			state.ruleForm.workflowObj = {
-				key: workflowCode,
-				value: workflowName,
-			};
-			state.ruleForm.workflowCode = workflowCode;
-			state.ruleForm.workflowName = workflowName;
-			// 参数
-			for (const i of res.result.paramArr) {
-				for (const j of state.baseData) {
-					if (i.paramType === j.typeCode) {
-						state.parameterList.push({
-							...j,
-						});
-						state.parameterList = removeDuplicate(state.parameterList, 'typeCode');
-						parameterChange(true, j);
-					}
-				}
-				for (const k of state.paramArr) {
-					if (i.paramType === k.paramType) {
-						k.paramValue.push({
-							paramTypeObj: {
-								key: i.paramTypeValue,
-								value: i.paramTypeName,
-							},
-							hourObj: {
-								key: i.timeLimitType,
-							},
-							...i,
-						});
-						if (i.hotParamParent) state.hotspotExternal = i.hotParamParent.split(',');
-					}
-				}
-			}
-			// 配置参数
-			getSelectedParams();
-			for (let i of state.paramSelect) {
-				for (let j of res.result.priority) {
-					if (i.id === j.code) {
-						i.active = true;
-					}
-				}
-			}
-			state.priority = res.result.priority;
-			state.priority = state.priority.map((v: any) => {
-				return {
-					...v,
-					name: paramTypeNameType[v.paramType] + '-' + v.paramTypeName,
-				};
-			});
-
-			// 组合
-			state.combination = res.result.combination;
-			state.combination = state.combination.map((v: any) => {
-				return {
-					...v,
-					hourObj: {
-						key: v.timeLimit,
-					},
-				};
-			});
-
-			state.loading = false;
-		})
-		.catch(() => {
-			state.loading = false;
-			state.dialogVisible = false;
-		});
-};
-// 关闭弹窗
-const closeDialog = () => {
-	state.dialogVisible = false;
-	emit('closeDialog');
-};
-// 选择参数
-const parameterChange = (value: string | number | boolean, item: any) => {
-	let arr: any = other.deepClone(state.parameterList);
-	state.paramArr = arr.map((v: any) => {
-		let j = state.paramArr.find((j: any) => j.paramType === v.typeCode);
-		if (j) {
-			v.paramValue = j.paramValue;
-		}
-		return {
-			...v,
-			paramType: v.typeCode,
-			paramValue: v.paramValue ?? [],
-		};
-	});
-	if (value) {
-		//新增选中新增的
-		chooseParameter(item);
-	} else {
-		// 取消选中最后一个
-		chooseParameter(state.paramArr[state.paramArr.length - 1]);
-	}
-};
-// 选择参数 切换当前
-const chooseParameter = (item: any) => {
-	switch (item?.typeCode) {
-		case 'AcceptType':
-			state.selectArray = state.result.acceptType;
-			break;
-		case 'HotPots': // 热点
-			state.selectArray = [];
-			break;
-		case 'SourceChannel':
-			state.selectArray = state.result.sourceChannel;
-			break;
-		case 'IdentityType':
-			state.selectArray = state.result.identityType;
-			break;
-		case 'OrderType':
-			state.selectArray = state.result.orderType;
-			break;
-		case 'LicenceType': //证件类型
-			state.selectArray = state.result.certType.map((item: any) => {
-				return {
-					key: item.dicDataValue,
-					value: item.dicDataName,
-				};
-			});
-			break;
-		case 'EmergencyLevel':
-			state.selectArray = state.result.emergencyLevel;
-			break;
-		case 'DefaultTime': //默认参数
-			state.selectArray = [];
-			break;
-		default:
-			break;
-	}
-	// state.selectArray = state.result[state.currentParam.typeCode];
-	state.paramArr.forEach((v: any) => {
-		if (item.typeCode === v.paramType) {
-			v.active = true;
-			state.currentParam = v;
-		} else {
-			v.active = false;
-		}
-	});
-	getEnableAcceptType();
-	getSelectedParams();
-};
-// 新增
-const handleAdd = () => {
-	state.currentParam.paramValue.push({
-		id: guid(),
-		paramType: state.currentParam.paramType,
-		paramTypeName: '',
-		paramTypeValue: '',
-		timeLimitValue: 1,
-		hour: '',
-	});
-	getEnableAcceptType();
-	getSelectedParams();
-};
-// 删除
-const handleDelete = (row: any, index: number) => {
-	ElMessageBox.confirm(`确定要删除?`, '提示', {
-		confirmButtonText: '确定',
-		cancelButtonText: '取消',
-		type: 'warning',
-		draggable: true,
-		cancelButtonClass: 'default-button',
-	})
-		.then(() => {
-			state.currentParam.paramValue.splice(index, 1);
-			getEnableAcceptType();
-			getSelectedParams();
-		})
-		.catch(() => {});
-};
-// 获取可用的数组
-const getEnableAcceptType = () => {
-	if (state.currentParam?.paramValue.length) {
-		const array = state.currentParam.paramValue.map((v: any) => v.paramTypeValue);
-		state.selectArray.forEach((v: any) => {
-			v.disabled = array.includes(v.key);
-		});
-	}
-};
-// 获取已经配置的列表
-const getSelectedParams = () => {
-	const arr = state.paramArr.flatMap((i: any) => i.paramValue).filter((j: any) => j.paramTypeName && j.id && j.timeLimitType);
-	state.paramSelect = arr.map((v: any) => {
-		const { id, active } = v;
-		const selected = state.paramSelect.find((j: any) => j.id === id);
-		return {
-			...v,
-			active: selected?.active ?? false,
-			name: paramTypeNameType[v.paramType] + '-' + v.paramTypeName,
-		};
-	});
-};
-// 选择已配置的
-const selectParameter = (item: any) => {
-	state.paramSelect.forEach((v: any) => {
-		if (item.id === v.id) {
-			v.active = !v.active;
-		}
-	});
-	// 排序数组
-	state.priority = state.paramSelect.filter((v: any) => {
-		return v.active;
-	});
-	state.priority = state.priority.map((item: any, index: number) => {
-		return {
-			...item,
-			sort: index,
-			code: item.id,
-		};
-	});
-};
-//结束拖拽事件
-const onEnd = () => {
-	state.priority = state.priority.map((item: any, index: number) => {
-		return {
-			...item,
-			sort: index,
-			code: item.id,
-		};
-	});
-};
-// 新增组合
-const combinationAdd = () => {
-	state.combination.push({
-		id: guid(),
-		combinationName: '',
-		combinationDisplayParam: '',
-		combinationParam: [],
-		timeLimitValue: 1,
-		hour: '',
-	});
-};
-// 删除组合
-const combinationDelete = (row: any, index: number) => {
-	ElMessageBox.confirm(`确定要删除?`, '提示', {
-		confirmButtonText: '确定',
-		cancelButtonText: '取消',
-		type: 'warning',
-		draggable: true,
-		cancelButtonClass: 'default-button',
-	})
-		.then(() => {
-			state.combination.splice(index, 1);
-			getEnableAcceptType();
-			getSelectedParams();
-		})
-		.catch(() => {});
-};
-// 选择组合参数
-const chooseCombination = (row: any) => {
-	state.paramForm = row;
-	for (let i of state.combination) {
-		for (let j of i.combinationParam) {
-			switch (j.paramType) {
-				case 'AcceptType':
-					state.paramForm.acceptType = {
-						key: j.paramValue,
-						value: j.paramName,
-					};
-					break;
-				case 'HotPots':
-					state.paramForm.hotspot = j.paramValue;
-					state.paramForm.hotspotSpliceName = j.paramName;
-					if (j.hotParamParent) state.hotspotExternalCom = j.hotParamParent.split(',');
-					break;
-				case 'SourceChannel':
-					state.paramForm.sourceChannel = {
-						key: j.paramValue,
-						value: j.paramName,
-					};
-					break;
-				case 'IdentityType':
-					state.paramForm.identityType = {
-						key: j.paramValue,
-						value: j.paramName,
-					};
-					break;
-				case 'OrderType':
-					state.paramForm.orderType = {
-						key: j.paramValue,
-						value: j.paramName,
-					};
-					break;
-				case 'LicenceType':
-					state.paramForm.certType = {
-						dicDataValue: j.paramValue,
-						dicDataName: j.paramName,
-					};
-					break;
-				case 'EmergencyLevel':
-					state.paramForm.emergencyLevel = {
-						key: j.paramValue,
-						value: j.paramName,
-					};
-					break;
-				default:
-					break;
-			}
-		}
-	}
-	state.paramDialog = true;
-};
-// 选择组合热点
-const getComHotspot = (val: any, e: any) => {
-	state.hotspotExternalCom = [];
-	state.externalCom = [];
-	state.hotspotExternalCom = getParentId(e, state.externalCom);
-	state.paramForm.hotspotSpliceName = val.hotSpotFullName;
-};
-// 删除组合参数
-const clearCombinationParam = (val: any) => {
-	let item = state.combination.find((item: any) => item.id === state.paramForm.id);
-	item.combinationParam = item.combinationParam.filter((v: any) => v.paramType !== val);
-};
-// 参数组合确定
-const onConfirmCom = () => {
-	let comName: string[] = [];
-	let item = state.combination.find((item: any) => item.id === state.paramForm.id);
-	if (item) {
-		if (item.acceptType?.value) {
-			item.combinationParam.push({
-				paramName: item.acceptType.value,
-				paramValue: item.acceptType.key,
-				hotParamParent: '',
-				paramType: 'AcceptType',
-			});
-			comName.push(`受理类型-${item.acceptType.value}`);
-		}
-		if (item?.hotspot) {
-			item.combinationParam.push({
-				paramName: item.hotspotSpliceName,
-				paramValue: item.hotspot,
-				hotParamParent: state.hotspotExternalCom.join(','),
-				paramType: 'HotPots',
-			});
-			comName.push(`热点分类-${item.hotspotSpliceName}`);
-		}
-		if (item.identityType?.value) {
-			item.combinationParam.push({
-				paramName: item.identityType.value,
-				paramValue: item.identityType.key,
-				hotParamParent: '',
-				paramType: 'IdentityType',
-			});
-			comName.push(`来电人身份-${item.identityType.value}`);
-		}
-		if (item.sourceChannel?.value) {
-			item.combinationParam.push({
-				paramName: item.sourceChannel.value,
-				paramValue: item.sourceChannel.key,
-				hotParamParent: '',
-				paramType: 'SourceChannel',
-			});
-			comName.push(`来源渠道-${item.sourceChannel.value}`);
-		}
-		if (item.orderType?.value) {
-			item.combinationParam.push({
-				paramName: item.orderType.value,
-				paramValue: item.orderType.key,
-				hotParamParent: '',
-				paramType: 'OrderType',
-			});
-			comName.push(`工单类型-${item.orderType.value}`);
-		}
-		if (item.certType?.dicDataName) {
-			item.combinationParam.push({
-				paramName: item.certType.dicDataName,
-				paramValue: item.certType.dicDataValue,
-				hotParamParent: '',
-				paramType: 'LicenceType',
-			});
-			comName.push(`证件类型-${item.certType.dicDataName}`);
-		}
-		if (item.emergencyLevel?.value) {
-			item.combinationParam.push({
-				paramName: item.emergencyLevel.value,
-				paramValue: item.emergencyLevel.key,
-				hotParamParent: '',
-				paramType: 'EmergencyLevel',
-			});
-			comName.push(`紧急程度-${item.emergencyLevel.value}`);
-		}
-		// if(state.paramForm.emergencyLevel.value){
-		// 	state.paramForm.push({
-		// 		paramName:state.paramForm.emergencyLevel.value,
-		// 		paramValue:state.paramForm.emergencyLevel.key,
-		// 		hotParamParent:'',
-		// 		paramType:'EmergencyLevel'
-		// 	})
-		// 	comName+=`默认参数-${state.paramForm.emergencyLevel.value}&`;
-		// }
-	}
-	item.combinationParam = removeDuplicate(item.combinationParam, 'paramType');
-	state.paramForm.hotParamParent = state.hotspotExternalCom.join(',');
-	if (item.combinationParam.length < 2) {
-		ElMessageBox.alert('一个组合中至少包含两个参数', '提示', {
-			confirmButtonText: '确定',
-		});
-		return;
-	}
-	item.combinationDisplayParam = comName.join('&');
-	state.paramDialog = false;
-};
-// 定义一个函数来检查某个属性是否存在,如果不存在就给出提示信息,并返回false
-const checkProperty = (obj: any, property: string, message: string) => {
-	if (!obj[property]) {
-		ElMessage.warning(message);
-		return false;
-	}
-	return true;
-};
-// 暂存
-const onSubmit = async (formEl: FormInstance | undefined) => {
-	if (!formEl) return;
-	await formEl.validate((valid: boolean) => {
-		if (!valid) return;
-		let arr: any = [];
-		for (let i of state.paramArr) {
-			if (i.paramValue.length) {
-				for (let j of i.paramValue) {
-					// 检查paramTypeName是否存在
-					if (!checkProperty(j, 'paramTypeName', `请选择${i.name}`)) return;
-					// 检查timeLimitValue是否存在
-					if (!checkProperty(j, 'timeLimitValue', `请填写${i.name}的时限`)) return;
-					// 检查timeLimitType是否存在
-					if (!checkProperty(j, 'timeLimitType', `请选择${i.name}的单位`)) return;
-					arr.push(j);
-				}
-			}
-		}
-		if (!arr.length) {
-			ElMessage.warning(`请选择参数`);
-			return;
-		}
-		for (let i of state.combination) {
-			// 检查combinationName是否存在
-			if (!checkProperty(i, 'combinationName', `请填写组合名称`)) return;
-			// 检查combinationDisplayParam是否存在
-			if (!checkProperty(i, 'combinationDisplayParam', `请选择组合参数`)) return;
-			if (i.combinationParam.length.length < 2) {
-				ElMessageBox.alert('一个组合中至少包含两个参数', '提示', {
-					confirmButtonText: '确定',
-				});
-				return;
-			}
-			// 检查timeLimitValue是否存在
-			if (!checkProperty(i, 'timeLimitValue', `请填写时限`)) return;
-			// 检查timeLimit是否存在或者为0
-			if (!checkProperty(i, 'timeLimit', `请选择组合单位`)) return;
-		}
-		let req = {
-			...state.ruleForm,
-			paramArr: arr,
-			priority: state.priority,
-			combination: state.combination,
-			id: state.timeLimitId,
-		};
-		timeLimitUpdate(req).then(() => {
-			ElMessage.success('操作成功');
-			emit('updateList');
-			state.dialogVisible = false;
-		});
-	});
-};
-// 确定
-const onConfirm = async (formEl: FormInstance | undefined) => {
-	if (!formEl) return;
-	await formEl.validate((valid: boolean) => {
-		if (!valid) return;
-		let arr: any = [];
-		for (let i of state.paramArr) {
-			if (i.paramValue.length) {
-				for (let j of i.paramValue) {
-					// 检查paramTypeName是否存在
-					if (!checkProperty(j, 'paramTypeName', `请选择${i.name}`)) return;
-					// 检查timeLimitValue是否存在
-					if (!checkProperty(j, 'timeLimitValue', `请填写${i.name}的时限`)) return;
-					// 检查timeLimitType是否存在
-					if (!checkProperty(j, 'timeLimitType', `请选择${i.name}的单位`)) return;
-					arr.push(j);
-				}
-			}
-		}
-		if (!arr.length) {
-			ElMessage.warning(`请选择参数`);
-			return;
-		}
-		for (let i of state.combination) {
-			// 检查combinationName是否存在
-			if (!checkProperty(i, 'combinationName', `请填写组合名称`)) return;
-			// 检查combinationDisplayParam是否存在
-			if (!checkProperty(i, 'combinationDisplayParam', `请选择组合参数`)) return;
-			if (i.combinationParam.length.length < 2) {
-				ElMessageBox.alert('一个组合中至少包含两个参数', '提示', {
-					confirmButtonText: '确定',
-				});
-				return;
-			}
-			// 检查timeLimitValue是否存在
-			if (!checkProperty(i, 'timeLimitValue', `请填写时限`)) return;
-			// 检查timeLimit或者timeLimit(这里可能是拼写错误)是否存在或者为0
-			if (!checkProperty(i, 'timeLimit', `请选择组合单位`)) return;
-		}
-		// timeLimitAdd(state.ruleForm).then(() => {
-		// 	ElMessage.success('操作成功');
-		// 	emit('updateList');
-		// 	state.dialogVisible = false;
-		// });
-	});
-};
-//暴漏变量和方法
-defineExpose({ closeDialog, openDialog });
-</script>
-<style lang="scss" scoped>
-.system-timeLimit-edit-container {
-	.collapse-box {
-		:deep(.el-collapse-item__header) {
-			background-color: var(--hotline-bg-main-color);
-			height: 40px;
-			border-radius: var(--el-border-radius-base);
-		}
-		:deep(.el-collapse-item__content) {
-			padding-bottom: 0 !important;
-			.el-form-item {
-				margin-bottom: 5px;
-				.el-form-item__content {
-					line-height: 24px;
-				}
-			}
-		}
-		.collapse-container {
-			padding: 10px;
-			.plug-container {
-				border: var(--el-border);
-				border-radius: var(--el-border-radius-base);
-				margin-bottom: 15px;
-				&:last-child {
-					margin-bottom: 0;
-				}
-				.plug-container-title {
-					padding: 10px 15px;
-					font-weight: bold;
-					border-bottom: var(--el-border);
-					font-size: var(--el-font-size-medium);
-				}
-			}
-		}
-	}
-	:deep(.el-collapse-item__wrap) {
-		border-bottom: 0;
-	}
-	:deep(.el-collapse) {
-		border-bottom: 0;
-	}
-	:deep(.el-tabs__nav-wrap::after) {
-		height: 100% !important;
-	}
-	.parameter-choose {
-		&-one {
-			cursor: pointer;
-			text-align: center;
-			height: 34px;
-			line-height: 34px;
-			color: var(--el-color-primary);
-			width: calc(100% - 10px);
-			padding: 0 5px;
-			border: 1px solid transparent;
-		}
-		.active {
-			border: 1px solid var(--el-color-primary);
-			border-radius: var(--el-border-radius-base);
-		}
-	}
-	.parameter-stop {
-		&-one {
-			cursor: pointer;
-			text-align: center;
-			height: 34px;
-			line-height: 34px;
-			width: calc(100% - 10px);
-			padding: 0 5px;
-		}
-		.active {
-			border: 1px solid var(--el-color-primary);
-			border-radius: var(--el-border-radius-base);
-			color: var(--el-color-primary);
-		}
-	}
-	.parameter-sort {
-		display: flex;
-		flex-wrap: wrap;
-		&-one {
-			cursor: pointer;
-			text-align: center;
-			height: 34px;
-			line-height: 34px;
-		}
-	}
-	.omit {
-		display: inline-block;
-	}
-}
-</style>

+ 0 - 193
src/views/system/config/timeLimit/index.vue

@@ -1,193 +0,0 @@
-<template>
-	<div class="system-timeLimit-container layout-pd">
-		<el-card shadow="never">
-			<div class="mb20">
-				<el-button type="primary" @click="addTimeLimit" v-waves v-auth="'system:timeLimit:add'">
-					<SvgIcon name="ele-Plus" class="mr5" />新增
-				</el-button>
-			</div>
-			<!-- 表格 -->
-			<el-table :data="state.tableData" v-loading="state.loading">
-				<el-table-column prop="timeLimitName" label="配置名称" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="workflowName" label="业务名称" show-overflow-tooltip width="130"></el-table-column>
-				<el-table-column prop="morningEnd" label="创建人" show-overflow-tooltip width="130"></el-table-column>
-				<el-table-column prop="afterBegin" label="状态" show-overflow-tooltip width="130"></el-table-column>
-				<el-table-column label="操作" width="250" fixed="right" align="center">
-					<template #default="{ row }">
-						<el-button link type="primary" @click="updateTimeLimit(row)" v-auth="'system:timeLimit:edit'" title="修改时效"> 修改 </el-button>
-						<el-button link type="info" @click="detailTimeLimit(row)" v-auth="'system:timeLimit:detail'" title="查看详情"> 查看 </el-button>
-						<el-button link type="danger" @click="deleteTimeLimit(row)" v-auth="'system:timeLimit:delete'" title="删除"> 删除 </el-button>
-						<el-button link type="success" @click="enableTimeLimit(row)" v-auth="'system:timeLimit:enabled'" title="启用"> 启用 </el-button>
-						<el-button link type="danger" @click="disableTimeLimit(row)" v-auth="'system:timeLimit:disabled'" title="禁用"> 禁用 </el-button>
-					</template>
-				</el-table-column>
-				<template #empty>
-					<Empty />
-				</template>
-			</el-table>
-      <pagination
-        @pagination="queryList"
-        :total="state.total"
-        v-model:current-page="state.queryParams.PageIndex"
-        v-model:page-size="state.queryParams.PageSize"
-      />
-		</el-card>
-		<time-limit-add ref="timeLimitAddRef" @updateList="queryList" />
-		<time-limit-edit ref="timeLimitEditRef" @updateList="queryList" />
-		<time-limit-detail ref="timeLimitDetailRef" @updateList="queryList" />
-	</div>
-</template>
-<script lang="ts" name="timeLimit" setup>
-import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
-import { ElMessage, ElMessageBox } from 'element-plus';
-import { throttle } from '@/utils/tools';
-import { auth } from '@/utils/authFunction';
-// 引入api
-import { baseData, timeLimitDelete, timeLimitDisable, timeLimitEnable, timeLimitPaged } from '@/api/system/timeLimit';
-
-// 引入组件
-const TimeLimitAdd = defineAsyncComponent(() => import('@/views/system/config/timeLimit/component/Time-limit-add.vue'));
-const TimeLimitEdit = defineAsyncComponent(() => import('@/views/system/config/timeLimit/component/Time-limit-edit.vue'));
-const TimeLimitDetail = defineAsyncComponent(() => import('@/views/system/config/timeLimit/component/Time-limit-detail.vue'));
-const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
-
-// 定义变量内容
-const state = reactive<any>({
-	loading: false, // 加载状态
-	queryParams: {
-		PageIndex: 1, // 当前页
-		PageSize: 10, // 每页显示条数
-		Keyword: null, // 关键字
-	},
-	total: 0, // 总条数
-	tableData: [], // 表格数据
-	baseData: {}, // 基础数据
-});
-const timeLimitAddRef = ref<RefType>();
-const timeLimitEditRef = ref<RefType>();
-const timeLimitDetailRef = ref<RefType>();
-/** 获取时限列表 */
-const queryList = throttle(() => {
-	state.loading = true;
-	timeLimitPaged(state.queryParams)
-		.then((response: any) => {
-			state.tableData = response.result?.items ?? [];
-			state.total = response.result.total ?? 0;
-			state.loading = false;
-		})
-		.catch(() => {
-			state.loading = false;
-		});
-}, 500);
-// 新增时限
-const addTimeLimit = () => {
-	timeLimitAddRef.value?.openDialog(state.baseData);
-};
-// 查看时限详情
-const detailTimeLimit = (row: any) => {
-	timeLimitDetailRef.value?.openDialog(row, state.baseData);
-};
-// 修改时限
-const updateTimeLimit = (row: any) => {
-	timeLimitEditRef.value?.openDialog(row, state.baseData);
-};
-// 删除时限
-const deleteTimeLimit = (row: any) => {
-	ElMessageBox.confirm(`此操作将永久删除时限:【${row.timeLimitName}】, 是否继续?`, '提示', {
-		confirmButtonText: '确定',
-		cancelButtonText: '取消',
-		type: 'warning',
-		draggable: true,
-		cancelButtonClass: 'default-button',
-	})
-		.then(() => {
-			timeLimitDelete(row.id).then(() => {
-				ElMessage.success('删除成功');
-				queryList();
-			});
-		})
-		.catch(() => {});
-};
-// 启用时限
-const enableTimeLimit = (row: any) => {
-	ElMessageBox.confirm(`此操作将启用:【${row.timeLimitName}】, 是否继续?`, '提示', {
-		confirmButtonText: '确定',
-		cancelButtonText: '取消',
-		type: 'warning',
-		draggable: true,
-		cancelButtonClass: 'default-button',
-	})
-		.then(() => {
-			timeLimitEnable(row.id).then(() => {
-				ElMessage.success('启用成功');
-				queryList();
-			});
-		})
-		.catch(() => {});
-};
-// 禁用时限
-const disableTimeLimit = (row: any) => {
-	ElMessageBox.confirm(`此操作将禁用:【${row.timeLimitName}】, 是否继续?`, '提示', {
-		confirmButtonText: '确定',
-		cancelButtonText: '取消',
-		type: 'warning',
-		draggable: true,
-		cancelButtonClass: 'default-button',
-	})
-		.then(() => {
-			timeLimitDisable(row.id).then(() => {
-				ElMessage.success('禁用成功');
-				queryList();
-			});
-		})
-		.catch(() => {});
-};
-onMounted(() => {
-	queryList();
-	// 基础信息
-	baseData().then((res: any) => {
-		state.baseData = res.result;
-		state.baseData.acceptType = state.baseData.acceptType.map((v: any) => {
-			return {
-				key: String(v.key),
-				value: v.value,
-			};
-		});
-		state.baseData.emergencyLevel = state.baseData.emergencyLevel.map((v: any) => {
-			return {
-				key: String(v.key),
-				value: v.value,
-			};
-		});
-		state.baseData.identityType = state.baseData.identityType.map((v: any) => {
-			return {
-				key: String(v.key),
-				value: v.value,
-			};
-		});
-		state.baseData.moduleOptions = state.baseData.moduleOptions.map((v: any) => {
-			return {
-				key: String(v.key),
-				value: v.value,
-			};
-		});
-		state.baseData.orderType = state.baseData.orderType.map((v: any) => {
-			return {
-				key: String(v.key),
-				value: v.value,
-			};
-		});
-		state.baseData.sourceChannel = state.baseData.sourceChannel.map((v: any) => {
-			return {
-				key: String(v.key),
-				value: v.value,
-			};
-		});
-	});
-});
-</script>
-
-<style lang="scss" scoped>
-.device-tels-container {
-}
-</style>

+ 223 - 152
src/views/tels/callLog/index.vue

@@ -7,6 +7,8 @@
 				<el-tab-pane name="2" label="呼出已接"></el-tab-pane>
 				<el-tab-pane name="3" label="未接"></el-tab-pane>
 				<el-tab-pane name="4" label="智能应答"></el-tab-pane>
+        <el-tab-pane name="5" label="呼入白名单"></el-tab-pane>
+        <el-tab-pane name="6" label="呼入黑名单"></el-tab-pane>
 			</el-tabs>
 			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent label-width="20px">
 				<el-row :gutter="10">
@@ -20,19 +22,19 @@
 							<el-input v-model="state.queryParams.CDPN" placeholder="被叫号码" clearable @keyup.enter="handleQuery" />
 						</el-form-item>
 					</el-col>
-					<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="['0', '1', '2', '3'].includes(state.queryParams.type)">
+					<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="['0', '1', '2', '3','5','6'].includes(state.queryParams.type)">
 						<el-form-item prop="TelNo">
 							<el-input v-model="state.queryParams.TelNo" placeholder="响应分机" clearable @keyup.enter="handleQuery" />
 						</el-form-item>
 					</el-col>
 
-					<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="['0', '1', '2', '3'].includes(state.queryParams.type)">
+					<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="['0', '1', '2', '3','5'].includes(state.queryParams.type)">
 						<el-form-item prop="UserName">
 							<el-input v-model="state.queryParams.UserName" placeholder="话务员名称" clearable @keyup.enter="handleQuery" />
 						</el-form-item>
 					</el-col>
 					<transition name="el-zoom-in-top">
-						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol || ['4'].includes(state.queryParams.type)">
+						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol || ['4','6'].includes(state.queryParams.type)">
 							<el-form-item prop="gateway">
 								<el-input v-model="state.queryParams.gateway" placeholder="中继号码" clearable @keyup.enter="handleQuery" />
 							</el-form-item>
@@ -65,6 +67,114 @@
 							</el-form-item>
 						</el-col>
 					</transition>
+          <transition name="el-zoom-in-top">
+            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3','4','5'].includes(state.queryParams.type)">
+              <el-form-item prop="beginIvrTime">
+                <el-date-picker
+                  v-model="state.queryParams.beginIvrTime"
+                  type="datetimerange"
+                  unlink-panels
+                  range-separator="至"
+                  start-placeholder="ivr开始开始时间"
+                  end-placeholder="ivr开始结束时间"
+                  :shortcuts="shortcuts"
+                  @change="beginIvrTimeChange"
+                  value-format="YYYY-MM-DD[T]HH:mm:ss"
+                  :default-time="defaultTimeStartEnd"
+                />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3','4','5'].includes(state.queryParams.type)">
+              <el-form-item prop="endIvrTime">
+                <el-date-picker
+                  v-model="state.queryParams.endIvrTime"
+                  type="datetimerange"
+                  unlink-panels
+                  range-separator="至"
+                  start-placeholder="ivr结束开始时间"
+                  end-placeholder="ivr结束结束时间"
+                  :shortcuts="shortcuts"
+                  @change="endIvrTimeChange"
+                  value-format="YYYY-MM-DD[T]HH:mm:ss"
+                  :default-time="defaultTimeStartEnd"
+                />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3','5'].includes(state.queryParams.type)">
+              <el-form-item prop="beginQueueTime">
+                <el-date-picker
+                  v-model="state.queryParams.beginQueueTime"
+                  type="datetimerange"
+                  unlink-panels
+                  range-separator="至"
+                  start-placeholder="队列开始开始时间"
+                  end-placeholder="队列开始结束时间"
+                  :shortcuts="shortcuts"
+                  @change="beginQueueTimeChange"
+                  value-format="YYYY-MM-DD[T]HH:mm:ss"
+                  :default-time="defaultTimeStartEnd"
+                />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3','5'].includes(state.queryParams.type)">
+              <el-form-item prop="endQueueTime">
+                <el-date-picker
+                  v-model="state.queryParams.endQueueTime"
+                  type="datetimerange"
+                  unlink-panels
+                  range-separator="至"
+                  start-placeholder="队列结束开始时间"
+                  end-placeholder="队列结束结束时间"
+                  :shortcuts="shortcuts"
+                  @change="endQueueTimeChange"
+                  value-format="YYYY-MM-DD[T]HH:mm:ss"
+                  :default-time="defaultTimeStartEnd"
+                />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3','5'].includes(state.queryParams.type)">
+              <el-form-item prop="beginRingTime">
+                <el-date-picker
+                  v-model="state.queryParams.beginRingTime"
+                  type="datetimerange"
+                  unlink-panels
+                  range-separator="至"
+                  start-placeholder="振铃开始开始时间"
+                  end-placeholder="振铃开始结束时间"
+                  :shortcuts="shortcuts"
+                  @change="beginRingTimeChange"
+                  value-format="YYYY-MM-DD[T]HH:mm:ss"
+                  :default-time="defaultTimeStartEnd"
+                />
+              </el-form-item>
+            </el-col>
+          </transition>
+          <transition name="el-zoom-in-top">
+            <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3','5'].includes(state.queryParams.type)">
+              <el-form-item prop="endRingTime">
+                <el-date-picker
+                  v-model="state.queryParams.endRingTime"
+                  type="datetimerange"
+                  unlink-panels
+                  range-separator="至"
+                  start-placeholder="振铃结束开始时间"
+                  end-placeholder="振铃结束结束时间"
+                  :shortcuts="shortcuts"
+                  @change="endRingTimeChange"
+                  value-format="YYYY-MM-DD[T]HH:mm:ss"
+                  :default-time="defaultTimeStartEnd"
+                />
+              </el-form-item>
+            </el-col>
+          </transition>
 					<transition name="el-zoom-in-top">
 						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
 							<el-form-item prop="callTime">
@@ -84,7 +194,7 @@
 						</el-col>
 					</transition>
 					<transition name="el-zoom-in-top">
-						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '2'].includes(state.queryParams.type)">
+						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '2','4','5'].includes(state.queryParams.type)">
 							<el-form-item prop="answeredTime">
 								<el-date-picker
 									v-model="state.queryParams.answeredTime"
@@ -114,114 +224,6 @@
 									:shortcuts="shortcuts"
 									@change="overTimeChange"
 									value-format="YYYY-MM-DD[T]HH:mm:ss"
-                  :default-time="defaultTimeStartEnd"
-								/>
-							</el-form-item>
-						</el-col>
-					</transition>
-					<transition name="el-zoom-in-top">
-						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3'].includes(state.queryParams.type)">
-							<el-form-item prop="beginIvrTime">
-								<el-date-picker
-									v-model="state.queryParams.beginIvrTime"
-									type="datetimerange"
-									unlink-panels
-									range-separator="至"
-									start-placeholder="ivr开始开始时间"
-									end-placeholder="ivr开始结束时间"
-									:shortcuts="shortcuts"
-									@change="beginIvrTimeChange"
-									value-format="YYYY-MM-DD[T]HH:mm:ss"
-                  :default-time="defaultTimeStartEnd"
-								/>
-							</el-form-item>
-						</el-col>
-					</transition>
-					<transition name="el-zoom-in-top">
-						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3'].includes(state.queryParams.type)">
-							<el-form-item prop="endIvrTime">
-								<el-date-picker
-									v-model="state.queryParams.endIvrTime"
-									type="datetimerange"
-									unlink-panels
-									range-separator="至"
-									start-placeholder="ivr结束开始时间"
-									end-placeholder="ivr结束结束时间"
-									:shortcuts="shortcuts"
-									@change="endIvrTimeChange"
-									value-format="YYYY-MM-DD[T]HH:mm:ss"
-                  :default-time="defaultTimeStartEnd"
-								/>
-							</el-form-item>
-						</el-col>
-					</transition>
-					<transition name="el-zoom-in-top">
-						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3'].includes(state.queryParams.type)">
-							<el-form-item prop="beginQueueTime">
-								<el-date-picker
-									v-model="state.queryParams.beginQueueTime"
-									type="datetimerange"
-									unlink-panels
-									range-separator="至"
-									start-placeholder="队列开始开始时间"
-									end-placeholder="队列开始结束时间"
-									:shortcuts="shortcuts"
-									@change="beginQueueTimeChange"
-									value-format="YYYY-MM-DD[T]HH:mm:ss"
-                  :default-time="defaultTimeStartEnd"
-								/>
-							</el-form-item>
-						</el-col>
-					</transition>
-					<transition name="el-zoom-in-top">
-						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3'].includes(state.queryParams.type)">
-							<el-form-item prop="endQueueTime">
-								<el-date-picker
-									v-model="state.queryParams.endQueueTime"
-									type="datetimerange"
-									unlink-panels
-									range-separator="至"
-									start-placeholder="队列结束开始时间"
-									end-placeholder="队列结束结束时间"
-									:shortcuts="shortcuts"
-									@change="endQueueTimeChange"
-									value-format="YYYY-MM-DD[T]HH:mm:ss"
-                  :default-time="defaultTimeStartEnd"
-								/>
-							</el-form-item>
-						</el-col>
-					</transition>
-					<transition name="el-zoom-in-top">
-						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3'].includes(state.queryParams.type)">
-							<el-form-item prop="beginRingTime">
-								<el-date-picker
-									v-model="state.queryParams.beginRingTime"
-									type="datetimerange"
-									unlink-panels
-									range-separator="至"
-									start-placeholder="振铃开始开始时间"
-									end-placeholder="振铃开始结束时间"
-									:shortcuts="shortcuts"
-									@change="beginRingTimeChange"
-									value-format="YYYY-MM-DD[T]HH:mm:ss"
-                  :default-time="defaultTimeStartEnd"
-								/>
-							</el-form-item>
-						</el-col>
-					</transition>
-					<transition name="el-zoom-in-top">
-						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol && ['0', '1', '3'].includes(state.queryParams.type)">
-							<el-form-item prop="endRingTime">
-								<el-date-picker
-									v-model="state.queryParams.endRingTime"
-									type="datetimerange"
-									unlink-panels
-									range-separator="至"
-									start-placeholder="振铃结束开始时间"
-									end-placeholder="振铃结束结束时间"
-									:shortcuts="shortcuts"
-									@change="endRingTimeChange"
-									value-format="YYYY-MM-DD[T]HH:mm:ss"
                   :default-time="defaultTimeStartEnd"
 								/>
 							</el-form-item>
@@ -423,9 +425,10 @@ const allColumns = [
 	{ prop: 'cpn', label: '主叫号码', width: 120 },
 	{ prop: 'cdpn', label: '被叫号码', width: 120 },
 	{ prop: 'order.no', label: '工单编码', width: 150 },
-	{ prop: 'title', label: '工单标题', width: 300 },
+	{ prop: 'order.title', label: '工单标题', width: 200 },
 	{ prop: 'telNo', label: '响应分机', width: 120 },
 	{ prop: 'gateway', label: '中继号码', width: 120 },
+  { prop: 'mobileAreaName', label: '号码归属地', width: 120 },
 	{ prop: 'userName', label: '话务员', width: 120 },
 	{ prop: 'duration', label: '通话时间(秒)', width: 120 },
 	{ prop: 'onStateText', label: '通话结果' },
@@ -488,7 +491,7 @@ const allColumns = [
 	{ prop: 'overTime', label: '挂断时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
 	{ prop: 'operation', label: '操作', fixed: 'right', width: 160, align: 'center' },
 ];
-// 呼入表头
+// 呼入已接表头
 const inColumns = [
 	{ prop: 'cpn', label: '主叫号码', width: 120 },
 	{ prop: 'cdpn', label: '被叫号码', width: 120 },
@@ -496,6 +499,7 @@ const inColumns = [
 	{ prop: 'title', label: '工单标题', width: 300 },
 	{ prop: 'telNo', label: '响应分机', width: 120 },
 	{ prop: 'gateway', label: '中继号码', width: 120 },
+  { prop: 'mobileAreaName', label: '号码归属地', width: 120 },
 	{ prop: 'userName', label: '话务员', width: 120 },
 	{ prop: 'duration', label: '通话时间(秒)', width: 120 },
 	{ prop: 'endByText', label: '挂机类型', width: 120 },
@@ -556,7 +560,7 @@ const inColumns = [
 	{ prop: 'overTime', label: '挂断结束时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
 	{ prop: 'operation', label: '操作', fixed: 'right', width: 310, align: 'center' },
 ];
-// 呼出表头
+// 呼出已接表头
 const outColumns = [
 	{ prop: 'cpn', label: '主叫号码', width: 120 },
 	{ prop: 'cdpn', label: '被叫号码', width: 120 },
@@ -578,7 +582,7 @@ const outColumns = [
 		render: (scope) => <span>{formatDate(scope.row.answeredTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
 	},
 	{ prop: 'overTime', label: '挂断时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
-	{ prop: 'operation', label: '操作', fixed: 'right', width: 180, align: 'center' },
+	{ prop: 'operation', label: '操作', fixed: 'right', width: 160, align: 'center' },
 ];
 // 未接表头
 const noColumns = [
@@ -586,6 +590,7 @@ const noColumns = [
 	{ prop: 'cdpn', label: '被叫号码', width: 120 },
 	{ prop: 'telNo', label: '响应分机' },
 	{ prop: 'gateway', label: '中继号码', width: 120 },
+  { prop: 'mobileAreaName', label: '号码归属地', width: 120 },
 	{ prop: 'userName', label: '话务员' },
 	{ prop: 'callDirectionText', label: '电话方向' },
 	{
@@ -643,6 +648,7 @@ const smartColumns = [
 	{ prop: 'cpn', label: '主叫号码', width: 120 },
 	{ prop: 'cdpn', label: '被叫号码', width: 120 },
 	{ prop: 'gateway', label: '中继号码', width: 120 },
+  { prop: 'mobileAreaName', label: '号码归属地', width: 120 },
 	{ prop: 'duration', label: '通话时间(秒)', width: 120 },
 	{ prop: 'endByText', label: '挂机类型', width: 120 },
 	{
@@ -657,36 +663,6 @@ const smartColumns = [
 		width: 170,
 		render: (scope) => <span>{formatDate(scope.row.endIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
 	},
-	{
-		prop: 'beginQueueTime',
-		label: '队列开始时间',
-		width: 170,
-		render: (scope) => <span>{formatDate(scope.row.beginQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
-	},
-	{
-		prop: 'endQueueTime',
-		label: '队列结束时间',
-		width: 170,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.endQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{
-		prop: 'beginRingTime',
-		label: '开始振铃时间',
-		width: 170,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.beginRingTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{
-		prop: 'endRingTimg',
-		label: '结束振铃时间',
-		width: 170,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.endRingTimg, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
 	{
 		prop: 'createdTime',
 		label: '开始时间',
@@ -700,8 +676,94 @@ const smartColumns = [
 		render: (scope) => <span>{formatDate(scope.row.answeredTime, ' YYYY-mm-dd HH:MM:SS')}</span>,
 	},
 	{ prop: 'overTime', label: '挂断结束时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
-	{ prop: 'operation', label: '操作', fixed: 'right', width: 180, align: 'center' },
+	{ prop: 'operation', label: '操作', fixed: 'right', width: 160, align: 'center' },
 ];
+// 呼入白名单表头
+const whiteColumns = [
+  { prop: 'cpn', label: '主叫号码', width: 120 },
+  { prop: 'cdpn', label: '被叫号码', width: 120 },
+  { prop: 'telNo', label: '响应分机', width: 120 },
+  { prop: 'gateway', label: '中继号码', width: 120 },
+  { prop: 'mobileAreaName', label: '号码归属地', width: 120 },
+  { prop: 'userName', label: '话务员', width: 120 },
+  { prop: 'duration', label: '通话时间(秒)', width: 120 },
+  { prop: 'onStateText', label: '通话结果' },
+  { prop: 'callDirectionText', label: '电话方向' },
+  { prop: 'endByText', label: '挂机类型', width: 120 },
+  {
+    prop: 'beginIvrTime',
+    label: 'ivr开始时间',
+    width: 170,
+    render: (scope) => <span>{formatDate(scope.row.beginIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+  },
+  {
+    prop: 'endIvrTime',
+    label: 'ivr结束时间',
+    width: 170,
+    render: (scope) => <span>{formatDate(scope.row.endIvrTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+  },
+  {
+    prop: 'beginQueueTime',
+    label: '队列开始时间',
+    width: 170,
+    render: (scope) => <span>{formatDate(scope.row.beginQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+  },
+  {
+    prop: 'endQueueTime',
+    label: '队列结束时间',
+    width: 170,
+    render: (scope) => {
+      return <span>{formatDate(scope.row.endQueueTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+    },
+  },
+  {
+    prop: 'beginRingTime',
+    label: '开始振铃时间',
+    width: 170,
+    render: (scope) => {
+      return <span>{formatDate(scope.row.beginRingTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+    },
+  },
+  {
+    prop: 'endRingTimg',
+    label: '结束振铃时间',
+    width: 170,
+    render: (scope) => {
+      return <span>{formatDate(scope.row.endRingTimg, 'YYYY-mm-dd HH:MM:SS')}</span>;
+    },
+  },
+  {
+    prop: 'createdTime',
+    label: '开始时间',
+    width: 170,
+    render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+  },
+  {
+    prop: 'answeredTime',
+    label: '接通时间',
+    width: 170,
+    render: (scope) => <span>{formatDate(scope.row.answeredTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+  },
+  { prop: 'overTime', label: '挂断时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
+  { prop: 'operation', label: '操作', fixed: 'right', width: 160, align: 'center' },
+]
+// 呼入黑名单表头
+const blackColumns = [
+  { prop: 'cpn', label: '主叫号码', minWidth: 120 },
+  { prop: 'cdpn', label: '被叫号码', minWidth: 120 },
+  { prop: 'telNo', label: '响应分机', minWidth: 120 },
+  { prop: 'gateway', label: '中继号码', minWidth: 120 },
+  { prop: 'mobileAreaName', label: '号码归属地', minWidth: 120 },
+  { prop: 'duration', label: '通话时间(秒)', minWidth: 120 },
+  { prop: 'endByText', label: '挂机类型', minWidth: 120 },
+  {
+    prop: 'createdTime',
+    label: '开始时间',
+    width: 170,
+    render: (scope) => <span>{formatDate(scope.row.createdTime, 'YYYY-mm-dd HH:MM:SS')}</span>,
+  },
+  { prop: 'overTime', label: '挂断结束时间', width: 170, render: (scope) => <span>{formatDate(scope.row.overTime, 'YYYY-mm-dd HH:MM:SS')}</span> },
+]
 const changeTba = () => {
 	ruleFormRef.value.resetFields();
 	handleQuery();
@@ -728,29 +790,38 @@ const queryList = async () => {
 		Reflect.deleteProperty(request, 'type'); // 删除无用的参数
 
 		switch (state.queryParams.type) {
-			case '0':
+			case '0': // 全部
 				columns.value = allColumns;
 				break;
-			case '1':
+			case '1': // 呼入已接
 				columns.value = inColumns;
 				request.CallDirection = 0;
 				request.OnState = 1;
 				break;
-			case '2':
+			case '2': // 呼出已接
 				columns.value = outColumns;
 				request.CallDirection = 1;
 				request.OnState = 1;
 				break;
-			case '3':
+			case '3': // 未接
 				columns.value = noColumns;
 				request.OnState = 2;
 				break;
-			case '4':
+			case '4': // 智能应答
 				columns.value = smartColumns;
 				request.IsAiAnswered = true;
 				request.OnState = 1;
 				request.CallDirection = 0;
 				break;
+      case '5': // 呼入白名单
+        columns.value = whiteColumns;
+        request.PhoneTypes = 1; // 呼入VIP
+        request.CallDirection = 0; // 来电
+        break;
+      case '6': // 呼入黑名单
+        columns.value = blackColumns;
+        request.PhoneTypes = 2; // 呼入黑名单
+        break;
 			default:
 				columns.value = allColumns;
 				break;

+ 1 - 2
src/views/todo/order/index.vue

@@ -161,6 +161,7 @@ const columnsTodo = [
 	{ prop: 'expiredStatusText', label: '超期状态', align: 'center', width: 80 },
 	{ prop: 'no', label: '工单编码', width: 150 },
 	{ prop: 'isProvinceText', label: '省/市工单', width: 100 },
+  { prop: 'emergencyLevelText', label: '是否紧急'},
 	{ prop: 'actualHandleStepName', label: '办理节点', width: 150 },
 	{ prop: 'statusText', label: '工单状态', width: 100 },
 	{ prop: 'title', label: '工单标题', width: 300 },
@@ -190,7 +191,6 @@ const columnsTodo = [
 		},
 	},
 	{ prop: 'acceptType', label: '受理类型', width: 150 },
-	{ prop: 'emergencyLevelText', label: '紧急程度', width: 150 },
 	{ prop: 'sourceChannel', label: '来源方式', width: 100 },
 	{ prop: 'hotspotName', label: '热点分类', width: 200 },
 	{ prop: 'acceptorName', label: '受理人', width: 120 },
@@ -237,7 +237,6 @@ const columnsDone = [
 	{ prop: 'orgLevelOneName', label: '一级部门', width: 150 },
 	{ prop: 'actualHandleOrgName', label: '接办部门', width: 150 },
 	{ prop: 'acceptType', label: '受理类型', width: 150 },
-	{ prop: 'emergencyLevelText', label: '紧急程度', width: 150 },
 	{ prop: 'sourceChannel', label: '来源方式', width: 100 },
 	{ prop: 'hotspotName', label: '热点分类', width: 200 },
 	{ prop: 'acceptorName', label: '受理人', width: 120 },

+ 58 - 36
src/views/todo/seats/accept/index.vue

@@ -119,13 +119,11 @@
 									<el-form-item label="服务坐席">
 										<!-- 手动创建 -->
 										<template v-if="state.createBy === 'manual'">
-											<span
-												>{{ state.ruleForm.acceptorName }}</span>
+											<span>{{ state.ruleForm.acceptorName }}</span>
 										</template>
 										<!-- 来电弹单 -->
 										<template v-if="state.createBy === 'tel'">
-											<span
-												>{{ state.ruleForm.acceptorName }}</span>
+											<span>{{ state.ruleForm.acceptorName }}</span>
 										</template>
 										<!-- 互联网来信 -->
 										<template v-if="state.createBy === 'letter'">
@@ -193,7 +191,7 @@
 										<el-input v-model="state.ruleForm.licenceNo" placeholder="请填写证件号码" clearable> </el-input>
 									</el-form-item>
 								</el-col>
-<!--								<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+								<!--								<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 									<el-form-item label="年龄段" prop="ageRangeObj" :rules="[{ required: false, message: '请选择年龄段', trigger: 'change' }]">
 										<el-select
 											v-model="state.ruleForm.ageRangeObj"
@@ -276,14 +274,24 @@
 										</el-select>
 									</el-form-item>
 								</el-col>
-                <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
-                  <el-form-item label="重点关注事件" prop="focusOnEvents" :rules="[{ required: false, message: '请选择重点关注事件', trigger: 'change' }]">
-                    <el-select v-model="state.ruleForm.focusOnEvents" placeholder="请选择重点关注事件" class="w100" multiple @change="changeFocusEvent">
-                      <el-option v-for="item in state.focusOnEvents" :key="item.key" :label="item.value" :value="item.key" />
-                    </el-select>
-                  </el-form-item>
-                </el-col>
-<!--								<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+								<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+									<el-form-item
+										label="重点关注事件"
+										prop="focusOnEventsArr"
+										:rules="[{ required: false, message: '请选择重点关注事件', trigger: 'change' }]"
+									>
+										<el-select
+											v-model="state.ruleForm.focusOnEventsArr"
+											placeholder="请选择重点关注事件"
+											class="w100"
+											multiple
+											@change="changeFocusEvent"
+										>
+											<el-option v-for="item in state.focusOnEvents" :key="item.key" :label="item.value" :value="item.key" />
+										</el-select>
+									</el-form-item>
+								</el-col>
+								<!--								<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 									<el-form-item label="紧急程度" prop="emergencyLevel" :rules="[{ required: true, message: '请选择紧急程度', trigger: 'change' }]">
 										<el-select v-model="state.ruleForm.emergencyLevel" placeholder="请选择紧急程度" class="w100">
 											<el-option v-for="item in state.emergencyLevelOptions" :key="item.key" :label="item.value" :value="item.key" />
@@ -332,7 +340,7 @@
 										/>
 									</el-form-item>
 								</el-col>
-<!--								<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+								<!--								<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 									<el-form-item label="事发时间" prop="incidentTime" :rules="[{ required: false, message: '请选择事发时间', trigger: 'change' }]">
 										<el-date-picker
 											v-model="state.ruleForm.incidentTime"
@@ -392,8 +400,8 @@
 										</div>
 									</el-row>
 								</el-col>
-                <!-- 系统配置 可以配置是否开启重复工单 -->
-								<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24"  v-if="AppConfigInfo.isOpenRepeatedWorkOrders">
+								<!-- 系统配置 可以配置是否开启重复工单 -->
+								<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="AppConfigInfo.isOpenRepeatedWorkOrders">
 									<el-row>
 										<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 											<el-form-item label="是否重复" prop="isRepeat" :rules="[{ required: true, message: '请选择是否重复', trigger: 'change' }]">
@@ -465,7 +473,7 @@
 									</el-row>
 								</el-col>
 								<!-- 宜宾特殊需求,可配置开关 -->
-<!--								<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+								<!--								<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 									<el-form-item
 										label="是否行政执法工单"
 										label-width="140px"
@@ -640,7 +648,10 @@ const state = reactive<any>({
 		orderExtension: null, // 拓展信息
 		transpond: false, // 是否市州互转
 		isEnforcementOrder: false, // 是否行政执法工单
-    focusOnEvents: [], // 重点关注事项
+		focusOnEventsArr: [], // 重点关注事项
+		focusOnEvents: null, // 重点关注事项 字符串
+		isFormalistWorkOrder: false, // 是否形式主义工单
+		isSensitiveWorkOrders: false, // 是否敏感类工单
 	},
 	formLoading: false, // 表单加载状态
 	hotspotExternal: [], // 热点分类外部数据
@@ -666,7 +677,7 @@ const state = reactive<any>({
 			key: 'false',
 		},
 	],
-  focusOnEvents:[],// 重点关注事项
+	focusOnEvents: [], // 重点关注事项
 	orderId: null, // 工单id
 	orgData: [],
 });
@@ -951,15 +962,23 @@ const saveExpandForm = (val: any) => {
 };
 // 选择重点关注事项
 const changeFocusEvent = (val: string[]) => {
-  const isUrgent = val.includes('0'); // 紧急工单
-  if(isUrgent){
-    state.ruleForm.emergencyLevel = 2; // 紧急程度调整为紧急
-  }else{
-    state.ruleForm.emergencyLevel = 1; // 默认一般
-  }
-  const isEnforce = val.includes('2'); // 是否行政执法类工单
-  state.ruleForm.isEnforcementOrder = isEnforce;
-  console.log(`是否紧急工单:${isUrgent},是否行政执法类类工单:${isEnforce}`)
+	if (val.includes('0')) {
+		// 紧急工单
+		state.ruleForm.emergencyLevel = 2; // 紧急程度调整为紧急
+		state.ruleForm.emergencyLevelText = '紧急';
+	} else {
+		state.ruleForm.emergencyLevel = 1; // 默认一般
+		state.ruleForm.emergencyLevelText = '一般';
+	}
+	state.ruleForm.isFormalistWorkOrder = val.includes('1'); // 是否形式主义工单
+	state.ruleForm.isSensitiveWorkOrders = val.includes('3'); // 是否敏感类工单
+	state.ruleForm.isEnforcementOrder = val.includes('2'); // 是否行政执法类工单
+	state.ruleForm.focusOnEvents = val.join(',');
+	console.log(
+		`是否紧急工单:${val.includes('0')},是否行政执法类类工单:${val.includes('2')},是否形式主义工单:${val.includes('1')},是否敏感类工单:${val.includes(
+			'3'
+		)}`
+	);
 };
 // 删除不必要的属性
 const deleteUnnecessaryProperties = (obj: any) => {
@@ -1093,8 +1112,8 @@ const chooseAdvice = (item: any) => {
 // 流程提交成功
 const orderProcessSuccess = () => {
 	mittBus.emit('clearCache', 'todoSeats');
-  // mittBus.emit('clearCache', ['order', 'todoSeats', 'todoOrder', 'todoCenter', 'callLog']);
-  mittBus.emit('clearCachePage', ['order', 'todoOrder', 'todoCenter', 'callLog'])
+	// mittBus.emit('clearCache', ['order', 'todoSeats', 'todoOrder', 'todoCenter', 'callLog']);
+	mittBus.emit('clearCachePage', ['order', 'todoOrder', 'todoCenter', 'callLog']);
 	// 关闭当前 tagsView
 	mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
 };
@@ -1125,7 +1144,6 @@ const orderOverwrite = (val: any) => {
 };
 // 加载基础数据
 const loadBaseData = async () => {
-	state.formLoading = true;
 	try {
 		const res = await orderBaseDataAdd();
 		state.acceptTypeOptions = res.result?.acceptTypeOptions ?? [];
@@ -1138,17 +1156,15 @@ const loadBaseData = async () => {
 		state.licenceTypeOptions = res.result?.licenceTypeOptions ?? [];
 		state.ageRangeOptions = res.result?.ageRangeOptions ?? [];
 		state.transpondCity = res.result?.transpondCity ?? [];
-    state.focusOnEvents = res.result?.focusOnEvents ?? [];
-		state.formLoading = false;
+		state.focusOnEvents = res.result?.focusOnEvents ?? [];
 	} catch (error) {
-		state.formLoading = false;
-	} finally {
-		state.formLoading = false;
+		console.log(error);
 	}
 };
 // 如果是修改加载表单内容
 const historyParams = history.state;
 const loadForm = async () => {
+	state.formLoading = true;
 	//  historyParams.createBy  createBy 代表来源  tel:来电弹单  letter:互联网来信 默认表示手动创建
 	if (historyParams.createBy) {
 		state.createBy = historyParams.createBy;
@@ -1183,6 +1199,9 @@ const loadForm = async () => {
 		} else {
 			state.ruleForm.isRepeat = 'false';
 		}
+		if (state.ruleForm.focusOnEvents) {
+			state.ruleForm.focusOnEventsArr = response.result.focusOnEvents.split(',');
+		}
 		state.ruleForm.channel = {
 			// 来源渠道
 			dicDataValue: state.ruleForm.sourceChannelCode,
@@ -1222,6 +1241,9 @@ const loadForm = async () => {
 			dicDataValue: state.ruleForm.transpondCityValue,
 			dicDataName: state.ruleForm.transpondCityName,
 		};
+		state.formLoading = false;
+	} else {
+		state.formLoading = false;
 	}
 };
 // 加载省市区

+ 0 - 2
src/views/todo/seats/index.vue

@@ -181,7 +181,6 @@ const columnsTodo = [
 		},
 	},
 	{ prop: 'acceptType', label: '受理类型', width: 150 },
-	{ prop: 'emergencyLevelText', label: '紧急程度', width: 150 },
 	{ prop: 'sourceChannel', label: '来源方式', width: 100 },
 	{ prop: 'hotspotName', label: '热点分类', width: 200 },
 	{ prop: 'acceptorName', label: '受理人', width: 120 },
@@ -228,7 +227,6 @@ const columnsDone = [
 	{ prop: 'orgLevelOneName', label: '一级部门', width: 150 },
 	{ prop: 'actualHandleOrgName', label: '接办部门', width: 150 },
 	{ prop: 'acceptType', label: '受理类型', width: 150 },
-	{ prop: 'emergencyLevelText', label: '紧急程度', width: 150 },
 	{ prop: 'sourceChannel', label: '来源方式', width: 100 },
 	{ prop: 'hotspotName', label: '热点分类', width: 200 },
 	{ prop: 'acceptorName', label: '受理人', width: 120 },