MaterialRule($data,false); if(!$status) return [$status,$msg]; DB::beginTransaction(); try{ $time = time(); $model = new ApplyOrder(); $model = $model->where('id',$data['id'])->first(); $model->apply_id = $data['apply_id']; $model->apply_time = $data['apply_time'] ; $model->mark = $data['mark'] ?? ""; $model->storehouse_id = $data['storehouse_id']; $model->storehouse_title = $data['storehouse_title'] ?? ""; $model->type = $data['type']; $model->save(); $id = $model->id; ApplyOrderDetail::where('del_time',0)->where('apply_order_id',$id)->update([ 'del_time' => $time ]); $detail_insert = []; foreach ($data['order_data'] as $v){ $detail_insert[] = [ 'apply_order_id' => $id, 'data_id' => $v['id'], 'quantity' => $v['quantity'] ?? 0, 'product_no' => $v['product_no'] ?? "", 'product_title' => $v['product_title'] ?? "", 'product_size' => $v['product_size'] ?? "", 'product_unit' => $v['product_unit'] ?? "", 'technology_name' => $v['technology_name'] ?? "", //颜色 'top_product_title' => $v['top_product_title'] ?? "", 'top_product_no' => $v['top_product_title'] ?? "", 'type' => $data['type'], 'storehouse_id' => $data['storehouse_id'], 'crt_time' => $time, ]; } ApplyOrderDetail::insert($detail_insert); DB::commit(); }catch (\Exception $e){ DB::rollBack(); return [false,$e->getMessage()]; } return [true,'']; } public function MaterialAdd($data,$user){ list($status,$msg) = $this->MaterialRule($data); if(!$status) return [$status,$msg]; DB::beginTransaction(); try{ $time = time(); $model = new ApplyOrder(); $model->order_number = $data['order_number']; $model->apply_id = $data['apply_id']; $model->apply_time = $data['apply_time'] ; $model->mark = $data['mark'] ?? ""; $model->storehouse_id = $data['storehouse_id']; $model->storehouse_title = $data['storehouse_title'] ?? ""; $model->type = $data['type']; $model->crt_id = $user['id']; $model->save(); $id = $model->id; $detail_insert = []; foreach ($data['order_data'] as $v){ $detail_insert[] = [ 'apply_order_id' => $id, 'data_id' => $v['id'], 'quantity' => $v['quantity'] ?? 0, 'product_no' => $v['product_no'] ?? "", 'product_title' => $v['product_title'] ?? "", 'product_size' => $v['product_size'] ?? "", 'product_unit' => $v['product_unit'] ?? "", 'technology_name' => $v['technology_name'] ?? "", //颜色 'top_product_title' => $v['top_product_title'] ?? "", 'top_product_no' => $v['top_product_title'] ?? "", 'type' => $data['type'], 'storehouse_id' => $data['storehouse_id'], 'crt_time' => $time, ]; } ApplyOrderDetail::insert($detail_insert); DB::commit(); }catch (\Exception $e){ DB::rollBack(); return [false,$e->getMessage()]; } return [true, '']; } public function MaterialDel($data){ if($this->isEmpty($data,'id')) return [false,'ID必须!']; $apply = ApplyOrder::where('id',$data['id'])->first(); if($apply->del_time > 0) return [false,'申请单不存在或已被删除']; if($apply->state != ApplyOrder::state_zero) return [false, '申请单已审核,删除失败']; $time = time(); try { DB::beginTransaction(); $apply->del_time = $time; $apply->save(); ApplyOrderDetail::where('del_time', 0)->where('apply_order_id',$data['id'])->update([ 'del_time'=>time() ]); DB::commit(); }catch (\Throwable $exception){ DB::rollBack(); return [false, $exception->getMessage()]; } return [true,'']; } public function MaterialList($data){ $model = ApplyOrder::where('del_time',0) ->select('*') ->orderBy('id','desc'); if(isset($data['status'])) $model->where('status', $data['status']); if(! empty($data['type'])) $model->where('type', $data['type']); if(! empty($data['storehouse_title'])) $model->where('storehouse_title', 'LIKE', '%'.$data['storehouse_title'].'%'); if(! empty($data['order_number'])) $model->where('order_number', 'LIKE', '%'.$data['order_number'].'%'); if(! empty($data['apply_id'])) $model->where('apply_id', $data['apply_id']); if(! empty($data['crt_id'])) $model->where('crt_id', $data['crt_id']); if(! empty($data['apply_time'][0]) && ! empty($data['apply_time'][1])) $model->whereBetween('apply_time',[$data['apply_time'][0],$data['apply_time'][1]]); if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) $model->whereBetween('crt_time',[$data['crt_time'][0],$data['crt_time'][1]]); $list = $this->limit($model,'',$data); $list = $this->fillData($list); return [true,$list]; } public function fillData($data){ if(empty($data['data'])) return $data; $emp = Employee::whereIn('id',array_merge_recursive(array_unique(array_column($data['data'],'crt_id')), array_unique(array_column($data['data'],'apply_id')))) ->pluck('emp_name','id') ->toArray(); foreach ($data['data'] as $key => $value){ $data['data'][$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d H:i:s',$value['crt_time']) : ''; $data['data'][$key]['status_title'] = ApplyOrder::$state_name[$value['status']] ?? ""; $data['data'][$key]['crt_name'] = $emp[$value['crt_id']] ?? ''; $data['data'][$key]['apply_name'] = $emp[$value['apply_id']] ?? ''; } return $data; } public function MaterialDetail($data){ if($this->isEmpty($data,'id')) return [false,'ID不能为空!']; $id = $data['id']; $detail = ApplyOrder::where('del_time',0) ->where('id',$id) ->first(); if(empty($detail)) return [false,'申请单不存在或已被删除']; $detail = $detail->toArray(); $detail['apply_title'] = Employee::where('id', $detail['apply_id'])->value('emp_name'); $apply_d = ApplyOrderDetail::where('del_time', 0) ->where('apply_order_id', $id) ->get()->toArray(); $apply_id = array_column($apply_d, 'data_id'); $d = []; if($detail['type'] == ApplyOrder::type_one){ $d = DispatchSub::where('del_time',0) ->whereIn('id', $apply_id) ->select('id', 'dispatch_no as order_no', 'product_title','technology_name','wood_name','product_no','order_product_id','crt_time') ->get()->toArray(); $args = ""; foreach ($d as $value){ $args = "(order_product_id = {$value['order_product_id']} and crt_time = {$value['crt_time']}) OR "; } $args = rtrim($args, 'OR '); $d_no_map = []; $d_no = DispatchSub::where('del_time',0) ->whereRaw($args) ->select('dispatch_no as order_no','order_product_id','crt_time') ->get()->toArray(); foreach ($d_no as $value){ if(isset($d_no_map[$value['order_product_id'] . $value['crt_time']])){ if(! in_array($value['order_no'], $d_no_map[$value['order_product_id'] . $value['crt_time']])) $d_no_map[$value['order_product_id'] . $value['crt_time']][] = $value['order_no']; }else{ $d_no_map[$value['order_product_id'] . $value['crt_time']][] = $value['order_no']; } } }elseif ($detail['type'] == ApplyOrder::type_two){ $d = DispatchSub::where('del_time',0) ->whereIn('id', $apply_id) ->select('id', 'dispatch_no as order_no','technology_name','wood_name','order_product_id','crt_time') ->get()->toArray(); $args = ""; foreach ($d as $value){ $args = "(order_product_id = {$value['order_product_id']} and crt_time = {$value['crt_time']}) OR "; } $args = rtrim($args, 'OR '); $d_no_map = []; $d_no = DispatchSub::where('del_time',0) ->whereRaw($args) ->select('dispatch_no as order_no','order_product_id','crt_time') ->get()->toArray(); foreach ($d_no as $value){ if(isset($d_no_map[$value['order_product_id'] . $value['crt_time']])){ if(! in_array($value['order_no'], $d_no_map[$value['order_product_id'] . $value['crt_time']])) $d_no_map[$value['order_product_id'] . $value['crt_time']][] = $value['order_no']; }else{ $d_no_map[$value['order_product_id'] . $value['crt_time']][] = $value['order_no']; } } }elseif ($detail['type'] == ApplyOrder::type_three){ $d = Box::where('del_time',0) ->whereIn('id', $apply_id) ->select('id', 'order_no') ->get()->toArray(); }elseif ($detail['type'] == ApplyOrder::type_four){ $d = Box::where('del_time',0) ->whereIn('id', $apply_id) ->select('id', 'order_no') ->get()->toArray(); } $d_tmp = array_column($d,null,'id'); $return = []; foreach ($apply_d as $t){ $tmp = $d_tmp[$t['data_id']] ?? []; $technology_name = ! empty($t['technology_name']) ? $t['technology_name'] : $tmp['technology_name'] ?? ""; $wood_name = ! empty($t['wood_name']) ? $t['wood_name'] : $tmp['wood_name'] ?? ""; $top_product_title = ! empty($t['top_product_title']) ? $t['top_product_title'] : $tmp['product_title'] ?? ""; $top_product_no = ! empty($t['top_product_no']) ? $t['top_product_no'] : $tmp['product_no'] ?? ""; if(! empty($tmp['order_product_id']) && ! empty($tmp['crt_time']) && isset($d_no_map[$tmp['order_product_id'] . $tmp['crt_time']])){ $order_no = implode(',', $d_no_map[$tmp['order_product_id'] . $tmp['crt_time']]); }else{ $order_no = $tmp['order_no'] ?? ""; } if($t['type'] == ApplyOrder::type_two || $t['type'] == ApplyOrder::type_three){ $product_unit = "吨"; }else{ $product_unit = $t['product_unit'] ?? ""; } $return[] = [ 'id' => $t['data_id'] ?? 0, 'quantity' => $t['quantity'] ?? 0, 'product_no' => $t['product_no'] ?? "", 'product_title' => $t['product_title'] ?? "", 'product_size' => $t['product_size'] ?? "", 'product_unit' => $product_unit, 'top_product_title' => $top_product_title, 'top_product_no' => $top_product_no, 'technology_name' => $technology_name, //颜色 'wood_name' => $wood_name, 'order_no' => $order_no, ]; } $detail['order_data'] = $return; return [true, $detail]; } public function MaterialRule(&$data,$is_add = true){ if($this->isEmpty($data,'apply_id')) return [false,'申请人不能为空']; if($this->isEmpty($data,'apply_time')) return [false,'申请时间不能为空']; if($this->isEmpty($data,'storehouse_id')) return [false,'仓库不能为空']; if($this->isEmpty($data,'type')) return [false,'申请单类型不能为空']; if(empty($data['order_data'])) return [false, '申请单详细信息不能为空']; foreach ($data['order_data'] as $value){ if(empty($value['id'])) return [false, '申请单详细信息ID不能为空']; if($data['type'] != ApplyOrder::type_three){ if(empty($value['quantity'])) return [false, '申请单详细信息数量不能为空']; } } $id = array_unique(array_column($data['order_data'],'id')); if($data['type'] == ApplyOrder::type_one){ $dispatch = DispatchSub::where('del_time',0) ->whereIn('id', $id) ->select('id', 'dispatch_no', 'status') ->get()->toArray(); if(count($dispatch) != count($id)) return [false, '派工单信息错误,请重新选择']; }elseif ($data['type'] == ApplyOrder::type_two){ $dispatch = DispatchSub::where('del_time',0) ->whereIn('id', $id) ->select('id', 'dispatch_no', 'status') ->get()->toArray(); if(count($dispatch) != count($id)) return [false, '完工单信息错误,请重新选择']; }elseif ($data['type'] == ApplyOrder::type_three){ $box = Box::where('del_time',0) ->whereIn('id', $id) ->select('id', 'order_no', 'status') ->get()->toArray(); if(count($box) != count($id)) return [false, '包装单信息错误,请重新选择']; }elseif ($data['type'] == ApplyOrder::type_four){ $box = Box::where('del_time',0) ->whereIn('id', $id) ->select('id', 'order_no', 'status') ->get()->toArray(); if(count($box) != count($id)) return [false, '包装单信息错误,请重新选择']; }else{ return [false, '申请单类型错误']; } if($is_add){ $data['order_number'] = $this->setOrderNO($data['type']); if(empty($data['order_number'])) return [false, '申请单唯一标识生成失败']; }else{ if(empty($data['id'])) return [false, '申请单唯一标识不能为空']; if(empty($data['order_number'])) return [false, '申请单唯一标识不能为空']; $apply = ApplyOrder::where('id', $data['id'])->where('del_time', 0)->first(); if(empty($apply)) return [false, '申请单不存在或已被删除']; if($apply->status != 0) return [false, '申请单已审核,编辑失败']; } return [true,'']; } public function setOrderNO($type = ""){ $str = date('Ymd',time()); $order_number = ApplyOrder::where('order_number','Like','%'. $str . '%') ->where('type', $type) ->max('order_number'); if(empty($order_number)){ $number = str_pad(1,3,'0',STR_PAD_LEFT); $number = $str . $number; }else{ $tmp = substr($order_number, -3); $tmp = $tmp + 1; //超过999 if(strlen($tmp) > 3) return ''; $number = str_pad($tmp,3,'0',STR_PAD_LEFT); $number = $str . $number; } return $number; } public function createSQ($data, $user, $type = 0, $status = 1){ if(empty($data) || empty($type)) return [false, '自动生成申请单参数不能为空']; if($type == ApplyOrder::type_one){ $storehouse_id = "001"; $storehouse_title = "原料仓"; }elseif ($type == ApplyOrder::type_two){ $storehouse_id = "004"; $storehouse_title = "待清洗原材料仓"; }elseif ($type == ApplyOrder::type_three){ $storehouse_id = "002"; $storehouse_title = "产成品仓"; }else{ $storehouse_id = "003"; $storehouse_title = "包材、辅料仓" ; } try{ DB::beginTransaction(); $order_number = $this->setOrderNO($type); // list($status,$msg) = $this->limitingSendRequestBackg("spAdd" . $order_number . $type); // if(! $status) return [false, $msg]; $time = time(); $model = new ApplyOrder(); $model->order_number = $order_number; $model->apply_id = $user['id']; $model->apply_time = time(); $model->storehouse_id = $storehouse_id; $model->storehouse_title = $storehouse_title; $model->type = $type; $model->status = $status; //是否审核 $model->save(); $id = $model->id; $detail_insert = []; foreach ($data as $v){ $detail_insert[] = [ 'apply_order_id' => $id, 'data_id' => $v['id'], 'quantity' => $v['quantity'] ?? 0, 'product_no' => $v['product_no'] ?? "", 'product_title' => $v['product_title'] ?? "", 'product_size' => $v['product_size'] ?? "", 'product_unit' => $v['product_unit'] ?? "", 'technology_name' => $v['technology_name'] ?? "", 'wood_name' => $v['wood_name'] ?? "", 'top_product_no' => $v['top_product_no'] ?? "", 'top_product_title' => $v['top_product_title'] ?? "", 'type' => $type, 'storehouse_id' => $storehouse_id, 'crt_time' => $time, ]; } ApplyOrderDetail::insert($detail_insert); DB::commit(); }catch (\Exception $e){ DB::rollBack(); return [false,$e->getMessage()]; } return [true, $id]; } //流水 public function createRecord($id){ $record = ApplyOrderDetail::where('apply_order_id', $id) ->where('del_time',0) ->get()->toArray(); if(empty($record)) return [false, '申请单明细数据不存在或已被删除']; try{ DB::beginTransaction(); $time = time(); $insert = []; foreach ($record as $value){ if(empty($value['product_no'])) continue; if($value['type'] == ApplyOrder::type_one){ $number = - $value['quantity']; }else{ $number = $value['quantity']; } $insert[] = [ 'apply_order_id' => $id, 'product_no' => $value['product_no'], 'number' => $number, 'type' => $value['type'], 'storehouse_id' => $value['storehouse_id'], 'crt_time' => $time, ]; } if(! empty($insert)) InOutRecord::insert($insert); DB::commit(); }catch (\Exception $e){ DB::rollBack(); return [false,$e->getMessage()]; } return [true, '']; } }