Browse Source

退货换

cqpCow 10 months ago
parent
commit
9907abf327

+ 4 - 0
app/Model/ReturnExchangeOrder.php

@@ -17,13 +17,16 @@ class ReturnExchangeOrder extends UseScopeBaseModel
     ];
     const Model_type_one = 1; // 退货单
     const Model_type_two = 2; // 换货单
+    const Model_type_three = 3; // 仅退款
     public static $model_type = [
         self::Model_type_one,
         self::Model_type_two,
+        self::Model_type_three,
     ];
     public static $model_type_name = [
         self::Model_type_one => '退货单',
         self::Model_type_two => '换货单',
+        self::Model_type_three => '仅退款',
     ];
 
     const State_zero = 0;//未确认
@@ -38,6 +41,7 @@ class ReturnExchangeOrder extends UseScopeBaseModel
     public static $prefix = [
         self::Model_type_one => 'TH',
         self::Model_type_two => 'HH',
+        self::Model_type_three => 'TK',
     ];
     const range_function = 'returnExchangeOrderRange';
 }

+ 31 - 16
app/Service/CheckService.php

@@ -32,6 +32,9 @@ use Illuminate\Support\Facades\DB;
 
 class CheckService extends Service
 {
+    //特殊操作数
+    const minus_one = -1;//跳出库存流水
+
     //审批操作对应的数值
     const one = 1; //收货
     const two = 2; //发货
@@ -727,6 +730,8 @@ class CheckService extends Service
     }
 
     public function recordReturnExchangeOrder($data, $order){
+        if($order['model_type'] == ReturnExchangeOrder::Model_type_three) return [true, self::minus_one];
+
         $result = ReturnExchangeOrderProductInfo::where('del_time',0)
             ->where('return_exchange_id',$order['id'])
             ->get()->toArray();
@@ -1020,6 +1025,8 @@ class CheckService extends Service
     }
 
     public function reject_record_return_exchange($data,$order){
+        if($order['model_type'] == ReturnExchangeOrder::Model_type_three) return [true, self::minus_one];
+
         $result = ReturnExchangeOrderProductInfo::where('del_time',0)
             ->where('return_exchange_id',$order['id'])
             ->get()->toArray();
@@ -1403,11 +1410,13 @@ class CheckService extends Service
                         return [false, $msg];
                     }
 
-                    //库存
-                    list($bool,$msg) = $this->changeInventoryReject($data,$order,$user);
-                    if(! $bool){
-                        DB::rollBack();
-                        return [false, $msg];
+                    if($msg != self::minus_one){
+                        //库存
+                        list($bool,$msg) = $this->changeInventoryReject($data,$order,$user);
+                        if(! $bool){
+                            DB::rollBack();
+                            return [false, $msg];
+                        }
                     }
                 }
 
