Procházet zdrojové kódy

库存逻辑校验更新,
还未上传指派后库存校验

cqpCow před 1 rokem
rodič
revize
71b05c498f

+ 5 - 2
app/Http/Middleware/CheckLogin.php

@@ -3,6 +3,7 @@
 namespace App\Http\Middleware;
 
 use App\Model\Depart;
+use App\Model\ProductInventorySet;
 use App\Service\EmployeeService;
 use Closure;
 use App\Service\TokenService;
@@ -57,8 +58,10 @@ class CheckLogin
         $data['head'] = $return[5] ?? [];
         //是否是总公司下的人
         $data['is_behind_main'] = $return[6] ?? 0;
-        //是否库存校验
-        $data['is_check_stock'] = true;
+        //是否库存校验(默认校验)
+        $my_top = $user['depart_top'][0] ?? [];
+        $is_check_stock = empty($my_top['is_stock']) ? ProductInventorySet::type_one : $my_top['is_stock'];
+        $data['is_check_stock'] = $is_check_stock;
 
         //写入user信息
         $request->userData = $data;

+ 5 - 2
app/Http/Middleware/CheckWx.php

@@ -3,6 +3,7 @@
 namespace App\Http\Middleware;
 
 use App\Model\Employee;
+use App\Model\ProductInventorySet;
 use App\Model\WxEmployee;
 use App\Service\EmployeeService;
 use App\Service\Wx\WxEmployeeService;
@@ -77,8 +78,10 @@ class CheckWx
             $data['head'] = $return[5] ?? [];
             //是否是总公司下的人
             $data['is_behind_main'] = $return[6] ?? 0;
-            //是否库存校验
-            $data['is_check_stock'] = true;
+            //是否库存校验(默认校验)
+            $my_top = $user['depart_top'][0] ?? [];
+            $is_check_stock = empty($my_top['is_stock']) ? ProductInventorySet::type_one : $my_top['is_stock'];
+            $data['is_check_stock'] = $is_check_stock;
 
             $request->userData = $data;
         }

+ 2 - 0
app/Model/OrderOperation.php

@@ -13,6 +13,7 @@ class OrderOperation extends Model
     protected $dateFormat = 'U';
 
     //审批操作对应的数值
+    const zero = 0;
     const one = 1;
     const two = 2;
     const three = 3;
@@ -35,6 +36,7 @@ class OrderOperation extends Model
     const twenty = 20;
 
     public static $type = [
+        self::zero => '系统设置变更 ',
         self::one => '线上派单',
         self::two => '门店派单',
         self::three => '合同确认',

+ 6 - 2
app/Model/ProductInventorySet.php

@@ -11,6 +11,10 @@ class ProductInventorySet extends UseScopeBaseModel
     const CREATED_AT = 'crt_time';
     const UPDATED_AT = 'upd_time';
     protected $dateFormat = 'U';
-    const type_one = 1;//校验锁定
-    const type_two = 2;//不校验锁定
+    const type_one = 1;//校验库存
+    const type_two = 2;//不校验证库存
+    public static $type_name = [
+        self::type_one => '是',
+        self::type_two => '否',
+    ];
 }

+ 12 - 24
app/Service/CheckService.php

@@ -1001,7 +1001,7 @@ class CheckService extends Service
     }
 
     //更新库存
