Browse Source

reactor:版本回滚;

zhangchong 1 year ago
parent
commit
4752f237a5

+ 4 - 4
src/views/business/visit/component/Visit-detail.vue

@@ -226,7 +226,7 @@
 											<el-divider content-position="left">
 												<el-text tag="b" size="large"> {{ item.visitOrgName }} </el-text>
 											</el-divider>
-											<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+<!--											<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 												<el-form-item
 													label="部门是否联系"
 													:prop="`visitDetails.${index}.seatEvaluate`"
@@ -265,7 +265,7 @@
 														drawerWidth="40%"
 													/>
 												</el-form-item>
-											</el-col>
+											</el-col>-->
 											<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 												<el-form-item
 													label="部门办件结果"
@@ -309,7 +309,7 @@
 													</el-select>
 												</el-form-item>
 											</el-col>
-											<!--											<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+											<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 												<el-form-item
 													label="部门办件态度"
 													:prop="`visitDetails.${index}.orgHandledAttitude`"
@@ -330,7 +330,7 @@
 														<el-option v-for="items in visitSatisfaction" :key="items.dicDataValue" :label="items.dicDataName" :value="items" />
 													</el-select>
 												</el-form-item>
-											</el-col>-->
+											</el-col>
 											<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 												<el-form-item
 													label="部门回访内容"

+ 9 - 4
src/views/judicial/statistics/area.vue

@@ -49,6 +49,7 @@ import { shortcuts } from '@/utils/constants';
 import dayjs from 'dayjs';
 import { areaStatistics } from '@/api/judicial';
 import { useRouter } from "vue-router";
