SyncBatchTask.php 7.6 KB

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