StoreService.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. <?php
  2. namespace App\Services;
  3. use App\Services\common\BatchUpdateService;
  4. use App\Services\common\DataHandlerService;
  5. use App\Services\common\QueryService;
  6. use App\Store;
  7. use App\ValueStore;
  8. use Carbon\Carbon;
  9. use Illuminate\Support\Facades\Cache;
  10. Class StoreService
  11. {
  12. private function conditionQuery(array $params)
  13. {
  14. $stores = Store::query()->with(['storeItems.store', 'warehouse', 'owner'])->whereNotIn('stored_method', ['快速入库', '正常'])->orderBy('id', 'DESC');
  15. $columnQueryRules = [
  16. 'asn_code' => ['like' => ''],
  17. 'created_at_start' => ['alias' => 'created_at', 'startDate' => ' 00:00:00'],
  18. 'created_at_end' => ['alias' => 'created_at', 'endDate' => ' 23:59:59'],
  19. 'owner_id' => ['multi' => ','],
  20. 'warehouse_id' => ['multi' => ','],
  21. 'status' => ['multi' => ','],
  22. 'stored_method' => ['multi' => ','],
  23. 'id' => ['multi' => ',']
  24. ];
  25. $stores = app(QueryService::class)->query($params, $stores, $columnQueryRules, 'stores');
  26. return $stores;
  27. }
  28. public function paginate(array $params)
  29. {
  30. return $this->conditionQuery($params)->paginate($params['paginate'] ?? 50);
  31. }
  32. public function create(array $params)
  33. {
  34. return Store::query()->create($params);
  35. }
  36. public function storeCreateByWms()
  37. {
  38. $created_at = config('sync.asn_sync.created_at');
  39. $create_set = config('sync.asn_sync.cache_prefix.create_set');
  40. $create_keys = config('sync.asn_sync.cache_prefix.create_keys');
  41. $create_key = config('sync.asn_sync.cache_prefix.create');
  42. /** @var OracleDocAsnHerderService $oracleDocAsnHerderService */
  43. $oracleDocAsnHerderService = app(OracleDocAsnHerderService::class);
  44. $last_time = $this->getAsnLastSyncAt($created_at, 'create');
  45. $asnHerders = $oracleDocAsnHerderService->getWmsAsnOnStartDateCreate($last_time);
  46. $last_time=$asnHerders->first()['addtime'];
  47. $last_records = $asnHerders->where('addtime', $last_time);
  48. if (!$asnHerders) return;
  49. $addAsnHerders = $this->getLastRecordsByRedis($create_set, $create_key, $asnHerders);
  50. if (count($addAsnHerders) > 0) {
  51. $this->createStore($addAsnHerders);
  52. $this->deleteCacheKey($create_set, $create_keys);
  53. $this->setLastRecordsByRedis($create_key,$create_set,$create_keys,$last_records);
  54. $this->setAsnLastSyncAt($created_at,$last_time);
  55. }
  56. }
  57. public function storeUpdateByWms()
  58. {
  59. $updated_at = config('sync.asn_sync.updated_at');
  60. $update_set = config('sync.asn_sync.cache_prefix.update_set');
  61. $update_keys = config('sync.asn_sync.cache_prefix.update_keys');
  62. $update_key = config('sync.asn_sync.cache_prefix.update');
  63. /** @var OracleDocAsnHerderService $oracleDocAsnHerderService */
  64. $oracleDocAsnHerderService = app(OracleDocAsnHerderService::class);
  65. $last_time = $this->getAsnLastSyncAt($updated_at, 'update');
  66. $asnHerders = $oracleDocAsnHerderService->getWmsAsnOnStartDateEdit($last_time);
  67. $last_time=$asnHerders->first()['edittime'];
  68. $last_records = $asnHerders->where('edittime', $last_time);
  69. if (!$asnHerders) return;
  70. $addAsnHerders = $this->getLastRecordsByRedis($update_set, $update_key, $asnHerders);
  71. if (count($addAsnHerders) > 0) {
  72. $this->createStore($addAsnHerders);
  73. $this->updateStore($addAsnHerders);
  74. $this->deleteCacheKey($update_set, $update_keys);
  75. $this->setLastRecordsByRedis($update_key,$update_set,$update_keys,$last_records);
  76. $this->setAsnLastSyncAt($updated_at,$last_time);
  77. }
  78. }
  79. public function createStore($asnHerders)
  80. {
  81. if (!$asnHerders) return null;
  82. /**
  83. * @var OwnerService $ownerService
  84. * @var WarehouseService $wareHouseService
  85. */
  86. $ownerService = app(OwnerService::class);
  87. $owners = $ownerService->getByWmsOrders($asnHerders);
  88. $wareHouseService = app(WarehouseService::class);
  89. $warehouses = $wareHouseService->getByWmsOrders($asnHerders);
  90. foreach ($owners as $owner) {
  91. $owners_code_map[$owner->code] = $owner;
  92. }
  93. foreach ($warehouses as $warehouse) {
  94. $warehouses_code_map[$warehouse->code] = $warehouse;
  95. }
  96. $params = $this->getParamsByAsnHeader($asnHerders, $owners_code_map, $warehouses_code_map);
  97. if (count($params) > 0) {
  98. $this->insertStore($params);
  99. }
  100. /** @var StoreItemService $storeItemService */
  101. $storeItemService = app(StoreItemService::class);
  102. $storeItemService->storeItemCreateByWms($asnHerders);
  103. /** @var RejectedBillService $rejectedBillService */
  104. $rejectedBillService = app(RejectedBillService::class);
  105. $rejectedBillService->syncLoadedStatusByAsnHerder($asnHerders);
  106. unset($asnHerders, $owners_code_map, $warehouses_code_map);
  107. }
  108. public function getParamsByAsnHeader($asnHerders, $owners_code_map, $warehouses_code_map)
  109. {
  110. $params = [];
  111. $stores = Store::query()->whereIn('asn_code', data_get($asnHerders, '*.asnno'))->get();
  112. $store_asn_code_map = [];
  113. foreach ($stores as $store) {
  114. $store_asn_code_map[$store->asn_code] = $store;
  115. }
  116. foreach ($asnHerders as $asnHerder) {
  117. if ($store_asn_code_map[$asnHerder->asnno] ?? false) continue;
  118. $owner = $owners_code_map[$asnHerder->customerid] ?? null;
  119. $warehouse = $warehouses_code_map[$asnHerder->warehouseid] ?? null;
  120. $params[] = [
  121. 'asn_code' => $asnHerder->asnno,
  122. 'warehouse_id' => $warehouse->id ?? null,
  123. 'owner_id' => $owner->id ?? null,
  124. 'stored_method' => $asnHerder->asnType ? $asnHerder->asnType->codename_c : '',
  125. 'status' => $asnHerder->asnStatus ? $asnHerder->asnStatus->codename_c : '',
  126. 'remark' => $asnHerder->notes ?? '1111',
  127. 'created_at' => $asnHerder->addtime ?? null,
  128. 'updated_at' => $asnHerder->edittime ?? null,
  129. ];
  130. }
  131. return $params;
  132. }
  133. public function insertStore(array $params)
  134. {
  135. if (count($params) === 0) return [];
  136. try {
  137. $this->insert($params);
  138. LogService::log(__METHOD__, __FUNCTION__, '批量创建 store success' . count($params) . json_encode($params));
  139. } catch (\Exception $e) {dd($e->getMessage());
  140. LogService::log(__METHOD__, __FUNCTION__, '批量创建 store error' . json_encode($params) . '||' .json_encode($e->getMessage()) . '||' . $e->getTraceAsString());
  141. }
  142. }
  143. public function updateStore($asnHerders)
  144. {
  145. if (!$asnHerders || $asnHerders->count() == 0) {
  146. return null;
  147. }
  148. /** @var DataHandlerService $dataHandlerService */
  149. $dataHandlerService = app(DataHandlerService::class);
  150. $stores = $this->getByWms($asnHerders);
  151. $store_asn_code_map = $dataHandlerService->dataHeader(['asn_code'], $stores);
  152. $owners = app(OwnerService::class)->getByWmsOrders($asnHerders);
  153. $owner_code_map = $dataHandlerService->dataHeader(['code'], $owners);
  154. $warehouses = app(WarehouseService::class)->getByWmsOrders($asnHerders);
  155. $warehouses_map = $dataHandlerService->dataHeader(['code'], $warehouses);
  156. $updateParams = [[
  157. 'id', 'asn_code', 'warehouse_id', 'owner_id', 'stored_method', 'status', 'remark', 'updated_at'
  158. ]];
  159. foreach ($asnHerders as $asnHerder) {
  160. $store = $dataHandlerService->getKeyValue(['asn_code' => $asnHerder->asnno], $store_asn_code_map);
  161. if (!$store) {
  162. continue;
  163. }
  164. $owner = $dataHandlerService->getKeyValue(['code' => $asnHerder->customerid], $owner_code_map);
  165. $warehouse = $dataHandlerService->getKeyValue(['code' => $asnHerder->warehouseid], $warehouses_map);
  166. $owner_id = $owner->id ?? null;
  167. $warehouse_id = $warehouse->id ?? null;
  168. if ($store->asn_code != $asnHerder->asnno ||
  169. $store->warehouse_id != $warehouse_id ||
  170. $store->owner_id != $owner_id ||
  171. $store->stored_method != $asnHerder->asnType->codename_c ||
  172. $store->status != $asnHerder->asnStatus->codename_c ||
  173. $store->remark != $asnHerder->notes) {
  174. $updateParams[] = [
  175. 'id' => $store->id,
  176. 'asn_code' => $asnHerder->asnno,
  177. 'warehouse_id' => $warehouse_id,
  178. 'owner_id' => $owner_id,
  179. 'stored_method' => $asnHerder->asnType ? $asnHerder->asnType->codename_c : '',
  180. 'status' => $asnHerder->asnStatus ? $asnHerder->asnStatus->codename_c : '',
  181. 'remark' => $asnHerder->notes,
  182. 'updated_at' => $asnHerder->edittime,
  183. ];
  184. }
  185. }
  186. if (count($updateParams) > 1) $this->batchUpdate($updateParams);
  187. /** @var StoreItemService $storeItemService */
  188. $storeItemService = app(StoreItemService::class);
  189. $storeItemService->storeItemUpdateByWms($asnHerders);
  190. /** @var RejectedBillService $rejectedBillService */
  191. $rejectedBillService = app(RejectedBillService::class);
  192. $rejectedBillService->syncLoadedStatusByAsnHerder($asnHerders);
  193. unset($updateParams, $asnHerders);
  194. }
  195. public function insert($params)
  196. {
  197. return Store::query()->insert($params);
  198. }
  199. public function batchUpdate($params)
  200. {
  201. return app(BatchUpdateService::class)->batchUpdate('stores', $params);
  202. }
  203. public function getByWms($asnHerders)
  204. {
  205. if (!$asnHerders) {
  206. return null;
  207. }
  208. $asn_nos = array_unique(data_get($asnHerders, '*.asnno'));
  209. return Store::query()->whereIn('asn_code', $asn_nos)->get();
  210. }
  211. public function getAsnLastSyncAt($key, $type)
  212. {
  213. $last_time = ValueStore::query()->where('name', $key)->value('value');
  214. if ($last_time) return $last_time;
  215. if ($type == 'create') {
  216. $store = Store::query()->orderByDesc('created_at')->first();
  217. if ($store) return $store->created_at;
  218. } else {
  219. $store = Store::query()->orderByDesc('updated_at')->first();
  220. if ($store) return $store->updated_at;
  221. }
  222. return Carbon::now()->subSeconds(65);
  223. }
  224. public function setAsnLastSyncAt($key,$last_time)
  225. {
  226. $asnLastSyncAt = ValueStore::query()->updateOrCreate([
  227. 'name' => $key,
  228. ], [
  229. 'name' => $key,
  230. 'value' => $last_time,
  231. ]);
  232. LogService::log(__METHOD__, __FUNCTION__, '修改或更新' . $key . json_encode($asnLastSyncAt));
  233. return $asnLastSyncAt;
  234. }
  235. public function getLastRecordsByRedis($set, $prefixKey, $asnHerders)
  236. {
  237. if (Cache::get($set)) {
  238. $addAsnHerders = collect();
  239. foreach ($asnHerders as $asnHerder) {
  240. if (Cache::get($prefixKey . $asnHerder->customerid . '_' . $asnHerder->asnno)) continue;
  241. $addAsnHerders->add($asnHerder);
  242. }
  243. return $addAsnHerders;
  244. }
  245. return $asnHerders;
  246. }
  247. public function deleteCacheKey($set, $keys)
  248. {
  249. if (Cache::get($set)) {
  250. $cacheKeys = Cache::get($keys);
  251. if (!$cacheKeys) return;
  252. foreach ($cacheKeys as $cacheKey) {
  253. Cache::forget($cacheKey);
  254. }
  255. Cache::forget($keys);
  256. }
  257. }
  258. public function setLastRecordsByRedis($prefixKey,$set,$keys,$last_records)
  259. {
  260. if (Cache::get($set)){
  261. $cacheKeys = [];
  262. foreach ($last_records as $last_record) {
  263. Cache::put($prefixKey . $last_record->customerid . '_' . $last_record->asnno, true);
  264. array_push($cacheKeys, $prefixKey . $last_record->customerid . '_' . $last_record->asnno);
  265. }
  266. Cache::put($keys, $cacheKeys);
  267. Cache::put($set, true);
  268. }
  269. }
  270. }