weightOrderPackage($request); } public function weightOrderPackage(Request $request) { /** * @var OrderPackage $orderPackage * @var MeasuringMachine $measuringMachine */ // 转化数据 $params = []; foreach ($request->input() as $key => $item) { $params[strtolower($key)] = $item; } // 获取快递单号 $logistic_number = $this->getCode($params); // 获取称重设备 $measuringMachine = $this->getMeasuringMachine($params); // 快递单号对应的OrderPackage $orderPackage = $this->getOrderPackageByCode($logistic_number); if (is_null($orderPackage)) { /** @var OracleDOCOrderHeader $orderHeader */ $orderHeader = $this->findOrderHeaderByLogisticNumber($logistic_number); if(is_null($orderHeader)){ return $this->getNotFindOrderHeaderMessage($params,$orderPackage); } try { $order = $this->createOrderByOrderHeader($orderHeader); $orderPackage = $this->createOrderPackage($params, $measuringMachine, $order); } catch (\Exception $e) { return json_encode(["success"=>false,"message"=>"写入WAS失败!"],JSON_UNESCAPED_UNICODE); } } // 更新包裹信息 $this->updateOrderPackage($orderPackage,$params,$measuringMachine); // 处理波次信息 try { $this->activityWaveNoProcessing($orderPackage); } catch (\Exception $e) { app('LogService')->log(__METHOD__,'HengLi weightApi (Error)'.__FUNCTION__,json_encode($orderPackage).'||'.json_encode($e),null); return $this->getWeithMessage($orderPackage,$e); } $this->afterApply($orderPackage); $response = $this->getSuccessMessage($params,$orderPackage); app('LogService')->log(__METHOD__,__FUNCTION__,"下发写入包裹成功:".json_encode($request->getContent()).'||'.json_encode($response),null); return json_encode($response,JSON_UNESCAPED_UNICODE); } // region ---称重完成之后的操作 // 后续操作 public function afterApply(OrderPackage $orderPackage) { $orderPackage->loadMissing(['order' => function ($query) { $query->with('owner', 'logistic'); }, 'measuringMachine', 'paperBox']); event(new WeighedEvent($orderPackage)); dispatch(new WeightUpdateInstantBill($orderPackage)); } // endregion // region ---消息返回 // 返回称重成功信息 public function getSuccessMessage($params, $orderPackage): array { return ['code' => 'success', 'error' => 'weight success']; } // 返回包裹未找到异常 public function getNotFindOrderPackageMessage($params, $orderPackage): string { return json_encode(['success'=>false,'message'=>'未找打包裹信息',JSON_UNESCAPED_UNICODE]); } // 返回富勒信息未找到异常 public function getNotFindOrderHeaderMessage($params, $orderPackage):string { return json_encode(['success'=>false,'message'=> '富勒信息未找到'],JSON_UNESCAPED_UNICODE); } // 返回称重下发错误 public function getWeithMessage($orderPackage,$e) { return json_encode(['success'=>false,'message'=> $e->getMessage],JSON_UNESCAPED_UNICODE); } // endregion // region ---参数校验 public function validator(Request $request): array { return []; } // endregion // region ---参数获取 // 重量 public function getWeight($params) { return $this->getValue($this->width, $params); } // 高 public function getHeight($params) { return $this->getValue($this->height, $params); } // 长 public function getLength($params) { return $this->getValue($this->length, $params); } // 宽 public function getWidth($params) { return $this->getValue($this->width, $params); } // 快递单号 public function getCode($params) { return $this->getValue($this->code, $params); } // 称重时间 public function getWeightAt($params) { return $this->getValue($this->weight_at, $params); } // 获取参数 public function getValue($name, $param) { $names = explode(',', $name); $value = array_reduce($names, function ($data, $key) { if (isset($data[$key])) $data = $data[$key]; else $data = []; return $data; }, $param); if (is_array($value) && count($value) == 0) return null; return $value; } // 排序参数 public function getEdges($params): array { $length = $this->getLength($params); $height = $this->getHeight($params); $width = $this->getWidth($params); $edges = [$length??0,$width??0,$height??0]; rsort($edges); return $edges; } // endregion // region ---包裹 // 获取包裹 public function getOrderPackageByCode($code) { return OrderPackage::query() ->with(['order' => function ($query) { /** @var Builder $query */ $query->with('owner', 'logistic'); }])->where('logistic_number', $code)->first(); } // 更新包裹 public function updateOrderPackage(OrderPackage $orderPackage,$params,$measuringMachine) { $edges=$this->getEdges($params); $req_date=Carbon::now(); $orderPackage->weight=$params['weight']; $orderPackage->measuring_machine_id=$measuringMachine->id; $orderPackage->length=$edges[0]; $orderPackage->width=$edges[1]; $orderPackage->height=$edges[2]; $orderPackage->weighed_at=$req_date; $orderPackage->bulk=$edges[0]*$edges[1]*$edges[2]/1000; if($orderPackage->isActivityBatch()){ $result=$this->activityWaveNoProcessing($orderPackage); if(!$result)return false; } return $orderPackage->save(); } // 同步wms包裹信息 public function synWmsOrderPackage($code) { } public function createOrderPackage($params,$measuringMachine,$order) { $weighed_at = Carbon::now(); $edges=$this->getEdges($params); OrderPackage::query()->create([ 'order_id'=>$order->id, 'logistic_number'=>$this->getCode($params), 'measuring_machine_id'=>$measuringMachine->id, 'weight'=>$this->getWeight($params), 'length'=>$edges[0], 'width'=>$edges[1], 'height'=>$edges[2], 'bulk'=>$edges[0]*$edges[1]*$edges[2], 'weighed_at'=>$weighed_at, 'status'=>"无", ]); return $this->getOrderPackageByCode($this->getCode($params)); } // endregion // region ---称重设备 // 获取称重设备 public function getMeasuringMachine($params): MeasuringMachine { $hid = $this->getValue($this->hid, $params); /** @var MeasuringMachine $measuringMachine */ $measuringMachine = MeasuringMachine::query()->firstOrCreate(['code' => $hid]); // 称重设备 $measuringMachine->turnOn(); $measuringMachine->turnOffInMinutes(30); return $measuringMachine; } // endregion // region ---wms操作 // 获取orderHeader public function findOrderHeaderByLogisticNumber($code) { $query = OracleActAllocationDetails::query()->select('order_no')->where('picktotraceid',$code); return OracleDOCOrderHeader::query()->with('actAllocationDetails', 'oracleBASCode')->whereIn('Order_No',$query)->first(); } // 根据WMS订单信息创建订单信息 public function createOrderByOrderHeader($orderHeader) { /** @var OrderService $orderService */ $orderService = app('OrderService'); $order_create_params = $orderService->getParamByOrderHeader($orderHeader); $order = $orderService->first(['code' => $orderHeader->orderno]); if ($order) return $order; $order = $orderService->createOrder($order_create_params); app('LogService')->log(__METHOD__, __FUNCTION__, 'GoodScan 创建Order', json_encode($order) . " || " . $orderHeader); return $order; } public function activityWaveNoProcessing(&$orderPackage): array //处理活动波次 { $fluxController = new \App\Http\Controllers\api\thirdPart\flux\PackageController(); if($orderPackage->isActivityBatch()){ app('LogService')->log(__METHOD__,__FUNCTION__,"HengLi 依波次号同步所有包裹:".json_encode($orderPackage),null); OrderPackage::query()->where('batch_number',$orderPackage['batch_number'])->update([ 'weight'=>$orderPackage['weight'] ?? null, 'length'=>$orderPackage['length'] ?? null, 'width'=>$orderPackage['width'] ?? null, 'height'=>$orderPackage['height'] ?? null, 'bulk'=>$orderPackage['bulk'] ?? null, 'measuring_machine_id'=>$orderPackage['measuring_machine_id'] ?? null, 'weighed_at'=>$orderPackage['weighed_at'] ?? null, 'paper_box_id'=>$orderPackage['paper_box_id'] ?? null, ]); $result=$fluxController->markWMSOnBatch($orderPackage['batch_number'], $orderPackage['weight']); if(!$result['result']){ $orderPackage->uploaded_to_wms="异常"; } }else{ app('LogService')->log(__METHOD__,__FUNCTION__,"HengLi 写入包裹至WMS:".json_encode($orderPackage),null); try{ $result=$fluxController->accomplishToWMS($orderPackage); if ($result['result'] == 'false') $orderPackage->uploaded_to_wms="是"; else $orderPackage->uploaded_to_wms="异常"; }catch (\Exception $e){ $orderPackage->uploaded_to_wms="否"; } } return $orderPackage->save(); } // endregion }