فهرست منبع

feat: 优化作业票状态处理逻辑,新增状态判断函数,调整提交与删除权限提示

xieyong 3 روز پیش
والد
کامیت
0f5c9ef28e
3فایلهای تغییر یافته به همراه112 افزوده شده و 38 حذف شده
  1. 3 3
      src/views/DangerousWorkList/add.vue
  2. 60 2
      src/views/DangerousWorkList/constants.js
  3. 49 33
      src/views/DangerousWorkList/workTicketDialog.vue

+ 3 - 3
src/views/DangerousWorkList/add.vue

@@ -238,9 +238,9 @@
     getUnfilledRequiredFields
   } from './templates';
   import {
-    DRAFT_STATUS,
     FULL_CHECK_ENABLED,
     FULL_CHECK_KEY,
+    canSubmitStatus,
     getProcessDefinitionKey,
     getProcessInstanceId
   } from './constants';
@@ -366,13 +366,13 @@
       },
       // 是否可提交:
       //  - 新增申请:作业票还没保存,提交时内部会先保存再发起审批流
-      //  - 编辑:仅草稿(待提交)状态允许提交
+      //  - 编辑:仅待提交(草稿)与已驳回状态允许提交,已驳回为重新提交
       canSubmit() {
         if (this.isView) {
           return false;
         }
         if (this.isEdit) {
-          return !!this.form.id && Number(this.form.status) === DRAFT_STATUS;
+          return !!this.form.id && canSubmitStatus(this.form.status);
         }
         return true;
       },

+ 60 - 2
src/views/DangerousWorkList/constants.js

@@ -14,15 +14,67 @@ export const TICKET_STATUS = {
   4: '已驳回'
 };
 
-// 草稿(待提交)状态,只有该状态允许编辑、删除、提交
+// 草稿(待提交)状态,只有该状态允许编辑、删除
 export const DRAFT_STATUS = 1;
 
