Quellcode durchsuchen

异方称重 称重上传

ajun vor 5 Jahren
Ursprung
Commit
cbb616dbaa

+ 284 - 0
app/Http/Controllers/api/thirdPart/goodscan/PackageController.php

@@ -0,0 +1,284 @@
+<?php
+
+
+namespace App\Http\Controllers\api\thirdPart\goodscan;
+
+use App\Events\WeighedEvent;
+use App\Http\Controllers\LogisticNumberFeatureController;
+use App\MeasuringMachine;
+use App\OracleDOCOrderHeader;
+use App\Order;
+use App\OrderPackage;
+use App\Services\LogService;
+use App\Services\OrderService;
+use App\Waybill;
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Validator;
+
+class PackageController
+{
+    public function new_(Request $request)
+    {
+        $requestInput = [];
+        foreach ($request->input() as $key=>$item) {
+            $requestInput[strtolower($key)] = $item;
+        }
+
+        $errors = $this->validatorWeight($requestInput)->errors(); // 参数校验
+        if($requestInput['weight'] === -9.9){   // 称重异常校验
+            LogService::log(__METHOD__,'GoodScan weightApi (Error)'.__FUNCTION__,'异方接口称重伤上传异常[异常值为-9.9,电子秤故障或未连接]');
+            return json_encode(['code'=>500,'error'=>'weight=-9.9']);
+        }
+        if(count($errors) > 0){
+            LogService::log(__METHOD__,'error'.__FUNCTION__,json_encode($request).'||'.json_encode($errors),null);
+            return json_encode(['code'=>500,'error'=>$errors]);
+        }
+
+        /**
+         * @var MeasuringMachine $measuringMachine
+         * @var OrderPackage $orderPackage
+         * @var OracleDOCOrderHeader $orderHeader
+         * @var Order $order
+         */
+
+        $measuringMachine = $this->getMeasuringMachine($requestInput['hid']); // 返回设备并启动
+        $orderPackage=$this->getOrderPackageByLogisticNumber($requestInput['code']); // 查询WAS是否有对应的包裹信息
+        if($orderPackage){
+            $request = $this->updateOrderPackage($orderPackage,$requestInput,$measuringMachine); // 更新包裹信息
+            if($request){
+                return json_encode($request);
+            }
+        }else{
+            try {
+                $orderHeader = $this->findOrderHeaderByLogisticNumber($requestInput['code']);// 查询WMS是否有对应的包裹信息
+                if (!$orderHeader) {
+                    return json_encode(['code' => 500, 'error' => '保存时发生错误(未在WMS中找到订单)!'], JSON_UNESCAPED_UNICODE);
+                }
+                $order = $this->createOrderByOrderHeader($orderHeader);
+                $orderPackage = $this->getOrderPackage($requestInput, $measuringMachine, $order);// 返回包裹对象
+                $this->syncOrderPackageLogistic($orderPackage);// 同步包裹订单的承运商
+            } catch (\Exception $e) {
+                LogService::log(__METHOD__,__FUNCTION__,'GoodScan weightApi (Error)'.json_encode($request).'||'.json_encode($orderPackage),null);
+                return json_encode(["code"=>500,"error"=>"写入WMS失败!"],JSON_UNESCAPED_UNICODE);
+            }
+        }
+        if(!empty($orderPackage->order)){
+            Waybill::setWeightByOrderCode($orderPackage->order->code,$orderPackage->weight);
+        }
+//            event(new WeighedEvent($orderPackage));
+        $response=["code"=>0,'error'=>'upload success'];
+        LogService::log(__METHOD__,__FUNCTION__,"下发写入包裹成功:".json_encode($request).'||'.json_encode($response),null);
+        return json_encode($response,JSON_UNESCAPED_UNICODE);
+    }
+
+    /**
+     * @param string $hid
+     * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model
+     */
+    public function getMeasuringMachine($hid)
+    {
+        /** @var MeasuringMachine $measuringMachine */
+        $measuringMachine = MeasuringMachine::query()->firstOrCreate(['code'=>$hid]); // 称重设备
+        $measuringMachine->turnOn();
+        $measuringMachine->turnOffInMinutes(30);
+        return $measuringMachine;
+    }
+
+    public function validatorWeight(array $request)
+    {
+        return Validator::make($request, [
+            'code' => ['required', 'max:191'],
+            'l' => ['required', 'numeric', 'min:0'],
+            'w' => ['required', 'numeric', 'min:0'],
+            'h' => ['required', 'numeric', 'min:0'],
+            'weight' => ['required', 'numeric', 'min:0'],
+            'hid' => ['required', 'string', 'min:0'],
+            'picture' => ['required', 'string', 'min:0'],
+        ], [
+            'required' => ':attribute 为必填项',
+            'max' => ':attribute 字符过多或数值过大',
+            'min' => ':attribute 不得为负',
+            'numeric' => ':attribute 应为数字',
+            'string' => ':attribute 应为字符串',
+        ], []);
+    }
+
+    /**
+     * @param OrderPackage $orderPackage
+     * @param array $params
+     * @param MeasuringMachine $measuringMachine
+     * @return array
+     */
+    public function updateOrderPackage(&$orderPackage,$params,$measuringMachine) //更新包裹信息 前往处理活动波次
+    {
+        $edges=$this->getEdges($params);
+        $req_date=$params['time']??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()){
+            $response=$this->activityWaveNoProcessing($orderPackage);
+            if($response)return $response;
+        }
+        $orderPackage->save();
+        return[];
+    }
+
+    /**
+     * @param OrderPackage $orderPackage
+     * @return array
+     */
+    public function activityWaveNoProcessing(&$orderPackage) //处理活动波次
+    {
+//        $fluxController = new \App\Http\Controllers\Api\thirdPart\flux\PackageController();
+        if($orderPackage->isActivityBatch()){
+            LogService::log(__METHOD__,__FUNCTION__,"依波次号同步所有包裹:".json_encode($orderPackage),null);
+            $params = [
+                '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,
+            ];
+            OrderPackage::query()->where('batch_number',$orderPackage['batch_number'])->update($params);
+//            $result=$fluxController->markWMSOnBatch($orderPackage['batch_number'], $orderPackage['weight']);
+//            if(!$result['result']){
+//                $orderPackage->status="上传异常";
+//            }
+        }else{
+            LogService::log(__METHOD__,__FUNCTION__,"GoodScan 写入包裹至WMS:".json_encode($orderPackage),null);
+//            try{
+//                $result=$fluxController->accomplishToWMS($orderPackage);
+//                if ($result['result'])
+//                    $orderPackage->status="已上传";
+//                else
+//                    $orderPackage->status="上传异常";
+//            }catch (\Exception $e){
+//                $orderPackage->status="未上传";
+//            }
+        }
+        $response=$this->saveOrderPackage($orderPackage);
+        return $response??[];
+    }
+
+    /**
+     * @param OrderPackage $orderPackage
+     * @return array
+     */
+    public function saveOrderPackage(&$orderPackage) //保存修改并
+    {
+        try {
+            $logisticNumberController = new LogisticNumberFeatureController();
+            if (!$orderPackage->order) {
+                $orderPackage->order = new Order();
+            }
+            if (!$orderPackage->order->logistic) {
+                $orderPackage->order->logistic = $logisticNumberController->getLogisticByFeatures($orderPackage->logistic_number);
+            }
+            $orderPackage->save();
+            return [];
+        } catch (\Exception $e) {
+            $response=["msg"=>'称重下发修改时发生错误!',json_encode($e),'code'=>500,'data'=>null];
+            LogService::log(__METHOD__,'GoodScan weightApi (Error)'.__FUNCTION__,json_encode($orderPackage).'||'.json_encode($e),null);
+            return $response;
+        }
+    }
+
+    /**
+     * @param string $logisticNumber
+     * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model|object|null
+     */
+    public function getOrderPackageByLogisticNumber($logisticNumber)
+    {
+        return OrderPackage::query()
+            ->with(['order'=>function($query){
+                $query->with('owner','logistic');
+            }])
+            ->where('logistic_number',$logisticNumber)
+            ->first();
+    }
+
+    /**
+     * @param string $logisticNumber
+     * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model|object|null
+     */
+    public function findOrderHeaderByLogisticNumber($logisticNumber)
+    {
+        return OracleDOCOrderHeader::query()->with('actAllocationDetails','oracleBASCode')
+            ->whereHas('actAllocationDetails',function($query)use($logisticNumber){
+                $query->where('picktotraceid',$logisticNumber);
+            })->orWhere('soreference5',$logisticNumber)->first();
+    }
+
+    /**
+     * @param OracleDOCOrderHeader $orderHeader
+     * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model
+     */
+    public function createOrderByOrderHeader($orderHeader)
+    {
+        /** @var OrderService $orderService */
+        $orderService=app(OrderService::class);
+        $order_create_params=$orderService->getParamByOrderHeader($orderHeader);
+        return Order::query()->create($order_create_params);
+    }
+
+    /**
+     * @param array $requestInput
+     * @param MeasuringMachine $measuringMachine
+     * @param Order $order
+     * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model|object|null
+     */
+    public function getOrderPackage($requestInput,$measuringMachine,$order)
+    {
+        $weighed_at =$requestInput['time']??Carbon::now();
+        $edges=$this->getEdges($requestInput);
+        OrderPackage::query()->create([
+            'order_id'=>$order->id,
+            'logistic_number'=>$requestInput['code'],
+            'measuring_machine_id'=>$measuringMachine->id,
+            'weight'=>$requestInput['weight'],
+            'length'=>$edges[0],
+            'width'=>$edges[1],
+            'height'=>$edges[2],
+            'bulk'=>$edges[0]*$edges[1]*$edges[2],
+            'weighed_at'=>$weighed_at,
+            'status'=>"无",
+        ]);
+        return $this->getOrderPackageByLogisticNumber($requestInput['code']);
+    }
+
+    /**
+     * @param array $requestInput
+     * @return array
+     */
+    public function getEdges($requestInput)
+    {
+        $edges = [$requestInput['l']??0,$requestInput['w']??0,$requestInput['h']??0];
+        rsort($edges);
+        return $edges;
+    }
+
+    /**
+     * @param $orderPackage
+     */
+    public function syncOrderPackageLogistic(&$orderPackage) // 同步订单承运商
+    {
+        $logisticNumberController = new LogisticNumberFeatureController();
+        if (!$orderPackage->order) {
+            $orderPackage->order = new Order();
+        }
+        if (!$orderPackage->order->logistic) {
+            $orderPackage->order->logistic = $logisticNumberController->getLogisticByFeatures($orderPackage->logistic_number);
+        }
+        $orderPackage->save();
+    }
+
+}

