فهرست منبع

快递件流程结束

cqpCow 1 سال پیش
والد
کامیت
f1f367d3de
4فایلهای تغییر یافته به همراه280 افزوده شده و 22 حذف شده
  1. 44 2
      app/Service/CheckService.php
  2. 49 5
      app/Service/InvoiceOrderService.php
  3. 185 0
      app/Service/ProductInventoryService.php
  4. 2 15
      app/Service/ProductService.php

+ 44 - 2
app/Service/CheckService.php

@@ -3,6 +3,8 @@
 namespace App\Service;
 
 use App\Model\InOutRecord;
+use App\Model\InvoiceOrder;
+use App\Model\InvoiceOrderInfo;
 use App\Model\ProductInventory;
 use App\Model\PurchaseOrder;
 use App\Model\PurchaseOrderInfo;
@@ -22,7 +24,7 @@ class CheckService extends Service
     //中文对照
     public $map = [
         self::one => '收货单',
-        self::two => '发货单',
+        self::two => '发货单',//确认后出库
         self::three => '采购单',//确认后入库
         self::four => '销售订单',
         self::five => '施工单',
@@ -35,6 +37,7 @@ class CheckService extends Service
 
     //出库操作
     public static $out_opt = [
+        self::two,
         self::five,
     ];
 
@@ -43,15 +46,54 @@ class CheckService extends Service
 
     //单据操作
     public static $opt_case = [
+        self::two => 'confirmInvoiceOrder',
         self::three => 'confirmPurchaseOrder',
         self::four => 'confirmSalesOrder',
     ];
 
     //单据库存流水
     public static $record = [
+        self::two => 'recordInvoiceOrder',
         self::three => 'recordPurchaseOrder',
     ];
 
+    public function confirmInvoiceOrder($data){
+        $model = InvoiceOrder::where('id',$data['id'])
+            ->where('del_time',0)
+            ->first();
+        if(empty($model)) return [false, '发货单不存在或已被删除'];
+        if($model->state != InvoiceOrder::STATE_ZERO) return [false, '请确认发货单状态,操作失败'];
+
+        InvoiceOrder::where('del_time',0)->where('id',$data['id'])
+            ->update(['state' => InvoiceOrder::STATE_ONE]);
+
+        return [true, $model->toArray()];
+    }
+
+    public function recordInvoiceOrder($data, $order){
+        $result = InvoiceOrderInfo::where('del_time',0)
+            ->where('order_number',$order['order_number'])
+            ->get()->toArray();
+        if(empty($result)) return [false,'发货单产品信息不存在或已被删除'];
+        $insert = [];
+        foreach ($result as $value){
+            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' => InvoiceOrder::prefix
+                ];
+            }
+        }
+        $insert = array_values($insert);
+        $bool = InOutRecord::insert($insert);
+        if(! $bool) return [false,'流水写入失败'];
+
+        return [true,''];
+    }
+
     public function confirmPurchaseOrder($data){
         $model = PurchaseOrder::where('id',$data['id'])
             ->where('del_time',0)
@@ -106,7 +148,7 @@ class CheckService extends Service
     }
 
     public function checkAll($data,$user){
-        if(empty($data['id']) || empty($data['opt_case']) || empty($data['type'])) return [false,'必传参数不能为空或者参数值错误!'];
+        if(empty($data['id']) || empty($data['opt_case'])) return [false,'必传参数不能为空或者参数值错误!'];
 
         //具体方法
         $function = self::$opt_case[$data['opt_case']] ?? "";

+ 49 - 5
app/Service/InvoiceOrderService.php

@@ -6,6 +6,7 @@ use App\Model\Depart;
 use App\Model\Employee;
 use App\Model\InvoiceOrder;
 use App\Model\InvoiceOrderInfo;
+use App\Model\SalesOrder;
 use Illuminate\Support\Facades\DB;
 
 class InvoiceOrderService extends Service
@@ -37,13 +38,16 @@ class InvoiceOrderService extends Service
                 foreach ($data['product'] as $value){
                     $sub[] = [
                         'order_number' => $data['order_number'],
-                        'depart_id' => $data['depart_id'],
+                        'depart_id' => $data['depart_id'] ?? 0,
                         'product_id' => $value['product_id'],
                         'number' => $value['number'],
                         'mark' => $value['mark'] ?? '',
                     ];
                 }
                 InvoiceOrderInfo::insert($sub);
+
+                //锁定库存
+                ProductInventoryService::changeLockNumber($msg[0],$msg[1]);
             }
 
             DB::commit();
