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,'']; } }