cqpCow 1 năm trước cách đây
mục cha
commit
35a56321f1
1 tập tin đã thay đổi với 103 bổ sung9 xóa
  1. 103 9
      app/Service/CheckService.php

+ 103 - 9
app/Service/CheckService.php

@@ -10,6 +10,8 @@ use App\Model\InvoiceOrderInfo;
 use App\Model\ProductInventory;
 use App\Model\PurchaseOrder;
 use App\Model\PurchaseOrderInfo;
+use App\Model\ReturnExchangeOrder;
+use App\Model\ReturnExchangeOrderProductInfo;
 use App\Model\SalesOrder;
 use App\Model\Setting;
 use Illuminate\Support\Facades\DB;
@@ -22,6 +24,7 @@ class CheckService extends Service
     const three = 3; //采购单
     const four = 4; //销售订单
     const five = 5; //施工单
+    const six = 6; //退换货单
 
     //中文对照
     public $map = [
@@ -30,6 +33,7 @@ class CheckService extends Service
         self::three => '采购单',//确认后入库
         self::four => '销售订单',
         self::five => '施工单',//确认后出库
+        self::six => '退换货单',//确认后出库或出库入库
     ];
 
     //入库操作
@@ -52,6 +56,7 @@ class CheckService extends Service
         self::three => 'confirmPurchaseOrder',
         self::four => 'confirmSalesOrder',
         self::five => 'confirmConstruction',
+        self::six => 'confirmReturnExchangeOrder',
     ];
 
     //单据库存流水
@@ -59,6 +64,7 @@ class CheckService extends Service
         self::two => 'recordInvoiceOrder',
         self::three => 'recordPurchaseOrder',
         self::five => 'recordConstruction',
+        self::six => 'recordReturnExchangeOrder'
     ];
 
     public function confirmInvoiceOrder($data){
@@ -197,6 +203,70 @@ class CheckService extends Service
         return [true,''];
     }
 
+    public function confirmReturnExchangeOrder($data){
+        $model = ReturnExchangeOrder::where('id',$data['id'])
+            ->where('del_time',0)
+            ->first();
+        if(empty($model)) return [false, '退换货单不存在或已被删除'];
+        if($model->state != ReturnExchangeOrder::State_zero) return [false, '请确认退换货单状态,操作失败'];
+
+        ReturnExchangeOrder::where('del_time',0)->where('id',$data['id'])
+            ->update(['state' => ReturnExchangeOrder::State_one]);
+
+        return [true, $model->toArray()];
+    }
+
+    public function recordReturnExchangeOrder($data, $order){
+        $result = ReturnExchangeOrderProductInfo::where('del_time',0)
+            ->where('return_exchange_id',$order['id'])
+            ->get()->toArray();
+        if(empty($result)) return [false,'退换货单产品信息不存在或已被删除'];
+        $insert = $insert2 = [];
+        $time = time();
+        foreach ($result as $value){
+            $prefix = ReturnExchangeOrder::$prefix[$value['return_or_exchange']] ?? '';
+            if($value['return_or_exchange'] == ReturnExchangeOrderProductInfo::type_one){
+                //退货
+                if(isset($insert[$value['product_id']])){
+                    $insert[$value['product_id']]['number'] += $value['number'];
+                }else{
+                    $insert[$value['product_id']] = [
+                        'product_id' => $value['product_id'],
+                        'number' => $value['number'],
+                        'order_type' => $prefix,
+                        'order_number' => $order['order_number'],
+                        'crt_time' => $time
+                    ];
+                }
+            }else{
+                //换货
+                if(isset($insert2[$value['product_id']])){
+                    $insert2[$value['product_id']]['number'] += -($value['number']);
+                }else{
+                    $insert2[$value['product_id']] = [
+                        'product_id' => $value['product_id'],
+                        'number' => -($value['number']),
+                        'order_type' => $prefix,
+                        'order_number' => $order['order_number'],
+                        'crt_time' => $time
+                    ];
+                }
+            }
+
+        }
+        $insert = array_values($insert);
+        $bool = InOutRecord::insert($insert);
+        if(! $bool) return [false,'流水写入失败'];
+
+        if(! empty($insert2)) {
+            $insert2 = array_values($insert2);
+            $bool = InOutRecord::insert($insert2);
+            if(! $bool) return [false,'流水写入失败'];
+        }
+
+        return [true,''];
+    }
+
     public function checkAll($data,$user){
         if(empty($data['id']) || empty($data['opt_case'])) return [false,'必传参数不能为空或者参数值错误!'];
 
@@ -239,7 +309,7 @@ class CheckService extends Service
 
     //更新库存
     public function changeInventory($data,$order){
-        $number_symbol = ">";
+        $number_symbol = "";
         if(in_array($data['opt_case'],self::$in_opt)){
             $number_symbol = ">";
         }elseif (in_array($data['opt_case'],self::$out_opt)){
@@ -249,26 +319,50 @@ class CheckService extends Service
         //获取单据最新数据时间 正常审核的数据
         $latest = InOutRecord::where('del_time',0)
             ->where('order_number',$order['order_number'])
-            ->where('number',$number_symbol,0)
+            ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
+                return $query->where('number', $number_symbol,0);
+            })
             ->select('crt_time')
             ->orderBy('crt_time', 'desc')
             ->first();
 
         $model = InOutRecord::where('del_time',0)
             ->where('order_number',$order['order_number'])
-            ->where('number',$number_symbol,0)
-            ->select(DB::raw("sum(number) as number"),'crt_time','product_id');
+            ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
+                return $query->where('number', $number_symbol,0);
+            })
+            ->select('number','crt_time','product_id');
         if(! empty($latest)) {
             $t = $latest->toArray();
             $model->where('crt_time',$t['crt_time']);
         }
 