+ 2 - 2
app/Http/Controllers/api/thirdPart/weight/PackageController.php

@@ -283,8 +283,8 @@ class PackageController extends Controller
                 return json_encode($response,JSON_UNESCAPED_UNICODE);
             }
         }
-        if(!empty($package->order_id))
-            Waybill::setWeightByOrderCode($package->order_code,$package->weight);
+        if(!empty($package->order))
+            Waybill::setWeightByOrderCode($package->order->code,$package->weight);
             event(new WeighedEvent($package));
             $response=["msg"=>"保存成功",
                 "code"=>200,

+ 0 - 2
app/MeasuringMachine.php

@@ -2,8 +2,6 @@
 
 namespace App;
 
-use App\Events\WeighedEvent;
-use App\Http\Controllers\Controller;
 use App\Jobs\MeasuringMachineQueue;
 use Illuminate\Database\Eloquent\Model;
 use App\Traits\ModelTimeFormat;

+ 1 - 1
app/Order.php

@@ -13,7 +13,7 @@ class Order extends Model
     protected $fillable = [
         'created_at', 'code', 'shop_id', 'owner_id', 'client_code',
         'logistic_id', 'consignee_name', 'consignee_phone', 'province',
-        'city', 'district', 'address', 'wms_status','warehouse_id'];
+        'city', 'district', 'address', 'wms_status','warehouse_id','wms_edittime'];
 
     /*
      * wms订单号             code=>DOC_ORDER_HEADER[orderno]

+ 1 - 0
app/OrderIssue.php

@@ -23,6 +23,7 @@ class OrderIssue extends Model
      * final_status
      * situation_explain
      * custom_code  自定义订单号 客户客服自定义
+     * imported_status 导入处理
      */
     protected $appends = [
 //        'secondLogisticNumber',

+ 1 - 0
app/OrderPackage.php

@@ -23,6 +23,7 @@ class OrderPackage extends Model
     public function order(){
         return $this->belongsTo('App\Order','order_id','id');
     }
+
     public function commodities(){
         return $this->hasMany('App\OrderPackageCommodities','order_package_id','id');
     }

+ 4 - 0
app/Providers/RouteServiceProvider.php

@@ -90,5 +90,9 @@ class RouteServiceProvider extends ServiceProvider
         Route::prefix('api/thirdPart/haiq')
             ->namespace('App\Http\Controllers\api\thirdPart\haiq')
             ->group(base_path('routes/api/thirdPart/haiq.php'));
+
+        Route::prefix('api/thirdPart/goodscan')
+            ->namespace('App\Http\Controllers\api\thirdPart\goodscan')
+            ->group(base_path('routes/api/thirdPart/goodscan.php'));
     }
 }

