OrderItemStatus.php 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. <?php
  2. namespace app\admin\model\shopro\order\traits;
  3. use app\admin\model\shopro\order\OrderItem;
  4. trait OrderItemStatus
  5. {
  6. public function getStatus($data, $type)
  7. {
  8. $btns = [];
  9. $backendBtns = [];
  10. $status_text = '';
  11. $status_desc = '';
  12. $ext = $this->ext;
  13. $aftersale_id = (isset($ext['aftersale_id']) && !empty($ext['aftersale_id'])) ? $ext['aftersale_id'] : 0;
  14. $status_code = $this->status_code;
  15. $item_code = 'null'; // 有售后的时候,第二状态
  16. if (strpos($status_code, '|') !== false) {
  17. $codes = explode('|', $status_code);
  18. $status_code = $codes[0] ?? 'null';
  19. $item_code = $codes[1] ?? 'null';
  20. }
  21. switch ($status_code) {
  22. case 'null':
  23. case 'cancel':
  24. case 'closed':
  25. case 'unpaid':
  26. // 未支付的返回空
  27. break;
  28. case 'refuse': // 拒收
  29. $status_text = '已拒收';
  30. $status_desc = '用户拒绝收货';
  31. break;
  32. case 'nosend':
  33. $status_text = '待发货';
  34. $status_desc = '等待卖家发货';
  35. $backendBtns[] = 'send';
  36. $backendBtns[] = 'refund'; // 退款
  37. // $btns[] = $aftersale_id ? 're_aftersale' : 'aftersale'; // 售后,售后取消会有 aftersale_id , 待发货商品,不用申请售后,直接用订单退款
  38. break;
  39. case 'noget':
  40. $status_text = '待收货';
  41. $status_desc = '等待买家收货';
  42. // $btns[] = 'get'; // 确认收货,总订单上才有
  43. $btns[] = $aftersale_id ? 're_aftersale' : 'aftersale'; // 售后,售后取消会有 aftersale_id
  44. $backendBtns[] = 'send_cancel'; // 取消发货
  45. $backendBtns[] = 'refund';
  46. break;
  47. case 'nocomment':
  48. $status_text = '待评价';
  49. $status_desc = '等待买家评价';
  50. $btns[] = 'comment'; // 评价,总订单上才有(前端通过这个判断待评价商品)
  51. $btns[] = $aftersale_id ? 're_aftersale' : 'aftersale'; // 售后,售后取消会有 aftersale_id
  52. $backendBtns[] = 'refund'; // 退款
  53. break;
  54. case 'commented':
  55. $status_text = '已评价';
  56. $status_desc = '订单已评价';
  57. $btns[] = 'buy_again';
  58. $backendBtns[] = 'refund'; // 退款
  59. $backendBtns[] = 'comment_view'; // 查看评价
  60. break;
  61. case 'refund_completed':
  62. $status_text = '退款完成';
  63. $status_desc = '订单退款完成';
  64. break;
  65. case 'refund_agree': // 不需要申请退款(状态不会出现)
  66. $status_text = '退款完成';
  67. $status_desc = '卖家已同意退款';
  68. break;
  69. case 'aftersale_ing':
  70. $status_text = '售后中';
  71. $status_desc = '售后处理中';
  72. if ($item_code == 'noget') {
  73. if (in_array($data['dispatch_type'], ['express'])) { // 除了 自提扫码核销外,都可确认收货
  74. $backendBtns[] = 'send_cancel'; // 取消发货
  75. }
  76. } else if ($item_code == 'nocomment') {
  77. // 售后中也可以评价订单
  78. $btns[] = 'comment'; // 评价,总订单上才有(前端通过这个判断待评价商品)
  79. }
  80. break;
  81. case 'aftersale_refuse':
  82. case 'aftersale_completed':
  83. switch ($status_code) {
  84. case 'aftersale_refuse':
  85. $status_text = '售后拒绝';
  86. $status_desc = '售后申请拒绝';
  87. if ($item_code != 'commented') {
  88. $btns[] = 're_aftersale'; // 售后
  89. }
  90. break;
  91. case 'aftersale_completed':
  92. $status_text = '售后完成';
  93. $status_desc = '售后完成';
  94. break;
  95. }
  96. // 售后拒绝,或者完成的时候,还可以继续操作订单
  97. switch ($item_code) {
  98. case 'nosend':
  99. if (in_array($data['dispatch_type'], ['express'])) { // 除了 自提扫码核销外,都可确认收货
  100. $backendBtns[] = 'send'; // 发货
  101. }
  102. break;
  103. case 'noget':
  104. if (in_array($data['dispatch_type'], ['express'])) { // 除了 自提扫码核销外,都可确认收货
  105. // $btns[] = 'get'; // 确认收货,总订单上才有
  106. $backendBtns[] = 'send_cancel'; // 取消发货
  107. }
  108. break;
  109. case 'nocomment':
  110. $btns[] = 'comment'; // 评价,总订单上才有(前端通过这个判断待评价商品)
  111. break;
  112. case 'commented':
  113. $btns[] = 'buy_again';
  114. $backendBtns[] = 'comment_view'; // 查看评价
  115. break;
  116. }
  117. break;
  118. }
  119. // 如果有售后id 就显示售后详情按钮,退款中可能是售后退的款
  120. if ($aftersale_id) {
  121. $btns[] = 'aftersale_info';
  122. $backendBtns[] = 'aftersale_info';
  123. }
  124. $return = null;
  125. switch($type) {
  126. case 'status_text':
  127. $return = $status_text;
  128. break;
  129. case 'btns':
  130. $return = $btns;
  131. break;
  132. case 'status_desc':
  133. $return = $status_desc;
  134. break;
  135. case 'backend_btns':
  136. $return = $backendBtns;
  137. break;
  138. }
  139. return $return;
  140. }
  141. public function getStatusTextAttr($value, $data)
  142. {
  143. return $this->getStatus($data, 'status_text');
  144. }
  145. public function getStatusDescAttr($value, $data)
  146. {
  147. return $this->getStatus($data, 'status_desc');
  148. }
  149. public function getBtnsAttr($value, $data)
  150. {
  151. $btn_name = strpos(request()->url(), 'addons/shopro') !== false ? 'btns' : 'backend_btns';
  152. return $this->getStatus($data, $btn_name);
  153. }
  154. // 获取订单 item status_code 状态,不进行订单是否支付判断,在这里查询数据库特别慢,
  155. // 需要处理情况,订单列表:要正确显示item 状态,直接获取 item 的状态
  156. public function getStatusCodeAttr($value, $data)
  157. {
  158. // $status_code = 'null';
  159. // $order = Order::withTrashed()->where('id', $data['order_id'])->find();
  160. // if (!$order) {
  161. // return $status_code;
  162. // }
  163. // // 判断是否支付
  164. // if (!in_array($order->status, [Order::STATUS_PAYED, Order::STATUS_FINISH])) {
  165. // return $order->status_code;
  166. // }
  167. // 获取 item status_code
  168. return $this->getBaseStatusCode($data);
  169. }
  170. /**
  171. * $data 当前 item 数据
  172. * $from 当前 model 调用,还是 order 调用
  173. */
  174. public function getBaseStatusCode($data, $from = 'item')
  175. {
  176. $status_code = 'null';
  177. if ($data['refund_status'] == OrderItem::REFUND_STATUS_AGREE) {
  178. // 退款已同意
  179. return 'refund_agree';
  180. }
  181. if ($data['refund_status'] == OrderItem::REFUND_STATUS_COMPLETED) {
  182. // 退款完成
  183. return 'refund_completed';
  184. }
  185. if ($data['aftersale_status']) {
  186. // 只申请了售后,没有退款
  187. // status_code
  188. $status_code = $this->getNormalStatusCode($data);
  189. // item 要原始状态,总订单还要原来的未退款状态
  190. if ($from == 'item') {
  191. switch ($data['aftersale_status']) {
  192. case OrderItem::AFTERSALE_STATUS_REFUSE:
  193. $status_code = 'aftersale_refuse' . '|' . $status_code;
  194. break;
  195. case OrderItem::AFTERSALE_STATUS_ING:
  196. $status_code = 'aftersale_ing' . '|' . $status_code;
  197. break;
  198. case OrderItem::AFTERSALE_STATUS_COMPLETED:
  199. $status_code = 'aftersale_completed' . '|' . $status_code;
  200. break;
  201. }
  202. }
  203. } else {
  204. // status_code
  205. $status_code = $this->getNormalStatusCode($data);
  206. }
  207. return $status_code;
  208. }
  209. public function getNormalStatusCode($data)
  210. {
  211. // 获取未申请售后和退款时候的 status_code
  212. $status_code = 'null';
  213. switch ($data['dispatch_status']) {
  214. case OrderItem::DISPATCH_STATUS_REFUSE:
  215. $status_code = 'refuse';
  216. break;
  217. case OrderItem::DISPATCH_STATUS_NOSEND:
  218. $status_code = 'nosend';
  219. break;
  220. case OrderItem::DISPATCH_STATUS_SENDED:
  221. $status_code = 'noget';
  222. break;
  223. case OrderItem::DISPATCH_STATUS_GETED:
  224. if ($data['comment_status'] == OrderItem::COMMENT_STATUS_NO) {
  225. $status_code = 'nocomment';
  226. } else {
  227. $status_code = 'commented';
  228. }
  229. break;
  230. }
  231. return $status_code; // status_code
  232. }
  233. }