SyncBatchTask.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Order;
  4. use App\OrderBin;
  5. use App\Services\BatchService;
  6. use App\Services\CacheService;
  7. use App\Services\common\BatchUpdateService;
  8. use App\Services\DocWaveHeaderService;
  9. use App\Services\LogService;
  10. use App\ValueStore;
  11. use Carbon\Carbon;
  12. use Illuminate\Console\Command;
  13. use Illuminate\Support\Facades\DB;
  14. class SyncBatchTask extends Command
  15. {
  16. protected $signature = 'sync:batch';
  17. protected $description = 'sync wms batch task';
  18. /** @var DocWaveHeaderService $service */
  19. private $service;
  20. /** @var BatchService $batchService */
  21. private $batchService;
  22. public function __construct()
  23. {
  24. parent::__construct();
  25. $this->service = app(DocWaveHeaderService::class);
  26. $this->batchService = app(BatchService::class);
  27. }
  28. public function handle()
  29. {
  30. $this->disposeHeader();
  31. $this->disposeDetail();
  32. }
  33. private function disposeHeader()
  34. {
  35. //获取更新时间与WMS数据
  36. $date = $this->service->getSyncDate();
  37. $waves = $this->service->get(["edittime"=>$date],["edittime"=>"gtOrEqual"]);
  38. if (count($waves) < 1)return;
  39. //获取本地数据对比差异
  40. $codes = array_column($waves->toArray(),"waveno");
  41. $map = [];
  42. $batches = $this->batchService->get(["code"=>$codes]);
  43. if ($batches){
  44. foreach ($batches as $batch)$map[$batch->code] = $batch->id;
  45. }
  46. $update = [["id","wms_status","remark","updated_at"]];
  47. $insert = [];
  48. foreach ($waves as $wave){
  49. if (isset($map[$wave->waveno])){
  50. $update[] = [
  51. "id" => $map[$wave->waveno],
  52. "wms_status" => $this->wms_status($wave),
  53. "remark"=>$wave->descr,
  54. "updated_at"=>$wave->edittime,
  55. ];
  56. continue;
  57. }
  58. $owner = app("OwnerService")->codeGetOwner($wave->customerid);
  59. $insert[] = [
  60. "code" => $wave->waveno,
  61. "remark"=>$wave->descr,
  62. "status" => '未处理',
  63. "wms_status" => $this->wms_status($wave),
  64. "created_at"=>$wave->addtime,
  65. "updated_at"=>$wave->edittime,
  66. "owner_id"=>$owner->id,
  67. ];
  68. }
  69. //存在则更新
  70. if (count($update)>1){
  71. $bool = app(BatchUpdateService::class)->batchUpdate("batches",$update);
  72. if ($bool)LogService::log(__METHOD__,"SUCCESS-同步更新波次成功",json_encode($update));
  73. else{
  74. LogService::log(__METHOD__,"ERROR-同步更新波次失败",json_encode($update));
  75. return;
  76. }
  77. }
  78. //不存在则录入
  79. if ($insert){
  80. $this->batchService->insert($insert);
  81. LogService::log(__METHOD__,"SUCCESS-同步插入波次成功",json_encode($insert));
  82. }
  83. $lastDate = $waves[0]->edittime;
  84. $this->service->setSyncDate($lastDate);
  85. }
  86. public function disposeDetail()
  87. {
  88. $date = app(CacheService::class)->getOrExecute("wave_detail_last_sync_date",function (){
  89. $valueStore = ValueStore::query()->where("name","wave_detail_last_sync_date")->first();
  90. return $valueStore->value ?? Carbon::now()->subSeconds(65)->toDateTimeString();
  91. });
  92. $sql = "SELECT ORDERNO,WAVENO,SEQNO FROM DOC_WAVE_DETAILS WHERE EDITTIME > TO_DATE(?,'yyyy-mm-dd hh24:mi:ss')";
  93. $details = DB::connection("oracle")->select(DB::raw($sql),[$date]);
  94. if (count($details) < 1)return;
  95. $map = [];
  96. $nos = [];
  97. $orderCodes = [];
  98. $seqnos = [];
  99. foreach ($details as $detail){
  100. if (isset($map[$detail->waveno]))$map[$detail->waveno][] = $detail->orderno;
  101. else {
  102. $map[$detail->waveno] = [$detail->orderno];
  103. $nos[] = $detail->waveno;
  104. }
  105. $orderCodes[] = $detail->orderno;
  106. $seqnos[$detail->orderno] = $detail->seqno;
  107. }
  108. $orders = Order::query()->select("id","code")->whereIn("code",$orderCodes)->get();
  109. if (count($orderCodes) != count($orders)){
  110. $orderIds = [];
  111. $orderMap = [];
  112. foreach ($orders as $order){
  113. $orderIds[] = $order->id;
  114. $orderMap[$order->id] = $seqnos[$order->code];
  115. }
  116. $updateBin = [["id","number"]];
  117. $insertBin = [];
  118. $orderBins = OrderBin::query()->select("id","order_id","number")->whereIn("order_id",$orderIds)->get();
  119. foreach ($orderBins as $orderBin){
  120. if ($orderBin->number != $orderMap[$orderBin->order_id])$updateBin[]=["id"=>$orderBin->id,"number"=>$orderMap[$orderBin->order_id]];
  121. unset($orderMap[$orderBin->order_id]);
  122. }
  123. foreach ($orderMap as $orderId=>$binNumber){
  124. $insertBin[]=[
  125. "order_id"=>$orderId,
  126. "number"=>$binNumber
  127. ];
  128. }
  129. if (count($updateBin)>1){
  130. app(BatchUpdateService::class)->batchUpdate("order_bins",$updateBin);
  131. LogService::log(__METHOD__,"波次同步-更新订单格口号",json_encode($updateBin));
  132. }
  133. if ($insertBin){
  134. OrderBin::query()->insert($insertBin);
  135. LogService::log(__METHOD__,"波次同步-录入订单格口号",json_encode($insertBin));
  136. }
  137. }
  138. $batches = $this->batchService->get(["code"=>$nos]);
  139. foreach ($batches as $batch){
  140. app("OrderService")->update(["code"=>$map[$batch->code]],["batch_id"=>$batch->id]);
  141. unset($map[$batch->code]);
  142. }
  143. if ($map){
  144. $waveCodes = array_keys($map);
  145. $waves = $this->service->get(["waveno"=>$waveCodes],["waveno"=>"in"]);
  146. $insert = [];
  147. foreach ($waves as $wave){
  148. $owner = app("OwnerService")->codeGetOwner($wave->customerid);
  149. $insert[] = [
  150. "code" => $wave->waveno,
  151. "status" => '未处理',
  152. "wms_status" => $this->wms_status($wave),
  153. "remark"=>$wave->descr,
  154. "created_at"=>$wave->addtime,
  155. "updated_at"=>$wave->edittime,
  156. "owner_id"=>$owner->id,
  157. ];
  158. }
  159. if ($insert){
  160. $this->batchService->insert($insert);
  161. LogService::log(__METHOD__,"SUCCESS-同步插入波次成功",json_encode($insert));
  162. $batches = $this->batchService->get(["code"=>$waveCodes]);
  163. foreach ($batches as $batch){
  164. app("OrderService")->update(["code"=>$map[$batch->code]],["batch_id"=>$batch->id]);
  165. }
  166. }
  167. }
  168. // $this->batchService->assignTasks($batches);
  169. ValueStore::query()->where("name","wave_detail_last_sync_date")->update(["value"=>Carbon::now()->subSeconds(1)->toDateTimeString()]);
  170. }
  171. /**
  172. * @param $wave
  173. * @return string
  174. */
  175. public function wms_status($wave): string
  176. {
  177. switch ($wave->wavestatus) {
  178. case 00:
  179. $wms_status = '创建';
  180. break;
  181. case 40:
  182. $wms_status = '部分收货';
  183. break;
  184. case 90:
  185. $wms_status = '取消';
  186. break;
  187. case 99:
  188. $wms_status = '完成';
  189. break;
  190. default:null;
  191. }
  192. return $wms_status;
  193. }
  194. }