瀏覽代碼

reactor:延期调整;

zhangchong 1 月之前
父節點
當前提交
ef40cbeb85

+ 19 - 8
src/views/business/delay/audit.vue

@@ -105,15 +105,26 @@
 							{{ formatDate(row.beforeDelay, 'YYYY-mm-dd HH:MM:SS') }}
 						</template>
 					</vxe-column>
-					<vxe-column field="afterDelay" title="通过后期满时间" width="160">
+<!--					<vxe-column field="afterDelay" title="通过后期满时间" width="160">
 						<template #default="{ row }">
 							{{ formatDate(row.afterDelay, 'YYYY-mm-dd HH:MM:SS') }}
 						</template>
-					</vxe-column>
-					<vxe-column title="操作" fixed="right" width="130" align="center" :show-overflow="false">
+					</vxe-column>-->
+					<vxe-column title="操作" fixed="right" width="100" align="center" :show-overflow="false">
 						<template #default="{ row }">
-							<el-button link type="primary" @click="onDetail(row)" title="延期详情"> 延期详情 </el-button>
-							<!--							<el-button link type="primary" @click="onAudit(row)" title="审批" v-auth="'business:delay:audit:todo'"> 审批 </el-button>-->
+							<el-button link type="primary" @click="onDetail(row)" title="延期详情" v-if="state.queryParams.IsApply === 'true'">
+								延期详情
+							</el-button>
+							<el-button
+								link
+								type="primary"
+								@click="onAudit(row)"
+								title="审批"
+								v-auth="'business:delay:audit:todo'"
+								v-if="state.queryParams.IsApply === 'false'"
+							>
+								审批
+							</el-button>
 						</template>
 					</vxe-column>
 				</vxe-table>