@@ -81,13 +85,16 @@ class InvoiceOrderService extends Service
                 foreach ($data['product'] as $value){
                     $sub[] = [
                         'order_number' => $data['order_number'],
-                        'depart_id' => $data['depart_id'],
+                        'depart_id' => $data['depart_id'] ?? 0,
                         'product_id' => $value['product_id'],
                         'number' => $value['number'],
                         'mark' => $value['mark'] ?? '',
                     ];
                 }
                 InvoiceOrderInfo::insert($sub);
+
+                //锁定库存
+                ProductInventoryService::changeLockNumber($msg[0]);
             }
 
             DB::commit();
@@ -124,6 +131,7 @@ class InvoiceOrderService extends Service
             ->where('state','>',InvoiceOrder::STATE_ZERO)->exists();
         if($bool) return [false,'发货订单已确认,删除失败!'];
 
+        $product_save = $this->getSaveDetail($data['order_number']);
         try{
             DB::beginTransaction();
             InvoiceOrder::where('order_number',$data['order_number'])->update([
@@ -132,6 +140,8 @@ class InvoiceOrderService extends Service
             InvoiceOrderInfo::where('order_number',$data['order_number'])->update([
                 'del_time'=>time()
             ]);
+            //锁定库存释放
+            ProductInventoryService::changeLockNumber([],$product_save);
 
             DB::commit();
         }catch (\Throwable $e){
@@ -185,16 +195,33 @@ class InvoiceOrderService extends Service
     }
 
     public function orderRule(&$data, $is_check = true){
-        if($this->isEmpty($data,'depart_id')) return [false,'部门不能为空!'];
         if($this->isEmpty($data,'send')) return [false,'发货人不能为空!'];
         if($this->isEmpty($data,'product')) return [false,'产品不能为空!'];
         if(! empty($data['send_time'])) $data['send_time'] = $this->changeDateToDateMin($data['send_time']);
-
+        if(! empty($data['contact_order_number'])) {
+            $sales = SalesOrder::where('del_time',0)
+                ->where('order_number',$data['contact_order_number'])
+                ->first();
+            if(empty($sales)) return [false,'合同不存在或已被删除'];
+            if($sales['sales_order_type'] != SalesOrder::Order_type_two) return [false,'非快递件合同'];
+        }
+        $product_submit = $product_save = [];
         foreach ($data['product'] as $value){
             if(empty($value['number'])) return [false,'产品数量不能为空'];
             $res = $this->checkNumber($value['number']);
             if(! $res) return [false,'请输入正确的产品数量'];
+
+            if(isset($product_submit[$value['product_id']])){
+                $product_submit[$value['product_id']] += $value['number'];
+            }else{
+                $product_submit[$value['product_id']] = $value['number'];
+            }
         }
+        list($status,$msg) = (new ProductInventoryService())->compareStock(array_keys($product_submit), [
+            'order_number' => $data['order_number'] ?? "",
+            'product' => $product_submit
+        ]);
+        if(! $status) return [false, $msg];
 
         if($is_check){
             $order_number = (new OrderNoService())->createOrderNumber(InvoiceOrder::prefix);
@@ -202,8 +229,25 @@ class InvoiceOrderService extends Service
             $data['order_number'] = $order_number;
         }else{
             if($this->isEmpty($data,'order_number')) return [false,'发货单号不能为空!'];
+            $product_save = $this->getSaveDetail($data['order_number']);
+        }
+
+        return [true, [$product_submit, $product_save]];
+    }
+
+    public function getSaveDetail($order_number){
+        $product_save = [];
+        $sub = InvoiceOrderInfo::where('order_number',$order_number)
+            ->where('del_time',0)
+            ->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'];
+            }
         }
 
-        return [true, ''];
+        return $product_save;
     }
 }

