OrderPackageCommoditySerialNumberService.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <?php
  2. namespace App\Services;
  3. use App\Order;
  4. use App\OrderPackage;
  5. use App\Services\common\BatchUpdateService;
  6. use App\Services\common\DataHandlerService;
  7. use App\Traits\ServiceAppAop;
  8. use App\OrderPackageCommoditySerialNumber;
  9. use Illuminate\Support\Carbon;
  10. class OrderPackageCommoditySerialNumberService
  11. {
  12. use ServiceAppAop;
  13. protected $modelClass = OrderPackageCommoditySerialNumber::class;
  14. public function batchUpdate(array $params)
  15. {
  16. return app(BatchUpdateService::class)->batchUpdate('order_packages_commodity_serial_numbers',$params);
  17. }
  18. public function syncOrderPackageCommoditySerialNumbers($orderHeaders)
  19. {
  20. $orderQuery = Order::query()->selectRaw('id')->whereIn('code', data_get($orderHeaders, '*.orderno'));
  21. $orderPackages = OrderPackage::query()->with(['commodities' => function ($query) {
  22. $query->with('commodity', 'serialNumbers');
  23. }])->whereIn('order_id', $orderQuery)->get();
  24. $createdModels = $this->getCreateParamsBy($orderHeaders, $orderPackages);
  25. $regroupParams = $this->regroupOrderPackage($orderPackages);
  26. $this->deletedModelBy($createdModels,$regroupParams);
  27. $this->createdModelBy($createdModels,$regroupParams);
  28. }
  29. public function regroupOrderPackage($orderPackages): array
  30. {
  31. $regroupArr = [];
  32. if (!$orderPackages) return $regroupArr;
  33. foreach ($orderPackages as $orderPackage) {
  34. $logistic_number = $orderPackage['logistic_number'];
  35. $regroupArr[$logistic_number] = [];
  36. foreach ($orderPackage['commodities'] as $commodity) {
  37. $sku = $commodity['commodity']['sku'] ?? null;
  38. $regroupArr[$logistic_number][$sku] = [];
  39. foreach ($commodity['serialNumbers'] as $serialNumber) {
  40. $serial_number = $serialNumber['serial_number'];
  41. $id = $serialNumber['id'];
  42. $regroupArr[$logistic_number][$sku][$serial_number]
  43. = ['id'=>$id,'order_package_commodity_id' => $commodity['id'], 'serial_number' => $serial_number];
  44. }
  45. }
  46. }
  47. return $regroupArr;
  48. }
  49. public function createdModelBy($createdModels, $regroupParams)
  50. {
  51. $innerParams = [];
  52. foreach ($createdModels as $key => $createdParams) {
  53. foreach ($createdParams as $sku => $params) {
  54. foreach ($params as $serialNumber =>$param) {
  55. if(!isset($regroupParams[$key][$sku][$serialNumber])){
  56. $innerParams[] = $param;
  57. }
  58. }
  59. }
  60. }
  61. OrderPackageCommoditySerialNumber::query()->insert($innerParams);
  62. }
  63. // public function updatedModelBy($createdModels, $regroupParams)
  64. // {
  65. // $updateParams = [['id','serial_number']];
  66. // if (count($updateParams) == 0) return;
  67. // $this->batchUpdate($updateParams);
  68. // }
  69. public function deletedModelBy($createdModels, $regroupParams)
  70. {
  71. $deleteParams = [];
  72. foreach ($regroupParams as $key => $params) {
  73. if (!isset($regroupParams[$key])) continue;
  74. foreach ($params as $sku => $items) {
  75. foreach ($items as $serialNumber=>$item) {
  76. if (!isset($createdModels[$key][$sku][$serialNumber])){
  77. $deleteParams[] = $item;
  78. }
  79. }
  80. }
  81. }
  82. if (count($deleteParams)==0) return;
  83. $delete = OrderPackageCommoditySerialNumber::query()->whereIn('id',data_get($deleteParams,'*.id'))->delete();
  84. if($delete>0)LogService::log(__CLASS__,'Delete OrderPackageCommoditySerialNumber',json_encode($deleteParams));
  85. }
  86. public function getCreateParamsBy($orderHeaders, $orderPackages): array
  87. {
  88. /** @var DataHandlerService $dataHandlerService */
  89. $dataHandlerService = app(DataHandlerService::class);
  90. $orderPackageMaps = $dataHandlerService->dataHeader(['logistic_number'], $orderPackages);
  91. $orderPackageSerialNumbers = [];
  92. foreach ($orderHeaders as $orderHeader) {
  93. if(!isset($orderHeader['actAllocationDetails']))continue;
  94. foreach ($orderHeader['actAllocationDetails'] as $actAllocationDetail) {
  95. $logisticNumber = $actAllocationDetail['picktotraceid'];
  96. if (!$logisticNumber) continue;
  97. $orderPackage = $dataHandlerService->getKeyValue(['logistic_number' => $logisticNumber], $orderPackageMaps) ??
  98. $dataHandlerService->getKeyValue(['logistic_number' => $orderHeader['soreference5']], $orderPackageMaps);
  99. if (!$orderPackage) continue;
  100. $orderPackageCommodityMap = [];
  101. if(!isset($orderPackage['commodities']))continue;
  102. foreach ($orderPackage['commodities'] as $orderPackageCommodity) {
  103. $sku = $orderPackageCommodity['commodity']['sku'] ?? '';
  104. if($sku === '')continue;
  105. $orderPackageCommodityMap[$sku] = $orderPackageCommodity;
  106. }
  107. $oracleDocOrderSubSerialNos = $actAllocationDetail['oracleDocOrderSubSerialNos'];
  108. $createParams = $this->getCreateModelsBy($oracleDocOrderSubSerialNos,$orderPackageCommodityMap);
  109. if (!isset($orderPackageSerialNumbers[$logisticNumber])) $orderPackageSerialNumbers[$logisticNumber] = [];
  110. foreach ($createParams as $sku => $createParam) {
  111. if(!isset($orderPackageSerialNumbers[$logisticNumber][$sku])){
  112. foreach ($createParam as $serialNumber=>$item) {
  113. $orderPackageSerialNumbers[$logisticNumber][$sku][$serialNumber] = $item;
  114. }
  115. }
  116. else $orderPackageSerialNumbers[$logisticNumber][$sku] = $createParam;
  117. }
  118. }
  119. }
  120. return $orderPackageSerialNumbers;
  121. }
  122. public function getCreateModelsBy($oracleDocOrderSubSerialNos,$orderPackageCommodityMap): array
  123. {
  124. $createdParams = [];
  125. foreach ($oracleDocOrderSubSerialNos as $oracleDocOrderSubSerialNo) {
  126. $model = $this->getCreateModel($oracleDocOrderSubSerialNo,$orderPackageCommodityMap);
  127. $sku = $oracleDocOrderSubSerialNo['sku'];
  128. $createdParams[$sku][$model['serial_number']] =$model;
  129. }
  130. return $createdParams;
  131. }
  132. public function getCreateModel($oracleDocOrderSubSerialNo, $orderPackageCommodityMap): array
  133. {
  134. $orderPackageCommodity = $orderPackageCommodityMap[$oracleDocOrderSubSerialNo['sku']] ?? null;
  135. if (!$orderPackageCommodity) return [];
  136. $created_At = Carbon::now()->format(Carbon::DEFAULT_TO_STRING_FORMAT);
  137. return [
  138. 'order_package_commodity_id' => $orderPackageCommodity['id'],
  139. 'serial_number' => $oracleDocOrderSubSerialNo['serialno'] . '/' . $oracleDocOrderSubSerialNo['subserialno'],
  140. 'created_at' => $created_At,
  141. 'updated_at' => $created_At
  142. ];
  143. }
  144. }