Przeglądaj źródła

feat(wise-cost-util): 三合一审批流程工具

vian 3 lat temu
rodzic
commit
9898758fa9

+ 2 - 2
wise-cost-util/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@sc/wise-cost-util",
-  "version": "1.1.6",
+  "version": "1.1.7",
   "description": "wise-cost项目前后端业务通用工具包",
   "main": "./dist/index.cjs.js",
   "module": "./dist/index.esm.js",
@@ -20,7 +20,7 @@
   "devDependencies": {
     "@commitlint/cli": "^11.0.0",
     "@commitlint/config-conventional": "^11.0.0",
-    "@sc/types": "^1.0.30",
+    "@sc/types": "^1.0.41",
     "@types/chai": "^4.2.14",
     "@types/lodash": "^4.14.168",
     "@types/mocha": "^8.0.4",

+ 1 - 0
wise-cost-util/src/index.ts

@@ -4,3 +4,4 @@ export * from './glj';
 export * from './cptLib';
 export * from './material';
 export * from './process';
+export * from './threeInOneProcess';

+ 1 - 1
wise-cost-util/src/process.ts

@@ -123,5 +123,5 @@ export const getReportProcess = (processes: IProcess[]) => {
 
 // 是否是上报环节
 export const isReportProcess = (process: IProcess) => {
-  return process.participantInfo.approvalWay === ApprovalWay.REPORT;
+  return process.participantInfo?.approvalWay === ApprovalWay.REPORT;
 };

+ 106 - 0
wise-cost-util/src/threeInOneProcess.ts

@@ -0,0 +1,106 @@
+import { ApprovalWay, ProcessStatus, IProcess, ApprovalStatus, IProcedureProcess } from '@sc/types';
+import { isEmpty } from 'lodash';
+
+// 获取流程某个环节审批状态
+export const getProcedureProcessStatus = (process: IProcedureProcess) => {
+  if (!process.participantInfo) {
+    return ProcessStatus.WAITING;
+  }
+  const { approvalWay, executor } = process.participantInfo;
+  const { reportTime, members } = executor;
+  // 只有第一步骤(上报)才有reportTime(数据结构定死的)
+  if (reportTime || !members) {
+    return ProcessStatus.APPROVED;
+  }
+  // 指定用户 退回上一环节为上报审批时,判断流程状态和指定用户一样
+  if (approvalWay === ApprovalWay.ACCOUNT || approvalWay === ApprovalWay.REPORT) {
+    const { approvalStatus } = members[0];
+    return approvalStatus;
+  }
+  // 会签 或者 依次审批
+  if (approvalWay === ApprovalWay.JOINTLYSIGN || approvalWay === ApprovalWay.ORDERAPPROVAL) {
+    // 只要有一个人审批回退,即失败
+    if (members.some(member => member.approvalStatus === ProcessStatus.FAILED)) return ProcessStatus.FAILED;
+    // 所有人都通过,即成功
+    if (members.every(member => member.approvalStatus === ProcessStatus.APPROVED)) return ProcessStatus.APPROVED;
+    // 所有人都等待, 即等待
+    if (members.every(member => member.approvalStatus === ProcessStatus.WAITING)) return ProcessStatus.WAITING;
+    // 否则正在进行
+    return ProcessStatus.ACTIVATING;
+  }
+  // 或签
+  if (approvalWay === ApprovalWay.ORSIGN) {
+    // 只要有一个人审批回退,即失败
+    if (members.some(member => member.approvalStatus === ProcessStatus.FAILED)) return ProcessStatus.FAILED;
+    // 只要有一个人审批通过,即成功
+    if (members.some(member => member.approvalStatus === ProcessStatus.APPROVED)) return ProcessStatus.APPROVED;
+    // 所有人都等待, 即等待
+    if (members.every(member => member.approvalStatus === ProcessStatus.WAITING)) return ProcessStatus.WAITING;
+    // 否则正在进行
+    return ProcessStatus.ACTIVATING;
+  }
+  // 默认等待
+  return ProcessStatus.WAITING;
+};
+
+// 获取流程的状态
+export const getProcedureApprovalStatus = (processes: IProcedureProcess[]) => {
+  if (isEmpty(processes)) {
+    return undefined;
+  }
+  const lastProcess = processes[processes.length - 1];
+  const lastProcessStatus = getProcedureProcessStatus(lastProcess);
+  // 审批通过
+  if (lastProcessStatus === ProcessStatus.APPROVED) {
+    return ApprovalStatus.APPROVED;
+  }
+  // 正在审批
+  return ApprovalStatus.PROCESSING;
+};
+
+// 获取当前的环节(整个流程结束之后,当前环节为 null)
+export const getProcedureCurrentProcess = (processes: IProcedureProcess[]) => {
+  if (isEmpty(processes)) {
+    return null;
+  }
+  // 第一个步骤是特殊的数据结构,因此直接区分处理
+  if (processes.length === 1) {
+    return processes[0];
+  }
+  for (let i = 1; i < processes.length; i += 1) {
+    const process = processes[i];
+    if (!process.participantInfo?.executor?.members?.length) {
+      // eslint-disable-next-line no-continue
+      continue;
+    }
+    const {
+      participantInfo: {
+        approvalWay,
+        executor: { members },
+      },
+    } = process;
+    // 指定用户 或 上报审批
+    if (approvalWay === ApprovalWay.ACCOUNT || approvalWay === ApprovalWay.REPORT) {
+      const { approvalStatus } = members[0];
+      if (approvalStatus === ProcessStatus.ACTIVATING) {
+        return processes[i];
+      }
+    }
+    // 会签 或者 依次审批
+    if (approvalWay === ApprovalWay.JOINTLYSIGN || approvalWay === ApprovalWay.ORDERAPPROVAL) {
+      if (
+        members.every(member => member.approvalStatus !== ProcessStatus.FAILED) &&
+        members.some(member => member.approvalStatus === ProcessStatus.ACTIVATING)
+      ) {
+        return processes[i];
+      }
+    }
+    // 或签
+    if (approvalWay === ApprovalWay.ORSIGN) {
+      if (members.every(member => member.approvalStatus === ProcessStatus.ACTIVATING)) {
+        return processes[i];
+      }
+    }
+  }
+  return null;
+};