-    public function changeInventory($data,$order){
+    public function changeInventory($data,$order,$user){
         $number_symbol = "";
         if(in_array($data['opt_case'],self::$in_opt)){
             $number_symbol = ">";
@@ -1055,15 +1055,8 @@ class CheckService extends Service
             }
         }
 
-        //是否锁定
-        $lock = 0;
-        $depart = Depart::where('del_time',0)
-            ->where('is_main',1)
-            ->where('parent_id',0)
-            ->first();
-        $head = 0;
-        if(! empty($depart)) $head = $depart->id;//总社
-        if($head != $order['top_depart_id']) $lock = DB::table('depart_set')->where('top_depart_id',$order['top_depart_id'])->value('param_one');
+        //是否校验库存 是的话锁定数量要更新(根据当前操作人所在门店是否校验库存)
+        $lock = $user['is_check_stock'];
 
         $result = array_values($result);
         foreach ($result as $key => $value){
@@ -1076,6 +1069,7 @@ class CheckService extends Service
             if(empty($m)){
                 ProductInventory::insert($result[$key]);
             }else{
+                //锁定数量
                 $lock_number_tmp = 0;
                 if($lock && ! empty($lock_number[$keys])) $lock_number_tmp = $lock_number[$keys];
 
@@ -1093,7 +1087,7 @@ class CheckService extends Service
     }
 
     //业务单据审批通过后 驳回 更新库存
-    public function changeInventoryReject($data,$order){
+    public function changeInventoryReject($data,$order,$user){
         $number_symbol = "";
         if(in_array($data['opt_case'],self::$in_opt)){
             $number_symbol = "<";
@@ -1147,15 +1141,8 @@ class CheckService extends Service
             }
         }
 
-        //是否锁定
-        $lock = 0;
-        $depart = Depart::where('del_time',0)
-            ->where('is_main',1)
-            ->where('parent_id',0)
-            ->first();
-        $head = 0;
-        if(! empty($depart)) $head = $depart->id;//总社
-        if($head != $order['top_depart_id']) $lock = DB::table('depart_set')->where('top_depart_id',$order['top_depart_id'])->value('param_one');
+        //是否校验库存 是的话锁定数量要更新(根据当前操作人所在门店是否校验库存)
+        $lock = $user['is_check_stock'];
 
         $result = array_values($result);
         foreach ($result as $key => $value){
@@ -1168,6 +1155,7 @@ class CheckService extends Service
             if(empty($m)){
                 ProductInventory::insert($result[$key]);
             }else{
+                //锁定数量
                 $lock_number_tmp = 0;
                 if($lock && ! empty($lock_number[$keys])) $lock_number_tmp = $lock_number[$keys];
 
@@ -1186,6 +1174,7 @@ class CheckService extends Service
 
     public function createRecordAndInventory($data = []){
         if(empty($data['type']) || empty($data['opt_case']) || empty($data['order_number'])) return [false, ''];
+        $user = $data['user_data'] ?? [];
 
         if($data['type'] == self::TYPE_THREE){
             //通过后弃审
@@ -1216,7 +1205,7 @@ class CheckService extends Service
                     }
 
                     //库存
-                    $bool = $this->changeInventoryReject($data,$order);
+                    $bool = $this->changeInventoryReject($data,$order,$user);
                     if(! $bool){
                         DB::rollBack();
                         return [false, ''];
@@ -1224,7 +1213,6 @@ class CheckService extends Service
                 }
 
                 if(! empty(self::$operation_order_reject[$data['opt_case']])){
-                    $user = $data['user_data'] ?? [];
                     $type = self::$operation_order_reject[$data['opt_case']];
                     (new OrderOperationService())->add([
                         'order_number' => $order['order_number'],
@@ -1265,7 +1253,7 @@ class CheckService extends Service
                             return [false, $msg];
                         }
                         //库存
-                        $bool = $this->changeInventory($data, $order);
+                        $bool = $this->changeInventory($data, $order, $user);
                         if(! $bool) {
                             DB::rollBack();
                             return [false, $msg];
@@ -1317,7 +1305,7 @@ class CheckService extends Service
                         return [false, $msg];
                     }
                     //库存
-                    list($bool,$msg) = $this->changeInventory($data, $order);
+                    list($bool,$msg) = $this->changeInventory($data, $order, $user);
                     if(! $bool) {
                         DB::rollBack();
                         return [false, $msg];

+ 52 - 32
app/Service/ProductInventoryService.php

@@ -9,6 +9,7 @@ use App\Model\Depart;
 use App\Model\InOutRecord;
 use App\Model\InvoiceOrder;
 use App\Model\InvoiceOrderInfo;
+use App\Model\OrderOperation;
 use App\Model\Product;
 use App\Model\ProductCategory;
 use App\Model\ProductInventory;
@@ -93,24 +94,28 @@ class ProductInventoryService extends Service
         return $return;
     }
 
+    //暂时关闭 没用
     public static function is_check(&$user,$data){
+        return;
         //是否校验库存
         $top_depart_id = $user['head']['id'] ?? 0;//总公司id
-        if($data['top_depart_id'] == $top_depart_id) $user['is_check_stock'] = false;
+        if($data['top_depart_id'] == $top_depart_id) {
+            $user['is_check_stock'] = false;
+        }else{
+            $set = ProductInventorySet::where('top_depart_id',$data['top_depart_id'])
+                ->where('del_time',0)
+                ->first();
+            if(! empty($set) && ! $set->param_one) $user['is_check_stock'] = false;
+        }
     }
 
     //更新锁定库存
     //$user 当前登录人的信息
     //$submit_total (提交的数据)  $save_total(保存过的数据)
     public static function changeLockNumber($user, $submit_total = [], $save_total = []){
-        if(empty($user['is_check_stock'])) return; //不校验库存
+        if($user['is_check_stock'] == ProductInventorySet::type_two) return; //不校验库存
         if(empty($submit_total) && empty($save_total)) return;
 
-        //是否使用锁定库存校验  默认使用
-        $depart = array_shift($user['rule_depart']);
-        $is_stock = empty($depart['is_stock']) ? 1 : $depart['is_stock'];
-        if($is_stock == ProductInventorySet::type_two) return;
-
         //产品数扣减
         if(! empty($save_total)){
             foreach ($save_total as $key => $value){
@@ -133,45 +138,41 @@ class ProductInventoryService extends Service
 
     //比较库存
     public static function compareStock($user, $product_id = [],$product_submit = [], $product_save = []){
-        if(empty($user['is_check_stock'])) return [true,'']; //不校验库存
+        if($user['is_check_stock'] == ProductInventorySet::type_two) return [true,'']; //不校验库存
         if(empty($product_id) || empty($product_submit)) return [false,'比较参数不能为空'];
 
         //库存
         $array = ProductInventory::whereIn('product_id', $product_id)
             ->select('id','product_id','number','crt_time','lock_number','storehouse_id')
             ->get()->toArray();
-        if(empty($array)) return [false,'产品库存数据不存在'];
+        if(empty($array)) return [false,'产品库存不存在'];
+        //产品库存字典
         $stock = [];
         foreach ($array as $value){
             $key = $value['product_id'] . ',' . $value['storehouse_id'];
             $stock[$key] = $value;
         }
 
+        //产品字典
         $pro = Product::whereIn('id',$product_id)
             ->pluck('title','id')
             ->toArray();
-
-        //是否使用锁定库存校验  默认使用
-        $depart = array_shift($user['rule_depart']);
-        $is_stock = empty($depart['is_stock']) ? 1 : $depart['is_stock'];
-
         foreach ($product_submit as $key => $value){
             $tmp = explode(',',$key);
+            //产品ID
             $product_id = $tmp[0];
+            //产品名称
             $pro_title = $pro[$product_id] ?? '';
             if(! $pro_title) return [false,'异常产品数据'];
-            if(! isset($stock[$key])) return [false,'产品:'. $pro_title .'库存不存在'];
+            if(! isset($stock[$key])) return [false,'产品:'. $pro_title .'无库存记录'];
+            //产品库存
             $stock_product = $stock[$key];
 
-            if($is_stock == ProductInventorySet::type_one){
-                //校验锁定库存
-                $save_data = $product_save[$key] ?? 0;//已保存数量
-                $tmp_lock = ($stock_product['lock_number'] > 0 ? $stock_product['lock_number'] : 0) - $save_data;
-                $number = $stock_product['number'] - ($tmp_lock > 0 ? $tmp_lock : 0);
-            }else{
-                $number = $stock_product['number'];
-            }
-            if($value > $number) return [false, $pro_title. '数量不足,当前数量:' . $number];
+            //校验 =》 锁定库存
+            $save_data = $product_save[$key] ?? 0;//已保存数量
+            $tmp_lock = ($stock_product['lock_number'] > 0 ? $stock_product['lock_number'] : 0) - $save_data;
+            $number = $stock_product['number'] - ($tmp_lock > 0 ? $tmp_lock : 0);
+            if($value > $number) return [false, $pro_title. '数量不足,当前有效库存数量:' . $number];
         }
 
         return [true,''];
@@ -370,25 +371,44 @@ class ProductInventoryService extends Service
     //库存设置
     public function productInventorySet($data, $user){
         if(empty($data['id'])) return [false, 'ID不能为空'];
+        $set = ProductInventorySet::where('id',$data['id'])->first();
+        if(empty($set)) return [false,'系统设置不存在或已被删除'];
 
+        $msg = "";
         if(isset($data['param_one'])){
-            ProductInventorySet::where('id',$data['id'])
-                ->update(['param_one' => $data['param_one']]);
+            if(! isset(ProductInventorySet::$type_name[$data['param_one']])) return [false,'系统设置参数错误'];
+            if($set->param_one != $data['param_one']) {
+                $set->param_one = $data['param_one'];
+                $msg .= "库存校验状态变更为:" . ProductInventorySet::$type_name[$data['param_one']];
+            }
         }
 
         if(isset($data['param_two'])){
             $res = $this->checkNumber($data['param_two']);
             if(! $res) return [false, '整单扣除率请输入不超过两位小数并且大于0的数值'];
-            ProductInventorySet::where('id',$data['id'])
-                ->update(['param_two' => $data['param_two']]);
+            if($set->param_two != $data['param_two']) {
+                $set->param_two = $data['param_two'];
+                $msg .= ",整单扣除率变更为:" . $data['param_two'];
+            }
         }
 
         if(isset($data['param_three'])){
             $res = $this->checkNumber($data['param_three']);
-            if(! $res) return [false, '比例请输入不超过两位小数并且大于0的数值'];
-            if($data['param_three'] < 3) return [false,'比例不能小于3%'];
-            ProductInventorySet::where('id',$data['id'])
-                ->update(['param_three' => $data['param_three']]);
+            if(! $res) return [false, '施工费用比例请输入不超过两位小数并且大于0的数值'];
+            if($data['param_three'] < 3) return [false,'施工费用比例不能小于3%'];
+            if($set->param_three != $data['param_three']) {
+                $set->param_three = $data['param_three'];
+                $msg .= ",施工费用比例变更为:" . $data['param_three'];
+            }
+        }
+
+        if(! empty($msg)){
+            $set->save();
+            (new OrderOperationService())->add([
+                'order_number' => $data['id'],
+                'msg' => OrderOperation::$type[OrderOperation::zero] . $msg,
+                'type' => OrderOperation::zero
+            ],$user);
         }
 
         return [true, ''];