소스 검색

reactor:485 关于甄别退回意见和审批不同意的调整;446 多人并行 智能回访(暂时关闭短信回访);

zhangchong 3 주 전
부모
커밋
d41c21d7a6

+ 9 - 0
src/api/auxiliary/area.ts

@@ -12,6 +12,15 @@ export const treeArea = () => {
 		method: 'get',
 	});
 };
+/**
+ * @description 获取省市区树形 (泸州)
+ */
+export const treeAreaLZ = () => {
+	return request({
+		url: `/api/v1/Sys/area/tree_accepted`,
+		method: 'get',
+	});
+};
 /**
  * @description 导出省市区树形
  */

+ 1 - 0
src/layout/navBars/breadcrumb/zgTel.vue

@@ -1445,6 +1445,7 @@ const retBusy = (data: any) => {
 
 		// 小休开始了
 		// const restReasons = state.restReasonOptions.find((item: any) => item.dicDataValue === reason);
+		onEndRecord('1'); // 结束话后整理
 		busyOn({ reason: '' }) // 开始小休 设置示忙 业务系统统计需要
 			.then(() => {
 				console.log(`${getNowDateTime()}:业务系统调用示忙开始成功`);

+ 9 - 0
src/router/route.ts

@@ -709,6 +709,15 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 			isKeepAlive: true,
 		},
 	},
+	{
+		path: '/statistics/order/detailVisitContent',
+		name: 'statisticsOrderDetailVisitContent',
+		component: () => import('@/views/statistics/order/detailVisitContent.vue'),
+		meta: {
+			title: '智能回访不满意明细',
+			isKeepAlive: true,
+		},
+	},
 	{
 		path: '/examTrain/questionBank/edit/:tagsViewName/:id?',
 		name: 'questionEdit',

+ 21 - 1
src/views/business/delay/components/Delay-audit.vue

@@ -62,7 +62,7 @@
 			<vxe-column type="seq" width="70"></vxe-column>
 			<vxe-column type="expand" width="60">
 				<template #content="{ row }">
-					<div class="mb5 formatted-text">审核意见:{{ row.opinion }}</div>
+					<div class="mb5 formatted-text">{{ row.handleModeTypeText }}:{{ row.opinion }}</div>
 					<annex-list name="附件" readonly businessId="" classify="查看附件" v-model="row.files" />
 				</template>
 			</vxe-column>
@@ -229,6 +229,26 @@ const formatTraces = (val: any) => {
 	if (!val || !val.length) return [];
 	val.forEach((item: any) => {
 		item.files = transformFile(item.files);
+		// 需要给意见做一个映射关系 正常就是审核意见 其他状态就是其他意见 比如重办就是重办意见
+		switch (item.handleMode) {
+			case 0:
+				item.handleModeTypeText = '审核意见';
+				break;
+			case 100:
+				item.handleModeTypeText = '退回意见';
+				break;
+			case 200:
+				item.handleModeTypeText = '特提意见';
+				break;
+			case 201:
+				item.handleModeTypeText = '重办意见';
+				break;
+			case 203:
+				item.handleModeTypeText = '发布退回意见';
+				break;
+			default:
+				break;
+		}
 	});
 	return val;
 };

+ 21 - 1
src/views/business/delay/components/Delay-detail.vue

@@ -45,7 +45,7 @@
 			<vxe-column type="seq" width="70"></vxe-column>
 			<vxe-column type="expand" width="60">
 				<template #content="{ row }">
-					<div class="mb5 formatted-text">审核意见:{{ row.opinion }}</div>
+					<div class="mb5 formatted-text">{{row.handleModeTypeText}}:{{ row.opinion }}</div>
 					<annex-list name="附件" readonly businessId="" classify="查看附件" v-model="row.files" />
 				</template>
 			</vxe-column>
@@ -118,6 +118,26 @@ const formatTraces = (val: any) => {
 	if (!val || !val.length) return [];
 	val.forEach((item: any) => {
 		item.files = transformFile(item.files);
+		// 需要给意见做一个映射关系 正常就是审核意见 其他状态就是其他意见 比如重办就是重办意见
+		switch (item.handleMode) {
+			case 0:
+				item.handleModeTypeText = '审核意见';
+				break;
+			case 100:
+				item.handleModeTypeText = '退回意见';
+				break;
+			case 200:
+				item.handleModeTypeText = '特提意见';
+				break;
+			case 201:
+				item.handleModeTypeText = '重办意见';
+				break;
+			case 203:
+				item.handleModeTypeText = '发布退回意见';
+				break;
+			default:
+				break;
+		}
 	});
 	return val;
 };

+ 64 - 15
src/views/business/discern/components/Discern-audit.vue

@@ -57,7 +57,7 @@
 				<vxe-column type="seq" width="70"></vxe-column>
 				<vxe-column type="expand" width="60">
 					<template #content="{ row }">
-						<div class="mb5 formatted-text">审核意见:{{ row.opinion }}</div>
+						<div class="mb5 formatted-text">{{ row.handleModeTypeText }}:{{ row.opinion }}</div>
 						<annex-list name="附件" readonly businessId="" classify="查看附件" v-model="row.files" />
 					</template>
 				</vxe-column>
@@ -174,6 +174,7 @@ import { storeToRefs } from 'pinia';
 import other from '@/utils/other';
 import { useThemeConfig } from '@/stores/themeConfig';
 import { fileDownloadByUrl } from '@/api/public/file';
+import { deleteEnd } from '@/api/query/end';
 
 const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue')); // 附件列表
 const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
@@ -280,6 +281,26 @@ const formatTraces = (val: any) => {
 	if (!val || !val.length) return [];
 	val.forEach((item: any) => {
 		item.files = transformFile(item.files);
+		// 需要给意见做一个映射关系 正常就是审核意见 其他状态就是其他意见 比如重办就是重办意见
+		switch (item.handleMode) {
+			case 0:
+				item.handleModeTypeText = '审核意见';
+				break;
+			case 100:
+				item.handleModeTypeText = '退回意见';
+				break;
+			case 200:
+				item.handleModeTypeText = '特提意见';
+				break;
+			case 201:
+				item.handleModeTypeText = '重办意见';
+				break;
+			case 203:
+				item.handleModeTypeText = '发布退回意见';
+				break;
+			default:
+				break;
+		}
 	});
 	return val;
 };
@@ -477,9 +498,9 @@ const onSubmit = (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	formEl.validate((valid: boolean) => {
 		if (!valid) return;
-		state.loading = true;
 		let submitObj = other.deepClone(state.ruleForm);
 		if (state.ruleForm.isPass) {
+			state.loading = true;
 			// 审批通过 下一步
 			discernApprove({ ...submitObj, reviewResult: 1, files: handleFiles.value, provinceFiles: provinceFiles.value, screenId: discernId.value })
 				.then(() => {
@@ -489,20 +510,48 @@ const onSubmit = (formEl: FormInstance | undefined) => {
 					afterSubmit('updateList');
 				});
 		} else {
-			// 审批拒绝
-			const requestDiscernAudit = {
-				opinion: state.ruleForm.opinion,
-				workflowId: state.ruleForm.workflowId,
-				files: handleFiles.value,
-				stepId: state.ruleForm.stepId,
-			};
-			workflowReject(requestDiscernAudit)
-				.then(() => {
-					afterSubmit('updateList', true);
+			if (['ZiGong'].includes(themeConfig.value.appScope)) {
+				ElMessageBox.confirm(`审批不同意后,申请人无法再次申请甄别,是否确认提交?`, '提示', {
+					confirmButtonText: '确定',
+					cancelButtonText: '取消',
+					type: 'warning',
+					draggable: true,
+					autofocus: false,
 				})
-				.catch(() => {
-					afterSubmit('updateList');
-				});
+					.then(() => {
+						state.loading = true;
+						// 审批拒绝
+						const requestDiscernAudit = {
+							opinion: state.ruleForm.opinion,
+							workflowId: state.ruleForm.workflowId,
+							files: handleFiles.value,
+							stepId: state.ruleForm.stepId,
+						};
+						workflowReject(requestDiscernAudit)
+							.then(() => {
+								afterSubmit('updateList', true);
+							})
+							.catch(() => {
+								afterSubmit('updateList');
+							});
+					})
+					.catch(() => {});
+			} else {
+				// 审批拒绝
+				const requestDiscernAudit = {
+					opinion: state.ruleForm.opinion,
+					workflowId: state.ruleForm.workflowId,
+					files: handleFiles.value,
+					stepId: state.ruleForm.stepId,
+				};
+				workflowReject(requestDiscernAudit)
+					.then(() => {
+						afterSubmit('updateList', true);
+					})
+					.catch(() => {
+						afterSubmit('updateList');
+					});
+			}
 		}
 	});
 };

+ 22 - 1
src/views/business/discern/components/Discern-detail.vue

@@ -45,7 +45,7 @@
 			<vxe-column type="seq" width="70"></vxe-column>
 			<vxe-column type="expand" width="60">
 				<template #content="{ row }">
-					<div class="mb5 formatted-text">审核意见:{{ row.opinion }}</div>
+					<div class="mb5 formatted-text">{{row.handleModeTypeText}}:{{ row.opinion }}</div>
 					<annex-list name="附件" readonly businessId="" classify="查看附件" v-model="row.files" />
 				</template>
 			</vxe-column>
@@ -131,6 +131,26 @@ const formatTraces = (val: any) => {
 	if (!val || !val.length) return [];
 	val.forEach((item: any) => {
 		item.files = transformFile(item.files);
+		// 需要给意见做一个映射关系 正常就是审核意见 其他状态就是其他意见 比如重办就是重办意见
+		switch (item.handleMode) {
+			case 0:
+				item.handleModeTypeText = '审核意见';
+				break;
+			case 100:
+				item.handleModeTypeText = '退回意见';
+				break;
+			case 200:
+				item.handleModeTypeText = '特提意见';
+				break;
+			case 201:
+				item.handleModeTypeText = '重办意见';
+				break;
+			case 203:
+				item.handleModeTypeText = '发布退回意见';
+				break;
+			default:
+				break;
+		}
 	});
 	return val;
 };
@@ -141,6 +161,7 @@ const getWorkflow = async (workflowId: string) => {
 		// 查询审核记录
 		const { result } = await workflowTraces(workflowId);
 		tableData.value = formatTraces(result?.traces);
+
 	} catch (e) {
 		console.log(e);
 	}

+ 12 - 0
src/views/business/discern/components/Discern-return.vue

@@ -59,6 +59,14 @@
 		<p class="border-title mt20 mb10">退回意见</p>
 		<el-form :model="state.ruleForm" label-width="110px" ref="ruleFormRef" v-loading="state.loading">
 			<el-row :gutter="10">
+				<el-col v-if="['ZiGong'].includes(themeConfig.appScope)">
+					<el-form-item label="退回类型" prop="isRecallToStartStep" :rules="[{ required: false, message: '请选择退回类型', trigger: 'change' }]">
+						<el-radio-group v-model="state.ruleForm.isRecallToStartStep">
+							<el-radio :value="false">逐级退回</el-radio>
+							<el-radio :value="true">退回至申请人</el-radio>
+						</el-radio-group>
+					</el-form-item>
+				</el-col>
 				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 					<el-form-item label="退回意见" prop="opinion" :rules="[{ required: true, message: '请填写退回意见', trigger: 'blur' }]">
 						<common-advice
@@ -97,6 +105,7 @@ import { commonEnum } from '@/utils/constants';
 import { useAppConfig } from '@/stores/appConfig';
 import { storeToRefs } from 'pinia';
 import other from '@/utils/other';
+import { useThemeConfig } from '@/stores/themeConfig';
 
 const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue')); // 附件列表
 const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
@@ -119,12 +128,15 @@ const state = reactive<any>({
 		backToCountersignEnd: false,
 		stepId: null,
 		workflowId: null,
+		isRecallToStartStep: false,
 	},
 	handlerOptions: [],
 	nextStepOptions: [],
 });
 
 const tableData = ref<EmptyArrayType>([]);
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
 /*
  * @params row 工单详情
  * @description 打开弹窗

+ 21 - 1
src/views/business/terminate/components/Terminate-audit.vue

@@ -31,7 +31,7 @@
 			<vxe-column type="seq" width="70"></vxe-column>
 			<vxe-column type="expand" width="60">
 				<template #content="{ row }">
-					<div class="mb5  formatted-text">审核意见:{{ row.opinion }}</div>
+					<div class="mb5  formatted-text">{{row.handleModeTypeText}}:{{ row.opinion }}</div>
 					<annex-list name="附件" readonly businessId="" classify="查看附件" v-model="row.files" />
 				</template>
 			</vxe-column>
@@ -179,6 +179,26 @@ const formatTraces = (val: any) => {
 	if (!val || !val.length) return [];
 	val.forEach((item: any) => {
 		item.files = transformFile(item.files);
+		// 需要给意见做一个映射关系 正常就是审核意见 其他状态就是其他意见 比如重办就是重办意见
+		switch (item.handleMode) {
+			case 0:
+				item.handleModeTypeText = '审核意见';
+				break;
+			case 100:
+				item.handleModeTypeText = '退回意见';
+				break;
+			case 200:
+				item.handleModeTypeText = '特提意见';
+				break;
+			case 201:
+				item.handleModeTypeText = '重办意见';
+				break;
+			case 203:
+				item.handleModeTypeText = '发布退回意见';
+				break;
+			default:
+				break;
+		}
 	});
 	return val;
 };

+ 175 - 10
src/views/business/visit/components/Visit-detail.vue

@@ -541,6 +541,85 @@
 										</div>
 									</el-form-item>
 								</el-col>
+								<!-- 宜宾的重办 -->
+								<template v-if="['YiBin'].includes(themeConfig.appScope)">
+									<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+										<el-form-item label="" prop="isTransact" :rules="[{ required: false, message: '请选择是否重办', trigger: 'change' }]">
+											<el-checkbox v-model="state.ruleForm.isTransact" @change="selectIsTransact">重办</el-checkbox>
+										</el-form-item>
+									</el-col>
+									<template v-if="state.ruleForm.isTransact">
+										<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="w100">
+											<el-row :gutter="10" class="w100">
+												<el-col :xs="24" :sm="12" :md="12" :lg="10" :xl="10">
+													<el-form-item
+														label="流转目标"
+														prop="nextStepCode"
+														:rules="[{ required: true, message: '请选择流转目标', trigger: 'change' }]"
+													>
+														<el-select v-model="state.ruleForm.nextStepCode" placeholder="请选择流转目标" @change="selectNextCode">
+															<el-option v-for="item in steps" :value="item.key" :key="item.key" :label="item.value"> </el-option>
+														</el-select>
+													</el-form-item>
+												</el-col>
+												<el-col :xs="24" :sm="12" :md="12" :lg="10" :xl="10">
+													<el-form-item prop="timeLimit" label-width="0px" :rules="[{ required: true, message: '请填写延期数量', trigger: 'blur' }]">
+														<!--									<el-select
+													v-model="state.ruleForm.timeLimit"
+													placeholder="请选择延期数量"
+													:rules="[{ required: true, message: '请选择延期数量', trigger: 'change' }]"
+													clearable
+												>
+													<el-option v-for="item in delayOptions" :value="item.value" :key="item.value" :label="item.label" />
+												</el-select>-->
+														<el-input-number
+															v-model="state.ruleForm.timeLimit"
+															:min="1"
+															:precision="0"
+															class="w100"
+															:max="10"
+															placeholder="请填写延期数量"
+														/>
+													</el-form-item>
+												</el-col>
+												<el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4">
+													<el-form-item
+														prop="timeLimitUnit"
+														label-width="0px"
+														:rules="[{ required: true, message: '请选择延期申请单位', trigger: 'change' }]"
+													>
+														<el-select v-model="state.ruleForm.timeLimitUnit" placeholder="延期申请单位" disabled>
+															<el-option v-for="item in timeType" :value="item.key" :key="item.key" :label="item.value" />
+														</el-select>
+													</el-form-item>
+												</el-col>
+											</el-row>
+										</el-col>
+										<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+											<el-form-item label="重办原因" :rules="[{ required: true, message: '请选择重办原因', trigger: 'change' }]" prop="error">
+												<el-select
+													v-model="state.ruleForm.error"
+													placeholder="请选择重办原因"
+													value-key="dicDataValue"
+													clearable
+													style="min-width: 240px"
+												>
+													<el-option v-for="items in specialReason" :key="items.dicDataValue" :label="items.dicDataName" :value="items" />
+												</el-select>
+											</el-form-item>
+										</el-col>
+										<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+											<el-form-item label="重办意见" prop="reason" :rules="[{ required: true, message: '请填写重办意见', trigger: 'blur' }]">
+												<common-advice
+													@chooseAdvice="chooseAdvice"
+													v-model="state.ruleForm.reason"
+													placeholder="请填写重办意见"
+													:commonEnum="commonEnum.Return"
+												/>
+											</el-form-item>
+										</el-col>
+									</template>
+								</template>
 							</el-row>
 						</template>
 					</el-form>
@@ -580,7 +659,7 @@
 	<visit-redo ref="visitRedoRef" @updateList="onRedoSuccess" />
 </template>
 <script setup lang="tsx" name="orderFollowUpDetail">
-import { computed, defineAsyncComponent, reactive, ref } from 'vue';
+import { computed, defineAsyncComponent, nextTick, reactive, ref } from 'vue';
 import { ElMessage, FormInstance } from 'element-plus';
 import { commonEnum, getNowDateTime } from '@/utils/constants';
 import { storeToRefs } from 'pinia';
@@ -594,6 +673,7 @@ import { specialApplyBase } from '@/api/business/special';
 import { submitLog } from '@/api/public/log';
 import { Local, Session } from '@/utils/storage';
 import { useAppConfig } from '@/stores/appConfig';
+import { publishReturnBaseData } from '@/api/business/publish';
 
 // 引入组件
 const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
@@ -612,6 +692,13 @@ const state = reactive<any>({
 		visitDetails: {},
 		orgJudge: false, // 扭转部门满意度
 		seatJudge: false, // 扭转坐席满意度
+		isTransact: false, // 是否重办
+
+		nextStepCode: null, // 退回节点
+		reason: '', // 重办意见
+		timeLimitUnit: 2,
+		timeLimit: 1,
+		stepType: null,
 	},
 	orderDetail: {}, // 工单详情
 	orderVisitModel: {}, // 回访详情
@@ -730,6 +817,7 @@ const callId = ref<string>('');
 const appConfigStore = useAppConfig();
 const { AppConfigInfo } = storeToRefs(appConfigStore); // 系统配置信息
 const openDialog = (row: any, type: string = '回访') => {
+	state.ruleForm.isTransact = false;
 	const callIdSession = Session.get(row.id);
 	if (callIdSession) callId.value = callIdSession;
 	mittBus.on('outboundConnect', (data) => {
@@ -806,13 +894,53 @@ const selectReason = (val: any, index: number | string) => {
 			key: item.dicDataValue,
 		};
 	});
-	console.log(state.ruleForm.visitDetails[index].orgNoSatisfiedReason);
 };
 const close = () => {
 	ruleFormRef.value?.clearValidate();
 	ruleFormRef.value?.resetFields();
+	state.ruleForm.isTransact = false;
 	callId.value = '';
 	mittBus.off('outboundConnect');
+	steps.value = [];
+	timeType.value = [];
+	specialReason.value = [];
+};
+// 选择是否重办
+const steps = ref<EmptyArrayType>([]); // 退回节点
+const timeType = ref<EmptyArrayType>([]); // 时间单位
+const specialReason = ref<EmptyArrayType>([]); // 重办原因
+const selectIsTransact = async (val: any) => {
+	if (val) {
+		const baseRes = await publishReturnBaseData(state.orderDetail.id);
+		timeType.value = baseRes.result?.specialTimeType ?? [];
+		steps.value = baseRes.result?.step?.steps ?? [];
+		specialReason.value = baseRes.result?.specialReason ?? [];
+		if (baseRes.result.defaultStepKey) {
+			await nextTick(() => {
+				// 如果有默认值需要默认选中
+				state.ruleForm.nextStepCode = baseRes.result.defaultStepKey;
+				state.ruleForm.nextStepName = steps.value.find((item) => item.key === baseRes.result?.defaultStepKey).value;
+				selectNextCode(baseRes.result.defaultStepKey);
+			});
+		}
+	} else {
+		steps.value = [];
+		timeType.value = [];
+		specialReason.value = [];
+	}
+};
+// 选择重办节点
+const orgId = ref('');
+const orgName = ref('');
+const selectNextCode = (val: any) => {
+	const next = steps.value.find((item: any) => item.key === val);
+	state.ruleForm.nextStepName = next.value; // 下一节点name
+	state.ruleForm.businessType = next.businessType;
+	state.ruleForm.flowDirection = next.flowDirection;
+	state.ruleForm.handlerType = next.handlerType;
+	state.ruleForm.stepType = next.stepType;
+	orgId.value = next.handler.orgId;
+	orgName.value = next.handler.orgName;
 };
 // 提交
 const onSubmit = (formEl: FormInstance | undefined) => {
@@ -820,19 +948,56 @@ const onSubmit = (formEl: FormInstance | undefined) => {
 	formEl.validate((valid: boolean) => {
 		if (!valid) return;
 		state.loading = true;
-		let request = {
-			...state.ruleForm,
-			// isPutThrough: !state.ruleForm.isPutThrough,
-			...state.visitDetails,
-			id: visitId.value,
-			isUpdate: dialogTitle.value === '修改回访结果',
-		};
+		let reTransactError: any;
+		reTransactError = [
+			{
+				orgId: orgId.value,
+				orgName: orgName.value,
+				errorId: state.ruleForm.error?.dicDataValue,
+				errorName: state.ruleForm.error?.dicDataName,
+			},
+		];
+		let request: EmptyObjectType = {};
+		if (state.ruleForm.isTransact) {
+			// 重办
+			request = {
+				...state.ruleForm,
+				// isPutThrough: !state.ruleForm.isPutThrough,
+				...state.visitDetails,
+				id: visitId.value,
+				isUpdate: dialogTitle.value === '修改回访结果',
+				orderReTransact: {
+					workflowId: state.orderDetail.workflowId,
+					orderId: state.orderDetail.id,
+					nextStepCode: state.ruleForm.nextStepCode,
+					nextStepName: state.ruleForm.nextStepName,
+					reason: state.ruleForm.reason,
+					timeLimit: state.ruleForm.timeLimit,
+					timeLimitUnit: state.ruleForm.timeLimitUnit,
+					alterTime: !!state.ruleForm.timeLimit,
+					businessType: state.ruleForm.businessType,
+					flowDirection: state.ruleForm.flowDirection,
+					handlerType: state.ruleForm.handlerType,
+					stepType: state.ruleForm.stepType,
+					reTransactError,
+					specialType: 2, // 1特提 2重办 3退回
+				},
+			};
+		} else {
+			request = {
+				...state.ruleForm,
+				// isPutThrough: !state.ruleForm.isPutThrough,
+				...state.visitDetails,
+				id: visitId.value,
+				isUpdate: dialogTitle.value === '修改回访结果',
+			};
+		}
 		if (callId.value) {
 			request.callId = callId.value;
 		}
 		visitOrder(request)
 			.then(() => {
-				ElMessage.success('操作成功');
+				ElMessage.success('回访成功');
 				Session.remove(visitId.value);
 				state.loading = false;
 				closeDialog();

+ 0 - 1
src/views/business/visit/components/Visit-redo.vue

@@ -41,7 +41,6 @@
 							</el-select>
 						</el-form-item>
 					</el-col>
-
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-form-item label="重办意见" prop="reason" :rules="[{ required: true, message: '请填写重办意见', trigger: 'blur' }]">
 							<common-advice

+ 12 - 6
src/views/judicial/order/components/verify.vue

@@ -31,10 +31,15 @@
 						node-key="id"
 					/>
 				</el-form-item>
-				<el-form-item label="个案类型" prop="isTheClueTrue" :rules="[{ required: true, message: '请选择个案类型', trigger: 'change' }]" v-if="state.ruleForm.isTheClueTrue">
-					<el-radio-group v-model="state.ruleForm.isTheClueTrue">
-						<el-radio-button label="一般个案例" value="1" />
-						<el-radio-button label="重点关注个案" value="2" />
+				<el-form-item
+					label="个案类型"
+					prop="caseType"
+					:rules="[{ required: true, message: '请选择个案类型', trigger: 'change' }]"
+					v-if="state.ruleForm.isTheClueTrue"
+				>
+					<el-radio-group v-model="state.ruleForm.caseType">
+						<el-radio-button label="一般个案例" :value="0" />
+						<el-radio-button label="重点关注个案" :value="1" />
 					</el-radio-group>
 				</el-form-item>
 			</el-form>
@@ -42,7 +47,7 @@
 		<template #footer>
 			<span class="dialog-footer">
 				<el-button @click="closeDialog" class="default-button">取 消</el-button>
-				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">提交</el-button>
+				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">确定</el-button>
 			</span>
 		</template>
 	</el-dialog>
@@ -64,6 +69,7 @@ const state = reactive<any>({
 		eventTypeId: null, // 问题类型
 		eventTypeName: null, // 问题类型名称
 		eventTypeSpliceName: null, // 问题类型全名
+		caseType: 0, // 个案类型
 	},
 });
 const ruleFormRef = ref<RefType>();
@@ -110,7 +116,7 @@ const close = () => {
 	ruleFormRef.value?.clearValidate();
 	ruleFormRef.value?.resetFields();
 };
-const change = (val:boolean) => {
+const change = (val: boolean) => {
 	if (!val) {
 		ruleFormRef.value.resetFields('eventTypeId');
 		state.ruleForm.eventTypeId = null;

+ 7 - 15
src/views/judicial/order/index.vue

@@ -5,29 +5,21 @@
 				<el-form-item label="快捷查询" prop="IsTheClueTrueText">
 					<el-segmented
 						:options="[
-							{
-								value: '0',
-								label: '全部',
-							},
 							{
 								value: '1',
-								label: '待核实',
+								label: '待确认',
 							},
 							{
-								value: '2',
-								label: '线索属实',
+								value: '5',
+								label: '执法类工单',
 							},
 							{
 								value: '3',
-								label: '线索不属实',
+								label: '非执法类工单',
 							},
 							{
-								value: '4',
-								label: '推诿工单',
-							},
-							{
-								value: '5',
-								label: '行政执法类工单',
+								value: '0',
+								label: '全部',
 							},
 						]"
 						v-model="state.queryParams.IsTheClueTrueText"
@@ -255,7 +247,7 @@ const state = reactive<any>({
 		CreationTimeStart: null,
 		CreationTimeEnd: null,
 		NameOrNo: null,
-		IsTheClueTrueText: '0', // 快捷查询
+		IsTheClueTrueText: '1', // 快捷查询 默认待确认
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 9 - 17
src/views/judicial/statistics/eventClass.vue

@@ -31,25 +31,25 @@
 			</el-form>
 		</el-card>
 		<el-row :gutter="20">
-			<el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4">
+			<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
 				<el-card shadow="never" v-loading="state.loading" class="statistics-item">
 					<el-statistic :value="state.orderCount.theClueIsTrue">
 						<template #title>
-							<span class="color-info font14">线索属实</span>
+							<span class="color-info font14">总工单</span>
 						</template>
 					</el-statistic>
 				</el-card>
 			</el-col>
-			<el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4">
+			<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
 				<el-card shadow="never" v-loading="state.loading" class="statistics-item">
-					<el-statistic :value="state.orderCount.theClueIsNotTrue">
+					<el-statistic :value="state.orderCount.passTheBuckOrder">
 						<template #title>
-							<span class="color-info font14">线索不属实</span>
+							<span class="color-info font14">推诿工单</span>
 						</template>
 					</el-statistic>
 				</el-card>
 			</el-col>
-			<el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4">
+			<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
 				<el-card shadow="never" v-loading="state.loading" class="statistics-item">
 					<el-statistic :value="state.orderCount.enforcementOrder">
 						<template #title>
@@ -58,20 +58,12 @@
 					</el-statistic>
 				</el-card>
 			</el-col>
-			<el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4">
-				<el-card shadow="never" v-loading="state.loading" class="statistics-item">
-					<el-statistic :value="state.orderCount.passTheBuckOrder">
-						<template #title>
-							<span class="color-info font14">推诿工单</span>
-						</template>
-					</el-statistic>
-				</el-card>
-			</el-col>
-			<el-col :xs="24" :sm="12" :md="12" :lg="4" :xl="4">
+
+			<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
 				<el-card shadow="never" v-loading="state.loading" class="statistics-item">
 					<el-statistic :value="state.orderCount.toBeVerified">
 						<template #title>
-							<span class="color-info font14">待核实</span>
+							<span class="color-info font14">非执法类工单</span>
 						</template>
 					</el-statistic>
 				</el-card>

+ 11 - 2
src/views/statistics/order/YBVisitCount.vue

@@ -36,7 +36,7 @@
 				</el-card>
 			</el-col>
 			<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
-				<el-card shadow="never" v-loading="state.loading" class="statistics-item">
+				<el-card shadow="never" v-loading="state.loading" class="statistics-item cursor-pointer" @click="linkDetail">
 					<el-statistic :value="state.data.aiVisitNoSatisfiedCount">
 						<template #title>
 							<span class="color-info font14">智能回访不满意量</span>
@@ -70,7 +70,7 @@
 				:loading="state.loading"
 				:data="state.tableData"
 				:column-config="{ resizable: true }"
-				:row-config="{ isCurrent: true, isHover: true, height: 30, useKey:true }"
+				:row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true }"
 				ref="tableRef"
 				auto-resize
 				:scrollY="{ enabled: true, gt: 100 }"
@@ -98,6 +98,7 @@ import { departmentVisit, departmentVisitExport } from '@/api/statistics/order';
 import { defaultDate } from '@/utils/constants';
 import Other from '@/utils/other';
 import XEUtils from 'xe-utils';
+import { useRouter } from 'vue-router';
 
 const StatisticalTime = defineAsyncComponent(() => import('@/components/StatisticalTime/index.vue')); // 日期类型选择组件
 const ruleFormRef = ref<RefType>(); // 表单ref
@@ -161,6 +162,14 @@ const footerMethod = ({ columns, data }) => {
 		}),
 	];
 };
+// 查看详情
+const router = useRouter();
+const linkDetail = () => {
+	router.push({
+		path: '/statistics/order/detailVisitContent',
+		query: {},
+	});
+};
 const toolbarRef = ref<RefType>();
 const tableRef = ref<RefType>();
 onMounted(() => {

+ 179 - 0
src/views/statistics/order/detailVisitContent.vue

@@ -0,0 +1,179 @@
+<template>
+	<div class="statistics-order-detail-visit-content-container layout-padding">
+		<div class="layout-padding-auto layout-padding-view pd20">
+			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
+				<el-form-item label="工单编码" prop="No">
+					<el-input v-model="state.queryParams.No" placeholder="工单编码" clearable @keyup.enter="handleQuery" class="keyword-input" />
+				</el-form-item>
+				<el-form-item label="来电主体" prop="TypeId">
+					<el-select v-model="state.queryParams.TypeId" placeholder="请选择来电主体" @change="handleQuery">
+						<el-option :value="0" label="全部" />
+						<el-option :value="1" label="市民" />
+						<el-option :value="2" label="企业" />
+					</el-select>
+				</el-form-item>
+				<!--        <el-form-item label="超期类型" prop="ExpiredType">
+					<el-select v-model="state.queryParams.ExpiredType" placeholder="请选择超期类型" clearable @change="handleQuery">
+						<el-option  value="1" label="系统中超期"></el-option>
+						<el-option  value="2" label="申请延期超期"></el-option>
+					</el-select>
+				</el-form-item>-->
+				<el-form-item>
+					<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+					<el-button @click="resetQuery(ruleFormRef)" class="default-button" :loading="state.loading">
+						<SvgIcon name="ele-Refresh" class="mr5" />重置
+					</el-button>
+				</el-form-item>
+			</el-form>
+			<vxe-toolbar
+				ref="toolbarRef"
+				:loading="state.loading"
+				custom
+				:refresh="{
+					queryMethod: handleQuery,
+				}"
+				:tools="[{ toolRender: { name: 'exportCurrent' } }, { toolRender: { name: 'exportAll' } }]"
+			>
+			</vxe-toolbar>
+			<div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
+				<vxe-table
+					border
+					:loading="state.loading"
+					:data="state.tableData"
+					:column-config="{ resizable: true }"
+					:row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true }"
+					ref="tableRef"
+					height="auto"
+					auto-resize
+					show-overflow
+					:scrollY="{ enabled: true, gt: 100 }"
+					id="statisticsOrderDetailVisitContent"
+					:custom-config="{ storage: true }"
+					showHeaderOverflow
+					:sort-config="{ remote: true }"
+					:params="{ exportMethod: departmentOverdueDetailExport, exportParams: requestParams }"
+				>
+					<vxe-column field="order.expiredStatusText" title="状态" width="60" align="center">
+						<template #default="{ row }">
+							<span :class="'overdue-status-' + row.order?.expiredStatus" :title="row.order.expiredStatusText"></span>
+						</template>
+					</vxe-column>
+					<vxe-column field="statusText" title="工单状态" width="110">
+						<template #default="{ row }">
+							<el-text type="danger" tag="b" v-if="[1, 2, 3, 9, 101, 102, 103, 104, 105, 200].includes(row.status)">{{ row.statusText }}</el-text>
+							<span v-else>{{ row.statusText }}</span>
+						</template>
+					</vxe-column>
+					<vxe-column field="sourceChannel" title="来源渠道" width="110"></vxe-column>
+					<vxe-column field="no" title="工单编码" width="140"></vxe-column>
+					<vxe-column field="creationTime" title="受理时间" width="160">
+						<template #default="{ row }">
+							{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</template>
+					</vxe-column>
+					<vxe-column field="creationTime" title="操作时间" width="160">
+						<template #default="{ row }">
+							{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</template>
+					</vxe-column>
+					<vxe-column field="title" title="工单标题" min-width="200">
+						<template #default="{ row }">
+							<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
+						</template>
+					</vxe-column>
+					<vxe-column field="acceptorName" title="手机号" width="120"></vxe-column>
+					<vxe-column field="acceptorName" title="回访人" width="120"></vxe-column>
+					<vxe-column field="creationTime" title="回复时间" width="160">
+						<template #default="{ row }">
+							{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
+						</template>
+					</vxe-column>
+					<vxe-column field="hotspotName" title="回复内容" min-width="200"></vxe-column>
+					<vxe-column field="orgLevelOneName" title="坐席满意度" width="140"></vxe-column>
+					<vxe-column field="actualHandleOrgName" title="部门满意度" width="140"></vxe-column>
+				</vxe-table>
+			</div>
+			<pagination
+				@pagination="queryList"
+				:total="state.total"
+				v-model:current-page="state.queryParams.PageIndex"
+				v-model:page-size="state.queryParams.PageSize"
+				:disabled="state.loading"
+			/>
+		</div>
+	</div>
+</template>
+<script setup lang="tsx" name="statisticsOrderDetailVisitContent">
+import { computed, defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { FormInstance } from 'element-plus';
+import { formatDate } from '@/utils/formatTime';
+import { useRoute } from 'vue-router';
+import { departmentOverdueDetail, departmentOverdueDetailExport } from '@/api/statistics/department';
+
+// 引入组件
+const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
+const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
+
+// 定义变量内容
+const ruleFormRef = ref<RefType>(); // 表单ref
+const state = reactive({
+	queryParams: {
+		// 查询条件
+		PageIndex: 1,
+		PageSize: 20,
+		No: null, //
+		ExpiredType: null,
+		TypeId: 0,
+	},
+	tableData: [], //表单
+	loading: false, // 加载
+	total: 0, // 总数
+});
+// 手动查询,将页码设置为1
+const handleQuery = () => {
+	state.queryParams.PageIndex = 1;
+	queryList();
+};
+/** 获取列表 */
+const route = useRoute();
+const routeQueryParams = route.query;
+const requestParams = ref<EmptyObjectType>({});
+const queryList = () => {
+	state.loading = true;
+	requestParams.value = {
+		PageIndex: state.queryParams.PageIndex,
+		PageSize: state.queryParams.PageSize,
+		No: state.queryParams?.No,
+		StartTime: routeQueryParams?.StartTime,
+		EndTime: routeQueryParams?.EndTime,
+		OrgCode: routeQueryParams?.OrgCode,
+		QueryType: routeQueryParams?.QueryType,
+	};
+	departmentOverdueDetail(requestParams.value)
+		.then((res) => {
+			state.tableData = res.result?.items ?? [];
+			state.total = res.result?.total ?? 0;
+			state.loading = false;
+		})
+		.catch((err) => {
+			console.log(err);
+		})
+		.finally(() => {
+			state.loading = false;
+		});
+};
+const toolbarRef = ref<RefType>();
+const tableRef = ref<RefType>();
+/** 重置按钮操作 */
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	queryList();
+};
+onMounted(async () => {
+	queryList();
+	if (tableRef.value && toolbarRef.value) {
+		tableRef.value.connect(toolbarRef.value);
+	}
+});
+</script>

+ 7 - 5
src/views/todo/seats/accept/lzAccept.vue

@@ -425,7 +425,7 @@
 <script setup lang="ts" name="orderAccept">
 import { computed, defineAsyncComponent, onMounted, onUnmounted, reactive, ref, watch } from 'vue';
 import type { FormInstance } from 'element-plus';
-import { ElMessage, ElMessageBox } from 'element-plus';
+import { ElMessage } from 'element-plus';
 import { storeToRefs } from 'pinia';
 import { useRoute } from 'vue-router';
 import { useAppConfig } from '@/stores/appConfig';
@@ -433,7 +433,7 @@ import { throttle, transformFile } from '@/utils/tools';
 import { commonEnum } from '@/utils/constants';
 import { orderAdd, orderBaseDataAdd, orderBaseExt, orderDetail, orderEdit } from '@/api/business/order';
 import { useUserInfo } from '@/stores/userInfo';
-import { treeArea } from '@/api/auxiliary/area';
+import { treeAreaLZ } from '@/api/auxiliary/area';
 import mittBus from '@/utils/mitt';
 import { orderRepeatEvent } from '@/api/business/repeatEvent';
 import { removeDuplicate } from '@/utils/arrayOperation';
@@ -489,8 +489,10 @@ const state = reactive<any>({
 		eventCategoryId: null, // 事件分类
 		incidentTime: null, // 事发时间
 		incidentPurpose: null, // 事件目的
-		areaCode: themeConfig.value.cityCode, // 区域编码
-		city: themeConfig.value.cityName, // 市
+/*		areaCode: themeConfig.value.cityCode, // 区域编码
+		city: themeConfig.value.cityName, // 市*/
+		areaCode: null, // 区域编码
+		city: null, // 市
 		street: null, // 街道
 		isRepeat: 'false', // 是否重复工单 默认否
 		pushType: null, // 推送类型
@@ -1283,7 +1285,7 @@ const addressLoading = ref<boolean>(false);
 const loadAddress = async () => {
 	addressLoading.value = true;
 	try {
-		const area = await treeArea();
+		const area = await treeAreaLZ();
 		state.areaOptions = area.result ?? []; //省市区数据
 		addressLoading.value = false;
 		await loadExtra();