Browse Source

大王椰出入库

cqpCow 1 year ago
parent
commit
61e1ff56e3

+ 11 - 0
app/Http/Controllers/Api/InOutOptionController.php

@@ -26,6 +26,17 @@ class InOutOptionController extends BaseController
         }
     }
 
+    public function setFhMessage(Request $request){
+        $service = new InOutOptionService();
+        list($status,$data) = $service->setFhMessage($request->all(),$request->header('Site'));
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
     public function inout(){
         $i = 'inout_key_state';
         $s = Redis::get($i);

+ 221 - 0
app/Jobs/DoorDeviceJob.php

@@ -0,0 +1,221 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Service\ClearDataService;
+use App\Service\InOutOptionService;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Support\Facades\Redis;
+use Symfony\Component\Console\Output\ConsoleOutput;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class DoorDeviceJob implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    protected $data;
+    protected $type;
+    protected $site;
+    protected $device_id;
+
+    /**
+     * Create a new job instance
+     *
+     * @return void
+     */
+    public function __construct($data,$type,$site,$device_id)
+    {
+        $this->data = $data;
+        $this->type = $type;
+        $this->site = $site ?? '91451322MA5P9JNKXA';
+        $this->device_id = $device_id;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        try{
+            $epc = $this->data;
+            $type = $this->type;//1 入库 2 出库
+            $order_number = [];
+            foreach ($epc as $value){
+                $order_number[] = hex2bin($value); //十六进制字符串转回 原来字符串
+            }
+            file_put_contents('record_door_result.txt',date("Y-m-d H:i:s",time())."原数据:".json_encode($epc) . "解析后:" . json_encode($order_number) .PHP_EOL.'start'.PHP_EOL,8);
+            if(empty($order_number)) return;
+
+            //获取包装单产品
+            $dispatchList = $this->getDispatchList($order_number);
+            if(empty($dispatchList) || empty($dispatchList['data'])) return;
+            $this->completionOrders($dispatchList['data'],$type);
+
+            //输出信息 测试
+            $this->echoMessage(new ConsoleOutput());
+        }catch (\Exception $exception){
+            file_put_contents('record_door_error.txt',date("Y-m-d H:i:s",time()).json_encode($this->data) . PHP_EOL.$exception->getMessage().PHP_EOL,8);
+        }
+    }
+
+    public function getDispatchList($data){
+        if(empty($data)) return [];
+        list($status,$token) = ClearDataService::getTokenCs();
+        if(! $status) return [];
+
+        $site = $this->site;
+        $url = "http://121.36.142.167:7774/jbl/api/module-data/box_orders/box_orders/diy/defective_order_no_list";
+        $post = [
+            'defective_order_no_list' => $data,
+        ];
+        $header = ["Authorization: Bearer {$token}","Content-Type:application/json","Site:{$site}"];
+        $json = str_replace('"workflowSearchBean":[]','"workflowSearchBean":{}',json_encode($post));
+
+        $curl = curl_init();
+        curl_setopt_array($curl, array(
+            CURLOPT_URL => $url,
+            CURLOPT_RETURNTRANSFER => true,
+            CURLOPT_ENCODING => '',
+            CURLOPT_MAXREDIRS => 10,
+            CURLOPT_TIMEOUT => 0,
+            CURLOPT_FOLLOWLOCATION => true,
+            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+            CURLOPT_CUSTOMREQUEST => 'POST',
+            CURLOPT_POSTFIELDS => $json,
+            CURLOPT_HTTPHEADER => $header,
+        ));
+        $response = curl_exec($curl);
+        curl_close($curl);
+
+        file_put_contents('record_door_result.txt',date('Y-m-d H:i:s'). PHP_EOL . $response .PHP_EOL.'getlist'.PHP_EOL,8);
+
+        return json_decode($response,true);
+    }
+
+    public function completionOrders($data,$type){
+        list($status,$token) = ClearDataService::getTokenCs();
+        if(! $status) return;
+
+        $site = $this->site;
+        $device_id = $this->device_id;
+        //组织数据
+        $main_dtl = $orderNo = [];
+        if($type == 1){
+            $opt = InOutOptionService::OrderKeyQueueIn;
+            $url = 'http://121.36.142.167:7774/jbl/api/module-data/production_receipt/production_receipt';
+            $dynamicFormId = "473758926009479168";
+            $showModelId = "473761325902147584";
+            foreach ($data as $value){
+                if(empty($value['box_orders']['delivery_status'])){
+                    $main_dtl[] = [
+                        "product_code"=> $value['brand_code'],
+                        "product_title"=> $value['product_title'],
+                        "product_size"=> $value['product_size'],
+                        "color"=> $value['color'],
+                        "color_two"=> $value['color_two'],
+                        "product_unit_title"=> $value['product_unit_title'],
+                        "product_unit"=> $value['product_unit'],
+                        "color_code"=> $value['color_code'],
+                        "color_code_two"=> $value['color_code_two'],
+                        "in_num"=> $value['box_num'],
+                    ];
+                    if(! in_array($value['box_orders']['defective_order_no'], $orderNo)) $orderNo[] = $value['box_orders']['defective_order_no'];
+                }
+            }
+            $datas = [
+                'production_receipt' => [
+                    'production_receipt_no' => null,
+                    'in_out_type' => 'RK007',
+                    'box_title' => 'WH05001',
+                    'in_time' => gmdate("Y-m-d\TH:i:s.000\Z"),
+                    'status' => "NOT_APPROVED",
+                ],
+                'production_receipt_dtl' => $main_dtl
+            ];
+        }else{
+            $opt = InOutOptionService::OrderKeyQueueOut;
+            $url = 'http://121.36.142.167:7774/jbl/api/module-data/picking_out/picking_out';
+            $dynamicFormId = "473763313217908736";
+            $showModelId = "473771977253269504";
+            foreach ($data as $value){
+                if(empty($value['box_orders']['delivery_status'])){
+                    $main_dtl[] = [
+                        "product_code"=> $value['brand_code'],
+                        "product_title"=> $value['product_title'],
+                        "product_size"=> $value['product_size'],
+                        "color"=> $value['color'],
+                        "color_two"=> $value['color_two'],
+                        "product_unit_title"=> $value['product_unit_title'],
+                        "product_unit"=> $value['product_unit'],
+                        "color_code"=> $value['color_code'],
+                        "color_code_two"=> $value['color_code_two'],
+                        "in_num"=> $value['box_num'],
+                    ];
+                    if(! in_array($value['box_orders']['defective_order_no'], $orderNo)) $orderNo[] = $value['box_orders']['defective_order_no'];
+                }
+            }
+            $datas = [
+                'picking_out' => [
+                    'picking_out_no' => null,
+                    'in_out_type' => 'CK010',
+                    'box_title' => 'WH05001',
+                    'out_time' => gmdate("Y-m-d\TH:i:s.000\Z"),
+                    'status' => "NOT_APPROVED",
+                ],
+                'picking_out_product' => $main_dtl
+            ];
+        }
+
+        if(! empty($main_dtl)){
+            //有产品
+            $post = [
+                "bizTypeEk" => "LOWCODE",
+                "bizId" => -1,
+                "data" => $datas,
+                "dynamicFormId" => $dynamicFormId,
+                "showModelId" => $showModelId
+            ];
+        }
+        //组织数据------
+        file_put_contents('record_door_result.txt',date('Y-m-d H:i:s'). PHP_EOL . json_encode($post) .PHP_EOL.'post'.PHP_EOL,8);
+
+        $header = ["Authorization: Bearer {$token}","Content-Type:application/json","Site:{$site}"];
+
+        $curl = curl_init();
+        curl_setopt_array($curl, array(
+            CURLOPT_URL => $url,
+            CURLOPT_RETURNTRANSFER => true,
+            CURLOPT_ENCODING => '',
+            CURLOPT_MAXREDIRS => 10,
+            CURLOPT_TIMEOUT => 0,
+            CURLOPT_FOLLOWLOCATION => true,
+            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+            CURLOPT_CUSTOMREQUEST => 'POST',
+            CURLOPT_POSTFIELDS => json_encode($post),
+            CURLOPT_HTTPHEADER => $header,
+        ));
+        $response = curl_exec($curl);
+        curl_close($curl);
+
+        $result = json_decode($response,true);
+        if(! empty($result['createdDate'])) {
+            $expire_time = 6;
+            $key = $device_id . $opt;
+            Redis::set($key, json_encode($orderNo));
+            Redis::expire($key, $expire_time);
+        }
+
+        file_put_contents('record_door_result.txt',date('Y-m-d H:i:s'). PHP_EOL . $response .PHP_EOL.'create'.PHP_EOL,8);
+    }
+
+    protected function echoMessage(OutputInterface $output)
+    {
+        $output->writeln($this->data);
+    }
+}

+ 38 - 0
app/Service/ClearDataService.php

@@ -216,4 +216,42 @@ class ClearDataService extends Service
 
         return [true,$token];
     }
