Ver código fonte

reactor:对接工单重办和平均派单;

zhangchong 1 ano atrás
pai
commit
38212b6670

+ 6 - 27
src/api/business/redo.ts

@@ -3,43 +3,22 @@
  * @description 业务管理-工单重办
  */
 import request from '@/utils/request';
-/**
- * @description 工单重办列表
- * @param {object} params
- */
-export const redoList = (params: object) => {
-	return request({
-		url: `/api/v1/Order/redo`,
-		method: 'get',
-		params,
-	});
-};
-/**
- * @description 工单重办详情
- * @param id
- */
-export const redoDetail = (id: string) => {
-	return request({
-		url: `/api/v1/Order/redo/${id}`,
-		method: 'get',
-	});
-};
 /**
  * @description 工单重办基础信息
  */
-export const redoBaseData = () => {
+export const redoBaseData = (id: string) => {
 	return request({
-		url: `/api/v1/Order/base-data-redo`,
+		url: `/api/v1/Order/reTransact/base/${id}`,
 		method: 'get',
 	});
 };
 /**
- * @description 发起重办
- * @param {object} data
+ * @description 工单重办
+ * @param data 工单重办数据
  */
-export const redoApply = (data: object) => {
+export const redo = (data: any) => {
 	return request({
-		url: `/api/v1/Order/redo`,
+		url: '/api/v1/Order/re_transact',
 		method: 'post',
 		data,
 	});

+ 8 - 76
src/components/ProcessAudit/index.vue

@@ -135,48 +135,6 @@
 					</el-col>
 				</el-row>
 			</el-form>
-			<el-form :model="state.redoForm" label-width="110px" ref="redoFormRef" v-if="state.processType === '工单重办'">
-				<el-row :gutter="10">
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="工单编码"> {{ state.orderDetail.no }} </el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="工单标题"> {{ state.orderDetail.title }} </el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="申请人"> {{ userInfos.name }} </el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="申请部门"> {{ userInfos.orgName }} </el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="申请时间"> {{ dayjs(Date()).format('YYYY-MM-DD HH:mm:ss') }} </el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="重办理由" prop="orderRedoReason" :rules="[{ required: true, message: '请选择重办理由', trigger: 'change' }]">
-							<el-select v-model="state.redoForm.orderRedoReason" placeholder="请选择重办理由" clearable class="w100">
-								<el-option v-for="item in orderRedoReasonOptions" :value="item.key" :key="item.key" :label="item.value" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="重办意见" prop="redoOpinion" :rules="[{ required: true, message: '请填写重办意见', trigger: 'blur' }]">
-							<common-advice
-								@chooseAdvice="chooseAdviceRedo"
-								v-model="state.redoForm.redoOpinion"
-								placeholder="请填写重办意见"
-								:loading="state.loading"
-								:commonEnum="commonEnum.OrderCirculation"
-							/>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="附件">
-							<annex-list name="重办附件" v-model:format="handleFilesDiscern" :businessId="state.orderDetail.id" classify="重办上传" />
-						</el-form-item>
-					</el-col>
-				</el-row>
-			</el-form>
 		</div>
 
 		<el-form :model="state.ruleForm" label-width="110px" ref="ruleFormRef" v-show="activeStep === 1" v-loading="state.loading">
@@ -209,6 +167,7 @@
 								label="办理对象"
 								prop="nextHandlers"
 								:rules="[{ required: nextHandlersRequired, message: '请选择办理对象', trigger: 'change' }]"
+								v-if="!returnArr.includes(state.processType) && showHandlers"
 							>
 								<el-select-v2
 									v-model="state.ruleForm.nextHandlers"
@@ -464,10 +423,8 @@ import {
 	workflowPrevious,
 	workflowRecall,
 	workflowRecallParams,
-	workflowRedoParams,
 	workflowReject,
 } from '@/api/system/workflow';
-import { redoApply, redoBaseData } from '@/api/business/redo';
 import { delayApply, delayApproveParams, delayBaseData, delayCalcEndTime, workflowDelayParams } from '@/api/business/delay';
 import { discernApply, discernApproveParams, screenBaseData, workflowDiscernParams } from '@/api/business/discern';
 import { debounce } from '@/utils/tools';
@@ -481,6 +438,7 @@ import {
 } from '@/api/knowledge';
 import dayjs from 'dayjs';
 import { formatDate } from '@/utils/formatTime';
+import { useAppConfig } from '@/stores/appConfig';
 
 // 引入组件
 const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
@@ -533,13 +491,14 @@ const state = reactive<any>({
 const ruleFormRef = ref<RefType>(); //表单组件
 const storesUserInfo = useUserInfo();
 const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
-const showStepsArr = ['延期申请', '甄别申请', '工单重办']; // 显示步骤条的流程
+const showStepsArr = ['延期申请', '甄别申请']; // 显示步骤条的流程
 const handelArr = ['工单办理']; // 处于办理状态的流程 (如果是汇总节点 需要填写办理对象等  办理流程才有期满时间)
 const returnArr = ['工单退回', '甄别退回', '延期退回']; // 退回流程 (退回流程不需要展示其他 只需要填写意见和附件即可)
 const auditArr = ['甄别审批', '延期审批', '知识审批']; // 审批流程 (审批流程需要选择是否通过和下一环节)
+const appConfigStore = useAppConfig();
+const { AppConfigInfo } = storeToRefs(appConfigStore); // 系统配置信息
 
 const timeType = ref<EmptyArrayType>([]); // 延期申请单位
-const orderRedoReasonOptions = ref<EmptyArrayType>([]); // 重办理由
 const screenTypeOptions = ref<EmptyArrayType>([]); // 甄别类型
 
 // 打开弹窗
@@ -580,11 +539,6 @@ const openDialog = async (val: any) => {
 				screenTypeOptions.value = responseDiscern.result?.screenType ?? []; // 甄别理由
 				handleResult(workflowDiscernResponse);
 				break;
-			case '工单重办': // 工单重办
-				const [workflowRedoResponse, responseRedo] = await Promise.all([workflowRedoParams(state.workflowId), redoBaseData()]); //获取开启流程参数
-				orderRedoReasonOptions.value = responseRedo.result?.orderRedoReasonOptions ?? []; // 重办理由
-				handleResult(workflowRedoResponse);
-				break;
 			case '工单退回': // 退回流程
 				break;
 			case '甄别退回': // 退回流程
@@ -678,12 +632,6 @@ const onNext = () => {
 				activeStep.value = 1;
 			});
 			break;
-		case '工单重办':
-			redoFormRef.value?.validate((valid: boolean) => {
-				if (!valid) return;
-				activeStep.value = 1;
-			});
-			break;
 		default: // 默认下一流程
 			activeStep.value = 1;
 			break;
@@ -751,11 +699,12 @@ const changeStartCountersign = (val: boolean) => {
 	}
 };
 
-// 是否展示办理对象 (只有结束节点不展示 next.stepType===2 表示为结束节点)
+// 是否展示办理对象 (结束节点不展示: next.stepType===2 表示为结束节点,下一环节为派单组时 next.businessType === 1,办理对象下拉框隐藏:AppConfigInfo.value.isAverageSendOrder= true 表示开启了平均派单 )
 const showHandlers = computed(() => {
 	const next = state.nextStepOptions.find((item: any) => item.key === state.ruleForm.nextStepCode);
+	const isAverageSendOrder = AppConfigInfo.value.isAverageSendOrder && next?.businessType === 1; // 开启平均派单并且下一个环节是派单组
 	if (!next) return true;
-	return next.stepType !== 2;
+	return next?.stepType !== 2 && !isAverageSendOrder;
 });
 // 是否是汇总节点(汇总需要填入其他参数)并且是工单办理
 const inputRealHandler = computed(() => {
@@ -1103,23 +1052,6 @@ const onSubmit = (formEl: FormInstance | undefined) => {
 								});
 						}
 						break;
-					case '工单重办':
-						const requestRedo = {
-							data: {
-								orderId: state.orderDetail.id,
-								orderRedoReason: state.redoForm.orderRedoReason,
-								redoOpinion: state.redoForm.redoOpinion,
-							},
-							workflow: { ...submitObj, files: handleFiles.value },
-						};
-						redoApply(requestRedo)
-							.then(() => {
-								afterSubmit('orderProcessSuccess', true);
-							})
-							.catch(() => {
-								afterSubmit('orderProcessFailed');
-							});
-						break;
 					case '工单退回':
 						orderPrevious({ ...submitObj, files: handleFiles.value })
 							.then(() => {

+ 2 - 1
src/router/backEnd.ts

@@ -59,11 +59,12 @@ const getAppConfigFn = async () => {
 			isTelNeedVerify: result.isTelNeedVerify ?? false, //分机签入是否需要输入密码
 			isCustomEvent: result.isCustomEvent ?? false, //是否开启自定义事件
 			isTranspondCity: result.isTranspondCity ?? false, //是否开启市州互转
+			isAverageSendOrder: result.isAverageSendOrder ?? false, //是否开启平均派单
 		});
 		console.log(
 			`是否开启小休审批${result.isRestApproval},自动话后整理时间${result.talkingDealTime}秒,
 			分机签入是否需要选择号码${result.isNeedTelNo},分机签入是否需要输入密码${result.isTelNeedVerify},
-			是否开启自定义事件${result.isCustomEvent},是否开启市州互转${result.isTranspondCity}`
+			是否开启自定义事件${result.isCustomEvent},是否开启市州互转${result.isTranspondCity},是否开启平均派单${result.isAverageSendOrder}`
 		);
 	} catch (e) {
 		console.log(e);

+ 1 - 0
src/stores/appConfig.ts

@@ -13,6 +13,7 @@ export const useAppConfig = defineStore('AppConfig', {
 			isTelNeedVerify: false, // 分机签入是否需要输入密码
 			isCustomEvent: false, // 是否开启自定义事件
 			isTranspondCity:false, // 是否开启市州互转
+			isAverageSendOrder:false, // 是否开启平均派单
 		},
 	}),
 	actions: {

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

@@ -106,6 +106,7 @@ declare interface AppConfigState {
 		isTelNeedVerify: boolean; // 分机签入是否需要输入密码
 		isCustomEvent: boolean; // 是否开启自定义事件
 		isTranspondCity: boolean; // 是否开启市州互转
+		isAverageSendOrder: boolean; // 是否开启平均派单
 		[x: string]: any
 	}
 }

+ 3 - 0
src/views/business/order/index.vue

@@ -514,6 +514,9 @@ const columns = ref<any[]>([
 	{ prop: 'hotspotName', label: '热点分类', width: 200 },
 	{ prop: 'tagNames', label: '工单标签', width: 200 },
 	{ prop: 'employeeName', label: '受理人', width: 120 },
+  { prop: 'reTransactNum', label: '重办次数',render: (scope) => {
+      return <span>{scope.row.reTransactNum ? scope.row.reTransactNum : 0}</span>;
+    }},
 	{ prop: 'operation', label: '操作', fixed: 'right', width: 180, align: 'center' },
 ]);
 // 获取选择组织name值

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

@@ -99,14 +99,14 @@
 							</el-radio-group>
 						</el-form-item>
 					</el-col>
-<!--          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-            <el-form-item label="门户是否公开" prop="publishState" >
-              <el-radio-group v-model="state.ruleForm.publishState" disabled>
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+            <el-form-item label="门户是否公开" prop="resolve" >
+              <el-radio-group v-model="state.ruleForm.resolve" disabled>
                 <el-radio :label="true">已得到解决</el-radio>
                 <el-radio :label="false">未得到解决</el-radio>
               </el-radio-group>
             </el-form-item>
-          </el-col>-->
+          </el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-form-item label="实际办理部门">
 							{{ state.publishDetail.actualHandleOrgName?.value }}

+ 27 - 18
src/views/business/publish/component/Order-publish.vue

@@ -17,13 +17,7 @@
 								</el-form-item>
 							</el-col>
 							<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-								<el-form-item
-									label="反馈人电话"
-									prop="feedBackPhone"
-									:rules="[
-										{ required: false, message: '请输入反馈人电话', trigger: 'blur' },
-									]"
-								>
+								<el-form-item label="反馈人电话" prop="feedBackPhone" :rules="[{ required: false, message: '请输入反馈人电话', trigger: 'blur' }]">
 									<el-input placeholder="请输入反馈人电话" v-model="state.ruleForm.feedBackPhone" clearable :disabled="disabled"></el-input>
 								</el-form-item>
 							</el-col>
@@ -127,21 +121,21 @@
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="门户是否公开" prop="publishState" >
+						<el-form-item label="门户是否公开" prop="publishState">
 							<el-radio-group v-model="state.ruleForm.publishState" :disabled="disabled">
 								<el-radio :label="false">不公开</el-radio>
 								<el-radio :label="true">公开</el-radio>
 							</el-radio-group>
 						</el-form-item>
 					</el-col>
-<!--          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-            <el-form-item label="处理结果" prop="publishState">
-              <el-radio-group v-model="state.ruleForm.publishState" :disabled="disabled">
-                <el-radio :label="true">已得到解决</el-radio>
-                <el-radio :label="false">未得到解决</el-radio>
-              </el-radio-group>
-            </el-form-item>
-          </el-col>-->
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="处理结果" prop="resolve" :rules="[{ required: true, message: '请选择处理结果', trigger: 'change' }]">
+							<el-radio-group v-model="state.ruleForm.resolve" :disabled="disabled">
+								<el-radio :label="true">已得到解决</el-radio>
+								<el-radio :label="false">未得到解决</el-radio>
+							</el-radio-group>
+						</el-form-item>
+					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-form-item label="实际办理部门">
 							{{ state.publishDetail.actualHandleOrgName?.value }}
@@ -160,17 +154,21 @@
 		<template #footer v-if="!disabled">
 			<span class="dialog-footer">
 				<el-button @click="closeDialog" class="default-button">取 消</el-button>
+				<el-button type="primary" @click="redo" title="重办工单"> 重办 </el-button>
 				<el-button type="primary" @click="onPublish(ruleFormRef)" v-if="!disabled" :loading="state.loading">发布</el-button>
 			</span>
 		</template>
 	</el-dialog>
+	<!-- 工单重办详情 -->
+	<order-redo ref="orderRedoRef" @updateList="updateList" />
 </template>
 <script setup lang="ts" name="orderPublishDetail">
-import { computed, reactive, ref } from 'vue';
-import { ElMessage, FormInstance } from 'element-plus';
+import { computed, reactive, ref, defineAsyncComponent } from 'vue';
+import { ElButton, ElMessage, FormInstance } from 'element-plus';
 import { baseData, publishOrderDetail } from '@/api/business/publish';
 import { publishOrder } from '@/api/todo/publish';
 
+const OrderRedo = defineAsyncComponent(() => import('@/views/business/publish/component/Order-redo.vue')); // 重办
 // 定义子组件向父组件传值/事件
 const emit = defineEmits(['updateList']);
 // 定义变量内容
@@ -187,6 +185,7 @@ const state = reactive<any>({
 		arrangeOpinion: '', // 整改后结果
 		idNames: [], // 需回访部门
 		publishState: false, // 门户是否公开
+		resolve: null, // 处理结果
 	},
 	orderDetail: {}, // 工单详情
 	publishDetail: {}, // 发布详情
@@ -278,6 +277,16 @@ const onPublish = (formEl: FormInstance | undefined) => {
 			});
 	});
 };
+// 重办
+const orderRedoRef = ref<RefType>(); // 工单重办ref
+const redo = () => {
+	orderRedoRef.value.openDialog(state.orderDetail);
+};
+// 重办成功
+const updateList = () => {
+	closeDialog();
+	emit('updateList');
+};
 defineExpose({
 	openDialog,
 	closeDialog,

+ 93 - 81
src/views/business/publish/component/Order-redo.vue

@@ -1,20 +1,20 @@
 <template>
 	<el-dialog v-model="state.dialogVisible" draggable title="工单重办" width="50%" append-to-body destroy-on-close @close="close">
 		<div class="collapse-container">
-			<el-form label-width="110px" ref="ruleFormRef" :model="state.ruleForm">
+			<el-form ref="ruleFormRef" :model="state.ruleForm">
 				<el-row :gutter="35">
 					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
 						<el-form-item label="退回节点" prop="nextStepCode" :rules="[{ required: true, message: '请选退回节点', trigger: 'change' }]">
-							<el-select v-model="state.ruleForm.nextStepCode" placeholder="请选退回节点" class="w100" @change="selectTrace">
+							<el-select v-model="state.ruleForm.nextStepCode" placeholder="请选退回节点" class="w100" @change="selectNextCode">
 								<el-option v-for="item in steps" :value="item.key" :key="item.key" :label="item.value"> </el-option>
 							</el-select>
 						</el-form-item>
 					</el-col>
-					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" v-if="state.ruleForm.nextStepCode">
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="state.ruleForm.nextStepCode">
 						<el-form-item label="办理对象" prop="nextHandlers" :rules="[{ required: true, message: '请选择办理对象', trigger: 'change' }]">
 							<el-select-v2
 								v-model="state.ruleForm.nextHandlers"
-								:options="stepsItems"
+								:options="handlerOptions"
 								placeholder="请选择办理对象"
 								class="w100"
 								multiple
@@ -27,46 +27,45 @@
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
-						<el-form-item label="延期" prop="timeLimitCount" :rules="[{ required: false, message: '请输入延期申请数量', trigger: 'blur' }]">
+						<el-form-item
+							label="延期"
+							label-width="76px"
+							prop="timeLimit"
+							:rules="[{ required: false, message: '请输入延期申请数量', trigger: 'blur' }]"
+						>
 							<el-row :gutter="10">
-								<el-col :xs="24" :sm="12" :md="12" :lg="14" :xl="18">
+								<el-col :xs="24" :sm="12" :md="12" :lg="16" :xl="16">
 									<el-select
-										v-model="state.ruleForm.timeLimitCount"
+										v-model="state.ruleForm.timeLimit"
 										placeholder="请选择"
 										class="w100"
 										:rules="[{ required: true, message: '请选择延期数量', trigger: 'change' }]"
+										clearable
 									>
 										<el-option v-for="item in delayOptions" :value="item.value" :key="item.value" :label="item.label" />
 									</el-select>
 								</el-col>
-								<el-col :xs="24" :sm="12" :md="12" :lg="10" :xl="6"> 工作日 </el-col>
+								<el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
+									<el-form-item label="" prop="timeLimitUnit" :rules="[{ required: true, message: '请选择延期申请单位', trigger: 'change' }]">
+										<el-select v-model="state.ruleForm.timeLimitUnit" placeholder="延期申请单位" class="w100" disabled>
+											<el-option v-for="item in timeType" :value="item.key" :key="item.key" :label="item.value" />
+										</el-select>
+									</el-form-item>
+								</el-col>
 							</el-row>
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="错件类别" prop="timeLimitCount" :rules="[{ required: true, message: '请选择错件类别', trigger: 'change' }]">
+						<el-form-item label="错件类别" :rules="[{ required: false, message: '请选择错件类别', trigger: 'change' }]">
 							<el-row>
-								<el-col :span="24" v-for="(item, index) in state.ruleForm.visitDetails" :key="item.id" class="mb18">
-									<el-form-item
-										:prop="`visitDetails.${index}.orgHandledAttitude`"
-										:rules="[{ required: true, message: '请选择错件类别', trigger: 'change' }]"
-									>
+								<el-text type="danger"> 注意:勾选后还需要选择类型</el-text>
+								<el-col :span="24" v-for="(item, index) in state.ruleForm.orgs" :key="item.id" class="mb18">
+									<el-form-item :prop="`orgs.${index}.reason`" :rules="[{ required: item.choose, message: '请选择错件类别', trigger: 'change' }]">
 										<template #label>
-											{{ item.name }}
+											<el-checkbox v-model="item.choose"> {{ item.value }}</el-checkbox>
 										</template>
-										<el-select
-											v-model="item.orgHandledAttitude"
-											placeholder="请选择错件类别"
-											class="w100"
-											value-key="value"
-											@change="
-												(val) => {
-													item.orgHandledAttitude.value = val.label;
-													item.orgHandledAttitude.key = val.value;
-												}
-											"
-										>
-											<el-option v-for="items in reasonOptions" :key="items.value" :label="items.label" :value="items" />
+										<el-select v-model="item.reason" placeholder="请选择错件类别" class="w100" value-key="dicDataValue">
+											<el-option v-for="items in reTransactErrorType" :key="items.dicDataValue" :label="items.dicDataName" :value="items" />
 										</el-select>
 									</el-form-item>
 								</el-col>
@@ -74,8 +73,13 @@
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="重办意见" prop="reason" :rules="[{ required: true, message: '请填写重办意见', trigger: 'blur' }]">
-							<el-input v-model="state.ruleForm.reason" type="textarea" :autosize="{ minRows: 6, maxRows: 10 }" placeholder="请填写重办意见" />
+						<el-form-item label="退回意见" prop="reason" :rules="[{ required: true, message: '请填写退回意见', trigger: 'blur' }]">
+							<common-advice
+								@chooseAdvice="chooseAdvice"
+								v-model="state.ruleForm.reason"
+								placeholder="请填写退回意见"
+								:commonEnum="commonEnum.Seat"
+							/>
 						</el-form-item>
 					</el-col>
 				</el-row>
@@ -89,15 +93,15 @@
 		</template>
 	</el-dialog>
 </template>
+orgs
 <script setup lang="ts" name="SpecialDialog">
-import { reactive, ref } from 'vue';
+import { reactive, ref, defineAsyncComponent } from 'vue';
 import { ElMessage, FormInstance } from 'element-plus';
-import { storeToRefs } from 'pinia';
-import { useUserInfo } from '@/stores/userInfo';
-import { specialApplyBase, specialApply } from '@/api/business/special';
+import { redoBaseData, redo } from '@/api/business/redo';
+import { commonEnum } from '@/utils/constants';
 
 // 引入组件
-
+const CommonAdvice = defineAsyncComponent(() => import('@/components/CommonAdvice/index.vue')); // 常用意见
 // 定义子组件向父组件传值/事件
 const emit = defineEmits(['updateList']);
 // 定义变量内容
@@ -105,45 +109,25 @@ const state = reactive<any>({
 	dialogVisible: false, // 是否显示弹窗
 	loading: false, // 是否显示加载
 	ruleForm: {
-		nextStepCode: null, // 特提节点
-		cause: null, // 特提原因
-		reason: null, // 特提理由
-		nextHandlers: [], // 处理对象
-		visitDetails: [
-			{
-				name: '热线中心',
-				orgNoSatisfiedReason: null,
-			},
-			{
-				name: '一级部门',
-				orgNoSatisfiedReason: null,
-			},
-		],
+		nextStepCode: null, // 退回节点
+		reason: '', // 退回理由
+		timeLimitUnit: 2,
+		timeLimit: null,
+		orgs: [],
+		nextHandlers: [],
 	},
 	orderDetail: {}, // 工单详情
-	workflowId: null, // 工作流id
 });
 const ruleFormRef = ref<RefType>();
-const storesUserInfo = useUserInfo();
-const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
-const specialReason = ref<EmptyArrayType>([]); // 特提理由
-const steps = ref<EmptyArrayType>([]); // 特提节点
-const stepsItems = ref<EmptyArrayType>([]); // 处理对象
+const steps = ref<EmptyArrayType>([]); // 退回节点
+const timeType = ref([]); // 时间单位
+const reTransactErrorType = ref<EmptyArrayType>([]); // 错件类别
+const handlerOptions = ref<EmptyArrayType>([]); // 办理对象
 const delayOptions = ref([
 	{ value: 1, label: '1' },
 	{ value: 3, label: '3' },
 	{ value: 5, label: '5' },
 ]); // 延期
-const reasonOptions = ref<EmptyArrayType>([
-	{
-		label: 'A:不录,烧录,录入错误',
-		id: 1,
-	},
-	{
-		label: 'B:错误退回',
-		id: 2,
-	},
-]); // 错件原因
 /**
  * @description 打开弹窗
  * @param {object} val 工单详情
@@ -154,9 +138,11 @@ const openDialog = async (val: any) => {
 	state.loading = true;
 	state.dialogVisible = true;
 	try {
-		const [baseRes] = await Promise.all([specialApplyBase(val.workflowId)]);
+		const baseRes = await redoBaseData(val.id);
+		timeType.value = baseRes.result?.specialTimeType ?? [];
 		steps.value = baseRes.result?.step?.steps ?? [];
-		specialReason.value = baseRes.result.specialReason ?? [];
+		reTransactErrorType.value = baseRes.result?.reTransactErrorType ?? [];
+		state.ruleForm.orgs = baseRes.result?.orgs ?? [];
 	} catch (e) {
 		console.log(e);
 	} finally {
@@ -171,15 +157,17 @@ const close = () => {
 	ruleFormRef.value?.clearValidate();
 	ruleFormRef.value?.resetFields();
 	steps.value = [];
-	stepsItems.value = [];
 };
-// 选择节点确定办理对象
-const selectTrace = (val: any) => {
-	const step = steps.value.find((item) => item.key === val);
-	state.ruleForm.nextStepName = step?.value;
+// 选择退回节点
+const selectNextCode = (val: any) => {
 	ruleFormRef.value?.resetFields('nextHandlers');
-	stepsItems.value = step?.items ?? [];
-	stepsItems.value = stepsItems.value.map((item: any) => {
+	ruleFormRef.value?.resetFields('nextMainHandler');
+	const next = steps.value.find((item: any) => item.key === val);
+	const items = next.items; //获取下一节点
+	state.ruleForm.nextStepName = next.value; // 下一节点name
+
+	handlerOptions.value = items ?? [];
+	handlerOptions.value = handlerOptions.value.map((item: any) => {
 		return {
 			value: {
 				...item,
@@ -187,32 +175,56 @@ const selectTrace = (val: any) => {
 			label: item.value,
 		};
 	});
+
+	if (items.length === 1) {
+		// 如果办理对象只有一个默认选中
+		state.ruleForm.nextHandlers = [items[0]];
+	}
 };
 // 提交
-const filesFormat = ref<EmptyArrayType>([]); // 附件列表
 const onSubmit = (formEl: FormInstance | undefined) => {
 	if (!formEl) return;
 	formEl.validate((valid: boolean) => {
 		if (!valid) return;
 		state.loading = true;
-		let request = {
-			...state.ruleForm,
-			workflowId: state.workflowId,
+		const reTransactError = state.ruleForm.orgs
+			.filter((item: any) => item.choose)
+			.map((item: any) => {
+				return {
+					orgId: item.key,
+					orgName: item.value,
+					errorId: item.reason.dicDataValue,
+					errorName: item.reason.dicDataName,
+				};
+			});
+		const request = {
+			workflowId: state.orderDetail.workflowId,
 			orderId: state.orderDetail.id,
-			files: filesFormat.value,
+			nextStepCode: state.ruleForm.nextStepCode,
+			nextStepName: state.ruleForm.nextStepName,
+			nextHandlers: state.ruleForm.nextHandlers,
+			reason: state.ruleForm.reason,
+			timeLimit: state.ruleForm.timeLimit,
+			timeLimitUnit: state.ruleForm.timeLimitUnit,
+			alterTime: !!state.ruleForm.timeLimit,
+			reTransactError,
 		};
-		specialApply(request)
+		redo(request)
 			.then(() => {
 				state.loading = false;
 				closeDialog();
 				emit('updateList');
-				ElMessage.success('特提申请成功');
+				ElMessage.success('重办成功');
 			})
 			.catch(() => {
 				state.loading = false;
 			});
 	});
 };
+// 选中常用意见
+const chooseAdvice = (item: any) => {
+	state.ruleForm.reason += item.content;
+};
 defineExpose({
 	openDialog,
 	closeDialog,

+ 8 - 5
src/views/business/publish/index.vue

@@ -6,6 +6,12 @@
 				<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="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)" v-waves class="default-button" :loading="state.loading">
@@ -66,13 +72,9 @@ const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/
 // 定义变量内容
 const ruleFormRef = ref<RefType>(); // 表单ref
 const proTableRef = ref<RefType>(); // 表格ref
-const selectable = (row: any) => {
-	//设置省工单不可选(不可批量发布)
-	return !row.isProvince;
-};
 // 表格配置项
 const columns = ref<any[]>([
-	{ type: 'selection', selectable: selectable, fixed: 'left', width: 55 },
+	{ type: 'selection', fixed: 'left', width: 55 },
 	{ prop: 'order.no', label: '工单编码', width: 150 },
 	{ prop: 'isProvince', label: '省/市工单', width: 100 },
 	{ prop: 'title', label: '工单标题', width: 300 },
@@ -125,6 +127,7 @@ const state = reactive({
 		PageIndex: 1,
 		PageSize: 10,
 		Keyword: null, // 关键词
+		Resolve: null, // 处理结果
 	},
 	tableData: [], //表单
 	loading: false, // 加载

+ 1 - 10
src/views/business/publish/todo.vue

@@ -56,15 +56,12 @@
 				<!-- 表格操作 -->
 				<template #operation="{ row }">
 					<el-button link type="primary" @click="publish(row)" title="发布工单" v-auth="'business:publish:todo:publish'"> 发布 </el-button>
-<!--					<el-button link type="primary" @click="redo(row)" title="重办工单" v-auth="'business:publish:todo:publish'"> 重办 </el-button>-->
 					<order-detail :order="row" @updateList="queryList" />
 				</template>
 			</ProTable>
 		</el-card>
 		<!-- 工单发布详情 -->
 		<order-publish ref="orderPublishRef" @updateList="queryList" />
-		<!-- 工单重办详情 -->
-		<order-redo ref="orderRedoRef" @updateList="queryList" />
 	</div>
 </template>
 <script setup lang="tsx" name="businessPublishTodo">
@@ -75,7 +72,6 @@ import { batchPublishOrder, publishList } from '@/api/todo/publish';
 // 引入组件
 const OrderPublish = defineAsyncComponent(() => import('@/views/business/publish/component/Order-publish.vue')); // 发布
 const OrderDetail = defineAsyncComponent(() => import('@/components/OrderDetail/index.vue')); // 工单详情
-const OrderRedo = defineAsyncComponent(() => import('@/views/business/publish/component/Order-redo.vue')); // 重办
 // 定义变量内容
 const ruleFormRef = ref<RefType>(); // 表单ref
 const state = reactive({
@@ -132,7 +128,7 @@ const columns = ref<any[]>([
 			return <span>{formatDate(scope.row.filedTime, 'YYYY-mm-dd HH:MM:SS')}</span>;
 		},
 	},
-	{ prop: 'operation', label: '操作', fixed: 'right', width: 180, align: 'center' },
+	{ prop: 'operation', label: '操作', fixed: 'right', width: 140, align: 'center' },
 ]);
 // 手动查询,将页码设置为1
 const handleQuery = () => {
@@ -183,11 +179,6 @@ const orderPublishRef = ref<RefType>(); // 工单发布详情ref
 const publish = (row: any) => {
 	orderPublishRef.value.openDialog(row);
 };
-// 重办
-const orderRedoRef = ref<RefType>(); // 工单重办ref
-const redo = (row: any) => {
-	orderRedoRef.value.openDialog(row);
-};
 onMounted(() => {
 	queryList();
 });

+ 1 - 4
src/views/statistics/center/detailEventFrequently.vue

@@ -35,7 +35,7 @@
 					<transition name="el-zoom-in-top">
 						<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" v-show="!searchCol">
 							<el-form-item label="工单状态" prop="Statuses">
-								<el-select v-model="state.queryParams.Statuses" placeholder="请选择工单状态" clearable class="w100" multiple @change="handleQuery">
+								<el-select v-model="state.queryParams.Statuses" placeholder="请选择工单状态" clearable class="w100" multiple>
 									<el-option v-for="item in state.orderStatusOptions" :value="item.key" :key="item.key" :label="item.value" />
 								</el-select>
 							</el-form-item>
@@ -53,7 +53,6 @@
 									collapse-tags
 									collapse-tags-tooltip
 									:max-collapse-tags="2"
-									@change="handleQuery"
 								>
 									<el-option v-for="item in state.channelOptions" :value="item.dicDataValue" :key="item.dicDataValue" :label="item.dicDataName" />
 								</el-select>
@@ -98,7 +97,6 @@
 									clearable
 									class="w100"
 									multiple
-									@change="handleQuery"
 								>
 									<el-option v-for="item in state.emergencyLevelOptions" :value="item.key" :key="item.key" :label="item.value" />
 								</el-select>
@@ -370,7 +368,6 @@ const cascadeRef = ref<RefType>();
 const changeOrg = () => {
 	let currentNode = cascadeRef.value.getCheckedNodes();
 	state.queryParams.orgCode = currentNode[0]?.data.orgCode ?? '';
-	handleQuery();
 };
 // 展开/收起
 const closeSearch = () => {

+ 7 - 0
src/views/todo/order/index.vue

@@ -134,6 +134,13 @@ const columns = ref<any[]>([
 	{ prop: 'sourceChannel', label: '来源方式', width: 100 },
 	{ prop: 'hotspotName', label: '热点分类', width: 200 },
 	{ prop: 'employeeName', label: '受理人', width: 120 },
+	{
+		prop: 'reTransactNum',
+		label: '重办次数',
+		render: (scope) => {
+			return <span>{scope.row.reTransactNum ? scope.row.reTransactNum : 0}</span>;
+		},
+	},
 	{ prop: 'operation', label: '操作', fixed: 'right', width: 100, align: 'center' },
 ]);
 // 手动查询,将页码设置为1

+ 7 - 0
src/views/todo/seats/index.vue

@@ -133,6 +133,13 @@ const columns = ref<any[]>([
 	{ prop: 'sourceChannel', label: '来源方式', width: 100 },
 	{ prop: 'hotspotName', label: '热点分类', width: 200 },
 	{ prop: 'employeeName', label: '受理人', width: 120 },
+	{
+		prop: 'reTransactNum',
+		label: '重办次数',
+		render: (scope) => {
+			return <span>{scope.row.reTransactNum ? scope.row.reTransactNum : 0}</span>;
+		},
+	},
 	{ prop: 'operation', label: '操作', fixed: 'right', width: 140, align: 'center' },
 ]);
 // 手动查询,将页码设置为1