Bladeren bron

reactor:关于司法板块的优化;

zhangchong 9 maanden geleden
bovenliggende
commit
71f9f872bc

+ 21 - 29
src/api/business/return.ts

@@ -14,31 +14,6 @@ export const returnBase = (params?: object) => {
 		params,
 	});
 };
-/**
- * @description 工单退回审批列表
- * @param {object} params
- */
-export const returnList = (params: object) => {
-	return request({
-		url: `/api/v1/Order/order_previous_list`,
-		method: 'get',
-		params,
-	});
-};
-/**
- * @description 工单退回审批列表导出
- * @param {object} data
- */
-export const returnExport = (data: object) => {
-	return request({
-		url: `/api/v1/Order/order_previous_list/_export`,
-		method: 'post',
-		data,
-		responseType: 'blob',
-	},{
-		reduce_data_format:false
-	});
-};
 /**
  * @description 省退回申请列表
  * @param {object} params
@@ -102,7 +77,24 @@ export const returnAuditList = (params: object) => {
 		method: 'get',
 		params,
 	});
-}
+};
+/**
+ * @description 工单退回审批列表导出
+ * @param {object} data
+ */
+export const returnExport = (data: object) => {
+	return request(
+		{
+			url: `/api/v1/Order/order_previous_list/_export`,
+			method: 'post',
+			data,
+			responseType: 'blob',
+		},
+		{
+			reduce_data_format: false,
+		}
+	);
+};
 /**
  * @description 工单退回批量审核
  * @param {object} data
@@ -113,7 +105,7 @@ export const returnAuditAddBatch = (data: object) => {
 		method: 'post',
 		data,
 	});
-}
+};
 /**
  * @description 工单退回审核
  * @param {object} data
@@ -124,7 +116,7 @@ export const returnAuditAdd = (data: object) => {
 		method: 'post',
 		data,
 	});
-}
+};
 /**
  * @description 工单退回详情
  * @param {string} id
@@ -134,4 +126,4 @@ export const returnAuditDetail = (id: string) => {
 		url: `/api/v1/Order/order_previous/${id}`,
 		method: 'get',
 	});
-}
+};

+ 27 - 17
src/api/judicial/index.ts

@@ -4,7 +4,6 @@
  */
 import request from '@/utils/request';
 import qs from 'qs';
-
 /**
  * @description 获取工单列表
  * @param params
@@ -12,10 +11,9 @@ import qs from 'qs';
  */
 export const getWorkList = (params: object) => {
 	return request({
-		url: '/api/v1/EnforcementOrder/getorderlist',
+		url: '/api/v1/JudicialManagementOrders/getorderlist',
 		method: 'get',
-		params,
-		paramsSerializer: (params: any) => qs.stringify(params),
+		params
 	});
 };
 
