| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- <?php
- namespace App\Services;
- use App\OracleActAllocationDetails;
- use App\OracleDOCOrderDetail;
- use App\OracleDOCOrderHeader;
- use App\Order;
- use App\OrderPackage;
- use App\OrderPackageCommodities;
- use App\OrderTracking;
- use App\Services\common\BatchUpdateService;
- use App\Services\common\DataHandlerService;
- use Carbon\Carbon;
- use App\Traits\ServiceAppAop;
- class OrderPackageService
- {
- use ServiceAppAop;
- protected $modelClass=OrderPackage::class;
- public function batchUpdate(array $params){
- return app(BatchUpdateService::class)->batchUpdate('order_packages',$params);
- }
- public function insert(array $params)
- {
- return OrderPackage::query()->insert($params);
- }
- /**
- * @param string $logistic_number
- * @param array $values
- * @return OrderPackage $package
- */
- public function firstOrCreate($logistic_number, array $values){
- /** @var $package OrderPackage */
- $package = OrderPackage::query()->where('logistic_number',$logistic_number)->first();
- if ($package)return $package;
- /** @var OrderService */
- $order = app('OrderService')->logisticNumberFirstOrCreateOrder($logistic_number);
- if ($order) $values["order_id"] = $order->id;
- $values["logistic_number"] = $logistic_number;
- /** @var OrderPackage $package */
- $package = OrderPackage::query()->create($values);
- return $package;
- }
- public function createExceptionPaginate($paginate)
- {
- return OrderPackage::query()->select('id', 'status', 'logistic_number', 'measuring_machine_id', 'weighed_at', 'weight', 'length', 'width', 'height', 'bulk', 'paper_box_id')
- ->where('status', '上传异常')->orWhere('status', '测量异常')->orderBy('created_at', 'DESC')
- ->paginate($paginate);
- }
- public function issueExceptionPaginate($paginate)
- {
- return OrderPackage::query()->select('id', 'logistic_number', 'created_at', 'batch_number', 'batch_rule')
- ->where('status', '下发异常')->orWhere('status', '记录异常')
- ->orWhere('status', '已上传异常')->orderBy('created_at', 'DESC')
- ->paginate($paginate);
- }
- public function getByWmsOrders($orderHeaders){
- $order_nos = data_get($orderHeaders,'*.orderno');
- return OrderPackage::query()->with('order')
- ->whereIn('order_id',function($query) use ($order_nos){
- $query->from('orders')->select('id')->whereIn('code',$order_nos);
- })->get();
- }
- public function create(array $params)
- {
- if(count($params) == 0)return null;
- try {
- $this->insert($params);
- app('LogService')->log(__METHOD__,__FUNCTION__,'批量生成 orderPackage' . count($params) . json_encode($params));
- } catch (\Exception $e) {
- app('LogService')->log(__METHOD__,__FUNCTION__,'批量生成 orderPackage error ' . json_encode($params) . $e->getMessage() . $e->getTraceAsString());
- } finally {
- $logistic_numbers = data_get($params,'*.logistic_number');
- unset($params);
- return OrderPackage::query()->whereIn('logistic_number',$logistic_numbers)->get();
- }
- }
- public function getByOrderNos($orderNos)
- {
- return OrderPackage::query()->with('order')
- ->whereIn('order_id',function($query)use($orderNos){
- $query->from('orders')->select('id')->whereIn('code',$orderNos);
- })->get();
- }
- public function update($orderClientNo,$logisticNumber)
- {
- $order = Order::query()->with('packages.commodities.commodity')->where('client_code',$orderClientNo)->first();
- if(!$order){
- $order = Order::query()->create(['client_code'=>$orderClientNo]);
- }
- $orderPackage = OrderPackage::query()->where('logistic_number',$logisticNumber)->first();
- if($orderPackage){return compact('orderPackage','order');}
- $orderPackage = OrderPackage::query()->create(['order_id'=>$order->id,'logistic_number'=>$logisticNumber]);
- return compact('orderPackage','order');
- }
- public function syncOrderPackage(&$orderHeaders)
- {
- $this->syncPackageByOrderHeaders($orderHeaders);
- }
- public function syncPackageByOrderHeaders(&$orderHeaders)
- {
- /** @var OrderService $orderService */
- $orderService = app('OrderService');
- if(!$orderHeaders)return;
- $orders = $orderService->getByWmsOrders($orderHeaders);
- $packages = $this->getByOrderNos(data_get($orderHeaders,'*.orderno')); // 已有
- $this->createOrderPackage($orderHeaders,$orders,$packages); // 创建package
- $this->updatePackage($orderHeaders,$packages);
- $this->deleteUnnecessaryPackage($orderHeaders,$packages); // 删除package
- unset($orders,$packages); // 手动清除
- }
- public function createOrderPackage($orderHeaders,$orders,$packages)
- {
- if(!$orderHeaders)return;
- /**
- * @var DataHandlerService $dataHandlerService
- */
- $dataHandlerService = app(DataHandlerService::class);
- $orderHeaders_map = $dataHandlerService->dataHeader(['orderno'],$orderHeaders);
- $packages_maps = $dataHandlerService->dataHeader(['logistic_number'],$packages);
- $inner_params = [];
- foreach ($orders as $order){
- $orderHeader = $dataHandlerService->getKeyValue(['orderno'=>$order->code],$orderHeaders_map);
- if(!$orderHeader)continue;
- if($orderHeader->sotatus == 90)continue;
- $params = $this->getInnerParams($orderHeader,$order,$packages_maps);
- $inner_params = array_merge($inner_params,$params);
- }
- if(count($inner_params)>0){
- try {
- $inner_array = array_chunk($inner_params,5000);
- foreach ($inner_array as $params) {
- $bool = $this->insert($params);
- $bool ? LogService::log(__METHOD__, __FUNCTION__, '批量添加 OrderPackage ' . count($inner_params) . ' || ' . json_encode($inner_params)) : null;
- }
- } catch (\Exception $e) {
- LogService::log(__METHOD__, __FUNCTION__, '批量添加 OrderPackage error ' . count($inner_params) . ' || ' .json_encode($e->getMessage()). json_encode($inner_params).json_encode($e->getTraceAsString()));
- }
- }
- }
- public function getInnerParams($orderHeader,$order,$packages_maps)
- {
- /**
- * @var DataHandlerService $dataHandlerService
- */
- $dataHandlerService = app('DataHandlerService');
- $logistic_numbers = array_diff(array_unique(data_get($orderHeader->actAllocationDetails,'*.picktotraceid')),['','*']);
- $inner_params = [];
- $date = Carbon::now()->format('Y-m-d H:i:s');
- $sentAtMap = [];
- foreach ($orderHeader->actAllocationDetails as $item){
- $sentAtMap[$item->picktotraceid] = $item;
- }
- foreach ($logistic_numbers as $logistic_number){
- $package = $dataHandlerService->getKeyValue(['logistic_number'=>$logistic_number],$packages_maps);
- if(isset($package))continue;
- try {
- $data = $sentAtMap[$logistic_number];
- } catch (\Exception $e) {
- $data = null;
- }
- $inner_params[] = [
- 'order_id' => $order->id,
- 'logistic_number' => $logistic_number,
- 'created_at' => $date,
- 'updated_at' => $date,
- 'status' => '无',
- 'owner_id' => $order->owner_id,
- 'sent_at' => $data ? $data->checktime:null,
- ];
- }
- return $inner_params;
- }
- public function deleteUnnecessaryPackage($orderHeaders,$packages)
- {
- /**
- * @var DataHandlerService $dataHandlerService
- * @var OrderTrackingService $orderTrackingService
- * @var OrderPackageCommoditiesService $orderPackageCommoditiesService
- */
- $dataHandlerService = app(DataHandlerService::class);
- $orderPackageCommoditiesService = app('OrderPackageCommoditiesService');
- $logistic_numbers = data_get($orderHeaders,'*.actAllocationDetails.*.picktotraceid'); // 获取picktotraceid (运单的快递单号)
- $logistic_numbers = array_unique($logistic_numbers);
- $logistic_numbers = array_diff($logistic_numbers,['',' ','*']);
- $packages_maps = $dataHandlerService->dataHeader(['logistic_number'],$packages);
- $exits_number = data_get($packages,'*.logistic_number');
- $packages = [];
- $diff_number = array_diff($exits_number,$logistic_numbers);
- foreach ($diff_number as $number) {
- $package = $dataHandlerService->getKeyValue(['logistic_number'=>$number],$packages_maps);
- if($package ?? false)$packages[]=$package->id;
- }
- if(count($packages)==0)return $packages;
- try {
- $bool = OrderPackage::query()->whereIn('id', $packages)->delete();
- $orderPackageCommodities = OrderPackageCommodities::query()->whereIn('order_package_id',$packages)->get();
- $orderPackageCommoditiesService->deleteOrderCommodities($orderPackageCommodities);
- $bool ? LogService::log(__METHOD__,__FUNCTION__,'删除多余包裹 ids:'.json_encode($packages)) : null;
- } catch (\Exception $e) {
- LogService::log(__METHOD__,__FUNCTION__,'删除多余包裹 ids:'.json_encode($packages).$e->getMessage());
- }
- }
- private function updatePackage($orderHeaders, $packages)
- {
- $map = $this->getSentAtMap($orderHeaders);
- $update_params = [];
- $update_params[] = ['id','sent_at'];
- foreach ($packages as $package) {
- if ($package->sent_at) continue;
- try {
- $data = $map[$package->logistic_number];
- } catch (\Exception $e) {
- continue;
- }
- $update_params[] = [
- 'id'=>$package->id,
- 'sent_at' => $data->checktime,
- ];
- }
- $this->batchUpdate($update_params);
- }
- /**
- * @param $orderHeaders
- * @return array
- */
- private function getSentAtMap($orderHeaders): array
- {
- $map = [];
- foreach ($orderHeaders as $orderHeader) {
- $actAllocationDetails = $orderHeader->actAllocationDetails;
- foreach ($actAllocationDetails as $actAllocationDetail) {
- $logistic_number = $actAllocationDetail->picktotraceid;
- $map[$logistic_number] = $actAllocationDetail;
- }
- }
- return $map;
- }
- }
|