OrderRejectingStatusService.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. namespace App\Services;
  3. use App\Commodity;
  4. use App\CommodityBarcode;
  5. use App\Order;
  6. use App\OrderDetail;
  7. use App\OrderIssueRejectedBill;
  8. use App\RejectedBill;
  9. use App\RejectedBillItem;
  10. class OrderRejectingStatusService
  11. {
  12. //计算退回件问题
  13. public function rejectedBillSyncRejectingStatus(RejectedBill $rejectedBill)
  14. {
  15. $query = OrderIssueRejectedBill::query()->select('order_id')->where('logistic_number_return', $rejectedBill->logistic_number_return);
  16. $order = Order::query()->whereIn('id', $query)->first();
  17. $this->syncRejectingStatus($order);
  18. }
  19. /**
  20. * 订单同步退回状态
  21. */
  22. public function syncRejectingStatus($order)
  23. {
  24. if (!$order) return;
  25. $rejecting_status = $this->getOrderRejectingStatus($order);
  26. $order_detail = OrderDetail::query()->where('order_id', $order->id)->first();
  27. if (!$order_detail) {
  28. OrderDetail::query()->create(
  29. ['order_id' => $order->id, 'is_new_rejecting' => '有', 'rejecting_status' => $rejecting_status === '无' ? '无' : '有']
  30. );
  31. return;
  32. }
  33. if (in_array($order_detail->is_new_rejecting, ['有', '已处理']) && $rejecting_status != '无') {
  34. $order_detail->update(['rejecting_status' => $rejecting_status]);
  35. } else {
  36. $order_detail->update(['rejecting_status' => $rejecting_status, $rejecting_status => $rejecting_status === '无' ? '无' : '有']);
  37. }
  38. }
  39. public function getOrderRejectingStatus(Order $order): string
  40. {
  41. $rejected_bill_item_map = $this->getRejectedBillMaps($order);
  42. $order_commodity_map = $this->getOrderCommodityMap($order);
  43. return $this->computerRejectingStatus($rejected_bill_item_map, $order_commodity_map);
  44. }
  45. private function getRejectedBillItems(Order $order)
  46. {
  47. $query = OrderIssueRejectedBill::query()->select('logistic_number_return')->where('order_id', $order->id);
  48. $query = RejectedBill::query()->select('id')->whereIn('logistic_number_return', $query);
  49. return RejectedBillItem::query()->with('quality')->whereIn('id_rejected_bill', $query)->get();
  50. }
  51. private function getRejectedBillMaps($order): array
  52. {
  53. $rejected_bill_items = $this->getRejectedBillItems($order);
  54. $map = [];
  55. if (count($rejected_bill_items) == 0) return $map;
  56. foreach ($rejected_bill_items as $item) {
  57. $code = $item->barcode_goods;
  58. $amount = $item->amount;
  59. if (!Commodity::query()->where("sku", $code)->where('owner_id', $order->owner_id)->exists()) {
  60. $query = CommodityBarcode::query()->select('commodity_id')->where('code', $code);
  61. $commodity = Commodity::query()->where('owner_id', $order->owner_id)->whereIn('id', $query)->first();
  62. if ($commodity) $code = $commodity->sku;
  63. }
  64. $quality_name = $item->quality->name;
  65. if ($map[$code][$quality_name] ?? false) $map[$code][$quality_name] += $amount;
  66. else $map[$code][$quality_name] = $amount;
  67. }
  68. return $map;
  69. }
  70. private function getOrderCommodityMap(Order $order): array
  71. {
  72. $map = [];
  73. $order->packages->each(function ($package) use ($order, &$map) {
  74. $package->commodities->map(function ($item) use ($order, &$map) {
  75. $sku = $item->commodity->sku ?? null;
  76. if ($sku) {
  77. $amount = $item->amount;
  78. empty($map[$sku]) ? $map[$sku] = $amount : $map[$sku] += $amount;
  79. }
  80. });
  81. });
  82. return $map;
  83. }
  84. private function computerRejectingStatus(array $rejected_bill_item_map, array $order_commodity_map): string
  85. {
  86. //未退回,差异退回,全部退回,超量退回,部分退回
  87. if (count($rejected_bill_item_map) == 0) return "未退回";
  88. $equal = 0; // 相等sku
  89. $portion = 0; // 相等的sku
  90. foreach ($rejected_bill_item_map as $key => $map) {
  91. if (isset($map['残次']) && $map['残次'] > 0) return "差异退回";
  92. if (empty($order_commodity_map[$key])) return "差异退回";
  93. if (isset($map['正品']) && isset($order_commodity_map[$key])) {
  94. if ($map['正品'] < $order_commodity_map[$key]) $portion += 1;
  95. if ($map['正品'] > $order_commodity_map[$key]) return "超量退回";
  96. if ($map['正品'] == $order_commodity_map[$key]) $equal += 1;
  97. }
  98. }
  99. if ($equal == count($rejected_bill_item_map)
  100. && $equal == count($rejected_bill_item_map)
  101. && $portion == 0) return "全部退回"; // 全部退回
  102. if ($portion > 0) return "部分退回";
  103. if (count(array_diff_key($rejected_bill_item_map, $order_commodity_map)) > 0) return '部分退回';
  104. if (count(array_diff_key($order_commodity_map, $rejected_bill_item_map)) > 0) return '差异退回';
  105. return "无";
  106. }
  107. }