WorkOrderCommoditiesService.php 8.6 KB

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