WorkOrderCommoditiesService.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <?php
  2. namespace App\Services;
  3. use App\OrderPackage;
  4. use App\OrderPackageCommodities;
  5. use App\RejectedBill;
  6. use App\RejectedBillItem;
  7. use App\Traits\ServiceAppAop;
  8. use App\WorkOrderCommodities;
  9. use App\WorkOrderDetail;
  10. use Illuminate\Support\Facades\DB;
  11. class WorkOrderCommoditiesService
  12. {
  13. use ServiceAppAop;
  14. protected $modelClass = WorkOrderCommodities::class;
  15. public function createWorkOrderCommodityByJson(WorkOrderDetail $detail, $json)
  16. {
  17. $obj = json_decode($json);
  18. $detail->commodities()->create([
  19. 'work_order_id' => $detail->work_order_id ?? '',
  20. 'work_order_detail_id' =>$detail->id ?? '',
  21. 'commodity_id' => $obj->commodity_id ?? '',
  22. 'sku' => $obj->sku ?? '',
  23. 'amount' => $obj->amount ?? '',
  24. 'price' => $obj->price ?? '',
  25. 'logistic_number' => $obj->logistic_number ?? '',
  26. 'abnormal_amount' => $obj->abnormal_amount ?? '',
  27. 'check_amount' => $obj->check_amount ?? '',
  28. 'bao_shi_check_amount' => $obj->bao_shi_check_amount ?? '',
  29. 'reissue_logistic_number' => $obj->reissue_logistic_number ?? '',
  30. 'store_in_number' => $obj->store_in_number ?? '',
  31. 'check_result' => $obj->check_result ?? '',
  32. 'process_result' => $obj->process_result ?? '',
  33. 'abnormal_type' => $obj->abnormal_type ?? '',
  34. 'issue_type' => $detail->order_issue_type_id ?? '',
  35. 'out_order_number' => $detail->out_order_number ?? '',
  36. ]);
  37. }
  38. /**
  39. * 工单详情
  40. * @param WorkOrderDetail $detail
  41. * @param $array
  42. */
  43. public function createWorkOrderCommoditiesByJsonArray(WorkOrderDetail $detail, $array)
  44. {
  45. foreach ($array as $json) {
  46. $this->createWorkOrderCommodityByJson($detail, $json);
  47. }
  48. }
  49. /**
  50. * @param WorkOrderDetail $detail
  51. * @param $array
  52. */
  53. public function updateWorkOrderCommoditiesByJsonArray(WorkOrderDetail $detail, $array)
  54. {
  55. foreach ($array as $json) {
  56. $this->updateWorkOrderCommoditiesByJson($detail, $json);
  57. }
  58. }
  59. /**
  60. * @param WorkOrderDetail $detail
  61. * @param $json
  62. */
  63. public function updateWorkOrderCommoditiesByJson(WorkOrderDetail $detail, $json)
  64. {
  65. $obj = json_decode($json);
  66. $detail->commodities()->where('id', $obj->id)->update([
  67. 'check_amount' => $obj->check_amount ?? '',
  68. 'bao_shi_check_amount' => $obj->bao_shi_check_amount ?? '',
  69. 'abnormal_amount' => $obj->abnormal_amount ?? '',
  70. 'abnormal_type' => $obj->abnormal_type ?? '',
  71. 'check_result' => $obj->check_result ?? '',
  72. 'price' => $obj->price ?? '',
  73. 'process_result' => $obj->process_result ?? '',
  74. 'process_result_info' => $obj->process_result_info ?? '',
  75. 'reissue_logistic_number' => $obj->reissue_logistic_number ?? '', // 补发单号
  76. 'store_in_amount' => $obj->store_in_amount ?? '', // 入库数量
  77. 'store_in_number' => $obj->store_in_number ?? '', // 入库单号
  78. 'out_order_number' => $obj->out_order_number ?? '', // 入库单号
  79. 'end_handle_result' => $obj->end_handle_result ?? '', // 最终处理
  80. ]);
  81. }
  82. public function deleteCommodities($detail,$delete_ids)
  83. {
  84. if (!$delete_ids) return ;
  85. WorkOrderCommodities::query()->where('work_order_detail_id',$detail->id)->whereIn('id',$delete_ids)->delete();
  86. }
  87. /**
  88. * 标记为未完成历史标记
  89. * @param WorkOrderDetail $detail
  90. */
  91. public function undoneTag(WorkOrderDetail $detail)
  92. {
  93. $detail->commodities()->update(['tag' => 2]);
  94. }
  95. /**
  96. * 标记为完成
  97. * @param WorkOrderDetail $detail
  98. */
  99. public function endDetail(WorkOrderDetail $detail)
  100. {
  101. $detail->commodities()->update(['tag' => 1]);
  102. }
  103. public function getOrderCommoditiesEqualWorkOrderDetailCommoditiesMap(WorkOrderDetail $workOrderDetail): array
  104. {
  105. $query = OrderPackage::query()->select('id')->where('order_id', $workOrderDetail->workOrder->order_id);
  106. $order_commodities = OrderPackageCommodities::query()->with('commodity.barcodes')->whereIn('order_package_id', $query)->get();
  107. $query = DB::table('order_issue_rejected_bill')->select('logistic_number_return')->where('order_id', $workOrderDetail->workOrder->order_id);
  108. $query = RejectedBill::query()->select('id')->whereIn('logistic_number_return',$query->get()->map(function ($item){
  109. return $item->logistic_number_return;
  110. })->toArray());
  111. $rejected_items = RejectedBillItem::query()->with('barcode','quality')->whereIn('id_rejected_bill',$query)->get();
  112. return $this->getEqualMapByRejectedBillAndWorkOrderCommodity($order_commodities,$rejected_items);
  113. }
  114. private function getEqualMapByRejectedBillAndWorkOrderCommodity($order_commodities,$rejectedBillItems): array
  115. {
  116. $rejected_bill_items_map = $this->getRejectedBillItemMap($rejectedBillItems);
  117. $order_commodities_map = $this->getOrderCommoditiesMap($order_commodities,$rejected_bill_items_map);
  118. return $this->getEqualMap($order_commodities_map,$rejected_bill_items_map);
  119. }
  120. public function getRejectedBillItemMap($rejectedBillItems): array
  121. {
  122. $map = [];
  123. $rejectedBillItems->each(function($item)use(&$map){
  124. $key = $item->barcode_goods;
  125. $quality_label = $item->quality_label;
  126. if(!array_key_exists($key,$map)){
  127. $map[$key] = [
  128. 'sku' => $key,
  129. 'quality_label' => [
  130. "${quality_label}"=> [
  131. "quality_label" => $quality_label, "amount" => $item->amount,
  132. ],
  133. ],
  134. 'name' => $item->name_goods,
  135. ];
  136. }
  137. if(!array_key_exists($quality_label,$map[$key]['quality_label'])){
  138. $map[$key]['quality_label'][$quality_label]['amount'] = 0;
  139. $map[$key]['quality_label'][$quality_label]['quality_label'] = $quality_label;
  140. }
  141. $map[$key]['quality_label'][$quality_label]['amount'] += $item->amount;
  142. });
  143. return $map;
  144. }
  145. public function getOrderCommoditiesMap($orderCommodities,$rejectedBillMap): array
  146. {
  147. $map = [];
  148. if (!$orderCommodities) return $map;
  149. $barcodes = array_keys($rejectedBillMap);
  150. foreach ($orderCommodities as $order_commodity) {
  151. $commodity_barcodes = $order_commodity->commodity->barcodes->map(function($item){
  152. return $item->code;
  153. })->toArray();
  154. $key = $order_commodity->commodity->sku;
  155. if($commodity_barcodes){
  156. $codes = array_intersect($barcodes,$commodity_barcodes);
  157. $key = array_shift($codes);
  158. }
  159. if (!array_key_exists($key,$map)){
  160. $map[$key] = [
  161. 'sku' => $key,
  162. 'amount' => 0,
  163. 'name' => $order_commodity->commodity->name,
  164. ];
  165. $map[$key]['amount'] += (int) $order_commodity->amount;
  166. }
  167. }
  168. return $map;
  169. }
  170. public function getEqualMap($orderCommodityMap,$rejectedBillMap): array
  171. {
  172. $map = [];
  173. foreach ($orderCommodityMap as $key=>$item){
  174. $map[$key] = [
  175. 'order_commodity_sku' => $key,
  176. 'order_commodity_name' => $item['name'],
  177. 'order_commodity_amount' => $item['amount'],
  178. 'rejected_item_sku' => isset($rejectedBillMap[$key]) ? $key : '',
  179. 'rejected_item_quality_label' => $rejectedBillMap[$key]['quality_label'] ?? [],
  180. 'rejected_item_name' => $rejectedBillMap[$key]['name'] ?? '',
  181. ];
  182. }
  183. foreach ($rejectedBillMap as $key=>$item){
  184. if(!array_key_exists($key,$orderCommodityMap)){
  185. $map[$key] = [
  186. 'order_commodity_sku' => isset($orderCommodityMap[$key]) ? $key : '',
  187. 'order_commodity_name' => $orderCommodityMap['name'] ?? null,
  188. 'order_commodity_amount' => $orderCommodityMap['amount'] ?? null,
  189. 'rejected_item_sku' => $key,
  190. 'rejected_item_quality_label' => $item['quality_label'] ?? [],
  191. 'rejected_item_name' => $item['name'] ?? '',
  192. ];
  193. }
  194. }
  195. return $map;
  196. }
  197. }