max('dispatch_no'); 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; //超过99999 if(strlen($tmp) > 3) return ''; $number = str_pad($tmp,3,'0',STR_PAD_LEFT); $number = $str . $number; } return $number; } public function add($data,$user){ //数据校验以及填充 list($status,$msg) = $this->orderRule($data); if(!$status) return [$status,$msg]; try{ DB::beginTransaction(); if($data['is_split']){ foreach ($msg as $value){ $this->insertDispatch([$value],$data,$user); } }else{ $this->insertDispatch($msg,$data,$user); } //反写已派工数量 $this->writeDispatchQuantity(array_column($msg,'order_product_id')); DB::commit(); }catch (\Exception $e){ DB::rollBack(); return [false,$e->getLine().':'.$e->getMessage()]; } return [true,'']; } public function makeData($equipment_id, $team_id,$employee_id,$message){ $arr = []; if(! empty($equipment_id)){ foreach ($equipment_id as $v_e){ if(! empty($team_id)){ foreach ($team_id as $t){ if(! empty($employee_id)){ foreach ($employee_id as $e){ $arr[] = [ 'equipment_id' => $v_e, 'team_id' => $t, 'employee_id' => $e, 'order_product_id' => $message['order_product_id'], 'dispatch_no' => $message['dispatch_no'], ]; } }else{ $arr[] = [ 'equipment_id' => $v_e, 'team_id' => $t, 'order_product_id' => $message['order_product_id'], 'dispatch_no' => $message['dispatch_no'], ]; } } }elseif(! empty($employee_id)){ foreach ($employee_id as $e){ $arr[] = [ 'equipment_id' => $v_e, 'employee_id' => $e, 'order_product_id' => $message['order_product_id'], 'dispatch_no' => $message['dispatch_no'], ]; } }else{ $arr[] = [ 'equipment_id' => $v_e, 'order_product_id' => $message['order_product_id'], 'dispatch_no' => $message['dispatch_no'], ]; } } }elseif (! empty($team_id)){ foreach ($team_id as $t){ if(! empty($employee_id)){ foreach ($employee_id as $e){ $arr[] = [ 'team_id' => $t, 'employee_id' => $e, 'order_product_id' => $message['order_product_id'], 'dispatch_no' => $message['dispatch_no'], ]; } }else{ $arr[] = [ 'team_id' => $t, 'order_product_id' => $message['order_product_id'], 'dispatch_no' => $message['dispatch_no'], ]; } } }elseif(! empty($employee_id)){ foreach ($employee_id as $e){ $arr[] = [ 'employee_id' => $e, 'order_product_id' => $message['order_product_id'], 'dispatch_no' => $message['dispatch_no'], ]; } } return $arr; } public function insertDispatch($msg, $data, $user){ //生产数据的源数据 $result = $msg; $time = time(); $dispatch_no = $this->setOrderNO(); //主表 Dispatch::insert(['dispatch_no' => $dispatch_no,'crt_time' => $time]); $time_tmp = date("Ymd", $data['out_order_no_time'][0]); $process_model = new OrdersProductProcess(['channel' => $time_tmp]); $equipment_id = is_array($data['equipment_id']) ? $data['equipment_id'] : [$data['equipment_id']]; $equipment_id = array_filter($equipment_id); $team_id = is_array($data['team_id']) ? $data['team_id'] : [$data['team_id']]; $team_id = array_filter($team_id); $insert_emp_sub = []; foreach ($result as $key => $value){ $result[$key]['dispatch_no'] = $dispatch_no; $result[$key]['process_id'] = $data['process_id']; $result[$key]['dispatch_time_start'] = $data['dispatch_time'][0]; $result[$key]['dispatch_time_end'] = $data['dispatch_time'][1]; $result[$key]['dispatch_quantity'] = $value['quantity']; $result[$key]['crt_time'] = $time; $result[$key]['crt_id'] = $user['id']; $tmp = $this->makeData($equipment_id,$team_id,$data['employee_id'],$result[$key]); $insert_emp_sub = array_merge_recursive($insert_emp_sub,$tmp); $process_model->where('order_product_id',$value['order_product_id']) ->where('process_id',$data['process_id']) ->where('dispatch_no','') ->take($value['quantity']) ->update([ 'dispatch_no' => $dispatch_no, 'status' => 1 ]); unset($result[$key]['quantity']); } DispatchSub::insert($result); if(! empty($insert_emp_sub)) DispatchEmpSub::insert($insert_emp_sub); } public function del($data){ if($this->isEmpty($data,'id')) return [false,'ID不能为空!']; return [true,'删除成功']; } public function orderDetail($data){ return [200,'']; } public function is_same_month($timestamp1,$timestamp2){ // 格式化时间戳为年份和月份 $year1 = date('Y', $timestamp1); $month1 = date('m', $timestamp1); $year2 = date('Y', $timestamp2); $month2 = date('m', $timestamp2); if ($year1 === $year2 && $month1 === $month2) { return true; } else { return false; } } public function orderList($data){ list($status,$msg) = $this->orderListRule($data); if(! $status) return [false, $msg]; $model = OrdersProduct::where('del_time',0) ->select('id','order_no','out_order_no','out_order_no_time','customer_no','customer_name','table_header_mark','product_no','product_title','product_size','product_unit','order_quantity','technology_material','technology_name','wood_name','process_mark','table_body_mark','out_crt_man','out_checker_man','out_checker_time','production_quantity','production_time','production_no','status','crt_id','dispatch_complete_quantity') ->whereBetween('out_order_no_time',[$data['out_order_no_time'][0],$data['out_order_no_time'][1]]) ->whereIn('id',$msg) ->orderBy('id','desc'); if(! empty($data['order_no'])) $model->where('order_no', 'LIKE', '%'.$data['order_no'].'%'); if(! empty($data['out_order_no'])) $model->where('out_order_no', 'LIKE', '%'.$data['out_order_no'].'%'); if(! empty($data['production_no'])) $model->where('production_no', 'LIKE', '%'.$data['production_no'].'%'); if(! empty($data['customer_name'])) $model->where('customer_name', 'LIKE', '%'.$data['customer_name'].'%'); if(! empty($data['product_title'])) $model->where('product_title', 'LIKE', '%'.$data['product_title'].'%'); if(! empty($data['product_size'])) $model->where('product_size', 'LIKE', '%'.$data['product_size'].'%'); if(! empty($data['technology_material'])) $model->where('technology_material', 'LIKE', '%'.$data['technology_material'].'%'); if(! empty($data['technology_name'])) $model->where('technology_name', 'LIKE', '%'.$data['technology_name'].'%'); if(! empty($data['wood_name'])) $model->where('wood_name', 'LIKE', '%'.$data['wood_name'].'%'); if(! empty($data['process_mark'])) $model->where('process_mark', 'LIKE', '%'.$data['process_mark'].'%'); if(! empty($data['table_header_mark'])) $model->where('table_header_mark', 'LIKE', '%'.$data['table_header_mark'].'%'); if(! empty($data['table_body_mark'])) $model->where('table_body_mark', 'LIKE', '%'.$data['table_body_mark'].'%'); if(! empty($data['out_checker_man'])) $model->where('out_checker_man', 'LIKE', '%'.$data['out_checker_man'].'%'); if(! empty($data['out_crt_man'])) $model->where('out_crt_man', 'LIKE', '%'.$data['out_crt_man'].'%'); if(! empty($data['out_checker_time'][0]) && ! empty($data['out_checker_time'][1])) $model->whereBetween('out_checker_time',[$data['out_checker_time'][0],$data['out_checker_time'][1]]); if(! empty($data['production_time'][0]) && ! empty($data['production_time'][1])) $model->whereBetween('production_time',[$data['production_time'][0],$data['production_time'][1]]); if(isset($data['status'])) $model->where('status',$data['status']); if(isset($data['is_create'])) { if($data['is_create']){ $model->whereColumn('dispatch_complete_quantity', '>=', 'production_quantity'); }else{ $model->whereColumn('production_quantity', '>', 'dispatch_complete_quantity'); } } $list = $this->limit($model,'',$data); $list = $this->fillData($list); return [true,$list]; } public function orderListRule($data){ if(empty($data['process_id'])) return [false, '工序必须选择!']; if(empty($data['out_order_no_time'][0]) || empty($data['out_order_no_time'][1])) return [false,'制单日期必须选择']; $bool = $this->is_same_month($data['out_order_no_time'][0],$data['out_order_no_time'][1]); if(! $bool) return [false,'制单日期必须同月!']; $time = date("Ymd",$data['out_order_no_time'][0]); $process_model = new OrdersProductProcess(['channel' => $time]); if(! $process_model->is_table_isset()) return [true, []];//不存在process子表 返回空数据 $process_array = $process_model->where('del_time',0) ->where('process_id',$data['process_id']) ->distinct() ->select('order_product_id') ->get()->toArray(); $order_product_id = array_column($process_array,'order_product_id'); if(empty($order_product_id)) return [true,[]];//process子表无数据 返回空数据 return [true, $order_product_id]; } public function orderRule($data){ if($this->isEmpty($data,'id')) return [false,'请选择数据!']; if($this->isEmpty($data,'quantity')) return [false,'请填写数量!']; if(in_array(false, $data['quantity'], true) || in_array(0, $data['quantity'], true) || in_array('', $data['quantity'], true))return [false,'数量不能为空!']; if(empty($data['dispatch_time'][0]) || empty($data['dispatch_time'][1])) return [false,'计划生产时间不能为空!']; if(empty($data['out_order_no_time'][0]) || empty($data['out_order_no_time'][1])) return [false,'制单时间不能为空!']; if($this->isEmpty($data,'process_id')) return [false,'工序不能为空!']; if(! isset($data['is_split'])) return [false,'是否拆分标识不能为空!']; $result = OrdersProduct::whereIn('id',$data['id']) ->select('id as order_product_id','sale_orders_product_id','order_no','table_header_mark','product_no','product_title','product_size','product_unit','production_quantity','technology_material','technology_name','wood_name','process_mark','table_body_mark','sale_orders_product_id','out_order_no_time','price','customer_name','out_order_no','customer_no') ->orderBy('id','desc') ->get()->toArray(); $result_map = array_column($result,null,'order_product_id'); //已派工数据 $map = $this->getDispatchQuantity($data['id']); $total_map = $return = []; foreach ($data['id'] as $key => $value){ if(isset($total_map[$value])){ $total_map[$value] += $data['quantity'][$key]; }else{ $total_map[$value] = $data['quantity'][$key]; } $tmp = $result_map[$value]; $tmp['quantity'] = $data['quantity'][$key]; $return[] = $tmp; } foreach ($result as $key => $value){ //数据校验 $quantity_tmp = $total_map[$value['order_product_id']]; if(isset($map[$value['order_product_id']])){ if($map[$value['order_product_id']] + $quantity_tmp > $value['production_quantity']) return [false,'派单数量不能大于生产订单数量']; }else{ if($quantity_tmp > $value['production_quantity']) return [false,'派单数量不能大于生产订单数量']; } } return [true, $return]; } public function fillData($data){ if(empty($data['data'])) return $data; $map = $this->getDispatchQuantity(array_column($data['data'],'id')); $emp_map = Employee::whereIn('id',array_column($data['data'],'crt_id')) ->pluck('emp_name','id') ->toArray(); foreach ($data['data'] as $key => $value){ $data['data'][$key]['out_order_no_time'] = $value['out_order_no_time'] ? date('Y-m-d',$value['out_order_no_time']) : ''; $data['data'][$key]['out_checker_time'] = $value['out_checker_time'] ? date('Y-m-d',$value['out_checker_time']) : ''; $data['data'][$key]['production_time'] = $value['production_time'] ? date('Y-m-d',$value['production_time']) : ''; $data['data'][$key]['dispatch_quantity'] = $map[$value['id']] ?? 0; $data['data'][$key]['not_dispatch_quantity'] = $value['production_quantity'] - ($map[$value['id']] ?? 0); $data['data'][$key]['order_product_man'] = $emp_map[$value['crt_id']] ?? ''; if($value['dispatch_complete_quantity'] >= $value['production_quantity']){ $data['data'][$key]['is_create'] = 1; }else{ $data['data'][$key]['is_create'] = 0; } } $data['production_quantity'] = array_sum(array_column($data['data'], 'production_quantity')); $data['dispatch_quantity'] = array_sum(array_column($data['data'], 'dispatch_quantity')); $data['not_dispatch_quantity'] = array_sum(array_column($data['data'], 'not_dispatch_quantity')); return $data; } //返回已派工数量 public function getDispatchQuantity($order_product_id = []){ if(empty($order_product_id)) return []; $result = DispatchSub::where('del_time',0) ->whereIn("order_product_id",$order_product_id) ->select(DB::raw("sum(dispatch_quantity) as dispatch_quantity"),'order_product_id') ->groupby('order_product_id') ->pluck('dispatch_quantity','order_product_id') ->toArray(); return $result; } public function dispatchOrderList($data){ $model = DispatchSub::where('del_time',0) ->select('id','order_no','table_header_mark','product_no','product_title','product_size','product_unit','dispatch_quantity','technology_material','technology_name','wood_name','process_mark','table_body_mark','production_quantity','dispatch_no','status','crt_id','process_id','dispatch_time_start','dispatch_time_end','crt_time','finished_num','waste_num','customer_name','order_product_id','out_order_no') ->orderBy('id','desc'); if(isset($data['finished_num'])) $model->where('finished_num', '>',0); if(! empty($data['order_no'])) $model->where('order_no', 'LIKE', '%'.$data['order_no'].'%'); if(! empty($data['dispatch_no'])) $model->where('dispatch_no', 'LIKE', '%'.$data['dispatch_no'].'%'); if(! empty($data['process_id'])) $model->where('process_id',$data['process_id']); if(! empty($data['technology_material'])) $model->where('technology_material', 'LIKE', '%'.$data['technology_material'].'%'); if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) $model->whereBetween('crt_time',[$data['crt_time'][0],$data['crt_time'][1]]); if(! empty($data['dispatch_time'][0]) && ! empty($data['dispatch_time'][1])){ $model->where('dispatch_time_start','<=',$data['dispatch_time'][0]); $model->where('dispatch_time_end','>=',$data['dispatch_time'][1]); } if(! empty($data['team_id'])) { $res = DispatchEmpSub::where('del_time',0) ->where('team_id',$data['team_id']) ->distinct() ->select('dispatch_no') ->get()->toArray(); $model->whereIn('dispatch_no',array_column($res,'dispatch_no')); } if(! empty($data['equipment_id'])) { $res = DispatchEmpSub::where('del_time',0) ->where('equipment_id',$data['equipment_id']) ->distinct() ->select('dispatch_no') ->get()->toArray(); $model->whereIn('dispatch_no',array_column($res,'dispatch_no')); } if(! empty($data['employee_id'])) { $res = DispatchEmpSub::where('del_time',0) ->where('employee_id',$data['employee_id']) ->distinct() ->select('dispatch_no') ->get()->toArray(); $model->whereIn('dispatch_no',array_column($res,'dispatch_no')); } $list = $this->limit($model,'',$data); $list = $this->fillDispatchOrderListData($list); return [true,$list]; } public function fillDispatchOrderListData($data){ if(empty($data['data'])) return $data; $emp_sub = DispatchEmpSub::where('del_time',0) ->whereIn('dispatch_no',array_column($data['data'],'dispatch_no')) ->select('dispatch_no','equipment_id','team_id','employee_id') ->get()->toArray(); if(! empty($emp_sub)){ $team_map = Team::whereIn('id',array_unique(array_column($emp_sub,'team_id'))) ->pluck('title','id') ->toArray(); $equipment_map = Gateway::whereIn('id',array_unique(array_column($emp_sub,'equipment_id'))) ->pluck('title','id') ->toArray(); $emp_map = Employee::whereIn('id',array_unique(array_column($emp_sub,'employee_id'))) ->pluck('emp_name','id') ->toArray(); $equipment_map1 = $team_map1 = $employee_map1 = $employee_map2 = $equipment_map2 = $team_map2 = []; foreach ($emp_sub as $value){ $equipment_name = $equipment_map[$value['equipment_id']] ?? ''; $team_name = $team_map[$value['team_id']] ?? ''; $employee_name = $emp_map[$value['employee_id']] ?? ''; $equipment_map1[$value['dispatch_no']][] = $equipment_name; $equipment_map2[$value['dispatch_no']][] = $value['equipment_id']; $team_map1[$value['dispatch_no']][] = $team_name; $team_map2[$value['dispatch_no']][] = $value['team_id']; $employee_map1[$value['dispatch_no']][] = $employee_name; $employee_map2[$value['dispatch_no']][] = $value['employee_id']; } } $process_map = Process::whereIn('id',array_column($data['data'],'process_id')) ->pluck('title','id') ->toArray(); foreach ($data['data'] as $key => $value){ $data['data'][$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d',$value['crt_time']) : ''; $time1 = $value['dispatch_time_start'] ? date('Y-m-d',$value['dispatch_time_start']) : ''; $time2 = $value['dispatch_time_end'] ? date('Y-m-d',$value['dispatch_time_end']) : ''; $data['data'][$key]['dispatch_time'] = $time1 . ' ' . $time2; $data['data'][$key]['process_name'] = $process_map[$value['process_id']] ?? ''; $tmp = $employee_map1[$value['dispatch_no']] ?? []; $data['data'][$key]['team_man'] = implode(',',array_unique($tmp)); $tmp = $employee_map2[$value['dispatch_no']] ?? []; $data['data'][$key]['team_man_id'] = array_unique($tmp); $tmp = $team_map1[$value['dispatch_no']] ?? []; $data['data'][$key]['team_name'] = implode(',',array_unique($tmp)); $tmp = $team_map2[$value['dispatch_no']] ?? []; $data['data'][$key]['team_id'] = implode(',',array_unique($tmp)); $tmp = $equipment_map1[$value['dispatch_no']] ?? []; $data['data'][$key]['equipment_name'] = implode(',',array_unique($tmp)); $tmp = $equipment_map2[$value['dispatch_no']] ?? []; $data['data'][$key]['equipment_id'] = implode(',',array_unique($tmp)); $data['data'][$key]['un_finished_quantity'] = $value['dispatch_quantity'] - $value['finished_num'] - $value['waste_num']; } $data['dispatch_quantity'] = array_sum(array_column($data['data'], 'dispatch_quantity')); return $data; } //反写写派工数量(增加) public function writeDispatchQuantity($order_product_id){ if(empty($order_product_id)) return; $result = DispatchSub::where('del_time',0) ->whereIn('order_product_id',$order_product_id) ->select(DB::raw("sum(dispatch_quantity) as dispatch_quantity"),'order_product_id') ->groupby('order_product_id') ->pluck('dispatch_quantity','order_product_id') ->toArray(); if(empty($result)) return; foreach ($result as $key => $value){ OrdersProduct::where('id',$key)->update([ 'dispatch_complete_quantity' => $value ]); } } //反写写派工数量(删除) public function writeDispatchQuantityDEL($order_product_id){ if(empty($order_product_id)) return; $result = DispatchSub::where('del_time',0) ->whereIn('order_product_id',$order_product_id) ->select(DB::raw("sum(dispatch_quantity) as dispatch_quantity"),'order_product_id') ->groupby('order_product_id') ->pluck('dispatch_quantity','order_product_id') ->toArray(); foreach ($order_product_id as $value){ $quantity = $result[$value] ?? 0; OrdersProduct::where('id',$value)->update([ 'dispatch_complete_quantity' => $quantity ]); } } //设备上的去完工列表 public function dispatchMobileOrderList($data){ $model = DispatchSub::where('del_time',0) ->select('id','product_title','product_no','dispatch_quantity','finished_num','dispatch_no','waste_num') ->whereRaw('dispatch_quantity > finished_num') ->orderBy('id','desc'); if(! empty($data['process_id'])) $model->where('process_id',$data['process_id']); if(! empty($data['order_number'])) $model->where('dispatch_no',$data['dispatch_no']); $list = $model->get()->toArray(); $list = $this->fillDispatchMobileOrderList($list); return [true,$list]; } public function fillDispatchMobileOrderList($data){ if(empty($data)) return $data; foreach ($data as $key => $value){ $data[$key]['un_finished_quantity'] = $value['dispatch_quantity'] - $value['finished_num'] - $value['waste_num']; } $return['product_num'] = count($data); $return['finished_num'] = array_sum(array_column($data, 'finished_num')); $return['un_finished_quantity'] = array_sum(array_column($data, 'un_finished_quantity')); $return['data'] = $data; unset($data); return $return; } //设备上完工填写数据的页面 public function dispatchMobileOrderDetailsList($data){ if(empty($data['id'])) return [false,'派工单ID不能为空!']; $dispatch = DispatchSub::whereIn('id',$data['id']) ->where('del_time',0) ->select('id','product_title','product_no','dispatch_no',DB::raw('(dispatch_quantity - finished_num) as quantity')) ->get()->toArray(); $sub = DispatchEmpSub::where('del_time',0) ->whereIn('dispatch_no',array_column($dispatch,'dispatch_no')) ->select('dispatch_no','equipment_id','team_id','employee_id') ->get()->toArray(); $sub_map = []; foreach ($sub as $s){ $array = [ 'equipment_id' => $s['equipment_id'], 'team_id' => $s['team_id'], 'employee_id' => $s['employee_id'], ]; if(empty($sub_map[$s['dispatch_no']])){ $sub_map[$s['dispatch_no']][] = $array; }else{ if(! in_array($array,$sub_map[$s['dispatch_no']])) { $sub_map[$s['dispatch_no']][] = $array; } } } $return_list = $return_details = []; foreach ($dispatch as $value){ $dispatch_tmp = $sub_map[$value['dispatch_no']]; $counts = count($dispatch_tmp) ?? 1; // 计算每个人应该得到的数量 $per_person = floor($value['quantity'] / $counts); // 计算最后一个人拿到的数量 $last_person = $value['quantity'] - ($per_person * ($counts - 1)); foreach ($dispatch_tmp as $k => $t){ $dispatch_tmp[$k]['id'] = $value['id']; $dispatch_tmp[$k]['product_title'] = $value['product_title']; $dispatch_tmp[$k]['product_no'] = $value['product_no']; $dispatch_tmp[$k]['dispatch_no'] = $value['dispatch_no']; if ($k == $counts - 1) { $dispatch_tmp[$k]['quantity'] = (int)$last_person; }else{ $dispatch_tmp[$k]['quantity'] = (int)$per_person; } } //列数据 $return_list = array_merge_recursive($return_list,$dispatch_tmp); //总数量 $return_details[$value['id']] = $value['quantity']; } $return['list'] = $return_list; $return['list_details'] = $return_details; return [true, $return]; } }