-        $result = $model->get()->toArray();
-        if (empty($result)) return [false,'流水记录不存在'];
+        $record = $model->get()->toArray();
+        if (empty($record)) return [false,'流水记录不存在'];
+        $result = $lock_number = [];
+        foreach ($record as $value){
+            if(isset($result[$value['product_id']])){
+                $result[$value['product_id']]['number'] += $value['number'];
+            }else{
+                $result[$value['product_id']] = [
+                    'product_id' => $value['product_id'],
+                    'number' => $value['number'],
+                    'crt_time' => $value['crt_time'],
+                ];
+            }
+            if($value['number'] < 0){
+                if(isset($lock_number[$value['product_id']])){
+                    $lock_number[$value['product_id']] += $value['number'];
+                }else{
+                    $lock_number[$value['product_id']] = $value['number'];
+                }
+            }
+        }
 
         //是否锁定
         $setting_map = Setting::where('setting_name','lock_number')
             ->pluck('setting_value','setting_name')->toArray();
+        $result = array_values($result);
         foreach ($result as $key => $value){
             $m = ProductInventory::where('product_id',$value['product_id'])
                 ->select('product_id','number')
@@ -277,14 +371,14 @@ class CheckService extends Service
             if(empty($m)){
                 ProductInventory::insert($result[$key]);
             }else{
-                $lock_number = 0;
-                if(! empty($setting_map['lock_number']) && in_array($data['opt_case'],self::$out_opt)) $lock_number = $value['number'];
+                $lock_number_tmp = 0;
+                if(! empty($setting_map['lock_number']) && ! empty($lock_number[$value['product_id']])) $lock_number_tmp = $lock_number[$value['product_id']];
 
                 ProductInventory::where('product_id',$m->product_id)
                     ->lockForUpdate()
                     ->update([
                         'number' => DB::raw('number + ('. $value['number'] . ')'),
-                        'lock_number' => DB::raw('lock_number + ('. $lock_number . ')')
+                        'lock_number' => DB::raw('lock_number + ('. $lock_number_tmp . ')')
                     ]);
             }
         }