Переглянути джерело

reactor:新增工单修改;

zhangchong 6 місяців тому
батько
коміт
832c6e3666

+ 8 - 0
src/router/route.ts

@@ -492,6 +492,14 @@ export const dynamicRoutes: Array<RouteRecordRaw> = [
 			title: '扭转明细列表',
 			isKeepAlive: true,
 		},
+	},{
+		path: '/todo/edit/record',
+		name: 'todoEditRecord',
+		component: () => import('@/views/todo/edit/record.vue'),
+		meta: {
+			title: '修改记录',
+			isKeepAlive: true,
+		},
 	},
 ];
 /**

+ 76 - 0
src/views/todo/edit/components/Edit-record.vue

@@ -0,0 +1,76 @@
+<template>
+	<el-drawer v-model="state.dialogVisible" title="明细信息" destroy-on-close size="500px" append-to-body>
+		<el-form label-width="110px" ref="ruleFormRef" :model="state.ruleForm" class="show-info-form" v-loading="state.loading">
+			<p class="border-title mb10">申请信息</p>
+			<el-form-item label="申请人"> {{ state.ruleForm.applyUserName }} </el-form-item>
+			<el-form-item label="申请部门"> {{ state.ruleForm.applyOrgName }} </el-form-item>
+			<el-form-item label="申请时间"> {{ formatDate(state.ruleForm.applyTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+			<el-form-item label="申请时限" v-if="currentType === 'delay'"> {{ state.ruleForm.applyDelayNum }} </el-form-item>
+			<el-form-item label="申请原因" class="formatted-text"> {{ state.ruleForm.applyReason }} </el-form-item>
+			<p class="border-title mb10 mt20">审核信息</p>
+			<el-form-item label="审核人">{{ state.ruleForm.auditName }}</el-form-item>
+			<el-form-item label="审核部门">{{ state.ruleForm.auditOrgName }}</el-form-item>
+			<el-form-item label="审核时间"> {{ formatDate(state.ruleForm.auditTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+			<el-form-item label="审核状态">{{ state.ruleForm.auditState }}</el-form-item>
+			<el-form-item label="审核原因" class="formatted-text">{{ state.ruleForm.auditContent }}</el-form-item>
+		</el-form>
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="closeDrawer" class="default-button">关 闭</el-button>
+			</span>
+		</template>
+	</el-drawer>
+</template>
+<script setup lang="ts" name="businessUrgeDetailDialog">
+import { reactive, ref } from 'vue';
+import { formatDate } from '@/utils/formatTime';
+import { provinceDelayDetail, provinceIdentifyDetail, provinceReturnDetail } from '@/api/province';
+
+// 定义子组件向父组件传值/事件
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false, // 是否显示弹窗
+	loading: false, // 是否显示加载
+	ruleForm: {},
+});
+// 打开弹窗
+const currentType = ref('');
+const openDrawer = async (id: string, type: string) => {
+	state.loading = true;
+	state.dialogVisible = true;
+	currentType.value = type;
+	try {
+		switch (type) {
+			case 'delay':
+				const { result } = await provinceDelayDetail({ id });
+				state.ruleForm = result;
+				state.loading = false;
+				break;
+			case 'return':
+				const returnRes = await provinceReturnDetail({ id });
+				state.ruleForm = returnRes.result;
+				state.loading = false;
+				break;
+			case 'screen':
+				const screenRes = await provinceIdentifyDetail({ id });
+				state.ruleForm = screenRes.result;
+				state.loading = false;
+				break;
+			default:
+				break;
+		}
+	} catch (e) {
+		console.log(e);
+		state.loading = false;
+		state.dialogVisible = false;
+	}
+};
+// 关闭弹窗
+const closeDrawer = () => {
+	state.dialogVisible = false;
+};
+defineExpose({
+	openDrawer,
+	closeDrawer,
+});
+</script>

+ 332 - 163
src/views/todo/edit/index.vue

@@ -1,5 +1,5 @@
 <template>
-	<div class="todo-center-container layout-padding">
+	<div class="business-order-container layout-padding">
 		<div class="layout-padding-auto layout-padding-view pd20">
 			<ProTable
 				ref="proTableRef"
@@ -7,48 +7,166 @@
 				:data="state.tableData"
 				@updateTable="queryList"
 				:loading="state.loading"
-				:total="state.total"
-				v-model:page-index="state.queryParams.PageIndex"
-				v-model:page-size="state.queryParams.PageSize"
+				:pagination="false"
+				:toolButton="['refresh', 'setting', 'exportCurrent', 'exportAll']"
+				:exportMethod="exportOrder"
+				:exportParams="requestParams"
 			>
 				<template #table-search>
-					<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent class="mb10" inline>
-						<el-form-item label="工单标题" prop="Title">
-							<el-input v-model="state.queryParams.Title" placeholder="工单标题" clearable @keyup.enter="handleQuery" class="keyword-input" />
+					<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
+						<el-row>
+							<el-col>
+								<el-form-item label="快捷查询" prop="fastSearch">
+									<el-segmented
+										:options="[
+											{
+												value: 'all',
+												label: '全部',
+											},
+											{
+												value: 'city',
+												label: '市工单',
+											},
+											{
+												value: 'province',
+												label: '省工单',
+											},
+										]"
+										v-model="fastSearch"
+										@change="fastSearchChange"
+									/>
+								</el-form-item>
+							</el-col>
+						</el-row>
+						<el-form-item label="工单标题" prop="Keyword">
+							<el-input v-model="state.queryParams.Keyword" placeholder="工单标题" clearable @keyup.enter="handleQuery" class="keyword-input" />
 						</el-form-item>
 						<el-form-item label="工单编码" prop="No">
 							<el-input v-model="state.queryParams.No" placeholder="工单编码" clearable @keyup.enter="handleQuery" class="keyword-input" />
 						</el-form-item>
-
-						<el-form-item label="">
+						<el-form-item label="生成时间" prop="crTime">
+							<el-date-picker
+								v-model="state.queryParams.crTime"
+								type="datetimerange"
+								unlink-panels
+								range-separator="至"
+								start-placeholder="开始时间"
+								end-placeholder="结束时间"
+								:shortcuts="shortcuts"
+								@change="handleQuery"
+								value-format="YYYY-MM-DD[T]HH:mm:ss"
+								:default-time="defaultTimeStartEnd"
+							/>
+						</el-form-item>
+						<el-form-item>
 							<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
 							<el-button @click="drawer = true" class="default-button"> <SvgIcon name="ele-Search" class="mr5" />更多查询</el-button>
 						</el-form-item>
 					</el-form>
 				</template>
-				<template #tableHeader="scope">
-					<el-button type="primary" @click="onJbExport" :disabled="!scope.isSelected" :loading="state.loading" v-auth="'todo:edit:jbdExport'"
-						><SvgIcon name="iconfont icon-daochu" class="mr5" />交办单导出
-					</el-button>
+				<template #tableHeader>
+					<el-button type="primary" @click="onRecord" :loading="state.loading"> <SvgIcon name="ele-List" class="mr5" />修改记录 </el-button>
 				</template>
 				<template #expiredStatusText="{ row }">
 					<span :class="'overdue-status-' + row.expiredStatus" :title="row.expiredStatusText"></span>
 				</template>
 				<template #title="{ row }">
-					<order-detail :order="row" @updateList="queryList">{{ row.title }}</order-detail>
+					<order-detail :order="row" @updateList="queryList(true)">{{ row.title }}</order-detail>
 				</template>
-				<!-- 表格操作 -->
 				<template #operation="{ row }">
-					<el-button link type="primary" @click="onOrderEdit(row)" title="编辑工单" v-if="row.canEdit" v-auth="'todo:edit:edit'"> 工单修改 </el-button>
+					<el-button link type="primary" @click="onOrderEdit(row)" title="编辑工单" v-auth="'todo:edit:edit'"> 工单修改 </el-button>
 				</template>
 			</ProTable>
+			<div class="flex-end mt20" style="align-items: center">
+				<span v-loading="totalLoading" class="mr10">共 {{ totalCount }} 条</span>
+				<el-pagination
+					layout="prev, pager, next"
+					:total="state.total"
+					@current-change="handleCurrentChange"
+					:page-size="state.queryParams.PageSize"
+					:current-page="state.queryParams.PageIndex"
+					:pager-count="5"
+				/>
+			</div>
 		</div>
 		<!--	更多查询	-->
 		<el-drawer v-model="drawer" title="更多查询" size="500px">
 			<el-form :model="state.queryParams" ref="drawerRuleFormRef" @submit.native.prevent label-width="100px">
-				<el-form-item label="生成时间" prop="scTime">
+				<el-form-item label="来电人姓名" prop="FromName">
+					<el-input v-model="state.queryParams.FromName" placeholder="来电人姓名" clearable @keyup.enter="handleQuery" />
+				</el-form-item>
+				<el-form-item label="事发地址" prop="AreaCode">
+					<el-cascader
+						:options="state.areaOptions"
+						filterable
+						:props="{ checkStrictly: true, value: 'id', label: 'areaName', emitPath: false }"
+						placeholder="请选择事发地址"
+						clearable
+						v-model="state.queryParams.AreaCode"
+						@change="handleQuery"
+						class="w100"
+					>
+					</el-cascader>
+				</el-form-item>
+				<el-form-item label="是否紧急" prop="IsUrgent">
+					<el-select v-model="state.queryParams.IsUrgent" placeholder="请选择是否紧急" clearable @change="handleQuery">
+						<el-option :value="true" label="紧急" />
+						<el-option :value="false" label="不紧急" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="转接来源" prop="TransferPhone">
+					<el-input v-model="state.queryParams.TransferPhone" placeholder="转接来源" clearable @keyup.enter="handleQuery" />
+				</el-form-item>
+				<el-form-item label="工单状态" prop="Status">
+					<el-select v-model="state.queryParams.Status" placeholder="请选择工单状态" clearable @change="handleQuery">
+						<el-option v-for="item in state.orderStatusOptions" :value="item.key" :key="item.key" :label="item.value" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="受理类型" prop="AcceptType">
+					<el-select v-model="state.queryParams.AcceptType" placeholder="请选择受理类型" clearable @change="handleQuery">
+						<el-option v-for="item in state.acceptTypeOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="来源渠道" prop="Channel">
+					<el-select v-model="state.queryParams.Channel" placeholder="请选择来源渠道" clearable @change="handleQuery">
+						<el-option v-for="item in state.channelOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="热点分类" prop="Hotspot">
+					<el-input v-model="state.queryParams.Hotspot" placeholder="热点分类名称" clearable @keyup.enter="handleQuery" />
+				</el-form-item>
+				<el-form-item label="接办部门" prop="ActualHandleOrgName">
+					<el-input v-model="state.queryParams.ActualHandleOrgName" placeholder="请填写接办部门名称" clearable @keyup.enter="handleQuery" />
+				</el-form-item>
+				<el-form-item label="一级部门" prop="OrgLevelOneName">
+					<el-input v-model="state.queryParams.OrgLevelOneName" placeholder="请填写一级部门名称" clearable @keyup.enter="handleQuery" />
+				</el-form-item>
+				<el-form-item label="受理人" prop="NameOrNo">
+					<el-input v-model="state.queryParams.NameOrNo" placeholder="受理人/坐席工号" clearable @keyup.enter="handleQuery" />
+				</el-form-item>
+				<el-form-item label="省本地编码" prop="ProvinceNo">
+					<el-input v-model="state.queryParams.ProvinceNo" placeholder="省本地编码" clearable @keyup.enter="handleQuery" />
+				</el-form-item>
+				<el-form-item label="来电号码" prop="FromPhone">
+					<el-input v-model="state.queryParams.FromPhone" placeholder="来电号码" clearable @keyup.enter="handleQuery" />
+				</el-form-item>
+				<el-form-item label="联系电话" prop="PhoneNo">
+					<el-input v-model="state.queryParams.PhoneNo" placeholder="联系电话" clearable @keyup.enter="handleQuery" />
+				</el-form-item>
+				<el-form-item label="推送分类" prop="PushTypeCode">
+					<el-select v-model="state.queryParams.PushTypeCode" placeholder="请选择推送分类" clearable @change="handleQuery">
+						<el-option v-for="item in state.pushTypeOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="归档类型" prop="FiledType">
+					<el-select v-model="state.queryParams.FiledType" placeholder="请选择归档类型" @change="handleQuery" clearable>
+						<el-option label="中心归档" value="10" />
+						<el-option label="部门归档" value="20" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="期满时间" prop="exTime">
 					<el-date-picker
-						v-model="state.queryParams.scTime"
+						v-model="state.queryParams.exTime"
 						type="datetimerange"
 						unlink-panels
 						range-separator="至"
@@ -60,9 +178,23 @@
 						:default-time="defaultTimeStartEnd"
 					/>
 				</el-form-item>
-				<el-form-item label="受理时间" prop="slTime">
+				<el-form-item label="接办人" prop="ActualHandlerName">
+					<el-input v-model="state.queryParams.ActualHandlerName" placeholder="接办人" clearable @keyup.enter="handleQuery" />
+				</el-form-item>
+				<el-form-item label="是否甄别" prop="IsScreen">
+					<el-select v-model="state.queryParams.IsScreen" placeholder="请选择是否甄别" clearable @change="handleQuery">
+						<el-option label="是" :value="true" />
+						<el-option label="否" :value="false" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="当前节点" prop="CurrentStepCode">
+					<el-select v-model="state.queryParams.CurrentStepCode" placeholder="请选择当前节点" clearable @change="handleQuery">
+						<el-option v-for="item in state.currentStepOptions" :value="item.key" :key="item.key" :label="item.value" />
+					</el-select>
+				</el-form-item>
+				<el-form-item label="办结时间" prop="doneTime">
 					<el-date-picker
-						v-model="state.queryParams.slTime"
+						v-model="state.queryParams.doneTime"
 						type="datetimerange"
 						unlink-panels
 						range-separator="至"
@@ -74,34 +206,15 @@
 						:default-time="defaultTimeStartEnd"
 					/>
 				</el-form-item>
-				<el-form-item label="当前节点" prop="StepName">
-					<el-select v-model="state.queryParams.StepName" placeholder="请选择当前节点" clearable class="w100" @change="handleQuery">
-						<el-option v-for="item in state.stepNamesOptions" :value="item" :key="item" :label="item" />
+				<el-form-item label="是否超期" prop="IsOverTime">
+					<el-select v-model="state.queryParams.IsOverTime" placeholder="请选择是否超期" clearable @change="handleQuery">
+						<el-option label="是" :value="true" />
+						<el-option label="否" :value="false" />
 					</el-select>
 				</el-form-item>
-				<el-form-item label="派单员" prop="CenterToOrgHandlerName">
-					<el-input v-model="state.queryParams.CenterToOrgHandlerName" placeholder="派单员" clearable @keyup.enter="handleQuery" />
-				</el-form-item>
-				<el-form-item label="是否紧急" prop="IsUrgent">
-					<el-select v-model="state.queryParams.IsUrgent" placeholder="请选择是否紧急" clearable class="w100" @change="handleQuery">
-						<el-option :value="true" label="紧急" />
-						<el-option :value="false" label="不紧急" />
-					</el-select>
-				</el-form-item>
-				<el-form-item label="接办部门" prop="ActualHandleOrgName">
-					<el-input v-model="state.queryParams.ActualHandleOrgName" placeholder="接办部门名称" clearable @keyup.enter="handleQuery" />
-				</el-form-item>
-				<el-form-item label="工单状态" prop="Status">
-					<el-select v-model="state.queryParams.Status" placeholder="请选择工单状态" clearable class="w100" @change="handleQuery">
-						<el-option v-for="item in state.orderStatusOptions" :value="item.key" :key="item.key" :label="item.value" />
-					</el-select>
-				</el-form-item>
-				<el-form-item label="受理人" prop="AcceptorName">
-					<el-input v-model="state.queryParams.AcceptorName" placeholder="受理人" clearable @keyup.enter="handleQuery" />
-				</el-form-item>
-				<el-form-item label="超期状态" prop="ExpiredStatus">
-					<el-select v-model="state.queryParams.ExpiredStatus" placeholder="请选择超期状态" clearable class="w100" @change="handleQuery">
-						<el-option v-for="item in state.expiredStatusOptions" :value="item.key" :key="item.key" :label="item.value" />
+				<el-form-item label="来电主体" prop="IdentityType">
+					<el-select v-model="state.queryParams.IdentityType" placeholder="请选择来电主体" clearable @change="handleQuery">
+						<el-option v-for="item in state.identityTypeOptions" :value="item.key" :key="item.key" :label="item.value" />
 					</el-select>
 				</el-form-item>
 			</el-form>
@@ -113,18 +226,17 @@
 	</div>
 </template>
 <script setup lang="tsx" name="todoEdit">
-import { defineAsyncComponent, onActivated, onBeforeUnmount, onMounted, reactive, ref } from 'vue';
+import { defineAsyncComponent, onMounted, reactive, ref, onActivated, onBeforeUnmount } from 'vue';
 import type { FormInstance } from 'element-plus';
 import { ElMessage, ElMessageBox } from 'element-plus';
 import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
-import other from '@/utils/other';
-import { useRouter } from 'vue-router';
 import { formatDate } from '@/utils/formatTime';
-import { centerTodo, centerTodoBase } from '@/api/todo/center';
-import { orderSign } from '@/api/todo/order';
-import { exportJbOrder } from '@/api/business/order';
-import { downloadZip } from '@/utils/tools';
+import { exportOrder, listBaseData, orderListCount, orderListFixed } from '@/api/business/order';
+import { treeArea } from '@/api/auxiliary/area';
+import { getNeedArr } from '@/utils/tools';
+import Other from '@/utils/other';
 import mittBus from '@/utils/mitt';
+import { useRouter } from 'vue-router';
 
 // 引入组件
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
@@ -134,102 +246,148 @@ const state = reactive<any>({
 	queryParams: {
 		PageIndex: 1, // 当前页
 		PageSize: 20, // 每页条数
-		Title: null, // 标题
-		No: null, // 工单编号
-		scTime: [], // 生成时间
-		StCreationTime: null, // 生成开始时间
-		EnCreationTime: null, // 生成结束时间
-		slTime: [], // 受理时间
-		StartTimeSt: null, // 受理开始时间
-		StartTimeEnd: null, // 受理结束时间
-		AcceptorName: null, // 受理人
+		// 查询条件
+		No: null, // 工单编码
+		ProvinceNo: null, // 省本地编码
+		ActualHandlerName: null, // 接办人
+		IsScreen: null, // 是否甄别
+		CurrentStepCode: null, // 办理节点
+		IsOverTime: null, // 是否超期
+		FromName: null, // 来电人姓名
+		AreaCode: null, // 事发地址
+		FromPhone: null, // 来电号码
+		Keyword: null, // 关键字
+		Content: null, // 工单内容
+		AcceptType: null, // 受理类型
+		Channels: null, // 渠道
+		Hotspot: null, //  热点分类名称
+		OrgId: null, // 接办部门
 		ActualHandleOrgName: null, // 接办部门
+		OrgLevelOneName: null, // 一级部门
+		NameOrNo: null, // 受理坐席
+		crTime: [], // 生成时间
+		CreationTimeStart: null, // 创建时间 开始
+		CreationTimeEnd: null, // 创建时间 结束
 		Status: null, // 工单状态
-		ExpiredStatus: null, // 超期状态
-		StepName: null, // 当前节点名称
-		IsUrgent: null,
-		CenterToOrgHandlerName: null, // 派单员
+		TransferPhone: null, // 转接来源
+		exTime: [], // 过期时间
+		ExpiredTimeStart: null, //办理期限 开始
+		ExpiredTimeEnd: null, //办理期限 结束
+		PhoneNo: null, // 手机号
+		doneTime: [], // 办结时间
+		ActualHandleTimeStart: null,
+		ActualHandleTimeEnd: null,
+		PushTypeCode: null, //推送类型
+		IsProvinceOrder: null, // 省市工单
+		IsSensitiveWord: null, // 是否敏感词工单
+		SensitiveWord: null, // 敏感词
+		IsUrgent: null, // 是否加急
 	},
 	tableData: [], //表单
 	loading: false, // 加载
 	total: 0, // 总数
-	expiredStatusOptions: [], //超期状态
-	orderStatusOptions: [], //工单状态
-	stepNamesOptions: [], //步骤名称
+	acceptTypeOptions: [], //受理类型
+	channelOptions: [], // 来源频道
+	orderStatusOptions: [], // 工单状态
+	currentStepOptions: [], // 办理节点
+	identityTypeOptions: [], // 来电主体
+	orgsOptions: [], // 部门
+	pushTypeOptions: [], //推送分类
+	orgData: [], // 机构数据
+	areaOptions: [], // 省市区数据
 });
-const router = useRouter(); // 路由
+const fastSearch = ref('all'); // tab位置
+const fastSearchChange = (val: string) => {
+	fastSearch.value = val;
+	switch (val) {
+		case 'all':
+			state.queryParams.IsProvinceOrder = null;
+			break;
+		case 'city':
+			state.queryParams.IsProvinceOrder = false;
+			break;
+		case 'province':
+			state.queryParams.IsProvinceOrder = true;
+			break;
+	}
+	handleQuery();
+};
 const proTableRef = ref<RefType>(); // 表格ref
 // 表格配置项
 const columns = ref<any[]>([
-	{ type: 'selection', minWidth: 40, align: 'center' },
-	{ prop: 'expiredStatusText', label: '超期状态', minWidth: 80, align: 'center' },
-	{ prop: 'no', label: '工单编码', minWidth: 140 },
-	{ prop: 'isProvinceText', label: '省/市工单', minWidth: 90 },
+	{ prop: 'expiredStatusText', label: '超期状态', align: 'center', minWidth: 80 },
+	{ prop: 'statusText', label: '工单状态', minWidth: 100 },
+	{ prop: 'sourceChannel', label: '来源渠道', minWidth: 100 },
+	{ prop: 'currentStepName', label: '当前节点', minWidth: 100 },
+	{ prop: 'reTransactNum', label: '重办次数' },
 	{
 		prop: 'isUrgentText',
 		label: '是否紧急',
-		render: (scope:any) => {
+		render: (scope) => {
 			return <span class="color-danger font-bold">{scope.row.isUrgentText}</span>;
 		},
 	},
-	{ prop: 'currentStepName', label: '当前节点', minWidth: 100 },
-	{ prop: 'statusText', label: '工单状态', minWidth: 100 },
-	{ prop: 'title', label: '工单标题', minWidth: 200 },
-	{ prop: 'centerToOrgHandlerName', label: '派单员', minWidth: 120 },
+	{ prop: 'no', label: '工单编码', minWidth: 140 },
+	{ prop: 'isProvinceText', label: '省/市工单', minWidth: 90 },
 	{
 		prop: 'startTime',
 		label: '受理时间',
 		minWidth: 160,
-		render: (scope:any) => {
+		render: (scope) => {
 			return <span>{formatDate(scope.row.startTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
 		},
 	},
+	{ prop: 'title', label: '工单标题', minWidth: 200 },
+	{ prop: 'contact', label: '联系电话', minWidth: 140 },
+	{ prop: 'fromPhone', label: '来电号码', minWidth: 140 },
 	{
 		prop: 'expiredTime',
 		label: '工单期满时间',
 		minWidth: 160,
-		render: (scope:any) => {
+		render: (scope) => {
 			return <span>{formatDate(scope.row.expiredTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
 		},
 	},
+	{ prop: 'actualHandleOrgName', label: '接办部门', minWidth: 140 },
+	{
+		prop: 'actualHandleTime',
+		label: '接办时间',
+		minWidth: 160,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.actualHandleTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
 	{
 		prop: 'filedTime',
 		label: '办结时间',
 		minWidth: 160,
-		render: (scope:any) => {
+		render: (scope) => {
 			return <span>{formatDate(scope.row.filedTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
 		},
 	},
-	{ prop: 'orgLevelOneName', label: '一级部门', minWidth: 140 },
-	{ prop: 'actualHandleOrgName', label: '接办部门', minWidth: 140 },
 	{ prop: 'acceptType', label: '受理类型', minWidth: 100 },
-	{ prop: 'counterSignTypeText', label: '是否会签', minWidth: 90 },
-	{ prop: 'sourceChannel', label: '来源渠道', minWidth: 100 },
 	{ prop: 'hotspotName', label: '热点分类', minWidth: 150 },
-	{
-		prop: 'sensitive',
-		label: '敏感词',
-		minWidth: 150,
-	},
 	{ prop: 'acceptorName', label: '受理人', minWidth: 120 },
-	{
-		prop: 'reTransactNum',
-		label: '重办次数',
-	},
-	{ prop: 'operation', label: '操作', fixed: 'right', minWidth: 90, align: 'center' },
+	{ prop: 'operation', label: '操作', fixed: 'right', width: 90, align: 'center' },
 ]);
 // 获取查询条件基础信息
 const getBaseData = async () => {
 	try {
-		const res: any = await centerTodoBase();
+		const res: any = await listBaseData();
 		const mappings: any = {
-			expiredStatusOptions: 'expiredStatus',
-			orderStatusOptions: 'orderStatus',
-			stepNamesOptions: 'stepNames',
+			acceptTypeOptions: 'acceptTypeOptions',
+			channelOptions: 'channelOptions',
+			orgsOptions: 'orgsOptions',
+			pushTypeOptions: 'pushTypeOptions',
+			orderStatusOptions: 'orderStatusOptions',
+			identityTypeOptions: 'identityTypeOptions',
+			currentStepOptions: 'currentStepOptions',
 		};
 		for (const key in mappings) {
 			state[key] = res.result?.[mappings[key]] ?? [];
 		}
+		const area = await treeArea();
+		state.areaOptions = area?.result ?? []; //省市区数据
 	} catch (error) {
 		console.log(error);
 	}
@@ -237,26 +395,66 @@ const getBaseData = async () => {
 // 手动查询,将页码设置为1
 const handleQuery = () => {
 	state.queryParams.PageIndex = 1;
-	queryList();
+	queryIndex.value = 0;
+	queryList(true);
+};
+// 改变页码
+const queryIndex = ref(0); // 数据批次
+const totalTable = ref([]); // 数据总数
+const handleCurrentChange = (val: number) => {
+	state.queryParams.PageIndex = val;
+	// 判断当前页是否是数据的最后一页
+	if (val === Math.ceil(state.total / state.queryParams.PageSize)) {
+		queryList();
+	} else {
+		state.tableData = getNeedArr(totalTable.value, state.queryParams.PageSize)[state.queryParams.PageIndex - 1]; //当前页的表格数据
+	}
 };
-/** 获取列表 */
 const requestParams = ref<EmptyObjectType>({});