+// 已驳回状态:允许重新提交审批
+export const REJECTED_STATUS = 4;
+
+/**
+ * 允许提交(发起审批)的作业票状态
+ *  - 待提交(草稿):新建后直接提交
+ *  - 已驳回:审批驳回后允许重新提交,重新走审批流
+ */
+export const SUBMITTABLE_STATUSES = [DRAFT_STATUS, REJECTED_STATUS];
+
+/**
+ * 判断作业票状态是否允许提交(发起审批)
+ * @param status 作业票状态
+ * @returns true-允许提交
+ */
+export function canSubmitStatus(status) {
+  return SUBMITTABLE_STATUSES.includes(Number(status));
+}
+
+/**
+ * 允许删除的作业票状态
+ *  - 待提交(草稿):未提交的可直接删除
+ *  - 已驳回:审批驳回后作废,允许删除
+ */
+export const DELETABLE_STATUSES = [DRAFT_STATUS, REJECTED_STATUS];
+
+/**
+ * 判断作业票状态是否允许删除
+ * @param status 作业票状态
+ * @returns true-允许删除
+ */
+export function canDeleteStatus(status) {
+  return DELETABLE_STATUSES.includes(Number(status));
+}
+
+/**
+ * 受限空间作业的审批流编码
+ *
+ * 流程定义 key 由平台「流程设计器」中的流程模型决定,不同部署环境可能不同,
+ * 因此允许用环境变量覆盖(.env 里配置 VUE_APP_EHS_CONFINED_SPACE_PROCESS_KEY)。
+ *
+ * 该 key 对应的流程模型需要配置:
+ *   表单路由 formCustomCreatePath =
+ *     {"pcView":"/bpm/handleTask/components/dangerousWorkTicket/detail.vue",
+ *      "pcHandle":"/bpm/handleTask/components/dangerousWorkTicket/submit.vue"}
+ *   节点(任务)key 与源系统 HO_PERMIT_CONFINED_SPACE_TWOTH ~ _EIGHTTH 对应,
+ *   或直接用节点名称(风险辨识、气体分析、现场安全措施确认、安全交底、
+ *   所在单位意见、作业实施、完工验收),前端按「key / 别名 / 名称 / 双向包含」多级匹配。
+ */
+const CONFINED_SPACE_PROCESS_KEY =
+  process.env.VUE_APP_EHS_CONFINED_SPACE_PROCESS_KEY || 'ehs_confined_space';
+
 /**
  * 作业票审批流配置
  *
  * 后端「提交作业票并发起审批流」接口(PUT /ehs/hazardousWorkTicket/submit)
  * 需要前端传入审批流编码(流程定义 key),由前端按作业类型决定走哪条审批流程。
- * 目前仅动火作业接入审批流,其余作业类型待后端提供流程定义 key 后补充。
+ * 目前动火作业、受限空间作业接入审批流,其余作业类型待后端提供流程定义 key 后补充。
  *
  * code:前端内置字典码(后端字典未配置时使用)
  * sourceCode:源系统作业票流程编码(HO_PERMIT_*)
@@ -35,6 +87,12 @@ export const WORK_TICKET_PROCESS_MAPPING = [
     sourceCode: 'HO_PERMIT_FIRE',
     name: '动火作业',
     processDefinitionKey: 'ehs_test'
+  },
+  {
+    code: '2',
+    sourceCode: 'HO_PERMIT_CONFINED_SPACE',
+    name: '受限空间作业',
+    processDefinitionKey: CONFINED_SPACE_PROCESS_KEY
   }
 ];
 

+ 49 - 33
src/views/DangerousWorkList/workTicketDialog.vue

@@ -53,9 +53,6 @@
                   @click="handleBatchDelete"
                   >批量删除</el-button
                 >
-                <span class="toolbar-tip"
-                  >仅草稿(待提交)状态的作业票可编辑、提交、删除</span
-                >
               </div>
             </template>
             <template v-slot:workType="{ row }">
@@ -81,7 +78,7 @@
                   >编辑</el-link
                 >
                 <el-link
-                  v-if="isDraft(row)"
+                  v-if="canSubmit(row)"
                   type="success"
                   :underline="false"
                   :disabled="submittingId === row.id"
@@ -138,13 +135,16 @@
   import {
     TICKET_STATUS,
     DRAFT_STATUS,
+    REJECTED_STATUS,
+    canSubmitStatus,
+    canDeleteStatus,
     getProcessDefinitionKey,
     getProcessInstanceId
   } from './constants';
   import { buildWorkTypeOptions, resolveWorkTypeLabel } from './workTypes';
 
-  // 仅草稿(待提交)状态的作业票可以删除
-  const DELETE_TIP = '仅草稿(待提交)状态的作业票可以删除';
+  // 仅待提交(草稿)、已驳回状态的作业票可以删除
+  const DELETE_TIP = '仅待提交(草稿)或已驳回状态的作业票可以删除';
 
   export default {
     mixins: [tabMixins, dictMixins],
@@ -169,8 +169,8 @@
             width: 50,
             align: 'center',
             fixed: 'left',
-            // 只有草稿(待提交)状态的作业票允许勾选,避免误删已提交的票
-            selectable: (row) => this.isDraft(row)
+            // 只有待提交(草稿)、已驳回状态的作业票允许勾选,避免误删审批中或已通过的票
+            selectable: (row) => this.canDelete(row)
           },
           {
             columnKey: 'index',
@@ -322,9 +322,10 @@
         this.$refs.addRef.openTicket(row, this.work, 'edit');
       },
       // 提交作业票并发起审批流:审批流编码按作业类型取
+      // 待提交(草稿)与已驳回状态都允许提交,已驳回的为重新提交
       handleSubmit(row) {
-        if (!this.isDraft(row)) {
-          this.$message.warning('仅草稿(待提交)状态的作业票可以提交');
+        if (!this.canSubmit(row)) {
+          this.$message.warning('该作业票当前状态不可提交');
           return;
         }
         const processDefinitionKey = getProcessDefinitionKey(
@@ -338,7 +339,9 @@
           return;
         }
         this.$confirm(
-          '提交后将发起审批流,作业票内容不可再修改,确认提交吗?',
+          Number(row?.status) === REJECTED_STATUS
+            ? '该作业票已被驳回,重新提交后将重新发起审批流,确认提交吗?'
+            : '提交后将发起审批流,作业票内容不可再修改,确认提交吗?',
           '提示',
           {
             confirmButtonText: '确定',
@@ -353,9 +356,10 @@
                 this.$message.success('提交成功,已发起审批');
                 this.reloadTable();
                 // 提交后自动打开审批流程:优先用响应里的流程实例 id,没有则回查作业票详情
+                // 已驳回重新提交时,行数据里是上一轮审批的实例 id,必须回查详情取最新一轮
                 const processInstanceId =
                   getProcessInstanceId(data) ||
-                  (await this.resolveProcessInstanceId(row));
+                  (await this.resolveProcessInstanceId(row, true));
                 if (processInstanceId) {
                   this.openFlow(processInstanceId);
                 }
@@ -381,10 +385,13 @@
         this.flowVisible = true;
       },
       // 取作业票的流程实例 id:优先用列表行数据,没有再查作业票详情
-      async resolveProcessInstanceId(row) {
-        const fromRow = getProcessInstanceId(row);
-        if (fromRow) {
-          return fromRow;
+      // @param preferDetail 为 true 时直接查详情(行数据里的实例 id 可能是上一轮审批的)
+      async resolveProcessInstanceId(row, preferDetail = false) {
+        if (!preferDetail) {
+          const fromRow = getProcessInstanceId(row);
+          if (fromRow) {
+            return fromRow;
+          }
         }
         try {
           const detail = await ticketGetById(row.id, {
@@ -431,15 +438,21 @@
       },
 
       handleDelete(row) {
-        if (!this.isDraft(row)) {
+        if (!this.canDelete(row)) {
           this.$message.warning(DELETE_TIP);
           return;
         }
-        this.$confirm('确认删除该草稿作业票吗?删除后不可恢复。', '提示', {
-          confirmButtonText: '确定',
-          cancelButtonText: '取消',
-          type: 'warning'
-        })
+        this.$confirm(
+          Number(row?.status) === REJECTED_STATUS
+            ? '确认删除该已驳回的作业票吗?删除后不可恢复。'
+            : '确认删除该草稿作业票吗?删除后不可恢复。',
+          '提示',
+          {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning'
+          }
+        )
           .then(() => {
             ticketRemove([row.id]).then(() => {
               this.$message.success('删除成功');
@@ -450,19 +463,19 @@
           .catch(() => {});
       },
 
-      // 批量删除:仅允许删除草稿(待提交)状态的作业票
+      // 批量删除:仅允许删除待提交(草稿)、已驳回状态的作业票
       handleBatchDelete() {
         const rows = this.selectedRows || [];
         if (!rows.length) {
           this.$message.warning('请至少选择一条数据');
           return;
         }
-        if (rows.some((row) => !this.isDraft(row))) {
+        if (rows.some((row) => !this.canDelete(row))) {
           this.$message.warning(DELETE_TIP);
           return;
         }
         this.$confirm(
-          `确认删除选中的 ${rows.length} 条草稿作业票吗?删除后不可恢复。`,
+          `确认删除选中的 ${rows.length} 条作业票吗?删除后不可恢复。`,
           '提示',
           {
             confirmButtonText: '确定',
@@ -480,11 +493,21 @@
           .catch(() => {});
       },
 
-      // 是否草稿(待提交)状态,只有该状态允许删除
+      // 是否草稿(待提交)状态,只有该状态允许编辑
       isDraft(row) {
         return Number(row?.status) === DRAFT_STATUS;
       },
 
+      // 是否允许提交(发起审批):待提交(草稿)与已驳回都允许
+      canSubmit(row) {
+        return canSubmitStatus(row?.status);
+      },
+
+      // 是否允许删除:待提交(草稿)与已驳回都允许
+      canDelete(row) {
+        return canDeleteStatus(row?.status);
+      },
+
       // 多选
       handleSelectionChange(rows) {
         this.selectedRows = rows || [];
@@ -545,11 +568,4 @@
       font-size: 12px;
     }
   }
-
-  .toolbar-tip {
-    margin-left: 12px;
-    font-size: 12px;
-    color: #909399;
-    line-height: 32px;
-  }
 </style>