@@ -26,7 +24,7 @@ export const getWorkList = (params: object) => {
  */
 export const listBaseData = (params?: object) => {
 	return request({
-		url: '/api/v1/EnforcementOrder/base-data',
+		url: '/api/v1/JudicialManagementOrders/base-data',
 		method: 'get',
 		params,
 	});
@@ -38,7 +36,7 @@ export const listBaseData = (params?: object) => {
  */
 export const getClues = (data: object) => {
 	return request({
-		url: '/api/v1/EnforcementOrder/clue_verification',
+		url: '/api/v1/JudicialManagementOrders/clue_verification',
 		method: 'post',
 		data,
 	});
@@ -49,7 +47,7 @@ export const getClues = (data: object) => {
  */
 export const getCluesBaseData = () => {
 	return request({
-		url: '/api/v1/EnforcementOrder/treelist',
+		url: '/api/v1/JudicialManagementOrders/treelist',
 		method: 'get',
 	});
 };
@@ -60,7 +58,7 @@ export const getCluesBaseData = () => {
  */
 export const eventStatistics = (params?: object) => {
 	return request({
-		url: '/api/v1/EnforcementOrder/event_classification_statistics',
+		url: '/api/v1/JudicialManagementOrders/event_classification_statistics',
 		method: 'get',
 		params,
 	});
@@ -72,7 +70,7 @@ export const eventStatistics = (params?: object) => {
  */
 export const eventStatisticsDetail = (params?: object) => {
 	return request({
-		url: '/api/v1/EnforcementOrder/event_classification_statistics_order_list',
+		url: '/api/v1/JudicialManagementOrders/event_classification_statistics_order_list',
 		method: 'get',
 		params,
 	});
@@ -84,7 +82,7 @@ export const eventStatisticsDetail = (params?: object) => {
  */
 export const areaStatistics = (params?: object) => {
 	return request({
-		url: '/api/v1/EnforcementOrder/regional_classification_statistics',
+		url: '/api/v1/JudicialManagementOrders/regional_classification_statistics',
 		method: 'get',
 		params,
 	});
@@ -96,7 +94,7 @@ export const areaStatistics = (params?: object) => {
  */
 export const areaStatisticsDetail = (params?: object) => {
 	return request({
-		url: '/api/v1/EnforcementOrder/regional_classification_statistics_order_list',
+		url: '/api/v1/JudicialManagementOrders/regional_classification_statistics_order_list',
 		method: 'get',
 		params,
 	});
@@ -108,7 +106,7 @@ export const areaStatisticsDetail = (params?: object) => {
  */
 export const departmentStatistics = (params?: object) => {
 	return request({
-		url: '/api/v1/EnforcementOrder/enforcement_departmental_processing_statistics',
+		url: '/api/v1/JudicialManagementOrders/enforcement_departmental_processing_statistics',
 		method: 'get',
 		params,
 	});
@@ -120,7 +118,7 @@ export const departmentStatistics = (params?: object) => {
  */
 export const departmentStatisticsDetail = (params?: object) => {
 	return request({
-		url: '/api/v1/EnforcementOrder/enforcement_departmental_processing_statistics_order_list',
+		url: '/api/v1/JudicialManagementOrders/enforcement_departmental_processing_statistics_order_list',
 		method: 'get',
 		params,
 	});
@@ -132,7 +130,7 @@ export const departmentStatisticsDetail = (params?: object) => {
  */
 export const departmentStatisticsDepartmentDetail = (params?: object) => {
 	return request({
-		url: '/api/v1/EnforcementOrder/enforcement_departmental_processing_statistics_child',
+		url: '/api/v1/JudicialManagementOrders/enforcement_departmental_processing_statistics_child',
 		method: 'get',
 		params,
 	});
@@ -144,7 +142,7 @@ export const departmentStatisticsDepartmentDetail = (params?: object) => {
  */
 export const departmentSatisfaction = (params?: object) => {
 	return request({
-		url: '/api/v1/EnforcementOrder/enforcement_visit_org_satisfaction_statistics',
+		url: '/api/v1/JudicialManagementOrders/enforcement_visit_org_satisfaction_statistics',
 		method: 'get',
 		params,
 	});
@@ -156,7 +154,7 @@ export const departmentSatisfaction = (params?: object) => {
  */
 export const departmentSatisfactionDetail = (params?: object) => {
 	return request({
-		url: '/api/v1/EnforcementOrder/enforcement_visit_org_satisfaction_statistics_order_list',
+		url: '/api/v1/JudicialManagementOrders/enforcement_visit_org_satisfaction_statistics_order_list',
 		method: 'get',
 		params,
 	});
@@ -168,7 +166,19 @@ export const departmentSatisfactionDetail = (params?: object) => {
  */
 export const departmentSatisfactionChildDetail = (params?: object) => {
 	return request({
-		url: '/api/v1/EnforcementOrder/enforcement_visit_org_satisfaction_statistics_child',
+		url: '/api/v1/JudicialManagementOrders/enforcement_visit_org_satisfaction_statistics_child',
+		method: 'get',
+		params,
+	});
+};
+/**
+ * @description 获取区域信息子父级
+ * @param params
+ * @return {*}
+ */
+export const getAreaChildren = (params?: object) => {
+	return request({
+		url: '/api/v1/JudicialManagementOrders/area/tree',
 		method: 'get',
 		params,
 	});

+ 75 - 0
src/api/judicial/order.ts

@@ -0,0 +1,75 @@
+/*
+ * @Author: zc
+ * @description 自定义工单
+ */
+import request from '@/utils/request';
+import qs from 'qs';
+/**
+ * @description 新增司法工单
+ * @param data
+ * @return {*}
+ */
+export const addJudicial = (data: object) => {
+	return request({
+		url: '/api/v1/JudicialManagementOrders',
+		method: 'post',
+		data,
+	});
+};
+/**
+ * @description 修改司法工单
+ * @param data
+ * @return {*}
+ */
+export const editJudicial = (data: object) => {
+	return request({
+		url: '/api/v1/JudicialManagementOrders',
+		method: 'put',
+		data,
+	});
+};
+/**
+ * @description 查询司法工单详情
+ * @param id
+ * @return {*}
+ */
+export const getJudicial = (id: string) => {
+	return request({
+		url: `/api/v1/JudicialManagementOrders/${id}`,
+		method: 'get',
+	});
+};
+/**
+ * @description 启用禁用司法工单
+ * @param id
+ * @return {*}
+ */
+export const enableJudicial = (id: object) => {
+	return request({
+		url: `/api/v1/JudicialManagementOrders?id=${id}`,
+		method: 'get',
+	});
+};
+/**
+ * @description 删除司法工单
+ * @param id
+ * @return {*}
+ */
+export const deleteJudicial = (id: string) => {
+	return request({
+		url: `/api/v1/JudicialManagementOrders/${id}`,
+		method: 'delete',
+	});
+};
+/**
+ * @description 获取司法受理工单列表
+ * @param params
+ * @return {*}
+ */
+export const judicialList = (params: object) => {
+	return request({
+		url: '/api/v1/JudicialManagementOrders/getownorderlist',
+		method: 'get',
+		params
+	});
+};

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

@@ -183,7 +183,7 @@
 					</p>
 				</template>
 				<div class="collapse-container">
-					<el-form label-width="100px" ref="ruleFormRef">
+					<el-form label-width="100px" ref="ruleFormRef" class="show-info-form">
 						<el-row :gutter="10">
 							<el-col :xs="24" :sm="24" :md="8" :lg="6" :xl="6">
 								<el-form-item label="交办部门"> 热线中心 </el-form-item>
@@ -191,16 +191,16 @@
 							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.centerToOrgTime">
 								<el-form-item label="交办时间"> {{ formatDate(state.ruleForm.centerToOrgTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
 							</el-col>
-							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.actualHandleOrgNam">
 								<el-form-item label="办理部门"> {{ state.ruleForm.actualHandleOrgName }}</el-form-item>
 							</el-col>
-							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.actualHandleTime">
 								<el-form-item label="办理时间"> {{ formatDate(state.ruleForm.actualHandleTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
 							</el-col>
-							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.timeLimit">
 								<el-form-item label="工单办理期限"> {{ state.ruleForm.timeLimit }}</el-form-item>
 							</el-col>
-							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.expiredTime">
 								<el-form-item label="工单期满时间">
 									{{ formatDate(state.ruleForm.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}
 								</el-form-item>

+ 1 - 0
src/layout/footer/index.vue

@@ -26,6 +26,7 @@ const props = defineProps({
 .layout-footer {
 	width: 100%;
 	display: flex;
+  padding: 5px 0;
 	&-warp {
 		margin: auto;
 		text-align: center;

+ 21 - 47
src/layout/navBars/breadcrumb/ybTel.vue

@@ -1,6 +1,6 @@
 <template>
 	<div class="phoneControls" v-loading="state.loading">
-		<el-popover placement="top-start" :width="240" trigger="hover" v-model:visible="showPop">
+		<el-popover :width="240" trigger="hover" v-model:visible="showPop">
 			<template #reference>
 				<div class="status-box">
 					<span class="color-primary">{{ currentStatusText }}</span>
@@ -8,7 +8,7 @@
 					<el-text tag="b" v-else-if="['空闲', '外呼中'].includes(currentStatusText)">{{ formatDuration(idleTime) }}</el-text>
 					<el-text tag="b" v-else-if="currentStatusText === '小休中'">{{ formatDuration(busyTime) }}</el-text>
 					<el-text tag="b" v-else-if="currentStatusText === '整理中'">{{ formatDuration(arrangeTime) }}</el-text>
-					<SvgIcon name="ele-CaretBottom" class="arrow" :class="{'is-reverse':showPop}"/>
+					<SvgIcon name="ele-CaretBottom" class="arrow" :class="{ 'is-reverse': showPop }" />
 				</div>
 			</template>
 			<template #default>
@@ -38,7 +38,7 @@
 						<el-text tag="b">{{ formatDuration(arrangeTime) }}</el-text>
 					</div>
 				</template>
-				<template v-else> <span class="color-info">请签入</span> </template>
+				<template v-else> <span class="color-info flex flex-center-center">请签入</span> </template>
 			</template>
 		</el-popover>
 
@@ -47,12 +47,7 @@
 			<!-- 签入 -->
 			<template v-if="telStatusInfo.isDutyOn">
 				<!-- 签出可用 -->
-				<div
-					class="item active"
-					@click="onControlClick('dutyOff')"
-					v-if="activeArr.includes('dutyOff')"
-					title="签出"
-				>
+				<div class="item active" @click="onControlClick('dutyOff')" v-if="activeArr.includes('dutyOff')" title="签出">
 					<img :src="state.dutyOffSrc" alt="" />
 					<span>签出</span>
 				</div>
@@ -91,12 +86,7 @@
 
 			<!-- 可用挂断 -->
 			<template v-if="telStatusInfo.isDutyOn && activeArr.includes('hangup')">
-				<div
-					class="item active"
-					:class="state.active.includes('hangup') ? 'active' : ''"
-					@click="onControlClick('hangup')"
-					title="挂断"
-				>
+				<div class="item active" :class="state.active.includes('hangup') ? 'active' : ''" @click="onControlClick('hangup')" title="挂断">
 					<img :src="state.hangupSrc" alt="" />
 					<span>挂断</span>
 				</div>
@@ -111,23 +101,13 @@
 
 			<!-- 小休和结束休息 可用 -->
 			<template v-if="telStatusInfo.isDutyOn && activeArr.includes('rest')">
-				<div
-					class="item active"
-					@click="onControlClick('restEnd')"
-					v-if="telStatusInfo.isRest === 'resting'"
-					title="结束小休"
-				>
+				<div class="item active" @click="onControlClick('restEnd')" v-if="telStatusInfo.isRest === 'resting'" title="结束小休">
 					<img :src="state.restSrc" alt="" />
 					<span
 						>结束<span v-if="restReason">({{ restReason }})</span></span
 					>
 				</div>
-				<div
-					class="item active"
-					@click="onControlClick('rest')"
-					v-else-if="telStatusInfo.isRest === 'unRest'"
-					title="小休"
-				>
+				<div class="item active" @click="onControlClick('rest')" v-else-if="telStatusInfo.isRest === 'unRest'" title="小休">
 					<img :src="state.restSrc" alt="" />
 					<span>小休 </span>
 				</div>
@@ -203,11 +183,7 @@
 
 			<!-- 转接 可用 -->
 			<template v-if="telStatusInfo.isDutyOn && activeArr.includes('transfer')">
-				<div
-					class="item active"
-					@click="onControlClick('transfer')"
-					title="保持"
-				>
+				<div class="item active" @click="onControlClick('transfer')" title="保持">
 					<img :src="state.transferSrc" alt="" />
 					<span>转接</span>
 				</div>
@@ -261,11 +237,7 @@
 
 			<!-- 呼叫 可用-->
 			<template v-if="telStatusInfo.isDutyOn && activeArr.includes('outbound')">
-				<div
-					class="item active"
-					title="呼叫"
-					@click="onControlClick('outbound')"
-				>
+				<div class="item active" title="呼叫" @click="onControlClick('outbound')">
 					<img :src="state.outboundSrc" alt="" />
 					<span>呼叫</span>
 				</div>
@@ -2055,6 +2027,7 @@ const resetState = () => {
 	stopSignTime(); // 移除签入时长定时器
 	stopTalkTimer(); // 移除通话计时器
 	clearTimeout(talkDealTimer.value); // 清除话后整理定时器
+  olaRef.value?.close(); // 关闭链接
 	state.loading = false;
 };
 // 获取当前分机状态
@@ -2187,6 +2160,8 @@ onBeforeUnmount(() => {
 	color: var(--hotline-color-text-main);
 	height: 100%;
 	align-items: center;
+	width: 100%;
+	overflow: hidden;
 	.status-box {
 		width: 240px;
 		display: flex;
@@ -2205,7 +2180,7 @@ onBeforeUnmount(() => {
 		border-radius: var(--el-border-radius-round);
 		background-color: var(--el-color-info-light-8);
 		transition: var(--el-transition-duration);
-    margin-right: 10px;
+		margin-right: 10px;
 		.arrow {
 			position: absolute;
 			right: 10px;
@@ -2218,22 +2193,21 @@ onBeforeUnmount(() => {
 	// 按钮列表
 	.btn-container {
 		display: flex;
-		justify-content: space-between;
-		width: 100%;
-    height: 100%;
+		width: calc(100% - 400px);
+		height: 100%;
 		border-right: 1px solid var(--el-border-color);
-    border-left: 1px solid var(--el-border-color);
+		border-left: 1px solid var(--el-border-color);
 		.item {
-			text-align: center;
 			cursor: pointer;
 			width: 100%;
 			user-select: none;
 			display: flex;
 			align-items: center;
 			justify-content: center;
-			//border-right: 1px solid var(--el-border-color);
 			img {
-				scale: 0.6;
+				width: 18px;
+				height: 18px;
+				margin-right: 3px;
 			}
 			&.disabled {
 				cursor: not-allowed;
@@ -2249,13 +2223,13 @@ onBeforeUnmount(() => {
 		}
 	}
 	.wait-box {
-		width: 170px;
+		width: 140px;
 		display: flex;
 		flex-direction: column;
 		justify-content: center;
 		text-align: center;
 		border-right: 1px solid var(--el-border-color);
-    height: 100%;
+		height: 100%;
 	}
 }
 </style>

+ 219 - 191
src/layout/navBars/breadcrumb/zgTel.vue

@@ -55,9 +55,12 @@
 	<!-- 签入弹窗 -->
 	<el-dialog v-model="state.dutyDialogVisible" draggable title="签入" width="500px" :show-close="false">
 		<el-form :model="state.dutyForm" label-width="80px" ref="dutyFormRef" @submit.native.prevent>
-			<el-form-item label="分机号" prop="telNo" :rules="[{ required: true, message: '请需要签入的分机号', trigger: 'change' }]">
+			<el-form-item label="分机号" prop="telNo" :rules="[{ required: true, message: '请填写分机号', trigger: 'change' }]">
 				<el-input v-model="state.dutyForm.telNo" placeholder="分机号" @keyup.enter="clickOnDuty(dutyFormRef)" />
 			</el-form-item>
+			<el-form-item label="技能组" prop="skillId" :rules="[{ required: true, message: '请填写技能组', trigger: 'change' }]">
+				<el-input v-model="state.dutyForm.skillId" placeholder="技能组" @keyup.enter="clickOnDuty(dutyFormRef)" />
+			</el-form-item>
 		</el-form>
 		<template #footer>
 			<span class="dialog-footer">
@@ -140,6 +143,7 @@ const state = reactive({
 	loading: false,
 	dutyForm: {
 		telNo: '',
+		skillId: '',
 	},
 	outboundDialogVisible: false,
 	outboundForm: {
@@ -209,175 +213,10 @@ const m_IsConsult = ref(false); // 是否咨询
 const m_strConsultType = ref('-1'); // 咨询类型
 const m_IsHangup = ref(false); // 是否挂机
 const m_IsHold = ref(false); // 是否保持
-const callTimeFnTimeout = ref(null) as any; // 实时通话时长定时器
-const m_nStateMonitor = ref(0); // 坐席监控状态页面参数
 const m_IsMonListen = ref('0'); // 监控状态 0-未监听;1-监控成功;2-监控失败;
 const m_strTelState = ref('0'); // 当前状态
 const m_nCallTime = ref(0); // 实时通话时长
 const showPop = ref(false);
-// 开启链接
-/* JobNum:工号 Name:姓名 Extension:分机号 Extension:分机号 Extension:分机号 Role:角色,保留,不做设置 GroupName:技能组名称 GroupName:技能组名称 GroupName:技能组名称
-  示例消息:
- * { "Action": "ReqAgentLogin", "Param":
- * { "JobNum": "11", "Name": "test", "Extension": "1001", "SkillId": "1", "Level": "1", "Role": "1", "GroupName": "go",
- * "OrgId": "110","AutoAnswer": "1" } }
- * */
-const e_websocketOpen = () => {
-	console.log('开启链接');
-	const sendObj = {
-		Action: 'ReqAgentLogin',
-		Param: {
-			ExtNum: m_strUserNo.value,
-			JobNum: m_strJobNum.value,
-			Name: m_strUserNo.value,
-			Extension: m_strUserNo.value,
-			SkillId: m_strSkillId.value,
-			Level: m_strLevel.value,
-			Role: '',
-			GroupName: m_strGroup.value,
-			OrgId: m_strCompanyId.value,
-		},
-	};
-	// 发送请求
-	e_TelSendMsg(sendObj);
-};
-// 链接关闭
-const e_websocketClose = () => {
-	console.log('链接关闭');
-};
-// 链接错误
-const e_websocketError = () => {
-	console.log('链接错误');
-};
-// 消息接收
-const e_TelMsgReceive = (ws: any, restMsg: any) => {
-	console.log(getNowDateTime() + ' 接收消息:' + restMsg.data);
-	if (restMsg.data) {
-		const data = eval('(' + restMsg.data + ')');
-		if (data) {
-			// 方法
-			const strAction = data.Action;
-			switch (strAction) {
-				// 登录返回值
-				case 'ResAgentLogin':
-					retSignIn(data);
-					break;
-				// 示闲
-				case 'ResAgentIdle':
-					retIdle(data);
-					break;
-				// 示忙
-				case 'ResAgentBusy':
-					retBusy(data);
-					break;
-				// 外呼状态
-				case 'ResMakeCall':
-					retCallOut(data);
-					break;
-				// 保持
-				case 'ResHoldCall':
-					retHold(data);
-					break;
-				// 取消保持
-				case 'ResRetrieve':
-					retRehold(data);
-					break;
-				// 咨询内线
-				case 'ResConsultInline':
-					retConsult(data, '0');
-					break;
-				// 咨询外线
-				case 'ResConsultOutline':
-					retConsult(data, '1');
-					break;
-				// 咨询群组
-				case 'ResConsultSkillGroup':
-					retConsult(data, '2');
-					break;
-				// 咨询转移
-				case 'ResTransfer':
-					retResTransfer(data);
-					break;
-				// 三方会议
-				case 'ResConference':
-					retResConference(data);
-					break;
-				// 三方会议
-				case 'ResMonConf':
-					retResConference(data);
-					break;
-				// 坐席实时状态
-				case 'ResAgentMinitor':
-					ResAgentMonitor(data);
-					break;
-				// 监听
-				case 'ResMonListen':
-					retResMonListen(data);
-					break;
-				// 取消监听返回
-				case 'ResStopListen':
-					retResStopListen(data);
-					break;
-			}
-			// 事件
-			const strEvent = data.Event;
-			switch (strEvent) {
-				// 签出事件
-				case 'EvtLogout':
-					retSignOut();
-					break;
-				// 呼入振铃事件
-				case 'EvtCallAlerting':
-					evtCallAlerting(data);
-					break;
-				// 应答事件
-				case 'EvtCallAnswer':
-					evtEvtCallAnswer(data);
-					break;
-				// 挂机事件
-				case 'EvtHangup':
-					retHangup(data);
-					break;
-				// 状态
-				case 'EvtSeatState':
-					evtSeatState(data);
-					break;
-				// 队列等待
-				case 'EvtAcdInfo':
-					i_QueueNum(data);
-					break;
-				// 语音识别结果通知事件
-				case 'EvtRecognize':
-					e_EvtRecognize(data.Param);
-					break;
-
-				// 转三方接通状态
-				case 'EvtDispatchState':
-					e_EvtDispatchState(data.Param);
-					break;
-
-				// 签出事件
-				case 'ResStopMonitor':
-					retSignOut();
-					break;
-
-				case 'ResError': // 异常
-					retHangup(data); // 挂机
-					// 异常处理
-					retResError(data);
-					break;
-				// 呼出接通事件
-				case 'EvtOutCalling':
-					evtEvtCalling(data); // 呼出振铃事件
-					break;
-				// 签出事件
-				case 'EvtQuit':
-					retSignOut();
-					break;
-			}
-		}
-	}
-};
 // 点击事件
 const onEvent = (event: string) => {
 	switch (event) {
@@ -662,22 +501,7 @@ const { AppConfigInfo } = storeToRefs(appConfigStore); // 系统配置信息
 const storesUserInfo = useUserInfo();
 const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
 const onSignIn = () => {
-  console.log(userInfos.value)
-  if (!userInfos.value.defaultTelNo) {
-    ElMessage.error('请先配置用户默认分机');
-    return;
-  }
-  if (!userInfos.value.defaultTelGroup) {
-    ElMessage.error('请先配置用户技能组');
-    return;
-  }
-
-  state.loading = true;
-  m_strUserNo.value = userInfos.value.defaultTelNo; // 默认分机
-  m_strJobNum.value = <string>userInfos.value.staffNo; // 工号
-  m_strSkillId.value = userInfos.value.defaultTelGroup; // 技能组
-  wsRef.value.open();
-	/*if (AppConfigInfo.value.isNeedTelNo) {
+	if (AppConfigInfo.value.isNeedTelNo) {
 		// 需要填写分机号
 		state.dutyDialogVisible = true;
 	} else {
@@ -689,13 +513,12 @@ const onSignIn = () => {
 			ElMessage.error('请先配置用户技能组');
 			return;
 		}
-
 		state.loading = true;
 		m_strUserNo.value = userInfos.value.defaultTelNo; // 默认分机
 		m_strJobNum.value = <string>userInfos.value.staffNo; // 工号
 		m_strSkillId.value = userInfos.value.defaultTelGroup; // 技能组
 		wsRef.value.open();
-	}*/
+	}
 };
 const dutyFormRef = ref();
 const clickOnDuty = (formEl: FormInstance | undefined) => {
@@ -705,6 +528,7 @@ const clickOnDuty = (formEl: FormInstance | undefined) => {
 		state.loading = true;
 		m_strUserNo.value = state.dutyForm.telNo;
 		m_strJobNum.value = state.dutyForm.telNo;
+		m_strSkillId.value = state.dutyForm.skillId;
 		wsRef.value.open();
 		state.dutyDialogVisible = false;
 	});
@@ -740,7 +564,170 @@ const retSignIn = (data: any) => {
 	} else if (data.Param.Result === '7') {
 		// 已经处于登录状态
 		signOutFn();
-		ElMessage.error('已经处于签入状态,请重试');
+		ElMessage.error('已经处于签入状态,系统将自动签出,请重新签入');
+	}
+};
+// 开启链接
+/* JobNum:工号 Name:姓名 Extension:分机号 Extension:分机号 Extension:分机号 Role:角色,保留,不做设置 GroupName:技能组名称 GroupName:技能组名称 GroupName:技能组名称
+  示例消息:
+ * { "Action": "ReqAgentLogin", "Param":
+ * { "JobNum": "11", "Name": "test", "Extension": "1001", "SkillId": "1", "Level": "1", "Role": "1", "GroupName": "go",
+ * "OrgId": "110","AutoAnswer": "1" } }
+ * */
+const e_websocketOpen = () => {
+	console.log('开启链接');
+	const sendObj = {
+		Action: 'ReqAgentLogin',
+		Param: {
+			ExtNum: m_strUserNo.value,
+			JobNum: m_strJobNum.value,
+			Name: m_strUserNo.value,
+			Extension: m_strUserNo.value,
+			SkillId: m_strSkillId.value,
+			Level: m_strLevel.value,
+			Role: '',
+			GroupName: m_strGroup.value,
+			OrgId: m_strCompanyId.value,
+		},
+	};
+	// 发送请求
+	e_TelSendMsg(sendObj);
+};
+// 链接关闭
+const e_websocketClose = () => {
+	console.log('链接关闭');
+};
+// 链接错误
+const e_websocketError = () => {
+	console.log('链接错误');
+};
+// 消息接收
+const e_TelMsgReceive = (ws: any, restMsg: any) => {
+	console.log(getNowDateTime() + ' 接收消息:' + restMsg.data);
+	if (restMsg.data) {
+		const data = eval('(' + restMsg.data + ')');
+		if (data) {
+			// 方法
+			const strAction = data.Action;
+			switch (strAction) {
+				// 登录返回值
+				case 'ResAgentLogin':
+					retSignIn(data);
+					break;
+				// 示闲
+				case 'ResAgentIdle':
+					retIdle(data);
+					break;
+				// 示忙
+				case 'ResAgentBusy':
+					retBusy(data);
+					break;
+				// 外呼状态
+				case 'ResMakeCall':
+					retCallOut(data);
+					break;
+				// 保持
+				case 'ResHoldCall':
+					retHold(data);
+					break;
+				// 取消保持
+				case 'ResRetrieve':
+					retRehold(data);
+					break;
+				// 咨询内线
+				case 'ResConsultInline':
+					retConsult(data, '0');
+					break;
+				// 咨询外线
+				case 'ResConsultOutline':
+					retConsult(data, '1');
+					break;
+				// 咨询群组
+				case 'ResConsultSkillGroup':
+					retConsult(data, '2');
+					break;
+				// 咨询转移
+				case 'ResTransfer':
+					retResTransfer(data);
+					break;
+				// 三方会议
+				case 'ResConference':
+					retResConference(data);
+					break;
+				// 三方会议
+				case 'ResMonConf':
+					retResConference(data);
+					break;
+				// 坐席实时状态
+				case 'ResAgentMinitor':
+					ResAgentMonitor(data);
+					break;
+				// 监听
+				case 'ResMonListen':
+					retResMonListen(data);
+					break;
+				// 取消监听返回
+				case 'ResStopListen':
+					retResStopListen(data);
+					break;
+			}
+			// 事件
+			const strEvent = data.Event;
+			switch (strEvent) {
+				// 签出事件
+				case 'EvtLogout':
+					retSignOut();
+					break;
+				// 呼入振铃事件
+				case 'EvtCallAlerting':
+					evtCallAlerting(data);
+					break;
+				// 应答事件
+				case 'EvtCallAnswer':
+					evtEvtCallAnswer(data);
+					break;
+				// 挂机事件
+				case 'EvtHangup':
+					retHangup(data);
+					break;
+				// 状态
+				case 'EvtSeatState':
+					evtSeatState(data);
+					break;
+				// 队列等待
+				case 'EvtAcdInfo':
+					i_QueueNum(data);
+					break;
+				// 语音识别结果通知事件
+				case 'EvtRecognize':
+					e_EvtRecognize(data.Param);
+					break;
+
+				// 转三方接通状态
+				case 'EvtDispatchState':
+					e_EvtDispatchState(data.Param);
+					break;
+
+				// 签出事件
+				case 'ResStopMonitor':
+					retSignOut();
+					break;
+
+				case 'ResError': // 异常
+					retHangup(data); // 挂机
+					// 异常处理
+					retResError(data);
+					break;
+				// 呼出接通事件
+				case 'EvtOutCalling':
+					evtEvtCalling(data); // 呼出振铃事件
+					break;
+				// 签出事件
+				case 'EvtQuit':
+					retSignOut();
+					break;
+			}
+		}
 	}
 };
 /*
@@ -1672,9 +1659,6 @@ const evtEvtCalling = (data) => {
 /*
  * 计算接通时长
  */
-const i_CallTime = () => {};
-// 队列等待定时器
-const QueryWaitFnTimeout = ref(null) as any;
 // 是否在队列状态
 const m_bIsQueue = ref(false);
 /*
@@ -1684,7 +1668,17 @@ const i_QueueNum = (data) => {
 	// 40,87098300,85961020,1,80|40,87098300,85961020,1,80|40,87098300,85961020,1,80
 	// 处于队列状态
 	m_bIsQueue.value = true;
-	console.log(data.Param, '队列消息');
+	// 队列信息
+	const strInfo = data.Param.Info;
+	if (undefined != strInfo && '' != strInfo) {
+		const arrFirst = strInfo.split('|');
+		if (null != arrFirst && 0 < arrFirst.length) {
+			// 设置队列等待数量
+			console.log(arrFirst.length - 1);
+			e_SetQueryWait(arrFirst.length - 1, strInfo);
+		}
+	}
+	console.log(data.Param, strInfo, '队列消息');
 };
 /*
 语音识别结果保存
@@ -1738,11 +1732,45 @@ const e_TopStateChange = (state: string) => {
  * 更新话机动作
  * 1:登录登出;2:示忙示闲;3:摘机
  */
-const e_ActionUpdate = (strActionType: string) => {};
+const e_ActionUpdate = (strActionType: string) => {
+	const data = {
+		Action: 'ActionUpdate',
+		ActType: strActionType,
+	};
+};
 /*
  * 用户分机签入签出(用户分机分离业务)
+ * 业务改造,先签入我方业务系统,再签入呼叫中心
+ *
  */
-const e_TelSignOut = (strUserNum: string) => {};
+const e_TelSignIn = (strUserNum: string) => {
+	const data = {
+		Action: 'TelSignIn',
+		UserNum: strUserNum,
+	};
+};
+/*
+ * 用户分机签入签出(用户分机分离业务)
+ */
+const e_TelSignOut = (strUserNum: string) => {
+	const data = {
+		Action: 'TelSignOut',
+		UserNum: strUserNum,
+	};
+};
+/**
+ * 保存队列信息
+ * @param {any} strUserNum
+ * @param strQueueInfo
+ */
+const e_SetQueryWait = (strUserNum, strQueueInfo) => {
+	const data = {
+		Action: 'SaveQueueNumNew',
+		QueueNum: strUserNum,
+		QueueInfo: strQueueInfo,
+	};
+};
+
 // 检查用户状态
 onMounted(async () => {
 	// 加入分组

+ 10 - 9
src/layout/navBars/tagsView/tagsView.vue

@@ -609,7 +609,7 @@ watch(
 <style scoped lang="scss">
 .layout-navbars-tagsview {
 	background-color: var(--el-color-white);
-	// border-bottom: 1px solid var(--hotline-border-color-light);
+	 border-bottom: 1px solid var(--hotline-border-color-light);
 	position: relative;
 	z-index: 4;
 	:deep(.el-scrollbar__wrap) {
@@ -617,14 +617,15 @@ watch(
 	}
 
 	&-ul {
-		list-style: none;
-		margin: 0;
-		display: flex;
-		align-items: center;
-		color: var(--el-text-color-regular);
-		font-size: 12px;
-		white-space: nowrap;
-		padding: 0 15px;
+    list-style: none;
+    margin: 0;
+    height: 34px;
+    display: flex;
+    align-items: center;
+    color: var(--el-text-color-regular);
+    font-size: 12px;
+    white-space: nowrap;
+    padding: 0 15px;
 
 		&-li {
 			height: 26px;

+ 3 - 2
src/views/business/return/index.vue

@@ -113,7 +113,7 @@
 import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
 import { FormInstance } from 'element-plus';
 import { useRouter } from 'vue-router';
-import { returnBase, returnExport, returnList } from '@/api/business/return';
+import { returnAuditList, returnBase, returnExport} from '@/api/business/return';
 import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
 import Other from '@/utils/other';
 // 引入组件
@@ -150,6 +150,7 @@ const state = reactive<any>({
 		StartTime: null,
 		EndTime: null,
 		DataScope: '1', // 数据权限
+    AuditState:'3',// 全部数据
 	},
 	tableData: [], //表单
 	loading: false, // 加载
@@ -173,7 +174,7 @@ const queryList = () => {
 	requestParams.value.StartTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[0]; // 生成时间
 	requestParams.value.EndTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
 	Reflect.deleteProperty(requestParams.value, 'crTime'); // 删除无用的参数
-	returnList(requestParams.value)
+  returnAuditList(requestParams.value)
 		.then((res) => {
 			state.tableData = res.result?.items ?? [];
 			state.total = res.result?.total ?? 0;

+ 141 - 240
src/views/judicial/order/components/orderAdd.vue

@@ -16,28 +16,24 @@
 								</el-col>
 								<!-- 来源渠道 -->
 								<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
-									<!-- 手动创建 -->
-									<template v-if="state.createBy === 'manual'">
-										<el-form-item label="来源渠道" prop="channel" :rules="[{ required: true, message: '请选择来源渠道', trigger: 'change' }]">
-											<el-select
-												v-model="state.ruleForm.channel"
-												placeholder="请选择来源渠道"
-												class="w100"
-												clearable
-												value-key="dicDataValue"
-												@change="
-													(val) => {
-														ruleFormRef.resetFields('fromPhone');
-														state.ruleForm.fromPhone = null;
-														state.ruleForm.sourceChannel = val?.dicDataName ?? null;
-														state.ruleForm.sourceChannelCode = val?.dicDataValue ?? null;
-													}
-												"
-											>
-												<el-option v-for="item in state.channelOptions" :value="item" :key="item.dicDataValue" :label="item.dicDataName" />
-											</el-select>
-										</el-form-item>
-									</template>
+									<el-form-item label="来源渠道" prop="channel" :rules="[{ required: false, message: '请选择来源渠道', trigger: 'change' }]">
+										<el-select
+											v-model="state.ruleForm.channel"
+											placeholder="请选择来源渠道"
+											class="w100"
+											clearable
+											value-key="value"
+											disabled
+											@change="
+												(val) => {
+													state.ruleForm.sourceChannel = val?.key ?? null;
+													state.ruleForm.sourceChannelCode = val?.value ?? null;
+												}
+											"
+										>
+											<el-option v-for="item in state.channelOptions" :value="item" :key="item.value" :label="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="fromName" :rules="[{ required: false, message: '请填写来电人姓名', trigger: 'blur' }]">
@@ -63,57 +59,60 @@
 											v-model="state.ruleForm.acceptTypeObj"
 											placeholder="请选择受理类型"
 											class="w100"
-											value-key="dicDataValue"
+											value-key="value"
+											disabled
 											@change="
 												(val) => {
-													state.ruleForm.acceptType = val?.dicDataName ?? null;
-													state.ruleForm.acceptTypeCode = val?.dicDataValue ?? null;
+													state.ruleForm.acceptType = val?.key ?? null;
+													state.ruleForm.acceptTypeCode = val?.value ?? null;
 												}
 											"
 										>
-											<el-option
-												v-for="item in state.acceptTypeOptions"
-												:key="item.dicDataValue"
-												:disabled="item.disabled"
-												:label="item.dicDataName"
-												:value="item"
-											/>
+											<el-option v-for="item in state.acceptTypeOptions" :key="item.value" :label="item.key" :value="item" />
 										</el-select>
 									</el-form-item>
 								</el-col>
 								<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
-									<el-form-item label="执法部门" prop="acceptTypeObj" :rules="[{ required: true, message: '请选择执法部门', trigger: 'change' }]">
+									<el-form-item
+										label="执法部门"
+										prop="enforcementOrdersHandlers"
+										:rules="[{ required: true, message: '请选择执法部门', trigger: 'change' }]"
+									>
 										<el-select
-											v-model="state.ruleForm.acceptTypeObj"
+											v-model="state.ruleForm.enforcementOrdersHandlers"
 											placeholder="请选择执法部门"
 											class="w100"
-											value-key="dicDataValue"
-											@change="
-												(val) => {
-													state.ruleForm.acceptType = val?.dicDataName ?? null;
-													state.ruleForm.acceptTypeCode = val?.dicDataValue ?? null;
-												}
-											"
+											value-key="id"
+											multiple
+											collapse-tags
+											collapse-tags-tooltip
+											:max-collapse-tags="2"
 										>
-											<el-option
-												v-for="item in state.acceptTypeOptions"
-												:key="item.dicDataValue"
-												:disabled="item.disabled"
-												:label="item.dicDataName"
-												:value="item"
-											/>
+											<el-option v-for="item in state.orgsOptions" :key="item.id" :label="item.name" :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="hotspotId" :rules="[{ required: true, message: '请选择热点分类', trigger: 'change' }]">
-										<hot-spot-select
+									<el-form-item label="热点分类" prop="hotspotId" :rules="[{ required: false, message: '请选择热点分类', trigger: 'change' }]">
+										<el-tree-select
 											v-model="state.ruleForm.hotspotId"
+											:data="state.enforcementHotspot"
+											:render-after-expand="false"
 											class="w100"
-											:externalArr="state.hotspotExternal"
-											@choose="chooseHotSpot"
+											node-key="id"
+											:props="{
+												isLeaf: 'hasChild',
+												children: 'children',
+												label: 'hotSpotFullName',
+											}"
+											expand-on-click-node
+											collapse-tags-tooltip
+											:max-collapse-tags="2"
 											placeholder="请选择热点分类"
-											clearable
+											filterable
+											:default-expanded-keys="state.hotspotExternal"
+											@change="changeHotSpot"
+											ref="hotspotRef"
 										/>
 									</el-form-item>
 								</el-col>
@@ -192,7 +191,7 @@
 </template>
 
 <script setup lang="ts" name="judgeOrderAdd">
-import { defineAsyncComponent, onMounted, reactive, ref, watch } from 'vue';
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
 import type { FormInstance } from 'element-plus';
 import { ElMessage } from 'element-plus';
 import { storeToRefs } from 'pinia';
@@ -200,68 +199,59 @@ import { useRoute, useRouter } from 'vue-router';
 import { throttle, transformFile } from '@/utils/tools';
 import { commonEnum } from '@/utils/constants';
 import { getCurrentCityConfig } from '@/utils/appConfig';
-import { orderAdd, orderBaseDataAdd, orderBaseExt, orderDetail, orderEdit } from '@/api/business/order';
 import { useUserInfo } from '@/stores/userInfo';
 import { treeArea } from '@/api/auxiliary/area';
 import mittBus from '@/utils/mitt';
-import { orderRepeatEvent } from '@/api/business/repeatEvent';
+import { listBaseData } from '@/api/judicial';
+import { addJudicial, editJudicial, getJudicial } from '@/api/judicial/order';
+import { removeDuplicate } from '@/utils/arrayOperation';
 
 // 引入组件
 const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
 const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue')); // 附件列表
-const HotSpotSelect = defineAsyncComponent(() => import('@/components/Hotspot/index.vue')); // 选择热点
 // 定义变量内容
 const { cityName, cityCode } = getCurrentCityConfig();
 const state = reactive<any>({
 	createBy: 'manual', // 工单创建方式 默认手动创建  tel:来电弹单  letter:互联网来信 默认表示手动创建
 	ruleForm: {
-		sourceChannel: null, // 来源频道
-		sourceChannelCode: null, //来源频道code
-		fromPhone: null, // 来电号码
+		sourceChannel: '自定义', // 来源频道
+		sourceChannelCode: 'ZDY', //来源频道code
+		channel: {
+			value: 'ZDY',
+			key: '自定义',
+		},
 		acceptorName: null, // 员工姓名
 		contact: null, // 联系电话
 		no: null, // 工单编码
 		title: null, // 工单标题
-		acceptType: null, // 受理类型
-		acceptTypeCode: null, // 受理类型code
+		acceptType: '投诉', // 受理类型
+		acceptTypeCode: '35', // 受理类型code
+		acceptTypeObj: {
+			value: '35',
+			key: '投诉',
+		},
 		hotspotId: '', // 热点分类
 		areaCode: cityCode, // 区域编码
 		city: cityName, // 市
 		street: null, // 街道
 		content: '', // 工单内容
+		enforcementOrdersHandlers: [],
 	},
 	formLoading: false, // 表单加载状态
 	hotspotExternal: [], // 热点分类外部数据
-	eventCategoryExternal: [], // 事件分类外部数据
 	acceptTypeOptions: [], // 受理类型
 	channelOptions: [], // 来源频道
-	emergencyLevelOptions: [], // 紧急程度
-	genderOptions: [], // 性别
-	identityTypeOptions: [], //来电人身份
-	licenceTypeOptions: [], // 证件类型
-	ageRangeOptions: [], // 年龄段
-	pushTypeOptions: [], //推送分类
+	orgsOptions: [], // 部门
+	enforcementHotspot: [], //热点
 	areaOptions: [], //省市区
 	transpondCity: [],
-	focusOnEvents: [], // 重点关注事项
 	orderId: null, // 工单id
-	orgData: [],
 });
 const storesUserInfo = useUserInfo(); // 用户信息
 const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
 state.ruleForm.acceptorName = userInfos.value.name; // 员工姓名
-state.ruleForm.acceptorStaffNo = userInfos.value.staffNo; // 员工工号
 const route = useRoute(); // 路由
 const router = useRouter(); // 路由
-// 选择热点分类
-const knowledgeRef = ref<RefType>();
-const chooseHotSpot = (val: any) => {
-	state.ruleForm.hotspotSpliceName = val?.hotSpotFullName; // 热点分类拼接名称
-	state.ruleForm.hotspotName = val?.hotSpotName; // 热点分类名称
-	state.ruleForm.hotspotCode = val?.provinceCode; // 热点分类code
-	state.ruleForm.hotspotExternal = val?.externalArr?.join(',') ?? ''; // 热点分类默认展开项
-	knowledgeRef.value.querySearch(state.ruleForm.hotspotName);
-};
 // 获取事发地址
 const areaRef = ref<RefType>();
 const changeArea = () => {
@@ -280,39 +270,30 @@ const changeArea = () => {
 		console.log(state.ruleForm.areaText);
 	}
 };
-// 根据热点和事发地址去查询重复性事件 是否展示重复性事件
-const repeatEventRef = ref<RefType>();
-const showRepeatEvent = ref<boolean>(false);
-const stopWatch = watch([() => state.ruleForm.hotspotSpliceName, () => state.ruleForm.address], (value) => {
-	if (value[0] && value[1]) {
-		orderRepeatEvent({ hotspotSpliceName: value[0], address: value[1] }).then((res: any) => {
-			if (res.result) {
-				showRepeatEvent.value = true;
-				repeatEventRef.value.queryList();
-			} else {
-				showRepeatEvent.value = false;
-			}
-		});
-	} else {
-		showRepeatEvent.value = false;
+// 选择热点分类
+const hotspotRef = ref();
+// 递归查找父级Id
+const getParentId = (val: any, arr: string[]) => {
+	if (val.data.parentId) {
+		arr.push(val.data.parentId);
+		getParentId(val.parent, arr);
 	}
-});
-stopWatch();
+	return removeDuplicate(arr);
+};
+const changeHotSpot = (val: any) => {
+	const currentNode = hotspotRef.value.getNode(val);
+	state.ruleForm.hotspotExternal = getParentId(currentNode, []).join(',');
+	state.ruleForm.hotspotSpliceName = currentNode.data.hotSpotFullName; // 热点分类拼接名称
+	state.ruleForm.hotspotName = currentNode.data?.hotSpotName; // 热点分类名称
+	state.ruleForm.hotspotCode = currentNode.data?.provinceCode; // 热点分类code
+};
 const ruleFormRef = ref<RefType>();
 // 删除不必要的属性
 const deleteUnnecessaryProperties = (obj: any) => {
-	const propertiesToDelete = ['ageRangeObj', 'pushTypeObj', 'licenceTypeObj', 'channel', 'acceptTypeObj', 'transpondCity'];
+	const propertiesToDelete = ['channel', 'acceptTypeObj', 'enforcementOrdersHandlers'];
 	propertiesToDelete.forEach((prop) => Reflect.deleteProperty(obj, prop));
 };
 const filesFormat = ref<EmptyArrayType>([]); // 附件列表格式化
-
-// 是否打开拓展表单
-const shouldOpenDialog = (obj: any) =>
-	!ExpandFormRef.value.state.validated &&
-	obj.orderExtension &&
-	obj.orderExtension.orderTypeCode &&
-	['scjgjts,scjgjjb'].includes(obj.orderExtension.orderTypeCode);
-
 const buttonLoading = ref<boolean>(false);
 // 保存
 const save = throttle((formEl: FormInstance | undefined) => {
@@ -320,29 +301,27 @@ const save = throttle((formEl: FormInstance | undefined) => {
 	formEl.validate((valid: boolean) => {
 		if (!valid) return;
 		buttonLoading.value = true;
+		state.ruleForm.enforcementOrdersHandler = state.ruleForm.enforcementOrdersHandlers.map((item: any) => {
+			return {
+				key: item.name,
+				value: item.id,
+			};
+		});
 		let orderDetail = {
 			...state.ruleForm,
-			repeatableEventDetails: repeatableEventDetails.value,
 			files: filesFormat.value,
 		};
 		deleteUnnecessaryProperties(orderDetail);
-		const operation = state.orderId ? orderEdit : orderAdd;
-		const addOrderAndNavigate = () => {
-			operation(orderDetail)
-				.then(() => {
-					buttonLoading.value = false;
-					ElMessage.success('操作成功');
-					onCancel();
-				})
-				.catch(() => {
-					buttonLoading.value = false;
-				});
-		};
-		if (shouldOpenDialog(orderDetail)) {
-			ExpandFormRef.value.openDialog(true);
-		} else {
-			addOrderAndNavigate();
-		}
+		const operation = state.orderId ? editJudicial : addJudicial;
+		operation(orderDetail)
+			.then(() => {
+				buttonLoading.value = false;
+				ElMessage.success('操作成功');
+				onCancel();
+			})
+			.catch(() => {
+				buttonLoading.value = false;
+			});
 	});
 }, 300);
 // 选中常用意见
@@ -351,26 +330,18 @@ const chooseAdvice = (item: any) => {
 };
 // 取消
 const onCancel = () => {
-	mittBus.emit('clearCache', 'todoSeats');
-	mittBus.emit('clearCachePage', ['order', 'todoOrder', 'todoCenter', 'callLog']);
+	mittBus.emit('clearCache', 'judicialCustom');
 	// 关闭当前 tagsView
 	mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
 };
 // 加载基础数据
 const loadBaseData = async () => {
 	try {
-		const res = await orderBaseDataAdd();
-		state.acceptTypeOptions = res.result?.acceptTypeOptions ?? [];
-		state.channelOptions = res.result?.channelOptions ?? [];
-		state.emergencyLevelOptions = res.result?.emergencyLevelOptions ?? [];
-		state.genderOptions = res.result?.genderOptions ?? [];
-		state.identityTypeOptions = res.result?.identityTypeOptions ?? [];
-		orderTypeOptions.value = res.result?.orderTypeOptions ?? [];
-		state.pushTypeOptions = res.result?.pushTypeOptions ?? [];
-		state.licenceTypeOptions = res.result?.licenceTypeOptions ?? [];
-		state.ageRangeOptions = res.result?.ageRangeOptions ?? [];
-		state.transpondCity = res.result?.transpondCity ?? [];
-		state.focusOnEvents = res.result?.focusOnEvents ?? [];
+		const { result } = await listBaseData();
+		state.acceptTypeOptions = result.acceptTypeOptions ?? []; // 受理类型
+		state.channelOptions = result.channelOptions ?? [];
+		state.orgsOptions = result.orgsOptions ?? [];
+		state.enforcementHotspot = result.enforcementHotspot ?? [];
 	} catch (error) {
 		console.log(error);
 	}
@@ -378,89 +349,40 @@ const loadBaseData = async () => {
 // 如果是修改加载表单内容
 const loadForm = async () => {
 	state.formLoading = true;
-	if (route.query.createBy) {
-		//  route.query.createBy  createBy 代表来源  tel:来电弹单  letter:互联网来信 默认表示手动创建
-		state.createBy = route.query.createBy;
-		if (route.query.createBy === 'tel') {
-			//通话
-			state.ruleForm.sourceChannel = '电话'; //电话
-			state.ruleForm.sourceChannelCode = 'RGDH'; //电话
-			state.ruleForm.fromPhone = route.query.fromTel; // 来电号码
-			state.ruleForm.contact = route.query.fromTel; // 联系电话
-			state.ruleForm.callId = route.query.callId; // 通话id
-			state.ruleForm.transferPhone = route.query.transfer; // 转接来源
+	if (route.query.id) {
+		// 如果 有id
+		state.orderId = route.query.id;
+		try {
+			const response = await getJudicial(<string>route.query.id);
+			// 如果获取到id 调用查询详情
+			state.ruleForm = response.result;
+			state.ruleForm.files = transformFile(response.result.files);
 			state.ruleForm.channel = {
 				// 来源渠道
-				dicDataValue: state.ruleForm.sourceChannelCode,
-				dicDataName: state.ruleForm.sourceChannel,
+				value: state.ruleForm.sourceChannelCode,
+				key: state.ruleForm.sourceChannel,
+			};
+			state.ruleForm.acceptTypeObj = {
+				// 受理类型
+				value: state.ruleForm.acceptTypeCode,
+				key: state.ruleForm.acceptType,
 			};
-			const isNumberIdentityType = parseInt(<string>route.query.identityType);
-			if ([1, 2].includes(isNumberIdentityType)) {
-				// 按键接收(1:市民 2:企业 3:智能应答)
-				state.ruleForm.identityType = isNumberIdentityType;
-			} else {
-				state.ruleForm.identityType = 1;
+			state.ruleForm.enforcementOrdersHandlers = state.ruleForm.enforcementOrdersHandler.map((item: any) => {
+				// 执法部门
+				return {
+					name: item.key,
+					id: item.value,
+				};
+			});
+			if (state.ruleForm.hotspotExternal) {
+				//热点分类默认展开
+				state.hotspotExternal = state.ruleForm.hotspotExternal.split(',');
 			}
+			state.formLoading = false;
+		} catch (e) {
+			console.log(e);
+			state.formLoading = false;
 		}
-	}
-
-	if (route.query.id) {
-		// 如果 有id
-		state.orderId = route.query.id;
-		const response = await orderDetail(route.query.id);
-		// 如果获取到id 调用查询详情
-		state.ruleForm = response.result;
-		state.ruleForm.files = transformFile(response.result.files);
-		if (response.result.duplicateIds && response.result.duplicateIds.length) {
-			// 是否重复
-			state.ruleForm.isRepeat = 'true';
-			state.ruleForm.duplicateTitle = '已选择';
-		} else {
-			state.ruleForm.isRepeat = 'false';
-		}
-		if (state.ruleForm.focusOnEvents) {
-			state.ruleForm.focusOnEventsArr = response.result.focusOnEvents.split(',');
-		}
-		state.ruleForm.channel = {
-			// 来源渠道
-			dicDataValue: state.ruleForm.sourceChannelCode,
-			dicDataName: state.ruleForm.sourceChannel,
-		};
-
-		if (state.ruleForm.hotspotExternal) {
-			//热点分类默认展开
-			state.hotspotExternal = state.ruleForm.hotspotExternal.split(',');
-		}
-		if (state.ruleForm.eventCategoryExternal) {
-			//热点分类默认展开
-			state.eventCategoryExternal = state.ruleForm.eventCategoryExternal.split(',');
-		}
-		state.ruleForm.ageRangeObj = {
-			// 年龄段
-			dicDataValue: state.ruleForm.ageRangeCode,
-			dicDataName: state.ruleForm.ageRange,
-		};
-		state.ruleForm.licenceTypeObj = {
-			// 证件类型
-			dicDataValue: state.ruleForm.licenceTypeCode,
-			dicDataName: state.ruleForm.licenceType,
-		};
-		state.ruleForm.acceptTypeObj = {
-			// 受理类型
-			dicDataValue: state.ruleForm.acceptTypeCode,
-			dicDataName: state.ruleForm.acceptType,
-		};
-		state.ruleForm.pushTypeObj = {
-			// 推送分类
-			dicDataValue: state.ruleForm.pushTypeCode,
-			dicDataName: state.ruleForm.pushType,
-		};
-		state.ruleForm.transpondCityObj = {
-			// 市州互转
-			dicDataValue: state.ruleForm.transpondCityValue,
-			dicDataName: state.ruleForm.transpondCityName,
-		};
-		state.formLoading = false;
 	} else {
 		state.formLoading = false;
 	}
@@ -470,8 +392,8 @@ const addressLoading = ref<boolean>(false);
 const loadAddress = async () => {
 	addressLoading.value = true;
 	try {
-		const area = await treeArea();
-		state.areaOptions = area.result ?? []; //省市区数据
+		const { result } = await treeArea();
+		state.areaOptions = result ?? []; //省市区数据
 		addressLoading.value = false;
 	} catch (error) {
 		console.log(error);
@@ -479,30 +401,9 @@ const loadAddress = async () => {
 		addressLoading.value = false;
 	}
 };
-// 加载扩展信息
-const orderTypeOptions = ref<EmptyObjectType>([]); // 工单类型
-// 拓展信息
-const extra = ref<any>({
-	ext: {},
-	area: {},
-	orderTypeOptions: [],
-});
-const extraLoading = ref<boolean>(false);
-const loadExtra = async () => {
-	extraLoading.value = true;
-	try {
-		const ext = await orderBaseExt(); // 扩展信息
-		extra.value = { ext: { ...ext.result, orderTypeOptions: orderTypeOptions.value, area: state.areaOptions } }; //补充信息
-	} catch (error) {
-		console.log(error);
-	} finally {
-		extraLoading.value = false;
-	}
-};
 loadBaseData();
 loadForm();
 onMounted(async () => {
 	await loadAddress();
-	await loadExtra();
 });
 </script>

+ 242 - 0
src/views/judicial/order/components/orderDetail.vue

@@ -0,0 +1,242 @@
+<template>
+	<el-button link :type="props.type" @click.stop="onOrderDetail" title="点击查看工单详情">
+		<slot>工单详情</slot>
+	</el-button>
+	<el-dialog
+		v-model="state.dialogVisible"
+		class="order-detail-dialog"
+		draggable
+		ref="dialogRef"
+		width="80%"
+		append-to-body
+		destroy-on-close
+		title="工单详情"
+	>
+		<!-- 工单详情 -->
+		<el-collapse v-model="state.collapseArr" class="collapse-box" v-loading="state.loading">
+			<el-collapse-item name="1">
+				<template #title>
+					<p class="pl20">
+						<b class="font14">来电人信息</b>
+					</p>
+				</template>
+				<div class="collapse-container">
+					<el-form label-width="100px" ref="ruleFormRef">
+						<el-row :gutter="10">
+							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.fromPhone">
+								<el-form-item label="来电号码">
+									{{ state.ruleForm.fromPhone }}
+									<el-button
+										plain
+										title="录音文件"
+										size="small"
+										type="primary"
+										class="ml8"
+										@click="recordFile(state.ruleForm)"
+										v-if="state.ruleForm?.recordingAbsolutePath"
+										>录音文件</el-button
+									>
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+								<el-form-item label="来电人姓名">
+									{{ state.ruleForm.fromName }}
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.contact">
+								<el-form-item label="联系电话">
+									<span> {{ state.ruleForm.contact }}</span>
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+								<el-form-item label="事发地址"> {{ state.ruleForm.fullAddress }} </el-form-item>
+							</el-col>
+						</el-row>
+					</el-form>
+				</div>
+			</el-collapse-item>
+			<el-collapse-item name="2">
+				<template #title>
+					<p class="pl20">
+						<b class="font14">工单信息</b>
+					</p>
+				</template>
+				<div class="collapse-container">
+					<el-form label-width="100px" ref="ruleFormRef">
+						<el-row :gutter="10">
+							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+								<el-form-item label="来源渠道"> {{ state.ruleForm.sourceChannel }} </el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+								<el-form-item label="受理类型"> {{ state.ruleForm.acceptType }} </el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+								<el-form-item label="工单编码">
+									{{ state.ruleForm.no }} <span v-if="state.ruleForm.password"> 【{{ state.ruleForm.password }}】</span>
+								</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>
+							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
+								<el-form-item label="受理人">
+									<span>{{ state.ruleForm?.acceptorName }}</span>
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.startTime">
+								<el-form-item label="受理时间"> {{ formatDate(state.ruleForm?.startTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-if="state.ruleForm.pushType">
+								<el-form-item label="推送分类"> {{ state.ruleForm.pushType }} </el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+								<el-form-item label="工单标题">
+									{{ state.ruleForm.title }} <el-tag class="ml10" v-if="state.ruleForm?.workflowId">{{ state.ruleForm.statusText }}</el-tag>
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+								<el-form-item label="受理内容">
+									<div v-html="showKeyWord(state.ruleForm.content, state.ruleForm.sensitive)"></div>
+								</el-form-item>
+							</el-col>
+							<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+								<el-form-item label="附件">
+									<annex-list name="附件列表" readonly :businessId="state.ruleForm.id" classify="查看附件" v-model="state.ruleForm.files" />
+								</el-form-item>
+							</el-col>
+						</el-row>
+					</el-form>
+				</div>
+			</el-collapse-item>
+		</el-collapse>
+	</el-dialog>
+</template>
+
+<script setup lang="ts" name="orderDetail">
+import { defineAsyncComponent, PropType, reactive, ref } from 'vue';
+import { transformFile } from '@/utils/tools';
+import { ElMessage } from 'element-plus';
+import { formatDate } from '@/utils/formatTime';
+import { getJudicial } from '@/api/judicial/order';
+
+// 引入组件
+const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue')); // 附件列表
+
+type ButtonType = '' | 'default' | 'success' | 'warning' | 'info' | 'text' | 'primary' | 'danger';
+const props = defineProps({
+	order: {
+		// 工单详情
+		type: [Object, null] as PropType<string | null>,
+		// eslint-disable-next-line vue/require-valid-default-prop
+		default: {},
+		required: true,
+	},
+	type: {
+		type: String as PropType<ButtonType>,
+		default: 'primary',
+	},
+});
+
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false, // 弹窗显示隐藏
+	ruleForm: {
+		// 表单数据
+	},
+	collapseArr: ['1', '2'], //展开列表
+	loading: false,
+	orderId: '', //工单id
+});
+const ruleFormRef = ref<RefType>(); // 表单ref
+// 高亮关键词
+const showKeyWord = (val: string[], keywordArr: string[]) => {
+	let str = val;
+	if (keywordArr && keywordArr.length) {
+		// 2.定制关键词对应正则
+		keywordArr.forEach((e) => {
+			let regStr = '' + `(${e})`;
+			let reg = new RegExp(regStr, 'g');
+			// 3.正则替换,关键词飘红
+			str = str.replace(reg, '<span class="color-danger font-bold"">' + e + '</span>');
+		});
+	}
+	return str;
+};
+
+// 查看工单详情
+const getOrderDetail = async (id: string) => {
+	state.loading = true;
+	try {
+		const res: any = await getJudicial(id);
+		state.ruleForm = res.result;
+		state.ruleForm.files = transformFile(state.ruleForm.files);
+		state.loading = false;
+	} catch (error) {
+		state.loading = false;
+		state.dialogVisible = false;
+	}
+};
+// 打开弹窗
+const openDialog = (val: any) => {
+	if (!val || !val.id) {
+		ElMessage.error('工单id不能为空');
+		return;
+	}
+	state.dialogVisible = true;
+	state.orderId = val.id;
+	getOrderDetail(state.orderId);
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+// 工单详情
+const onOrderDetail = () => {
+	openDialog(props.order);
+};
+// 暴露变量
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>
+<style lang="scss" scoped>
+.order-detail-container {
+	display: inline-flex;
+}
+.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: 10px !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;
+			}
+		}
+	}
+}
+:deep(.el-tabs__item) {
+	font-size: var(--el-font-size-base);
+}
+:deep(.el-collapse-item__wrap) {
+	border-bottom: none;
+}
+</style>

+ 325 - 0
src/views/judicial/order/custom.vue

@@ -0,0 +1,325 @@
+<template>
+	<div class="judicial-order-container layout-pd">
+		<el-card shadow="never">
+			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent label-width="100px">
+				<el-row :gutter="10">
+					<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+						<el-form-item label="工单标题" prop="Title">
+							<el-input v-model="state.queryParams.Title" placeholder="工单标题" clearable @keyup.enter="handleQuery" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+						<el-form-item label="工单编码" prop="No">
+							<el-input v-model="state.queryParams.No" placeholder="工单编码" clearable @keyup.enter="handleQuery" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+						<el-form-item label="受理类型" prop="AcceptTypeCode">
+							<el-select v-model="state.queryParams.AcceptTypeCode" placeholder="请选择受理类型" clearable class="w100" @change="handleQuery">
+								<el-option v-for="item in state.acceptTypeOptions" :value="item.value" :key="item.value" :label="item.key" />
+							</el-select>
+						</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">
+							<el-form-item label="热点分类" prop="HotspotId">
+								<el-tree-select
+									v-model="state.queryParams.HotspotId"
+									:data="state.enforcementHotspot"
+									:render-after-expand="false"
+									class="w100"
+									node-key="id"
+									:props="{
+										isLeaf: 'hasChild',
+										children: 'children',
+										label: 'hotSpotFullName',
+									}"
+									placeholder="请选择热点分类"
+									filterable
+									expand-on-click-node
+									@change="handleQuery"
+								/>
+							</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="OrgCode">
+								<el-select v-model="state.queryParams.OrgCode" placeholder="请选择执法部门" class="w100" @change="handleQuery">
+									<el-option v-for="item in state.orgsOptions" :key="item.id" :label="item.name" :value="item.id" />
+								</el-select>
+							</el-form-item>
+						</el-col>
+					</transition>
+					<transition name="el-zoom-in-top" v-show="!searchCol">
+						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+							<el-form-item label="事发地址" prop="AreaCode">
+								<el-cascader
+									:options="state.areaOptions"
+									filterable
+									:props="{ checkStrictly: true, value: 'id', label: 'areaName', emitPath: false }"
+									placeholder="请选择事发地址"
+									clearable
+									class="w100"
+									v-model="state.queryParams.AreaCode"
+									@change="handleQuery"
+								>
+								</el-cascader>
+							</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="crTime">
+								<el-date-picker
+									v-model="state.queryParams.crTime"
+									type="datetimerange"
+									unlink-panels
+									range-separator="至"
+									start-placeholder="开始时间"
+									end-placeholder="结束时间"
+									:shortcuts="shortcuts"
+									@change="handleQuery"
+									value-format="YYYY-MM-DD[T]HH:mm:ss"
+									:default-time="defaultTimeStartEnd"
+								/>
+							</el-form-item>
+						</el-col>
+					</transition>
+					<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+						<el-form-item label=" ">
+							<div class="flex-end w100">
+								<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+								<el-button @click="resetQuery(ruleFormRef)" v-waves class="default-button" :loading="state.loading">
+									<SvgIcon name="ele-Refresh" class="mr5" />重置
+								</el-button>
+								<el-button link type="primary" @click="closeSearch" :loading="state.loading">
+									{{ searchCol ? '展开' : '收起' }}
+									<SvgIcon :class="{ 'is-reverse': searchCol }" name="ele-ArrowUp" class="mr5 arrow" size="18px" />
+								</el-button>
+							</div>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+		</el-card>
+		<el-card shadow="never">
+			<!-- 表格 -->
+			<ProTable
+				ref="proTableRef"
+				:columns="columns"
+				:data="state.tableData"
+				@updateTable="queryList"
+				:loading="state.loading"
+				:total="state.total"
+				v-model:page-index="state.queryParams.PageIndex"
+				v-model:page-size="state.queryParams.PageSize"
+			>
+				<!-- 表格 header 按钮 -->
+				<template #tableHeader="scope">
+					<el-button type="primary" @click="onAddOrder" v-auth="'judicial:custom:add'"> <SvgIcon name="ele-Plus" class="mr5" />新建工单 </el-button>
+				</template>
+				<template #isProvince="{ row }">
+					<span>{{ row.isProvince ? '省工单' : '市工单' }}</span>
+				</template>
+				<template #title="{ row }">
+					<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
+				</template>
+				<template #isTheClueTrue="{ row }">
+					<span>{{ row.isTheClueTrue !== null ? (row.isTheClueTrue ? '是' : '否') : '' }}</span>
+				</template>
+				<!-- 表格操作 -->
+				<template #operation="{ row }">
+					<el-button link type="primary" @click="onEdit(row)" title="修改"> 修改 </el-button>
+					<order-detail :order="row" @updateList="queryList" />
+				</template>
+			</ProTable>
+		</el-card>
+	</div>
+</template>
+<script setup lang="tsx" name="judicialCustom">
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import type { FormInstance } from 'element-plus';
+import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
+import { useRoute, useRouter } from 'vue-router';
+import { formatDate } from '@/utils/formatTime';
+import { treeArea } from '@/api/auxiliary/area';
+import { listBaseData } from '@/api/judicial';
+import { enableJudicial, judicialList } from '@/api/judicial/order';
+import Other from '@/utils/other';
+import { ElMessage, ElMessageBox } from 'element-plus';
+
+// 引入组件
+const OrderDetail = defineAsyncComponent(() => import('@/views/judicial/order/components/orderDetail.vue')); // 工单详情
+
+// 定义变量内容
+const state = reactive<any>({
+	queryParams: {
+		PageIndex: 1, // 当前页
+		PageSize: 10, // 每页条数
+		// 查询条件
+		No: null, // 工单编码
+		Title: null,
+		HotspotId: null,
+		AcceptTypeCode: null,
+		OrgCode: null,
+		AreaCode: null,
+		crTime: [],
+		CreationTimeStart: null,
+		CreationTimeEnd: null,
+	},
+	tableData: [], //表单
+	loading: false, // 加载
+	total: 0, // 总数
+	acceptTypeOptions: [], //受理类型
+	channelOptions: [], // 来源频道
+	orgsOptions: [], // 部门
+	enforcementHotspot: [], // 热点类型
+	areaOptions: [], // 省市区数据
+});
+const ruleFormRef = ref<RefType>(); // 表单ref
+const searchCol = ref(true); // 展开/收起
+const route = useRoute(); // 路由
+const router = useRouter(); // 路由
+const proTableRef = ref<RefType>(); // 表格ref
+// 表格配置项
+const columns = ref<any[]>([
+	{ prop: 'no', label: '工单编码', minWidth: 160 },
+	{ prop: 'title', label: '工单标题', minWidth: 300 },
+	{ prop: 'acceptType', label: '受理类型', minWidth: 150 },
+	{ prop: 'hotspotName', label: '热点分类', minWidth: 200 },
+	{ prop: 'acceptType', label: '执法部门', minWidth: 150 },
+	{ prop: 'city', label: '事发地址', minWidth: 150 },
+	{
+		prop: 'creationTime',
+		label: '生成时间',
+		width: 170,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{
+		prop: 'isShowUpdateButton',
+		label: '状态',
+		width: 170,
+		render: (scope) => {
+			return (
+				<el-switch
+					model-value={scope.row.isItCounted}
+					active-text="启用"
+					inactive-text="禁用"
+					onClick={() => changeIsEnable(scope.row)}
+					inline-prompt
+				/>
+			);
+		},
+	},
+	{ prop: 'operation', label: '操作', fixed: 'right', width: 160, align: 'center' },
+]);
+// 展开/收起
+const closeSearch = () => {
+	searchCol.value = !searchCol.value;
+};
+// 获取查询条件基础信息
+const getBaseData = async () => {
+	try {
+		const res: any = await listBaseData();
+		const mappings: any = {
+			acceptTypeOptions: 'acceptTypeOptions',
+			channelOptions: 'channelOptions',
+			orgsOptions: 'orgsOptions',
+			enforcementHotspot: 'enforcementHotspot',
+		};
+		for (const key in mappings) {
+			state[key] = res.result?.[mappings[key]] ?? [];
+		}
+		const area = await treeArea();
+		state.areaOptions = area?.result ?? []; //省市区数据
+	} catch (error) {
+		console.log(error);
+	}
+};
+/** 搜索按钮操作 */
+const handleQuery = () => {
+	state.queryParams.PageIndex = 1;
+	queryList();
+};
+/** 获取列表 */
+const requestParams = ref({});
+const queryList = () => {
+	requestParams.value = Other.deepClone(state.queryParams);
+	requestParams.value.CreationTimeStart = state.queryParams.crTime === null ? null : state.queryParams.crTime[0]; // 生成时间
+	requestParams.value.CreationTimeEnd = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
+	Reflect.deleteProperty(requestParams.value, 'crTime'); // 删除无用的参数
+	state.loading = true;
+	judicialList(requestParams.value)
+		.then((response: any) => {
+			state.tableData = response?.result.items ?? [];
+			state.total = response?.result.total;
+			state.loading = false;
+		})
+		.catch(() => {
+			state.loading = false;
+		});
+};
+/** 重置按钮操作 */
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	queryList();
+};
+// 修改工单
+const onEdit = (row: any) => {
+	router.push({
+		path: '/judicial/order/add',
+		query: {
+			id: row.id,
+		},
+	});
+};
+//  修改是否启用
+const changeIsEnable = (row: any) => {
+	ElMessageBox.confirm(`您确定要${row.isItCounted ? '禁用' : '启用'}:【${row.title}】,是否继续?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+		autofocus: false,
+	})
+		.then(() => {
+			enableJudicial(row.id)
+				.then(() => {
+					ElMessage.success('操作成功');
+					queryList();
+				})
+				.catch(() => {
+					queryList();
+				});
+		})
+		.catch(() => {
+			queryList();
+		});
+};
+// 新建工单
+const onAddOrder = () => {
+	router.push({
+		path: '/judicial/order/add',
+	});
+};
+onMounted(() => {
+	getBaseData();
+	queryList();
+});
+</script>
+<style scoped lang="scss">
+.judicial-order-container {
+	.arrow {
+		transition: transform var(--el-transition-duration);
+		cursor: pointer;
+	}
+	.arrow.is-reverse {
+		transform: rotateZ(-180deg);
+	}
+}
+</style>

+ 97 - 365
src/views/judicial/order/index.vue

@@ -24,33 +24,47 @@
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
-						<el-form-item label="事项分类" prop="EventTypeId">
-							<el-tree-select
-								v-model="state.queryParams.EventTypeId"
-								:data="treeList"
-								:props="{
-									label: 'eventTypeName',
-									value: 'id',
-									children: 'children',
-								}"
-								class="w100"
-								ref="treeRef"
-								@change="handleQuery"
-								filterable
-							/>
+						<el-form-item label="受理类型" prop="AcceptTypeCode">
+							<el-select v-model="state.queryParams.AcceptTypeCode" placeholder="请选择受理类型" clearable class="w100" @change="handleQuery">
+								<el-option v-for="item in state.acceptTypeOptions" :value="item.value" :key="item.value" :label="item.key" />
+							</el-select>
 						</el-form-item>
 					</el-col>
-					<transition name="el-zoom-in-top" v-show="!searchCol">
-						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
-							<el-form-item label="省工单编码" prop="ProvinceNo">
-								<el-input v-model="state.queryParams.ProvinceNo" placeholder="省工单编码" clearable @keyup.enter="handleQuery" />
+					<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="HotspotId">
+								<el-tree-select
+									v-model="state.queryParams.HotspotId"
+									:data="state.enforcementHotspot"
+									:render-after-expand="false"
+									class="w100"
+									node-key="id"
+									:props="{
+										isLeaf: 'hasChild',
+										children: 'children',
+										label: 'hotSpotFullName',
+									}"
+									placeholder="请选择热点分类"
+									filterable
+									expand-on-click-node
+									@change="handleQuery"
+								/>
 							</el-form-item>
 						</el-col>
 					</transition>
-					<transition name="el-zoom-in-top" v-show="!searchCol">
-						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
-							<el-form-item label="来电人姓名" prop="FromName">
-								<el-input v-model="state.queryParams.FromName" placeholder="来电人姓名" clearable @keyup.enter="handleQuery" />
+					<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="NameOrNo">
+								<el-input v-model="state.queryParams.NameOrNo" placeholder="受理人" clearable @keyup.enter="handleQuery" />
+							</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="OrgCode">
+								<el-select v-model="state.queryParams.OrgCode" placeholder="请选择执法部门" class="w100" @change="handleQuery">
+									<el-option v-for="item in state.orgsOptions" :key="item.id" :label="item.name" :value="item.id" />
+								</el-select>
 							</el-form-item>
 						</el-col>
 					</transition>
@@ -60,17 +74,12 @@
 								<el-cascader
 									:options="state.areaOptions"
 									filterable
-									:show-all-levels="false"
-									:props="{ checkStrictly: true, value: 'id', label: 'areaName', multiple: true }"
+									:props="{ checkStrictly: true, value: 'id', label: 'areaName', emitPath: false }"
 									placeholder="请选择事发地址"
 									clearable
 									class="w100"
 									v-model="state.queryParams.AreaCode"
-									collapse-tags
-									collapse-tags-tooltip
-									:max-collapse-tags="2"
-									ref="areaRef"
-									@change="changeArea"
+									@change="handleQuery"
 								>
 								</el-cascader>
 							</el-form-item>
@@ -78,41 +87,7 @@
 					</transition>
 					<transition name="el-zoom-in-top" v-show="!searchCol">
 						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
-							<el-form-item label="转接来源" prop="TransferPhone">
-								<el-input v-model="state.queryParams.TransferPhone" placeholder="转接来源" clearable @keyup.enter="handleQuery" />
-							</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="Statuses">
-								<el-select v-model="state.queryParams.Statuses" placeholder="请选择工单状态" clearable class="w100" multiple>
-									<el-option v-for="item in state.orderStatusOptions" :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="AcceptTypes">
-								<el-select
-									v-model="state.queryParams.AcceptTypes"
-									placeholder="请选择受理类型"
-									multiple
-									clearable
-									class="w100"
-									collapse-tags
-									collapse-tags-tooltip
-									:max-collapse-tags="2"
-								>
-									<el-option v-for="item in state.acceptTypeOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
-								</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="Channels">
+							<el-form-item label="来源渠道" prop="AreaCode">
 								<el-select
 									v-model="state.queryParams.Channels"
 									placeholder="请选择来源渠道"
@@ -123,70 +98,14 @@
 									collapse-tags-tooltip
 									:max-collapse-tags="2"
 								>
-									<el-option v-for="item in state.channelOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
+									<el-option v-for="item in state.channelOptions" :value="item.value" :key="item.value" :label="item.key" />
 								</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="HotspotIds">
-								<el-tree-select
-									v-model="state.queryParams.HotspotIds"
-									:data="state.enforcementHotspot"
-									multiple
-									:render-after-expand="false"
-									show-checkbox
-									class="w100"
-									node-key="id"
-									:props="{
-										isLeaf: 'hasChild',
-										children: 'children',
-										label: 'hotSpotFullName',
-									}"
-									check-strictly
-									check-on-click-node
-									collapse-tags
-									collapse-tags-tooltip
-									:max-collapse-tags="2"
-									placeholder="请选择热点分类"
-									filterable
-								/>
-							</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="OrgCodes">
-								<el-cascader
-									:options="state.orgsOptions"
-									filterable
-									:show-all-levels="false"
-									:props="{ checkStrictly: true, value: 'id', label: 'name', emitPath: false, multiple: true }"
-									placeholder="请选择接办部门"
-									clearable
-									class="w100"
-									v-model="state.queryParams.OrgCodes"
-									ref="cascadeRef"
-									@change="getKnowledgeList"
-									collapse-tags
-									collapse-tags-tooltip
-									:max-collapse-tags="2"
-								>
-								</el-cascader>
-							</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="NameOrNo">
-								<el-input v-model="state.queryParams.NameOrNo" placeholder="受理人/坐席工号" clearable @keyup.enter="handleQuery" />
-							</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="crTime">
+							<el-form-item label="生成时间" prop="crTime">
 								<el-date-picker
 									v-model="state.queryParams.crTime"
 									type="datetimerange"
@@ -195,117 +114,32 @@
 									start-placeholder="开始时间"
 									end-placeholder="结束时间"
 									:shortcuts="shortcuts"
-									@change="timeStartChangeCr"
-									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 label="来电号码" prop="FromPhone">
-								<el-input v-model="state.queryParams.FromPhone" placeholder="来电号码" clearable @keyup.enter="handleQuery" />
-							</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">
-								<el-input v-model="state.queryParams.PhoneNo" placeholder="联系电话" clearable @keyup.enter="handleQuery" />
-							</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="PushTypeCode">
-								<el-select v-model="state.queryParams.PushTypeCode" placeholder="请选择推送分类" clearable class="w100">
-									<el-option v-for="item in state.pushTypeOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
-								</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="exTime">
-								<el-date-picker
-									v-model="state.queryParams.exTime"
-									type="datetimerange"
-									unlink-panels
-									range-separator="至"
-									start-placeholder="开始时间"
-									end-placeholder="结束时间"
-									:shortcuts="shortcuts"
-									@change="timeStartChangeEx"
+									@change="handleQuery"
 									value-format="YYYY-MM-DD[T]HH:mm:ss"
-                  :default-time="defaultTimeStartEnd"
+									: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 label="接办人" prop="ActualHandlerName">
-								<el-input v-model="state.queryParams.ActualHandlerName" placeholder="接办人" clearable @keyup.enter="handleQuery" />
-							</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="IsScreen">
-								<el-select v-model="state.queryParams.IsScreen" placeholder="请选择是否甄别" class="w100" clearable>
-									<el-option label="是" :value="true" />
-									<el-option label="否" :value="false" />
-								</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="CurrentStepCode">
-								<el-select v-model="state.queryParams.CurrentStepCode" placeholder="请选择当前办理节点" clearable class="w100">
-									<el-option v-for="item in state.currentStepOptions" :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="doneTime">
-								<el-date-picker
-									v-model="state.queryParams.doneTime"
-									type="datetimerange"
-									unlink-panels
-									range-separator="至"
-									start-placeholder="开始时间"
-									end-placeholder="结束时间"
-									:shortcuts="shortcuts"
-									@change="timeStartChangeDone"
-									value-format="YYYY-MM-DD[T]HH:mm:ss"
-                  :default-time="defaultTimeStartEnd"
+							<el-form-item label="事项分类" prop="EventTypeId">
+								<el-tree-select
+									v-model="state.queryParams.EventTypeId"
+									:data="treeList"
+									:props="{
+										label: 'eventTypeName',
+										value: 'id',
+										children: 'children',
+									}"
+									class="w100"
+									ref="treeRef"
+									@change="handleQuery"
+									filterable
 								/>
 							</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="IsOverTime">
-								<el-select v-model="state.queryParams.IsOverTime" placeholder="请选择是否超期" class="w100" clearable>
-									<el-option label="是" :value="true" />
-									<el-option label="否" :value="false" />
-								</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="IdentityType">
-								<el-select v-model="state.queryParams.IdentityType" placeholder="请选择来电主体" clearable class="w100">
-									<el-option v-for="item in state.identityTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
-								</el-select>
-							</el-form-item>
-						</el-col>
-					</transition>
 					<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
 						<el-form-item label=" ">
 							<div class="flex-end w100">
@@ -337,7 +171,6 @@
 			>
 				<!-- 表格 header 按钮 -->
 				<template #tableHeader="scope">
-          <el-button type="primary" @click="onAddOrder" v-auth="'judicial:order:add'"> <SvgIcon name="ele-Plus" class="mr5" />新建工单 </el-button>
 					<el-button
 						type="primary"
 						@click="onVerify(null)"
@@ -356,9 +189,9 @@
 				<template #title="{ row }">
 					<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
 				</template>
-        <template #isTheClueTrue="{row}">
-          <span>{{ row.isTheClueTrue !== null ? (row.isTheClueTrue ? '是' : '否') : '' }}</span>
-        </template>
+				<template #isTheClueTrue="{ row }">
+					<span>{{ row.isTheClueTrue !== null ? (row.isTheClueTrue ? '是' : '否') : '' }}</span>
+				</template>
 				<!-- 表格操作 -->
 				<template #operation="{ row }">
 					<el-button link type="primary" @click="onVerify(row)" title="线索核实" v-if="row.isTheClueTrue === null" v-auth="'judicial:order:verify'">
@@ -376,12 +209,12 @@
 <script setup lang="tsx" name="judicialOrder">
 import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
 import type { FormInstance } from 'element-plus';
-import { defaultTimeStartEnd, shortcuts } from "@/utils/constants";
-import other from '@/utils/other';
+import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
 import { useRoute, useRouter } from 'vue-router';
 import { formatDate } from '@/utils/formatTime';
-import { treeArea } from '@/api/auxiliary/area';
-import { getCluesBaseData, getWorkList, listBaseData } from '@/api/judicial';
+import {  getCluesBaseData, getWorkList, listBaseData } from '@/api/judicial';
+import Other from '@/utils/other';
+import {treeArea} from "@/api/auxiliary/area";
 
 // 引入组件
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
@@ -394,48 +227,23 @@ const state = reactive<any>({
 		PageSize: 10, // 每页条数
 		// 查询条件
 		No: null, // 工单编码
-		ProvinceNo: null, // 省工单编码
-		ActualHandlerName: null, // 接办人
-		IsScreen: null, // 是否甄别
-		CurrentStepCode: null, // 当前办理节点
-		IsOverTime: null, // 是否超期
-		FromName: null, // 来电人姓名
-		AreaCode: [],
-		AreaCodes: [], // 事发地址
-		FromPhone: null, // 来电号码
-    Title: null, // 工单标题
-		Content: null, // 工单内容
-		AcceptTypes: null, // 受理类型
-		Channels: null, // 渠道
-		HotspotIds: [], // 热点
-		OrgCodes: [], // 机构
-		NameOrNo: null, // 受理坐席
-		crTime: [], // 创建时间
-		CreationTimeStart: null, // 创建时间 开始
-		CreationTimeEnd: null, // 创建时间 结束
-		TransferPhone: null, // 转派人
-		exTime: [], // 过期时间
-		ExpiredTimeStart: null, //办理期限 开始
-		ExpiredTimeEnd: null, //办理期限 结束
-		PhoneNo: null, // 手机号
-		Statuses: [], // 状态
-		doneTime: [], // 办结时间
-		PushTypeCode: null, //推送类型
-		IsProvinceOrder: null, // 省市工单
-		EventTypeId: null, //事件类型
+		Title: null,
+		HotspotId: null,
+		AcceptTypeCode: null,
+		OrgCode: null,
+		AreaCode: null,
+		crTime: [],
+		CreationTimeStart: null,
+		CreationTimeEnd: null,
+		NameOrNo: null,
 	},
 	tableData: [], //表单
 	loading: false, // 加载
 	total: 0, // 总数
 	acceptTypeOptions: [], //受理类型
 	channelOptions: [], // 来源频道
-	orderStatusOptions: [], // 工单状态
-	currentStepOptions: [], // 当前办理节点
-	identityTypeOptions: [], // 来电主体
 	orgsOptions: [], // 部门
-	pushTypeOptions: [], //推送分类
 	enforcementHotspot: [], // 热点类型
-	orgData: [], // 机构数据
 	areaOptions: [], // 省市区数据
 });
 const fastSearch = ref('all'); // tab位置
@@ -478,42 +286,20 @@ const selectable = (row: any) => {
 // 表格配置项
 const columns = ref<any[]>([
 	{ type: 'selection', fixed: 'left', width: 55, selectable: selectable, align: 'center' },
-	{ prop: 'expiredStatusText', label: '超期状态', align: 'center',width: 80 },
-	{ prop: 'no', label: '工单编码', width: 150 },
-	{ prop: 'provinceNo', label: '省工单编码', width: 200 },
-	{ prop: 'isProvince', label: '省/市工单', width: 100 },
-	{ prop: 'actualHandleStepName', label: '办理节点', width: 150 },
-	{ prop: 'statusText', label: '工单状态', width: 100 },
-	{ prop: 'title', label: '工单标题', width: 300 },
-	{
-		prop: 'startTime',
-		label: '受理时间',
-		width: 170,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.startTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
-	{
-		prop: 'expiredTime',
-		label: '工单期满时间',
-		width: 170,
-		render: (scope) => {
-			return <span>{formatDate(scope.row.expiredTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
-		},
-	},
+	{ prop: 'no', label: '工单编码', minWidth: 160 },
+	{ prop: 'acceptType', label: '受理类型', minWidth: 150 },
+	{ prop: 'hotspotName', label: '热点分类', minWidth: 200 },
+	{ prop: 'acceptType', label: '执法部门', minWidth: 150 },
+	{ prop: 'city', label: '事发地址', minWidth: 150 },
 	{
-		prop: 'filedTime',
-		label: '办结时间',
+		prop: 'creationTime',
+		label: '生成时间',
 		width: 170,
 		render: (scope) => {
-			return <span>{formatDate(scope.row.filedTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+			return <span>{formatDate(scope.row.creationTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
 		},
 	},
-	{ prop: 'orgLevelOneName', label: '一级部门', width: 170 },
-	{ prop: 'actualHandleOrgName', label: '接办部门', width: 170 },
-	{ prop: 'acceptType', label: '受理类型', width: 150 },
-	{ prop: 'sourceChannel', label: '来源渠道', width: 100 },
-	{ prop: 'hotspotName', label: '热点分类', width: 200 },
+	{ prop: 'acceptorName', label: '受理人', minWidth: 150 },
 	{
 		prop: 'isPassTheBuckOrder',
 		label: '是否推诿工单',
@@ -525,57 +311,24 @@ const columns = ref<any[]>([
 	{
 		prop: 'isTheClueTrue',
 		label: '线索是否属实',
-		width: 120
+		width: 120,
+	},
+	{
+		prop: 'isEnforcementOrder',
+		label: '是否行政执法类工单',
+		width: 150,
+		render: (scope) => {
+			return <span>{scope.row.isEnforcementOrder ? '是' : '否'}</span>;
+		},
 	},
-  {
-    prop: 'isEnforcementOrder',
-    label: '是否行政执法类工单',
-    width: 150,
-    render: (scope) => {
-      return <span>{scope.row.isEnforcementOrder ? '是' : '否'}</span>;
-    },
-  },
 	{ prop: 'eventTypeName', label: '事项类型', width: 200 },
 	{ prop: 'operation', label: '操作', fixed: 'right', width: 180, align: 'center' },
 ]);
-// 获取选择组织name值
-const cascadeRef = ref<RefType>();
-const getKnowledgeList = () => {
-	let currentNode = cascadeRef.value.getCheckedNodes();
-	state.queryParams.orgCode = currentNode[0]?.data.orgCode ?? '';
-};
+
 // 展开/收起
 const closeSearch = () => {
 	searchCol.value = !searchCol.value;
 };
-// 选择事发地址
-const areaRef = ref<RefType>();
-const changeArea = () => {
-	const area = areaRef.value?.getCheckedNodes() ?? [];
-	state.queryParams.AreaCodes = area.map((item: any) => item.value);
-};
-const handleTimeChange = (val: string[], startKey: string, endKey: string) => {
-	if (val) {
-		state.queryParams[startKey] = val[0];
-		state.queryParams[endKey] = val[1];
-	} else {
-		state.queryParams[startKey] = '';
-		state.queryParams[endKey] = '';
-	}
-	handleQuery();
-};
-// 受理时间
-const timeStartChangeCr = (val: string[]) => {
-	handleTimeChange(val, 'CreationTimeStart', 'CreationTimeEnd');
-};
-// 过期时间
-const timeStartChangeEx = (val: string[]) => {
-	handleTimeChange(val, 'ExpiredTimeStart', 'ExpiredTimeEnd');
-};
-// 办结时间
-const timeStartChangeDone = (val: string[]) => {
-	handleTimeChange(val, 'ActualHandleTimeStart', 'ActualHandleTimeEnd');
-};
 // 获取查询条件基础信息
 const treeList = ref<any[]>([]);
 const getBaseData = async () => {
@@ -585,10 +338,6 @@ const getBaseData = async () => {
 			acceptTypeOptions: 'acceptTypeOptions',
 			channelOptions: 'channelOptions',
 			orgsOptions: 'orgsOptions',
-			pushTypeOptions: 'pushTypeOptions',
-			orderStatusOptions: 'orderStatusOptions',
-			identityTypeOptions: 'identityTypeOptions',
-			currentStepOptions: 'currentStepOptions',
 			enforcementHotspot: 'enforcementHotspot',
 		};
 		for (const key in mappings) {
@@ -608,14 +357,14 @@ const handleQuery = () => {
 	queryList();
 };
 /** 获取列表 */
+const requestParams = ref({});
 const queryList = () => {
-	let request = other.deepClone(state.queryParams);
-	Reflect.deleteProperty(request, 'crTime'); // 删除无用的参数
-	Reflect.deleteProperty(request, 'exTime'); // 删除无用的参数
-	Reflect.deleteProperty(request, 'doneTime'); // 删除无用的参数
-	Reflect.deleteProperty(request, 'AreaCode'); // 删除无用的参数
+	requestParams.value = Other.deepClone(state.queryParams);
+	requestParams.value.CreationTimeStart = state.queryParams.crTime === null ? null : state.queryParams.crTime[0]; // 生成时间
+	requestParams.value.CreationTimeEnd = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
+	Reflect.deleteProperty(requestParams.value, 'crTime'); // 删除无用的参数
 	state.loading = true;
-	getWorkList(request)
+	getWorkList(requestParams.value)
 		.then((response: any) => {
 			state.tableData = response?.result.items ?? [];
 			state.total = response?.result.total;
@@ -629,17 +378,6 @@ const queryList = () => {
 const resetQuery = (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	formEl.resetFields();
-	state.queryParams.CreationTimeStart = null;
-	state.queryParams.CreationTimeEnd = null;
-	state.queryParams.ExpiredTimeStart = null;
-	state.queryParams.ExpiredTimeEnd = null;
-	state.queryParams.ActualHandleTimeStart = null;
-	state.queryParams.ActualHandleTimeEnd = null;
-	fastSearch.value = 'all';
-	state.queryParams.AreaCodes = [];
-	state.queryParams.IsEnforcementOrder = null;
-	state.queryParams.IsPassTheBuckOrder = null;
-	state.queryParams.IsTheClueTrue = null;
 	queryList();
 };
 // 线索核实
@@ -652,12 +390,6 @@ const onVerify = (row: any) => {
 const onEdit = (row: any) => {
 	verifyRef.value.openDialog(row);
 };
-// 新建工单
-const onAddOrder = () => {
-  router.push({
-    path:'/judicial/order/add'
-  })
-};
 onMounted(() => {
 	getBaseData();
 	queryList();

+ 35 - 26
src/views/judicial/statistics/eventClass.vue

@@ -3,6 +3,11 @@
 		<!-- 搜索  -->
 		<el-card shadow="never">
 			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
+				<el-form-item prop="AreaCode" label="区域">
+					<el-select v-model="state.AreaCode" placeholder="请选择区域" @change="handleQuery" clearable>
+						<el-option :label="item.areaName" :value="item.id" v-for="item in areaOptions" :key="item.id" />
+					</el-select>
+				</el-form-item>
 				<el-form-item prop="crTime" label="受理时间段">
 					<el-date-picker
 						v-model="state.queryParams.crTime"
@@ -13,8 +18,8 @@
 						end-placeholder="结束时间"
 						:shortcuts="shortcuts"
 						@change="handleQuery"
-            value-format="YYYY-MM-DD[T]HH:mm:ss"
-            :default-time="defaultTimeStartEnd"
+						value-format="YYYY-MM-DD[T]HH:mm:ss"
+						:default-time="defaultTimeStartEnd"
 						:clearable="false"
 					/>
 				</el-form-item>
@@ -27,7 +32,7 @@
 			</el-form>
 		</el-card>
 		<el-row :gutter="20">
-			<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+			<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.theClueIsTrue">
 						<template #title>
@@ -36,7 +41,7 @@
 					</el-statistic>
 				</el-card>
 			</el-col>
-			<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+			<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.theClueIsNotTrue">
 						<template #title>
@@ -45,7 +50,7 @@
 					</el-statistic>
 				</el-card>
 			</el-col>
-			<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+			<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.enforcementOrder">
 						<template #title>
@@ -54,15 +59,24 @@
 					</el-statistic>
 				</el-card>
 			</el-col>
-			<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
+			<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">
+					<el-statistic :value="state.orderCount.toBeVerified">
 						<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-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-row>
 		<el-card shadow="never">
 			<ProTable
@@ -79,11 +93,6 @@
 				show-summary
 				row-key="id"
 			>
-				<template #tableHeader>
-					<el-select v-model="state.AreaCode" placeholder="请选择区域" @change="handleQuery" clearable style="max-width: 220px;">
-						<el-option :label="item.areaName" :value="item.id" v-for="item in areaOptions" :key="item.id" />
-					</el-select>
-				</template>
 			</ProTable>
 		</el-card>
 	</div>
@@ -91,15 +100,14 @@
 <script setup lang="tsx" name="judicialStatisticsEventClass">
 import { onMounted, reactive, ref } from 'vue';
 import { FormInstance } from 'element-plus';
-import { defaultDate, defaultDateTime, defaultTimeStartEnd, shortcuts } from "@/utils/constants";
+import { defaultDate, defaultDateTime, defaultTimeStartEnd, shortcuts } from '@/utils/constants';
 import dayjs from 'dayjs';
-import { eventStatistics, getArea } from '@/api/judicial';
+import { eventStatistics, getArea, getAreaChildren } from '@/api/judicial';
 import { useRouter } from 'vue-router';
-import { guid } from "@/utils/tools";
-import Other from "@/utils/other";
+import { guid } from '@/utils/tools';
+import Other from '@/utils/other';
 
 const columns = ref<any>([
-  { type: 'index', fixed: 'left', width: 55, label: '序号', align: 'center' },
 	{ prop: 'name', label: '事项类型' },
 	{
 		prop: 'num',
@@ -130,6 +138,7 @@ const state = reactive<any>({
 		theClueIsNotTrue: 0,
 		enforcementOrder: 0,
 		passTheBuckOrder: 0,
+		toBeVerified: 0,
 	},
 	AreaCode: null,
 });
@@ -141,8 +150,8 @@ const handleQuery = () => {
 /** 获取列表 */
 const queryList = () => {
 	state.loading = true;
-  const StartTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[0];
-  const EndTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
+	const StartTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[0];
+	const EndTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
 	const request = {
 		StartTime,
 		EndTime,
@@ -168,8 +177,8 @@ const resetQuery = (formEl: FormInstance | undefined) => {
 };
 // 懒加载
 const load = (row: any, treeNode: unknown, resolve: (date: any[]) => void) => {
-  const StartTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[0];
-  const EndTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
+	const StartTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[0];
+	const EndTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
 	const request = {
 		StartTime,
 		EndTime,
@@ -187,7 +196,7 @@ const load = (row: any, treeNode: unknown, resolve: (date: any[]) => void) => {
 const areaOptions = ref<any>([]);
 const getBaseData = async () => {
 	try {
-		const res = await getArea();
+		const res = await getAreaChildren();
 		areaOptions.value = res.result ?? [];
 	} catch (e) {
 		console.log(e);
@@ -196,15 +205,15 @@ const getBaseData = async () => {
 // 查看详情
 const router = useRouter();
 const linkDetail = (row: any) => {
-  const StartTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[0];
-  const EndTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
+	const StartTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[0];
+	const EndTime = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
 	router.push({
 		name: 'judicialDetailEventClass',
 		query: {
 			StartTime,
 			EndTime,
-			AreaCode:state.AreaCode,
-      EventTypeId:row.id,
+			AreaCode: state.AreaCode,
+			EventTypeId: row.id,
 		},
 	});
 };

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

@@ -83,7 +83,7 @@ onMounted(async () => {
 	width: 100%;
 	display: flex;
 	position: absolute;
-	bottom: 10px;
+	bottom: 0;
 	z-index: 10;
 	&-warp {
 		margin: auto;

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

@@ -58,7 +58,7 @@ onMounted(() => {
 	width: 100%;
 	display: flex;
 	position: absolute;
-	bottom: 10px;
+	bottom: 0;
 	z-index: 10;
 	&-warp {
 		margin: auto;

+ 2 - 2
src/views/statistics/center/detailWrongItem.vue

@@ -111,10 +111,10 @@ const columns = ref<any[]>([
 	{ prop: 'errorName', label: '错误类别',minWidth: 200 },
 	{ prop: 'orderSpecial.order.acceptType', label: '受理类型',minWidth: 120 },
 	{ prop: 'orderSpecial.order.sourceChannel', label: '来源渠道',minWidth: 120 },
-  { prop: 'errorName', label: '受理内容',minWidth:200 },
+/*  { prop: 'errorName', label: '受理内容',minWidth:200 },
   { prop: 'errorName', label: '第一次办结内容',minWidth:200 },
   { prop: 'errorName', label: '最终办结内容',minWidth:200 },
-  { prop: 'errorName', label: '派单退回意见',minWidth:200 },
+  { prop: 'errorName', label: '派单退回意见',minWidth:200 },*/
 ]);
 // 定义变量内容
 const ruleFormRef = ref<RefType>(); // 表单ref