StoreService.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  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'])->where('is_fast_stored', '无')->orderBy('id', 'DESC');
  15. $columnQueryRules = [
  16. 'asn_code' => ['like' => ''],
  17. 'remark' => ['like' => ''],
  18. 'created_at_start' => ['alias' => 'created_at', 'startDate' => ' 00:00:00'],
  19. 'created_at_end' => ['alias' => 'created_at', 'endDate' => ' 23:59:59'],
  20. 'owner_id' => ['multi' => ','],
  21. 'warehouse_id' => ['multi' => ','],
  22. 'status' => ['multi' => ','],
  23. 'stored_method' => ['multi' => ','],
  24. 'id' => ['multi' => ',']
  25. ];
  26. $stores = app(QueryService::class)->query($params, $stores, $columnQueryRules, 'stores');
  27. return $stores;
  28. }
  29. public function paginate(array $params)
  30. {
  31. return $this->conditionQuery($params)->paginate($params['paginate'] ?? 50);
  32. }
  33. public function create(array $params)
  34. {
  35. return Store::query()->create($params);
  36. }
  37. public function storeCreateByWms()
  38. {
  39. $created_at = config('sync.asn_sync.created_at');
  40. $create_set = config('sync.asn_sync.cache_prefix.create_set');
  41. $create_keys = config('sync.asn_sync.cache_prefix.create_keys');
  42. $create_key = config('sync.asn_sync.cache_prefix.create');
  43. /** @var OracleDocAsnHerderService $oracleDocAsnHerderService */
  44. $oracleDocAsnHerderService = app(OracleDocAsnHerderService::class);
  45. $last_time = $this->getAsnLastSyncAt($created_at, 'create');
  46. $asnHerders = $oracleDocAsnHerderService->getWmsAsnOnStartDateCreate($last_time);
  47. if (count($asnHerders)<1) return;
  48. $last_time = $asnHerders->first()['addtime'];
  49. $last_records = $asnHerders->where('addtime', $last_time);
  50. $this->createStore($asnHerders);
  51. $this->deleteCacheKey($create_set, $create_keys);
  52. $this->setLastRecordsByRedis($create_key, $create_set, $create_keys, $last_records);
  53. $this->setAsnLastSyncAt($created_at, $last_time);
  54. }
  55. public function storeUpdateByWms()
  56. {
  57. $updated_at = config('sync.asn_sync.updated_at');
  58. $update_set = config('sync.asn_sync.cache_prefix.update_set');
  59. $update_keys = config('sync.asn_sync.cache_prefix.update_keys');
  60. $update_key = config('sync.asn_sync.cache_prefix.update');
  61. /** @var OracleDocAsnHerderService $oracleDocAsnHerderService */
  62. $oracleDocAsnHerderService = app(OracleDocAsnHerderService::class);
  63. $last_time = $this->getAsnLastSyncAt($updated_at, 'update');
  64. $asnHerders = $oracleDocAsnHerderService->getWmsAsnOnStartDateEdit($last_time);
  65. if (count($asnHerders)<1) return;
  66. $last_time = $asnHerders->first()['edittime'];
  67. $last_records = $asnHerders->where('edittime', $last_time);
  68. $this->createStore($asnHerders);
  69. $this->updateStore($asnHerders);
  70. $this->deleteCacheKey($update_set, $update_keys);
  71. $this->setLastRecordsByRedis($update_key, $update_set, $update_keys, $last_records);
  72. $this->setAsnLastSyncAt($updated_at, $last_time);
  73. }
  74. public function createStore($asnHerders)
  75. {
  76. if (!$asnHerders) return null;
  77. /**
  78. * @var OwnerService $ownerService
  79. * @var WarehouseService $wareHouseService
  80. */
  81. $ownerService = app(OwnerService::class);
  82. $wareHouseService = app(WarehouseService::class);
  83. $owner_codes = [];
  84. $warehouse_codes = [];
  85. foreach ($asnHerders as $asnHerder) {
  86. if (!empty($asnHerder['customerid']))
  87. $owner_codes[$asnHerder['customerid']] = $asnHerder['customerid'];
  88. if (!empty($asnHerder['warehouseid']))
  89. $warehouse_codes[$asnHerder['warehouseid']] = $asnHerder['warehouseid'];
  90. }
  91. $owners = $ownerService->getOwnerByCodes($owner_codes);
  92. $warehouses = $wareHouseService->getWareHouseByCodes($warehouse_codes);
  93. $owners_code_map=[];
  94. foreach ($owners as $owner) {
  95. $owners_code_map[$owner->code] = $owner;
  96. }
  97. $warehouses_code_map=[];
  98. foreach ($warehouses as $warehouse) {
  99. $warehouses_code_map[$warehouse->code] = $warehouse;
  100. }
  101. $params = $this->getParamsByAsnHeader($asnHerders, $owners_code_map, $warehouses_code_map);
  102. if (count($params) > 0) $this->insertStore($params);
  103. /** @var StoreItemService $storeItemService */
  104. $storeItemService = app(StoreItemService::class);
  105. $storeItemService->storeItemCreateByWms($asnHerders);
  106. /** @var RejectedBillService $rejectedBillService */
  107. $rejectedBillService = app(RejectedBillService::class);
  108. $rejectedBillService->syncLoadedStatusByAsnHerder($asnHerders);
  109. unset($asnHerders, $owners_code_map, $warehouses_code_map);
  110. }
  111. public function getParamsByAsnHeader($asnHerders, $owners_code_map, $warehouses_code_map)
  112. {
  113. $params = [];
  114. $stores = Store::query()->whereIn('asn_code', data_get($asnHerders, '*.asnno'))->get();
  115. $store_asn_code_map = [];
  116. foreach ($stores as $store) {
  117. $store_asn_code_map[$store->asn_code] = $store;
  118. }
  119. foreach ($asnHerders as $asnHerder) {
  120. if ($store_asn_code_map[$asnHerder->asnno] ?? false) continue;
  121. $owner = $owners_code_map[$asnHerder->customerid] ?? null;
  122. $warehouse = $warehouses_code_map[$asnHerder->warehouseid] ?? null;
  123. $status = null;
  124. if ($asnHerder->asnStatus && $asnHerder->asnStatus->codename_c == '完全收货') $status = '已入库';
  125. if ($asnHerder->asnStatus && $asnHerder->asnStatus->codename_c == '订单创建') $status = '未入库';
  126. $params[] = [
  127. 'asn_code' => $asnHerder->asnno,
  128. 'warehouse_id' => $warehouse->id ?? null,
  129. 'owner_id' => $owner->id ?? null,
  130. 'stored_method' => $asnHerder->asnType ? $asnHerder->asnType->codename_c : '',
  131. 'status' => $status ? $status : $asnHerder->asnStatus->codename_c,
  132. 'remark' => $asnHerder->notes ?? null,
  133. 'created_at' => $asnHerder->addtime ?? null,
  134. 'updated_at' => $asnHerder->edittime ?? null,
  135. ];
  136. }
  137. return $params;
  138. }
  139. public function insertStore(array $params)
  140. {
  141. if (count($params) === 0) return;
  142. foreach (array_chunk($params, 1000) as $item) {
  143. try {
  144. $bool = $this->insert($item);
  145. if ($bool) {
  146. app('LogService')->log(__METHOD__, __FUNCTION__, "批量创建 store success " . count($item) . ' || ' . json_encode($item));
  147. } else app('LogService')->log(__METHOD__, __FUNCTION__, "批量添加 store FAILED " . ' || ' . json_encode($item));
  148. } catch (\Exception $e) {
  149. app('LogService')->log(__METHOD__, __FUNCTION__, "批量添加 store ERROR " . ' || ' . json_encode($params) . ' || ' . json_encode($e->getMessage()) . ' || ' . json_encode($e->getTraceAsString()));
  150. }
  151. }
  152. }
  153. public function updateStore($asnHerders)
  154. {
  155. if (!$asnHerders || $asnHerders->count() == 0) return null;
  156. /**
  157. * @var DataHandlerService $dataHandlerService
  158. * @var OwnerService $ownerService
  159. * @var WarehouseService $wareHouseService
  160. */
  161. $ownerService = app(OwnerService::class);
  162. $wareHouseService = app(WarehouseService::class);
  163. $dataHandlerService = app(DataHandlerService::class);
  164. $stores = $this->getByWms($asnHerders);
  165. $store_asn_code_map = $dataHandlerService->dataHeader(['asn_code'], $stores);
  166. $owners = $ownerService->getOwnerByCodes(array_unique(data_get($asnHerders,'*.customerid')));
  167. $warehouses = $wareHouseService->getWareHouseByCodes(array_unique(data_get($asnHerders,'*.warehouseid')));
  168. $owner_code_map = $dataHandlerService->dataHeader(['code'], $owners);
  169. $warehouses_map = $dataHandlerService->dataHeader(['code'], $warehouses);
  170. $updateParams = [[
  171. 'id', 'asn_code', 'warehouse_id', 'owner_id', 'stored_method', 'status', 'remark', 'updated_at'
  172. ]];
  173. foreach ($asnHerders as $asnHerder) {
  174. $store = $dataHandlerService->getKeyValue(['asn_code' => $asnHerder->asnno], $store_asn_code_map);
  175. if (!$store) continue;
  176. $owner = $dataHandlerService->getKeyValue(['code' => $asnHerder->customerid], $owner_code_map);
  177. $warehouse = $dataHandlerService->getKeyValue(['code' => $asnHerder->warehouseid], $warehouses_map);
  178. $owner_id = $owner->id ?? null;
  179. $warehouse_id = $warehouse->id ?? null;
  180. $status = null;
  181. if ($asnHerder->asnStatus && $asnHerder->asnStatus->codename_c == '完全收货') $status = '已入库';
  182. if ($asnHerder->asnStatus && $asnHerder->asnStatus->codename_c == '订单创建') $status = '未入库';
  183. if ($store->asn_code != $asnHerder->asnno ||
  184. $store->warehouse_id != $warehouse_id ||
  185. $store->owner_id != $owner_id ||
  186. $store->stored_method != ($asnHerder->asnType->codename_c ??'')||
  187. $store->status != ($asnHerder->asnStatus->codename_c ?? '')||
  188. $store->remark != $asnHerder->notes ||
  189. $store->updated_at != $asnHerder->edittime) {
  190. $updateParams[] = [
  191. 'id' => $store->id,
  192. 'asn_code' => $asnHerder->asnno,
  193. 'warehouse_id' => $warehouse_id,
  194. 'owner_id' => $owner_id,
  195. 'stored_method' => $asnHerder->asnType ? $asnHerder->asnType->codename_c : '',
  196. 'status' => $status ? $status : $asnHerder->asnStatus->codename_c,
  197. 'remark' => $asnHerder->notes,
  198. 'updated_at' => $asnHerder->edittime,
  199. ];
  200. }
  201. }
  202. if (count($updateParams) > 1) {
  203. foreach (array_chunk($updateParams, 1000) as $item) {
  204. try {
  205. $bool=$this->batchUpdate($item);
  206. if ($bool) {
  207. app('LogService')->log(__METHOD__, __FUNCTION__, "批量修改 store success " . count($item) . ' || ' . json_encode($item));
  208. } else app('LogService')->log(__METHOD__, __FUNCTION__, "批量修改 store FAILED " . ' || ' . json_encode($item));
  209. } catch (\Exception $e) {
  210. app('LogService')->log(__METHOD__, __FUNCTION__, "批量修改 store ERROR " . ' || ' . json_encode($updateParams) . ' || ' . json_encode($e->getMessage()) . ' || ' . json_encode($e->getTraceAsString()));
  211. }
  212. }
  213. }
  214. /** @var StoreItemService $storeItemService */
  215. $storeItemService = app(StoreItemService::class);
  216. $storeItemService->storeItemUpdateByWms($asnHerders);
  217. /** @var RejectedBillService $rejectedBillService */
  218. $rejectedBillService = app(RejectedBillService::class);
  219. $rejectedBillService->syncLoadedStatusByAsnHerder($asnHerders);
  220. unset($updateParams, $asnHerders);
  221. }
  222. public function insert($params)
  223. {
  224. return Store::query()->insert($params);
  225. }
  226. public function batchUpdate($params)
  227. {
  228. return app(BatchUpdateService::class)->batchUpdate('stores', $params);
  229. }
  230. public function getByWms($asnHerders)
  231. {
  232. if (!$asnHerders) {
  233. return null;
  234. }
  235. $asn_nos = array_unique(data_get($asnHerders, '*.asnno'));
  236. return Store::query()->whereIn('asn_code', $asn_nos)->get();
  237. }
  238. public function getAsnLastSyncAt($key, $type)
  239. {
  240. $last_time = ValueStore::query()->where('name', $key)->value('value');
  241. if ($last_time) return $last_time;
  242. if ($type == 'create') {
  243. $store = Store::query()->orderByDesc('created_at')->first();
  244. if ($store) return $store->created_at;
  245. } else {
  246. $store = Store::query()->orderByDesc('updated_at')->first();
  247. if ($store) return $store->updated_at;
  248. }
  249. return Carbon::now()->subSeconds(65);
  250. }
  251. public function setAsnLastSyncAt($key, $last_time)
  252. {
  253. $asnLastSyncAt = ValueStore::query()->updateOrCreate([
  254. 'name' => $key,
  255. ], [
  256. 'name' => $key,
  257. 'value' => $last_time,
  258. ]);
  259. LogService::log(__METHOD__, __FUNCTION__, '修改或更新' . $key . json_encode($asnLastSyncAt));
  260. return $asnLastSyncAt;
  261. }
  262. public function deleteCacheKey($set, $keys)
  263. {
  264. if (Cache::get($set)) {
  265. $cacheKeys = Cache::get($keys);
  266. if (!$cacheKeys) return;
  267. foreach ($cacheKeys as $cacheKey) {
  268. Cache::forget($cacheKey);
  269. }
  270. Cache::forget($keys);
  271. }
  272. }
  273. public function setLastRecordsByRedis($prefixKey, $set, $keys, $last_records)
  274. {
  275. $cacheKeys = [];
  276. foreach ($last_records as $last_record) {
  277. Cache::put($prefixKey . $last_record->customerid . '_' . $last_record->asnno, true);
  278. array_push($cacheKeys, $prefixKey . $last_record->customerid . '_' . $last_record->asnno);
  279. }
  280. Cache::put($keys, $cacheKeys);
  281. Cache::put($set, true);
  282. }
  283. public function createInstantBill(Store $store): bool
  284. {
  285. if (!$store || $store->status != "已入库") return false;
  286. $store->loadMissing("storeItems");
  287. /** @var OwnerPriceOperationService $service */
  288. $service = app("OwnerPriceOperationService");
  289. $mapping = ["packages" => "storeItems", "商品名称" => "name", "订单类型" => "stored_method"];
  290. $work_fee = $service->matchRule($store, $mapping, $store->owner_id, "入库");
  291. if ($work_fee < 0) $work_fee = null;
  292. if (app("OwnerFeeDetailService")->create([
  293. "owner_id" => $store->owner_id,
  294. "worked_at" => $store->created_at,
  295. "type" => "收货",
  296. "operation_bill" => $store->asn_code,
  297. "commodity_amount" => array_sum(array_column($store->storeItems->toArray(), "amount")),
  298. "work_fee" => $work_fee,
  299. "created_at" => date('Y-m-d H:i:s'),
  300. "outer_id" => $store->id,
  301. "outer_table_name" => "stores",
  302. ])) return true;
  303. return false;
  304. }
  305. }