Эх сурвалжийг харах

feat:重复性事件对接完成;

zhangchong 1 жил өмнө
parent
commit
43f4a985b8

+ 9 - 1
src/App.vue

@@ -1,11 +1,12 @@
 <template>
 	<el-config-provider :size="getGlobalComponentSize" :locale="zhCn" :message="messageConfig" :button="buttonConfig">
-<!--    <el-watermark :content="['田爽', 'tianshuang']">
+<!--    <el-watermark :content="watermarkText">
     </el-watermark>-->
       <router-view v-show="setLockScreen" />
       <LockScreen v-if="themeConfig.isLockScreen" />
       <Setings ref="setingsRef" v-show="setLockScreen" />
       <CloseFull v-if="!themeConfig.isLockScreen" />
+
 	</el-config-provider>
 </template>
 
@@ -44,6 +45,13 @@ const setLockScreen = computed(() => {
 	return !themeConfig.value.isLockScreen;
 });
 
+// 设置锁屏时组件显示隐藏
+const watermarkText = computed(() => {
+  // 防止锁屏后,刷新出现不相关界面
+  // https://gitee.com/lyt-top/vue-next-admin/issues/I6AF8P
+  return themeConfig.value.watermarkText;
+});
+
 // 可同时显示的消息最大数量
 const messageConfig = reactive<any>({
 	max: 3,

+ 4 - 4
src/api/business/repeatEvent.ts

@@ -59,12 +59,12 @@ export const repeatEventDelete = (data: object) => {
 };
 /**
  * @description 重复性事件详情
- * @param {object} data
+ * @param {object} params
  */
-export const repeatEventDetail = (data: object) => {
+export const repeatEventDetail = (params: object) => {
     return request({
         url: `/api/v1/Order/repeatable_event`,
-        method: 'post',
-        data
+        method: 'get',
+        params
     });
 };

+ 4 - 1
src/layout/lockScreen/index.vue

@@ -27,7 +27,7 @@
 			<transition name="el-zoom-in-center">
 				<div v-show="state.isShowLoockLogin" class="layout-lock-screen-login">
 					<div class="layout-lock-screen-login-box">
-						<div class="layout-lock-screen-login-box-name">{{ themeConfig.watermarkText }}</div>
+						<div class="layout-lock-screen-login-box-name">{{ userInfos.name }}</div>
 						<div class="layout-lock-screen-login-box-value">
 							<el-input
 								placeholder="请输入密码"
@@ -63,6 +63,7 @@ import { formatDate } from '/@/utils/formatTime';
 import { Local, Session,Cookie } from '/@/utils/storage';
 import { storeToRefs } from 'pinia';
 import { useThemeConfig } from '/@/stores/themeConfig';
+import {useUserInfo} from '/@/stores/userInfo';
 import { ElMessage, ElMessageBox } from 'element-plus';
 // 定义接口来定义对象的类型
 interface LockScreenState {
@@ -87,6 +88,8 @@ interface LockScreenState {
 const layoutLockScreenInputRef = ref<RefType>();
 const storesThemeConfig = useThemeConfig();
 const { themeConfig } = storeToRefs(storesThemeConfig);
+const storesUserInfo = useUserInfo();
+const {userInfos} = storeToRefs(storesUserInfo);
 const state = reactive<LockScreenState>({
 	transparency: 1,
 	downClientY: 0,

+ 1 - 1
src/stores/themeConfig.ts

@@ -97,7 +97,7 @@ export const useThemeConfig = defineStore('themeConfig', {
 			// 是否开启水印
 			isWatermark: true,
 			// 水印文案
-			watermarkText: Cookie.get('userName') ?? '',
+			watermarkText:[],
 
 			/**
 			 * 其它设置

+ 1 - 1
src/types/pinia.d.ts

@@ -80,7 +80,7 @@ declare interface ThemeConfigState {
 	isInvert: boolean;
 	isIsDark: boolean;
 	isWatermark: boolean;
-	watermarkText: string;
+	watermarkText: string|object|string[];
 	tagsStyle: string;
 	animation: string;
 	columnsAsideStyle: string;

+ 239 - 201
src/views/business/order/accept/Repeat-event.vue

@@ -26,14 +26,16 @@
 			</el-form-item>
 		</el-form>
 		<div class="mb10">
-			<el-button type="primary" @click="onCreate" v-auth="'business:repeatEvent:add'">
+			<el-button type="primary" @click="onCreate" v-auth="'business:repeatEvent:add'" :loading="state.loading">
 				<SvgIcon name="ele-Plus" class="mr5" />创建重复事件
 			</el-button>
 		</div>
-		<el-table :data="state.tableData" v-loading="state.loading" max-height="300">
+		<el-table :data="tableData" v-loading="state.loading" max-height="300">
 			<el-table-column label="操作" width="80" fixed="left" align="center">
 				<template #default="{ row }">
-					<el-button @click="onAdd(row)" link type="primary"> 添加 </el-button>
+					<el-button @click="onAdd(row)" link type="primary" :title="`将当前工单${row.isDeleted ? '移除' : '添加'}重复性事件`">
+						{{ row.isDeleted ? '移除' : '添加' }}
+					</el-button>
 				</template>
 			</el-table-column>
 			<el-table-column prop="phoneNo" label="标题" show-overflow-tooltip width="180">
@@ -44,20 +46,20 @@
 			<el-table-column prop="keyWords" label="关键词" show-overflow-tooltip> </el-table-column>
 			<el-table-column label="创建时间" show-overflow-tooltip width="170">
 				<template #default="{ row }">
-          {{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
-        </template>
+					{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
+				</template>
 			</el-table-column>
 			<el-table-column prop="creatorName" label="创建人" show-overflow-tooltip></el-table-column>
 			<el-table-column prop="statusText" label="事件工单数" width="100" fixed="right" align="center">
-        <template #default="{ row }">
-          {{ row.details?.length }}
-        </template>
-      </el-table-column>
+				<template #default="{ row }">
+					{{ row.details?.length }}
+				</template>
+			</el-table-column>
 		</el-table>
 		<pagination :total="state.total" v-model:page="state.queryParams.PageIndex" v-model:limit="state.queryParams.PageSize" @pagination="queryList" />
-    <!--  添加重复性事件  -->
+		<!--  添加重复性事件  -->
 		<el-dialog v-model="state.dialogVisible" width="50%" draggable title="新增重复性事件" @close="close" append-to-body destroy-on-close>
-			<el-form :model="state.ruleForm" label-width="80px" ref="ruleFormRef">
+			<el-form :model="state.ruleForm" label-width="80px" ref="ruleFormRef" @submit.native.prevent>
 				<el-row :gutter="10">
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-form-item label="标题" prop="title" :rules="[{ required: true, message: '请输入标题', trigger: 'blur' }]">
@@ -65,9 +67,9 @@
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="关键词" prop="keyWords" :rules="[{ required: false, message: '请输入关键词', trigger: 'change' }]">
+						<el-form-item label="关键词" prop="dynamicTags" :rules="[{ required: true, message: '请添加关键词', trigger: 'blur' }]">
 							<el-tag
-								v-for="tag in dynamicTags"
+								v-for="tag in state.ruleForm.dynamicTags"
 								:key="tag"
 								class="mr10 mb10"
 								size="large"
@@ -85,6 +87,7 @@
 								@blur="handleInputConfirm"
 								style="max-width: 200px"
 								class="mb10"
+                placeholder="关键词内容"
 							/>
 							<el-button v-else @click="showInput" class="mb10"> 添加关键词 </el-button>
 						</el-form-item>
@@ -96,120 +99,114 @@
 				<el-button type="primary" @click="onAddRepeatTable">添加 </el-button>
 				<el-button type="primary" @click="onRemoveRepeatTable" :disabled="!multipleSelection.length">移除 </el-button>
 			</div>
-			<el-table
-				:data="state.repeatTable"
-				v-loading="state.loading"
-				row-key="id"
-				@selection-change="handleSelectionChange"
-				ref="multipleTableRef"
-			>
+			<el-table :data="state.repeatTable" v-loading="state.loading" row-key="id" @selection-change="handleSelectionChange" ref="multipleTableRef">
 				<el-table-column type="selection" label="" width="55" :reserve-selection="true" />
-        <el-table-column prop="no" label="工单编码" show-overflow-tooltip width="150"></el-table-column>
-        <el-table-column width="100" label="省/市工单" prop="isProvince">
-          <template #default="{ row }">
-            <span>{{ row.isProvince ? '省工单' : '市工单' }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="currentStepName" label="当前办理节点" show-overflow-tooltip width="150"></el-table-column>
-        <el-table-column label="工单状态" show-overflow-tooltip width="100" prop="statusText"></el-table-column>
-        <el-table-column label="标题" show-overflow-tooltip width="300">
-          <template #default="{ row }">
-            <span class="color-primary">{{ row.title }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="startTime" label="受理时间" show-overflow-tooltip width="170">
-          <template #default="{ row }">
-            <span>{{ formatDate(row.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="expiredTime" label="工单期满时间" show-overflow-tooltip width="170">
-          <template #default="{ row }">
-            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="actualHandleOrgName" label="接办部门" show-overflow-tooltip width="170"></el-table-column>
-        <el-table-column prop="acceptType" label="受理类型" show-overflow-tooltip width="150"></el-table-column>
-        <el-table-column label="紧急程度" show-overflow-tooltip prop="emergencyLevelText" width="100"></el-table-column>
-        <el-table-column prop="sourceChannel" label="来源方式" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="120">
-          <template #default="{ row }">
+				<el-table-column prop="no" label="工单编码" show-overflow-tooltip width="150"></el-table-column>
+				<el-table-column width="100" label="省/市工单" prop="isProvince">
+					<template #default="{ row }">
+						<span>{{ row.isProvince ? '省工单' : '市工单' }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column prop="currentStepName" label="当前办理节点" show-overflow-tooltip width="150"></el-table-column>
+				<el-table-column label="工单状态" show-overflow-tooltip width="100" prop="statusText"></el-table-column>
+				<el-table-column label="标题" show-overflow-tooltip width="300">
+					<template #default="{ row }">
+						<span class="color-primary">{{ row.title }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column prop="startTime" label="受理时间" show-overflow-tooltip width="170">
+					<template #default="{ row }">
+						<span>{{ formatDate(row.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column prop="expiredTime" label="工单期满时间" show-overflow-tooltip width="170">
+					<template #default="{ row }">
+						<span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column prop="actualHandleOrgName" label="接办部门" show-overflow-tooltip width="170"></el-table-column>
+				<el-table-column prop="acceptType" label="受理类型" show-overflow-tooltip width="150"></el-table-column>
+				<el-table-column label="紧急程度" show-overflow-tooltip prop="emergencyLevelText" width="100"></el-table-column>
+				<el-table-column prop="sourceChannel" label="来源方式" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="120">
+					<template #default="{ row }">
 						<span
-            >{{ row.acceptorName }} <span v-if="row.acceptorStaffNo">[{{ row.acceptorStaffNo }}]</span>
+							>{{ row.acceptorName }} <span v-if="row.acceptorStaffNo">[{{ row.acceptorStaffNo }}]</span>
 						</span>
-          </template>
-        </el-table-column>
+					</template>
+				</el-table-column>
 			</el-table>
 
-      <!--   从所有工单重选择重复   -->
-      <el-dialog v-model="state.dialogVisibleAllTable" width="50%" draggable title="选择重复事件工单" append-to-body destroy-on-close>
-        <el-form :model="state.queryParamsAll" ref="queryParamsAllRef" :inline="true" @submit.native.prevent>
-          <el-form-item label="关键词" prop="Keyword">
-            <el-input v-model="state.queryParamsAll.Keyword" placeholder="工单标题/工单编码" clearable @keyup.enter="queryListAll" />
-          </el-form-item>
-          <el-form-item>
-            <el-button type="primary" @click="queryListAll" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
-            <el-button @click="resetQueryAll(queryParamsAllRef)" :loading="state.loading" class="default-button">
-              <SvgIcon name="ele-Refresh" class="mr5" />重置
-            </el-button>
-          </el-form-item>
-        </el-form>
-        <el-table
-            :data="state.allTable"
-            v-loading="state.loading"
-            row-key="id"
-            @selection-change="handleSelectionChangeAll"
-            ref="multipleTableAllRef"
-        >
-          <el-table-column type="selection" label="" width="55" :reserve-selection="true" />
-          <el-table-column prop="no" label="工单编码" show-overflow-tooltip width="150"></el-table-column>
-          <el-table-column width="100" label="省/市工单" prop="isProvince">
-            <template #default="{ row }">
-              <span>{{ row.isProvince ? '省工单' : '市工单' }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column prop="currentStepName" label="当前办理节点" show-overflow-tooltip width="150"></el-table-column>
-          <el-table-column label="工单状态" show-overflow-tooltip width="100" prop="statusText"></el-table-column>
-          <el-table-column label="标题" show-overflow-tooltip width="300">
-            <template #default="{ row }">
-              <span class="color-primary">{{ row.title }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column prop="startTime" label="受理时间" show-overflow-tooltip width="170">
-            <template #default="{ row }">
-              <span>{{ formatDate(row.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column prop="expiredTime" label="工单期满时间" show-overflow-tooltip width="170">
-            <template #default="{ row }">
-              <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column prop="actualHandleOrgName" label="接办部门" show-overflow-tooltip width="170"></el-table-column>
-          <el-table-column prop="acceptType" label="受理类型" show-overflow-tooltip width="150"></el-table-column>
-          <el-table-column label="紧急程度" show-overflow-tooltip prop="emergencyLevelText" width="100"></el-table-column>
-          <el-table-column prop="sourceChannel" label="来源方式" show-overflow-tooltip></el-table-column>
-          <el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="120">
-            <template #default="{ row }">
-						<span
-            >{{ row.acceptorName }} <span v-if="row.acceptorStaffNo">[{{ row.acceptorStaffNo }}]</span>
-						</span>
-            </template>
-          </el-table-column>
-        </el-table>
-        <!-- 分页 -->
-        <pagination
-            :total="state.totalAll"
-            v-model:page="state.queryParamsAll.PageIndex"
-            v-model:limit="state.queryParamsAll.PageSize"
-            @pagination="queryListAll"
-        />
-        <template #footer>
-				<span class="dialog-footer">
-					<el-button @click="state.dialogVisibleAllTable = false" class="default-button">取 消</el-button>
-					<el-button type="primary" @click="onSubmitAll" :loading="state.loading" :disabled="!multipleSelectionAll.length">确 定</el-button>
-				</span>
-        </template>
-      </el-dialog>
+			<!--   从所有工单重选择重复   -->
+			<el-dialog v-model="state.dialogVisibleAllTable" width="50%" draggable title="选择重复事件工单" append-to-body destroy-on-close>
+				<el-form :model="state.queryParamsAll" ref="queryParamsAllRef" :inline="true" @submit.native.prevent>
+					<el-form-item label="关键词" prop="Keyword">
+						<el-input v-model="state.queryParamsAll.Keyword" placeholder="工单标题/工单编码" clearable @keyup.enter="queryListAll" />
+					</el-form-item>
+					<el-form-item>
+						<el-button type="primary" @click="queryListAll" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+						<el-button @click="resetQueryAll(queryParamsAllRef)" :loading="state.loading" class="default-button">
+							<SvgIcon name="ele-Refresh" class="mr5" />重置
+						</el-button>
+					</el-form-item>
+				</el-form>
+				<el-table
+					:data="state.allTable"
+					v-loading="state.loading"
+					row-key="id"
+					@selection-change="handleSelectionChangeAll"
+					ref="multipleTableAllRef"
+				>
+					<el-table-column type="selection" label="" width="55" :reserve-selection="true" />
+					<el-table-column prop="no" label="工单编码" show-overflow-tooltip width="150"></el-table-column>
+					<el-table-column width="100" label="省/市工单" prop="isProvince">
+						<template #default="{ row }">
+							<span>{{ row.isProvince ? '省工单' : '市工单' }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column prop="currentStepName" label="当前办理节点" show-overflow-tooltip width="150"></el-table-column>
+					<el-table-column label="工单状态" show-overflow-tooltip width="100" prop="statusText"></el-table-column>
+					<el-table-column label="标题" show-overflow-tooltip width="300">
+						<template #default="{ row }">
+							<span class="color-primary">{{ row.title }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column prop="startTime" label="受理时间" show-overflow-tooltip width="170">
+						<template #default="{ row }">
+							<span>{{ formatDate(row.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column prop="expiredTime" label="工单期满时间" show-overflow-tooltip width="170">
+						<template #default="{ row }">
+							<span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column prop="actualHandleOrgName" label="接办部门" show-overflow-tooltip width="170"></el-table-column>
+					<el-table-column prop="acceptType" label="受理类型" show-overflow-tooltip width="150"></el-table-column>
+					<el-table-column label="紧急程度" show-overflow-tooltip prop="emergencyLevelText" width="100"></el-table-column>
+					<el-table-column prop="sourceChannel" label="来源方式" show-overflow-tooltip></el-table-column>
+					<el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="120">
+						<template #default="{ row }">
+							<span
+								>{{ row.acceptorName }} <span v-if="row.acceptorStaffNo">[{{ row.acceptorStaffNo }}]</span>
+							</span>
+						</template>
+					</el-table-column>
+				</el-table>
+				<!-- 分页 -->
+				<pagination
+					:total="state.totalAll"
+					v-model:page="state.queryParamsAll.PageIndex"
+					v-model:limit="state.queryParamsAll.PageSize"
+					@pagination="queryListAll"
+				/>
+				<template #footer>
+					<span class="dialog-footer">
+						<el-button @click="state.dialogVisibleAllTable = false" class="default-button">取 消</el-button>
+						<el-button type="primary" @click="onSubmitAll" :loading="state.loading" :disabled="!multipleSelectionAll.length">确 定</el-button>
+					</span>
+				</template>
+			</el-dialog>
 			<template #footer>
 				<span class="dialog-footer">
 					<el-button @click="state.dialogVisible = false" class="default-button">取 消</el-button>
@@ -220,16 +217,24 @@
 	</div>
 </template>
 <script setup lang="ts" name="orderAcceptRepeatEvent">
-import { nextTick, reactive, ref } from 'vue';
-import {ElButton, ElInput, ElMessage, ElMessageBox, FormInstance} from 'element-plus';
+import {nextTick, onMounted, reactive, ref, watch, watchEffect} from 'vue';
+import { ElButton, ElInput, ElMessage, ElMessageBox, FormInstance } from 'element-plus';
 import { shortcuts } from '/@/utils/constants';
 import { throttle } from '/@/utils/tools';
 import dayjs from 'dayjs';
-import {repeatEventAdd, repeatEventList} from '/@/api/business/repeatEvent';
+import { repeatEventAdd, repeatEventList } from '/@/api/business/repeatEvent';
 import { auth } from '/@/utils/authFunction';
-import {formatDate} from "/@/utils/formatTime";
-import {orderList} from "/@/api/business/order";
-import {removeDuplicate} from "/@/utils/arrayOperation";
+import { formatDate } from '/@/utils/formatTime';
+import { orderList } from '/@/api/business/order';
+import { removeDuplicate } from '/@/utils/arrayOperation';
+import other from "/@/utils/other";
+const emit = defineEmits(['orderAddRepeat']);
+const props = defineProps({
+  repeatIds: {
+    type: Array,
+    default: () => [],
+  },
+})
 const state = reactive<any>({
 	queryParams: {
 		// 查询条件
@@ -240,29 +245,30 @@ const state = reactive<any>({
 		CreationTimeEnd: dayjs().endOf('day').format('YYYY-MM-DD[T]HH:mm:ss'), // 创建时间 结束
 		exTime: [dayjs().startOf('day').format('YYYY-MM-DD[T]HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD[T]HH:mm:ss')], // 创建时间
 	},
-	tableData: [], //表格
 	loading: false, // 加载
 	total: 0, // 总数
 	dialogVisible: false, // 弹窗
-	ruleForm: {},
-  repeatTable: [], // 重复事件工单
-  dialogVisibleAllTable:false, // 全部工单 重复事件工单弹窗
-  allTable: [], // 全部工单
-  totalAll:0,
-  queryParamsAll:{
-    PageIndex: 1,
-    PageSize: 10,
-    Keyword: '', // 关键字
-  }
+	ruleForm: {
+    dynamicTags:<EmptyArrayType>[]
+  },
+	repeatTable: [], // 重复事件工单
+	dialogVisibleAllTable: false, // 全部工单 重复事件工单弹窗
+	allTable: [], // 全部工单
+	totalAll: 0,
+	queryParamsAll: {
+		PageIndex: 1,
+		PageSize: 10,
+		Keyword: '', // 关键字
+	},
 });
+const tableData = ref<EmptyArrayType>([]);
 
 const inputValue = ref('');
-const dynamicTags = ref<EmptyArrayType>([]);
 const inputVisible = ref(false);
 const InputRef = ref<InstanceType<typeof ElInput>>();
 // 删除同义词
 const handleClose = (tag: string) => {
-	dynamicTags.value.splice(dynamicTags.value.indexOf(tag), 1);
+	state.ruleForm.dynamicTags.splice(state.ruleForm.dynamicTags.indexOf(tag), 1);
 };
 // 展示输入框
 const showInput = () => {
@@ -274,7 +280,7 @@ const showInput = () => {
 // 确定添加
 const handleInputConfirm = () => {
 	if (inputValue.value) {
-		dynamicTags.value.push(inputValue.value);
+    state.ruleForm.dynamicTags.push(inputValue.value);
 	}
 	inputVisible.value = false;
 	inputValue.value = '';
@@ -316,7 +322,7 @@ const queryList = () => {
 		repeatEventList(request)
 			.then((res: any) => {
 				state.loading = false;
-				state.tableData = res.result.items ?? [];
+        tableData.value = res.result.items ?? [];
 				state.total = res.result.total ?? 0;
 			})
 			.finally(() => {
@@ -324,96 +330,115 @@ const queryList = () => {
 			});
 	}
 };
-// 添加
-const onAdd = () => {};
+// 工单数据添加重复工单
+const onAdd = (row: any) => {
+	row.isDeleted = !row.isDeleted;
+	emit('orderAddRepeat', row);
+};
 // 创建重复事件
 const onCreate = () => {
 	state.dialogVisible = true;
 };
 // 打开所有工单列表选择重复工单
-const onAddRepeatTable = ()=>{
-  queryListAll();
-  state.dialogVisibleAllTable = true;
-}
+const onAddRepeatTable = () => {
+	queryListAll();
+	state.dialogVisibleAllTable = true;
+};
 // 获取所有工单列表
-const queryListAll = async ()=>{
-  try {
-    const res = await orderList(state.queryParamsAll);
-    state.allTable = res.result.items ?? [];
-    state.totalAll = res.result.total ?? 0;
-  }catch (e) {
-    console.log(e)
-  }
-}
+const queryListAll = async () => {
+	try {
+		state.loading = true;
+		const res = await orderList(state.queryParamsAll);
+		state.allTable = res.result.items ?? [];
+		state.totalAll = res.result.total ?? 0;
+		state.loading = false;
+	} catch (e) {
+		console.log(e);
+		state.loading = false;
+	}
+};
 // 重置所有工单列表
 const queryParamsAllRef = ref<RefType>();
 const resetQueryAll = (formEl: FormInstance | undefined) => {
-  if (!formEl) return;
-  formEl.resetFields();
-  queryListAll();
+	if (!formEl) return;
+	formEl.resetFields();
+	queryListAll();
 };
 const multipleSelection = ref<EmptyArrayType>([]); // 重复件表格选中项
 const multipleTableRef = ref<RefType>(); // 重复件表格ref
-const handleSelectionChange = (row:any)=>{
-  multipleSelection.value = row;
-}
+const handleSelectionChange = (row: any) => {
+	multipleSelection.value = row;
+};
 const multipleSelectionAll = ref<EmptyArrayType>([]); // 所有工单表格选中项
 const multipleTableAllRef = ref<RefType>(); // 所有工单表格ref
-const handleSelectionChangeAll = (row:any)=>{
-  multipleSelectionAll.value = row;
-}
+const handleSelectionChangeAll = (row: any) => {
+	multipleSelectionAll.value = row;
+};
 // 确定选择所有工单到重复工单
-const onSubmitAll = ()=>{
-  state.dialogVisibleAllTable = false;
-  state.repeatTable = removeDuplicate([...state.repeatTable,...multipleSelectionAll.value], 'id'); // 添加时去重
-  multipleSelectionAll.value = [];
-}
+const onSubmitAll = () => {
+	state.dialogVisibleAllTable = false;
+	state.repeatTable = removeDuplicate([...state.repeatTable, ...multipleSelectionAll.value], 'id'); // 添加时去重
+	multipleSelectionAll.value = [];
+	multipleTableAllRef.value!.clearSelection();
+};
 // 删除重复工单
-const onRemoveRepeatTable = ()=>{
-  const title = multipleSelection.value.map((item: any) => item.title);
-  ElMessageBox.confirm(`您确定要删除:【${title}】,是否继续?`, '提示', {
-    confirmButtonText: '确认',
-    cancelButtonText: '取消',
-    type: 'warning',
-    draggable: true,
-    cancelButtonClass: 'default-button',
-    autofocus: false,
-  })
-      .then(() => {
-        state.repeatTable = state.repeatTable.filter((item:any)=>{
-          return !multipleSelection.value.includes(item)
-        })
-      })
-      .catch(() => {});
-}
+const onRemoveRepeatTable = () => {
+	const title = multipleSelection.value.map((item: any) => item.title);
+	ElMessageBox.confirm(`您确定要删除:【${title}】,是否继续?`, '提示', {
+		confirmButtonText: '确认',
+		cancelButtonText: '取消',
+		type: 'warning',
+		draggable: true,
+		cancelButtonClass: 'default-button',
+		autofocus: false,
+	})
+		.then(() => {
+			multipleSelection.value.forEach((item1: any) => {
+				state.repeatTable.forEach((item: any, index: number) => {
+					if (item.id === item1.id) {
+						multipleTableRef.value!.toggleRowSelection(item, undefined);
+						state.repeatTable.splice(index, 1);
+					}
+				});
+			});
+		})
+		.catch(() => {});
+};
 const ruleFormRef = ref<RefType>();
 const close = () => {
 	ruleFormRef.value.clearValidate();
 	ruleFormRef.value.resetFields();
+	state.repeatTable = [];
+	multipleSelection.value = [];
 };
+// 创建重复性事件保存
 const onSubmit = throttle(async (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	await formEl.validate((valid: boolean) => {
 		if (!valid) return;
+    if(state.repeatTable.length === 0){
+      ElMessage.warning('请选择重复事件工单!');
+      return;
+    }
 		state.loading = true;
-    const details = state.repeatTable.map((item:any)=>{
-      return {
-        orderNo: item.no,
-        orderId: item.id,
-      }
-    })
+		const details = state.repeatTable.map((item: any) => {
+			return {
+				orderNo: item.no,
+				orderId: item.id,
+			};
+		});
 		const request = {
 			...state.ruleForm,
-      keyWords: dynamicTags.value.join(','),
-      details
+			keyWords: state.ruleForm.dynamicTags.join(','),
+			details,
 		};
-    repeatEventAdd(request)
+		repeatEventAdd(request)
 			.then(() => {
 				ElMessage({
 					message: '操作成功',
 					type: 'success',
 				});
-        queryList();
+				queryList();
 				state.dialogVisible = false;
 			})
 			.catch((error) => {})
@@ -423,8 +448,21 @@ const onSubmit = throttle(async (formEl: FormInstance | undefined) => {
 			});
 	});
 }, 300);
-defineExpose({
-  queryList,
+onMounted(()=>{
+  queryList();
 })
+const stopWatch = watch(()=>props.repeatIds,(newVal:any)=>{
+  tableData.value.forEach((item:any)=>{
+    newVal.forEach((_:any)=>{
+      if(_.repeatableId === item.id){
+        item.isDeleted = true;// 检测是否已经添加了重复事件
+        stopWatch(); //数据完成之后停止监听
+      }
+    })
+  })
+})
+defineExpose({
+	queryList,
+});
 </script>
 <style scoped lang="scss"></style>

+ 39 - 5
src/views/business/order/accept/index.vue

@@ -463,7 +463,7 @@
 								</el-tabs>
 							</el-tab-pane>
 							<el-tab-pane label="重复性事件" name="repeat">
-								<repeat-event ref="repeatEventRef"/>
+								<repeat-event ref="repeatEventRef" @orderAddRepeat="orderAddRepeat" :repeatIds="state.ruleForm.repeatableEventDetails"/>
 							</el-tab-pane>
 							<el-tab-pane label="历史工单" name="history">
 								<history-order
@@ -489,7 +489,7 @@
 			</el-col>
 		</el-row>
 		<!-- 拓展表单 -->
-		<order-expand-form ref="ExpandFormRef" @saveExpandForm="saveExpandForm" :orderDetail="orderDetailInfo" :extra="extra" />
+		<order-expand-form ref="ExpandFormRef" @saveExpandForm="saveExpandForm" :orderDetail="state.ruleForm" :extra="extra" />
 		<!-- 历史工单 -->
 		<order-history ref="HistoryOrderRef" @saveSelect="saveSelect" />
 		<!--  流程审批  -->
@@ -515,6 +515,7 @@ 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";
 
 // 引入组件
 const Knowledge = defineAsyncComponent(() => import('/@/views/business/order/accept/Knowledge.vue')); // 知识库
@@ -569,6 +570,7 @@ const state = reactive<any>({
 		duplicateIds: [], //重复工单id
 		duplicateTitle: '', // 重复工单标题
 		callAddress: '', // 来电归属地
+    repeatableEventDetails:[],//重复性事件
 	},
 	formLoading: false, // 表单加载状态
 	hotspotExternal: [], // 热点分类外部数据
@@ -706,6 +708,39 @@ const selectMap = (location: any) => {
 	state.ruleForm.street = location.formattedAddress;
   searchRepeatEvent(state.ruleForm.hotspotSpliceName,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';
@@ -809,6 +844,7 @@ const save = throttle((formEl: FormInstance | undefined) => {
 		let orderDetail = {
 			...state.ruleForm,
 			hotspotExternal: state.hotspotExternal.join(','),
+      repeatableEventDetails:repeatableEventDetails.value,
 			files: annexListRef.value?.fileList,
 		};
 		deleteUnnecessaryProperties(orderDetail);
@@ -869,10 +905,10 @@ const submit = throttle((formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	formEl.validate((valid: boolean) => {
 		if (!valid) return;
-		console.log(state.hotspotExternal);
 		let orderDetail = {
 			...state.ruleForm,
 			hotspotExternal: state.hotspotExternal.join(','),
+      repeatableEventDetails:repeatableEventDetails.value,
 		};
 		deleteUnnecessaryProperties(orderDetail);
 		handleForm(orderDetail);
@@ -897,7 +933,6 @@ const extra = ref<any>({
 	ext: {},
 	area: {},
 });
-const orderDetailInfo = ref({});
 onBeforeMount(async () => {
 	state.formLoading = true;
 	try {
@@ -939,7 +974,6 @@ onBeforeMount(async () => {
 			const response = await orderDetail(route.params.id);
 			// 如果获取到id 调用查询详情
 			state.ruleForm = response.result;
-			orderDetailInfo.value = response.result;
 			if (response.result.duplicateIds && response.result.duplicateIds.length) {
 				// 是否重复
 				state.ruleForm.isRepeat = 'true';

+ 1 - 1
src/views/business/publish/component/Order-publish-edit.vue

@@ -87,7 +87,7 @@
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-form-item label="实际办理部门">
-							{{ state.publishDetail.actualHandleOrgName?.name ?? '' }}
+              <el-checkbox :label="state.publishDetail.actualHandleOrgName">{{ state.publishDetail.actualHandleOrgName?.value }}</el-checkbox>
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">

+ 1 - 1
src/views/business/publish/component/Order-publish.vue

@@ -90,7 +90,7 @@
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-form-item label="实际办理部门">
-              <el-checkbox :label="state.publishDetail.actualHandleOrgName">{{ state.publishDetail.actualHandleOrgName?.name }}</el-checkbox>
+              <el-checkbox :label="state.publishDetail.actualHandleOrgName">{{ state.publishDetail.actualHandleOrgName?.value }}</el-checkbox>
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">

+ 3 - 3
src/views/business/publish/index.vue

@@ -70,11 +70,11 @@
 						<span>{{ row.publishState ? '公开' : '不公开' }}</span>
 					</template>
 				</el-table-column>
-				<el-table-column label="操作" width="180" fixed="right" align="center">
+				<el-table-column label="操作" width="140" fixed="right" align="center">
 					<template #default="{ row }">
-						<el-button link type="primary" @click="editPublish(row)" title="修改发布" v-auth="'business:publish:edit'"> 修改 </el-button>
+						<el-button link type="primary" @click="editPublish(row)" title="编辑发布" v-auth="'business:publish:edit'"> 编辑发布 </el-button>
 						<el-button link type="primary" @click="OnOrderRedo(row)" title="重办工单" v-auth="'business:publish:reDo'"> 重办 </el-button>
-						<el-button link type="primary" @click="publishDetail(row)" title="发布详情" v-auth="'business:publish:detail'"> 发布详情 </el-button>
+<!--						<el-button link type="primary" @click="publishDetail(row)" title="发布详情" v-auth="'business:publish:detail'"> 发布详情 </el-button>-->
 					</template>
 				</el-table-column>
 				<template #empty>

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

@@ -0,0 +1,97 @@
+
+
+<template>
+  <el-dialog v-model="state.dialogVisible" width="50%" draggable title="重复性事件详情" append-to-body destroy-on-close>
+    <el-form :model="state.ruleForm" label-width="80px" ref="ruleFormRef">
+      <el-row :gutter="10">
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <el-form-item label="标题">
+              {{ state.ruleForm.title }}
+          </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <el-form-item label="关键词">
+            {{ state.ruleForm.keyWords }}
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <el-divider content-position="left"><span class="font16"> 重复事件工单 </span></el-divider>
+    <el-table :data="state.repeatTable" v-loading="state.loading">
+      <el-table-column prop="order.no" label="工单编码" show-overflow-tooltip width="150"></el-table-column>
+      <el-table-column width="100" label="省/市工单" prop="isProvince">
+        <template #default="{ row }">
+          <span>{{ row.order?.isProvince ? '省工单' : '市工单' }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="order.currentStepName" label="当前办理节点" show-overflow-tooltip width="150"></el-table-column>
+      <el-table-column label="工单状态" show-overflow-tooltip width="100" prop="order.statusText"></el-table-column>
+      <el-table-column label="标题" show-overflow-tooltip width="300">
+        <template #default="{ row }">
+          <span class="color-primary">{{ row.order?.title }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="startTime" label="受理时间" show-overflow-tooltip width="170">
+        <template #default="{ row }">
+          <span>{{ formatDate(row.order?.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="expiredTime" label="工单期满时间" show-overflow-tooltip width="170">
+        <template #default="{ row }">
+          <span>{{ formatDate(row.order?.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="order.actualHandleOrgName" label="接办部门" show-overflow-tooltip width="170"></el-table-column>
+      <el-table-column prop="order.acceptType" label="受理类型" show-overflow-tooltip width="150"></el-table-column>
+      <el-table-column label="紧急程度" show-overflow-tooltip prop="order.emergencyLevelText" width="100"></el-table-column>
+      <el-table-column prop="order.sourceChannel" label="来源方式" show-overflow-tooltip></el-table-column>
+      <el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="120">
+        <template #default="{ row }">
+						<span
+            >{{ row.order?.acceptorName }} <span v-if="row.order?.acceptorStaffNo">[{{ row.order?.acceptorStaffNo }}]</span>
+						</span>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <template #footer>
+				<span class="dialog-footer">
+					<el-button @click="state.dialogVisible = false" class="default-button">关 闭</el-button>
+				</span>
+    </template>
+  </el-dialog>
+</template>
+<script setup lang="ts" name="repeatEventDetail">
+import { reactive} from "vue";
+import {formatDate} from "/@/utils/formatTime";
+import { repeatEventDetail } from '/@/api/business/repeatEvent';
+
+const state = reactive<any>({
+  loading: false, // 加载
+  dialogVisible: false, // 弹窗
+  ruleForm: <EmptyObjectType>{},
+  repeatTable: [], // 重复事件工单
+});
+
+// 创建重复事件
+const openDialog = (row:any) => {
+  getDetail(row)
+};
+// 查询详情
+const getDetail = async (row:any)=>{
+   try {
+      const {result} = await repeatEventDetail({id:row.id,Keyword:null});
+      state.ruleForm = result;
+      state.repeatTable = result.details;
+     state.dialogVisible = true;
+   }catch (e) {
+      console.log(e);
+   }
+}
+defineExpose({
+  openDialog,
+});
+</script>
+<style scoped lang="scss">
+
+</style>

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

@@ -0,0 +1,349 @@
+
+
+<template>
+  <el-dialog v-model="state.dialogVisible" width="50%" draggable title="新增重复性事件" @close="close" append-to-body destroy-on-close>
+    <el-form :model="state.ruleForm" label-width="80px" ref="ruleFormRef">
+      <el-row :gutter="10">
+        <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 show-word-limit maxlength="200"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <el-form-item label="关键词" prop="keyWords" :rules="[{ required: false, message: '请输入关键词', trigger: 'change' }]">
+            <el-tag
+                v-for="tag in dynamicTags"
+                :key="tag"
+                class="mr10 mb10"
+                size="large"
+                closable
+                :disable-transitions="false"
+                @close="handleClose(tag)"
+            >
+              {{ tag }}
+            </el-tag>
+            <el-input
+                v-if="inputVisible"
+                ref="InputRef"
+                v-model="inputValue"
+                @keyup.enter="handleInputConfirm"
+                @blur="handleInputConfirm"
+                style="max-width: 200px"
+                class="mb10"
+            />
+            <el-button v-else @click="showInput" class="mb10"> 添加关键词 </el-button>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <el-divider content-position="left"><span class="font16"> 重复事件工单 </span></el-divider>
+    <div class="mb10">
+      <el-button type="primary" @click="onAddRepeatTable">添加 </el-button>
+      <el-button type="primary" @click="onRemoveRepeatTable" :disabled="!multipleSelection.length">移除 </el-button>
+    </div>
+    <el-table :data="state.repeatTable" v-loading="state.loading" row-key="id" @selection-change="handleSelectionChange" ref="multipleTableRef">
+      <el-table-column type="selection" label="" width="55" :reserve-selection="true" />
+      <el-table-column prop="no" label="工单编码" show-overflow-tooltip width="150"></el-table-column>
+      <el-table-column width="100" label="省/市工单" prop="isProvince">
+        <template #default="{ row }">
+          <span>{{ row.isProvince ? '省工单' : '市工单' }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="currentStepName" label="当前办理节点" show-overflow-tooltip width="150"></el-table-column>
+      <el-table-column label="工单状态" show-overflow-tooltip width="100" prop="statusText"></el-table-column>
+      <el-table-column label="标题" show-overflow-tooltip width="300">
+        <template #default="{ row }">
+          <span class="color-primary">{{ row.title }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="startTime" label="受理时间" show-overflow-tooltip width="170">
+        <template #default="{ row }">
+          <span>{{ formatDate(row.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="expiredTime" label="工单期满时间" show-overflow-tooltip width="170">
+        <template #default="{ row }">
+          <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="actualHandleOrgName" label="接办部门" show-overflow-tooltip width="170"></el-table-column>
+      <el-table-column prop="acceptType" label="受理类型" show-overflow-tooltip width="150"></el-table-column>
+      <el-table-column label="紧急程度" show-overflow-tooltip prop="emergencyLevelText" width="100"></el-table-column>
+      <el-table-column prop="sourceChannel" label="来源方式" show-overflow-tooltip></el-table-column>
+      <el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="120">
+        <template #default="{ row }">
+						<span
+            >{{ row.acceptorName }} <span v-if="row.acceptorStaffNo">[{{ row.acceptorStaffNo }}]</span>
+						</span>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!--   从所有工单重选择重复   -->
+    <el-dialog v-model="state.dialogVisibleAllTable" width="50%" draggable title="选择重复事件工单" append-to-body destroy-on-close>
+      <el-form :model="state.queryParamsAll" ref="queryParamsAllRef" :inline="true" @submit.native.prevent>
+        <el-form-item label="关键词" prop="Keyword">
+          <el-input v-model="state.queryParamsAll.Keyword" placeholder="工单标题/工单编码" clearable @keyup.enter="queryListAll" />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="queryListAll" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+          <el-button @click="resetQueryAll(queryParamsAllRef)" :loading="state.loading" class="default-button">
+            <SvgIcon name="ele-Refresh" class="mr5" />重置
+          </el-button>
+        </el-form-item>
+      </el-form>
+      <el-table
+          :data="state.allTable"
+          v-loading="state.loading"
+          row-key="id"
+          @selection-change="handleSelectionChangeAll"
+          ref="multipleTableAllRef"
+      >
+        <el-table-column type="selection" label="" width="55" :reserve-selection="true" />
+        <el-table-column prop="no" label="工单编码" show-overflow-tooltip width="150"></el-table-column>
+        <el-table-column width="100" label="省/市工单" prop="isProvince">
+          <template #default="{ row }">
+            <span>{{ row.isProvince ? '省工单' : '市工单' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="currentStepName" label="当前办理节点" show-overflow-tooltip width="150"></el-table-column>
+        <el-table-column label="工单状态" show-overflow-tooltip width="100" prop="statusText"></el-table-column>
+        <el-table-column label="标题" show-overflow-tooltip width="300">
+          <template #default="{ row }">
+            <span class="color-primary">{{ row.title }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="startTime" label="受理时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="expiredTime" label="工单期满时间" show-overflow-tooltip width="170">
+          <template #default="{ row }">
+            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="actualHandleOrgName" label="接办部门" show-overflow-tooltip width="170"></el-table-column>
+        <el-table-column prop="acceptType" label="受理类型" show-overflow-tooltip width="150"></el-table-column>
+        <el-table-column label="紧急程度" show-overflow-tooltip prop="emergencyLevelText" width="100"></el-table-column>
+        <el-table-column prop="sourceChannel" label="来源方式" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="120">
+          <template #default="{ row }">
+							<span
+              >{{ row.acceptorName }} <span v-if="row.acceptorStaffNo">[{{ row.acceptorStaffNo }}]</span>
+							</span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <!-- 分页 -->
+      <pagination
+          :total="state.totalAll"
+          v-model:page="state.queryParamsAll.PageIndex"
+          v-model:limit="state.queryParamsAll.PageSize"
+          @pagination="queryListAll"
+      />
+      <template #footer>
+					<span class="dialog-footer">
+						<el-button @click="state.dialogVisibleAllTable = false" class="default-button">取 消</el-button>
+						<el-button type="primary" @click="onSubmitAll" :loading="state.loading" :disabled="!multipleSelectionAll.length">确 定</el-button>
+					</span>
+      </template>
+    </el-dialog>
+    <template #footer>
+				<span class="dialog-footer">
+					<el-button @click="state.dialogVisible = false" class="default-button">取 消</el-button>
+					<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">确 定</el-button>
+				</span>
+    </template>
+  </el-dialog>
+</template>
+<script setup lang="ts" name="repeatEventEdit">
+import {formatDate} from "/@/utils/formatTime";
+import {nextTick, reactive, ref} from "vue";
+import dayjs from "dayjs";
+import {ElInput, ElMessage, FormInstance ,ElMessageBox} from "element-plus";
+import { removeDuplicate } from '/@/utils/arrayOperation';
+import { orderList } from '/@/api/business/order';
+import {repeatEventDetail, repeatEventUpdate} from "/@/api/business/repeatEvent";
+import { throttle } from '/@/utils/tools';
+
+const emit = defineEmits(['updateList']);
+const state = reactive<any>({
+  queryParams: {
+    // 查询条件
+    PageIndex: 1,
+    PageSize: 10,
+    Keyword: null, // 关键字
+    CreationTimeStart: dayjs().startOf('day').format('YYYY-MM-DD[T]HH:mm:ss'), // 创建时间 开始
+    CreationTimeEnd: dayjs().endOf('day').format('YYYY-MM-DD[T]HH:mm:ss'), // 创建时间 结束
+    exTime: [dayjs().startOf('day').format('YYYY-MM-DD[T]HH:mm:ss'), dayjs().endOf('day').format('YYYY-MM-DD[T]HH:mm:ss')], // 创建时间
+  },
+  tableData: [], //表格
+  loading: false, // 加载
+  total: 0, // 总数
+  dialogVisible: false, // 弹窗
+  ruleForm: {},
+  repeatTable: [], // 重复事件工单
+  dialogVisibleAllTable: false, // 全部工单 重复事件工单弹窗
+  allTable: [], // 全部工单
+  totalAll: 0,
+  queryParamsAll: {
+    PageIndex: 1,
+    PageSize: 10,
+    Keyword: '', // 关键字
+  },
+});
+
+const inputValue = ref('');
+const dynamicTags = ref<EmptyArrayType>([]);
+const inputVisible = ref(false);
+const InputRef = ref<InstanceType<typeof ElInput>>();
+// 删除同义词
+const handleClose = (tag: string) => {
+  dynamicTags.value.splice(dynamicTags.value.indexOf(tag), 1);
+};
+// 展示输入框
+const showInput = () => {
+  inputVisible.value = true;
+  nextTick(() => {
+    InputRef.value!.input!.focus();
+  });
+};
+// 确定添加
+const handleInputConfirm = () => {
+  if (inputValue.value) {
+    dynamicTags.value.push(inputValue.value);
+  }
+  inputVisible.value = false;
+  inputValue.value = '';
+};
+// 创建重复事件
+const openDialog = (row:any) => {
+  getDetail(row)
+};
+// 查询详情
+const getDetail = async (row:any)=>{
+  try {
+    const {result} = await repeatEventDetail({id:row.id,Keyword:null});
+    state.ruleForm = result;
+    if(result.keyWords)  dynamicTags.value = result.keyWords?.split(',') ?? [];
+    state.repeatTable = result.details.map((item: any) => {
+      return {
+        ...item,
+        ...item?.order,
+      };
+    })
+    state.dialogVisible = true;
+  }catch (e) {
+    console.log(e);
+  }
+}
+// 打开所有工单列表选择重复工单
+const onAddRepeatTable = () => {
+  queryListAll();
+  state.dialogVisibleAllTable = true;
+};
+// 获取所有工单列表
+const queryListAll = async () => {
+  try {
+    state.loading = true;
+    const res = await orderList(state.queryParamsAll);
+    state.allTable = res.result.items ?? [];
+    state.totalAll = res.result.total ?? 0;
+    state.loading = false;
+  } catch (e) {
+    console.log(e);
+    state.loading = false;
+  }
+};
+// 重置所有工单列表
+const queryParamsAllRef = ref<RefType>();
+const resetQueryAll = (formEl: FormInstance | undefined) => {
+  if (!formEl) return;
+  formEl.resetFields();
+  queryListAll();
+};
+const multipleSelection = ref<EmptyArrayType>([]); // 重复件表格选中项
+const multipleTableRef = ref<RefType>(); // 重复件表格ref
+const handleSelectionChange = (row: any) => {
+  multipleSelection.value = row;
+};
+const multipleSelectionAll = ref<EmptyArrayType>([]); // 所有工单表格选中项
+const multipleTableAllRef = ref<RefType>(); // 所有工单表格ref
+const handleSelectionChangeAll = (row: any) => {
+  multipleSelectionAll.value = row;
+};
+// 确定选择所有工单到重复工单
+const onSubmitAll = () => {
+  state.dialogVisibleAllTable = false;
+  state.repeatTable = removeDuplicate([...state.repeatTable, ...multipleSelectionAll.value], 'id'); // 添加时去重
+  multipleSelectionAll.value = [];
+  multipleTableAllRef.value!.clearSelection();
+};
+// 删除重复工单
+const onRemoveRepeatTable = () => {
+  const title = multipleSelection.value.map((item: any) => item.title);
+  ElMessageBox.confirm(`您确定要删除:【${title}】,是否继续?`, '提示', {
+    confirmButtonText: '确认',
+    cancelButtonText: '取消',
+    type: 'warning',
+    draggable: true,
+    cancelButtonClass: 'default-button',
+    autofocus: false,
+  })
+      .then(() => {
+        multipleSelection.value.forEach((item1: any) => {
+          state.repeatTable.forEach((item: any, index: number) => {
+            if (item.id === item1.id) {
+              multipleTableRef.value!.toggleRowSelection(item, undefined);
+              state.repeatTable.splice(index, 1);
+            }
+          });
+        });
+      })
+      .catch(() => {});
+};
+const ruleFormRef = ref<RefType>();
+const close = () => {
+  ruleFormRef.value.clearValidate();
+  ruleFormRef.value.resetFields();
+};
+const onSubmit = throttle(async (formEl: FormInstance | undefined) => {
+  if (!formEl) return;
+  await formEl.validate((valid: boolean) => {
+    if (!valid) return;
+    state.loading = true;
+    const details = state.repeatTable.map((item: any) => {
+      return {
+        orderNo: item.no,
+        orderId: item.id,
+      };
+    });
+    const request = {
+      ...state.ruleForm,
+      keyWords: dynamicTags.value.join(','),
+      details,
+    };
+    repeatEventUpdate(request)
+        .then(() => {
+          ElMessage({
+            message: '操作成功',
+            type: 'success',
+          });
+          emit('updateList')
+          state.dialogVisible = false;
+        })
+        .catch((error) => {})
+        .finally(() => {
+          state.loading = false;
+          state.dialogVisible = false;
+        });
+  });
+}, 300);
+defineExpose({
+  openDialog,
+});
+</script>
+<style scoped lang="scss">
+
+</style>

+ 18 - 46
src/views/business/repeatEvent/index.vue

@@ -15,8 +15,7 @@
 			</el-form>
 		</el-card>
 		<el-card shadow="never">
-			<el-table :data="state.tableData" v-loading="state.loading" row-key="id" ref="multipleTableRef" @selection-change="handleSelectionChange">
-				<el-table-column type="selection" width="55" />
+			<el-table :data="state.tableData" v-loading="state.loading">
 				<el-table-column prop="title" label="重复事件标题" show-overflow-tooltip width="400"></el-table-column>
 				<el-table-column prop="keyWords" label="关键词" show-overflow-tooltip width="300"></el-table-column>
 				<el-table-column prop="creatorName" label="创建人" show-overflow-tooltip></el-table-column>
@@ -33,10 +32,10 @@
 				</el-table-column>
 				<el-table-column label="操作" width="140" fixed="right" align="center">
 					<template #default="{ row }">
-						<el-button link type="primary" @click="onTagsRecord(row)" v-auth="'business:repeatEvent:detail'" title="查看重复性详情">
+						<el-button link type="primary" @click="onEventDetail(row)" v-auth="'business:repeatEvent:detail'" title="查看重复性详情">
 							事件详情
 						</el-button>
-						<el-button link type="primary" @click="onTagsEdit(row)" v-auth="'business:repeatEvent:edit'" title="编辑重复性事件"> 编辑 </el-button>
+						<el-button link type="primary" @click="onEventEdit(row)" v-auth="'business:repeatEvent:edit'" title="编辑重复性事件"> 编辑 </el-button>
 					</template>
 				</el-table-column>
 				<template #empty>
@@ -51,24 +50,23 @@
 				@pagination="queryList"
 			/>
 		</el-card>
-		<!-- 标签记录   -->
-		<tags-record ref="tagsRecordRef" />
-		<!-- 编辑市民画像   -->
-		<tags-edit ref="TagsEditRef" @updateList="queryList" />
+		<!-- 事件详情   -->
+		<repeat-event-detail ref="repeatEventDetailRef" />
+		<!-- 编辑重复性事件 -->
+		<repeat-event-edit ref="repeatEventEditRef" @updateList="queryList" />
 	</div>
 </template>
 
 <script lang="ts" setup name="businessRepeatEvent">
 import { reactive, ref, onMounted, defineAsyncComponent } from 'vue';
-import { ElMessage, ElMessageBox, FormInstance } from 'element-plus';
+import { ElMessage, FormInstance } from 'element-plus';
 import { formatDate } from '/@/utils/formatTime';
 import { auth } from '/@/utils/authFunction';
-import { citizenDelete } from '/@/api/business/citizen';
 import { repeatEventList } from '/@/api/business/repeatEvent';
 
 // 引入组件
-const TagsRecord = defineAsyncComponent(() => import('/@/views/business/citizen/components/Tags-record.vue')); // 标签记录
-const TagsEdit = defineAsyncComponent(() => import('/@/views/business/citizen/components/Tags-edit.vue')); // 标签编辑
+const RepeatEventDetail = defineAsyncComponent(() => import('/@/views/business/repeatEvent/components/Repeat-event-detail.vue')); // 重复性事件详情
+const RepeatEventEdit = defineAsyncComponent(() => import('/@/views/business/repeatEvent/components/Repeat-event-edit.vue')); // 编辑重复性事件
 
 // 定义变量内容
 const state = reactive<any>({
@@ -106,41 +104,15 @@ const resetQuery = (formEl: FormInstance | undefined) => {
 	formEl.resetFields();
 	queryList();
 };
-// 标签记录
-const tagsRecordRef = ref<RefType>();
-const onTagsRecord = (row: any) => {
-	tagsRecordRef.value.openDialog(row);
+// 重复性事件详情
+const repeatEventDetailRef = ref<RefType>();
+const onEventDetail = (row: any) => {
+  repeatEventDetailRef.value.openDialog(row);
 };
-// 编辑标签
-const TagsEditRef = ref<RefType>();
-const onTagsEdit = (row: any) => {
-	TagsEditRef.value.openDialog(row);
-};
-// 表格多选
-const multipleTableRef = ref<RefType>();
-const multipleSelection = ref<any>([]);
-const handleSelectionChange = (val: any[]) => {
-	multipleSelection.value = val;
-};
-// 删除参数
-const onLexiconDelete = () => {
-	const names = multipleSelection.value.map((item: any) => item.name).join('、');
-	const ids = multipleSelection.value.map((item: any) => item.id);
-	ElMessageBox.confirm(`您确定要删除:【${names}】市民画像,是否继续?`, '提示', {
-		confirmButtonText: '确认',
-		cancelButtonText: '取消',
-		type: 'warning',
-		draggable: true,
-		cancelButtonClass: 'default-button',
-		autofocus: false,
-	})
-		.then(() => {
-			citizenDelete({ ids }).then(() => {
-				ElMessage.success('操作成功');
-				queryList();
-			});
-		})
-		.catch(() => {});
+// 编辑重复性事件
+const repeatEventEditRef = ref<RefType>();
+const onEventEdit = (row: any) => {
+  repeatEventEditRef.value.openDialog(row);
 };
 // 页面加载时
 onMounted(() => {

+ 1 - 5
src/views/login/component/Account.vue

@@ -68,7 +68,6 @@ import { initBackEndControlRoutes } from '/@/router/backEnd';
 import { Session, Local, Cookie } from '/@/utils/storage';
 import { formatAxis } from '/@/utils/formatTime';
 import { NextLoading } from '/@/utils/loading';
-import Watermark from '/@/utils/watermark';
 import type { FormInstance } from 'element-plus';
 import { signIn } from '/@/api/login';
 import { JSEncrypt } from 'jsencrypt'; // rsa加密
@@ -153,10 +152,7 @@ const signInSuccess = (isNoPower: boolean | undefined) => {
 		} else {
 			router.push('/');
 		}
-		// 设置水印
-		themeConfig.value.isWatermark = true;
-		themeConfig.value.watermarkText = state.ruleForm.userName;
-		Watermark.set(state.ruleForm.userName);
+    // 设置登录成功后的时间问候语
 		Cookie.set('userName', state.ruleForm.userName);
 		// 登录成功提示
 		// 关闭 loading

+ 0 - 7
src/views/resetPwd/index.vue

@@ -19,7 +19,6 @@ import { storeToRefs } from 'pinia';
 import { useThemeConfig } from '/@/stores/themeConfig';
 import { NextLoading } from '/@/utils/loading';
 import {Cookie, Local, Session} from '/@/utils/storage';
-import Watermark from '/@/utils/watermark';
 import { useRouter } from 'vue-router';
 import { getImageUrl } from '/@/utils/tools';
 
@@ -39,12 +38,6 @@ const backToLogin = () => {
 // 页面加载时
 onMounted(() => {
 	NextLoading.done();
-	Watermark.del(); // 清除水印
-  // storesThemeConfig.setThemeConfig({
-  //   ...themeConfig.value,
-  //   isWatermark:false,
-  //   watermarkText:''
-  // });
 });
 </script>
 

+ 0 - 2
src/views/visualizing/demo1.vue

@@ -150,7 +150,6 @@ import 'echarts-wordcloud';
 import { formatDate } from '/@/utils/formatTime';
 import { NextLoading } from '/@/utils/loading';
 import { acceptWorkOrderData, complaintHotWordsData, echartsMapData, echartsMapImages, echartsMapList } from './mock/demo1';
-import Watermark from '/@/utils/watermark';
 import signalR from '/@/utils/signalR';
 // 定义变量内容
 const visualizingDemo1 = ref(); // 地图
@@ -1385,7 +1384,6 @@ onMounted(async () => {
 	await initSourceProportion(); // 来源占比分析
 	await initComplaintHotWords(); // 投诉热词
 	await initEchartsResize(); //
-	Watermark.del(); // 清除水印
   //  signalR 初始化signalr
   signalR.init();
   // 加入分组