+ 2 - 11
app/Services/OrderService.php

@@ -675,16 +675,6 @@ class OrderService
         });
     }
 
-    public function getOrderInfoByCodes($orderNos)
-    {
-        return Order::query()->with('packages.commodities.commodity')->whereIn('code',$orderNos)->get();
-    }
-
-    public function getOrderInfoByWmsOrder($orderHeaders)
-    {
-        return $this->getOrderInfoByCodes(data_get($orderHeaders,'*.orderno'));
-    }
-
     public function getParamByOrderHeader($orderHeader)
     {
         $logistic = Logistic::query()->where('code',$orderHeader->userdefine1)->first();
@@ -705,7 +695,8 @@ class OrderService
             'client_code' =>$orderHeader->soreference1,
             'wms_edittime' => $orderHeader->edittime,
             'wms_status' => $orderHeader->oracleBASCode_codename_c ?? '',
-            'update_at' => Carbon::now()->format('Y-m-d H:i:s'),
+            'updated_at' => (string)Carbon::now()->format('Y-m-d H:i:s'),
+            'created_at' => $orderHeader->addtime,
             'warehouse_id' => $warehouse->id ?? ''
         ];
     }

+ 11 - 0
routes/api/thirdPart/goodscan.php

@@ -0,0 +1,11 @@
+<?php
+
+use App\Http\Controllers\api\thirdPart\goodscan\PackageController;
+use Illuminate\Support\Facades\Route;
+
+/*
+地址前缀:/api/thirdPart/goodscan
+*/
+Route::group(['prefix'=>'weight'],function(){
+    Route::POST('new', "PackageController@new_");//称重上传
+});

+ 14 - 0
tests/webApi/thirdPart/goodscan/PackageController.http

@@ -0,0 +1,14 @@
+# For a quick start check out our HTTP Requests collection (Tools|HTTP Client|Open HTTP Requests Collection).
+##
+## Following HTTP Request Live Templates are available:
+## * 'gtrp' and 'gtr' create a GET request with or without query parameters;
+## * 'ptr' and 'ptrp' create a POST request with a simple or parameter-like body;
+## * 'mptr' and 'fptr' create a POST request to submit a form with a text or file field (multipart/form-data);
+POST http://bswas/api/thirdPart/goodscan/weight/new
+Content-Type: application/json
+
+{"code":"201013000459","l":"50","w":"50","h":"50","weight":"9.9","hid":"2C7FACD3AFC3FFE547FC54CDA076A25D","time":"2020-10-26 14:17:07","picture": "1123213232132132"}
+###
+
+
+