process.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import { ApprovalWay, IProcessAccount, ProcessStatus, IProcess, ApprovalStatus } from '@sc/types';
  2. import { isArray, isEmpty } from 'lodash';
  3. // 获取流程某个环节审批状态
  4. export const getProcessStatus = (approvalWay: ApprovalWay, accounts: IProcessAccount[] | IProcessAccount) => {
  5. if (!isArray(accounts)) {
  6. return accounts.status;
  7. }
  8. // 指定用户 退回上一环节为上报审批时,判断流程状态和指定用户一样
  9. if (approvalWay === ApprovalWay.ACCOUNT || approvalWay === ApprovalWay.REPORT) {
  10. const { status } = accounts[0];
  11. return status;
  12. }
  13. // 会签 或者 依次审批
  14. if (approvalWay === ApprovalWay.JOINTLYSIGN || approvalWay === ApprovalWay.ORDERAPPROVAL) {
  15. // 只要有一个人审批回退,即失败
  16. if (accounts.some(account => account.status === ProcessStatus.FAILED)) return ProcessStatus.FAILED;
  17. // 所有人都通过,即成功
  18. if (accounts.every(account => account.status === ProcessStatus.APPROVED)) return ProcessStatus.APPROVED;
  19. // 所有人都等待, 即等待
  20. if (accounts.every(account => account.status === ProcessStatus.WAITING)) return ProcessStatus.WAITING;
  21. // 否则正在进行
  22. return ProcessStatus.ACTIVATING;
  23. }
  24. // 或签
  25. if (approvalWay === ApprovalWay.ORSIGN) {
  26. // 只要有一个人审批回退,即失败
  27. if (accounts.some(account => account.status === ProcessStatus.FAILED)) return ProcessStatus.FAILED;
  28. // 只要有一个人审批通过,即成功
  29. if (accounts.some(account => account.status === ProcessStatus.APPROVED)) return ProcessStatus.APPROVED;
  30. // 所有人都等待, 即等待
  31. if (accounts.every(account => account.status === ProcessStatus.WAITING)) return ProcessStatus.WAITING;
  32. // 否则正在进行
  33. return ProcessStatus.ACTIVATING;
  34. }
  35. // 默认等待
  36. return ProcessStatus.WAITING;
  37. };
  38. // 获取流程的状态
  39. export const getApprovalStatus = (processes: IProcess[]) => {
  40. if (isEmpty(processes)) {
  41. return undefined;
  42. }
  43. const lastProcess = processes[processes.length - 1];
  44. const { approvalWay, accounts } = lastProcess.participantInfo;
  45. const lastProcessStatus = getProcessStatus(approvalWay, accounts);
  46. // 审批通过
  47. if (lastProcessStatus === ProcessStatus.APPROVED) {
  48. return ApprovalStatus.APPROVED;
  49. }
  50. // 正在审批
  51. return ApprovalStatus.PROCESSING;
  52. };
  53. // 获取当前的环节(整个流程结束之后,当前环节为 null)
  54. export const getCurrentProcess = (processes: IProcess[]) => {
  55. if (isEmpty(processes)) {
  56. return null;
  57. }
  58. for (let i = 0; i < processes.length; i += 1) {
  59. const {
  60. participantInfo: { approvalWay, accounts },
  61. } = processes[i];
  62. // 指定用户 或 上报审批
  63. if (approvalWay === ApprovalWay.ACCOUNT || approvalWay === ApprovalWay.REPORT) {
  64. const { status } = accounts[0];
  65. if (status === ProcessStatus.ACTIVATING) {
  66. return processes[i];
  67. }
  68. }
  69. // 会签 或者 依次审批
  70. if (approvalWay === ApprovalWay.JOINTLYSIGN || approvalWay === ApprovalWay.ORDERAPPROVAL) {
  71. if (
  72. accounts.every(account => account.status !== ProcessStatus.FAILED) &&
  73. accounts.some(account => account.status === ProcessStatus.ACTIVATING)
  74. ) {
  75. return processes[i];
  76. }
  77. }
  78. // 或签
  79. if (approvalWay === ApprovalWay.ORSIGN) {
  80. if (accounts.every(account => account.status === ProcessStatus.ACTIVATING)) {
  81. return processes[i];
  82. }
  83. }
  84. }
  85. return null;
  86. };
  87. // 获取某个环节的前一个环节
  88. export const getPrevProcess = (processes: IProcess[], curProcess: IProcess) => {
  89. if (isEmpty(processes)) {
  90. return null;
  91. }
  92. for (let i = 1; i < processes.length; i += 1) {
  93. const process = processes[i];
  94. if (process.ID === curProcess.ID) {
  95. return processes[i - 1];
  96. }
  97. }
  98. return null;
  99. };
  100. // 获取某个环节的下一个环节
  101. export const getNextProcess = (processes: IProcess[], curProcess: IProcess) => {
  102. if (isEmpty(processes)) {
  103. return null;
  104. }
  105. for (let i = 0; i < processes.length - 1; i += 1) {
  106. const process = processes[i];
  107. if (process.ID === curProcess.ID) {
  108. return processes[i + 1];
  109. }
  110. }
  111. return null;
  112. };
  113. // 获取上报环节
  114. export const getReportProcess = (processes: IProcess[]) => {
  115. if (isEmpty(processes)) {
  116. return null;
  117. }
  118. return processes[0];
  119. };