cqpCow 1 year ago
parent
commit
47ac14507d
2 changed files with 113 additions and 23 deletions
  1. 6 0
      app/Model/ReturnExchangeOrder.php
  2. 107 23
      app/Service/ReturnExchangeOrderService.php

+ 6 - 0
app/Model/ReturnExchangeOrder.php

@@ -14,6 +14,12 @@ class ReturnExchangeOrder extends Model
     const UPDATED_AT = 'upd_time';
     protected $dateFormat = 'U';
 
+    const Order_type = 0; //合同
+    const Order_type2 = 1; // 采购单
+    public static $order_type_name = [
+        self::Order_type => '合同',
+        self::Order_type2 => '采购单',
+    ];
     const Model_type_one = 1; // 退货单
     const Model_type_two = 2; // 换货单
     public static $model_type = [

+ 107 - 23
app/Service/ReturnExchangeOrderService.php

@@ -5,6 +5,8 @@ namespace App\Service;
 use App\Model\BasicType;
 use App\Model\Depart;
 use App\Model\Employee;
+use App\Model\PurchaseOrder;
+use App\Model\PurchaseOrderInfo;
 use App\Model\ReturnExchangeOrder;
 use App\Model\ReturnExchangeOrderProductInfo;
 use App\Model\ReturnExchangeOrderRange;
@@ -22,7 +24,8 @@ class ReturnExchangeOrderService extends Service
         try{
             DB::beginTransaction();
             $material_model = ReturnExchangeOrder::where('order_number',$data['order_number'])->first();
-            $material_model->sales_order_id = $data['sales_order_id'];
+            $material_model->data_id = $data['data_id'];
+            $material_model->type = $data['type'];
             $material_model->difference_amount = $data['difference_amount'];
             $material_model->mark = $data['mark'];
             $material_model->storehouse_id = $data['storehouse_id'] ?? 0;
@@ -125,7 +128,8 @@ class ReturnExchangeOrderService extends Service
             $material_model = new ReturnExchangeOrder();
             $material_model->model_type = $data['model_type'];
             $material_model->order_number = $data['order_number'];
-            $material_model->sales_order_id = $data['sales_order_id'];
+            $material_model->data_id = $data['data_id'];
+            $material_model->type = $data['type'];
             $material_model->difference_amount = $data['difference_amount'];
             $material_model->mark = $data['mark'];
             $material_model->depart_id = $data['depart_id'] ?? 0;
@@ -220,13 +224,19 @@ class ReturnExchangeOrderService extends Service
 
         $order = ReturnExchangeOrder::where('id',$data['id'])
             ->where('del_time',0)
-            ->select('id','order_number','model_type','sales_order_id','difference_amount','crt_id','mark','state','crt_time','storehouse_id','depart_id','top_depart_id')
+            ->select('id','order_number','model_type','data_id','difference_amount','crt_id','mark','state','crt_time','storehouse_id','depart_id','top_depart_id','type')
             ->first();
         if(empty($order)) return [false, '退换货订单不存在或已被删除'];
         $order = $order->toArray();
         $order['storehouse_title'] = Storehouse::where('id',$order['storehouse_id'])->value('title');
-        $sales = SalesOrder::where('id',$order['sales_order_id'])->value('order_number');
-        $order['sales_order_number'] = $sales;
+        if($data['type'] == ReturnExchangeOrder::Order_type){
+            $sales = SalesOrder::where('id',$order['data_id'])->value('order_number');
+            $order['data_title'] = $sales;
+        }elseif($data['type'] == ReturnExchangeOrder::Order_type2){
+            $sales = PurchaseOrder::where('id',$order['data_id'])->value('order_number');
+            $order['data_title'] = $sales;
+        }
+
         $order['model_type_title'] = ReturnExchangeOrder::$model_type_name[$order['model_type']] ?? "";
         $order['state_title'] = ReturnExchangeOrder::$state[$order['state']] ?? '';
 
@@ -317,7 +327,7 @@ class ReturnExchangeOrderService extends Service
     public function getList($data,$user){
         $model = new ReturnExchangeOrder(['userData' => $user,'search' => $data]);
         $model = $model->where('del_time',0)
-            ->select('id','order_number','sales_order_id','difference_amount','state','crt_time','crt_id','mark','model_type','storehouse_id')
+            ->select('id','order_number','data_id','difference_amount','state','crt_time','crt_id','mark','model_type','storehouse_id','type')
             ->orderby('id', 'desc');
 
         if(! empty($data['order_number'])) $model->where('order_number', 'LIKE', '%'.$data['order_number'].'%');
@@ -340,7 +350,16 @@ class ReturnExchangeOrderService extends Service
         $emp_map = Employee::whereIn('id',$emp_id)
                     ->pluck('emp_name','id')
                     ->toArray();
-        $sales = SalesOrder::whereIn('id',array_unique(array_column($data['data'],'sales_order_id')))->pluck('order_number','id')->toArray();
+        $sales = $purchase = [];
+        foreach ($data['data'] as $value){
+            if($value['type'] == ReturnExchangeOrder::Order_type){
+                $sales[] = $value['data_id'];
+            }elseif($value['type'] == ReturnExchangeOrder::Order_type2){
+                $purchase[] = $value['data_id'];
+            }
+        }
+        $sales = SalesOrder::whereIn('id',$sales)->pluck('order_number','id')->toArray();
+        $purchase = PurchaseOrder::whereIn('id',$purchase)->pluck('order_number','id')->toArray();
         $storehouse = Storehouse::whereIn('id',array_unique(array_column($data['data'],'storehouse_id')))
             ->pluck('title','id')
             ->toArray();
@@ -348,7 +367,14 @@ class ReturnExchangeOrderService extends Service
             $data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d H:i:s",$value['crt_time']) : '';
             $data['data'][$key]['crt_name'] = $emp_map[$value['crt_id']] ?? '';
             $data['data'][$key]['state_title'] = ReturnExchangeOrder::$state[$value['state']] ?? '';
-            $data['data'][$key]['sales_order_number'] = $sales[$value['sales_order_id']] ?? '';
+            $title = "" ;
+            if($value['type'] == ReturnExchangeOrder::Order_type){
+                $title = $sales[$value['data_id']] ?? "";
+            }elseif($value['type'] == ReturnExchangeOrder::Order_type2){
+                $title = $purchase[$value['data_id']] ?? "";
+            }
+            $data['data'][$key]['data_title'] = $title;
+            $data['data'][$key]['type_title'] = ReturnExchangeOrder::$order_type_name[$value['type']] ?? "";
             $data['data'][$key]['model_type_title'] = ReturnExchangeOrder::$model_type_name[$value['model_type']] ?? "";
             $data['data'][$key]['storehouse_title'] = $storehouse[$value['storehouse_id']] ?? '';
         }
@@ -360,12 +386,19 @@ class ReturnExchangeOrderService extends Service
         if($this->isEmpty($data,'model_type')) return [false,'单据类型不能为空!'];
         if(! in_array($data['model_type'], ReturnExchangeOrder::$model_type)) return [false,'单据类型不存在'];
         if(empty($data['storehouse_id'])) return [false,'请选择仓库'];
-        if($this->isEmpty($data,'sales_order_id')) return [false,'合同不能为空!'];
-        if(empty($data['sales_order_id'])) return [false,'请选择合同'];
-        $sale = SalesOrder::where('del_time',0)->where('id',$data['sales_order_id'])->first();
-        if(empty($sale)) return [false,'合同不存在或已被删除'];
-        if($sale['sales_order_type'] != SalesOrder::Order_type_one) return [false, '非安装件合同'];
-        if($sale['state'] < SalesOrder::State_two) return [false,'合同未施工,不能进行退换货操作'];
+        if(! isset($data['type'])) return [false,'退换单据类型不能为空'];
+        if(empty($data['data_id'])) return [false,'退换单据数据不能为空!'];
+        if($data['type'] == ReturnExchangeOrder::Order_type){
+            $sale = SalesOrder::where('del_time',0)->where('id',$data['data_id'])->first();
+            if(empty($sale)) return [false,'合同不存在或已被删除'];
+            if($sale['sales_order_type'] != SalesOrder::Order_type_one) return [false, '非安装件合同'];
+            if($sale['state'] < SalesOrder::State_two) return [false,'合同未施工,不能进行退换货操作'];
+        }elseif ($data['type'] == ReturnExchangeOrder::Order_type2){
+            $purchase = PurchaseOrder::where('del_time',0)->where('id',$data['data_id'])->first();
+            if(empty($purchase)) return [false,'采购单不存在或已被删除'];
+            if($purchase['state'] < PurchaseOrder::STATE_ONE) return [false,'采购单未确认,不能进行退换货操作'];
+        }
+
         //所属部门 以及  顶级部门
         if(empty($data['depart_id'])) {
             $data['depart_id'] = $this->getDepart($user);
@@ -386,16 +419,30 @@ class ReturnExchangeOrderService extends Service
             }
         }
 
-        //剩余能退
-        $id = $data['id'] ?? 0;
-        $s_product = $this->getSaveReturnCompareMessage($id, $data['sales_order_id']);
+        if($data['type'] == ReturnExchangeOrder::Order_type){
+            //剩余能退
+            $id = $data['id'] ?? 0;
+            $s_product = $this->getSaveReturnCompareMessage($id, $data['data_id']);
+
+            //比较
+            foreach ($return_submit_add as $pro => $number){
+                if(! isset($s_product[$pro])) return [false,'退货产品错误,合同中不存在该产品'];
+                $s_number = $s_product[$pro];
+
+                if($number > $s_number) return [false,'退货产品数量不能超过合同产品数据'];
+            }
+        }elseif ($data['type'] == ReturnExchangeOrder::Order_type2){
+            //剩余能退
+            $id = $data['id'] ?? 0;
+            $s_product = $this->getSaveReturnCompareMessage2($id, $data['data_id']);
 
-        //比较
-        foreach ($return_submit_add as $pro => $number){
-            if(! isset($s_product[$pro])) return [false,'退货产品错误,合同中不存在该产品'];
-            $s_number = $s_product[$pro];
+            //比较
+            foreach ($return_submit_add as $pro => $number){
+                if(! isset($s_product[$pro])) return [false,'退货产品错误,采购单中不存在该产品'];
+                $s_number = $s_product[$pro];
 
-            if($number > $s_number) return [false,'退货产品数量不能超过合同产品数据'];
+                if($number > $s_number) return [false,'退货产品数量不能超过合采购单产品数据'];
+            }
         }
 
         //换货
@@ -464,7 +511,7 @@ class ReturnExchangeOrderService extends Service
 
     public function getSaveReturnCompareMessage($id = 0, $sales_order_id = 0){
         $return = ReturnExchangeOrder::where('del_time',0)
-            ->where('sales_order_id',$sales_order_id)
+            ->where('data_id',$sales_order_id)
             ->select('id')->get()->toArray();
         $return = array_column($return,'id');
         $product_save = [];
@@ -498,4 +545,41 @@ class ReturnExchangeOrderService extends Service
 
         return $sales_order_product;
     }
+
+    public function getSaveReturnCompareMessage2($id = 0, $purchase_id = 0){
+        $return = ReturnExchangeOrder::where('del_time',0)
+            ->where('data_id',$purchase_id)
+            ->select('id')->get()->toArray();
+        $return = array_column($return,'id');
+        $product_save = [];
+        $sub = ReturnExchangeOrderProductInfo::where('return_or_exchange',ReturnExchangeOrderProductInfo::type_one)
+            ->where('del_time',0)
+            ->whereIn('return_exchange_id',$return)
+            ->when(! empty($id), function ($query) use ($id) {
+                return $query->where('return_exchange_id', '<>',$id);
+            })
+            ->get()->toArray();
+        foreach ($sub as $value){
+            if(isset($product_save[$value['product_id']])){
+                $product_save[$value['product_id']] += $value['number'];
+            }else{
+                $product_save[$value['product_id']] = $value['number'];
+            }
+        }
+
+        $sales_order_product = [];
+        $sales_product = PurchaseOrderInfo::where('del_time',0)
+            ->where('purchase_order_id',$purchase_id)
+            ->get()->toArray();
+        foreach ($sales_product as $value){
+            $product_save_tmp = $product_save[$value['product_id']] ?? 0;
+            if(isset($sales_order_product[$value['product_id']])){
+                $sales_order_product[$value['product_id']] += $value['number'];
+            }else{
+                $sales_order_product[$value['product_id']] = $value['number'] - $product_save_tmp;
+            }
+        }
+
+        return $sales_order_product;
+    }
 }