constructionRule($data, $user, false); if(!$status) return [$status,$msg]; try { DB::beginTransaction(); $model = Construction::where('id', $data['id'])->first(); $model->model_type = $data['model_type']; $model->order_number = $data['order_number']; $model->title = $data['title'] ?? ''; $model->customer_id = $data['customer_id'] ?? 0; $model->customer_contact_id = $data['customer_contact_id'] ?? 0; $model->install_method = $data['install_method'] ?? 0; $model->install_position = $data['install_position'] ?? ''; $model->sales_order_id = $data['sales_order_id'] ?? 0; $model->construction_fee = $data['construction_fee'] ?? 0; $model->service_price = $data['service_price'] ?? 0; $model->construction_time = $data['construction_time'] ?? 0; $model->handover_time = $data['handover_time'] ?? 0; $model->urgency = $data['urgency'] ?? 0; $model->mark = $data['mark'] ?? ''; $model->address1 = $data['address1'] ? json_encode($data['address1']) : ''; $model->address2 = $data['address2'] ?? ''; $model->introduction = $data['introduction'] ?? ''; $model->depart_id = $data['depart_id'] ?? 0; $model->top_depart_id = $data['top_depart_id'] ?? 0; $model->save(); $time = time(); ConstructionInfo::where('del_time',0) ->where('construction_id',$data['id']) ->update(['del_time' => $time]); ConstructionProductInfo::where('del_time',0) ->where('construction_id',$data['id']) ->update(['del_time' => $time]); if(! empty($data['construction_contact'])){ $insert = []; foreach ($data['construction_contact'] as $value){ $insert[] = [ 'construction_id' => $model->id, 'contact_type' => $value['id'], 'contact_info' => $value['info'], 'type' => ConstructionInfo::type_one, 'crt_time' => $time, ]; } ConstructionInfo::insert($insert); } if(! empty($data['employee_one'])){ $insert = []; foreach ($data['employee_one'] as $value){ $insert[] = [ 'construction_id' => $model->id, 'employee_id' => $value, 'type' => ConstructionInfo::type_two, 'crt_time' => $time, ]; } ConstructionInfo::insert($insert); } if(! empty($data['product'])){ $insert = []; foreach ($data['product'] as $value){ $insert[] = [ 'construction_id' => $model->id, 'product_id' => $value['product_id'], 'price' => $value['retail_price'], 'number' => $value['number'], 'title' => $value['title'], 'code' => $value['code'] ?? '', 'size' => $value['size'] ?? '', 'unit' => $value['unit'] ?? 0, 'bar_code' => $value['bar_code'] ?? '', 'cost' => $value['cost'] ?? 0, 'depart_price' => $value['depart_price'] ?? 0, 'retail_price' => $value['retail_price'] ?? 0, 'mark' => $value['mark'] ?? '', 'crt_time' => $time, ]; } ConstructionProductInfo::insert($insert); //锁定库存 ProductInventoryService::changeLockNumber($msg[0],$msg[1]); } DB::commit(); }catch (\Exception $exception){ DB::rollBack(); return [false,$exception->getMessage()]; } return [true,'']; } public function constructionAdd($data,$user){ list($status,$msg) = $this->constructionRule($data,$user); if(!$status) return [$status,$msg]; try { DB::beginTransaction(); $model = new Construction(); $model->model_type = $data['model_type']; $model->order_number = $data['order_number']; $model->title = $data['title'] ?? ''; $model->customer_id = $data['customer_id'] ?? 0; $model->customer_contact_id = $data['customer_contact_id'] ?? 0; $model->install_method = $data['install_method'] ?? 0; $model->install_position = $data['install_position'] ?? ''; $model->sales_order_id = $data['sales_order_id'] ?? 0; $model->construction_fee = $data['construction_fee'] ?? 0; $model->service_price = $data['service_price'] ?? 0; $model->construction_time = $data['construction_time'] ?? 0; $model->handover_time = $data['handover_time'] ?? 0; $model->urgency = $data['urgency'] ?? 0; $model->mark = $data['mark'] ?? ''; $model->address1 = $data['address1'] ? json_encode($data['address1']) : ''; $model->address2 = $data['address2'] ?? ''; $model->introduction = $data['introduction'] ?? ''; $model->crt_id = $user['id']; $model->depart_id = $data['depart_id'] ?? 0; $model->top_depart_id = $data['top_depart_id'] ?? 0; $model->save(); $time = time(); if(! empty($data['construction_contact'])){ $insert = []; foreach ($data['construction_contact'] as $value){ $insert[] = [ 'construction_id' => $model->id, 'contact_type' => $value['id'], 'contact_info' => $value['info'], 'type' => ConstructionInfo::type_one, 'crt_time' => $time, ]; } ConstructionInfo::insert($insert); } if(! empty($data['employee_one'])){ $insert = []; foreach ($data['employee_one'] as $value){ $insert[] = [ 'construction_id' => $model->id, 'employee_id' => $value, 'type' => ConstructionInfo::type_two, 'crt_time' => $time, ]; } ConstructionInfo::insert($insert); } if(! empty($data['product'])){ $insert = []; foreach ($data['product'] as $value){ $insert[] = [ 'construction_id' => $model->id, 'product_id' => $value['product_id'], 'price' => $value['retail_price'], 'number' => $value['number'], 'title' => $value['title'], 'code' => $value['code'] ?? '', 'size' => $value['size'] ?? '', 'unit' => $value['unit'] ?? 0, 'bar_code' => $value['bar_code'] ?? '', 'cost' => $value['cost'] ?? 0, 'depart_price' => $value['depart_price'] ?? 0, 'retail_price' => $value['retail_price'] ?? 0, 'mark' => $value['mark'] ?? '', 'crt_time' => $time, ]; } ConstructionProductInfo::insert($insert); //锁定库存 ProductInventoryService::changeLockNumber($msg[0]); } DB::commit(); }catch (\Exception $exception){ DB::rollBack(); return [false,$exception->getMessage()]; } return [true,'']; } public function constructionDel($data){ if($this->isEmpty($data,'id')) return [false,'请选择数据!']; $product_save = $this->getSaveDetail($data['id']); try { DB::beginTransaction(); Construction::where('id',$data['id'])->update([ 'del_time'=> time() ]); ConstructionInfo::where('del_time',0) ->where('construction_id',$data['id']) ->update(['del_time' => time()]); ConstructionProductInfo::where('del_time',0) ->where('construction_id',$data['id']) ->update(['del_time' => time()]); //锁定库存释放 ProductInventoryService::changeLockNumber([],$product_save); DB::commit(); }catch (\Exception $exception){ DB::rollBack(); return [false,$exception->getMessage()]; } return [true,'']; } public function constructionDetail($data){ if($this->isEmpty($data,'id')) return [false,'请选择数据!']; $construction = Construction::where('del_time',0) ->where('id',$data['id']) ->first(); if(empty($construction)) return [false,'施工订单不存在或已被删除']; $construction = $construction->toArray(); $address = ''; if(! empty($construction['address1'])) { $tmp = json_decode($construction['address1'],true); $construction['address1'] = $tmp; $tmp = implode(' ',$tmp); $tmp .= ' ' . $construction['address2']; $address = $tmp; } $construction['address'] = $address; $sales = SalesOrder::where('id',$construction['sales_order_id'])->value('order_number'); $construction['sales_order_number'] = $sales; $customer_title = Customer::where('id',$construction['customer_id'])->value('title'); $construction['customer_title'] = $customer_title; $emp_title = Employee::where('id',$construction['customer_contact_id'])->value('emp_name'); $construction['customer_contact_title'] = $emp_title; $construction['employee_one'] = $construction['construction_contact'] = $construction['product'] = []; $array = [ $construction['install_method'], $construction['urgency'], ]; $basic_map = BasicType::whereIn('id',$array) ->pluck('title','id') ->toArray(); $construction = [$construction]; foreach ($construction as $key => $value){ $construction[$key]['install_method_title'] = $basic_map[$value['install_method']] ?? ''; $construction[$key]['urgency_title'] = $basic_map[$value['urgency']] ?? ''; } $construction = $construction[0]; $construction_info = ConstructionInfo::where('del_time',0) ->where('construction_id',$construction['id']) ->select('id','construction_id','employee_id','type','contact_type','contact_info') ->get()->toArray(); $emp_map = Employee::whereIn('id',array_unique(array_merge_recursive([$construction['crt_id']],array_column($construction_info,'employee_id')))) ->pluck('emp_name','id') ->toArray(); $basic_map2 = BasicType::whereIn('id',array_unique(array_column($construction_info,'contact_type'))) ->pluck('title','id') ->toArray(); foreach ($construction_info as $value){ if($value['type'] == ConstructionInfo::type_one){ $tmp = [ 'id' => $value['contact_type'], 'title' => $basic_map2[$value['contact_type']] ?? '', 'info' => $value['contact_info'] ]; $construction['construction_contact'][] = $tmp; }elseif ($value['type'] == ConstructionInfo::type_two){ $tmp = [ 'id' => $value['employee_id'], 'name' => $emp_map[$value['employee_id']] ?? '', ]; $construction['employee_one'][] = $tmp; } } $p_info = ConstructionProductInfo::where('del_time',0) ->where('construction_id',$construction['id']) ->get()->toArray(); foreach ($p_info as $value){ $construction['product'][] = $value; } $construction['crt_name'] = $emp_map[$construction['crt_id']] ?? ''; $construction['crt_time'] = $construction['crt_time'] ? date("Y-m-d H:i:s",$construction['crt_time']): ''; return [true, $construction]; } public function constructionList($data,$user){ $model = new Construction(['userData' => $user]); $model = $model->where('del_time',0) ->select('title','id','model_type','order_number','customer_id','customer_contact_id','install_method','install_position','sales_order_id','construction_fee','construction_time','handover_time','urgency','crt_id','crt_time','mark','state','address1','address2','introduction','service_price') ->orderby('id', 'desc'); if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%'); if(! empty($data['model_type'])) $model->where('model_type',$data['model_type']); $list = $this->limit($model,'',$data); $list = $this->fillData($list); return [true, $list]; } public function constructionRule(&$data, $user, $is_add = true){ if(empty($data['model_type'])) return [false,'工单模板类型不能为空']; if(! in_array($data['model_type'],Construction::$model_type)) return [false,'工单模板类型错误']; if(empty($data['order_number'])) return [false,'工单编号不能为空']; if(empty($data['construction_time'])) return [false,'实施日期不能为空']; $data['construction_time'] = $this->changeDateToDateMin($data['construction_time']); if(empty($data['sales_order_id'])) return [false,'请选择合同']; $sale = SalesOrder::where('del_time',0)->where('id',$data['sales_order_id'])->first(); if(empty($sale)) return [false,'合同不存在或已被删除']; if($sale['state'] < SalesOrder::State_two) return [false,'合同未派单,不允许新建施工单']; if(empty($data['product'])) return [false,'请选择产品']; if(! empty($data['construction_fee'])){ $res = $this->checkNumber($data['construction_fee']); if(! $res) return [false,'施工费用请输入不超过两位小数并且大于0的数值']; } if(! empty($data['service_price'])){ $res = $this->checkNumber($data['service_price']); if(! $res) return [false,'服务价格请输入不超过两位小数并且大于0的数值']; } if(! empty($data['handover_time'])) { $data['handover_time'] = $this->changeDateToDateMin($data['handover_time']); } if($data['model_type'] == Construction::Model_type_one){ if(empty($data['install_method'])) return [false,'安装方式不能为空']; if(empty($data['install_position'])) return [false,'安装地点不能为空']; }else{ if(empty($data['construction_contact'])) return [false,'联系方式不能为空']; if(empty($data['address1']) || empty($data['address2'])) return [false,'地址不能为空']; } //所属部门 以及 顶级部门 if(empty($data['depart_id'])) $data['depart_id'] = $this->getDepart($user); $data['top_depart_id'] = $user['depart_map'][$data['depart_id']] ?? 0; $product_submit = $product_save = []; foreach ($data['product'] as $value){ if(empty($value['number'])) return [false,'产品数量不能为空']; $res = $this->checkNumber($value['number']); if(! $res) return [false,'请输入正确的产品数量']; if(isset($product_submit[$value['product_id']])){ $product_submit[$value['product_id']] += $value['number']; }else{ $product_submit[$value['product_id']] = $value['number']; } } $order_number = ""; if(! $is_add) $order_number = $data['order_number']; list($status,$msg) = (new ProductInventoryService())->compareStock(array_keys($product_submit), [ 'order_number' => $order_number, 'product' => $product_submit ]); if(! $status) return [false, $msg]; if($is_add){ $bool = Construction::where('del_time',0)->where('order_number',$data['order_number'])->exists(); if($bool) return [false,'工单编号已存在,请重新获取']; }else{ if(empty($data['id'])) return [false,'ID不能为空']; $product_save = $this->getSaveDetail($data['id']); } return [true, [$product_submit, $product_save]]; } public function fillData($data){ if(empty($data['data'])) return $data; $array = array_unique(array_merge_recursive(array_column($data['data'],'install_method'),array_column($data['data'],'urgency'))); $basic_map = BasicType::whereIn('id',$array) ->pluck('title','id') ->toArray(); $emp = Employee::whereIn('id',array_unique(array_merge_recursive(array_column($data['data'],'crt_id'),array_column($data['data'],'customer_contact_id')))) ->pluck('emp_name','id') ->toArray(); $customer = Customer::whereIn('id',array_unique(array_column($data['data'],'customer_id'))) ->pluck('title','id') ->toArray(); foreach ($data['data'] as $key => $value){ $address = ''; if(! empty($value['address1'])) { $tmp = json_decode($value['address1'],true); $tmp = implode(' ',$tmp); $tmp .= ' ' . $value['address2']; $address = $tmp; } $data['data'][$key]['address'] = $address; $data['data'][$key]['install_method_title'] = $basic_map[$value['install_method']] ?? ''; $data['data'][$key]['urgency_title'] = $basic_map[$value['urgency']] ?? ''; $data['data'][$key]['customer_title'] = $customer[$value['customer_id']] ?? ''; $data['data'][$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d H:i:s',$value['crt_time']) : ''; $data['data'][$key]['crt_name'] = $emp[$value['crt_id']] ?? ''; $data['data'][$key]['customer_contact_title'] = $emp[$value['customer_contact_id']] ?? ''; } return $data; } public function constructionGet($data){ if(empty($data['model_type'])) return [false,'工单模板类型不能为空']; if(! isset(Construction::$prefix[$data['model_type']])) return [false,'工单模板类型错误']; $prefix = Construction::$prefix[$data['model_type']]; $order_number = OrderNoService::createConstructionOrderNumber($prefix); if(! $order_number) return [false,'工单编号生成失败!']; return [true,['order_number' => $order_number]]; } public function getSaveDetail($id){ $product_save = []; $sub = ConstructionProductInfo::where('construction_id',$id) ->where('del_time',0) ->get()->toArray(); foreach ($sub as $value){ if(isset($product_save[$value['product_id']])){ $product_save[$value['product_id']] += $value['number']; }else{ $product_save[$value['product_id']] = $value['number']; } } return $product_save; } }