@@ -175,8 +186,8 @@ const requestParams = ref<EmptyObjectType>({});
 const queryList = () => {
 	state.loading = true;
 	requestParams.value = Other.deepClone(state.queryParams);
-  requestParams.value.IsApply = state.queryParams.IsApply === 'true';
-  delayList(requestParams.value)
+	requestParams.value.IsApply = state.queryParams.IsApply === 'true';
+	delayList(requestParams.value)
 		.then((res: any) => {
 			state.tableData = res.result?.items ?? [];
 			state.total = res.result?.total ?? 0;
@@ -223,7 +234,7 @@ const selectChangeEvent = ({ checked }) => {
 	}
 };
 const isChecked = computed(() => {
-	return !Boolean(checkTable.value.length);
+	return !checkTable.value.length;
 });
 // 延期审批
 const delayAuditRef = ref<RefType>();

+ 18 - 11
src/views/business/delay/components/Delay-apply.vue

@@ -32,7 +32,7 @@
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 						<el-form-item label="当前期满时间"> {{ formatDate(state.orderDetail.expiredTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
 					</el-col>
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="showHandlers">
 						<el-form-item label="下一环节" prop="nextStepCode" :rules="[{ required: true, message: '请选择下一环节', trigger: 'change' }]">
 							<el-select v-model="state.delayForm.nextStepCode" placeholder="请选择下一环节" class="w100" @change="selectNextStep">
 								<el-option v-for="item in state.nextStepOptions" :key="item.key" :label="item.value" :value="item.key" />
@@ -62,20 +62,20 @@
 						</el-form-item>
 					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="12" v-loading="state.loading">
-						<el-form-item prop="timeLimitCount" :rules="[{ required: true, message: '请填写延期申请数', trigger: 'blur' }]" label-width="130px">
+						<el-form-item prop="timeLimitCount" :rules="[{ required: true, message: '请填写延期申请数', trigger: 'blur' }]" label-width="130px">
 							<template #label>
 								<div style="height: 34px; display: flex; align-items: center">
-									延期申请数
+									延期申请
 									<el-tooltip placement="top-start">
 										<SvgIcon name="ele-QuestionFilled" size="18px" class="ml3" />
-										<template #content> 延期申请数为1-{{ AppConfigInfo.applyDelayTime }} </template>
+										<template #content>延期申请数为1-{{ AppConfigInfo.applyDelayTime }} </template>
 									</el-tooltip>
 								</div>
 							</template>
 							<el-row :gutter="10" class="w100">
 								<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 									<el-input-number
-										placeholder="延期申请数"
+										placeholder="延期申请数"
 										v-model="state.delayForm.timeLimitCount"
 										controls-position="right"
 										class="w100"
@@ -170,7 +170,7 @@ const state = reactive<any>({
 		isSms: false, // 是否短信通知
 		isStartCountersign: false, // 是否发起会签
 		stepId: '',
-		timeLimitCount: null, // 延期申请数
+		timeLimitCount: null, // 延期申请
 		timeLimitUnit: 2, // 延期申请单位 默认工作日
 	},
 	nextStepOptions: [], // 下一节点
@@ -203,7 +203,14 @@ const canStartCountersign = ref<boolean>(false); // 是否可以发起会签
 const handleResult = (res: any) => {
 	state.nextStepOptions = res.result.steps; //办理对象选择内容
 	canStartCountersign.value = res.result.canStartCountersign ?? false; // 是否可以发起会签
-	if (state.nextStepOptions.length === 1) {
+	// 默认选中第一个
+	setTimeout(() => {
+		state.delayForm.nextStepCode = state.nextStepOptions[0].key; // 下一节点code
+		state.delayForm.nextStepName = state.nextStepOptions[0].value; // 下一节点name
+		state.delayForm.backToCountersignEnd = state.nextStepOptions[0].backToCountersignEnd ?? false; // 是否回到会签结束节点
+	}, 0);
+	selectNextStep(state.nextStepOptions[0].key); // 查询流程下一节点参数
+	/*	if (state.nextStepOptions.length === 1) {
 		// 下一节点是否只有一个 默认选中第一个
 		setTimeout(() => {
 			state.delayForm.nextStepCode = state.nextStepOptions[0].key; // 下一节点code
@@ -214,7 +221,7 @@ const handleResult = (res: any) => {
 	} else {
 		state.delayForm.nextStepCode = '';
 		state.delayForm.nextStepName = '';
-	}
+	}*/
 	state.delayForm.stepId = res.result.stepId;
 	state.loading = false;
 };
@@ -250,7 +257,6 @@ const selectNextStep = (val: any) => {
 		// 如果办理对象只有一个默认选中
 		state.delayForm.nextHandlers = [items[0]];
 	}
-
 };
 // 办理对象是否能够选择多个(可以发起会签可以选择多个,不能发起会签只能选择一个)
 const multipleLimit = computed(() => {
@@ -259,9 +265,10 @@ const multipleLimit = computed(() => {
 
 // 是否展示办理对象 (只有结束节点不展示 next.stepType===2 表示为结束节点)
 const showHandlers = computed(() => {
-	const next = state.nextStepOptions.find((item: any) => item.key === state.delayForm.nextStepCode);
+	/*	const next = state.nextStepOptions.find((item: any) => item.key === state.delayForm.nextStepCode);
 	if (!next) return true;
-	return next.stepType !== 2;
+	return next.stepType !== 2;*/
+	return false;
 });
 
 // 选择办理对象

+ 29 - 13
src/views/business/delay/components/Delay-audit.vue

@@ -34,9 +34,11 @@
 								v-model="state.infoForm.delayNum"
 							></el-input-number>
 							<el-button size="small" type="primary" class="ml5" @click="editConfirm">确定</el-button>
-							<el-button size="small" class="decrease" @click="editMode = false">取消</el-button>
+							<el-button size="small" class="decrease" @click="onCancelEdit">取消</el-button>
 						</template>
-						<el-button type="primary" link class="ml10" @click="editMode = true" v-if="!editMode" v-auth="'business:delay:audit:todo'">修改</el-button>
+						<el-button type="primary" link class="ml10" @click="editMode = true" v-if="!editMode" v-auth="'business:delay:audit:edit'"
+							>修改</el-button
+						>
 					</el-form-item>
 				</el-col>
 				<!--				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
@@ -82,6 +84,11 @@
 						</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="isSms">
+						<el-checkbox v-model="state.ruleForm.isSms" label="短信通知" />
+					</el-form-item>
+				</el-col>
 				<template v-if="state.ruleForm.isPass">
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 						<el-form-item label="下一环节" prop="nextStepCode" :rules="[{ required: true, message: '请选择下一环节', trigger: 'change' }]">
@@ -113,11 +120,6 @@
 						</el-form-item>
 					</el-col>
 				</template>
-				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="" prop="isSms">
-						<el-checkbox v-model="state.ruleForm.isSms" label="短信通知" />
-					</el-form-item>
-				</el-col>
 				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 					<el-form-item label="审批意见" prop="opinion" :rules="[{ required: true, message: '请填写审批意见', trigger: 'blur' }]">
 						<common-advice
@@ -184,19 +186,24 @@ const state = reactive<any>({
 	nextStepOptions: [],
 });
 
-const tableData = ref<EmptyArrayType>([]);
 /*
  * @params row 工单详情
  * @description 打开弹窗
  * */
-const openDialog = async (row: any) => {
+const currentRow = ref<EmptyObjectType>({});
+const openDialog = (row: any) => {
+	currentRow.value = row;
+	getDelayDetail();
+};
+// 获取延期详情
+const getDelayDetail = async () => {
 	state.dialogVisible = true;
 	state.loading = true;
 	try {
-		const { result } = await delayDetail(row.id);
+		const { result } = await delayDetail(currentRow.value.id);
 		state.infoForm = result ?? {};
 		state.infoForm.files = transformFile(state.infoForm.files);
-		state.ruleForm.workflowId = row.workflowId;
+		state.ruleForm.workflowId = currentRow.value.workflowId;
 		await getWorkflow(result.workflowId);
 		await selectNextStepOptions(result.workflowId);
 		state.loading = false;
@@ -207,6 +214,11 @@ const openDialog = async (row: any) => {
 };
 // 修改延期数量
 const editMode = ref<boolean>(false);
+// 取消修改延期数量
+const onCancelEdit = () => {
+	editMode.value = false;
+	getDelayDetail();
+};
 // 确定修改延期数量
 const editConfirm = () => {};
 const formatTraces = (val: any) => {
@@ -217,6 +229,7 @@ const formatTraces = (val: any) => {
 	return val;
 };
 // 获取流程
+const tableData = ref<EmptyArrayType>([]);
 const getWorkflow = async (workflowId: string) => {
 	try {
 		// 查询审核记录
@@ -289,10 +302,11 @@ const selectHandlers = () => {
 };
 // 是否展示办理对象 (结束节点不展示: next.stepType===2 表示为结束节点)
 const showHandlers = computed(() => {
-	const next = state.nextStepOptions.find((item: any) => item.key === state.ruleForm.nextStepCode);
+	/*	const next = state.nextStepOptions.find((item: any) => item.key === state.ruleForm.nextStepCode);
 	if (!next) return true;
 	// 话务部到派单 派单组到一级部门 也不需要展示办理对象
-	return next?.stepType !== 2;
+	return next?.stepType !== 2;*/
+	return false;
 });
 
 // 办理对象是否能够选择多个(可以发起会签可以选择多个,不能发起会签只能选择一个) 加个判断 选择的下一环节必须是部门(会签必须是选择的部门)
@@ -310,6 +324,8 @@ const closeDialog = () => {
 const close = () => {
 	ruleFormRef.value?.resetFields();
 	ruleFormRef.value?.resetFields();
+	tableData.value = [];
+	currentRow.value = {};
 };
 // 提交
 const afterSubmit = (emitType?: 'updateList', showMessage?: boolean, message?: string) => {

+ 47 - 73
src/views/business/delay/components/Delay-detail.vue

@@ -1,7 +1,8 @@
 <template>
-	<el-dialog v-model="state.dialogVisible" draggable title="延期详情" ref="dialogRef" width="50%" append-to-body destroy-on-close>
+	<el-dialog v-model="state.dialogVisible" draggable title="延期详情" ref="dialogRef" width="50%" append-to-body destroy-on-close @close="close">
 		<el-form label-width="110px" ref="ruleFormRef" :model="state.ruleForm" class="show-info-form">
-			<el-row :gutter="10">
+			<p class="border-title">申请信息</p>
+			<el-row :gutter="10" v-loading="state.loading">
 				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 					<el-form-item label="工单编号"> {{ state.ruleForm?.order?.no }} </el-form-item>
 				</el-col>
@@ -21,7 +22,7 @@
 					<el-form-item label="当前期满时间"> {{ formatDate(state.ruleForm?.beforeDelay, '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="延期申请数">{{ state.ruleForm?.delayNum }} {{ state.ruleForm?.delayUnitText }} </el-form-item>
+					<el-form-item label="延期申请数">{{ state.ruleForm?.delayNum }} {{ state.ruleForm?.delayUnitText }} </el-form-item>
 				</el-col>
 				<!--				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 					<el-form-item label="延期后期满时间">{{ formatDate(state.ruleForm?.afterDelay, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
@@ -38,37 +39,39 @@
 					</el-form-item>
 				</el-col>
 			</el-row>
+			<p class="border-title mt10 mb10">延期审核明细</p>
+			<vxe-table :expand-config="{ trigger: 'row', padding: true }" border :data="tableData" :loading="state.loading">
+				<vxe-column type="seq" width="70"></vxe-column>
+				<vxe-column type="expand" width="60">
+					<template #content="{ row }">
+						<div class="mb5 formatted-text">审核意见:{{ row.opinion }}</div>
+						<annex-list name="附件" readonly businessId="" classify="查看附件" v-model="row.files" />
+					</template>
+				</vxe-column>
+				<vxe-column field="name" title="节点"></vxe-column>
+				<vxe-column field="handlerName" title="审批人"></vxe-column>
+				<vxe-column field="handleTime" title="审批时间" width="160">
+					<template #default="{ row }">{{ formatDate(row.handleTime, 'YYYY-mm-dd HH:MM:SS') }}</template>
+				</vxe-column>
+				<vxe-column field="traceTypeText" title="状态"></vxe-column>
+			</vxe-table>
 		</el-form>
 		<template #footer>
 			<span class="dialog-footer">
-				<el-button @click="closeDialog" class="default-button">取 消</el-button>
-				<el-button type="primary" @click="processDetail">流程明细</el-button>
-				<el-button type="primary" @click="onAudit" v-if="state.ruleForm?.isCanHandle" v-auths="['business:delay:audit:todo', 'business:delay:audit']"
-					>延期审批</el-button
-				>
+				<el-button @click="closeDialog" class="default-button">关 闭</el-button>
 			</span>
 		</template>
 	</el-dialog>
-	<!-- 审核记录 -->
-	<audit-record ref="auditRecordRef" />
-	<!--  流程审批  -->
-	<process-audit ref="processAuditRef" @orderProcessSuccess="orderProcessSuccess" @orderProcessFailed="orderProcessFailed"></process-audit>
 </template>
 <script setup lang="ts" name="delayDetail">
 import { defineAsyncComponent, reactive, ref } from 'vue';
 import { delayDetail } from '@/api/business/delay';
 import { formatDate } from '@/utils/formatTime';
 import { transformFile } from '@/utils/tools';
-import { useThemeConfig } from '@/stores/themeConfig';
-import { storeToRefs } from 'pinia';
-import { ElMessage } from 'element-plus';
+import { workflowTraces } from '@/api/system/workflow';
 
-const AuditRecord = defineAsyncComponent(() => import('@/components/AuditRecord/index.vue')); // 流程明细
 const AnnexList = defineAsyncComponent(() => import('@/components/AnnexList/index.vue')); // 附件列表
-const ProcessAudit = defineAsyncComponent(() => import('@/components/ProcessAudit/index.vue')); // 流程审批
 
-// 定义子组件向父组件传值/事件
-const emit = defineEmits(['updateList']);
 // 定义变量内容
 const state = reactive<any>({
 	dialogVisible: false, // 是否显示弹窗
@@ -76,8 +79,6 @@ const state = reactive<any>({
 	ruleForm: {},
 	currentId: '',
 });
-const storesThemeConfig = useThemeConfig();
-const { themeConfig } = storeToRefs(storesThemeConfig);
 /*
  * @param row 工单详情
  * @description 打开弹窗
@@ -87,68 +88,41 @@ const openDialog = async (row: any) => {
 	state.currentId = row.id;
 	state.dialogVisible = true;
 	try {
-		const res = await delayDetail(state.currentId);
-		state.ruleForm = res.result ?? {};
+		const { result } = await delayDetail(state.currentId);
+		state.ruleForm = result ?? {};
 		state.ruleForm.files = transformFile(state.ruleForm.files);
+		await getWorkflow(result.workflowId);
 		state.loading = false;
 	} catch (e) {
 		state.loading = false;
 	}
 };
-// 关闭弹窗
-const closeDialog = () => {
-	state.dialogVisible = false;
+const formatTraces = (val: any) => {
+	if (!val || !val.length) return [];
+	val.forEach((item: any) => {
+		item.files = transformFile(item.files);
+	});
+	return val;
 };
-// 延期审批
-const processAuditRef = ref<RefType>(); // 流程审批ref
-const onAudit = () => {
-	const params = {
-		id: state.ruleForm.workflowId,
-		processType: '延期审批',
-		orderDetail: state.ruleForm.order,
-		extra: {
-			dialogTitle: '延期审批',
-			inputPlaceholder: '办理意见',
-			annexName: '延期附件',
-			classify: '延期上传',
-		},
-	};
-	processAuditRef.value.openDialog(params);
-};
-// 流程明细
-const auditRecordRef = ref<RefType>(); // 审核记录ref
-const processDetail = () => {
-	if (['ZiGong'].includes(themeConfig.value.appScope)) {
-		// 自贡
-		if (state.ruleForm?.automaticDelayNum === null) {
-			// 没有自动延期正常查看
-			const params = {
-				dialogTitle: `延期记录 (${state.ruleForm.order?.title})`,
-				...state.ruleForm,
-			};
-			auditRecordRef.value.openDialog(params);
-		} else {
-			// 有自动延期,则不能查看
-			ElMessage.warning('该工单已自动延期,没有流程明细');
-		}
-	} else {
-		const params = {
-			dialogTitle: `延期记录 (${state.ruleForm.order?.title})`,
-			...state.ruleForm,
-		};
-		auditRecordRef.value.openDialog(params);
+// 获取流程
+const tableData = ref<EmptyArrayType>([]);
+const getWorkflow = async (workflowId: string) => {
+	try {
+		// 查询审核记录
+		const { result } = await workflowTraces(workflowId);
+		tableData.value = formatTraces(result?.traces);
+	} catch (e) {
+		console.log(e);
 	}
 };
-// 审核成功
-const orderProcessSuccess = () => {
-	emit('updateList');
-	closeDialog();
-};
-// 审核失败
-const orderProcessFailed = () => {
-	emit('updateList');
-	closeDialog();
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
 };
+const close = ()=>{
+  tableData.value = [];
+  state.ruleForm = {};
+}
 defineExpose({
 	openDialog,
 	closeDialog,

+ 9 - 9
src/views/tels/callLog/zgCallLog.vue

@@ -195,7 +195,7 @@ import { defaultTimeStartEnd, shortcuts } from '@/utils/constants';
 import { useRouter } from 'vue-router';
 import mittBus from '@/utils/mitt';
 import Other from '@/utils/other';
-import {getCallCenterCallRecord, getCallCenterCallRecordBaseData, getCallCenterCallRecordTotal} from '@/api/callCenter';
+import { getCallCenterCallRecord, getCallCenterCallRecordBaseData, getCallCenterCallRecordTotal } from '@/api/callCenter';
 import { useThemeConfig } from '@/stores/themeConfig';
 import { storeToRefs } from 'pinia';
 
@@ -242,7 +242,7 @@ const changeTba = () => {
 const handleQuery = () => {
 	state.queryParams.PageIndex = 1;
 	queryList();
-  getTotal();
+	getTotal();
 };
 /** 通话记录列表 */
 const requestParams = ref<EmptyObjectType>({});
@@ -266,11 +266,11 @@ const queryList = async () => {
 };
 // 查询总数
 const getTotal = () => {
-  getCallCenterCallRecordTotal(requestParams.value)
-      .then((res) => {
-        state.total = res.result ?? 0;
-      })
-      .catch(() => {});
+	getCallCenterCallRecordTotal(requestParams.value)
+		.then((res) => {
+			state.total = res.result ?? 0;
+		})
+		.catch(() => {});
 };
 // 失联工单
 const IsMissOrder = ref(false);
@@ -288,7 +288,7 @@ const resetQuery = (formEl: FormInstance | undefined) => {
 	ruleFormRef.value?.resetFields();
 	IsMissOrder.value = false;
 	queryList();
-  getTotal();
+	getTotal();
 };
 // 播放录音
 const playRecordRef = ref<RefType>();
@@ -339,7 +339,7 @@ const getBaseData = async () => {
 onMounted(() => {
 	getBaseData();
 	queryList();
-  getTotal();
+	getTotal();
 	if (tableRef.value && toolbarRef.value) {
 		tableRef.value.connect(toolbarRef.value);
 	}

+ 0 - 16
src/views/todo/seats/accept/History.vue

@@ -10,15 +10,6 @@
 			</el-button>
 		</el-form-item>
 	</el-form>
-	<!--	<vxe-toolbar
-		ref="toolbarRef"
-		:loading="state.loading"
-		custom
-		:refresh="{
-			queryMethod: handleQuery,
-		}"
-	>
-	</vxe-toolbar>-->
 	<vxe-table
 		border
 		:loading="state.loading"
@@ -137,13 +128,6 @@ const searchHistory = throttle(async () => {
 		state.loading = false;
 	}
 }, 300);
-/*const toolbarRef = ref<RefType>();
-const tableRef = ref<RefType>();
-onMounted(() => {
-	if (tableRef.value && toolbarRef.value) {
-		tableRef.value.connect(toolbarRef.value);
-	}
-});*/
 // 补充
 const orderSupplyRef = ref<RefType>();
 const supply = (row: any) => {