+import { guid } from "@/utils/tools";
 // 定义变量内容
 
 const columns = ref<any>([
@@ -190,12 +191,13 @@ const linkDetail = (row: any, type: string) => {
       router.push({
         name: 'judicialDetailArea',
         params: {
-          id: row.areaCode,
+          id: guid(),
         },
         state: {
           StartDate,
           EndDate,
           type: 'orderCountNum',
+          areaCode: row.areaCode,
         },
       });
       break;
@@ -203,12 +205,13 @@ const linkDetail = (row: any, type: string) => {
       router.push({
         name: 'judicialDetailArea',
         params: {
-          id: row.areaCode,
+          id: guid(),
         },
         state: {
           StartDate,
           EndDate,
           type: 'theClueIsTrue',
+          areaCode: row.areaCode,
         },
       });
       break;
@@ -216,12 +219,13 @@ const linkDetail = (row: any, type: string) => {
       router.push({
         name: 'judicialDetailArea',
         params: {
-          id: row.areaCode,
+          id: guid(),
         },
         state: {
           StartDate,
           EndDate,
           type: 'theClueIsNotTrue',
+          areaCode: row.areaCode,
         },
       });
       break;
@@ -229,12 +233,13 @@ const linkDetail = (row: any, type: string) => {
       router.push({
         name: 'judicialDetailArea',
         params: {
-          id: row.areaCode,
+          id: guid(),
         },
         state: {
           StartDate,
           EndDate,
           type: 'enforcementOrder',
+          areaCode: row.areaCode,
         },
       });
       break;

+ 10 - 4
src/views/judicial/statistics/department.vue

@@ -48,6 +48,7 @@ import { shortcuts } from '@/utils/constants';
 import dayjs from 'dayjs';
 import { departmentStatistics } from '@/api/judicial';
 import { useRouter } from 'vue-router';
+import { guid } from "@/utils/tools";
 // 定义变量内容
 
 const columns = ref<any>([
@@ -207,6 +208,7 @@ const linkDetail = (row: any, type: string) => {
 					StartDate,
 					EndDate,
 					type: 'orgName',
+          OrgCode: row.orgCode,
 				},
 			});
 			break;
@@ -214,12 +216,13 @@ const linkDetail = (row: any, type: string) => {
 			router.push({
 				name: 'judicialDetailDepartment',
 				params: {
-					id: row.orgCode,
+					id: guid(),
 				},
 				state: {
 					StartDate,
 					EndDate,
 					type: 'countNum',
+          OrgCode: row.orgCode,
 				},
 			});
 			break;
@@ -227,12 +230,13 @@ const linkDetail = (row: any, type: string) => {
 			router.push({
 				name: 'judicialDetailDepartment',
 				params: {
-					id: row.orgCode,
+					id: guid(),
 				},
 				state: {
 					StartDate,
 					EndDate,
 					type: 'theClueIsTrue',
+          OrgCode: row.orgCode,
 				},
 			});
 			break;
@@ -240,12 +244,13 @@ const linkDetail = (row: any, type: string) => {
 			router.push({
 				name: 'judicialDetailDepartment',
 				params: {
-					id: row.orgCode,
+					id: guid(),
 				},
 				state: {
 					StartDate,
 					EndDate,
 					type: 'theClueIsNotTrue',
+          OrgCode: row.orgCode,
 				},
 			});
 			break;
@@ -253,12 +258,13 @@ const linkDetail = (row: any, type: string) => {
 			router.push({
 				name: 'judicialDetailDepartment',
 				params: {
-					id: row.orgCode,
+					id: guid(),
 				},
 				state: {
 					StartDate,
 					EndDate,
 					type: 'enforcementOrder',
+          OrgCode: row.orgCode,
 				},
 			});
 			break;

+ 11 - 20
src/views/judicial/statistics/detailArea.vue

@@ -116,43 +116,34 @@ const columns = ref<any[]>([
 const historyParams = history.state;
 const queryList = () => {
 	let request = {};
+  const data = {
+    PageIndex: state.queryParams.PageIndex,
+    PageSize: state.queryParams.PageSize,
+    StartDate: historyParams.StartDate,
+    EndDate: historyParams.EndDate,
+    AreaCode: historyParams.areaCode,
+  }
 	switch (historyParams.type) {
 		case 'orderCountNum':
 			request = {
-				PageIndex: state.queryParams.PageIndex,
-				PageSize: state.queryParams.PageSize,
-				StartDate: historyParams.StartDate,
-				EndDate: historyParams.EndDate,
-				AreaCode: route.params.id,
+        ...data,
 			};
 			break;
 		case 'theClueIsTrue':
 			request = {
-				PageIndex: state.queryParams.PageIndex,
-				PageSize: state.queryParams.PageSize,
-				StartDate: historyParams.StartDate,
-				EndDate: historyParams.EndDate,
-				AreaCode: route.params.id,
+				...data,
 				TheClueIsTrue: true,
 			};
 			break;
 		case 'theClueIsNotTrue':
 			request = {
-				PageIndex: state.queryParams.PageIndex,
-				PageSize: state.queryParams.PageSize,
-				StartDate: historyParams.StartDate,
-				EndDate: historyParams.EndDate,
-				AreaCode: route.params.id,
+        ...data,
 				TheClueIsNotTrue: true,
 			};
 			break;
 		case 'enforcementOrder':
 			request = {
-				PageIndex: state.queryParams.PageIndex,
-				PageSize: state.queryParams.PageSize,
-				StartDate: historyParams.StartDate,
-				EndDate: historyParams.EndDate,
-				AreaCode: route.params.id,
+        ...data,
 				EnforcementOrder: true,
 			};
 			break;

+ 11 - 20
src/views/judicial/statistics/detailDepartment.vue

@@ -116,43 +116,34 @@ const columns = ref<any[]>([
 const historyParams = history.state;
 const queryList = () => {
 	let request = {};
+  const data = {
+    PageIndex: state.queryParams.PageIndex,
+    PageSize: state.queryParams.PageSize,
+    StartDate: historyParams.StartDate,
+    EndDate: historyParams.EndDate,
+    OrgCode: historyParams.OrgCode,
+  }
 	switch (historyParams.type) {
 		case 'countNum':
 			request = {
-				PageIndex: state.queryParams.PageIndex,
-				PageSize: state.queryParams.PageSize,
-				StartDate: historyParams.StartDate,
-				EndDate: historyParams.EndDate,
-        OrgCode: route.params.id,
+				...data,
 			};
 			break;
 		case 'theClueIsTrue':
 			request = {
-				PageIndex: state.queryParams.PageIndex,
-				PageSize: state.queryParams.PageSize,
-				StartDate: historyParams.StartDate,
-				EndDate: historyParams.EndDate,
-        OrgCode: route.params.id,
+        ...data,
         TheClueIsTrue:true
 			};
 			break;
 		case 'theClueIsNotTrue':
 			request = {
-				PageIndex: state.queryParams.PageIndex,
-				PageSize: state.queryParams.PageSize,
-				StartDate: historyParams.StartDate,
-				EndDate: historyParams.EndDate,
-        OrgCode: route.params.id,
+        ...data,
         TheClueIsNotTrue:true
 			};
 			break;
 		case 'enforcementOrder':
 			request = {
-				PageIndex: state.queryParams.PageIndex,
-				PageSize: state.queryParams.PageSize,
-				StartDate: historyParams.StartDate,
-				EndDate: historyParams.EndDate,
-        OrgCode: route.params.id,
+        ...data,
         EnforcementOrder:true
 			};
 			break;

+ 11 - 5
src/views/judicial/statistics/detailDepartmentSub.vue

@@ -48,6 +48,7 @@ import { shortcuts } from '@/utils/constants';
 import dayjs from 'dayjs';
 import { departmentStatisticsDepartmentDetail } from '@/api/judicial';
 import { useRoute, useRouter } from 'vue-router';
+import { guid } from '@/utils/tools';
 // 定义变量内容
 
 const columns = ref<any>([
@@ -146,7 +147,7 @@ const queryList = () => {
 	const request = {
 		StartDate,
 		EndDate,
-		OrgCode: route.params.id,
+		OrgCode: historyParams.OrgCode,
 	};
 	departmentStatisticsDepartmentDetail(request)
 		.then((res: any) => {
@@ -212,6 +213,7 @@ const linkDetail = (row: any, type: string) => {
 					StartDate,
 					EndDate,
 					type: 'orgName',
+					OrgCode: row.orgCode,
 				},
 			});
 			break;
@@ -219,12 +221,13 @@ const linkDetail = (row: any, type: string) => {
 			router.push({
 				name: 'judicialDetailDepartment',
 				params: {
-					id: row.orgCode,
+					id: guid(),
 				},
 				state: {
 					StartDate,
 					EndDate,
 					type: 'countNum',
+					OrgCode: row.orgCode,
 				},
 			});
 			break;
@@ -232,12 +235,13 @@ const linkDetail = (row: any, type: string) => {
 			router.push({
 				name: 'judicialDetailDepartment',
 				params: {
-					id: row.orgCode,
+					id: guid(),
 				},
 				state: {
 					StartDate,
 					EndDate,
 					type: 'theClueIsTrue',
+					OrgCode: row.orgCode,
 				},
 			});
 			break;
@@ -245,12 +249,13 @@ const linkDetail = (row: any, type: string) => {
 			router.push({
 				name: 'judicialDetailDepartment',
 				params: {
-					id: row.orgCode,
+					id: guid(),
 				},
 				state: {
 					StartDate,
 					EndDate,
 					type: 'theClueIsNotTrue',
+					OrgCode: row.orgCode,
 				},
 			});
 			break;
@@ -258,12 +263,13 @@ const linkDetail = (row: any, type: string) => {
 			router.push({
 				name: 'judicialDetailDepartment',
 				params: {
-					id: row.orgCode,
+					id: guid(),
 				},
 				state: {
 					StartDate,
 					EndDate,
 					type: 'enforcementOrder',
+					OrgCode: row.orgCode,
 				},
 			});
 			break;

+ 1 - 1
src/views/judicial/statistics/detailEventClass.vue

@@ -116,7 +116,7 @@ const columns = ref<any[]>([
 const historyParams = history.state;
 const queryList = () => {
 	const request = {
-		EventTypeId: route.params.id,
+		EventTypeId: historyParams.EventTypeId,
 		AreaCode: historyParams.AreaCode,
 		PageIndex: state.queryParams.PageIndex,
 		PageSize: state.queryParams.PageSize,

+ 1 - 1
src/views/judicial/statistics/detailSatisfied.vue

@@ -137,7 +137,7 @@ const queryList = () => {
 		StartDate: historyParams.StartDate,
 		EndDate: historyParams.EndDate,
 		TypeId: historyParams.TypeId,
-		OrgCode: route.params.id,
+		OrgCode: historyParams.orgCode,
 		DateValue: historyParams.DateValue,
 		PageIndex: state.queryParams.PageIndex,
 		PageSize: state.queryParams.PageSize,

+ 4 - 2
src/views/judicial/statistics/detailSatisfiedOrg.vue

@@ -91,6 +91,7 @@ import { FormInstance } from 'element-plus';
 import { departmentSatisfactionChildDetail } from '@/api/judicial';
 import dayjs from 'dayjs';
 import { useRoute, useRouter } from 'vue-router';
+import { guid } from "@/utils/tools";
 
 // 表格配置项
 const columns = ref<any[]>([
@@ -203,7 +204,7 @@ const queryList = () => {
 		StartDate: historyParams.StartDate,
 		EndDate: historyParams.EndDate,
 		TypeId: historyParams.TypeId,
-		OrgCode: route.params.id,
+		OrgCode: historyParams.orgCode,
 		DateValue: historyParams.DateValue,
 	};
 	departmentSatisfactionChildDetail(request)
@@ -303,7 +304,7 @@ const onDetail = (key: string, row, type: string) => {
 	router.push({
 		name: 'judicialStatisticsDetailSatisfied',
 		params: {
-			id: row.orgCode,
+      id: guid(),
 		},
 		state: {
 			StartDate,
@@ -311,6 +312,7 @@ const onDetail = (key: string, row, type: string) => {
 			OrgCode: row.orgCode,
 			TypeId: state.queryParams.TypeId,
 			DateValue: key,
+      orgCode: row.orgCode,
 		},
 	});
 };

+ 3 - 1
src/views/judicial/statistics/eventClass.vue

@@ -94,6 +94,7 @@ import { shortcuts } from '@/utils/constants';
 import dayjs from 'dayjs';
 import { eventStatistics, getArea } from '@/api/judicial';
 import { useRouter } from 'vue-router';
+import { guid } from "@/utils/tools";
 
 const columns = ref<any>([
 	{ prop: 'name', label: '事项类型' },
@@ -210,12 +211,13 @@ const linkDetail = (row: any) => {
 	router.push({
 		name: 'judicialDetailEventClass',
 		params: {
-			id: row.id,
+			id: guid(),
 		},
 		state: {
 			StartDate,
 			EndDate,
 			AreaCode,
+      EventTypeId:row.id,
 		},
 	});
 };

+ 3 - 1
src/views/judicial/statistics/satisfaction.vue

@@ -127,6 +127,7 @@ import { shortcuts } from '@/utils/constants';
 import dayjs from 'dayjs';
 import { departmentSatisfaction } from '@/api/judicial';
 import { useRouter } from 'vue-router';
+import { guid } from "@/utils/tools";
 // 定义变量内容
 
 const columns = ref<any>([
@@ -354,13 +355,14 @@ const onDetail = (key: string, row, type: string) => {
 	router.push({
 		name: 'judicialStatisticsDetailSatisfied',
 		params: {
-			id: row.orgCode,
+			id: guid(),
 		},
 		state: {
 			StartDate,
 			EndDate,
 			DateValue: key,
 			TypeId: state.queryParams.TypeId,
+      orgCode: row.orgCode,
 		},
 	});
 };

+ 257 - 248
src/views/todo/seats/accept/Citizen-portrait.vue

@@ -1,290 +1,299 @@
 <template>
-	<div class="order-accept-citizen-portrait" v-loading="loading">
-		<el-row :gutter="20">
-			<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
-				<el-card shadow="never">
-					<p class="border-title mb10">基本信息</p>
-					<div class="info-form">
-						<p class="form-item">
-							<span class="form-label">联系电话:</span>
-							<span class="flex-1">{{ state.orderInfo.contact }}</span>
-						</p>
-						<p class="form-item">
-							<span class="form-label">姓名:</span>
-							<span class="flex-1">{{ state.citizen.name }}</span>
-						</p>
-						<p class="form-item">
-							<span class="form-label">首次联系:</span>
-							<span class="flex-1">{{ formatDate(state.oneCallTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-						</p>
-						<p class="form-item">
-							<span class="form-label">上次联系:</span>
-							<span class="flex-1">{{ formatDate(state.lastCallTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-						</p>
-					</div>
-				</el-card>
-				<el-card shadow="never" class="mt20">
-					<p class="border-title mb10">工单历史</p>
-					<div class="info-form">
-						<p class="form-item">
-							<span class="form-label">全部工单:</span>
-							<span class="flex-1">{{ state.order.allOrderNum }}</span>
-						</p>
-						<p class="form-item">
-							<span class="form-label">已办工单:</span>
-							<span class="flex-1">{{ state.order.endOrderNum }}</span>
-						</p>
-						<p class="form-item">
-							<span class="form-label">在办工单:</span>
-							<span class="flex-1">{{ state.order.handOrderNum }}</span>
-						</p>
-						<p class="form-item">
-							<span class="form-label">不满意工单:</span>
-							<span class="flex-1">{{ state.order.dissatisfactionNum }}</span>
-						</p>
-					</div>
-				</el-card>
-			</el-col>
-			<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
-				<el-card shadow="never">
-					<p class="border-title mb10">来电历史:</p>
-					<div class="info-form">
-						<p class="form-item">
-							<span class="form-label">来电次数:</span>
-							<span class="flex-1">{{ state.callHistory.allCallNum }}</span>
-						</p>
-						<p class="form-item">
-							<span class="form-label">接通次数:</span>
-							<span class="flex-1">{{ state.callHistory.connectNum }}</span>
-						</p>
-						<p class="form-item">
-							<span class="form-label">回拨次数:</span>
-							<span class="flex-1">{{ state.callHistory.callBackNum }}</span>
-						</p>
-					</div>
-				</el-card>
-				<el-card shadow="never" class="mt20">
-					<p class="border-title mb10">关注诉求</p>
-					<div class="tag-list">
-						<el-tag v-for="tag in state.hotspotNames" effect="dark" :key="tag">{{ tag }}</el-tag>
-					</div>
-				</el-card>
-			</el-col>
-			<el-col :span="24" class="mt20">
-				<el-card shadow="never">
-					<p class="border-title mb10">市民标签</p>
-					<div class="tag-list">
-						<el-tag v-for="tag in state.label" :closable="closable" effect="dark" @close="closeTag(tag)" :key="tag">{{ tag.label }}</el-tag>
-					</div>
-					<el-form :model="state.ruleForm" label-width="0" ref="ruleFormRef" @submit.native.prevent v-if="state.citizen.id && closable">
-						<el-form-item label="" prop="content" :rules="[{ required: true, message: '请输入标签内容', trigger: 'blur' }]">
-							<div class="flex-center-align mt10 w100">
-								<el-input
-									v-model="state.ruleForm.content"
-									placeholder="请输入标签内容"
-									clearable
-									show-word-limit
-									maxlength="10"
-									@keyup.enter="addTag(ruleFormRef)"
-								/>
-								<el-button type="primary" @click="addTag(ruleFormRef)" class="ml10">添加标签</el-button>
-							</div>
-						</el-form-item>
-					</el-form>
-				</el-card>
-			</el-col>
-		</el-row>
-	</div>
+  <div class="order-accept-citizen-portrait" v-loading="loading">
+    <el-row :gutter="20">
+      <el-col :xs="24" :sm="24" :md="24" :lg="8" :xl="8">
+        <el-card shadow="never">
+          <p class="border-title mb10">基本信息</p>
+          <div class="info-form">
+            <p class="form-item">
+              <span class="form-label">联系电话:</span>
+              <span class="flex-1">{{ state.orderInfo.contact }}</span>
+            </p>
+            <p class="form-item">
+              <span class="form-label">姓名:</span>
+              <span class="flex-1">{{ state.citizen.name }}</span>
+            </p>
+            <p class="form-item">
+              <span class="form-label">首次联系:</span>
+              <span class="flex-1">{{ formatDate(state.oneCallTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+            </p>
+            <p class="form-item">
+              <span class="form-label">上次联系:</span>
+              <span class="flex-1">{{ formatDate(state.lastCallTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+            </p>
+          </div>
+        </el-card>
+        <el-card shadow="never" class="mt20">
+          <p class="border-title mb10">工单历史</p>
+          <div class="info-form">
+            <p class="form-item">
+              <span class="form-label">全部工单:</span>
+              <span class="flex-1">{{ state.order.allOrderNum }}</span>
+            </p>
+            <p class="form-item">
+              <span class="form-label">已办工单:</span>
+              <span class="flex-1">{{ state.order.endOrderNum }}</span>
+            </p>
+            <p class="form-item">
+              <span class="form-label">在办工单:</span>
+              <span class="flex-1">{{ state.order.handOrderNum }}</span>
+            </p>
+            <p class="form-item">
+              <span class="form-label">不满意工单:</span>
+              <span class="flex-1">{{ state.order.dissatisfactionNum }}</span>
+            </p>
+          </div>
+        </el-card>
+      </el-col>
+      <el-col :xs="24" :sm="24" :md="24" :lg="8" :xl="8" style="display: flex; align-items: center">
+        <el-card class="w100" shadow="never">
+          <p class="citizen-title mb10">市民画像</p>
+          <div class="citizen-img-box">
+            <img v-lazy="getImageUrl('citizen.png')" alt="" />
+          </div>
+        </el-card>
+      </el-col>
+      <el-col :xs="24" :sm="24" :md="24" :lg="8" :xl="8">
+        <el-card shadow="never">
+          <p class="border-title mb10">来电历史:</p>
+          <div class="info-form">
+            <p class="form-item">
+              <span class="form-label">来电次数:</span>
+              <span class="flex-1">{{ state.callHistory.allCallNum }}</span>
+            </p>
+            <p class="form-item">
+              <span class="form-label">接通次数:</span>
+              <span class="flex-1">{{ state.callHistory.connectNum }}</span>
+            </p>
+            <p class="form-item">
+              <span class="form-label">回拨次数:</span>
+              <span class="flex-1">{{ state.callHistory.callBackNum }}</span>
+            </p>
+          </div>
+        </el-card>
+        <el-card shadow="never" class="mt20">
+          <p class="border-title mb10">关注诉求</p>
+          <div class="tag-list">
+            <el-tag v-for="tag in state.hotspotNames" effect="dark" :key="tag">{{ tag }}</el-tag>
+          </div>
+        </el-card>
+      </el-col>
+      <el-col :span="24" class="mt20">
+        <el-card shadow="never">
+          <p class="border-title mb10">市民标签</p>
+          <div class="tag-list">
+            <el-tag v-for="tag in state.label" :closable="closable" effect="dark" @close="closeTag(tag)" :key="tag">{{ tag.label }}</el-tag>
+          </div>
+          <el-form :model="state.ruleForm" label-width="0" ref="ruleFormRef" @submit.native.prevent v-if="state.citizen.id && closable">
+            <el-form-item label="" prop="content" :rules="[{ required: true, message: '请输入标签内容', trigger: 'blur' }]">
+              <div class="flex-center-align mt10 w100">
+                <el-input
+                  v-model="state.ruleForm.content"
+                  placeholder="请输入标签内容"
+                  clearable
+                  show-word-limit
+                  maxlength="10"
+                  @keyup.enter="addTag(ruleFormRef)"
+                />
+                <el-button type="primary" @click="addTag(ruleFormRef)" class="ml10">添加标签</el-button>
+              </div>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </el-col>
+    </el-row>
+  </div>
 </template>
 <script setup lang="ts" name="orderAcceptCitizenPortrait">
 import { computed, reactive, ref, watch } from 'vue';
 import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
 import { citizenDetailByPhone, citizenAdd, citizenLabelAdd, citizenLabelDelete } from '@/api/auxiliary/citizen';
 import { formatDate } from '@/utils/formatTime';
+import { getImageUrl } from '@/utils/tools';
 
 const props = defineProps({
-	editable: {
-		type: Boolean,
-		default: true,
-	},
-	orderInfo: {
-		type: Object,
-		default: () => {
-			return {};
-		},
-	},
+  editable: {
+    type: Boolean,
+    default: true,
+  },
+  orderInfo: {
+    type: Object,
+    default: () => {
+      return {};
+    },
+  },
 });
 
 const state = reactive<any>({
-	lastCallTime: '', // 上次联系时间
+  lastCallTime: '', // 上次联系时间
   oneCallTime: '', // 首次联系时间
-	hotspotNames: [], // 关注诉求
-	order: {
-		allOrderNum: 0, // 全部工单
-		endOrderNum: 0, // 已办工单
-		handOrderNum: 0, // 在办工单
-		dissatisfactionNum: 0, // 不满意工单
-	},
-	callHistory: {
-		allCallNum: 0, // 来电次数
-		callBackNum: 0, // 回拨次数
-		connectNum: 0, // 接通次数
-	},
-	citizen: {
-		name: '', // 姓名
-		id: '', // 市民id
-	},
-	label: [], // 市民标签
-	orderInfo: <EmptyObjectType>{}, // 工单信息
-	ruleForm: {
-		content: '', // 标签内容
-	},
+  hotspotNames: [], // 关注诉求
+  order: {
+    allOrderNum: 0, // 全部工单
+    endOrderNum: 0, // 已办工单
+    handOrderNum: 0, // 在办工单
+    dissatisfactionNum: 0, // 不满意工单
+  },
+  callHistory: {
+    allCallNum: 0, // 来电次数
+    callBackNum: 0, // 回拨次数
+    connectNum: 0, // 接通次数
+  },
+  citizen: {
+    name: '', // 姓名
+    id: '', // 市民id
+  },
+  label: [], // 市民标签
+  orderInfo: <EmptyObjectType>{}, // 工单信息
+  ruleForm: {
+    content: '', // 标签内容
+  },
 });
 
 // 暂定智能删除自己创建的标签 但是系统管理员可以删除所有标签
 const closable = computed(() => {
-	return props.editable;
+  return props.editable;
 });
 // 查询市民画像方法
 const getCitizen = () => {
-	state.orderInfo = props.orderInfo;
-	const phone = /^((0\d{2,3}(-)?\d{7,8})|(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8})$/;
-	if (!phone.test(state.orderInfo.contact)) return; // 联系号码正则
-	getDetail(state.orderInfo.contact);
+  state.orderInfo = props.orderInfo;
+  const phone = /^((0\d{2,3}(-)?\d{7,8})|(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8})$/;
+  if (!phone.test(state.orderInfo.contact)) return; // 联系号码正则
+  getDetail(state.orderInfo.contact);
 };
 const loading = ref(false);
 // 查询市民画像详情
 const getDetail = async (phone: string) => {
-	loading.value = true;
-	try {
-		const { result } = await citizenDetailByPhone(phone);
-		if (result.citizen) {
-			// 有市民信息
-			state.lastCallTime = result.lastCallTime; // 上次联系时间
+  loading.value = true;
+  try {
+    const { result } = await citizenDetailByPhone(phone);
+    if (result.citizen) {
+      // 有市民信息
+      state.lastCallTime = result.lastCallTime; // 上次联系时间
       state.oneCallTime = result.oneCallTime; // 首次联系时间
-			state.hotspotNames = result.hotspotNames ? result.hotspotNames.split(',') : []; // 关注诉求
-			state.order = result.order; // 工单历史
-			state.callHistory = result.callHistory; // 来电历史
-			state.citizen = result.citizen; // 市民信息
-			state.label = result.citizen?.labelDetails ?? []; // 市民标签
-		} else {
-			// 没有市民信息 添加市民信息 重新获取详情
-			await citizenAdd({
-				phoneNumber: phone,
-				name: state.orderInfo.fromName,
-				gender: state.orderInfo.fromGender,
-				identityType: state.orderInfo.identityType,
-				licenceType: state.orderInfo.licenceType,
-				licenceNo: state.orderInfo.licenceNo,
-				ageRange: state.orderInfo.ageRange,
-				contact: state.orderInfo.contact,
-			});
-			await getDetail(phone);
-		}
-		loading.value = false;
-	} catch (e) {
-		loading.value = false;
-		console.log(e, '错误信息');
-	}
+      state.hotspotNames = result.hotspotNames ? result.hotspotNames.split(',') : []; // 关注诉求
+      state.order = result.order; // 工单历史
+      state.callHistory = result.callHistory; // 来电历史
+      state.citizen = result.citizen; // 市民信息
+      state.label = result.citizen?.labelDetails ?? []; // 市民标签
+    } else {
+      // 没有市民信息 添加市民信息 重新获取详情
+      await citizenAdd({
+        phoneNumber: phone,
+        name: state.orderInfo.fromName,
+        gender: state.orderInfo.fromGender,
+        identityType: state.orderInfo.identityType,
+        licenceType: state.orderInfo.licenceType,
+        licenceNo: state.orderInfo.licenceNo,
+        ageRange: state.orderInfo.ageRange,
+        contact: state.orderInfo.contact,
+      });
+      await getDetail(phone);
+    }
+    loading.value = false;
+  } catch (e) {
+    loading.value = false;
+    console.log(e, '错误信息');
+  }
 };
 // 添加标签
 const ruleFormRef = ref<RefType>();
 const addTag = (formEl: FormInstance | undefined) => {
-	if (!formEl) return;
-	formEl.validate((valid: boolean) => {
-		if (!valid) return;
-		loading.value = true;
-		citizenLabelAdd({
-			citizenId: state.citizen.id,
-			label: state.ruleForm.content,
-		})
-			.then(() => {
-				ElMessage.success('操作成功');
-				state.ruleForm.content = '';
-				getDetail(state.orderInfo.contact);
-			})
-			.finally(() => {
-				loading.value = false;
-			});
-	});
+  if (!formEl) return;
+  formEl.validate((valid: boolean) => {
+    if (!valid) return;
+    loading.value = true;
+    citizenLabelAdd({
+      citizenId: state.citizen.id,
+      label: state.ruleForm.content,
+    })
+      .then(() => {
+        ElMessage.success('操作成功');
+        state.ruleForm.content = '';
+        getDetail(state.orderInfo.contact);
+      })
+      .finally(() => {
+        loading.value = false;
+      });
+  });
 };
 const closeTag = (item: any) => {
-	ElMessageBox.confirm(`您确定要删除【${item.label}】标签,是否继续?`, '提示', {
-		confirmButtonText: '确认',
-		cancelButtonText: '取消',
-		type: 'warning',
-		draggable: true,
-		cancelButtonClass: 'default-button',
-		autofocus: false,
-	})
-		.then(() => {
-			citizenLabelDelete({
-				id: item.id,
-			}).then(() => {
-				ElMessage.success('操作成功');
-				getDetail(state.orderInfo.contact);
-			});
-		})
-		.catch(() => {});
+  ElMessageBox.confirm(`您确定要删除【${item.label}】标签,是否继续?`, '提示', {
+    confirmButtonText: '确认',
+    cancelButtonText: '取消',
+    type: 'warning',
+    draggable: true,
+    cancelButtonClass: 'default-button',
+    autofocus: false,
+  })
+    .then(() => {
+      citizenLabelDelete({
+        id: item.id,
+      }).then(() => {
+        ElMessage.success('操作成功');
+        getDetail(state.orderInfo.contact);
+      });
+    })
+    .catch(() => {});
 };
 watch(
-	() => props.orderInfo,
-	(newVal: any) => {
-		state.orderInfo = newVal;
-		getCitizen();
-	},
-	{ immediate: true }
+  () => props.orderInfo,
+  (newVal: any) => {
+    state.orderInfo = newVal;
+    getCitizen();
+  },
+  { immediate: true }
 );
 defineExpose({
-	getCitizen,
+  getCitizen,
 });
 </script>
 
 <style scoped lang="scss">
 .order-accept-citizen-portrait {
-	.el-card {
-		background-color: var(--el-color-info-light-9);
-		:deep(.el-card__body) {
-			padding: 20px 15px;
-		}
-		.info-form {
-			.form-item {
-				display: flex;
-				align-items: center;
-				margin-bottom: 10px;
-				text-align: left;
-				.form-label {
-					width: 75px;
-					text-align: right;
-					margin-right: 3px;
-				}
-				.flex-1 {
-					flex: 1;
-				}
-				&:last-child {
-					margin-bottom: 0;
-				}
-			}
-		}
-		.citizen-title {
-			font-size: 16px;
-			font-weight: bold;
-			text-align: center;
-		}
-		.citizen-img-box {
-			img {
-				width: 100%;
-			}
-		}
-		.tag-list {
-			margin-top: 20px;
-			.el-tag {
-				margin: 0 10px 10px 0;
-				&:last-child {
-					margin: 0 0 10px 0;
-				}
-			}
-		}
-	}
+  .el-card {
+    background-color: var(--el-color-info-light-9);
+    :deep(.el-card__body) {
+      padding: 20px 15px;
+    }
+    .info-form {
+      .form-item {
+        display: flex;
+        align-items: center;
+        margin-bottom: 10px;
+        text-align: left;
+        .form-label {
+          width: 75px;
+          text-align: right;
+          margin-right: 3px;
+        }
+        .flex-1 {
+          flex: 1;
+        }
+        &:last-child {
+          margin-bottom: 0;
+        }
+      }
+    }
+    .citizen-title {
+      font-size: 16px;
+      font-weight: bold;
+      text-align: center;
+    }
+    .citizen-img-box {
+      img {
+        width: 100%;
+      }
+    }
+    .tag-list {
+      margin-top: 20px;
+      .el-tag {
+        margin: 0 10px 10px 0;
+        &:last-child {
+          margin: 0 0 10px 0;
+        }
+      }
+    }
+  }
 }
 </style>

+ 1262 - 0
src/views/todo/seats/accept/accept.vue

@@ -0,0 +1,1262 @@
+<template>
+  <div class="order-add-container layout-padding">
+    <el-row :gutter="10" class="h100">
+      <!--  左侧语音助手  -->
+      <el-col :span="6" class="left-content mb20 h100">
+        <el-scrollbar class="h100" noresize>
+          <el-card shadow="never">
+            <div class="flex-center-between pb10">
+              <p class="border-title mb10">语音助手</p>
+              <el-radio-group v-model="voiceType" @change="changeVoiceType">
+                <el-radio-button label="全部" />
+                <el-radio-button label="市民" />
+                <el-radio-button label="坐席" />
+              </el-radio-group>
+            </div>
+            <voice-assistant @orderOverwrite="orderOverwrite" ref="voiceAssistantRef" />
+          </el-card>
+          <el-card shadow="never">
+            <el-tabs v-model="leftTopActive" @tab-change="handleLeftTop" stretch>
+              <el-tab-pane label="实时质检" name="realtime">
+                <real-time-quality />
+              </el-tab-pane>
+              <el-tab-pane label="工单小结" name="summary">
+                <call-summary ref="callSummaryRef" @orderOverwrite="orderOverwrite" />
+              </el-tab-pane>
+            </el-tabs>
+          </el-card>
+        </el-scrollbar>
+      </el-col>
+      <!-- 中间工单信息 -->
+      <el-col :span="12" class="left-content mb20 h100" v-loading="state.formLoading">
+        <el-scrollbar class="h100" noresize>
+          <el-card shadow="never">
+            <el-form :model="state.ruleForm" ref="ruleFormRef" label-width="110px" label-position="right" scroll-to-error>
+              <p class="border-title mb10">来电信息</p>
+              <el-row :gutter="0">
+                <!-- 来源渠道 -->
+                <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>
+                  <!-- 来电弹单 -->
+                  <template v-if="state.createBy === 'tel'">
+                    <el-form-item label="来源渠道" prop="channel">
+                      <el-select v-model="state.ruleForm.channel" placeholder="请选择来源渠道" class="w100" value-key="dicDataValue" disabled>
+                        <el-option v-for="item in state.channelOptions" :value="item" :key="item.dicDataValue" :label="item.dicDataName" />
+                      </el-select>
+                    </el-form-item>
+                  </template>
+                  <!-- 互联网来信 -->
+                  <template v-if="state.createBy === 'letter'">
+                    <el-form-item label="来源渠道" prop="channel">
+                      互联网来信
+                      <span>[{{ state.ruleForm.channel }}]</span>
+                    </el-form-item>
+                  </template>
+                </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="transferPhone"> 暂无 </el-form-item>
+                  </template>
+                  <!-- 来电弹单 -->
+                  <template v-if="state.createBy === 'tel'">
+                    <el-form-item label="转接来源" prop="transferPhone">
+                      <span>[{{ state.ruleForm.transferPhone }}]</span>
+                    </el-form-item>
+                  </template>
+                  <!-- 互联网来信 -->
+                  <template v-if="state.createBy === 'letter'">
+                    <el-form-item label="转接来源" prop="transferPhone">
+                      <span>[{{ state.ruleForm.transferPhone }}]</span>
+                    </el-form-item>
+                  </template>
+                </el-col>
+                <!-- 来电号码 -->
+                <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="state.ruleForm.sourceChannelCode === 'RGDH'">
+                  <!-- 手动创建 -->
+                  <template v-if="state.createBy === 'manual'">
+                    <el-form-item label="来电号码" prop="fromPhone" :rules="[{ required: true, message: '请填写来电号码', trigger: 'blur' }]">
+                      <el-input v-model="state.ruleForm.fromPhone" placeholder="请填写来电号码" clearable> </el-input>
+                    </el-form-item>
+                  </template>
+                  <!-- 来电弹单 -->
+                  <template v-if="state.createBy === 'tel'">
+                    <el-form-item label="来电号码" prop="fromPhone">
+                      <el-input v-model="state.ruleForm.fromPhone" placeholder="请填写来电号码" disabled> </el-input>
+                    </el-form-item>
+                  </template>
+                  <!-- 互联网来信 -->
+                  <template v-if="state.createBy === 'letter'">
+                    <el-form-item label="来电号码">
+                      <span>[{{ state.ruleForm.fromPhone }}]</span>
+                    </el-form-item>
+                  </template>
+                </el-col>
+                <!-- 服务坐席 -->
+                <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+                  <el-form-item label="服务坐席">
+                    <!-- 手动创建 -->
+                    <template v-if="state.createBy === 'manual'">
+											<span
+                      >{{ state.ruleForm.acceptorName }}
+												<span v-if="state.ruleForm.acceptorStaffNo">[{{ state.ruleForm.acceptorStaffNo }}]</span></span
+                      >
+                    </template>
+                    <!-- 来电弹单 -->
+                    <template v-if="state.createBy === 'tel'">
+											<span
+                      >{{ state.ruleForm.acceptorName }}
+												<span v-if="state.ruleForm.acceptorStaffNo">[{{ state.ruleForm.acceptorStaffNo }}]</span></span
+                      >
+                    </template>
+                    <!-- 互联网来信 -->
+                    <template v-if="state.createBy === 'letter'">
+                      <span>[{{ telStatusInfo.telsNo }}]</span>
+                    </template>
+                  </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: true, message: '请填写来电人姓名', trigger: 'blur' }]">
+                    <el-row :gutter="10">
+                      <el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
+                        <el-input v-model="state.ruleForm.fromName" placeholder="请填写来电人姓名" clearable @input="inputName"> </el-input>
+                      </el-col>
+                      <el-col :xs="24" :sm="24" :md="24" :lg="6" :xl="6">
+                        <el-checkbox v-model="state.ruleForm.isSecret" label="保密" />
+                      </el-col>
+                    </el-row>
+                  </el-form-item>
+                </el-col>
+                <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+                  <el-form-item label="来电人性别" prop="fromGender" :rules="[{ required: true, message: '请选择来电人性别', trigger: 'change' }]">
+                    <el-radio-group v-model="state.ruleForm.fromGender">
+                      <el-radio :label="item.key" v-for="item in state.genderOptions" :key="item.key">{{ item.value }}</el-radio>
+                    </el-radio-group>
+                  </el-form-item>
+                </el-col>
+                <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+                  <el-form-item label="来电人身份" prop="identityType" :rules="[{ required: true, message: '请选择来电人身份', trigger: 'change' }]">
+                    <el-radio-group v-model="state.ruleForm.identityType" @change="selectIdentity">
+                      <el-radio :label="item.key" v-for="item in state.identityTypeOptions" :key="item.key">{{ item.value }}</el-radio>
+                    </el-radio-group>
+                  </el-form-item>
+                </el-col>
+                <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+                  <el-form-item label="证件类型" prop="licenceTypeObj" :rules="[{ required: false, message: '请选择证件类型', trigger: 'change' }]">
+                    <el-select
+                      v-model="state.ruleForm.licenceTypeObj"
+                      placeholder="请选择证件类型"
+                      class="w100"
+                      clearable
+                      value-key="dicDataValue"
+                      @change="(val:any) => {
+											state.ruleForm.licenceType = val?.dicDataName ?? null;
+											state.ruleForm.licenceTypeCode = val?.dicDataValue ?? null;
+										}"
+                    >
+                      <el-option v-for="item in state.licenceTypeOptions" :key="item.dicDataValue" :label="item.dicDataName" :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="licenceNo"
+                    :rules="[
+											{ required: state.ruleForm.licenceTypeCode, message: '请填写证件号码', trigger: 'blur' },
+											{
+												pattern: licenceNoPattern,
+												message: '证件号码格式错误',
+												trigger: 'blur',
+											},
+										]"
+                  >
+                    <el-input v-model="state.ruleForm.licenceNo" placeholder="请填写证件号码" clearable> </el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+                  <el-form-item label="年龄段" prop="ageRangeObj" :rules="[{ required: false, message: '请选择年龄段', trigger: 'change' }]">
+                    <el-select
+                      v-model="state.ruleForm.ageRangeObj"
+                      placeholder="请选择年龄段"
+                      class="w100"
+                      clearable
+                      value-key="dicDataValue"
+                      @change="(val:any) => {
+											state.ruleForm.ageRange = val?.dicDataName ?? null;
+											state.ruleForm.ageRangeCode = val?.dicDataValue ?? null;
+										}"
+                    >
+                      <el-option v-for="item in state.ageRangeOptions" :key="item.dicDataValue" :label="item.dicDataName" :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="contact" :rules="[{ required: true, message: '请填写联系电话', trigger: 'blur' }]">
+                    <el-row :gutter="9">
+                      <el-col :xs="24" :sm="24" :md="24" :lg="16" :xl="16">
+                        <el-input v-model="state.ruleForm.contact" placeholder="请填写联系电话" @blur="searchHistory" clearable> </el-input>
+                      </el-col>
+                      <el-col :xs="24" :sm="24" :md="24" :lg="8" :xl="8">
+                        <el-checkbox v-model="state.ruleForm.acceptSms" label="受理短信" />
+                      </el-col>
+                    </el-row>
+                  </el-form-item>
+                </el-col>
+                <!-- 当“来电/信人身份”为“企业”时必填 -->
+                <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+                  <el-form-item
+                    label="企业名称"
+                    prop="enterpriseName"
+                    :rules="[{ required: state.ruleForm.identityType === 2, message: '请填写企业名称', trigger: 'blur' }]"
+                  >
+                    <el-input v-model="state.ruleForm.enterpriseName" placeholder="请输入企业名称" clearable> </el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+                  <el-form-item
+                    label="专班名称"
+                    prop="zhuanBanMingCheng"
+                    :rules="[{ required: state.ruleForm.identityType === 2, message: '请填写专班名称', trigger: 'blur' }]"
+                  >
+                    <el-input v-model="state.ruleForm.zhuanBanMingCheng" placeholder="请填写专班名称" clearable>
+                      <template #append>
+                        <el-button type="primary" @click="handleSelect"><SvgIcon name="ele-Search" class="mr4" /> 查询企业</el-button>
+                      </template>
+                    </el-input>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+              <p class="border-title mb10">诉求信息</p>
+              <el-row>
+                <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="state.ruleForm.no">
+                  <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="24" :md="24" :lg="12" :xl="12">
+                  <el-form-item label="拓展信息">
+                    <el-button @click="showExpandForm" :loading="extraLoading">
+                      <SvgIcon name="ele-CirclePlus" class="mr3" size="16px" /> 拓展信息
+                    </el-button>
+                  </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-select
+                      v-model="state.ruleForm.acceptTypeObj"
+                      placeholder="请选择受理类型"
+                      class="w100"
+                      value-key="dicDataValue"
+                      @change="
+												(val) => {
+													state.ruleForm.acceptType = val.dicDataName;
+													state.ruleForm.acceptTypeCode = val.dicDataValue;
+												}
+											"
+                    >
+                      <el-option
+                        v-for="item in state.acceptTypeOptions"
+                        :key="item.dicDataValue"
+                        :disabled="item.disabled"
+                        :label="item.dicDataName"
+                        :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="emergencyLevel" :rules="[{ required: true, message: '请选择紧急程度', trigger: 'change' }]">
+                    <el-select v-model="state.ruleForm.emergencyLevel" placeholder="请选择紧急程度" class="w100">
+                      <el-option v-for="item in state.emergencyLevelOptions" :key="item.key" :label="item.value" :value="item.key" />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+                <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+                  <el-form-item label="推送分类" prop="pushTypeObj" :rules="[{ required: false, message: '请选择推送分类', trigger: 'change' }]">
+                    <el-select
+                      v-model="state.ruleForm.pushTypeObj"
+                      placeholder="请选择推送分类"
+                      class="w100"
+                      clearable
+                      value-key="dicDataValue"
+                      @change="(val:any) => {
+											state.ruleForm.pushType = val?.dicDataName ?? null;
+											state.ruleForm.pushTypeCode = val?.dicDataValue ?? null;
+										}"
+                    >
+                      <el-option v-for="item in state.pushTypeOptions" :key="item.dicDataValue" :label="item.dicDataName" :value="item" />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+                <!-- 宜宾特殊需求,新增一个事件分类可以自行维护(辅助功能-事件分类管理) -->
+                <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="AppConfigInfo.isCustomEvent">
+                  <el-form-item label="事件分类" prop="eventCategoryId" :rules="[{ required: true, message: '请选择事件分类', trigger: 'change' }]">
+                    <hot-spot-select
+                      v-model="state.ruleForm.eventCategoryId"
+                      class="w100"
+                      :externalArr="state.eventCategoryExternal"
+                      @choose="chooseEvent"
+                      type="event"
+                      placeholder="请选择事件分类"
+                      clearable
+                    />
+                  </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
+                      v-model="state.ruleForm.hotspotId"
+                      class="w100"
+                      :externalArr="state.hotspotExternal"
+                      @choose="chooseHotSpot"
+                      placeholder="请选择热点分类"
+                      clearable
+                    />
+                  </el-form-item>
+                </el-col>
+                <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+                  <el-form-item label="事发时间" prop="incidentTime" :rules="[{ required: false, message: '请选择事发时间', trigger: 'change' }]">
+                    <el-date-picker
+                      v-model="state.ruleForm.incidentTime"
+                      type="datetime"
+                      placeholder="请选择事发时间"
+                      value-format="YYYY-MM-DD[T]HH:mm:ss"
+                      class="w100"
+                    />
+                  </el-form-item>
+                </el-col>
+                <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+                  <el-form-item label="事件目的" prop="incidentPurpose" :rules="[{ required: false, message: '请填写事件目的', trigger: 'blur' }]">
+                    <el-input v-model="state.ruleForm.incidentPurpose" placeholder="请填写事件目的" clearable> </el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                  <el-row :gutter="0">
+                    <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+                      <el-form-item
+                        label="事发地址"
+                        prop="areaCode"
+                        :rules="[{ required: true, message: '请选择事发地址', trigger: 'change' }]"
+                        v-loading="addressLoading"
+                      >
+                        <el-cascader
+                          :options="state.areaOptions"
+                          filterable
+                          :props="{ value: 'id', label: 'areaName', emitPath: false, checkStrictly: true }"
+                          placeholder="请选择事发地址"
+                          class="w100"
+                          v-model="state.ruleForm.areaCode"
+                          ref="areaRef"
+                          @change="changeArea"
+                        >
+                        </el-cascader>
+                      </el-form-item>
+                    </el-col>
+                    <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+                      <el-form-item
+                        label=""
+                        prop="street"
+                        :rules="[{ required: false, message: '请填写详细地址', trigger: 'blur' }]"
+                        label-width="10px"
+                        class="w100 flex"
+                      >
+                        <el-col :xs="24" :sm="24" :md="24" :lg="16" :xl="16">
+                          <el-input v-model="state.ruleForm.street" placeholder="请填写详细地址" clearable> </el-input>
+                        </el-col>
+                        <el-col :xs="24" :sm="24" :md="24" :lg="7" :xl="7" :offset="1">
+                          <el-button type="primary" link @click="selectLocation"><SvgIcon name="ele-Location" size="16px" /> 地图定位</el-button>
+                        </el-col>
+                      </el-form-item>
+                    </el-col>
+                    <div v-if="showRepeatEvent" class="color-danger mb10" style="margin-left: 110px">
+                      【{{ state.ruleForm.address }}】下存在多起【{{ state.ruleForm.hotspotSpliceName }}】事件,点击前往查看或右侧添加重复性事件
+                      <el-button type="primary" link style="padding: 0 0 3px" @click="onRepeatEvent"> 查看详情</el-button>
+                    </div>
+                  </el-row>
+                </el-col>
+                <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                  <el-row>
+                    <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+                      <el-form-item label="是否重复" prop="isRepeat" :rules="[{ required: true, message: '请选择是否重复', trigger: 'change' }]">
+                        <el-select v-model="state.ruleForm.isRepeat" placeholder="请选择是否重复" class="w100" @change="isRepeatChange">
+                          <el-option v-for="item in state.repeatOptions" :key="item.key" :label="item.value" :value="item.key" />
+                        </el-select>
+                      </el-form-item>
+                    </el-col>
+                    <!-- 必填,若“是否重复”为“是”,则展示重复件选择框 -->
+                    <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="state.ruleForm.isRepeat === 'true'">
+                      <el-form-item
+                        label=""
+                        prop="duplicateTitle"
+                        label-width="10px"
+                        :rules="[{ required: true, message: '请选择重复件', trigger: 'change' }]"
+                      >
+                        <el-input v-model="state.ruleForm.duplicateTitle" placeholder="请选择重复件" readonly>
+                          <template #suffix>
+                            <el-button link type="danger" v-if="state.ruleForm.duplicateTitle" @click="clearRepeat" title="清除历史工单">
+                              <SvgIcon name="ele-Delete" size="16px" />
+                            </el-button>
+                            <el-button link type="primary" class="ml1" @click="selectRepeat" title="选择历史工单">
+                              <SvgIcon name="iconfont icon-tianjiatuozhanxinxi" size="18px" />
+                            </el-button>
+                          </template>
+                        </el-input>
+                      </el-form-item>
+                    </el-col>
+                  </el-row>
+                </el-col>
+                <!-- 宜宾特殊需求,可配置开关 -->
+                <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="AppConfigInfo.isTranspondCity">
+                  <el-row>
+                    <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+                      <el-form-item
+                        label="是否市州互转"
+                        prop="transpond"
+                        :rules="[{ required: true, message: '请选择是否市州互转', trigger: 'change' }]"
+                      >
+                        <el-select v-model="state.ruleForm.transpond" placeholder="请选择是否市州互转" class="w100" @change="changeTranspond">
+                          <el-option :key="true" label="是" :value="true" />
+                          <el-option :key="false" label="否" :value="false" />
+                        </el-select>
+                      </el-form-item>
+                    </el-col>
+                    <!-- 必填,若“是否市州互转”为“是”,则展示选择市州选择框 -->
+                    <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="state.ruleForm.transpond">
+                      <el-form-item
+                        label=""
+                        prop="transpondCityObj"
+                        label-width="10px"
+                        :rules="[{ required: true, message: '请选择互转市州', trigger: 'change' }]"
+                      >
+                        <el-select
+                          v-model="state.ruleForm.transpondCityObj"
+                          placeholder="请选择互转市州"
+                          class="w100"
+                          value-key="dicDataValue"
+                          @change="(val:any) => {
+                        state.ruleForm.transpondCityId = val.id;
+                        state.ruleForm.transpondCityValue = val.dicDataValue;
+                        state.ruleForm.transpondCityName = val.dicDataName;
+										}"
+                        >
+                          <el-option v-for="item in state.transpondCity" :key="item.dicDataValue" :label="item.dicDataName" :value="item" />
+                        </el-select>
+                      </el-form-item>
+                    </el-col>
+                  </el-row>
+                </el-col>
+                <!-- 宜宾特殊需求,可配置开关 -->
+                <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="AppConfigInfo.isOpenJudicialManagement">
+                  <el-form-item
+                    label="是否行政执法工单"
+                    label-width="140px"
+                    prop="isEnforcementOrder"
+                    :rules="[{ required: true, message: '请选择是否行政执法工单', trigger: 'change' }]"
+                  >
+                    <el-radio-group v-model="state.ruleForm.isEnforcementOrder">
+                      <el-radio :label="true">是</el-radio>
+                      <el-radio :label="false">否</el-radio>
+                    </el-radio-group>
+                  </el-form-item>
+                </el-col>
+                <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                  <el-form-item label="工单标题" prop="title" :rules="[{ required: true, message: '请填写工单标题', trigger: 'blur' }]">
+                    <el-input v-model="state.ruleForm.title" placeholder="请填写工单标题" clearable @input="inputTitle"> </el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                  <el-form-item label="受理内容" prop="content" :rules="[{ required: true, message: '请填写受理内容', trigger: 'blur' }]">
+                    <common-advice
+                      @chooseAdvice="chooseAdvice"
+                      v-model="state.ruleForm.content"
+                      placeholder="请填写受理内容"
+                      :loading="state.formLoading"
+                      :commonEnum="commonEnum.Seat"
+                      modal
+                    />
+                  </el-form-item>
+                </el-col>
+                <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                  <el-form-item label="附件" prop="files" :rules="[{ required: false, message: '请填写诉求内容', trigger: 'change' }]">
+                    <annex-list :businessId="state.orderId" classify="办理上传" v-model="state.ruleForm.files" v-model:format="filesFormat" />
+                  </el-form-item>
+                </el-col>
+                <el-col :xs="24" :sm="12" :md="24" :lg="24" :xl="24">
+                  <el-form-item>
+                    <el-button class="default-button" @click="onCancel"> 取消 </el-button>
+                    <el-button class="default-button" @click="save(ruleFormRef)" :loading="buttonLoading"> 保存 </el-button>
+                    <el-button type="primary" @click="submit(ruleFormRef)" :loading="buttonLoading" v-if="canHandle"> 办理 </el-button>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </el-form>
+          </el-card>
+        </el-scrollbar>
+      </el-col>
+      <!-- 右侧内容 -->
+      <el-col :span="6" class="right-content h100">
+        <el-scrollbar class="h100">
+          <el-card shadow="never">
+            <el-tabs v-model="rightActive" @tab-change="handleRight" stretch>
+              <el-tab-pane label="历史工单" name="history">
+                <history-order
+                  :ruleForm="state.ruleForm"
+                  :orderId="state.orderId"
+                  @handleSelectionChange="handleSelectionChange"
+                  ref="historyOrderRef"
+                />
+              </el-tab-pane>
+              <el-tab-pane label="重复性事件" name="repeat">
+                <repeat-event ref="repeatEventRef" @orderAddRepeat="orderAddRepeat" :repeatIds="state.ruleForm.repeatableEventDetails" />
+              </el-tab-pane>
+              <el-tab-pane label="知识库" name="knowledge">
+                <Knowledge ref="knowledgeRef" />
+              </el-tab-pane>
+            </el-tabs>
+          </el-card>
+          <el-card shadow="never">
+            <el-tabs v-model="rightBottomActive" @tab-change="handleRightBottom" stretch>
+              <el-tab-pane label="话术导航" name="navigation">
+                <script-navigation />
+              </el-tab-pane>
+              <el-tab-pane label="市民画像" name="draw">
+                <citizen-portrait :orderInfo="state.ruleForm" ref="citizenPortraitRef" />
+              </el-tab-pane>
+            </el-tabs>
+          </el-card>
+        </el-scrollbar>
+      </el-col>
+    </el-row>
+    <!-- 拓展表单 -->
+    <expand-form ref="ExpandFormRef" @saveExpandForm="saveExpandForm" :orderDetail="state.ruleForm" :extra="extra" />
+    <!-- 历史工单 -->
+    <order-history ref="HistoryOrderRef" @saveSelect="saveSelect" />
+    <!--  流程审批  -->
+    <process-audit ref="processAuditRef" @orderProcessSuccess="orderProcessSuccess" />
+    <!-- 地图选点 -->
+    <map-dialog ref="mapDialogRef" @confirm="selectMap" />
+    <!-- 企业搜索 -->
+    <company-search ref="companySearchRef" @selectCompany="selectCompany" />
+  </div>
+</template>
+
+<script setup lang="ts" name="orderAccept">
+import { computed, defineAsyncComponent, nextTick, onBeforeMount, onMounted, reactive, ref, watch } from 'vue';
+import type { FormInstance } from 'element-plus';
+import { ElMessage, ElMessageBox, ElNotification } from 'element-plus';
+import { storeToRefs } from 'pinia';
+import { useRoute, useRouter } from 'vue-router';
+import { useTelStatus } from '@/stores/telStatus';
+import { useAppConfig } from '@/stores/appConfig';
+import { throttle, transformFile } from '@/utils/tools';
+import { commonEnum } from '@/utils/constants';
+import { orderAdd, orderBaseDataAdd, orderBaseExt, orderDetail, orderEdit } from '@/api/business/order';
+import { useUserInfo } from '@/stores/userInfo';
+import { treeArea } from '@/api/auxiliary/area';
+import mittBus from '@/utils/mitt';
+import { orderRepeatEvent } from '@/api/business/repeatEvent';
+import { removeDuplicate } from '@/utils/arrayOperation';
+import App from '@/App.vue';
+
+// 引入组件
+const VoiceAssistant = defineAsyncComponent(() => import('@/views/todo/seats/accept/Voice-assistant.vue')); // 语音助手
+const Knowledge = defineAsyncComponent(() => import('@/views/todo/seats/accept/Knowledge.vue')); // 知识库
+const HistoryOrder = defineAsyncComponent(() => import('@/views/todo/seats/accept/History.vue')); // 历史工单
+const RepeatEvent = defineAsyncComponent(() => import('@/views/todo/seats/accept/Repeat-event.vue')); // 重复事件
+const CitizenPortrait = defineAsyncComponent(() => import('@/views/todo/seats/accept/Citizen-portrait.vue')); // 市民坏画像
+const ExpandForm = defineAsyncComponent(() => import('@/views/todo/seats/accept/Expand-form.vue')); // 拓展表单
+const OrderHistory = defineAsyncComponent(() => import('@/views/business/order/components/Order-history.vue')); // 历史工单弹窗列表
+const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
+const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue')); // 附件列表
+const ProcessAudit = defineAsyncComponent(() => import('@/components/ProcessAudit/index.vue')); // 流程审批
+const MapDialog = defineAsyncComponent(() => import('@/views/todo/seats/accept/Map-Dialog.vue')); // 地图定位
+const CompanySearch = defineAsyncComponent(() => import('@/views/todo/seats/accept/Company-search.vue')); // 企业搜索
+const HotSpotSelect = defineAsyncComponent(() => import('@/components/Hotspot/index.vue')); // 选择热点
+const RealTimeQuality = defineAsyncComponent(() => import('@/views/todo/seats/accept/Real-time-quality.vue')); // 实时质检
+const ScriptNavigation = defineAsyncComponent(() => import('@/views/todo/seats/accept/Script-navigation.vue')); // 话术导航
+const CallSummary = defineAsyncComponent(() => import('@/views/todo/seats/accept/Call-summary.vue')); // 呼叫小结
+// 定义变量内容
+const state = reactive<any>({
+  createBy: 'manual', // 工单创建方式 默认手动创建  tel:来电弹单  letter:互联网来信 默认表示手动创建
+  ruleForm: {
+    sourceChannel: null, // 来源频道
+    sourceChannelCode: null, //来源频道code
+    transferPhone: null, // 转接来源
+    fromPhone: null, // 来电号码
+    acceptorName: null, // 员工姓名
+    acceptorStaffNo: null, // 员工工号
+    fromName: null, // 来电人姓名
+    fromGender: 1, // 来电人性别 默认先生
+    identityType: 1, // 来电/信人身份 默认市民
+    licenceType: null, // 证件类型
+    licenceTypeCode: null, // 证件类型code
+    licenceNo: null, // 证件号码
+    ageRange: null, // 年龄段
+    ageRangeCode: null, // 年龄段code
+    contact: null, // 联系电话
+    isSecret: false, // 是否保密 默认false
+    acceptSms: false, // 是否接收短信 默认false
+    enterpriseName: null, // 企业名称
+    zhuanBanMingCheng: null, // 专班名称
+    no: null, // 工单编码
+    title: null, // 工单标题
+    acceptType: null, // 受理类型
+    acceptTypeCode: null, // 受理类型code
+    emergencyLevel: 1, // 紧急程度 默认一般
+    hotspotId: '', // 热点分类
+    eventCategoryId: '', // 事件分类
+    incidentTime: null, // 事发时间
+    incidentPurpose: null, // 事件目的
+    areaCode: '511500', // 区域编码
+    city: '宜宾市', // 市
+    street: null, // 街道
+    isRepeat: 'false', // 是否重复工单 默认否
+    pushType: null, // 推送类型
+    pushTypeCode: null, // 推送类型code
+    content: '', // 工单内容
+    duplicateIds: [], //重复工单id
+    duplicateTitle: null, // 重复工单标题
+    callAddress: null, // 来电归属地
+    repeatableEventDetails: [], //重复性事件
+    orderExtension: null, // 拓展信息
+    transpond: false, // 是否市州互转
+    isEnforcementOrder: false, // 是否行政执法工单
+  },
+  formLoading: false, // 表单加载状态
+  hotspotExternal: [], // 热点分类外部数据
+  eventCategoryExternal: [], // 事件分类外部数据
+  acceptTypeOptions: [], // 受理类型
+  channelOptions: [], // 来源频道
+  emergencyLevelOptions: [], // 紧急程度
+  genderOptions: [], // 性别
+  identityTypeOptions: [], //来电人身份
+  licenceTypeOptions: [], // 证件类型
+  ageRangeOptions: [], // 年龄段
+  pushTypeOptions: [], //推送分类
+  areaOptions: [], //省市区
+  transpondCity: [],
+  repeatOptions: [
+    //是否重复
+    {
+      value: '是',
+      key: 'true',
+    },
+    {
+      value: '否',
+      key: 'false',
+    },
+  ],
+  orderId: null, // 工单id
+  orgData: [],
+});
+const useTelStatusStore = useTelStatus(); // 来电弹屏
+const { telStatusInfo } = storeToRefs(useTelStatusStore); // 来电弹屏信息
+const storesUserInfo = useUserInfo(); // 用户信息
+const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
+const appConfigStore = useAppConfig();
+const { AppConfigInfo } = storeToRefs(appConfigStore); // 系统配置信息
+state.ruleForm.acceptorName = userInfos.value.name; // 员工姓名
+state.ruleForm.acceptorStaffNo = userInfos.value.staffNo; // 员工工号
+const route = useRoute(); // 路由
+const router = useRouter(); // 路由
+
+const voiceType = ref('全部');
+// 选择坐席还是市民通话内容
+const voiceAssistantRef = ref<RefType>();
+const changeVoiceType = () => {
+  voiceAssistantRef.value.filterMessage(voiceType.value);
+};
+const leftTopActive = ref('realtime');
+// 切换工单小结和实时质检
+const callSummaryRef = ref<RefType>();
+const handleLeftTop = (val: string) => {
+  if (val === 'summary') {
+    setTimeout(() => {
+      callSummaryRef.value.getRecognize();
+    }, 300);
+  }
+};
+
+// 选择企业
+const companySearchRef = ref<RefType>();
+const handleSelect = (item: Record<string, any>) => {
+  companySearchRef.value.openDialog();
+};
+// 选择企业
+const selectCompany = (row: any) => {
+  state.ruleForm.enterpriseName = row.enterpriseName;
+  state.ruleForm.enterpriseCode = row.enterpriseCode;
+  state.ruleForm.zhuanBanMingCheng = row.specialTeamName;
+  state.ruleForm.zhuanBanCode = row.specialTeamCode;
+};
+// 证件号码验证
+const licenceNoPattern = computed(() => {
+  switch (state.ruleForm.licenceTypeCode) {
+    case '10': // 身份证
+      return /^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/;
+    default: //默认只允许数字字母
+      return /^[A-Za-z0-9]+$/;
+  }
+});
+// 选择事件分类
+const chooseEvent = (val: any) => {
+  state.ruleForm.eventCategoryName = val?.eventName; // 事件分类名称
+  state.ruleForm.eventCategorySpliceName = val?.eventFullName; // 事件分类拼接名称
+  state.ruleForm.eventCategoryExternal = val?.externalArr?.join(',') ?? ''; // 事件分类id
+};
+// 选择热点分类
+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(',') ?? ''; // 热点分类默认展开项
+  rightActive.value = 'knowledge';
+  knowledgeRef.value.querySearch(state.ruleForm.hotspotName);
+};
+// 获取事发地址
+const areaRef = ref<RefType>();
+const changeArea = () => {
+  const currentNode = areaRef.value.getCheckedNodes();
+  // 判断数组长度
+  if (currentNode[0].pathLabels.length <= 4) {
+    state.ruleForm.city = currentNode[0].pathLabels[0] ?? ''; // 市
+    state.ruleForm.county = currentNode[0].pathLabels[1] ?? ''; // 区
+    state.ruleForm.town = currentNode[0].pathLabels[2] ?? ''; // 地区
+  } else {
+    // 如果数组长度大于4
+    state.ruleForm.city = currentNode[0].pathLabels[0] ?? ''; // 市
+    state.ruleForm.county = currentNode[0].pathLabels[1] ?? ''; // 区
+    state.ruleForm.town = currentNode[0].pathLabels[2] ?? ''; // 地区
+    state.ruleForm.areaText = currentNode[0].pathLabels.slice(3).join('') ?? ''; // 地区
+    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;
+  }
+});
+stopWatch();
+// 地图选点
+const mapDialogRef = ref<RefType>();
+const selectLocation = () => {
+  const location = {
+    longitude: state.ruleForm.longitude,
+    latitude: state.ruleForm.latitude,
+    adcode: state.ruleForm.areaCode,
+    formattedAddress: state.ruleForm.street,
+  };
+  mapDialogRef.value.openDialog(location);
+};
+// 地图选点
+const ruleFormRef = ref<RefType>();
+const selectMap = (location: any) => {
+  ruleFormRef.value.resetFields('areaCode');
+  state.ruleForm.longitude = location.longitude;
+  state.ruleForm.latitude = location.latitude;
+  state.ruleForm.areaCode = location.adcode;
+  state.ruleForm.street = location.formattedAddress;
+  state.ruleForm.address = location.formattedAddress;
+};
+// 将当前工单添加到重复性事件中
+const repeatableEventDetails = ref<EmptyArrayType>([]);
+const orderAddRepeat = (row: any) => {
+  if (route.params.id) {
+    //编辑
+    if (row.isDeleted) {
+      //如果是添加
+      repeatableEventDetails.value.push({
+        repeatableId: row.id,
+        isDeleted: false,
+      });
+      repeatableEventDetails.value = removeDuplicate([...repeatableEventDetails.value, ...state.ruleForm.repeatableEventDetails], 'repeatableId');
+    } else {
+      // 移除
+      repeatableEventDetails.value = removeDuplicate([...repeatableEventDetails.value, ...state.ruleForm.repeatableEventDetails], 'repeatableId');
+      repeatableEventDetails.value = repeatableEventDetails.value.map((item: any) => {
+        if (item.repeatableId === row.id) {
+          return {
+            ...item,
+            isDeleted: !item.isDeleted,
+          };
+        }
+        return item;
+      });
+    }
+  } else {
+    // 添加
+    if (row.isDeleted) {
+      //如果是添加
+      repeatableEventDetails.value.push({
+        repeatableId: row.id,
+      });
+      repeatableEventDetails.value = removeDuplicate(repeatableEventDetails.value, 'repeatableId');
+    } else {
+      // 移除
+      repeatableEventDetails.value = repeatableEventDetails.value.filter((item: any) => item.repeatableId !== row.id);
+    }
+  }
+};
+// 查看重复事件
+const onRepeatEvent = () => {
+  rightActive.value = 'repeat';
+};
+
+// 选择是否重复
+const isRepeatChange = (val: string) => {
+  if (val === 'false') clearRepeat();
+};
+// 清除重复件
+const clearRepeat = () => {
+  ElMessageBox.confirm(`确认要清除选择的重复工单?`, '提示', {
+    confirmButtonText: '确认',
+    cancelButtonText: '取消',
+    type: 'warning',
+    draggable: true,
+    cancelButtonClass: 'default-button',
+    autofocus: false,
+  })
+    .then(() => {
+      historyOrderRef.value.clearRepeat();
+      setTimeout(() => {
+        state.ruleForm.duplicateTitle = null;
+        state.ruleForm.duplicateIds = [];
+      }, 0);
+    })
+    .catch(() => {
+      state.ruleForm.isRepeat = 'true';
+    });
+};
+// 选择重复件
+const HistoryOrderRef = ref<RefType>();
+const selectRepeat = () => {
+  HistoryOrderRef.value.openDialog(state.ruleForm);
+};
+// 弹窗确定选择重复件
+const saveSelect = (row: any) => {
+  historyOrderRef.value.clearRepeat();
+  state.ruleForm.duplicateIds = row.map((item: any) => item.id);
+  state.ruleForm.duplicateTitle = '已选择';
+  historyOrderRef.value.dialogConfirmRepeat(row);
+  HistoryOrderRef.value.closeDialog();
+};
+// 选择是否市州互转
+const changeTranspond = (val: any) => {
+  if (!val) {
+    ElMessageBox.confirm(`确认要清除选择的互转市州?`, '提示', {
+      confirmButtonText: '确认',
+      cancelButtonText: '取消',
+      type: 'warning',
+      draggable: true,
+      cancelButtonClass: 'default-button',
+      autofocus: false,
+    })
+      .then(() => {
+        setTimeout(() => {
+          state.ruleForm.transpondCityValue = null;
+          state.ruleForm.transpondCityName = null;
+          state.ruleForm.transpondCityId = null;
+          state.ruleForm.transpondCityObj = null;
+        }, 0);
+      })
+      .catch(() => {
+        state.ruleForm.transpond = true;
+      });
+  }
+};
+// 右侧选择历史工单
+const handleSelectionChange = (row: any) => {
+  if (row && row.length) {
+    state.ruleForm.duplicateIds = row.map((item: any) => item.id);
+    state.ruleForm.duplicateTitle = '已选择';
+  } else {
+    state.ruleForm.duplicateIds = [];
+    state.ruleForm.duplicateTitle = null;
+  }
+};
+const historyOrderRef = ref<RefType>(); // 历史工单组件
+const citizenPortraitRef = ref<RefType>(); // 市民画像组件
+// 查询历史工单 和市民画像
+const searchHistory = () => {
+  historyOrderRef.value.searchHistory();
+  citizenPortraitRef.value.getCitizen();
+  rightBottomActive.value = 'draw';
+};
+// 填写来电人姓名时根据填写内容自动选择性别
+const inputName = (val: string) => {
+  if (val.includes('先生')) {
+    state.ruleForm.fromGender = 1;
+  } else if (val.includes('女士')) {
+    state.ruleForm.fromGender = 0;
+  }
+};
+// 填写标题时根据填写内容自动选择受理类型
+const inputTitle = (val: string) => {
+  if (!state.ruleForm.acceptType) {
+    const item = state.acceptTypeOptions.find((item: any) => item.dicDataName === val);
+    if (item) {
+      state.ruleForm.acceptTypeObj = item;
+      state.ruleForm.acceptType = item.dicDataName;
+      state.ruleForm.acceptTypeCode = item.dicDataValue;
+    }
+  }
+};
+const rightActive = ref<string>('history'); // 右侧顶部Tab
+const handleRight = (val: string) => {};
+const rightBottomActive = ref<string>('navigation'); // 右侧底部Tab
+const handleRightBottom = (val: string) => {};
+
+// 打开拓展表单
+const ExpandFormRef = ref<RefType>();
+const showExpandForm = () => {
+  ExpandFormRef.value.openDialog();
+};
+// 拓展表单保存
+const saveExpandForm = (val: any) => {
+  state.ruleForm.orderExtension = val;
+};
+// 删除不必要的属性
+const deleteUnnecessaryProperties = (obj: any) => {
+  const propertiesToDelete = ['ageRangeObj', 'pushTypeObj', 'licenceTypeObj', 'channel', 'acceptTypeObj', 'transpondCity'];
+  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) => {
+  if (!formEl) return;
+  formEl.validate((valid: boolean) => {
+    if (!valid) return;
+    buttonLoading.value = true;
+    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('操作成功');
+          mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
+          mittBus.emit('clearCache', 'order');
+          mittBus.emit('clearCache', 'callLog');
+          router.go(-1);
+        })
+        .catch(() => {
+          buttonLoading.value = false;
+        });
+    };
+    if (shouldOpenDialog(orderDetail)) {
+      ExpandFormRef.value.openDialog(true);
+    } else {
+      addOrderAndNavigate();
+    }
+  });
+}, 300);
+// 选择来点人身份如果是企业 推送分类自动选择助企纾困
+const selectIdentity = (val: number) => {
+  if (val === 2) {
+    state.ruleForm.pushTypeObj = state.pushTypeOptions.find((item: any) => item.dicDataValue === '8'); // 助企纾困
+    state.ruleForm.pushType = state.ruleForm.pushTypeObj.dicDataName;
+    state.ruleForm.pushTypeCode = state.ruleForm.pushTypeObj.dicDataValue;
+  }
+};
+// 是否可以办理(如果有流程id 并且当前账号可以办理 则可以办理 没有流程ID都可以办理)
+const canHandle = computed(() => {
+  if (!state.ruleForm?.workflowId) {
+    // 没有流程ID表示发起流程
+    return true;
+  } else {
+    // 有流程ID表示已经发起流程 判断当前账号是否可以办理
+    return state.ruleForm?.canHandle;
+  }
+});
+// 流程审批
+const processAuditRef = ref<RefType>();
+const processOrder = (orderDetail: any) => {
+  buttonLoading.value = false;
+  if (orderDetail.workflowId) {
+    // 如果已经有流程id 说明已经发起过流程 先更新工单数据  直接调用工单办理
+    orderEdit(orderDetail).then(() => {
+      const params = {
+        id: orderDetail.workflowId,
+        processType: '工单办理',
+        orderDetail,
+        extra: {
+          dialogTitle: '工单办理',
+          inputPlaceholder: '办理意见',
+          annexName: '办理附件',
+        },
+      };
+      processAuditRef.value.openDialog(params);
+    });
+  } else {
+    // 如果没有流程id 说明没有发起过流程  调用工单受理
+    const params = {
+      id: state.orderId,
+      processType: '工单受理',
+      extra: {
+        dialogTitle: '工单受理',
+        inputPlaceholder: '办理意见',
+        annexName: '办理附件',
+      },
+      orderDetail,
+    };
+    processAuditRef.value.openDialog(params);
+  }
+};
+const handleForm = (orderDetail: any) => {
+  if (orderDetail.orderExtension?.orderTypeCode) {
+    if (ExpandFormRef.value.state.validated) {
+      processOrder(orderDetail);
+    } else {
+      ExpandFormRef.value.openDialog(true);
+      buttonLoading.value = false;
+    }
+  } else {
+    processOrder(orderDetail);
+  }
+};
+// 提交
+const submit = throttle((formEl: FormInstance | undefined) => {
+  if (!formEl) return;
+  formEl.validate((valid: boolean) => {
+    if (!valid) return;
+    buttonLoading.value = true;
+    const orderDetail = {
+      ...state.ruleForm,
+      repeatableEventDetails: repeatableEventDetails.value,
+      files: filesFormat.value,
+    };
+    deleteUnnecessaryProperties(orderDetail);
+    handleForm(orderDetail);
+  });
+}, 300);
+// 选中常用意见
+const chooseAdvice = (item: any) => {
+  state.ruleForm.content += item.content;
+};
+// 流程提交成功
+const orderProcessSuccess = () => {
+  // 关闭当前 tagsView
+  mittBus.emit('onCurrentContextmenuClick', Object.assign({}, { contextMenuClickId: 1, ...route }));
+  mittBus.emit('clearCache', 'order');
+  router.go(-1);
+};
+// 取消
+const onCancel = () => {
+  orderProcessSuccess();
+};
+// 一建填单
+const orderOverwrite = (val: any) => {
+  if (val.id_card) {
+    // 身份证号
+    state.ruleForm.licenceTypeCode = '10';
+    state.ruleForm.licenceType = '身份证';
+    state.ruleForm.licenceNo = val.id_card;
+  }
+  state.ruleForm.fromName = val.name ? val.name : state.ruleForm.fromName; // 来电人姓名
+  state.ruleForm.street = val.address ? val.address : state.ruleForm.street; // 详细地址
+  state.ruleForm.enterpriseName = val.company_name ? val.company_name : state.ruleForm.enterpriseName; // 企业名称
+  state.ruleForm.incidentPurpose = val.event_purpose ? val.event_purpose : state.ruleForm.incidentPurpose; // 事件目的
+  state.ruleForm.title = val.record_title ? val.record_title : state.ruleForm.title; // 工单标题
+  state.ruleForm.content = val.appeal_detatls ? val.appeal_detatls : state.ruleForm.content; // 受理内容
+  ElNotification({
+    title: '提示',
+    message: '一键填单成功',
+    type: 'success',
+  });
+  console.log(val, '工单重写');
+};
+// 加载基础数据
+const loadBaseData = async () => {
+  state.formLoading = true;
+  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.ruleForm.seats = `${userInfos.value.name} [${userInfos.value.staffNo}]`;
+    state.formLoading = false;
+  } catch (error) {
+    state.formLoading = false;
+  } finally {
+    state.formLoading = false;
+  }
+};
+// 如果是修改加载表单内容
+const historyParams = history.state;
+const loadForm = async () => {
+  //  historyParams.createBy  createBy 代表来源  tel:来电弹单  letter:互联网来信 默认表示手动创建
+  if (historyParams.createBy) {
+    state.createBy = historyParams.createBy;
+    if (historyParams.createBy === 'tel') {
+      //通话
+      state.ruleForm.sourceChannel = '电话'; //电话
+      state.ruleForm.sourceChannelCode = 'RGDH'; //电话
+      state.ruleForm.fromPhone = historyParams.fromTel; // 来电号码
+      state.ruleForm.contact = historyParams.fromTel; // 联系电话
+      state.ruleForm.callId = historyParams.telGuid; // 通话id
+      state.ruleForm.transferPhone = historyParams.transfer; // 转接来源
+      state.ruleForm.callAddress = historyParams.telArea; // 来电归属地
+      state.ruleForm.channel = {
+        // 来源渠道
+        dicDataValue: state.ruleForm.sourceChannelCode,
+        dicDataName: state.ruleForm.sourceChannel,
+      };
+    }
+  }
+  if (route.params.id) {
+    // 如果 有id
+    state.orderId = route.params.id;
+    const response = await orderDetail(route.params.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';
+    }
+    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,
+    };
+  }
+};
+// 加载省市区
+const addressLoading = ref<boolean>(false);
+const loadAddress = async () => {
+  addressLoading.value = true;
+  try {
+    const area = await treeArea();
+    state.areaOptions = area.result ?? []; //省市区数据
+    addressLoading.value = false;
+  } catch (error) {
+    console.log(error);
+  } finally {
+    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;
+  }
+};
+onBeforeMount(() => {
+  loadBaseData();
+  loadForm();
+});
+onMounted(async () => {
+  await loadAddress();
+  await loadExtra();
+  await nextTick();
+});
+</script>

File diff suppressed because it is too large
+ 509 - 535
src/views/todo/seats/accept/index.vue


Some files were not shown because too many files changed in this diff