$item) { $idx = $index + 1; $check_feilds = [ ['name' => 'code', 'feild_type' => 'string', 'required' => true, 'len' => 100], ['name' => 'name', 'feild_type' => 'string', 'required' => true, 'len' => 100], ['name' => 'version', 'feild_type' => 'string', 'required' => false, 'len' => 20], ['name' => 'workingsubclass', 'feild_type' => 'string', 'required' => true, 'len' => 100], ['name' => 'assembly_item', 'feild_type' => 'string', 'required' => true, 'len' => 100], ['name' => 'input_quantity', 'feild_type' => 'float', 'required' => true, 'len' => 1], ['name' => 'output_rate', 'feild_type' => 'float', 'required' => true, 'len' => 1], ['name' => 'start_effective_date', 'feild_type' => 'string', 'required' => true, 'len' => 100], ['name' => 'end_effective_date', 'feild_type' => 'string', 'required' => false, 'len' => 100], ]; foreach ($check_feilds as $val) { if (!isset($item[$val['name']])) { throw new Exception("物料Bom数据集第[{$idx}]位置数据对象不存在字段[{$val['name']}]", 4001); } if ($val['required']) { if ($val['feild_type'] == 'string') { // 判断是否是一个字符串 if (!is_string($item[$val['name']])) { throw new Exception("物料Bom数据集第[{$idx}]位置数据对象[{$val['name']}]的值不是字符串类型,请检查!", 4001); } // 判断长度 if (strlen($item[$val['name']]) > $val['len']) { throw new Exception("物料Bom数据集第[{$idx}]位置数据对象[{$val['name']}]的值不符合规定的长度[{$val['len']}],请检查!", 4001); } } elseif ($val['feild_type'] == 'int') { if (!is_int($item[$val['name']])) { throw new Exception("物料Bom数据集第[{$idx}]位置数据对象对应的字段[{$val['name']}]值不是整数数字类型", 4001); } if ($val == 'active') { if (!in_array($item[$val['name']], [0, 1])) { throw new Exception("物料Bom数据集第[{$idx}]位置数据对象对应的字段[{$val['name']}]值只能是0或者1", 4001); } } } elseif ($val['feild_type'] == 'float') { if (!is_numeric($item[$val['name']])) { throw new Exception("物料Bom数据集第[{$idx}]位置数据对象对应的字段[{$val['name']}]值不是浮点型", 4001); } } // 判断创建修改时间格式是否正确 if ($val['name'] == 'create_time' || $val['name'] == 'update_time' || $val['name'] == 'start_effective_date') { if (date('Y-m-d H:i:s', strtotime($item[$val['name']])) != $item[$val['name']]) { throw new Exception("物料Bom数据集第[{$idx}]位置数据对象字段[{$val['name']}]的时间格式不正确,正确例子如:2023-01-01 09:09:09", 4001); } } if (empty($item[$val['name']])) { throw new Exception("物料Bom数据集第[{$idx}]位置数据对象字段[{$val['name']}]的值不能为空", 4001); } } else { if ($val['name'] == 'end_effective_date' && !empty($item['end_effective_date'])) { if (date('Y-m-d H:i:s', strtotime($item['end_effective_date'])) != $item['end_effective_date']) { throw new Exception("物料Bom数据集第[{$idx}]位置数据对象字段[end_effective_date]的时间格式不正确,正确例子如:2023-01-01 09:09:09", 4001); } } } } } // 判断物料code是否重复 $duplicates = findDuplicates($listData, ['code']); if (!empty($duplicates)) { $duplicates_str = '上传物料Bom数据集,'; foreach ($duplicates as $key => $value) { $duplicates_str .= '参数' . $key . '存在重复值【' . implode("、", $value) . '】,'; } throw new Exception($duplicates_str, 4001); } $code_arr = array_column($listData, 'code'); foreach ($listData as $idx => $value) { if($value['assembly_item'] != '-1' && !in_array($value['assembly_item'],$code_arr)){ throw new Exception("物料Bom数据集第[".($idx+1)."]位置的母件料号assembly_item值[".$value['assembly_item']."]不存在对应物料编码"); } // 判断物料编码是否存在 $sql = sprintf( "SELECT id FROM hf_mes_product_bom_source WHERE code='%s' LIMIT 1;", $value['code'] ); $ret = Db::fetch($sql); if (empty($ret)) { throw new Exception("物料Bom数据集第[" . ($idx + 1) . "]位置的物料编码code值[" . $value['code'] . "]不存在", 4001); } $listData[$idx]['bom_source_id'] = $ret['id']; } $sql = "SELECT id as product_model_id FROM hf_mes_product_model ORDER BY id DESC LIMIT 1"; $ret = Db::fetch($sql); if(empty($ret)){ throw new Exception("电池型号不存在,请检查是否添加电池型号"); } $product_model_id = $ret["product_model_id"]; } catch (Exception $e) { throw new Exception($e->getMessage(), $e->getCode() ? $e->getCode() : 4001); } // 工序单元映射信息 $workingsubclass_info = [ "1" => "ZJJB", // 正极搅拌 "2" => "ZJTB", // 正极涂布 ]; // 开启事务 Db::beginTrans(); try { // a、往hf_mes_product_bom插入一条数据 // 遍历bom结构数据 // b、当前code的值存在其他assembly_item(pid)上,代表是其他code的产出物料 // c、当前assembly_item(pid)的值存在其他code上,代表是其他code的投入物料 // d、往hf_mes_product_bom_relationship上插入数据,bom_source_id、bom_id、in_workingsubclass、out_workingsubclass、input_quantity上必须要有数据 // code、name采用当前时间点 $tmp_code = date("YmdHis"); $create_time = date("Y-m-d H:i:s"); $sql = "INSERT INTO hf_mes_product_bom (product_model_id, code, name, status, create_time) VALUES ('$product_model_id','$tmp_code','$tmp_code','1','$create_time')"; $row = Db::query($sql); if ($row === NULL) { throw new Exception("新增物料BOM清单失败", 4001); } $bom_id = $row; foreach($listData as $value){ $current_code = $value["code"]; $current_assembly_item = $value["assembly_item"]; $current_bom_source_id = $value["bom_source_id"]; $current_workingsubclass = $workingsubclass_info[$value["workingsubclass"]]; $current_input_quantity = $value["input_quantity"]; // 产出物料编码缓存,产出只有一个,需要判断是否为一个 $output_codes = []; foreach($listData as $val){ $other_code = $val["code"]; $other_assembly_item = $val["assembly_item"]; $other_bom_source_id = $val["bom_source_id"]; $other_workingsubclass = $workingsubclass_info[$val["workingsubclass"]]; $other_input_quantity = $val["input_quantity"]; // 当前code的值存在其他assembly_item(pid)上,代表当前code是其他code的产出物料;产出只有一个,需要判断是否为一个 // 当前assembly_item(pid)的值存在其他code上,代表当前assembly_item(pid)是其他code的投入物料 if($current_code == $other_assembly_item && !in_array($current_code,$output_codes)){ $sql = "INSERT INTO hf_mes_product_bom_relationship (bom_source_id, bom_id, out_workingsubclass) VALUES ('$current_bom_source_id','$bom_id','$current_workingsubclass')"; $ret = Db::query($sql); if ($ret === NULL) { throw new Exception("产出物料编码[".$current_code."]插入bom物料清单关系表失败", 4001); } $output_codes[] = $current_code; }else if($current_assembly_item == $other_code){ $sql = "INSERT INTO hf_mes_product_bom_relationship (bom_source_id, bom_id, in_workingsubclass, input_quantity) VALUES ('$current_bom_source_id','$bom_id','$other_workingsubclass','$current_input_quantity')"; $ret = Db::query($sql); if ($ret === NULL) { throw new Exception("投入物料编码[".$current_code."]插入bom物料清单关系表失败", 4001); } } } } } catch(Exception $e) { Db::rollBackTrans(); throw new Exception($e->getMessage(), $e->getCode() ? $e->getCode() : 4001); } Db::commitTrans(); return ''; } }