SyncBatchTask.php 5.9 KB

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