+
+    public static function getTokenCs(){
+        $token_key = 'big_king_login_token_cs';
+        $token = Redis::get($token_key);
+        if(! $token){
+            $url = config('ip.cs');
+            $post = array("name" => "admin","password"=>"admin","rememberMe"=>true);
+            $header = ['Content-Type:application/json'];
+            $curl = curl_init();
+            curl_setopt_array($curl, array(
+                CURLOPT_URL => $url . 'jbl/api/mes/login',
+                CURLOPT_RETURNTRANSFER => true,
+                CURLOPT_ENCODING => '',
+                CURLOPT_MAXREDIRS => 10,
+                CURLOPT_TIMEOUT => 0,
+                CURLOPT_FOLLOWLOCATION => true,
+                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+                CURLOPT_CUSTOMREQUEST => 'POST',
+                CURLOPT_POSTFIELDS => json_encode($post),
+                CURLOPT_HTTPHEADER =>  $header,
+            ));
+            $response = curl_exec($curl);
+            curl_close($curl);
+            $result = json_decode($response,true);
+            if(empty($result['token'])) {
+                file_put_contents('big_king_token_error_cs.txt',date('Y-m-d H:i:s'). PHP_EOL . $response .PHP_EOL,8);
+                return [false,''];
+            }else{
+                $token = $result['token'];
+                $expire_time = 1728000; //20天
+                Redis::set($token_key,$token);
+                Redis::expire($token_key, $expire_time);
+                return [true,$token];
+            }
+        }
+
+        return [true,$token];
+    }
 }