-const queryList = () => {
-	requestParams.value = other.deepClone(state.queryParams);
-	requestParams.value.StCreationTime = state.queryParams.scTime === null ? null : state.queryParams.scTime[0];
-	requestParams.value.EndCreationTime = state.queryParams.scTime === null ? null : state.queryParams.scTime[1];
-	Reflect.deleteProperty(requestParams.value, 'scTime');
-	requestParams.value.StartTimeSt = state.queryParams.slTime === null ? null : state.queryParams.slTime[0];
-	requestParams.value.StartTimeEnd = state.queryParams.slTime === null ? null : state.queryParams.slTime[1];
-	Reflect.deleteProperty(requestParams.value, 'slTime');
+const totalCount = ref(0);
+const totalLoading = ref(false);
+const queryList = (isQuery: boolean = false) => {
+	requestParams.value = Other.deepClone(state.queryParams);
+	requestParams.value.CreationTimeStart = state.queryParams.crTime === null ? null : state.queryParams.crTime[0]; // 生成时间
+	requestParams.value.CreationTimeEnd = state.queryParams.crTime === null ? null : state.queryParams.crTime[1];
+	Reflect.deleteProperty(requestParams.value, 'crTime'); // 删除无用的参数
+	requestParams.value.ExpiredTimeStart = state.queryParams.exTime === null ? null : state.queryParams.exTime[0]; // 期满时间
+	requestParams.value.ExpiredTimeEnd = state.queryParams.exTime === null ? null : state.queryParams.exTime[1];
+	Reflect.deleteProperty(requestParams.value, 'exTime'); // 删除无用的参数
+	requestParams.value.ActualHandleTimeStart = state.queryParams.doneTime === null ? null : state.queryParams.doneTime[0]; // 办结时间
+	requestParams.value.ActualHandleTimeEnd = state.queryParams.doneTime === null ? null : state.queryParams.doneTime[1];
+	Reflect.deleteProperty(requestParams.value, 'doneTime'); // 删除无用的参数
+	requestParams.value.QueryIndex = queryIndex.value; // 数据批次
 	state.loading = true;
-	centerTodo(requestParams.value)
+	totalLoading.value = true;
+	orderListFixed(requestParams.value)
 		.then((response: any) => {
-			state.tableData = response?.result.items ?? [];
-
-			state.total = response?.result.total;
+			if (isQuery) {
+				// 如果是查询
+				totalTable.value = []; // 先清空
+				totalTable.value = response?.result;
+				state.total = totalTable.value.length;
+				state.tableData = getNeedArr(totalTable.value, state.queryParams.PageSize)[state.queryParams.PageIndex - 1]; //当前页的表格数据
+				queryIndex.value = 1; // 请求完成之后,页码加一避免重复
+			} else {
+				if (response?.result.length) queryIndex.value++;
+				totalTable.value = totalTable.value.concat(response?.result);
+				state.total = totalTable.value.length;
+				state.tableData = getNeedArr(totalTable.value, state.queryParams.PageSize)[state.queryParams.PageIndex - 1]; //当前页的表格数据
+			}
 			state.loading = false;
 		})
+		.then(() => {
+			// 查询总数
+			orderListCount(requestParams.value)
+				.then((count) => {
+					totalCount.value = count.result;
+					totalLoading.value = false;
+				})
+				.catch(() => {
+					totalLoading.value = false;
+				});
+		})
 		.catch(() => {
 			state.loading = false;
 		});
@@ -268,26 +466,20 @@ const drawer = ref(false);
 const resetQuery = (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	formEl.resetFields();
+	state.queryParams.IsSensitiveWord = null;
+	state.queryParams.IsProvinceOrder = null;
+	fastSearch.value = 'all';
+	queryIndex.value = 0;
 	ruleFormRef.value?.resetFields();
-	queryList();
+	state.ruleForm.content = null;
+	queryList(true);
 };
-// 签收工单
-const onSign = (row: any) => {
-	ElMessageBox.confirm(`您确定要要签收【${row.title}】,是否继续?`, '提示', {
-		confirmButtonText: '确认',
-		cancelButtonText: '取消',
-		type: 'warning',
-		draggable: true,
-		cancelButtonClass: 'default-button',
-		autofocus: false,
+// 修改记录
+const router = useRouter();
+const onRecord = () => {
+	router.push({
+		path:'/todo/edit/record'
 	})
-		.then(() => {
-			orderSign(row.id).then(() => {
-				ElMessage.success('签收成功');
-				queryList();
-			});
-		})
-		.catch(() => {});
 };
 // 编辑工单
 const onOrderEdit = (row: any) => {
@@ -299,36 +491,6 @@ const onOrderEdit = (row: any) => {
 		},
 	});
 };
-// 交办单导出
-const onJbExport = () => {
-	const ids = proTableRef.value.selectedList.map((item: any) => item.id);
-	ElMessageBox.confirm(`您确定导出选中的${proTableRef.value.selectedList.length}个工单的交办单,是否继续?`, '提示', {
-		confirmButtonText: '确认',
-		cancelButtonText: '取消',
-		type: 'warning',
-		draggable: true,
-		cancelButtonClass: 'default-button',
-		autofocus: false,
-	})
-		.then(() => {
-			state.loading = true;
-			exportJbOrder(ids)
-				.then((res: any) => {
-					downloadZip(res);
-					state.loading = false;
-					ElMessage.success('导出成功');
-				})
-				.catch(() => {
-					state.loading = false;
-				});
-		})
-		.catch(() => {});
-};
-// 平移功能
-const orderMigrationRef = ref<RefType>();
-const onMigration = (row: any) => {
-	orderMigrationRef.value.openDialog('centerTodo', row);
-};
 onMounted(() => {
 	getBaseData();
 	queryList();
@@ -336,10 +498,17 @@ onMounted(() => {
 onActivated(() => {
 	mittBus.on('clearCachePage', () => {
 		//清除缓存
-		queryList();
+		queryList(true);
 	});
 });
 onBeforeUnmount(() => {
 	mittBus.off('clearCachePage');
 });
-</script>
+</script>
+<style scoped lang="scss">
+.business-order-container {
+	:deep(.pro-table-main) {
+		height: calc(100% - 42px);
+	}
+}
+</style>

+ 161 - 0
src/views/todo/edit/record.vue

@@ -0,0 +1,161 @@
+<template>
+	<div class="business-publish-container layout-padding">
+		<div class="layout-padding-auto layout-padding-view pd20">
+			<ProTable
+				ref="proTableRef"
+				:columns="columns"
+				:data="state.tableData"
+				@updateTable="queryList"
+				:loading="state.loading"
+				:total="state.total"
+				v-model:page-index="state.queryParams.PageIndex"
+				v-model:page-size="state.queryParams.PageSize"
+			>
+				<template #table-search>
+					<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline>
+						<el-form-item label="工单标题" prop="Keyword">
+							<el-input v-model="state.queryParams.Keyword" placeholder="工单标题" clearable @keyup.enter="handleQuery" class="keyword-input" />
+						</el-form-item>
+						<el-form-item label="工单编码" prop="No">
+							<el-input v-model="state.queryParams.No" placeholder="工单编码" clearable @keyup.enter="handleQuery" class="keyword-input" />
+						</el-form-item>
+						<!--				<el-form-item label="处理结果" prop="Resolve">
+							<el-select v-model="state.queryParams.Resolve" placeholder="请选择处理结果" @change="handleQuery">
+								<el-option label="已得到解决" value="true" />
+								<el-option label="未得到解决" value="false" />
+							</el-select>
+						</el-form-item>-->
+						<el-form-item>
+							<el-button type="primary" @click="handleQuery" :loading="state.loading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
+							<el-button @click="resetQuery(ruleFormRef)" class="default-button" :loading="state.loading">
+								<SvgIcon name="ele-Refresh" class="mr5" />重置
+							</el-button>
+						</el-form-item>
+					</el-form>
+				</template>
+				<template #title="{ row }">
+					<order-detail :order="row.order" @updateList="queryList">{{ row.order?.title }}</order-detail>
+				</template>
+				<template #publishState="{ row }">
+					<span>{{ row.publishState ? '公开' : '不公开' }}</span>
+				</template>
+				<!-- 表格操作 -->
+				<template #operation="{ row }">
+					<el-button link type="primary" @click="onDetail(row)"  title="查看修改明细">
+						查看明细
+					</el-button>
+				</template>
+			</ProTable>
+		</div>
+		<!-- 工单发布详情 -->
+		<order-publish ref="orderPublishRef" @updateList="queryList" />
+		<!-- 工单发布修改 -->
+		<order-publish-edit ref="orderPublishEditRef" @updateList="queryList" />
+	</div>
+</template>
+<script setup lang="tsx" name="todoEditRecord">
+import { defineAsyncComponent, onMounted, reactive, ref } from 'vue';
+import { FormInstance } from 'element-plus';
+import { formatDate } from '@/utils/formatTime';
+import { publishedList } from '@/api/business/publish';
+// 引入组件
+const OrderPublish = defineAsyncComponent(() => import('@/views/business/publish/components/Order-publish.vue')); // 工单发布和查看详情
+const OrderPublishEdit = defineAsyncComponent(() => import('@/views/business/publish/components/Order-publish-edit.vue')); // 工单发布修改
+const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
+// 定义变量内容
+const ruleFormRef = ref<RefType>(); // 表单ref
+const proTableRef = ref<RefType>(); // 表格ref
+// 表格配置项
+const columns = ref<any[]>([
+	{ prop: 'order.no', label: '工单编码', minWidth: 140 },
+	{ prop: 'order.isProvinceText', label: '省/市工单', minWidth: 90 },
+	{ prop: 'order.title', label: '工单标题', minWidth: 200 },
+	{ prop: 'order.counterSignTypeText', label: '是否会签', minWidth: 90 },
+	{ prop: 'order.sourceChannel', label: '来源渠道', minWidth: 100 },
+	{ prop: 'order.statusText', label: '工单状态', minWidth: 100 },
+	{ prop: 'order.acceptType', label: '受理类型', minWidth: 100 },
+	{ prop: 'order.hotspotName', label: '热点分类', minWidth: 150 },
+	{ prop: 'order.acceptorName', label: '受理人', minWidth: 120 },
+	{ prop: 'order.actualHandleOrgName', label: '接办部门', minWidth: 140 },
+	{
+		prop: 'publishTime',
+		label: '发布时间',
+		minWidth: 160,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.publishTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{
+		prop: 'order.filedTime',
+		label: '办结时间',
+		minWidth: 160,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.order?.filedTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{ prop: 'publishMan', label: '发布人', minWidth: 120 },
+	{
+		prop: 'order.startTime',
+		label: '受理时间',
+		minWidth: 160,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.order?.startTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{
+		prop: 'lastModificationTime',
+		label: '更新时间',
+		minWidth: 160,
+		render: (scope) => {
+			return <span>{formatDate(scope.row.lastModificationTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
+		},
+	},
+	{ prop: 'publishState', label: '是否公开' },
+	{ prop: 'operation', label: '操作', fixed: 'right', minWidth: 90, align: 'center' },
+]);
+const state = reactive({
+	queryParams: {
+		// 查询条件
+		PageIndex: 1,
+		PageSize: 20,
+		Keyword: null, // 关键词
+		No: null,
+		Resolve: null, // 处理结果
+	},
+	tableData: [], //表单
+	loading: false, // 加载
+	total: 0, // 总数
+});
+// 手动查询,将页码设置为1
+const handleQuery = () => {
+	state.queryParams.PageIndex = 1;
+	queryList();
+};
+/** 获取列表 */
+const queryList = () => {
+	state.loading = true;
+	publishedList(state.queryParams)
+		.then((res: any) => {
+			state.tableData = res.result?.items ?? [];
+			state.total = res.result?.total ?? 0;
+			state.loading = false;
+		})
+		.catch((err: any) => {
+			state.loading = false;
+		});
+};
+/** 重置按钮操作 */
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	queryList();
+};
+// 查看明细
+const orderPublishEditRef = ref<RefType>(); // 工单发布修改ref
+const onDetail = (row: any) => {
+	orderPublishEditRef.value.openDialog(row);
+};
+onMounted(() => {
+	queryList();
+});
+</script>