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 = [],$product_submit = [], $product_save = []){ if(empty($product_id) || empty($product_submit)) return [false,'比较参数不能为空']; //库存 $array = ProductInventory::whereIn('product_id',$product_id) ->where('number','>',0) ->select('id','product_id','number','crt_time','lock_number') ->get()->toArray(); if(empty($array)) 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(); //比较 foreach ($array as $value){ $pro_tmp = $pro[$value['product_id']] ?? ''; if(! $pro_tmp) return [false,'异常产品数据']; if(! isset($product_submit[$value['product_id']])) return [false,'产品:' . $pro_tmp.'库存不足']; if(! empty($setting_map['lock_number'])){//真实库存 $tmp = $product_save[$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_submit[$value['product_id']] > $number) return [false,$pro_tmp . '数量不足,当前数量:'. $number]; } return [true,'']; } //现存量 public function productInventoryList($data,$user){ $model = ProductInventory::from('product_inventory as a') ->join('product as b','b.id','a.product_id') ->select('a.product_id','a.id','a.number','b.title','b.code','b.product_category_id','b.unit','b.bar_code','a.crt_time') ->orderby('a.crt_time', 'desc'); if(! empty($data['product_category_id'])) $model->where("b.product_category_id", $data['product_category_id']); if(!empty($data['code'])) $model->where('b.code', 'LIKE', '%'.$data['code'].'%'); if(! empty($data['product_id'])) $model->where('a.product_id', $data['product_id']); if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) { $return = $this->changeDateToTimeStampAboutRange($data['crt_time']); $model->whereBetween('a.crt_time',[$return[0],$return[1]]); } $list = $this->limit($model,'',$data); $list = $this->fillListData($list); return [true, $list]; } public function fillListData($data){ if(empty($data['data'])) return $data; $category = ProductCategory::whereIn('id',array_column($data['data'],'product_category_id')) ->pluck('title','id') ->toArray(); foreach ($data['data'] as $key => $value){ $data['data'][$key]['product_category_title'] = $category[$value['product_category_id']] ?? ''; $data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d H:i:s",$value['crt_time']):''; } return $data; } }