+ 83 - 13
app/Service/InOutOptionService.php

@@ -2,35 +2,105 @@
 
 namespace App\Service;
 
+use App\Jobs\DoorDeviceJob;
 use Illuminate\Support\Facades\Redis;
 
 class InOutOptionService extends Service
 {
-    const OrderKeyQueue = 'InOutOrderNumber';
+    const OrderKeyQueueIn = 'InOrderNumber';
+    const OrderKeyQueueOut = 'OutOrderNumber';
+    const Key = 'FHCK';
 
     public function setOrderNumber($data){
         if(! empty($data['data']['tagList'])){
+            $in = $out = [];$site = "";
+            $device_id = $data['data']['id'] ?? 0; //设备id
             foreach ($data['data']['tagList'] as $value){
-                Redis::lpush(self::OrderKeyQueue, json_encode($value));
+                if(empty($site)) $site = $value['remark'] ?? ""; //配置成站点
+                if($value['direction'] == '1'){
+                    //(判断到有发货出库的入库标识 存入缓存)
+                    if(Redis::exists($device_id . self::Key)){
+                        Redis::lpush($device_id . self::Key, json_encode($value));
+                    }else{
+                        //入库 直接生成入库单
+                        if(! in_array($value['epc'],$in)) $in[] = $value['epc'];
+                    }
+                }elseif ($value['direction'] == '2'){
+                    //(判断到有发货出库的出库标识 存入缓存)
+                    if(Redis::exists($device_id)){
+                        Redis::lpush($device_id . self::Key, json_encode($value));
+                    }else{
+                        //出库 直接生成出库单
+                        if(! in_array($value['epc'],$out)) $out[] = $value['epc'];
+                    }
+                }
             }
+            if(! empty($in)) dispatch(new DoorDeviceJob($in,1,$site,$device_id))->onQueue('door_device');
+            if(! empty($out)) dispatch(new DoorDeviceJob($out,2,$site,$device_id))->onQueue('door_device');
         }
     }
 
     public function getOrderNumber($data,$site){
         //获取某个站点的数据
-        $data = [];
         $tmp = [];
-        while ($item = Redis::lpop(self::OrderKeyQueue)) {
-            $order = json_decode($item, true);
-            $order_it = $order['epc'] . $order['direction'];
-            if(! in_array($order_it, $tmp)){
-                $order['epc'] = hex2bin($order['epc']);
-                $order['site'] = $site;
-                $data[] = $order;
-                $tmp[] = $order_it;
+        $result = [];
+
+        //发货出库
+        $key = $data['device_id'] . self::Key;
+        if(Redis::exists(self::Key)) {
+            //发货
+            while ($item = Redis::lpop($key)) {
+                $order = json_decode($item, true);
+                $order_it = $order['epc'] . $order['direction'];
+                if(! in_array($order_it, $tmp)){
+                    $order['epc'] = hex2bin($order['epc']);
+                    $order['site'] = $site;
+                    $result[] = $order;
+                    $tmp[] = $order_it;
+                }
+            }
+
+            return [true, $result];
+        }
+
+        //入库
+        $key = $data['device_id'] . self::OrderKeyQueueIn;
+        $res = Redis::get($key);
+        if(! empty($res)){
+            $return  = json_decode($res,true);
+            foreach ($return as $value){
+                $result[] = [
+                    'epc' => $value,
+                    'direction' => '1',
+                ];
+            }
+            return [true, $result];
+        }
+
+        //发货
+        $key = $data['device_id'] . self::OrderKeyQueueOut;
+        $res = Redis::get($key);
+        if(! empty($res)){
+            $return  = json_decode($res,true);
+            foreach ($return as $value){
+                $result[] = [
+                    'epc' => $value,
+                    'direction' => '2',
+                ];
             }
-        }unset($tmp);
+            return [true, $result];
+        }
 
-        return [true, $data];
+        return [true, $result];
+    }
+
+    //设置为发货出库
+    public function setFhMessage($data,$site){
+        $key = $data['device_id'] . self::Key;
+        if(empty($data['fh'])){
+            if(Redis::exists(self::Key)) Redis::del(self::Key);
+        }else{
+            if (Redis::setnx($key, 1)) Redis::expire($key, 60); //多少秒后过期
+        }
     }
 }

+ 2 - 0
routes/api.php

@@ -25,6 +25,8 @@ Route::any('man_device', 'Api\JobController@processDataJobAddDeviceMan');
 Route::any('setOrderNumber', 'Api\InOutOptionController@setOrderNumber');
 //获取单号
 Route::any('getOrderNumber', 'Api\InOutOptionController@getOrderNumber');
+//设置发货出库标识
+Route::any('setFhMessage', 'Api\InOutOptionController@setFhMessage');
 Route::any('del', 'Api\JobController@delKey');
 Route::any('oee', 'Api\ScreenController@oee');
 Route::any('wyOee', 'Api\ScreenController@wyOee');