浏览代码

reactor:还原;

zhangchong 1 月之前
父节点
当前提交
7351ac5d87

+ 181 - 192
src/views/business/delay/audit.vue

@@ -1,149 +1,138 @@
 <template>
-	<div class="business-delay-audit-container layout-padding">
-		<div class="layout-padding-auto layout-padding-view pd20">
-			<el-tabs v-model="state.queryParams.IsApply" @tab-change="handleClick">
-				<el-tab-pane name="false" label="延期待审批" :disabled="state.loading"></el-tab-pane>
-				<el-tab-pane name="true" label="延期已审批" :disabled="state.loading"></el-tab-pane>
-			</el-tabs>
-			<el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline :disabled="state.loading">
-				<el-form-item label="关键字" prop="Keyword">
-					<el-input v-model.trim="state.queryParams.Keyword" placeholder="工单编码/标题" clearable @keyup.enter="handleQuery" class="keyword-input" />
-				</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">
-						<SvgIcon name="ele-Refresh" class="mr5" />重置
-					</el-button>
-				</el-form-item>
-			</el-form>
-			<vxe-toolbar
-				ref="toolbarRef"
-				:loading="state.loading"
-				custom
-				:refresh="{
+  <div class="business-delay-audit-container layout-padding">
+    <div class="layout-padding-auto layout-padding-view pd20">
+      <el-tabs v-model="state.queryParams.IsApply" @tab-change="handleClick">
+        <el-tab-pane name="false" label="延期待审批" :disabled="state.loading"></el-tab-pane>
+        <el-tab-pane name="true" label="延期已审批" :disabled="state.loading"></el-tab-pane>
+      </el-tabs>
+      <el-form :model="state.queryParams" ref="ruleFormRef" @submit.native.prevent inline :disabled="state.loading">
+        <el-form-item label="关键字" prop="Keyword">
+          <el-input v-model.trim="state.queryParams.Keyword" placeholder="工单编码/标题" clearable @keyup.enter="handleQuery" class="keyword-input" />
+        </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">
+            <SvgIcon name="ele-Refresh" class="mr5" />重置
+          </el-button>
+        </el-form-item>
+      </el-form>
+      <vxe-toolbar
+          ref="toolbarRef"
+          :loading="state.loading"
+          custom
+          :refresh="{
 					queryMethod: handleQuery,
 				}"
-				:tools="[{ toolRender: { name: 'exportCurrent' } }, { toolRender: { name: 'exportAll' } }]"
-			>
-				<template #buttons>
-					<el-button
-						type="primary"
-						@click="onAuditBatch"
-						:disabled="isChecked"
-						v-if="state.queryParams.IsApply === 'false'"
-						:loading="state.loading"
-						v-auth="'business:delay:audit:batch'"
-						><SvgIcon name="ele-Edit" class="mr5" />批量审批<span v-if="checkTable.length">({{ checkTable.length }})</span>
-					</el-button>
-				</template>
-			</vxe-toolbar>
-			<div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
-				<vxe-table
-					border
-					:loading="state.loading"
-					:data="state.tableData"
-					:column-config="{ resizable: true }"
-					:row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true }"
-					ref="tableRef"
-					height="auto"
-					@checkbox-all="selectAllChangeEvent"
-					@checkbox-change="selectChangeEvent"
-					auto-resize
-					show-overflow
-					:print-config="{}"
-					:scrollY="{ enabled: true, gt: 100 }"
-					id="businessDelayAudit"
-					:custom-config="{
+          :tools="[{ toolRender: { name: 'exportCurrent' } }, { toolRender: { name: 'exportAll' } }]"
+      >
+        <template #buttons>
+          <el-button
+              type="primary"
+              @click="onAuditBatch"
+              :disabled="isChecked"
+              v-if="state.queryParams.IsApply === 'false'"
+              :loading="state.loading"
+              v-auth="'business:delay:audit:batch'"
+          ><SvgIcon name="ele-Edit" class="mr5" />批量审批<span v-if="checkTable.length">({{ checkTable.length }})</span>
+          </el-button>
+        </template>
+      </vxe-toolbar>
+      <div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
+        <vxe-table
+            border
+            :loading="state.loading"
+            :data="state.tableData"
+            :column-config="{ resizable: true }"
+            :row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true }"
+            ref="tableRef"
+            height="auto"
+            @checkbox-all="selectAllChangeEvent"
+            @checkbox-change="selectChangeEvent"
+            auto-resize
+            show-overflow
+            :print-config="{}"
+            :scrollY="{ enabled: true, gt: 100 }"
+            id="businessDelayAudit"
+            :custom-config="{
 						storage: true,
 					}"