+ 185 - 0
app/Service/ProductInventoryService.php

@@ -0,0 +1,185 @@
+<?php
+
+namespace App\Service;
+
+use App\Model\Construction;
+use App\Model\ConstructionProductInfo;
+use App\Model\InvoiceOrder;
+use App\Model\InvoiceOrderInfo;
+use App\Model\Product;
+use App\Model\ProductInventory;
+use App\Model\Setting;
+use Illuminate\Support\Facades\DB;
+
+class ProductInventoryService extends Service
+{
+    //获取产品真实库存
+    public static function getRealStock($product_id = [],$data){
+        if(empty($product_id)) return [];
+        $array = ProductInventory::whereIn('product_id',$product_id)
+            ->where('number','>',0)
+            ->select('id','product_id','number','crt_time','lock_number')
+            ->get()->toArray();
+
+        $map = [];
+        if(! empty($data['order_number'])){
+            if(strpos($data['order_number'],InvoiceOrder::prefix) !== false){
+                $id = InvoiceOrder::where('order_number',$data['order_number'])
+                    ->where('del_time',0)
+                    ->value('id');
+                $model = new InvoiceOrderInfo();
+            }else{
+                foreach (Construction::$prefix as $value){
+                    if(strpos($data['order_number'],$value) !== false){
+                        $model = new ConstructionProductInfo();
+                    }
+                }
+                $id = Construction::where('order_number',$data['order_number'])
+                    ->where('del_time',0)
+                    ->value('id');
+            }
+            if(! empty($model) && ! empty($id)){
+                $save = $model->where('del_time',0)
+                    ->where('id',$id)
+                    ->select('product_id','number')
+                    ->get()->toArray();
+                foreach ($save as $value){
+                    $key = $value['product_id'];
+                    if(isset($map[$key])){
+                        $map[$key] += $value['number'];
+                    }else{
+                        $map[$key] = $value['number'];
+                    }
+                }
+            }
+        }
+
+        $return = [];
+        if(! empty($array)){
+            $setting_map = Setting::where('setting_name','lock_number')
+                ->pluck('setting_value','setting_name')
+                ->toArray();
+            foreach ($array as $value){
+                if(! empty($setting_map['lock_number'])){//真实库存
+                    $tmp = $map[$value['product_id']] ?? 0;//已保存数量
+                    $tmp_lock = ($value['lock_number'] > 0 ? $value['lock_number'] : 0) - $tmp;
+                    if($value['number'] > $tmp_lock) {
+                        $return[] = [
+                            'id' => $value['id'],
+                            'product_id' => $value['product_id'],
+                            'number' => $value['number'] - ($tmp_lock > 0 ? $tmp_lock : 0),
+                        ];
+                    }
+                }else{
+                    $return[] = [
+                        'id' => $value['id'],
+                        'product_id' => $value['product_id'],
+                        'number' => $value['number'],
+                    ];
+                }
+            }
+        }
+
+        return $return;
+    }
+
+    //更新锁定库存
+    //第一个数组 (提交的数据)  第二个数组(保存过的数据)
+    public static function changeLockNumber($submit_total = [], $save_total = []){
+        if(empty($submit_total) && empty($save_total)) return;
+
+        $setting_map = Setting::where('setting_name','lock_number')
+            ->pluck('setting_value','setting_name')
+            ->toArray();
+        if(empty($setting_map['lock_number'])) return; //是否使用锁定库存
+
+        //产品数扣减
+        if(! empty($save_total)){
+            foreach ($save_total as $key => $value){
+                if(! isset($submit_total[$key])){
+                    $submit_total[$key] = - $value;
+                }else{
+                    $submit_total[$key] = $submit_total[$key] - $value;
+                }
+            }
+        }
+        //更新锁定库存
+        foreach ($submit_total as $key => $value){
+            $product_id = $key;
+
+            ProductInventory::where('product_id',$product_id)
+                ->update(['lock_number' => DB::raw('lock_number + ('. $value . ')')]);
+        }
+    }
+
+    //比较库存
+    public static function compareStock($product_id = [],$data){
+        if(empty($product_id) || empty($data['product'])) return [false,'比较参数不能为空'];
+
+        $pro = Product::whereIn('id',$product_id)
+            ->pluck('title','id')
+            ->toArray();
+        $setting_map = Setting::where('setting_name','lock_number')
+            ->pluck('setting_value','setting_name')
+            ->toArray();
+        $product_map = $data['product'];
+
+        //库存
+        $array = ProductInventory::whereIn('product_id',$product_id)
+            ->where('number','>',0)
+            ->select('id','product_id','number','crt_time','lock_number')
+            ->get()->toArray();
+
+        //已保存单据的产品数量
+        $map = [];
+        if(! empty($setting_map['lock_number']) && ! empty($data['order_number'])){
+            if(strpos($data['order_number'],InvoiceOrder::prefix) !== false){
+                $id = InvoiceOrder::where('order_number',$data['order_number'])
+                    ->where('del_time',0)
+                    ->value('id');
+                $model = new InvoiceOrderInfo();
+            }else{
+                foreach (Construction::$prefix as $value){
+                    if(strpos($data['order_number'],$value) !== false){
+                        $model = new ConstructionProductInfo();
+                    }
+                }
+                $id = Construction::where('order_number',$data['order_number'])
+                    ->where('del_time',0)
+                    ->value('id');
+            }
+            if(! empty($model) && ! empty($id)){
+                $save = $model->where('del_time',0)
+                    ->where('id',$id)
+                    ->select('product_id','number')
+                    ->get()->toArray();
+                foreach ($save as $value){
+                    $key = $value['product_id'];
+                    if(isset($map[$key])){
+                        $map[$key] += $value['number'];
+                    }else{
+                        $map[$key] = $value['number'];
+                    }
+                }
+            }
+        }
+
+        //比较
+        if(! empty($array)){
+            foreach ($array as $value){
+                if(! isset($product_map[$value['product_id']])) return [false,'产品不存在'];
+
+                if(! empty($setting_map['lock_number'])){//真实库存
+                    $tmp = $map[$value['product_id']] ?? 0;//已保存数量
+                    $tmp_lock = ($value['lock_number'] > 0 ? $value['lock_number'] : 0) - $tmp;
+                    $number = $value['number'] - ($tmp_lock > 0 ? $tmp_lock : 0);
+                }else{
+                    $number = $value['number'];
+                }
+                if($product_map[$value['product_id']] > $number) return [false,$pro[$value['product_id']] . '数量不足,当前数量:'. $number];
+            }
+        }
+
+        return [true,''];
+    }
+}

