ProcuremenStatus.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <?php
  2. namespace app\common\library;
  3. /**
  4. * 协助采购状态文案(purchase_order / purchase_order_detail)
  5. *
  6. * purchase_order.status(主单是否完结):
  7. * 进行中 — 协助流程未完结(已下发、待确认、待审批等)
  8. * 已完结 — 采购确认通过,或协助初选直接点「完结」
  9. *
  10. * purchase_order.wflow_status(主单流程阶段,与 status 分工不同):
  11. * 待下发 — 尚未协助下发,或退回初选后
  12. * 待确认 — 已通知供应商报价,待采购选定供应商(原 1)
  13. * 待审批 — 已选定供应商,待采购终审(原 2)
  14. *
  15. * purchase_order_detail.status(下发明细采购选定):
  16. * 未选中 — 默认 / 未中标
  17. * 已选中 — 采购确认选中的供应商明细(原 1)
  18. * 已废弃 — 退回初选归档,不参与当前流程(原 2)
  19. *
  20. * purchase_order_detail.status_name(供应商填单 / 手机端 Tab,保持原中文):
  21. * 未提交 / 已提交 / 已完成 / 未通过 / 已废弃
  22. */
  23. class ProcuremenStatus
  24. {
  25. public const PO_IN_PROGRESS = '进行中';
  26. public const PO_COMPLETED = '已完结';
  27. public const WFLOW_PENDING_ISSUE = '待下发';
  28. public const WFLOW_PENDING_CONFIRM = '待确认';
  29. public const WFLOW_PENDING_APPROVAL = '待审批';
  30. public const POD_UNPICKED = '未选中';
  31. public const POD_PICKED = '已选中';
  32. public const POD_VOID = '已废弃';
  33. public static function normalizePoStatus($value): string
  34. {
  35. $s = trim((string)$value);
  36. if ($s === '' || $s === '0' || strcasecmp($s, self::PO_IN_PROGRESS) === 0) {
  37. return self::PO_IN_PROGRESS;
  38. }
  39. if ($s === '1' || strcasecmp($s, self::PO_COMPLETED) === 0) {
  40. return self::PO_COMPLETED;
  41. }
  42. return $s;
  43. }
  44. public static function isPoCompleted($value): bool
  45. {
  46. return self::normalizePoStatus($value) === self::PO_COMPLETED;
  47. }
  48. public static function isPoInProgress($value): bool
  49. {
  50. return self::normalizePoStatus($value) === self::PO_IN_PROGRESS;
  51. }
  52. public static function normalizeWflowStatus($value): string
  53. {
  54. $s = trim((string)$value);
  55. if ($s === '' || $s === '0' || strcasecmp($s, self::WFLOW_PENDING_ISSUE) === 0) {
  56. return self::WFLOW_PENDING_ISSUE;
  57. }
  58. if ($s === '1' || strcasecmp($s, self::WFLOW_PENDING_CONFIRM) === 0) {
  59. return self::WFLOW_PENDING_CONFIRM;
  60. }
  61. if ($s === '2' || strcasecmp($s, self::WFLOW_PENDING_APPROVAL) === 0) {
  62. return self::WFLOW_PENDING_APPROVAL;
  63. }
  64. return $s;
  65. }
  66. public static function isWflowPendingIssue($value): bool
  67. {
  68. return self::normalizeWflowStatus($value) === self::WFLOW_PENDING_ISSUE;
  69. }
  70. public static function isWflowPendingConfirm($value): bool
  71. {
  72. return self::normalizeWflowStatus($value) === self::WFLOW_PENDING_CONFIRM;
  73. }
  74. public static function isWflowPendingApproval($value): bool
  75. {
  76. return self::normalizeWflowStatus($value) === self::WFLOW_PENDING_APPROVAL;
  77. }
  78. public static function wflowAtLeastConfirm($value): bool
  79. {
  80. $w = self::normalizeWflowStatus($value);
  81. return $w === self::WFLOW_PENDING_CONFIRM || $w === self::WFLOW_PENDING_APPROVAL;
  82. }
  83. public static function normalizePodPickStatus($value): string
  84. {
  85. $s = trim((string)$value);
  86. if ($s === '' || $s === '0' || strcasecmp($s, self::POD_UNPICKED) === 0) {
  87. return self::POD_UNPICKED;
  88. }
  89. if ($s === '1' || strcasecmp($s, self::POD_PICKED) === 0) {
  90. return self::POD_PICKED;
  91. }
  92. if ($s === '2' || strcasecmp($s, self::POD_VOID) === 0 || strcasecmp($s, '已废弃') === 0) {
  93. return self::POD_VOID;
  94. }
  95. return $s;
  96. }
  97. public static function isPodPicked($value): bool
  98. {
  99. return self::normalizePodPickStatus($value) === self::POD_PICKED;
  100. }
  101. public static function isPodVoid($value): bool
  102. {
  103. return self::normalizePodPickStatus($value) === self::POD_VOID;
  104. }
  105. /** @return string[] */
  106. public static function wflowPendingConfirmValues(): array
  107. {
  108. return [self::WFLOW_PENDING_CONFIRM, '1'];
  109. }
  110. /** @return string[] */
  111. public static function wflowPendingApprovalValues(): array
  112. {
  113. return [self::WFLOW_PENDING_APPROVAL, '2'];
  114. }
  115. /** @return string[] */
  116. public static function wflowPendingIssueValues(): array
  117. {
  118. return [self::WFLOW_PENDING_ISSUE, '0', ''];
  119. }
  120. /** @return string[] */
  121. public static function podPickedValues(): array
  122. {
  123. return [self::POD_PICKED, '1'];
  124. }
  125. /** @return string[] */
  126. public static function podUnpickedValues(): array
  127. {
  128. return [self::POD_UNPICKED, '0', ''];
  129. }
  130. /** @return string[] */
  131. public static function poCompletedValues(): array
  132. {
  133. return [self::PO_COMPLETED, '1'];
  134. }
  135. /** @return string[] */
  136. public static function poInProgressValues(): array
  137. {
  138. return [self::PO_IN_PROGRESS, '0'];
  139. }
  140. public static function sqlPoCompleted(string $column = 'status'): string
  141. {
  142. $c = self::quoteSqlIdent($column);
  143. return "(TRIM(CAST({$c} AS CHAR)) IN ('" . self::PO_COMPLETED . "','1') OR CAST({$c} AS UNSIGNED) = 1)";
  144. }
  145. public static function sqlPoInProgress(string $column = 'status'): string
  146. {
  147. $c = self::quoteSqlIdent($column);
  148. return "(TRIM(CAST({$c} AS CHAR)) IN ('" . self::PO_IN_PROGRESS . "','0') OR CAST({$c} AS UNSIGNED) = 0)";
  149. }
  150. public static function sqlPodNotVoid(string $column = 'status'): string
  151. {
  152. $c = self::quoteSqlIdent($column);
  153. $void = self::POD_VOID;
  154. return "({$c} IS NULL OR TRIM(CAST({$c} AS CHAR)) NOT IN ('{$void}','2') AND CAST({$c} AS UNSIGNED) <> 2)";
  155. }
  156. protected static function quoteSqlIdent(string $column): string
  157. {
  158. if (strpos($column, '.') !== false) {
  159. $parts = explode('.', $column, 2);
  160. return '`' . str_replace('`', '', $parts[0]) . '`.`' . str_replace('`', '', $parts[1]) . '`';
  161. }
  162. return '`' . str_replace('`', '', $column) . '`';
  163. }
  164. }