-					showHeaderOverflow
-					:params="{ exportMethod: waitDelayListExport, exportParams: requestParams }"
-				>
-					<vxe-column type="checkbox" width="50" align="center"></vxe-column>
-					<vxe-column field="order.expiredStatusText" title="状态" width="60" align="center">
-						<template #default="{ row }">
-							<span :class="'overdue-status-' + row.order?.expiredStatus" :title="row.order?.expiredStatusText"></span>
-						</template>
-					</vxe-column>
-					<vxe-column field="order.no" title="工单编码" width="140"></vxe-column>
-					<vxe-column field="order.isProvinceText" title="省/市工单" width="90"></vxe-column>
-					<vxe-column field="order.title" title="工单标题" width="200">
-						<template #default="{ row }">
-							<order-detail :order="row.order" @updateList="refreshList">{{ row.order?.title }}</order-detail>
-						</template>
-					</vxe-column>
-					<vxe-column field="currentStepName" title="当前节点" width="120" v-if="state.queryParams.IsApply === 'true'"></vxe-column>
-					<vxe-column field="actualHandlerName" title="当前审批人" width="120" v-if="state.queryParams.IsApply === 'true'"></vxe-column>
-					<vxe-column field="delayStateText" title="延期审批状态" width="110"></vxe-column>
-					<vxe-column field="order.creationTime" title="受理时间" width="160">
-						<template #default="{ row }">
-							{{ formatDate(row.order?.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
-						</template>
-					</vxe-column>
-					<vxe-column field="order.acceptorName" title="受理人" width="120"></vxe-column>
-					<vxe-column field="order.hotspotName" title="热点分类" width="150"></vxe-column>
-					<vxe-column field="order.acceptType" title="受理类型" width="110"></vxe-column>
-					<vxe-column field="order.orgLevelOneName" title="一级部门" width="140"></vxe-column>
-					<vxe-column field="order.actualHandleOrgName" title="接办部门" width="140"></vxe-column>
-					<vxe-column field="order.actualHandleTime" title="接办时间" width="160">
-						<template #default="{ row }">
-							{{ formatDate(row.order?.actualHandleTime, 'YYYY-mm-dd HH:MM:SS') }}
-						</template>
-					</vxe-column>
-					<vxe-column field="creationTime" title="延期申请时间" width="160">
-						<template #default="{ row }">
-							{{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
-						</template>
-					</vxe-column>
-					<vxe-column field="creatorName" title="延期申请人" width="120"></vxe-column>
-					<vxe-column field="creatorOrgName" title="延期申请部门" width="140"></vxe-column>
-					<vxe-column field="delayNum" title="延期申请时限" width="110"></vxe-column>
-					<vxe-column field="delayUnitText" title="延期申请单位" width="110"></vxe-column>
-					<vxe-column field="delayReason" title="申请理由" width="150"></vxe-column>
-					<vxe-column field="beforeDelay" title="申请前期满时间" width="160">
-						<template #default="{ row }">
-							{{ formatDate(row.beforeDelay, 'YYYY-mm-dd HH:MM:SS') }}
-						</template>
-					</vxe-column>
-<!--					<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="100" align="center" :show-overflow="false">
-						<template #default="{ row }">
-							<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>
-			</div>
-			<pagination
-				@pagination="queryList"
-				:total="state.total"
-				v-model:current-page="state.queryParams.PageIndex"
-				v-model:page-size="state.queryParams.PageSize"
-				:disabled="state.loading"
-			/>
-		</div>
-		<!--  延期详情  -->
-		<delay-detail-com ref="delayDetailRef" @updateList="refreshList" />
-		<!--  延期审批  -->
-		<delay-audit ref="delayAuditRef" @updateList="refreshList" />
-		<!--  延期审批批量  -->
-		<delay-audit-batch ref="delayAuditBatchRef" @updateList="refreshList" />
-	</div>
+            showHeaderOverflow
+            :params="{ exportMethod: waitDelayListExport, exportParams: requestParams }"
+        >
+          <vxe-column type="checkbox" width="50" align="center"></vxe-column>
+          <vxe-column field="order.expiredStatusText" title="状态" width="60" align="center">
+            <template #default="{ row }">
+              <span :class="'overdue-status-' + row.order?.expiredStatus" :title="row.order?.expiredStatusText"></span>
+            </template>
+          </vxe-column>
+          <vxe-column field="order.no" title="工单编码" width="140"></vxe-column>
+          <vxe-column field="order.isProvinceText" title="省/市工单" width="90"></vxe-column>
+          <vxe-column field="order.title" title="工单标题" width="200">
+            <template #default="{ row }">
+              <order-detail :order="row.order" @updateList="refreshList">{{ row.order?.title }}</order-detail>
+            </template>
+          </vxe-column>
+          <vxe-column field="currentStepName" title="当前节点" width="120" v-if="state.queryParams.IsApply === 'true'"></vxe-column>
+          <vxe-column field="actualHandlerName" title="当前审批人" width="120" v-if="state.queryParams.IsApply === 'true'"></vxe-column>
+          <vxe-column field="delayStateText" title="延期审批状态" width="110"></vxe-column>
+          <vxe-column field="order.creationTime" title="受理时间" width="160">
+            <template #default="{ row }">
+              {{ formatDate(row.order?.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
+            </template>
+          </vxe-column>
+          <vxe-column field="order.acceptorName" title="受理人" width="120"></vxe-column>
+          <vxe-column field="order.hotspotName" title="热点分类" width="150"></vxe-column>
+          <vxe-column field="order.acceptType" title="受理类型" width="110"></vxe-column>
+          <vxe-column field="order.orgLevelOneName" title="一级部门" width="140"></vxe-column>
+          <vxe-column field="order.actualHandleOrgName" title="接办部门" width="140"></vxe-column>
+          <vxe-column field="order.actualHandleTime" title="接办时间" width="160">
+            <template #default="{ row }">
+              {{ formatDate(row.order?.actualHandleTime, 'YYYY-mm-dd HH:MM:SS') }}
+            </template>
+          </vxe-column>
+          <vxe-column field="creationTime" title="延期申请时间" width="160">
+            <template #default="{ row }">
+              {{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
+            </template>
+          </vxe-column>
+          <vxe-column field="creatorName" title="延期申请人" width="120"></vxe-column>
+          <vxe-column field="creatorOrgName" title="延期申请部门" width="140"></vxe-column>
+          <vxe-column field="delayNum" title="延期申请时限" width="110"></vxe-column>
+          <vxe-column field="delayUnitText" title="延期申请单位" width="110"></vxe-column>
+          <vxe-column field="delayReason" title="申请理由" width="150"></vxe-column>
+          <vxe-column field="beforeDelay" title="申请前期满时间" width="160">
+            <template #default="{ row }">
+              {{ formatDate(row.beforeDelay, 'YYYY-mm-dd HH:MM:SS') }}
+            </template>
+          </vxe-column>
+          <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">
+            <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>-->
+            </template>
+          </vxe-column>
+        </vxe-table>
+      </div>
+      <pagination
+          @pagination="queryList"
+          :total="state.total"
+          v-model:current-page="state.queryParams.PageIndex"
+          v-model:page-size="state.queryParams.PageSize"
+          :disabled="state.loading"
+      />
+    </div>
+    <!--  延期详情  -->
+    <delay-detail-com ref="delayDetailRef" @updateList="refreshList" />
+    <!--  延期审批  -->
+    <delay-audit ref="delayAuditRef" @updateList="refreshList" />
+    <!--  延期审批批量  -->
+    <delay-audit-batch ref="delayAuditBatchRef" @updateList="refreshList" />
+  </div>
 </template>
 <script setup lang="tsx" name="businessDelayAudit">
 import { computed, defineAsyncComponent, onMounted, reactive, ref } from 'vue';
@@ -160,97 +149,97 @@ const DelayAuditBatch = defineAsyncComponent(() => import('@/views/business/dela
 
 // 定义变量内容
 const state = reactive({
-	queryParams: {
-		// 查询条件
-		PageIndex: 1,
-		PageSize: 20,
-		Keyword: null, // 关键字
-		IsApply: 'false', // 待办/已办
-	},
-	tableData: [], // 表格
-	loading: false, // 加载
-	total: 0, // 总数
+  queryParams: {
+    // 查询条件
+    PageIndex: 1,
+    PageSize: 20,
+    Keyword: null, // 关键字
+    IsApply: 'false', // 待办/已办
+  },
+  tableData: [], // 表格
+  loading: false, // 加载
+  total: 0, // 总数
 });
 const ruleFormRef = ref<RefType>(); // 表单ref
 // 手动查询,将页码设置为1
 const handleQuery = () => {
-	state.queryParams.PageIndex = 1;
-	queryList();
+  state.queryParams.PageIndex = 1;
+  queryList();
 };
 // 刷新列表
 const refreshList = () => {
-	queryList();
+  queryList();
 };
 /** 获取列表 */
 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)
-		.then((res: any) => {
-			state.tableData = res.result?.items ?? [];
-			state.total = res.result?.total ?? 0;
-			tableRef.value.clearCheckboxRow();
-			checkTable.value = [];
-			state.loading = false;
-		})
-		.catch(() => {
-			tableRef.value.clearCheckboxRow();
-			checkTable.value = [];
-			state.loading = false;
-		});
+  state.loading = true;
+  requestParams.value = Other.deepClone(state.queryParams);
+  requestParams.value.IsApply = state.queryParams.IsApply === 'true';
+  delayList(requestParams.value)
+      .then((res: any) => {
+        state.tableData = res.result?.items ?? [];
+        state.total = res.result?.total ?? 0;
+        tableRef.value.clearCheckboxRow();
+        checkTable.value = [];
+        state.loading = false;
+      })
+      .catch(() => {
+        tableRef.value.clearCheckboxRow();
+        checkTable.value = [];
+        state.loading = false;
+      });
 };
 // 切换tab 查询列表
 const handleClick = () => {
-	handleQuery();
+  handleQuery();
 };
 /** 重置按钮操作 */
 const resetQuery = (formEl: FormInstance | undefined) => {
-	if (!formEl) return;
-	formEl.resetFields();
-	queryList();
+  if (!formEl) return;
+  formEl.resetFields();
+  queryList();
 };
 // 延期详情
 const delayDetailRef = ref<RefType>();
 const onDetail = async (row: any) => {
-	delayDetailRef.value.openDialog(row);
+  delayDetailRef.value.openDialog(row);
 };
 const toolbarRef = ref<RefType>();
 const checkTable = ref<EmptyArrayType>([]);
 const selectAllChangeEvent = ({ checked }) => {
-	if (tableRef.value) {
-		const records = tableRef.value.getCheckboxRecords();
-		checkTable.value = records;
-		console.log(checked ? '所有勾选事件' : '所有取消事件', records);
-	}
+  if (tableRef.value) {
+    const records = tableRef.value.getCheckboxRecords();
+    checkTable.value = records;
+    console.log(checked ? '所有勾选事件' : '所有取消事件', records);
+  }
 };
 
 const selectChangeEvent = ({ checked }) => {
-	if (tableRef.value) {
-		const records = tableRef.value.getCheckboxRecords();
-		checkTable.value = records;
-		console.log(checked ? '勾选事件' : '取消事件', records);
-	}
+  if (tableRef.value) {
+    const records = tableRef.value.getCheckboxRecords();
+    checkTable.value = records;
+    console.log(checked ? '勾选事件' : '取消事件', records);
+  }
 };
 const isChecked = computed(() => {
-	return !checkTable.value.length;
+  return !Boolean(checkTable.value.length);
 });
 // 延期审批
 const delayAuditRef = ref<RefType>();
 const onAudit = (row: any) => {
-	delayAuditRef.value.openDialog(row);
+  delayAuditRef.value.openDialog(row);
 };
 // 批量审批
 const delayAuditBatchRef = ref<RefType>();
 const onAuditBatch = () => {
-	delayAuditBatchRef.value.openDialog(checkTable.value);
+  delayAuditBatchRef.value.openDialog(checkTable.value);
 };
 const tableRef = ref<RefType>();
 onMounted(() => {
-	queryList();
-	if (tableRef.value && toolbarRef.value) {
-		tableRef.value.connect(toolbarRef.value);
-	}
+  queryList();
+  if (tableRef.value && toolbarRef.value) {
+    tableRef.value.connect(toolbarRef.value);
+  }
 });
 </script>

+ 265 - 272
src/views/business/delay/components/Delay-apply.vue

@@ -1,138 +1,138 @@
 <template>
-	<el-dialog
-		v-model="state.dialogVisible"
-		draggable
-		title="延期申请"
-		ref="dialogRef"
-		@mouseup="mouseup"
-		:style="'transform: ' + state.transform + ';'"
-		append-to-body
-		destroy-on-close
-		:close-on-click-modal="false"
-		@close="close"
-	>
-		<div v-loading="state.loading">
-			<el-form :model="state.delayForm" label-width="110px" ref="delayFormRef">
-				<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="申请时间"> {{ formatDate(new Date(), '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="当前期满时间"> {{ 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" 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" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="showHandlers">
-						<el-form-item
-							label="办理对象"
-							prop="nextHandlers"
-							:rules="[{ required: nextHandlersRequired, message: '请选择办理对象', trigger: 'change' }]"
-						>
-							<el-select-v2
-								v-model="state.delayForm.nextHandlers"
-								:options="state.handlerOptions"
-								placeholder="请选择办理对象"
-								class="w100"
-								multiple
-								clearable
-								collapse-tags
-								collapse-tags-tooltip
-								filterable
-								value-key="key"
-								@change="selectHandlers"
-								:multiple-limit="multipleLimit"
-							/>
-						</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">
-							<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>
-									</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="延期申请天数"
-										v-model="state.delayForm.timeLimitCount"
-										controls-position="right"
-										class="w100"
-										:min="1"
-										:max="AppConfigInfo.applyDelayTime"
-									></el-input-number>
-								</el-col>
-								<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-loading="state.loading">
-									<el-form-item
-										label=""
-										label-width="0"
-										prop="timeLimitUnit"
-										:rules="[{ required: true, message: '请选择延期申请单位', trigger: 'change' }]"
-									>
-										<el-select disabled v-model="state.delayForm.timeLimitUnit" placeholder="延期申请单位">
-											<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="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="" prop="isSms">
-							<el-checkbox v-model="state.delayForm.isSms" label="短信通知" />
-						</el-form-item>
-					</el-col>
-					<!--					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-						<el-form-item label="延期后期满时间"> {{ state.delayForm.endTime }} </el-form-item>
-					</el-col>-->
-					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-						<el-form-item label="申请理由" prop="content" :rules="[{ required: true, message: '请填写延期申请理由', trigger: 'blur' }]">
-							<common-advice
-								@chooseAdvice="chooseAdviceDelay"
-								v-model="state.delayForm.content"
-								placeholder="请填写延期申请理由"
-								:loading="state.loading"
-								:commonEnum="commonEnum.Delay"
-								:maxlength="AppConfigInfo.handleOpinionWordLimit"
-							/>
-						</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="handleFilesDelay" :businessId="state.orderDetail.id" classify="延期上传" />
-						</el-form-item>
-					</el-col>
-				</el-row>
-			</el-form>
-		</div>
-		<template #footer>
+  <el-dialog
+      v-model="state.dialogVisible"
+      draggable
+      title="延期申请"
+      ref="dialogRef"
+      @mouseup="mouseup"
+      :style="'transform: ' + state.transform + ';'"
+      append-to-body
+      destroy-on-close
+      :close-on-click-modal="false"
+      @close="close"
+  >
+    <div v-loading="state.loading">
+      <el-form :model="state.delayForm" label-width="110px" ref="delayFormRef">
+        <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="申请时间"> {{ formatDate(new Date(), '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="当前期满时间"> {{ 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-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" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="showHandlers">
+            <el-form-item
+                label="办理对象"
+                prop="nextHandlers"
+                :rules="[{ required: nextHandlersRequired, message: '请选择办理对象', trigger: 'change' }]"
+            >
+              <el-select-v2
+                  v-model="state.delayForm.nextHandlers"
+                  :options="state.handlerOptions"
+                  placeholder="请选择办理对象"
+                  class="w100"
+                  multiple
+                  clearable
+                  collapse-tags
+                  collapse-tags-tooltip
+                  filterable
+                  value-key="key"
+                  @change="selectHandlers"
+                  :multiple-limit="multipleLimit"
+              />
+            </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">
+              <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>
+                  </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="延期申请数量"
+                      v-model="state.delayForm.timeLimitCount"
+                      controls-position="right"
+                      class="w100"
+                      :min="1"
+                      :max="AppConfigInfo.applyDelayTime"
+                  ></el-input-number>
+                </el-col>
+                <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-loading="state.loading">
+                  <el-form-item
+                      label=""
+                      label-width="0"
+                      prop="timeLimitUnit"
+                      :rules="[{ required: true, message: '请选择延期申请单位', trigger: 'change' }]"
+                  >
+                    <el-select disabled v-model="state.delayForm.timeLimitUnit" placeholder="延期申请单位">
+                      <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="12" :md="12" :lg="12" :xl="12">
+            <el-form-item label="" prop="isSms">
+              <el-checkbox v-model="state.delayForm.isSms" label="短信通知" />
+            </el-form-item>
+          </el-col>
+          <!--					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+            <el-form-item label="延期后期满时间"> {{ state.delayForm.endTime }} </el-form-item>
+          </el-col>-->
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+            <el-form-item label="申请理由" prop="content" :rules="[{ required: true, message: '请填写延期申请理由', trigger: 'blur' }]">
+              <common-advice
+                  @chooseAdvice="chooseAdviceDelay"
+                  v-model="state.delayForm.content"
+                  placeholder="请填写延期申请理由"
+                  :loading="state.loading"
+                  :commonEnum="commonEnum.Delay"
+                  :maxlength="AppConfigInfo.handleOpinionWordLimit"
+              />
+            </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="handleFilesDelay" :businessId="state.orderDetail.id" classify="延期上传" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </div>
+    <template #footer>
 			<span class="dialog-footer">
 				<el-button @click="closeDialog" class="default-button">取 消</el-button>
 				<el-button type="primary" @click="onSubmit(delayFormRef)" :loading="state.loading">确定</el-button>
 			</span>
-		</template>
-	</el-dialog>
+    </template>
+  </el-dialog>
 </template>
 
 <script setup lang="ts" name="processApproval">
@@ -159,197 +159,190 @@ const appConfigStore = useAppConfig();
 const { AppConfigInfo } = storeToRefs(appConfigStore); // 系统配置信息
 // 定义变量内容
 const state = reactive<any>({
-	dialogVisible: false, // 弹窗显示隐藏
-	delayForm: {
-		content: '', // 意见
-		nextStepCode: '', // 下一节点
-		nextStepName: '', // 下一节点名称
-		backToCountersignEnd: false, // 是否回到会签结束节点
-		nextHandlers: [], // 下一节点办理对象
-		nextMainHandler: '', // 主办人
-		isSms: false, // 是否短信通知
-		isStartCountersign: false, // 是否发起会签
-		stepId: '',
-		timeLimitCount: null, // 延期申请天数
-		timeLimitUnit: 2, // 延期申请单位 默认工作日
-	},
-	nextStepOptions: [], // 下一节点
-	handlerOptions: [], // 办理对象
-	transform: 'translate(0px, 0px)', // 滚动条位置
-	loading: false, // 提交按钮loading
-	workflowId: '', // 流程id
-	handlerClassifies: [], //撤回办理对象
-	handleId: '', // 流程处理ID
-	annexName: '', // 附件标题
-	inputPlaceholder: '', // 意见提示
-	orderDetail: {}, // 工单详情
+  dialogVisible: false, // 弹窗显示隐藏
+  delayForm: {
+    content: '', // 意见
+    nextStepCode: '', // 下一节点
+    nextStepName: '', // 下一节点名称
+    backToCountersignEnd: false, // 是否回到会签结束节点
+    nextHandlers: [], // 下一节点办理对象
+    nextMainHandler: '', // 主办人
+    isSms: false, // 是否短信通知
+    isStartCountersign: false, // 是否发起会签
+    stepId: '',
+    timeLimitCount: null, // 延期申请数量
+    timeLimitUnit: 2, // 延期申请单位 默认工作日
+  },
+  nextStepOptions: [], // 下一节点
+  handlerOptions: [], // 办理对象
+  transform: 'translate(0px, 0px)', // 滚动条位置
+  loading: false, // 提交按钮loading
+  workflowId: '', // 流程id
+  handlerClassifies: [], //撤回办理对象
+  handleId: '', // 流程处理ID
+  annexName: '', // 附件标题
+  inputPlaceholder: '', // 意见提示
+  orderDetail: {}, // 工单详情
 });
 const timeType = ref<EmptyArrayType>([]); // 延期申请单位
 // 打开弹窗
 const openDialog = async (val: any) => {
-	state.loading = true;
-	state.dialogVisible = true;
-	try {
-		const [workflowDelayResponse, responseDelay] = await Promise.all([workflowDelayParams(), delayBaseData()]); //获取开启流程参数
-		timeType.value = responseDelay.result?.timeType ?? []; // 延期时间单位
-		handleResult(workflowDelayResponse);
-		state.orderDetail = val.orderDetail;
-		state.loading = false;
-	} finally {
-		state.loading = false;
-	}
+  state.loading = true;
+  state.dialogVisible = true;
+  try {
+    const [workflowDelayResponse, responseDelay] = await Promise.all([workflowDelayParams(), delayBaseData()]); //获取开启流程参数
+    timeType.value = responseDelay.result?.timeType ?? []; // 延期时间单位
+    handleResult(workflowDelayResponse);
+    state.orderDetail = val.orderDetail;
+    state.loading = false;
+  } finally {
+    state.loading = false;
+  }
 };
 const canStartCountersign = ref<boolean>(false); // 是否可以发起会签
 const handleResult = (res: any) => {
-	state.nextStepOptions = res.result.steps; //办理对象选择内容
-	canStartCountersign.value = res.result.canStartCountersign ?? false; // 是否可以发起会签
-	// 默认选中第一个
-	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
-			state.delayForm.nextStepName = state.nextStepOptions[0].value; // 下一节点name
-			state.delayForm.backToCountersignEnd = state.nextStepOptions[0].backToCountersignEnd ?? false; // 是否回到会签结束节点
-		}, 0);
-		selectNextStep(state.nextStepOptions[0].key); // 查询流程下一节点参数
-	} else {
-		state.delayForm.nextStepCode = '';
-		state.delayForm.nextStepName = '';
-	}*/
-	state.delayForm.stepId = res.result.stepId;
-	state.loading = false;
+  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); // 查询流程下一节点参数
+  } else {
+    state.delayForm.nextStepCode = '';
+    state.delayForm.nextStepName = '';
+  }
+  state.delayForm.stepId = res.result.stepId;
+  state.loading = false;
 };
 // 流程选择下一环节
 const fastStepName = ref(''); // 推荐派单处理对象
 const fastStepCode = ref(''); // 推荐派单处理对象code
 const nextHandlersRequired = ref<Boolean>(false);
 const selectNextStep = (val: any) => {
-	delayFormRef.value?.resetFields('nextHandlers');
-	const next = state.nextStepOptions.find((item: any) => item.key === val);
-	const items = next.items; //获取下一节点
-	state.delayForm.nextStepName = next.value; // 下一节点name
-	state.delayForm.backToCountersignEnd = next.backToCountersignEnd ?? false; // 是否回到会签结束节点
-	state.delayForm.handlerType = next.handlerType;
-	state.delayForm.businessType = next.businessType;
-	state.delayForm.flowDirection = next.flowDirection;
-	state.handlerOptions = items ?? [];
-	state.handlerOptions = state.handlerOptions.map((item: any) => {
-		return {
-			value: {
-				...item,
-			},
-			label: item.value,
-		};
-	});
-	fastStepName.value = next.recommendOrgName; // 推荐派单处理对象
-	fastStepCode.value = next.recommendOrgId; // 推荐派单处理对象code
-	// 办理对象是否必填
-	// nextHandlersRequired.value = ![0].includes(next.handlerType) && !showStepsArr.includes(state.processType);
-	nextHandlersRequired.value = ![0].includes(next.handlerType);
+  delayFormRef.value?.resetFields('nextHandlers');
+  const next = state.nextStepOptions.find((item: any) => item.key === val);
+  const items = next.items; //获取下一节点
+  state.delayForm.nextStepName = next.value; // 下一节点name
+  state.delayForm.backToCountersignEnd = next.backToCountersignEnd ?? false; // 是否回到会签结束节点
+  state.delayForm.handlerType = next.handlerType;
+  state.delayForm.businessType = next.businessType;
+  state.delayForm.flowDirection = next.flowDirection;
+  state.handlerOptions = items ?? [];
+  state.handlerOptions = state.handlerOptions.map((item: any) => {
+    return {
+      value: {
+        ...item,
+      },
+      label: item.value,
+    };
+  });
+  fastStepName.value = next.recommendOrgName; // 推荐派单处理对象
+  fastStepCode.value = next.recommendOrgId; // 推荐派单处理对象code
+  // 办理对象是否必填
+  // nextHandlersRequired.value = ![0].includes(next.handlerType) && !showStepsArr.includes(state.processType);
+  nextHandlersRequired.value = ![0].includes(next.handlerType);
+
+  if (items.length === 1) {
+    // 如果办理对象只有一个默认选中
+    state.delayForm.nextHandlers = [items[0]];
+  }
 
-	if (items.length === 1) {
-		// 如果办理对象只有一个默认选中
-		state.delayForm.nextHandlers = [items[0]];
-	}
 };
 // 办理对象是否能够选择多个(可以发起会签可以选择多个,不能发起会签只能选择一个)
 const multipleLimit = computed(() => {
-	return canStartCountersign.value ? 0 : 1;
+  return canStartCountersign.value ? 0 : 1;
 });
 
 // 是否展示办理对象 (只有结束节点不展示 next.stepType===2 表示为结束节点)
 const showHandlers = computed(() => {
-	/*	const next = state.nextStepOptions.find((item: any) => item.key === state.delayForm.nextStepCode);
-	if (!next) return true;
-	return next.stepType !== 2;*/
-	return false;
+  const next = state.nextStepOptions.find((item: any) => item.key === state.delayForm.nextStepCode);
+  if (!next) return true;
+  return next.stepType !== 2;
 });
 
 // 选择办理对象
 const selectHandlers = () => {
-	if (state.delayForm.nextHandlers.length <= 1) {
-		// 如果只有一个办理对象就不需要发起会签
-		state.delayForm.isStartCountersign = false;
-	}
+  if (state.delayForm.nextHandlers.length <= 1) {
+    // 如果只有一个办理对象就不需要发起会签
+    state.delayForm.isStartCountersign = false;
+  }
 };
 // 设置抽屉
 const dialogRef = ref<RefType>();
 const mouseup = () => {
-	state.transform = dialogRef.value.dialogContentRef.$el.style.transform;
+  state.transform = dialogRef.value.dialogContentRef.$el.style.transform;
 };
 // 关闭弹窗
 const closeDialog = () => {
-	state.dialogVisible = false;
+  state.dialogVisible = false;
 };
 // 重置表单方法
 const restForm = (formEl: FormInstance | undefined) => {
-	if (!formEl) return;
-	formEl.resetFields();
-	formEl.clearValidate();
-	state.delayForm.files = [];
+  if (!formEl) return;
+  formEl.resetFields();
+  formEl.clearValidate();
+  state.delayForm.files = [];
 };
 // 选择常用意见 填入填写框 延期
 const chooseAdviceDelay = (item: any) => {
-	state.delayForm.content += item.content;
+  state.delayForm.content += item.content;
 };
 const afterSubmit = (emitType?: 'orderProcessSuccess' | 'orderProcessFailed', showMessage?: boolean, message?: string) => {
-	state.loading = false;
-	closeDialog();
-	const msg = message ?? '操作成功';
-	if (showMessage) ElMessage.success(msg);
-	if (emitType) emit(emitType);
+  state.loading = false;
+  closeDialog();
+  const msg = message ?? '操作成功';
+  if (showMessage) ElMessage.success(msg);
+  if (emitType) emit(emitType);
 };
 const delayFormRef = ref<RefType>();
 const close = () => {
-	restForm(delayFormRef.value);
+  restForm(delayFormRef.value);
 };
 // 提交
 const handleFilesDelay = ref<EmptyArrayType>([]); // 延期附件
 const onSubmit = (formEl: FormInstance | undefined) => {
-	if (!formEl) return;
-	formEl.validate((valid: boolean) => {
-		if (!valid) return;
-		state.loading = true;
-		const requestDelay = {
-			data: {
-				orderId: state.orderDetail.id,
-				delayNum: state.delayForm.timeLimitCount,
-				delayUnit: state.delayForm.timeLimitUnit,
-				delayReason: state.delayForm.content,
-				files: handleFilesDelay.value,
-			},
-			workflow: {
-				nextStepCode: state.delayForm.nextStepCode,
-				nextStepName: state.delayForm.nextStepName,
-				backToCountersignEnd: state.delayForm.backToCountersignEnd,
-				nextHandlers: state.delayForm.nextHandlers,
-				flowDirection: state.delayForm.flowDirection,
-				handlerType: state.delayForm.handlerType,
-				stepType: state.delayForm.stepType,
-				businessType: state.delayForm.businessType,
-				isSms: state.delayForm.isSms,
-				opinion: state.delayForm.content,
-				files: handleFilesDelay.value,
-			},
-		};
-		delayApply(requestDelay)
-			.then(() => {
-				afterSubmit('orderProcessSuccess', true, '延期申请成功');
-			})
-			.catch(() => {
-				afterSubmit('orderProcessFailed');
-			});
-	});
+  if (!formEl) return;
+  formEl.validate((valid: boolean) => {
+    if (!valid) return;
+    state.loading = true;
+    const requestDelay = {
+      data: {
+        orderId: state.orderDetail.id,
+        delayNum: state.delayForm.timeLimitCount,
+        delayUnit: state.delayForm.timeLimitUnit,
+        delayReason: state.delayForm.content,
+        files: handleFilesDelay.value,
+      },
+      workflow: {
+        nextStepCode: state.delayForm.nextStepCode,
+        nextStepName: state.delayForm.nextStepName,
+        backToCountersignEnd: state.delayForm.backToCountersignEnd,
+        nextHandlers: state.delayForm.nextHandlers,
+        flowDirection: state.delayForm.flowDirection,
+        handlerType: state.delayForm.handlerType,
+        stepType: state.delayForm.stepType,
+        businessType: state.delayForm.businessType,
+        isSms: state.delayForm.isSms,
+        opinion: state.delayForm.content,
+        files: handleFilesDelay.value,
+      },
+    };
+    delayApply(requestDelay)
+        .then(() => {
+          afterSubmit('orderProcessSuccess', true, '延期申请成功');
+        })
+        .catch(() => {
+          afterSubmit('orderProcessFailed');
+        });
+  });
 };
 // 暴露变量
 defineExpose({
-	openDialog,
-	closeDialog,
+  openDialog,
+  closeDialog,
 });
 </script>

+ 281 - 297
src/views/business/delay/components/Delay-audit.vue

@@ -1,151 +1,149 @@
 <template>
-	<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" :model="state.infoForm" class="show-info-form" v-loading="state.loading">
-			<p class="border-title">申请信息</p>
-			<el-row :gutter="10">
-				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="工单编号"> {{ state.infoForm?.order?.no }} </el-form-item>
-				</el-col>
-				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="工单标题"> {{ state.infoForm?.order?.title }} </el-form-item>
-				</el-col>
-				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="申请人">{{ state.infoForm?.creatorName }} </el-form-item>
-				</el-col>
-				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="申请部门">{{ state.infoForm?.creatorOrgName }} </el-form-item>
-				</el-col>
-				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="申请时间">{{ formatDate(state.infoForm?.creationTime, '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="当前期满时间"> {{ formatDate(state.infoForm?.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="延期申请数量">
-						<span v-if="!editMode"> {{ state.infoForm?.delayNum }} {{ state.infoForm?.delayUnitText }}</span>
-						<template v-else>
-							<el-input-number
-								:min="1"
-								:max="99"
-								:precision="0"
-								placeholder="延期申请数量"
-								size="small"
-								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="onCancelEdit">取消</el-button>
-						</template>
-						<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">
-					<el-form-item label="延期后期满时间">{{ formatDate(state.ruleForm?.afterDelay, '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.infoForm?.isProDelay ? '是' : '否' }} </el-form-item>
-				</el-col>
-				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-					<el-form-item label="申请理由" class="formatted-text">{{ state.infoForm?.delayReason }} </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="state.infoForm.files" readonly classify="延期申请附件" />
-					</el-form-item>
-				</el-col>
-			</el-row>
-		</el-form>
-		<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>
-		<p class="border-title mt20 mb10">审核意见</p>
-		<el-form :model="state.ruleForm" label-width="110px" ref="ruleFormRef" v-loading="state.loading">
-			<el-row :gutter="10">
-				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="审批结果" prop="isPass" :rules="[{ required: true, message: '请选择审批结果', trigger: 'change' }]">
-						<el-radio-group v-model="state.ruleForm.isPass">
-							<el-radio :value="true">同意</el-radio>
-							<el-radio :value="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="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' }]">
-							<el-select v-model="state.ruleForm.nextStepCode" placeholder="请选择下一环节" class="w100" @change="selectNextStep">
-								<el-option v-for="item in state.nextStepOptions" :key="item.key" :label="item.value" :value="item.key" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="showHandlers">
-						<el-form-item
-							label="办理对象"
-							prop="nextHandlers"
-							:rules="[{ required: nextHandlersRequired, message: '请选择办理对象', trigger: 'change' }]"
-						>
-							<el-select-v2
-								v-model="state.ruleForm.nextHandlers"
-								:options="state.handlerOptions"
-								placeholder="请选择办理对象"
-								class="w100"
-								multiple
-								clearable
-								collapse-tags
-								collapse-tags-tooltip
-								filterable
-								value-key="key"
-								@change="selectHandlers"
-								:multiple-limit="multipleLimit"
-							/>
-						</el-form-item>
-					</el-col>
-				</template>
-				<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
-							@chooseAdvice="chooseAdvice"
-							v-model="state.ruleForm.opinion"
-							placeholder="请填写审批意见"
-							:loading="state.loading"
-							:commonEnum="commonEnum.Delay"
-							:maxlength="AppConfigInfo.handleOpinionWordLimit"
-						/>
-					</el-form-item>
-				</el-col>
-				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-					<el-form-item label="附件" :rules="[{ required: false, message: '请上传附件', trigger: 'change' }]">
-						<annex-list name="延期附件" classify="延期上传" v-model:format="handleFiles" />
-					</el-form-item>
-				</el-col>
-			</el-row>
-		</el-form>
-		<template #footer>
+  <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" :model="state.infoForm" class="show-info-form" v-loading="state.loading">
+      <p class="border-title">申请信息</p>
+      <el-row :gutter="10">
+        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+          <el-form-item label="工单编号"> {{ state.infoForm?.order?.no }} </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+          <el-form-item label="工单标题"> {{ state.infoForm?.order?.title }} </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+          <el-form-item label="申请人">{{ state.infoForm?.creatorName }} </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+          <el-form-item label="申请部门">{{ state.infoForm?.creatorOrgName }} </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+          <el-form-item label="申请时间">{{ formatDate(state.infoForm?.creationTime, '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="当前期满时间"> {{ formatDate(state.infoForm?.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="延期申请数量">
+            <span v-if="!editMode"> {{ state.infoForm?.delayNum }} {{ state.infoForm?.delayUnitText }}</span>
+            <template v-else>
+              <el-input-number
+                  :min="1"
+                  :max="99"
+                  :precision="0"
+                  placeholder="延期申请数量"
+                  size="small"
+                  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>
+            </template>
+<!--            <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">
+          <el-form-item label="延期后期满时间">{{ formatDate(state.ruleForm?.afterDelay, '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.infoForm?.isProDelay ? '是' : '否' }} </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <el-form-item label="申请理由" class="formatted-text">{{ state.infoForm?.delayReason }} </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="state.infoForm.files" readonly classify="延期申请附件" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <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>
+    <p class="border-title mt20 mb10">审核意见</p>
+    <el-form :model="state.ruleForm" label-width="110px" ref="ruleFormRef" v-loading="state.loading">
+      <el-row :gutter="10">
+        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+          <el-form-item label="审批结果" prop="isPass" :rules="[{ required: true, message: '请选择审批结果', trigger: 'change' }]">
+            <el-radio-group v-model="state.ruleForm.isPass">
+              <el-radio :value="true">同意</el-radio>
+              <el-radio :value="false">不同意</el-radio>
+            </el-radio-group>
+          </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' }]">
+              <el-select v-model="state.ruleForm.nextStepCode" placeholder="请选择下一环节" class="w100" @change="selectNextStep">
+                <el-option v-for="item in state.nextStepOptions" :key="item.key" :label="item.value" :value="item.key" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-if="showHandlers">
+            <el-form-item
+                label="办理对象"
+                prop="nextHandlers"
+                :rules="[{ required: nextHandlersRequired, message: '请选择办理对象', trigger: 'change' }]"
+            >
+              <el-select-v2
+                  v-model="state.ruleForm.nextHandlers"
+                  :options="state.handlerOptions"
+                  placeholder="请选择办理对象"
+                  class="w100"
+                  multiple
+                  clearable
+                  collapse-tags
+                  collapse-tags-tooltip
+                  filterable
+                  value-key="key"
+                  @change="selectHandlers"
+                  :multiple-limit="multipleLimit"
+              />
+            </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
+                @chooseAdvice="chooseAdvice"
+                v-model="state.ruleForm.opinion"
+                placeholder="请填写审批意见"
+                :loading="state.loading"
+                :commonEnum="commonEnum.Delay"
+                :maxlength="AppConfigInfo.handleOpinionWordLimit"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <el-form-item label="附件" :rules="[{ required: false, message: '请上传附件', trigger: 'change' }]">
+            <annex-list name="延期附件" classify="延期上传" v-model:format="handleFiles" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <template #footer>
 			<span class="dialog-footer">
 				<el-button @click="closeDialog" class="default-button">取 消</el-button>
 				<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="state.loading">确定</el-button>
 			</span>
-		</template>
-	</el-dialog>
+    </template>
+  </el-dialog>
 </template>
 <script setup lang="ts" name="discernDetail">
 import { computed, defineAsyncComponent, reactive, ref } from 'vue';
@@ -168,210 +166,196 @@ const { AppConfigInfo } = storeToRefs(appConfigStore); // 系统配置信息
 const emit = defineEmits(['updateList']); // 定义事件
 // 定义变量内容
 const state = reactive<any>({
-	dialogVisible: false, // 是否显示弹窗
-	loading: false, // 是否显示加载
-	infoForm: {},
-	ruleForm: {
-		isPass: true,
-		nextHandlers: [],
-		isSms: false,
-		opinion: '', // 意见
-		nextStepCode: '', // 下一节点
-		nextStepName: '', // 下一节点名称
-		backToCountersignEnd: false,
-		stepId: null,
-		workflowId: null,
-	},
-	handlerOptions: [],
-	nextStepOptions: [],
+  dialogVisible: false, // 是否显示弹窗
+  loading: false, // 是否显示加载
+  infoForm: {},
+  ruleForm: {
+    isPass: true,
+    nextHandlers: [],
+    isSms: false,
+    opinion: '', // 意见
+    nextStepCode: '', // 下一节点
+    nextStepName: '', // 下一节点名称
+    backToCountersignEnd: false,
+    stepId: null,
+    workflowId: null,
+  },
+  handlerOptions: [],
+  nextStepOptions: [],
 });
 
+const tableData = ref<EmptyArrayType>([]);
 /*
  * @params row 工单详情
  * @description 打开弹窗
  * */
-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(currentRow.value.id);
-		state.infoForm = result ?? {};
-		state.infoForm.files = transformFile(state.infoForm.files);
-		state.ruleForm.workflowId = currentRow.value.workflowId;
-		await getWorkflow(result.workflowId);
-		await selectNextStepOptions(result.workflowId);
-		state.loading = false;
-	} catch (e) {
-		console.log(e);
-		state.loading = false;
-	}
+const openDialog = async (row: any) => {
+  state.dialogVisible = true;
+  state.loading = true;
+  try {
+    const { result } = await delayDetail(row.id);
+    state.infoForm = result ?? {};
+    state.infoForm.files = transformFile(state.infoForm.files);
+    state.ruleForm.workflowId = row.workflowId;
+    await getWorkflow(result.workflowId);
+    await selectNextStepOptions(result.workflowId);
+    state.loading = false;
+  } catch (e) {
+    console.log(e);
+    state.loading = false;
+  }
 };
 // 修改延期数量
 const editMode = ref<boolean>(false);
-// 取消修改延期数量
-const onCancelEdit = () => {
-	editMode.value = false;
-	getDelayDetail();
-};
 // 确定修改延期数量
 const editConfirm = () => {};
 const formatTraces = (val: any) => {
-	if (!val || !val.length) return [];
-	val.forEach((item: any) => {
-		item.files = transformFile(item.files);
-	});
-	return val;
+  if (!val || !val.length) return [];
+  val.forEach((item: any) => {
+    item.files = transformFile(item.files);
+  });
+  return val;
 };
 // 获取流程
-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);
-	}
+  try {
+    // 查询审核记录
+    const { result } = await workflowTraces(workflowId);
+    tableData.value = formatTraces(result?.traces);
+  } catch (e) {
+    console.log(e);
+  }
 };
 const nextHandlersRequired = ref<Boolean>(false); // 办理对象是否必填
 const canStartCountersign = ref<Boolean>(false); // 是否可以会签
 const selectNext = ref<any>({});
 // 查询流程办理节点
 const selectNextStepOptions = async (workflowId: string) => {
-	try {
-		const { result } = await delayApproveParams(workflowId); //获取延期审批流程参数
-		state.nextStepOptions = result.steps; //办理对象选择内容
-		canStartCountersign.value = result.canStartCountersign ?? false; // 是否可以发起会签
-		if (state.nextStepOptions.length === 1) {
-			// 下一节点是否只有一个 默认选中第一个
-			setTimeout(() => {
-				state.ruleForm.nextStepCode = state.nextStepOptions[0].key; // 下一节点code
-				state.ruleForm.nextStepName = state.nextStepOptions[0].value; // 下一节点name
-				state.ruleForm.backToCountersignEnd = state.nextStepOptions[0].backToCountersignEnd ?? false; // 是否回到会签结束节点
-			}, 100);
-			selectNextStep(state.nextStepOptions[0].key); // 查询流程下一节点参数
-		} else {
-			state.ruleForm.nextStepCode = '';
-			state.ruleForm.nextStepName = '';
-		}
-		state.ruleForm.stepId = result.stepId;
-		state.loading = false;
-	} catch (e) {
-		console.log(e);
-	}
+  try {
+    const { result } = await delayApproveParams(workflowId); //获取延期审批流程参数
+    state.nextStepOptions = result.steps; //办理对象选择内容
+    canStartCountersign.value = result.canStartCountersign ?? false; // 是否可以发起会签
+    if (state.nextStepOptions.length === 1) {
+      // 下一节点是否只有一个 默认选中第一个
+      setTimeout(() => {
+        state.ruleForm.nextStepCode = state.nextStepOptions[0].key; // 下一节点code
+        state.ruleForm.nextStepName = state.nextStepOptions[0].value; // 下一节点name
+        state.ruleForm.backToCountersignEnd = state.nextStepOptions[0].backToCountersignEnd ?? false; // 是否回到会签结束节点
+      }, 100);
+      selectNextStep(state.nextStepOptions[0].key); // 查询流程下一节点参数
+    } else {
+      state.ruleForm.nextStepCode = '';
+      state.ruleForm.nextStepName = '';
+    }
+    state.ruleForm.stepId = result.stepId;
+    state.loading = false;
+  } catch (e) {
+    console.log(e);
+  }
 };
 const selectNextStep = (val: any) => {
-	ruleFormRef.value?.resetFields('nextHandlers');
-	const next = state.nextStepOptions.find((item: any) => item.key === val);
-	selectNext.value = next;
-	const items = next.items; //获取下一节点
-	state.ruleForm.nextStepName = next.value; // 下一节点name
-	state.ruleForm.handlerType = next.handlerType;
-	state.ruleForm.businessType = next.businessType;
-	state.ruleForm.flowDirection = next.flowDirection;
-	state.ruleForm.backToCountersignEnd = next.backToCountersignEnd ?? false; // 是否回到会签结束节点
-	state.handlerOptions = items ?? [];
-	state.handlerOptions = state.handlerOptions.map((item: any) => {
-		return {
-			value: {
-				...item,
-			},
-			label: item.value,
-		};
-	});
-	// 办理对象是否必填
-	nextHandlersRequired.value = ![0].includes(next.handlerType);
+  ruleFormRef.value?.resetFields('nextHandlers');
+  const next = state.nextStepOptions.find((item: any) => item.key === val);
+  selectNext.value = next;
+  const items = next.items; //获取下一节点
+  state.ruleForm.nextStepName = next.value; // 下一节点name
+  state.ruleForm.handlerType = next.handlerType;
+  state.ruleForm.businessType = next.businessType;
+  state.ruleForm.flowDirection = next.flowDirection;
+  state.ruleForm.backToCountersignEnd = next.backToCountersignEnd ?? false; // 是否回到会签结束节点
+  state.handlerOptions = items ?? [];
+  state.handlerOptions = state.handlerOptions.map((item: any) => {
+    return {
+      value: {
+        ...item,
+      },
+      label: item.value,
+    };
+  });
+  // 办理对象是否必填
+  nextHandlersRequired.value = ![0].includes(next.handlerType);
 
-	if (items.length === 1) {
-		// 如果办理对象只有一个默认选中
-		state.ruleForm.nextHandlers = [items[0]];
-	}
+  if (items.length === 1) {
+    // 如果办理对象只有一个默认选中
+    state.ruleForm.nextHandlers = [items[0]];
+  }
 };
 // 选择办理对象
 const selectHandlers = () => {
-	if (state.ruleForm.nextHandlers.length <= 1) {
-		// 如果只有一个办理对象就不需要发起会签
-		state.ruleForm.isStartCountersign = false;
-	}
+  if (state.ruleForm.nextHandlers.length <= 1) {
+    // 如果只有一个办理对象就不需要发起会签
+    state.ruleForm.isStartCountersign = false;
+  }
 };
 // 是否展示办理对象 (结束节点不展示: next.stepType===2 表示为结束节点)
 const showHandlers = computed(() => {
-	/*	const next = state.nextStepOptions.find((item: any) => item.key === state.ruleForm.nextStepCode);
-	if (!next) return true;
-	// 话务部到派单 派单组到一级部门 也不需要展示办理对象
-	return next?.stepType !== 2;*/
-	return false;
+  const next = state.nextStepOptions.find((item: any) => item.key === state.ruleForm.nextStepCode);
+  if (!next) return true;
+  // 话务部到派单 派单组到一级部门 也不需要展示办理对象
+  return next?.stepType !== 2;
 });
 
 // 办理对象是否能够选择多个(可以发起会签可以选择多个,不能发起会签只能选择一个) 加个判断 选择的下一环节必须是部门(会签必须是选择的部门)
 const multipleLimit = computed(() => {
-	return canStartCountersign.value && selectNext.value.businessType === 2 ? 0 : 1;
+  return canStartCountersign.value && selectNext.value.businessType === 2 ? 0 : 1;
 });
 // 选择常用意见 填入填写框 办理
 const chooseAdvice = (item: any) => {
-	state.ruleForm.opinion += item.content;
+  state.ruleForm.opinion += item.content;
 };
 // 关闭弹窗
 const closeDialog = () => {
-	state.dialogVisible = false;
+  state.dialogVisible = false;
 };
 const close = () => {
-	ruleFormRef.value?.resetFields();
-	ruleFormRef.value?.resetFields();
-	tableData.value = [];
-	currentRow.value = {};
+  ruleFormRef.value?.resetFields();
+  ruleFormRef.value?.resetFields();
 };
 // 提交
 const afterSubmit = (emitType?: 'updateList', showMessage?: boolean, message?: string) => {
-	state.loading = false;
-	closeDialog();
-	const msg = message ?? '延期审批成功';
-	if (showMessage) ElMessage.success(msg);
-	if (emitType) emit(emitType);
+  state.loading = false;
+  closeDialog();
+  const msg = message ?? '延期审批成功';
+  if (showMessage) ElMessage.success(msg);
+  if (emitType) emit(emitType);
 };
 const ruleFormRef = ref<RefType>();
 const handleFiles = ref<EmptyArrayType>([]); // 附件
 const onSubmit = (formEl: FormInstance | undefined) => {
-	if (!formEl) return;
-	formEl.validate((valid: boolean) => {
-		if (!valid) return;
-		state.loading = true;
-		let submitObj = other.deepClone(state.ruleForm);
-		if (state.ruleForm.isPass) {
-			// 审批通过 下一步
-			workflowNext({ ...submitObj, reviewResult: 1, files: handleFiles.value })
-				.then(() => {
-					afterSubmit('updateList', true);
-				})
-				.catch(() => {
-					afterSubmit('updateList');
-				});
-		} else {
-			// 审批拒绝
-			const requestDiscernAudit = {
-				opinion: state.ruleForm.opinion,
-				workflowId: state.ruleForm.workflowId,
-				files: handleFiles.value,
-				stepId: state.ruleForm.stepId,
-			};
-			workflowReject(requestDiscernAudit)
-				.then(() => {
-					afterSubmit('updateList', true);
-				})
-				.catch(() => {
-					afterSubmit('updateList');
-				});
-		}
-	});
+  if (!formEl) return;
+  formEl.validate((valid: boolean) => {
+    if (!valid) return;
+    state.loading = true;
+    let submitObj = other.deepClone(state.ruleForm);
+    if (state.ruleForm.isPass) {
+      // 审批通过 下一步
+      workflowNext({ ...submitObj, reviewResult: 1, files: handleFiles.value })
+          .then(() => {
+            afterSubmit('updateList', true);
+          })
+          .catch(() => {
+            afterSubmit('updateList');
+          });
+    } else {
+      // 审批拒绝
+      const requestDiscernAudit = {
+        opinion: state.ruleForm.opinion,
+        workflowId: state.ruleForm.workflowId,
+        files: handleFiles.value,
+        stepId: state.ruleForm.stepId,
+      };
+      workflowReject(requestDiscernAudit)
+          .then(() => {
+            afterSubmit('updateList', true);
+          })
+          .catch(() => {
+            afterSubmit('updateList');
+          });
+    }
+  });
 };
 defineExpose({
-	openDialog,
-	closeDialog,
+  openDialog,
+  closeDialog,
 });
 </script>

+ 129 - 103
src/views/business/delay/components/Delay-detail.vue

@@ -1,130 +1,156 @@
 <template>
-	<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">
-			<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>
-				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="工单标题"> {{ state.ruleForm?.order?.title }} </el-form-item>
-				</el-col>
-				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="申请人">{{ state.ruleForm?.creatorName }} </el-form-item>
-				</el-col>
-				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="申请部门">{{ state.ruleForm?.creatorOrgName }} </el-form-item>
-				</el-col>
-				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="申请时间">{{ formatDate(state.ruleForm?.creationTime, '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="当前期满时间"> {{ 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-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>
-				</el-col>-->
-				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-					<el-form-item label="是否省延期">{{ state.ruleForm?.isProDelay ? '是' : '否' }} </el-form-item>
-				</el-col>
-				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-					<el-form-item label="申请理由" class="formatted-text">{{ state.ruleForm?.delayReason }} </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="state.ruleForm.files" readonly classify="延期申请附件" />
-					</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>
+  <el-dialog v-model="state.dialogVisible" draggable title="延期详情" ref="dialogRef" width="50%" append-to-body destroy-on-close>
+    <el-form label-width="110px" ref="ruleFormRef" :model="state.ruleForm" class="show-info-form">
+      <el-row :gutter="10">
+        <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>
+        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+          <el-form-item label="工单标题"> {{ state.ruleForm?.order?.title }} </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+          <el-form-item label="申请人">{{ state.ruleForm?.creatorName }} </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+          <el-form-item label="申请部门">{{ state.ruleForm?.creatorOrgName }} </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+          <el-form-item label="申请时间">{{ formatDate(state.ruleForm?.creationTime, '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="当前期满时间"> {{ 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-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>
+        </el-col>-->
+        <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+          <el-form-item label="是否省延期">{{ state.ruleForm?.isProDelay ? '是' : '否' }} </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+          <el-form-item label="申请理由" class="formatted-text">{{ state.ruleForm?.delayReason }} </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="state.ruleForm.files" readonly classify="延期申请附件" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <template #footer>
 			<span class="dialog-footer">
-				<el-button @click="closeDialog" class="default-button">关 闭</el-button>
+				<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
+        >
 			</span>
-		</template>
-	</el-dialog>
+    </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 { workflowTraces } from '@/api/system/workflow';
+import { useThemeConfig } from '@/stores/themeConfig';
+import { storeToRefs } from 'pinia';
+import { ElMessage } from 'element-plus';
 
+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, // 是否显示弹窗
-	loading: false, // 是否显示加载
-	ruleForm: {},
-	currentId: '',
+  dialogVisible: false, // 是否显示弹窗
+  loading: false, // 是否显示加载
+  ruleForm: {},
+  currentId: '',
 });
+const storesThemeConfig = useThemeConfig();
+const { themeConfig } = storeToRefs(storesThemeConfig);
 /*
  * @param row 工单详情
  * @description 打开弹窗
  * */
 const openDialog = async (row: any) => {
-	state.loading = true;
-	state.currentId = row.id;
-	state.dialogVisible = true;
-	try {
-		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 formatTraces = (val: any) => {
-	if (!val || !val.length) return [];
-	val.forEach((item: any) => {
-		item.files = transformFile(item.files);
-	});
-	return val;
-};
-// 获取流程
-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);
-	}
+  state.loading = true;
+  state.currentId = row.id;
+  state.dialogVisible = true;
+  try {
+    const res = await delayDetail(state.currentId);
+    state.ruleForm = res.result ?? {};
+    state.ruleForm.files = transformFile(state.ruleForm.files);
+    state.loading = false;
+  } catch (e) {
+    state.loading = false;
+  }
 };
 // 关闭弹窗
 const closeDialog = () => {
-	state.dialogVisible = false;
+  state.dialogVisible = false;
+};
+// 延期审批
+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 orderProcessSuccess = () => {
+  emit('updateList');
+  closeDialog();
+};
+// 审核失败
+const orderProcessFailed = () => {
+  emit('updateList');
+  closeDialog();
 };
-const close = ()=>{
-  tableData.value = [];
-  state.ruleForm = {};
-}
 defineExpose({
-	openDialog,
-	closeDialog,
+  openDialog,
+  closeDialog,
 });
 </script>