瀏覽代碼

reactor:特提对接;

zhangchong 1 年之前
父節點
當前提交
ba89d9b9d2

二進制
public/favicon.ico


+ 22 - 0
src/api/business/special.ts

@@ -3,6 +3,17 @@
  * @description 业务管理-特提
  */
 import request from '/@/utils/request';
+/**
+ * @description 工单列表-可申请特提
+ * @param {object} params
+ */
+export const orderListSpecial = (params: object) => {
+    return request({
+        url: `/api/v1/Order/special/apply_list`,
+        method: 'get',
+        params
+    });
+};
 /**
  * @description 工单特提列表
  * @param {object} params
@@ -55,4 +66,15 @@ export const specialDetail = (id: string) => {
         url: `/api/v1/Order/special/${id}`,
         method: 'get',
     });
+}
+/**
+ * @description 获取办理时限
+ * @param {object} params
+ */
+export const specialTime = (params: object) => {
+    return request({
+        url: `/api/v1/Order/special/handle_time`,
+        method: 'get',
+        params
+    });
 }

+ 5 - 5
src/views/business/order/components/Order-detail.vue

@@ -524,7 +524,7 @@
 	<!-- 重复工单 -->
 	<order-repeat ref="orderRepeatRef" />
 	<!--  特提 -->
-	<special-handle ref="specialHandleRef" @updateList="onSpecialHandleSuccess" />
+	<special-handle-order ref="specialHandleOrderRef" @updateList="onSpecialHandleSuccess" />
 </template>
 
 <script setup lang="ts" name="orderDetail">
