ajun 5 vuotta sitten
vanhempi
commit
2399ebf16e

+ 21 - 0
app/Http/Controllers/TestController.php

@@ -1648,4 +1648,25 @@ where (commodities.owner_id,commodity_barcodes.code) in (select commodities.owne
         $syncOrderHeader = $service->getQuery()->where('editTime',">=",$edit_date)->whereNotIn("SOStatus",["90","99"])->get();
         $orderService->syncOrder($syncOrderHeader);
     }
+
+    public function testHeader()
+    {
+        $datas = [
+            'a' => [
+                'a' => 1,
+                'b' => 2,
+                'c' => 3,
+            ],
+        ];
+        $keys = 'a.1';
+        $arr = explode('.',$keys);
+        $value =  array_reduce($arr,function($data,$key){
+            if(isset($data[$key]))$data = $data[$key];
+            else $data = [];
+            return $data;
+        },$datas);
+        if(is_array($value))dump(11);
+        dump($value);
+
+    }
 }

+ 318 - 0
app/Http/Controllers/api/thirdPart/weight/WeightBaseController.php

@@ -0,0 +1,318 @@
+<?php
+
+
+namespace App\Http\Controllers\api\thirdPart\weight;
+
+
+use App\Events\WeighedEvent;
+use App\Jobs\WeightUpdateInstantBill;
+use App\MeasuringMachine;
+use App\OracleActAllocationDetails;
+use App\OracleDOCOrderHeader;
+use App\OrderPackage;
+use App\Services\OrderService;
+use Carbon\Carbon;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Http\Request;
+
+class WeightBaseController
+{
+
+    protected $weight = '';     // 重量
+    protected $length = '';     // 长
+    protected $width = '';      // 宽
+    protected $height = '';     // 高
+    protected $code = '';       // 快递单号
+    protected $weight_at = '';  // 称重时间
+    protected $hid = '';        // 称重设备id
+
+    public function new(Request $request)
+    {
+        $this->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
+}