threeInOneProcess.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { ApprovalWay, ProcessStatus, IProcess, ApprovalStatus, IProcedureProcess } from '@sc/types';
  2. import { isEmpty } from 'lodash';
  3. // 获取流程某个环节审批状态
  4. export const getProcedureProcessStatus = (process: IProcedureProcess): ProcessStatus => {
  5. if (!process.participantInfo) {
  6. return ProcessStatus.WAITING;
  7. }
  8. const { approvalWay, executor } = process.participantInfo;
  9. const { reportTime, members } = executor;
  10. // 只有第一步骤(上报)才有reportTime(数据结构定死的)
  11. if (reportTime || !members) {
  12. return ProcessStatus.APPROVED;
  13. }
  14. // 指定用户 退回上一环节为上报审批时,判断流程状态和指定用户一样
  15. if (approvalWay === ApprovalWay.ACCOUNT || approvalWay === ApprovalWay.REPORT) {
  16. const { approvalStatus } = members[0];
  17. return approvalStatus as ProcessStatus;
  18. }
  19. // 会签 或者 依次审批
  20. if (approvalWay === ApprovalWay.JOINTLYSIGN || approvalWay === ApprovalWay.ORDERAPPROVAL) {
  21. // 只要有一个人审批回退,即失败
  22. if (members.some(member => member.approvalStatus === ProcessStatus.FAILED)) return ProcessStatus.FAILED;
  23. // 所有人都通过,即成功
  24. if (members.every(member => member.approvalStatus === ProcessStatus.APPROVED)) return ProcessStatus.APPROVED;
  25. // 所有人都等待, 即等待
  26. if (members.every(member => member.approvalStatus === ProcessStatus.WAITING)) return ProcessStatus.WAITING;
  27. // 否则正在进行
  28. return ProcessStatus.ACTIVATING;
  29. }
  30. // 或签
  31. if (approvalWay === ApprovalWay.ORSIGN) {
  32. // 只要有一个人审批回退,即失败
  33. if (members.some(member => member.approvalStatus === ProcessStatus.FAILED)) return ProcessStatus.FAILED;
  34. // 只要有一个人审批通过,即成功
  35. if (members.some(member => member.approvalStatus === ProcessStatus.APPROVED)) return ProcessStatus.APPROVED;
  36. // 所有人都等待, 即等待
  37. if (members.every(member => member.approvalStatus === ProcessStatus.WAITING)) return ProcessStatus.WAITING;
  38. // 否则正在进行
  39. return ProcessStatus.ACTIVATING;
  40. }
  41. // 默认等待
  42. return ProcessStatus.WAITING;
  43. };
  44. // 获取流程的状态
  45. export const getProcedureApprovalStatus = (processes: IProcedureProcess[]): ApprovalStatus | undefined => {
  46. if (isEmpty(processes)) {
  47. return undefined;
  48. }
  49. const lastProcess = processes[processes.length - 1];
  50. const lastProcessStatus = getProcedureProcessStatus(lastProcess);
  51. // 审批通过
  52. if (lastProcessStatus === ProcessStatus.APPROVED) {
  53. return ApprovalStatus.APPROVED;
  54. }
  55. // 正在审批
  56. return ApprovalStatus.PROCESSING;
  57. };
  58. // 获取当前的环节(整个流程结束之后,当前环节为 null)
  59. export const getProcedureCurrentProcess = (processes: IProcedureProcess[]) => {
  60. if (isEmpty(processes)) {
  61. return null;
  62. }
  63. // 第一个步骤是特殊的数据结构,因此直接区分处理
  64. if (processes.length === 1) {
  65. return processes[0];
  66. }
  67. for (let i = 1; i < processes.length; i += 1) {
  68. const process = processes[i];
  69. if (!process.participantInfo || !process.participantInfo.executor || !process.participantInfo.executor.members) {
  70. // eslint-disable-next-line no-continue
  71. continue;
  72. }
  73. const {
  74. participantInfo: {
  75. approvalWay,
  76. executor: { members },
  77. },
  78. } = process;
  79. // 指定用户 或 上报审批
  80. if (approvalWay === ApprovalWay.ACCOUNT || approvalWay === ApprovalWay.REPORT) {
  81. const { approvalStatus } = members[0];
  82. if (approvalStatus === ProcessStatus.ACTIVATING) {
  83. return processes[i];
  84. }
  85. }
  86. // 会签 或者 依次审批
  87. if (approvalWay === ApprovalWay.JOINTLYSIGN || approvalWay === ApprovalWay.ORDERAPPROVAL) {
  88. if (
  89. members.every(member => member.approvalStatus !== ProcessStatus.FAILED) &&
  90. members.some(member => member.approvalStatus === ProcessStatus.ACTIVATING)
  91. ) {
  92. return processes[i];
  93. }
  94. }
  95. // 或签
  96. if (approvalWay === ApprovalWay.ORSIGN) {
  97. if (members.every(member => member.approvalStatus === ProcessStatus.ACTIVATING)) {
  98. return processes[i];
  99. }
  100. }
  101. }
  102. return null;
  103. };