@@ -1446,16 +1455,19 @@ class CheckService extends Service
                 if($data['type'] == self::TYPE_ONE){
                     if($record) {
                         //流水
-                        $bool = $this->$record($data, $order);
+                        list($bool,$msg) = $this->$record($data, $order);
                         if(! $bool) {
                             DB::rollBack();
                             return [false, $msg];
                         }
-                        //库存
-                        list($bool,$msg) = $this->changeInventory($data, $order, $user);
-                        if(! $bool) {
-                            DB::rollBack();
-                            return [false, $msg];
+
+                        if($msg != self::minus_one){
+                            //库存
+                            list($bool,$msg) = $this->changeInventory($data, $order, $user);
+                            if(! $bool) {
+                                DB::rollBack();
+                                return [false, $msg];
+                            }
                         }
                     }
 
@@ -1504,11 +1516,14 @@ class CheckService extends Service
                         DB::rollBack();
                         return [false, $msg];
                     }
-                    //库存
-                    list($bool,$msg) = $this->changeInventory($data, $order, $user);
-                    if(! $bool) {
-                        DB::rollBack();
-                        return [false, $msg];
+
+                    if($msg != self::minus_one){
+                        //库存
+                        list($bool,$msg) = $this->changeInventory($data, $order, $user);
+                        if(! $bool) {
+                            DB::rollBack();
+                            return [false, $msg];
+                        }
                     }
                 }
 

+ 145 - 69
app/Service/ReturnExchangeOrderService.php

@@ -37,7 +37,7 @@ class ReturnExchangeOrderService extends Service
             ReturnExchangeOrderProductInfo::where('del_time',0)
                 ->where('return_exchange_id',$data['id'])
                 ->update(['del_time' => $time]);
-            if(!empty($data['product_one'])){
+            if(! empty($data['product_one'])){
                 $sub = [];
                 foreach ($data['product_one'] as $value){
                     $sub[] = [
@@ -59,7 +59,7 @@ class ReturnExchangeOrderService extends Service
                 ReturnExchangeOrderProductInfo::insert($sub);
             }
 
-            if(!empty($data['product_two'])){
+            if(! empty($data['product_two'])){
                 $sub = [];
                 foreach ($data['product_two'] as $value){
                     $sub[] = [
@@ -107,11 +107,11 @@ class ReturnExchangeOrderService extends Service
             $material_model->depart_id = $data['depart_id'] ?? 0;
             $material_model->top_depart_id = $data['top_depart_id'] ?? 0;
             $material_model->crt_id = $user['id'];
-            $material_model->storehouse_id = $data['storehouse_id'];
+            $material_model->storehouse_id = $data['storehouse_id'] ?? 0;
             $material_model->save();
             $time = time();
 
-            if(!empty($data['product_one'])){
+            if(! empty($data['product_one'])){
                 $sub = [];
                 foreach ($data['product_one'] as $value){
                     $sub[] = [
@@ -133,7 +133,7 @@ class ReturnExchangeOrderService extends Service
                 ReturnExchangeOrderProductInfo::insert($sub);
             }
 
-            if(!empty($data['product_two'])){
+            if(! empty($data['product_two'])){
                 $sub = [];
                 foreach ($data['product_two'] as $value){
                     $sub[] = [
@@ -183,7 +183,9 @@ class ReturnExchangeOrderService extends Service
 
         if(empty($order)) return [false, '退换货订单不存在或已被删除'];
         $order = $order->toArray();
-        $order['storehouse_title'] = Storehouse::where('id',$order['storehouse_id'])->value('title');
+        $order['storehouse_title'] = "";
+        if($order['storehouse_id'] > 0) $order['storehouse_title'] = Storehouse::where('id',$order['storehouse_id'])->value('title');
+
         if($order['type'] == ReturnExchangeOrder::Order_type){
             $sales = SalesOrder::where('id',$order['data_id'])->value('order_number');
             $order['data_title'] = $sales;
@@ -269,6 +271,7 @@ class ReturnExchangeOrderService extends Service
             $model->whereBetween('crt_time',[$return[0],$return[1]]);
         }
         if(isset($data['type'])) $model->where('type',$data['type']);
+        if(! empty($data['model_type'])) $model->where('model_type',$data['model_type']);
         if(! empty($data['order'])){
             $search = -1;
             if(isset($data['type'])) $search = $data['type'];
@@ -367,9 +370,18 @@ class ReturnExchangeOrderService extends Service
     public function orderRule(&$data, $user, $is_check = true){
         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(empty($data['depart_id'])) {
+            $data['depart_id'] = $this->getDepart($user);
+            $data['top_depart_id'] = $user['depart_map'][$data['depart_id']] ?? 0;
+        }
         if(! isset($data['type'])) return [false,'退换单据类型不能为空'];
         if(empty($data['data_id'])) return [false,'退换单据数据不能为空!'];
+
+        $res = $this->checkNumber($data['difference_amount']);
+        if(! $res) return [false, '金额请输入不超过两位小数并且大于等于0的数值'];
+
+        $total = 0;
         if($data['type'] == ReturnExchangeOrder::Order_type){
             $sale = SalesOrder::where('del_time',0)->where('id',$data['data_id'])->first();
             if(empty($sale)) return [false,'合同不存在或已被删除'];
@@ -377,88 +389,107 @@ class ReturnExchangeOrderService extends Service
             if($sale['sales_order_type'] != SalesOrder::Order_type_one) return [false, '非安装件合同'];
             if($sale['state'] < SalesOrder::State_two) return [false,'合同未确认,不能进行退换货操作'];
             $order_number = $sale['order_number'];
+            $total = $sale['contract_fee'];
         }elseif ($data['type'] == ReturnExchangeOrder::Order_type2){
             $purchase = PurchaseOrder::where('del_time',0)->where('id',$data['data_id'])->first();
             if(empty($purchase)) return [false,'采购单不存在或已被删除'];
             $purchase = $purchase->toArray();
             if($purchase['state'] < PurchaseOrder::STATE_Four) return [false,'采购单未入库,不能进行退换货操作'];
             $order_number = $purchase['order_number'];
+            $total = $purchase['purchase_total'];
         }
         if(! empty($order_number)){
             list($status,$msg) = $this->limitingSendRequestBackgExpire("returnExchangeOrder" . $order_number);
             if(! $status) return [false, $msg];
         }
 
-        //所属部门 以及  顶级部门
-        if(empty($data['depart_id'])) {
-            $data['depart_id'] = $this->getDepart($user);
-            $data['top_depart_id'] = $user['depart_map'][$data['depart_id']] ?? 0;
-        }
+        //换货
+        $product_submit_minus = $product_save_minus = [];
 
-        //退货
-        $return_submit_add = [];
-        if(empty($data['product_one'])) return [false,'退货产品不能为空'];
-        foreach ($data['product_one'] as $value){
-            if(empty($value['number'])) return [false,'退货产品数量不能为空'];
-            $res = $this->checkNumber($value['number']);
-            if(! $res) return [false,'请输入正确的退货产品数量'];
-            if(isset($return_submit_add[$value['product_id']])){
-                $return_submit_add[$value['product_id']] += $value['number'];
-            }else{
-                $return_submit_add[$value['product_id']] = $value['number'];
-            }
-        }
+        if($data['model_type'] == ReturnExchangeOrder::Model_type_three){
+            //仅退款
 
-        if($data['type'] == ReturnExchangeOrder::Order_type){
-            //剩余能退
+            //剩余能退金额计算
             $id = $data['id'] ?? 0;
-            $s_product = $this->getSaveReturnCompareMessage($id, $data['data_id']);
+            $save_money = $this->getSaveReturnALLCompareMessage($id, $data['data_id'], $data['type']);
+            $save_money = $save_money[$data['data_id']] ?? 0;
+            $money = bcsub($total,$save_money,2);
 
-            //比较
-            foreach ($return_submit_add as $pro => $number){
-                if(! isset($s_product[$pro])) return [false,'退货产品错误,合同中不存在该产品'];
-                $s_number = $s_product[$pro];
+            if($data['difference_amount'] > $money) return [false,'剩余能退金额最大为'. $money];
+        }else{
+            if(empty($data['storehouse_id'])) return [false,'请选择仓库'];
 
-                if($number > $s_number) return [false,'退货产品数量不能超过合同产品数据'];
+            //退货
+            $return_submit_add = [];
+            if(empty($data['product_one'])) return [false,'退货产品不能为空'];
+            foreach ($data['product_one'] as $value){
+                if(empty($value['number'])) return [false,'退货产品数量不能为空'];
+                $res = $this->checkNumber($value['number']);
+                if(! $res) return [false,'请输入正确的退货产品数量'];
+                if(isset($return_submit_add[$value['product_id']])){
+                    $return_submit_add[$value['product_id']] += $value['number'];
+                }else{
+                    $return_submit_add[$value['product_id']] = $value['number'];
+                }
             }
-        }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];
-
-                if($number > $s_number) return [false,'退货产品数量不能超过合采购单产品数据'];
-            }
-        }
+            if($data['type'] == ReturnExchangeOrder::Order_type){
+                //剩余能退
+                $id = $data['id'] ?? 0;
+                list($s_product,$s_money) = $this->getSaveReturnCompareMessage($id, $data['data_id']);
+                $save_money = $s_money[$data['data_id']] ?? 0;
+                $money = bcsub($total,$save_money,2);
+                if($data['difference_amount'] > $money) return [false,'剩余能退金额最大为'. $money];
 
-        //换货
-        $product_submit_minus = $product_save_minus = $product_id = [];
-        if($data['model_type'] == ReturnExchangeOrder::Model_type_two){
-            if(empty($data['product_two'])) return [false,'换货产品不能为空'];
-            foreach ($data['product_two'] as $value){
-                if(empty($value['number'])) return [false,'换货产品数量不能为空'];
-                $res = $this->checkNumber($value['number']);
-                if(! $res) return [false,'请输入正确的换货产品数量'];
+                //比较
+                foreach ($return_submit_add as $pro => $number){
+                    if(! isset($s_product[$pro])) return [false,'退货产品错误,合同中不存在该产品'];
+                    $s_number = $s_product[$pro];
 
-                $key = $value['product_id'] . ',' .$data['storehouse_id'];
-                if(isset($product_submit_minus[$key])){
-                    $product_submit_minus[$key] += $value['number'];
-                }else{
-                    $product_submit_minus[$key] = $value['number'];
+                    if($number > $s_number) return [false,'退货产品数量不能超过合同产品数据'];
+                }
+            }elseif ($data['type'] == ReturnExchangeOrder::Order_type2){
+                //剩余能退
+                $id = $data['id'] ?? 0;
+                list($s_product,$s_money) = $this->getSaveReturnCompareMessage2($id, $data['data_id']);
+                $save_money = $s_money[$data['data_id']] ?? 0;
+                $money = bcsub($total,$save_money,2);
+                if($data['difference_amount'] > $money) return [false,'剩余能退金额最大为'. $money];
+
+                //比较
+                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,'退货产品数量不能超过合采购单产品数据'];
                 }
-                $product_id[] = $value['product_id'];
             }
 
-            //是否校验库存
-            ProductInventoryService::is_check($user,$data);
+            //换货
+            $product_id = [];
+            if($data['model_type'] == ReturnExchangeOrder::Model_type_two){
+                if(empty($data['product_two'])) return [false,'换货产品不能为空'];
+                foreach ($data['product_two'] as $value){
+                    if(empty($value['number'])) return [false,'换货产品数量不能为空'];
+                    $res = $this->checkNumber($value['number']);
+                    if(! $res) return [false,'请输入正确的换货产品数量'];
+
+                    $key = $value['product_id'] . ',' .$data['storehouse_id'];
+                    if(isset($product_submit_minus[$key])){
+                        $product_submit_minus[$key] += $value['number'];
+                    }else{
+                        $product_submit_minus[$key] = $value['number'];
+                    }
+                    $product_id[] = $value['product_id'];
+                }
 
-            $product_save_minus = $this->getSaveDetailMinus($id);
-            list($status,$msg) = (new ProductInventoryService())->compareStock($user,$product_id, $product_submit_minus, $product_save_minus);
-            if(! $status) return [false, $msg];
+                //是否校验库存
+                ProductInventoryService::is_check($user,$data);
+
+                $product_save_minus = $this->getSaveDetailMinus($id);
+                list($status,$msg) = (new ProductInventoryService())->compareStock($user,$product_id, $product_submit_minus, $product_save_minus);
+                if(! $status) return [false, $msg];
+            }
         }
 
         if($is_check){
@@ -499,11 +530,45 @@ class ReturnExchangeOrderService extends Service
         return $product_save;
     }
 
+    //剩余能退
+    public function getSaveReturnALLCompareMessage($id = 0, $order_id = 0, $type = 0){
+        $return = ReturnExchangeOrder::where('del_time',0)
+            ->where('type',$type)
+            ->where('data_id',$order_id)
+            ->when(! empty($id), function ($query) use ($id) {
+                return $query->where('id', '<>',$id);
+            })
+            ->select('data_id','difference_amount')->get()->toArray();
+
+        $total_save = [];
+        foreach ($return as $value){
+            if(isset($total_save[$value['data_id']])){
+                $total_save[$value['data_id']] += $value['difference_amount'];
+            }else{
+                $total_save[$value['data_id']] = $value['difference_amount'];
+            }
+        }
+
+        return $total_save;
+    }
+
     //合同剩余能退
     public function getSaveReturnCompareMessage($id = 0, $sales_order_id = 0){
         $return = ReturnExchangeOrder::where('del_time',0)
             ->where('data_id',$sales_order_id)
-            ->select('id')->get()->toArray();
+            ->where('type',ReturnExchangeOrder::Order_type)
+            ->select('id','data_id','difference_amount')->get()->toArray();
+
+        $total_save = [];
+        foreach ($return as $value){
+            if($id > 0 && $value['id'] == $id) continue;
+            if(isset($total_save[$value['data_id']])){
+                $total_save[$value['data_id']] += $value['difference_amount'];
+            }else{
+                $total_save[$value['data_id']] = $value['difference_amount'];
+            }
+        }
+
         $return = array_column($return,'id');
         $product_save = [];
         $sub = ReturnExchangeOrderProductInfo::where('return_or_exchange',ReturnExchangeOrderProductInfo::type_one)
@@ -534,14 +599,25 @@ class ReturnExchangeOrderService extends Service
             }
         }
 
-        return $sales_order_product;
+        return [$sales_order_product, $total_save];
     }
 
     //采购剩余能退
     public function getSaveReturnCompareMessage2($id = 0, $purchase_id = 0){
         $return = ReturnExchangeOrder::where('del_time',0)
             ->where('data_id',$purchase_id)
-            ->select('id')->get()->toArray();
+            ->where('type',ReturnExchangeOrder::Order_type2)
+            ->select('id','data_id','difference_amount')->get()->toArray();
+        $total_save = [];
+        foreach ($return as $value){
+            if($id > 0 && $value['id'] == $id) continue;
+            if(isset($total_save[$value['data_id']])){
+                $total_save[$value['data_id']] += $value['difference_amount'];
+            }else{
+                $total_save[$value['data_id']] = $value['difference_amount'];
+            }
+        }
+
         $return = array_column($return,'id');
         $product_save = [];
         $sub = ReturnExchangeOrderProductInfo::where('return_or_exchange',ReturnExchangeOrderProductInfo::type_one)
@@ -572,7 +648,7 @@ class ReturnExchangeOrderService extends Service
             }
         }
 
-        return $sales_order_product;
+        return [$sales_order_product,$total_save];
     }
 
     //获取差异金额(合同和采购详情中统计的)
@@ -585,7 +661,7 @@ class ReturnExchangeOrderService extends Service
             ->select('id','model_type','order_number','difference_amount','state')
             ->get()->toArray();
         foreach ($result as $key => $value){
-            $result[$key]['model_type_title'] = ReturnExchangeOrder::$model_type[$value['model_type']] ?? "";
+            $result[$key]['model_type_title'] = ReturnExchangeOrder::$model_type_name[$value['model_type']] ?? "";
             $result[$key]['state_title'] = ReturnExchangeOrder::$state[$value['state']] ?? "";
         }
 

+ 5 - 0
routes/api.php

@@ -304,4 +304,9 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
 
     //导出统一方法
     $route->any('exportFile', 'Api\ExportFileController@exportFile');
+
+    //抖店
+    $route->any('douShopOrderList', 'Api\DouShopController@douShopOrderList');
+    $route->any('douShopOrderDetail', 'Api\DouShopController@douShopOrderDetail');
+
 });