ProcuremenStatus.php 6.6 KB

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