+ 2 - 15
app/Service/ProductService.php

@@ -369,9 +369,7 @@ class ProductService extends Service
         $title = BasicType::where('id',$customer['unit'])->value('title');
         $customer['unit_name'] = $title;
         //库存
-        $customer['product_inventory'] = [];
-        $inventory = $this->getProductInventory([$data['id']]);
-        if(! empty($inventory)) $customer['product_inventory'] = $inventory;
+        $customer['product_inventory'] = (new ProductInventoryService())->getRealStock([$data['id']]);
 
         $customer['img'] = $customer['file'] = $customer['depart'] = $customer['employee'] = [];
         $customer_info = ProductInfo::where('del_time',0)
@@ -428,7 +426,7 @@ class ProductService extends Service
 
         if($user['id'] != Employee::SPECIAL_ADMIN) {
             $user_id = $user['id'];
-            $depart_id = array_column($user['rule_depart'],'depart_id');
+            $depart_id = $user['depart_range'];
             $product_id = ProductRange::where('del_time',0)
                 ->where(function ($query) use($user_id, $depart_id) {
                     $query->where('employee_id',$user_id)
@@ -499,15 +497,4 @@ class ProductService extends Service
 
         return $data;
     }
-
-    public function getProductInventory($product_id = []){
-        if(empty($product_id)) return [];
-
-        $result = ProductInventory::whereIn('product_id',$product_id)
-            ->select('id','product_id','number','lock_number')
-            ->get()
-            ->toArray();
-
-        return $result;
-    }
 }