cqpCow 2 jaren geleden
bovenliggende
commit
d74db192ae

+ 1 - 1
app/Http/Controllers/Api/FyyOrderController.php

@@ -32,7 +32,7 @@ class FyyOrderController extends BaseController
     {
         $service = new FyyOrderService();
         $userData = $request->userData->toArray();
-        list($status,$data) = $service->fyySaveOutOrder($request->all());
+        list($status,$data) = $service->fyySaveOutOrder($request->all(),$userData);
 
         if($status){
             return $this->json_return(200,'',$data);

+ 36 - 5
app/Jobs/ProcessDataJob.php

@@ -2,9 +2,11 @@
 
 namespace App\Jobs;
 
+use App\Model\Box;
 use App\Model\DispatchSub;
 use App\Model\ErrorTable;
 use App\Service\FinishedOrderService;
+use App\Service\FyyOrderService;
 use Illuminate\Bus\Queueable;
 use Illuminate\Contracts\Queue\ShouldQueue;
 use Illuminate\Foundation\Bus\Dispatchable;
@@ -20,21 +22,26 @@ class ProcessDataJob implements ShouldQueue
 {
     use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
 
-    const job_one = 'finished_operation';
-    const job_two = '';
+    //队列名称
+    const job_one = 'finished_operation';//完工
+    const job_two = 'box_operation';//包装
 
     protected $data;
     protected $user;
     protected $type;
 
-    //1 代表产成品入库  2 销售出库单
+    //1 代表产成品入库  2 销售出库单  3 代表产成品入库手机端  4 销售出库单
     protected $function = [
         1 => 'U8Rdrecord10Save',
-        2 => 'U8Rdrecord32Save'
+        2 => 'U8Rdrecord32Save',
+        3 => 'U8Rdrecord10SaveMobile'
     ];
 
+    //数据回退 标记了的单据数据状态改为0
     protected $function_reback = [
         1 => 'reBackOne',
+        2 => 'reBackTwo',
+        3 => 'reBackOne',
     ];
 
     protected $jobs = [
@@ -60,7 +67,9 @@ class ProcessDataJob implements ShouldQueue
         $this->type = $type;
     }
 
-    /**                file_put_contents('charge.txt',"标记位置退出".PHP_EOL,8);
+    /**
+     *
+     * file_put_contents('charge.txt',"标记位置退出".PHP_EOL,8);
      * Execute the job.
      *
      * @return void
@@ -97,6 +106,15 @@ class ProcessDataJob implements ShouldQueue
         return [$status,$msg];
     }
 
+    //产成品入库手机端
+    private function U8Rdrecord10SaveMobile(){
+        $service = new FinishedOrderService();
+        //标记
+        list($status,$msg) = $service->addMobileInJob($this->data['result'],$this->data['data'],$this->data['quantity_count']);
+        return [$status,$msg];
+    }
+
+    //产成品入库 相关数据回退
     private function reBackOne(){
         //数据回退
         $data = $this->data['data'];
@@ -109,7 +127,20 @@ class ProcessDataJob implements ShouldQueue
 
     //销售单出库
     private function U8Rdrecord32Save(){
+        $service = new FyyOrderService();
+        list($status,$msg) = $service->addInJob($this->data['result'],$this->data['data']);
+        return [$status,$msg];
+    }
 
+    //销售单出库 相关数据回退
+    private function reBackTwo(){
+        //数据回退
+        $data = $this->data['data'];
+
+        //进入队列的数据
+        Box::where('order_no',$data['order_no'])->update([
+            'state' => 0,
+        ]);
     }
 
     private function errorSettle($msg){

+ 2 - 1
app/Service/DispatchService.php

@@ -456,10 +456,11 @@ class DispatchService extends Service
     public function dispatchMobileOrderList($data){
         $model = DispatchSub::where('del_time',0)
             ->select('id','product_title','product_no','dispatch_quantity','finished_num','dispatch_no')
-            ->where('process_id',$data['process_id'])
             ->whereRaw('dispatch_quantity > finished_num')
             ->orderBy('id','desc');
 
+        if(! empty($data['process_id'])) $model->where('process_id',$data['process_id']);
+        if(! empty($data['order_number'])) $model->where('dispatch_no',$data['dispatch_no']);
         $list = $model->get()->toArray();
         $list = $this->fillDispatchMobileOrderList($list);
 

+ 69 - 39
app/Service/FinishedOrderService.php

@@ -109,6 +109,7 @@ class FinishedOrderService extends Service
             //用友数据插入结束----------
 
             //本地数据更新
+            DB::beginTransaction();
             $waste = [];
             foreach ($data['waste'] as $key => $value){
                 $waste[$key] = array_sum(array_column($value,'num'));
@@ -167,7 +168,9 @@ class FinishedOrderService extends Service
 
             //反写数量
             $this->writeFinishedQuantity(array_column($result,'sale_orders_product_id'));
+            DB::commit();
         }catch (\Exception $e){
+            DB::rollBack();
             return [false,$e->getFile() . $e->getLine(). $e->getMessage()];
         }
 
@@ -373,29 +376,76 @@ class FinishedOrderService extends Service
         list($status,$msg,$count_arr) = $this->orderMobileRule($data);
         if(!$status) return [$status,$msg];
 
-        try{
-            DB::beginTransaction();
+        $user = [
+            'id' => $user['id'],
+            'operate_time' => time()
+        ];
+        $redis = [
+            'result' => $msg,
+            'data' => $data,
+            'quantity_count' => $count_arr,
+        ];
+        $job = dispatch(new ProcessDataJob($redis,$user,3))->onQueue(ProcessDataJob::job_one);
+        if(! $job) return [false,'任务没有进入队列!'];
 
-            //生产数据的源数据
-            $result = $msg;
-            $time = time();
+        //错误计数
+        Redis::hSet('order_failures', md5(json_encode($redis)), 0);
 
-            date_default_timezone_set("PRC");
+        //标记进入队列的数据
+        DispatchSub::whereIn('id',array_column($msg,'id'))->update([
+            'job_status' => 1,
+        ]);
 
+        return [true,'任务已进入队列!'];
+    }
+
+    public function addMobileInJob($result, $data, $count_arr){
+        try{
+            //用友数据写入------------
+            date_default_timezone_set("PRC");
             $insert_sql_server = [];
             foreach ($result as $key => $value){
                 $quantity_tmp = $count_arr[$value['id']];
                 $result[$key]['quantity'] = $quantity_tmp;
 
-                $finished_num = $quantity_tmp + $value['finished_num'];
+                $process_model = new OrdersProductProcess(['channel' => date("Ymd",$value['out_order_no_time'])]);
+                $process_id = $process_model->select('process_id')
+                    ->where('sort',$process_model->where('del_time',0)
+                        ->where('order_product_id',$value['order_product_id'])
+                        ->max('sort'))
+                    ->first();
+
+                if(empty($process_id)) return [false,"未找到最后一道工序"];
+
+                $process_id = $process_id->process_id;
+                if($process_id == $value['process_id']){
+                    $insert_sql_server[] = $result[$key];
+                }
+            }
+
+            if(! empty($insert_sql_server)){
+                $sqlServerModel = new FyySqlServerService();
+                if($sqlServerModel->error) return [false,$sqlServerModel->error];
+                foreach ($insert_sql_server as $value){
+                    list($status,$msg) = $sqlServerModel->U8Rdrecord10Save($value);
+                    if(! $status) return [false,$msg];
+                }
+            }
+            //用友数据写入结束------------
+
+            //本地数据写入-----------
+            DB::beginTransaction();
+
+            $time = time();
+            foreach ($result as $key => $value){
+                $finished_num = $value['quantity'] + $value['finished_num'];
                 DispatchSub::where('id',$value['id'])
                     ->update([
                         'finished_num' => $finished_num,
                     ]);
 
-                //工序表
+                //工序
                 $process_model = new OrdersProductProcess(['channel' => date("Ymd",$value['out_order_no_time'])]);
-
                 foreach ($data as $d){
                     if($d['id'] == $value['id']){
                         $process_model->where('order_product_id',$value['order_product_id'])
@@ -411,48 +461,28 @@ class FinishedOrderService extends Service
                             ]);
                     }
                 }
-
-                $process_id = $process_model->select('process_id')
-                    ->where('sort',$process_model->where('del_time',0)
-                        ->where('order_product_id',$value['order_product_id'])
-                        ->max('sort'))
-                    ->first();
-
-                if(empty($process_id)){
-                    DB::rollBack();
-                    return [false,"未找到最后一道工序"];
-                }
-                $process_id = $process_id->process_id;
-                if($process_id == $value['process_id']){
-                    $insert_sql_server[] = $result[$key];
-                }
             }
 
             //反写数量
             $this->writeFinishedQuantity(array_column($result,'sale_orders_product_id'));
 
-            if(! empty($insert_sql_server)){
-                foreach ($insert_sql_server as $value){
-                    list($status,$msg) = $this->insertSqlServer($value);
-                    if(! $status) {
-                        DB::rollBack();
-                        return [false,$msg];
-                    }
-                }
-            }
-
             DB::commit();
+            //本地数据写入结束-----------
         }catch (\Exception $e){
             DB::rollBack();
-            return [false,$e->getLine().':'.$e->getMessage()];
+            return [false,$e->getFile() . $e->getLine() . $e->getMessage()];
         }
 
-        return [true,'保存成功!'];
+        return [true,''];
     }
 
     public function orderMobileRule($data){
         if(empty($data)) return [false,'数据不能为空!',''];
 
+        $dispatch_id = array_unique(array_column($data,'id'));
+        $bool = DispatchSub::whereIn('id',$dispatch_id)->where('job_status',1)->exists();
+        if($bool) return [false,'正在队列中,请不要重复操作!'];
+
         $post = [];
         foreach ($data as $value){
             if(empty($value['quantity'])) return [false,'数量必须填写!',''];
@@ -464,8 +494,8 @@ class FinishedOrderService extends Service
             }
         }
 
-        $result = DispatchSub::whereIn('id',array_unique(array_column($data,'id')))
-            ->select('id','finished_num','dispatch_quantity','out_order_no_time','process_id','dispatch_no','order_product_id','sale_orders_product_id','order_no','product_no','product_title','price')
+        $result = DispatchSub::whereIn('id',$dispatch_id)
+            ->select('id','finished_num','dispatch_quantity','out_order_no_time','process_id','dispatch_no','order_product_id','sale_orders_product_id','order_no','product_no','product_title','price','customer_name')
             ->orderBy('id','desc')
             ->get()->toArray();
 
@@ -473,6 +503,6 @@ class FinishedOrderService extends Service
             if(($post[$value['id']] + $value['finished_num']) > $value['dispatch_quantity']) return [false,"{$value['dispatch_no']}单号的完工数量不能大于派工数量",''];
         }
 
-        return [true, $result,$post];
+        return [true, $result, $post];
     }
 }

+ 72 - 6
app/Service/FyyOrderService.php

@@ -2,10 +2,14 @@
 
 namespace App\Service;
 
+use App\Jobs\ProcessDataJob;
+use App\Model\Box;
+use App\Model\BoxDetail;
 use App\Model\Orders;
 use App\Model\SaleOrdersProduct;
 use App\Model\SaleOrdersProductStockDetail;
 use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Redis;
 
 class FyyOrderService extends Service
 {
@@ -200,14 +204,76 @@ class FyyOrderService extends Service
         return [true,''];
     }
 
-    public function fyySaveOutOrder($data){
-        if(empty($data['order_number'])) return [false,'包装单号不能为空!'];
+    public function fyySaveOutOrder($data,$user){
+        list($status,$msg) = $this->orderOutRule($data);
+        if(! $status) return [false,$msg];
+
+        $user = [
+            'id' => $user['id'],
+            'operate_time' => time()
+        ];
+        $redis = [
+            'result' => $msg,
+            'data' => $data,
+        ];
+        $job = dispatch(new ProcessDataJob($redis,$user,2))->onQueue(ProcessDataJob::job_two);
+        if(! $job)  return [false,'任务没有进入队列!'];
+
+        //错误计数
+        Redis::hSet('order_failures', md5(json_encode($redis)), 0);
+
+        //标记进入队列的数据
+        Box::where('order_no',$data['order_no'])->update([
+            'state' => 1,
+        ]);
 
-        //销售出库单生成
-        $sqlServerModel = new FyySqlServerService();
-        list($status,$return) = $sqlServerModel->U8Rdrecord32Save($data);
-        if(! $status) return [false, $return];
+        return [true,'任务已进入队列!'];
+    }
+
+    public function addInJob($result,$data){
+        try{
+            $sqlServerModel = new FyySqlServerService();
+            if($sqlServerModel->error) return [false,$sqlServerModel->error];
+
+            list($status,$msg) = $sqlServerModel->U8Rdrecord32Save($result);
+            if(! $status) return [false,$msg];
+
+            //更新
+            Box::where('order_no',$data['order_no'])->update([
+                'state' => 2,
+            ]);
+        }catch (\Exception $e){
+            return [false,$e->getFile() . $e->getLine(). $e->getMessage()];
+        }
 
         return [true,''];
     }
+
+    public function orderOutRule($data){
+        if(empty($data['order_no'])) return [false,'包装单号不能为空!'];
+
+        $box = Box::where('order_no',$data['order_no'])->where('del_time',0)->first();
+        if(! $box) return [false,'包装单不存在或已经被删除!'];
+        $box = $box->toArray();
+        if($box['state'] == 1) return [false,'包装单正在出库队列中!'];
+        if($box['state'] > 1) return [false, '包装单已出库!'];
+
+        $box_detail = new BoxDetail(['channel'=>$box['order_no']]);
+        $box_detail_list = $box_detail->where('order_no',$data['order_no'])
+            ->where('del_time',0)
+            ->select('order_no','out_order_no','top_id as sale_orders_product_id','ext_1 as customer_no','ext_2 as customer_name','ext_3 as product_no','num')
+            ->get()->toArray();
+        if(! empty($box_detail_list)){
+            $saleOrder = SaleOrdersProduct::whereIn('id',array_column($box_detail_list,'sale_orders_product_id'))
+                ->select('id','technology_name','wood_name')
+                ->get()->toArray();
+            $saleOrderMap = array_column($saleOrder,null,'id');
+            foreach ($box_detail_list as $key => $value){
+                $box_detail_list[$key]['technology_name'] = $saleOrderMap[$value['sale_orders_product_id']]['technology_name'];
+                $box_detail_list[$key]['wood_name'] = $saleOrderMap[$value['sale_orders_product_id']]['wood_name'];
+            }
+        }
+
+        return [true, $box_detail_list];
+    }
 }

+ 99 - 14
app/Service/FyySqlServerService.php

@@ -361,12 +361,9 @@ class FyySqlServerService extends Service
         if(! empty($this->error)) return [false,$this->error];
         date_default_timezone_set("PRC");
 
-        //获取包装单内数据
-        $box = $this->getBoxData($data);
-        if(empty($box)) return [false,'包装单不能为空!'];
-
-        //获取发货单的数据
-        $return = $this->getDataFromDispatchList(array_column($box,'cSOCode'));
+        //通过销售订单号 获取发货单的数据
+        $out_order_no = array_unique(array_column($data,'out_order_no'));
+        $return = $this->getDataFromDispatchList($out_order_no);
         if(empty($return)) return [false,'没有找到发货单!'];
 
         //组织发货单的数据
@@ -376,19 +373,17 @@ class FyySqlServerService extends Service
         }
 
         $detail = [];
-        foreach ($box as $value){
-            if(! isset($map[$value['cSOCode']])) {
-                return [false,'包装单内销售订单号:' . $value['cSOCode'] .'没有找到发货单!'];
-            }
+        foreach ($data as $value){
+            if(! isset($map[$value['out_order_no']])) return [false,'包装单的销售订单号:' . $value['out_order_no'] .'没有找到发货单!'];
             $is_flag = 0;
-            foreach ($map[$value['cSOCode']] as $m){
-                if($value['cinvcode'] == $m['cinvcode'] && $value['cfree1'] == $m['cfree1'] && $value['cfree2'] == $m['cfree2']) {
+            foreach ($map[$value['out_order_no']] as $m){
+                if($value['product_no'] == $m['cinvcode'] && $value['technology_name'] == $m['cfree1'] && $value['wood_name'] == $m['cfree2']) {
                     $is_flag = 1;
-                    $m['iquantity'] = $value['iquantity'];
+                    $m['iquantity'] = $value['num'];
                     $detail[$m['cSOCode']][] = $m;
                 }
             }
-            if(! $is_flag) return [false,'包装单内销售订单号:' . $value['cSOCode'] .'产品:' . $value['cinvcode'] . $value['cfree1'] . $value['cfree2'] . '在发货单中不存在!'];
+            if(! $is_flag) return [false,'包装单的产品:' . $value['product_no'] . $value['technology_name'] . $value['wood_name'] . '在发货单中不存在!'];
         }
 
         foreach ($detail as $value){
@@ -438,12 +433,101 @@ class FyySqlServerService extends Service
             ];
 
             $return = $this->post_helper($this->url,json_encode($post_tmp), ['Content-Type:application/json']);
+
+            if(empty($return))  return [false, '异常错误,请确认请求接口地址!'];
             if(! $return['flag']) return [false,$return['msg']];
         }
 
         return [true,''];
     }
 
+//    public function U8Rdrecord32Save($data,$bredvouch = 0){
+//        if(! empty($this->error)) return [false,$this->error];
+//        date_default_timezone_set("PRC");
+//
+//        //获取包装单内数据
+//        $box = $this->getBoxData($data);
+//        if(empty($box)) return [false,'包装单不能为空!'];
+//
+//        //获取发货单的数据
+//        $return = $this->getDataFromDispatchList(array_column($box,'cSOCode'));
+//        if(empty($return)) return [false,'没有找到发货单!'];
+//
+//        //组织发货单的数据
+//        $map = [];
+//        foreach ($return as $value){
+//            $map[$value['cSOCode']][] = $value;
+//        }
+//
+//        $detail = [];
+//        foreach ($box as $value){
+//            if(! isset($map[$value['cSOCode']])) {
+//                return [false,'包装单内销售订单号:' . $value['cSOCode'] .'没有找到发货单!'];
+//            }
+//            $is_flag = 0;
+//            foreach ($map[$value['cSOCode']] as $m){
+//                if($value['cinvcode'] == $m['cinvcode'] && $value['cfree1'] == $m['cfree1'] && $value['cfree2'] == $m['cfree2']) {
+//                    $is_flag = 1;
+//                    $m['iquantity'] = $value['iquantity'];
+//                    $detail[$m['cSOCode']][] = $m;
+//                }
+//            }
+//            if(! $is_flag) return [false,'包装单内销售订单号:' . $value['cSOCode'] .'产品:' . $value['cinvcode'] . $value['cfree1'] . $value['cfree2'] . '在发货单中不存在!'];
+//        }
+//
+//        foreach ($detail as $value){
+//            $main_tmp = $value[0];
+//            foreach ($value as $val){
+//                $bodys_tmp[] = [
+//                    "idlsid"=>$val['idlsid'],
+//                    "cdlcode"=>"",
+//                    "dlrowno"=>"",
+//                    "cbdlcode"=>"",
+//                    "cinvcode"=>$val['cinvcode'],
+//                    "cposition"=>$val['cposition'],
+//                    "cbatch"=>$val['cbatch'],
+//                    "iquantity"=>$val['iquantity'],
+//                    "inum"=>$val['iquantity'],
+//                    "iinvexchrate"=>$value['iinvexchrate'],
+//                    "iunitcost"=>"",
+//                    "iprice"=>"",
+//                    "cbmemo"=>"",
+//                ];
+//            }
+//            $post_tmp = [
+//                "password"=>"cloud@123456",
+//                "entity"=>"U8Rdrecord32Save",
+//                "login"=>[
+//                    "sAccID"=> $this->sAccID,
+//                    "sDate"=> date("Y-m-d"),
+//                    "sServer"=> '127.0.0.1',
+//                    "sUserID"=> $this->sUserID,
+//                    "sSerial"=> "",
+//                    "sPassword"=> $this->sPassword
+//                ],
+//                "data"=>[
+//                    "ccode"=>'',
+//                    "ddate"=>date("Y-m-d"),
+//                    "cmaker"=>$this->sUserID,
+//                    "dnmaketime"=> date("Y-m-d"),
+//                    "IsExamine"=>true,
+//                    "bredvouch"=> $bredvouch,
+//                    "cwhcode"=>"02",
+//                    "cdepcode"=>"06",
+//                    "crdcode"=>"102",
+//                    "cmemo"=> '',
+//                    "cdefine10" => $main_tmp['customer_name'], //客户名称
+//                    "bodys"=>$bodys_tmp
+//                ]
+//            ];
+//
+//            $return = $this->post_helper($this->url,json_encode($post_tmp), ['Content-Type:application/json']);
+//            if(! $return['flag']) return [false,$return['msg']];
+//        }
+//
+//        return [true,''];
+//    }
+
     public function getBoxData($data){
         $boxData = BoxDetail::from('box_detail as a')
             ->leftJoin('sale_orders_product as b','b.id','a.top_id')
@@ -454,6 +538,7 @@ class FyySqlServerService extends Service
         return $boxData;
     }
 
+    //获取发货单数据
     public function getDataFromDispatchList($order_number){
         $message = $this->db->table('DispatchList as a')
             ->leftJoin('DispatchLists as b','b.DLID','a.DLID')