@@ -549,7 +549,7 @@ const AnnexList = defineAsyncComponent(() => import('/@/components/AnnexList/ind
 const ProcessAudit = defineAsyncComponent(() => import('/@/components/ProcessAudit/index.vue')); // 流程审批
 const HistoryOrder = defineAsyncComponent(() => import('/@/views/todo/order/accept/History.vue')); // 历史工单
 const CitizenPortrait = defineAsyncComponent(() => import('/@/views/todo/order/accept/Citizen-portrait.vue')); // 市民坏画像
-const SpecialHandle = defineAsyncComponent(() => import('/@/views/business/special/components/Special-apply.vue')); // 特提申请
+const SpecialHandleOrder = defineAsyncComponent(() => import('/@/views/business/special/components/Special-apply-order.vue')); // 特提申请
 // const AudioPlayer = defineAsyncComponent(() => import('/@/components/AudioPlayer/index.vue'));
 
 // 定义子组件向父组件传值/事件
@@ -761,13 +761,13 @@ const onVisitDetail = (row: any) => {
 	currentVisitObj.value = row;
 };
 // 特提
-const specialHandleRef = ref<RefType>(); // 特提
+const specialHandleOrderRef = ref<RefType>(); // 特提
 const onSpecialHandle = () => {
-	specialHandleRef.value.openDialog(state.ruleForm);
+  specialHandleOrderRef.value.openDialog(state.ruleForm);
 };
 // 特提提交成功
 const onSpecialHandleSuccess = () => {
-	// handleClick(state.activeName);
+	handleClick(state.activeName);
 };
 // 暴露变量
 defineExpose({

+ 186 - 0
src/views/business/special/components/Special-apply-order.vue

@@ -0,0 +1,186 @@
+<template>
+	<el-dialog v-model="state.dialogVisible" draggable title="特提申请" width="50%" append-to-body destroy-on-close @close="close">
+		<div class="collapse-container pb1">
+			<el-form label-width="110px" ref="ruleFormRef" :model="state.ruleForm">
+				<el-row :gutter="35">
+					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+						<el-form-item label="特提节点" prop="traceId" :rules="[{ required: true, message: '请选择特提节点', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.traceId" placeholder="请选择特提节点" class="w100" @change="selectTrace">
+								<el-option v-for="item in traces" :value="item.id" :key="item.id" :label="item.name">
+									<span style="float: left">{{ item.name }}</span>
+									<span style="float: right; color: var(--el-text-color-secondary); font-size: var(--el-font-size-extra-small)">{{
+										item.acceptorOrgName
+									}}</span>
+								</el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="12" v-if="state.ruleForm.traceId">
+						<el-form-item label="办理时限" prop="timeLimit" :rules="[{ required: true, message: '请输入办理时限', trigger: 'blur' }]">
+							<el-row :gutter="10" class="w100"  v-loading="state.loading">
+								<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+									<el-input-number
+										placeholder="办理时限"
+										v-model="state.ruleForm.timeLimit"
+										controls-position="right"
+										class="w100"
+										:min="1"
+										:max="99"
+									></el-input-number>
+								</el-col>
+								<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+									<el-form-item
+										label=""
+										label-width="0"
+										prop="timeLimitUnit"
+										:rules="[{ required: true, message: '请选择办理时限单位', trigger: 'change' }]"
+									>
+										<el-select v-model="state.ruleForm.timeLimitUnit" placeholder="办理时限单位">
+											<el-option v-for="item in specialTimeType" :value="item.key" :key="item.key" :label="item.value" />
+										</el-select>
+									</el-form-item>
+								</el-col>
+							</el-row>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+						<el-form-item label="特提原因" prop="cause" :rules="[{ required: true, message: '请选择特提原因', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.cause" placeholder="请选择特提原因" class="w100">
+								<el-option v-for="item in specialReason" :value="item.dicDataName" :key="item.dicDataName" :label="item.dicDataName" />
+							</el-select>
+						</el-form-item>
+					</el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+            <el-form-item label="" prop="alterTime">
+              <el-checkbox v-model="state.ruleForm.alterTime" label="无需计算期满时间" />
+            </el-form-item>
+          </el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="特提理由" prop="reason" :rules="[{ required: true, message: '请填写特提理由', trigger: 'blur' }]">
+							<el-input v-model="state.ruleForm.reason" type="textarea" :autosize="{ minRows: 6, maxRows: 10 }" placeholder="请填写特提理由" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="附件" prop="handleResult" :rules="[{ required: false, message: '请选择附件', trigger: 'change' }]">
+							<annex-list name="特提附件" ref="annexListRef" businessId="" 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(ruleFormRef)" :loading="state.loading">提交</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+<script setup lang="ts" name="SpecialDialog">
+import { defineAsyncComponent, reactive, ref } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { specialApplyBase, specialApply, specialTime } from '/@/api/business/special';
+
+// 引入组件
+const AnnexList = defineAsyncComponent(() => import('/@/components/AnnexList/index.vue'));
+
+// 定义子组件向父组件传值/事件
+const emit = defineEmits(['updateList']);
+// 定义变量内容
+const state = reactive<any>({
+	dialogVisible: false, // 是否显示弹窗
+	loading: false, // 是否显示加载
+	ruleForm: {
+		traceId: null, // 特提节点
+		timeLimitUnit: 2, // 期满时间单位
+		orgId: null, // 部门id
+		orgName: null, // 部门名称
+		alterTime: false, // 是否修改期满时间
+	},
+	orderDetail: {}, // 工单详情
+});
+const ruleFormRef = ref<RefType>();
+const specialReason = ref<EmptyArrayType>([]); // 特提理由
+const traces = ref<EmptyArrayType>([]); // 特提节点
+const specialTimeType = ref<EmptyArrayType>([]); // 期满时间单位
+/**
+ * @description 打开弹窗
+ * @param {object} val 工单详情
+ * @param {boolean} audit 是否是审核
+ */
+const isAudit = ref<boolean>(false);
+const openDialog = async (val: any, audit = false) => {
+	state.orderDetail = val;
+	isAudit.value = audit;
+	console.log(val, 'val');
+	state.loading = true;
+	state.dialogVisible = true;
+	try {
+		const [baseRes] = await Promise.all([specialApplyBase(val.workflowId)]);
+		traces.value = baseRes.result.traces ?? [];
+		specialReason.value = baseRes.result.specialReason ?? [];
+		specialTimeType.value = baseRes.result.specialTimeType ?? [];
+	} catch (e) {
+		console.log(e);
+	} finally {
+		state.loading = false;
+	}
+	state.dialogVisible = true;
+};
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+const close = () => {
+	ruleFormRef.value?.clearValidate();
+	ruleFormRef.value?.resetFields();
+};
+// 选择节点确定部门
+const selectTrace = (val: any) => {
+	const trace = traces.value.find((item) => item.id === val);
+	state.ruleForm.orgId = trace?.acceptorOrgId;
+	state.ruleForm.orgName = trace?.acceptorOrgName;
+	queryHandleTime();
+};
+// 查询办理时限
+const queryHandleTime = () => {
+	if (state.ruleForm.alterTime) return;
+	state.loading = true;
+	specialTime({ OrderId: state.orderDetail.id, TraceId: state.ruleForm.traceId })
+		.then((res) => {
+			state.ruleForm.timeLimit = res.result ?? 0;
+		})
+		.finally(() => {
+			state.loading = false;
+		});
+};
+// 提交
+const annexListRef = ref<RefType>(); // 附件列表
+const onSubmit = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		state.loading = true;
+		let request = {
+			...state.ruleForm,
+			orderId: state.orderDetail.id,
+			files: annexListRef.value?.fileList,
+			audit: isAudit.value,
+		};
+		specialApply(request)
+			.then((res: any) => {
+				state.loading = false;
+				closeDialog();
+				emit('updateList');
+				ElMessage.success('操作成功');
+			})
+			.catch(() => {
+				state.loading = false;
+			});
+	});
+};
+defineExpose({
+	openDialog,
+	closeDialog,
+});
+</script>

+ 9 - 2
src/views/business/special/components/Special-apply.vue

@@ -103,9 +103,15 @@ const storesUserInfo = useUserInfo();
 const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
 const specialReason = ref<EmptyArrayType>([]); // 特提理由
 const traces =  ref<EmptyArrayType>([]); // 特提节点
-// 打开弹窗
-const openDialog = (val: any) => {
+/**
+ * @description 打开弹窗
+ * @param {object} val 工单详情
+ * @param {boolean} audit 是否是审核
+ */
+const isAudit = ref<boolean>(false);
+const openDialog = (val: any,audit=false) => {
   state.orderDetail = val;
+  isAudit.value = audit;
   specialApplyBase(val.workflowId).then((res: any) => {
     specialReason.value = res.result.specialReason ?? [];
     traces.value = res.result.traces ?? [];
@@ -131,6 +137,7 @@ const onSubmit = (formEl: FormInstance | undefined) => {
       ...state.ruleForm,
       orderId: state.orderDetail.id,
       files: annexListRef.value?.fileList,
+      audit:isAudit.value
     };
     specialApply(request)
         .then((res: any) => {

+ 190 - 154
src/views/business/special/components/Special-audit.vue

@@ -1,127 +1,113 @@
 <template>
-  <el-dialog
-      v-model="state.dialogVisible"
-      draggable
-      title="特提审核"
-      width="50%"
-      append-to-body
-      destroy-on-close
-      @close="close"
-  >
-    <div class="collapse-container pb1">
-      <el-form label-width="110px" ref="ruleFormRef" :model="state.ruleForm">
-        <el-row :gutter="35">
-          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-            <el-form-item label="工单编码" class="mb5"> {{ state.detail?.order?.no }} </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-            <el-form-item label="工单标题" class="mb5"> {{ state.detail?.order?.title }} </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-            <el-form-item label="申请人" class="mb5"> {{ state.detail?.creatorName}} </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-            <el-form-item label="申请部门" class="mb5"> {{ state.detail?.creatorOrgName }} </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-            <el-form-item label="申请时间" class="mb5"> {{ formatDate(state.detail?.creationTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
-            <el-form-item label="特提节点" class="mb5">
-              {{ state.detail?.trace?.name}}
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
-            <el-form-item label="特提原因" class="mb5">
-              {{ state.detail?.cause}}
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-            <el-form-item label="特提理由" class="mb5">
-              {{ state.detail?.reason }}
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
-            <el-form-item label="附件" class="mb5">
-              <annex-list name="特提附件" ref="annexListRef" businessId="" classify="特提申请" />
-            </el-form-item>
-          </el-col>
-          <el-divider></el-divider>
-          <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
-            <el-form-item label="特提节点" prop="traceId" :rules="[{ required: true, message: '请选择特提节点', trigger: 'change' }]">
-              <el-select
-                  v-model="state.ruleForm.traceId"
-                  placeholder="请选择特提节点"
-                  class="w100"
-              >
-                <el-option v-for="item in traces" :value="item.id" :key="item.id" :label="item.name" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="12">
-            <el-form-item label="办理时限" prop="timeLimit" :rules="[{ required: true, message: '请输入办理时限', trigger: 'blur' }]">
-              <el-row :gutter="10">
-                <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
-                  <el-input-number
-                      placeholder="办理时限"
-                      v-model="state.ruleForm.timeLimit"
-                      controls-position="right"
-                      class="w100"
-                      @input="computeTime"
-                      :min="1"
-                      :max="99"
-                  ></el-input-number>
-                </el-col>
-                <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" v-loading="state.loading">
+	<el-dialog v-model="state.dialogVisible" draggable title="特提审核" width="50%" append-to-body destroy-on-close @close="close">
+		<div class="collapse-container pb1">
+			<el-form label-width="110px" ref="ruleFormRef" :model="state.ruleForm">
+				<el-row :gutter="35">
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="工单编码" class="mb5"> {{ state.detail?.order?.no }} </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="工单标题" class="mb5"> {{ state.detail?.order?.title }} </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="申请人" class="mb5"> {{ state.detail?.creatorName }} </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="申请部门" class="mb5"> {{ state.detail?.creatorOrgName }} </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="申请时间" class="mb5"> {{ formatDate(state.detail?.creationTime, 'YYYY-mm-dd HH:MM:SS') }} </el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+						<el-form-item label="特提节点" class="mb5">
+							{{ state.detail?.trace?.name }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+						<el-form-item label="特提原因" class="mb5">
+							{{ state.detail?.cause }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="特提理由" class="mb5">
+							{{ state.detail?.reason }}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="附件" class="mb5">
+							<annex-list name="特提附件" ref="annexListRef" businessId="" classify="特提申请" />
+						</el-form-item>
+					</el-col>
+					<el-divider></el-divider>
+					<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+						<el-form-item label="特提节点" prop="traceId" :rules="[{ required: true, message: '请选择特提节点', trigger: 'change' }]">
+							<el-select v-model="state.ruleForm.traceId" placeholder="请选择特提节点" class="w100" @change="selectTrace">
+								<el-option v-for="item in traces" :value="item.id" :key="item.id" :label="item.name">
+									<span style="float: left">{{ item.name }}</span>
+									<span style="float: right; color: var(--el-text-color-secondary); font-size: var(--el-font-size-extra-small)">{{ item.acceptorOrgName }}</span>
+								</el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="12" v-if="state.ruleForm.traceId">
+						<el-form-item label="办理时限" prop="timeLimit" :rules="[{ required: true, message: '请输入办理时限', trigger: 'blur' }]">
+							<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.ruleForm.timeLimit"
+										controls-position="right"
+										class="w100"
+										:min="1"
+										:max="99"
+									></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 v-model="state.ruleForm.timeLimitUnit" placeholder="办理时限单位" @change="computeTime">
+                    <el-select v-model="state.ruleForm.timeLimitUnit" placeholder="办理时限单位">
                       <el-option v-for="item in specialTimeType" :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.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="reason" :rules="[{ required: true, message: '请填写特提审批意见', trigger: 'blur' }]">
-              <el-input
-                  v-model="state.ruleForm.reason"
-                  type="textarea"
-                  :autosize="{ minRows: 6, maxRows: 10 }"
-                  placeholder="请填写特提审批意见"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-    </div>
-    <template #footer>
+								</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="alterTime">
+							<el-checkbox v-model="state.ruleForm.alterTime" label="无需计算期满时间" />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+						<el-form-item label="审批意见" prop="reason" :rules="[{ required: true, message: '请填写特提审批意见', trigger: 'blur' }]">
+							<el-input v-model="state.ruleForm.reason" type="textarea" :autosize="{ minRows: 6, maxRows: 10 }" placeholder="请填写特提审批意见" />
+						</el-form-item>
+					</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(ruleFormRef)" :loading="state.loading">提交</el-button>
+        <el-button type="primary" @click="onReject(ruleFormRef)" :loading="state.loading">驳回</el-button>
+				<el-button type="primary" @click="onPass(ruleFormRef)" :loading="state.loading">通过</el-button>
 			</span>
-    </template>
-  </el-dialog>
+		</template>
+	</el-dialog>
 </template>
 <script setup lang="ts" name="SpecialDialogAudit">
-import {defineAsyncComponent, reactive, ref} from 'vue';
-import {ElMessage, FormInstance} from 'element-plus';
-import {storeToRefs} from 'pinia';
-import {useUserInfo} from '/@/stores/userInfo';
-import {formatDate} from '/@/utils/formatTime';
-import {specialApplyBase,specialApprove,specialDetail} from '/@/api/business/special';
-import {debounce} from "/@/utils/tools";
-import dayjs from "dayjs";
+import { defineAsyncComponent, reactive, ref } from 'vue';
+import { ElMessage, FormInstance } from 'element-plus';
+import { storeToRefs } from 'pinia';
+import { useUserInfo } from '/@/stores/userInfo';
+import { formatDate } from '/@/utils/formatTime';
+import { specialApplyBase, specialApprove, specialDetail, specialTime } from '/@/api/business/special';
+import { debounce } from '/@/utils/tools';
+import dayjs from 'dayjs';
 
 // 引入组件
 const AnnexList = defineAsyncComponent(() => import('/@/components/AnnexList/index.vue'));
@@ -130,67 +116,117 @@ const AnnexList = defineAsyncComponent(() => import('/@/components/AnnexList/ind
 const emit = defineEmits(['updateList']);
 // 定义变量内容
 const state = reactive<any>({
-  dialogVisible: false, // 是否显示弹窗
-  loading: false, // 是否显示加载
-  ruleForm: {
-    traceId: null, // 特提节点
-    cause:null, // 特提原因
-    reason: null, // 特提理由
-  },
-  detail: {}, // 详情信息
+	dialogVisible: false, // 是否显示弹窗
+	loading: false, // 是否显示加载
+	ruleForm: {
+		traceId: null, // 特提节点
+    timeLimitUnit: 2, // 期满时间单位
+    orgId: null, // 部门id
+    orgName: null, // 部门名称
+    alterTime: false, // 是否修改期满时间
+	},
+	detail: {}, // 详情信息
 });
 const ruleFormRef = ref<RefType>();
 const storesUserInfo = useUserInfo();
 const { userInfos } = storeToRefs(storesUserInfo); // 用户信息
-const traces =  ref<EmptyArrayType>([]); // 特提节点
-const specialTimeType = ref<EmptyArrayType>([]) // 期满时间单位
+const traces = ref<EmptyArrayType>([]); // 特提节点
+const specialTimeType = ref<EmptyArrayType>([]); // 期满时间单位
 // 打开弹窗
 const openDialog = async (val: any) => {
-  console.log(val,'val')
-  state.loading = true;
-  try {
-    state.dialogVisible = true;
-    const [baseRes,detailRes] = await Promise.all([specialApplyBase(val.order?.workflowId),specialDetail(val.id)]);
-    traces.value = baseRes.result.traces ?? [];
-    specialTimeType.value = baseRes.result.specialTimeType ?? [];
-    state.detail = detailRes.result;
-  }catch (e) {
-    console.log(e)
-  }finally {
-    state.loading = false;
-  }
+	console.log(val, 'val');
+	state.loading = true;
+  state.dialogVisible = true;
+	try {
+		const [baseRes, detailRes] = await Promise.all([
+			specialApplyBase(val.order?.workflowId),
+			specialDetail(val.id)
+		]);
+		traces.value = baseRes.result.traces ?? [];
+		specialTimeType.value = baseRes.result.specialTimeType ?? [];
+		state.detail = detailRes.result;
+	} catch (e) {
+		console.log(e);
+	} finally {
+		state.loading = false;
+	}
 };
 // 关闭弹窗
 const closeDialog = () => {
-  state.dialogVisible = false;
+	state.dialogVisible = false;
+};
+const close = () => {
+	ruleFormRef.value?.clearValidate();
+	ruleFormRef.value?.resetFields();
 };
-const close = ()=>{
-  ruleFormRef.value?.clearValidate();
-  ruleFormRef.value?.resetFields();
-}
-// 计算期满时间
-const computeTime = debounce(() => {
-  if (!state.delayForm.timeLimitCount || !state.delayForm.timeLimitUnit) return;
-  const request = {
-    delayNum: state.ruleForm.timeLimitCount,
-    delayUnit: state.ruleForm.timeLimitUnit,
-    beginTime: state.orderDetail.expiredTime,
-  };
-  state.loading = true;
-
-}, 300);
 
-// 提交
+// 选择节点确定部门
+const selectTrace = (val: any) => {
+  const trace = traces.value.find((item) => item.id === val);
+  state.ruleForm.orgId = trace?.acceptorOrgId;
+  state.ruleForm.orgName = trace?.acceptorOrgName;
+  queryHandleTime();
+};
+// 查询办理时限
+const queryHandleTime = () => {
+  if (state.ruleForm.alterTime) return;
+  state.loading = true;
+  specialTime({ OrderId: state.detail.orderId, TraceId: state.ruleForm.traceId })
+      .then((res) => {
+        state.ruleForm.timeLimit = res.result ?? 0;
+      })
+      .finally(() => {
+        state.loading = false;
+      });
+};
+// 通过
 const annexListRef = ref<RefType>(); // 附件列表
-const onSubmit = (formEl: FormInstance | undefined) => {
+const onPass = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.validate((valid: boolean) => {
+		if (!valid) return;
+		state.loading = true;
+		let request = {
+      id:state.detail.id,
+      orderId: state.detail.orderId,
+      orgId: state.ruleForm.orgId,
+      orgName: state.ruleForm.orgName,
+      timeLimit: state.ruleForm.timeLimit,
+      timeLimitUnit: state.ruleForm.timeLimitUnit,
+      cause: state.detail.cause,
+      opinion: state.detail.reason,
+      files: annexListRef.value?.fileList,
+      state:1, // 审核结果 0 待审核 1 审核通过 2 审核不通过
+		};
+		specialApprove(request)
+			.then((res: any) => {
+				state.loading = false;
+				closeDialog();
+				emit('updateList');
+				ElMessage.success('操作成功');
+			})
+			.catch(() => {
+				state.loading = false;
+			});
+	});
+};
+// 驳回
+const onReject = (formEl: FormInstance | undefined) => {
   if (!formEl) return;
   formEl.validate((valid: boolean) => {
     if (!valid) return;
     state.loading = true;
     let request = {
-      ...state.ruleForm,
-      orderId: state.orderDetail.id,
+      id:state.detail.id,
+      orderId: state.detail.orderId,
+      orgId: state.ruleForm.orgId,
+      orgName: state.ruleForm.orgName,
+      timeLimit: state.ruleForm.timeLimit,
+      timeLimitUnit: state.ruleForm.timeLimitUnit,
+      cause: state.detail.cause,
+      opinion: state.detail.reason,
       files: annexListRef.value?.fileList,
+      state:2,
     };
     specialApprove(request)
         .then((res: any) => {
@@ -205,7 +241,7 @@ const onSubmit = (formEl: FormInstance | undefined) => {
   });
 };
 defineExpose({
-  openDialog,
-  closeDialog,
+	openDialog,
+	closeDialog,
 });
 </script>

+ 31 - 62
src/views/business/special/index.vue

@@ -28,76 +28,53 @@
       <!-- 表格 -->
       <el-table :data="state.tableData" v-loading="state.loading" row-key="id" ref="multipleTableRef" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" />
-        <el-table-column prop="order.no" label="工单编码" show-overflow-tooltip width="150"></el-table-column>
-        <el-table-column width="100" label="省/市工单" prop="isProvince" >
+        <el-table-column prop="no" label="工单编码" show-overflow-tooltip width="150"></el-table-column>
+        <el-table-column width="100" label="省/市工单" prop="isProvince">
           <template #default="{ row }">
-            <span>{{ row.order?.isProvince ? '省工单' : '市工单' }}</span>
+            <span>{{ row.isProvince ? '省工单' : '市工单' }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="工单标题" show-overflow-tooltip width="400">
+        <el-table-column prop="currentStepName" label="办理节点" show-overflow-tooltip width="150"></el-table-column>
+        <el-table-column label="工单状态" show-overflow-tooltip width="100" prop="statusText"></el-table-column>
+        <el-table-column label="标题" show-overflow-tooltip width="300">
           <template #default="{ row }">
-            <span class="color-primary">{{ row.order?.title }}</span>
+            <span class="color-primary">{{ row.title }}</span>
           </template>
         </el-table-column>
-        <el-table-column prop="order.sourceChannel" label="来源方式" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="sourceChannel" label="回访状态" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="order.acceptType" label="受理类型" show-overflow-tooltip width="100"></el-table-column>
-        <el-table-column prop="order.hotspotName" label="热点分类" show-overflow-tooltip width="100"></el-table-column>
-        <el-table-column label="受理人" show-overflow-tooltip width="170">
-          <template #default="{ row }">
-						<span
-            >{{ row.order?.acceptorName }} <span v-if="row.order?.acceptorStaffNo">[{{ row.order?.acceptorStaffNo }}]</span>
-						</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="order.orgLevelOneName" label="一级部门" show-overflow-tooltip width="170"></el-table-column>
-        <el-table-column prop="order.actualHandleOrgName" label="接办部门" show-overflow-tooltip width="170"></el-table-column>
         <el-table-column label="受理时间" show-overflow-tooltip width="170">
           <template #default="{ row }">
-            <span>{{ formatDate(row.order?.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column label="办结时间" show-overflow-tooltip width="170">
-          <template #default="{ row }">
-            <span>{{ formatDate(row.order?.filedTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="publishTime" label="发布时间" show-overflow-tooltip width="170">
-          <template #default="{ row }">
-            <span>{{ formatDate(row.publishTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="visitTime" label="回访时间" show-overflow-tooltip width="170">
-          <template #default="{ row }">
-            <span>{{ formatDate(row.visitTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
+            <span>{{ formatDate(row.startTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="被回访部门" show-overflow-tooltip width="150">
+        <el-table-column prop="" label="延期申请" show-overflow-tooltip width="150"></el-table-column>
+        <el-table-column prop="" label="重办" show-overflow-tooltip width="150"></el-table-column>
+        <el-table-column prop="" label="甄别状态" show-overflow-tooltip width="150"></el-table-column>
+        <el-table-column prop="expiredTime" label="工单期满时间" show-overflow-tooltip width="170">
           <template #default="{ row }">
-            <span v-if="row.visitTarget===20">{{row.visitOrgName}}</span>
+            <span>{{ formatDate(row.expiredTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="部门办件结果" show-overflow-tooltip width="150">
-          <template #default="{ row }">
-            <span v-if="row.visitTarget===20">{{row.orgProcessingResults?.value}}</span>
-          </template>
-        </el-table-column>
-        <el-table-column label="部门办件态度" show-overflow-tooltip width="150">
+        <el-table-column label="办结时间" show-overflow-tooltip width="170">
           <template #default="{ row }">
-            <span v-if="row.visitTarget===20">{{row.orgHandledAttitude?.value}}</span>
+            <span>{{ formatDate(row.filedTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="不满意原因" show-overflow-tooltip width="150">
+        <el-table-column prop="orgLevelOneName" label="一级部门" show-overflow-tooltip width="170"></el-table-column>
+        <el-table-column prop="actualHandleOrgName" label="接办部门" show-overflow-tooltip width="170"></el-table-column>
+        <el-table-column prop="acceptType" label="受理类型" show-overflow-tooltip width="150"></el-table-column>
+        <el-table-column prop="counterSignTypeText" label="中心会签" show-overflow-tooltip width="100"></el-table-column>
+        <el-table-column prop="hotspotName" label="热点分类" show-overflow-tooltip width="200"></el-table-column>
+        <el-table-column prop="tagNames" label="工单标签" show-overflow-tooltip width="200"></el-table-column>
+        <el-table-column prop="employeeName" label="受理人" show-overflow-tooltip width="120">
           <template #default="{ row }">
-            <span v-if="row.visitTarget===20">
-              {{row.orgNoSatisfiedReason?.map(item => item.value).join(',')}}
-            </span>
+						<span
+            >{{ row.acceptorName }} <span v-if="row.acceptorStaffNo">[{{ row.acceptorStaffNo }}]</span>
+						</span>
           </template>
         </el-table-column>
-        <el-table-column label="操作" width="160" fixed="right" align="center">
+        <el-table-column label="操作" width="100" fixed="right" align="center">
           <template #default="{ row }">
-            <el-button link type="primary" @click="onSpecialApply(row)" title="特提申请"> 特提申请 </el-button>
-            <el-button link type="primary" @click="onDetail(row)" title="查看工单详情"> 工单详情 </el-button>
+            <el-button link type="primary" @click="onSpecialApply(row)" title="特提申请" v-if="row.workflowId" v-auth="'business:special:apply'"> 特提申请 </el-button>
           </template>
         </el-table-column>
         <template #empty>
@@ -114,8 +91,6 @@
     </el-card>
     <!-- 特提申请 -->
     <special-apply ref="specialApplyRef" @updateList="queryList" />
-    <!-- 工单详情 -->
-    <order-detail ref="orderDetailRef" @updateList="queryList" />
   </div>
 </template>
 <script setup lang="ts" name="orderSpecial">
@@ -125,10 +100,9 @@ import {auth} from '/@/utils/authFunction';
 import {throttle,} from '/@/utils/tools';
 import {formatDate} from '/@/utils/formatTime';
 import {useRouter} from "vue-router";
-import {specialList} from "/@/api/business/special";
+import {orderListSpecial} from "/@/api/business/special";
 // 引入组件
 const SpecialApply = defineAsyncComponent(() => import('/@/views/business/special/components/Special-apply.vue')); // 忒提申请
-const OrderDetail = defineAsyncComponent(() => import('/@/views/business/order/components/Order-detail.vue')); // 工单详情
 // 定义变量内容
 const ruleFormRef = ref<RefType>(); // 表单ref
 const router = useRouter(); // 路由
@@ -139,7 +113,7 @@ const state = reactive(<any>{
     PageSize: 10,
     Keyword: null, // 关键字
   },
-  tableData: [{}], //表单
+  tableData: [], //表单
   loading: false, // 加载
   total: 0, // 总数
 });
@@ -148,7 +122,7 @@ const queryList = throttle(() => {
   if (!auth('business:special:query')) ElMessage.error('抱歉,您没有权限查看特提申请!');
   else {
     state.loading = true;
-    specialList(state.queryParams)
+    orderListSpecial(state.queryParams)
         .then((res) => {
           state.tableData = res.result?.items ?? [];
           state.total = res.result?.total ?? 0;
@@ -177,15 +151,10 @@ const handleSelectionChange = (val: any[]) => {
 const onExport = () => {
   console.log('导出');
 };
-// 查看工单详情
-const orderDetailRef = ref<RefType>();
-const onDetail = (row: any) => {
-  orderDetailRef.value.openDialog(row.order);
-};
 // 特提申请
 const specialApplyRef = ref<RefType>();
 const onSpecialApply = (row:any)=>{
-  specialApplyRef.value.openDialog(row)
+  specialApplyRef.value.openDialog(row,true) // 需要审核
 }
 onMounted( () => {
   queryList();

+ 1 - 1
src/views/business/specialAudit/index.vue

@@ -90,7 +90,7 @@
         <el-table-column prop="reason" label="申请理由" show-overflow-tooltip width="200"></el-table-column>
         <el-table-column label="操作" width="100" fixed="right" align="center">
           <template #default="{ row }">
-            <el-button link type="primary" @click="onAudit(row)" title="审批特提"> 审批 </el-button>
+            <el-button link type="primary" @click="onAudit(row)" title="审批特提" v-auth="'business:special:audit'"> 审批 </el-button>
           </template>
         </el-table-column>
         <template #empty>