胶料维护规则
This commit is contained in:
@@ -785,40 +785,46 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
|
||||
}
|
||||
String specCode = row.getSpecCode().trim();
|
||||
boolean isFinalStage = "Q".equalsIgnoreCase(resolveMixingMaterialStep(row));
|
||||
String categoryId = resolveGeneratedRubberCategoryId(formula);
|
||||
String materialPhase = resolveGeneratedMaterialPhase(row);
|
||||
MesMaterial sourceRubber = resolveSourceRubberMaterial(formula);
|
||||
String categoryId = sourceRubber != null ? sourceRubber.getCategoryId() : null;
|
||||
String rubberName = resolveRubberName(formula);
|
||||
MesMaterial existing = findRubberMaterialByCodeOrName(specCode);
|
||||
String generatedName = buildGeneratedRubberMaterialName(row, rubberName);
|
||||
MesMaterial existing = findGeneratedRubberMaterialByCodeOrName(specCode, materialPhase);
|
||||
Date now = new Date();
|
||||
if (existing != null) {
|
||||
copyGeneratedMaterialFieldsFromSource(existing, sourceRubber);
|
||||
if (StringUtils.isNotBlank(categoryId)) {
|
||||
existing.setCategoryId(categoryId);
|
||||
}
|
||||
if (StringUtils.isBlank(existing.getMaterialCode())) {
|
||||
existing.setMaterialCode(specCode);
|
||||
}
|
||||
if (StringUtils.isBlank(existing.getMaterialName())) {
|
||||
existing.setMaterialName(specCode);
|
||||
}
|
||||
existing.setMaterialName(generatedName);
|
||||
if (StringUtils.isBlank(existing.getAliasName()) && StringUtils.isNotBlank(rubberName)) {
|
||||
existing.setAliasName(rubberName);
|
||||
}
|
||||
existing.setMaterialPhase(materialPhase);
|
||||
existing.setEnableFlag(existing.getEnableFlag() == null ? 1 : existing.getEnableFlag());
|
||||
existing.setUpdateTime(now);
|
||||
mesMaterialService.updateById(existing);
|
||||
log.info(
|
||||
"[混炼示方生成] 更新胶料信息 id={}, code={}, categoryId={}, isFinal={}",
|
||||
"[混炼示方生成] 更新胶料信息 id={}, code={}, phase={}, categoryId={}, isFinal={}",
|
||||
existing.getId(),
|
||||
specCode,
|
||||
materialPhase,
|
||||
categoryId,
|
||||
isFinalStage);
|
||||
return;
|
||||
}
|
||||
|
||||
MesMaterial material = new MesMaterial();
|
||||
copyGeneratedMaterialFieldsFromSource(material, sourceRubber);
|
||||
material.setMaterialCode(specCode);
|
||||
material.setMaterialName(specCode);
|
||||
material.setMaterialName(generatedName);
|
||||
material.setAliasName(StringUtils.isNotBlank(rubberName) ? rubberName : null);
|
||||
material.setCategoryId(categoryId);
|
||||
material.setMaterialPhase(materialPhase);
|
||||
material.setEnableFlag(1);
|
||||
material.setIsSpecialRubber(0);
|
||||
material.setDelFlag(CommonConstant.DEL_FLAG_0);
|
||||
@@ -826,39 +832,117 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
|
||||
material.setUpdateTime(now);
|
||||
mesMaterialService.save(material);
|
||||
log.info(
|
||||
"[混炼示方生成] 新增胶料信息 id={}, code={}, categoryId={}, isFinal={}",
|
||||
"[混炼示方生成] 新增胶料信息 id={}, code={}, phase={}, categoryId={}, isFinal={}",
|
||||
material.getId(),
|
||||
specCode,
|
||||
materialPhase,
|
||||
categoryId,
|
||||
isFinalStage);
|
||||
}
|
||||
|
||||
/** 生成的 B/F 段胶料类别:取配合示方所选「胶料代号」对应胶料(mes_material)的类别 */
|
||||
private String resolveGeneratedRubberCategoryId(MesXslFormulaSpec formula) {
|
||||
private void copyGeneratedMaterialFieldsFromSource(MesMaterial target, MesMaterial source) {
|
||||
if (target == null || source == null) {
|
||||
return;
|
||||
}
|
||||
target.setShortName(source.getShortName());
|
||||
target.setCategoryId(source.getCategoryId());
|
||||
target.setMaterialGrade(source.getMaterialGrade());
|
||||
target.setPlanPrice(source.getPlanPrice());
|
||||
target.setMinStock(source.getMinStock());
|
||||
target.setMaxStock(source.getMaxStock());
|
||||
target.setBaseUnitId(source.getBaseUnitId());
|
||||
target.setStatUnitId(source.getStatUnitId());
|
||||
target.setUnitConvertRate(source.getUnitConvertRate());
|
||||
target.setErpCode(source.getErpCode());
|
||||
target.setFinalShelfLifeDays(source.getFinalShelfLifeDays());
|
||||
target.setMasterShelfLifeDays(source.getMasterShelfLifeDays());
|
||||
target.setMinStandingHours(source.getMinStandingHours());
|
||||
target.setStandardCode(source.getStandardCode());
|
||||
target.setOriginPlace(source.getOriginPlace());
|
||||
target.setSupplierId(source.getSupplierId());
|
||||
target.setCustomerId(source.getCustomerId());
|
||||
target.setEnableFlag(source.getEnableFlag());
|
||||
target.setIsSpecialRubber(source.getIsSpecialRubber());
|
||||
target.setSyncFromErpFlag(source.getSyncFromErpFlag());
|
||||
target.setLastErpSyncTime(source.getLastErpSyncTime());
|
||||
target.setRemark(source.getRemark());
|
||||
}
|
||||
|
||||
private MesMaterial resolveSourceRubberMaterial(MesXslFormulaSpec formula) {
|
||||
if (formula == null || StringUtils.isBlank(formula.getRubberMaterialId())) {
|
||||
return null;
|
||||
}
|
||||
MesMaterial rubber = mesMaterialService.getById(formula.getRubberMaterialId());
|
||||
return mesMaterialService.getById(formula.getRubberMaterialId());
|
||||
}
|
||||
|
||||
/** 生成的 B/F 段胶料类别:取配合示方所选「胶料代号」对应胶料(mes_material)的类别 */
|
||||
private String resolveGeneratedRubberCategoryId(MesXslFormulaSpec formula) {
|
||||
MesMaterial rubber = resolveSourceRubberMaterial(formula);
|
||||
return rubber != null ? rubber.getCategoryId() : null;
|
||||
}
|
||||
|
||||
private MesMaterial findRubberMaterialByCodeOrName(String specCode) {
|
||||
return findGeneratedRubberMaterialByCodeOrName(specCode, null);
|
||||
}
|
||||
|
||||
private MesMaterial findGeneratedRubberMaterialByCodeOrName(String specCode, String materialPhase) {
|
||||
if (StringUtils.isBlank(specCode)) {
|
||||
return null;
|
||||
}
|
||||
LambdaQueryWrapper<MesMaterial> byCodeWrapper = new LambdaQueryWrapper<MesMaterial>()
|
||||
.eq(MesMaterial::getMaterialCode, specCode)
|
||||
.and(w -> w.eq(MesMaterial::getDelFlag, CommonConstant.DEL_FLAG_0).or().isNull(MesMaterial::getDelFlag));
|
||||
appendPhaseMatch(byCodeWrapper, materialPhase);
|
||||
MesMaterial byCode = mesMaterialService.getOne(
|
||||
new LambdaQueryWrapper<MesMaterial>()
|
||||
.eq(MesMaterial::getMaterialCode, specCode)
|
||||
.and(w -> w.eq(MesMaterial::getDelFlag, CommonConstant.DEL_FLAG_0).or().isNull(MesMaterial::getDelFlag))
|
||||
.last("limit 1"));
|
||||
byCodeWrapper.last("limit 1"));
|
||||
if (byCode != null) {
|
||||
return byCode;
|
||||
}
|
||||
LambdaQueryWrapper<MesMaterial> byNameWrapper = new LambdaQueryWrapper<MesMaterial>()
|
||||
.eq(MesMaterial::getMaterialName, specCode)
|
||||
.and(w -> w.eq(MesMaterial::getDelFlag, CommonConstant.DEL_FLAG_0).or().isNull(MesMaterial::getDelFlag));
|
||||
appendPhaseMatch(byNameWrapper, materialPhase);
|
||||
return mesMaterialService.getOne(
|
||||
new LambdaQueryWrapper<MesMaterial>()
|
||||
.eq(MesMaterial::getMaterialName, specCode)
|
||||
.and(w -> w.eq(MesMaterial::getDelFlag, CommonConstant.DEL_FLAG_0).or().isNull(MesMaterial::getDelFlag))
|
||||
.last("limit 1"));
|
||||
byNameWrapper.last("limit 1"));
|
||||
}
|
||||
|
||||
private void appendPhaseMatch(LambdaQueryWrapper<MesMaterial> wrapper, String materialPhase) {
|
||||
if (wrapper == null || StringUtils.isBlank(materialPhase)) {
|
||||
return;
|
||||
}
|
||||
wrapper.and(w -> w.eq(MesMaterial::getMaterialPhase, materialPhase)
|
||||
.or()
|
||||
.isNull(MesMaterial::getMaterialPhase)
|
||||
.or()
|
||||
.eq(MesMaterial::getMaterialPhase, ""));
|
||||
}
|
||||
|
||||
private String resolveGeneratedMaterialPhase(MesXslFormulaMixingGenerateRowVO row) {
|
||||
if (row == null) {
|
||||
return null;
|
||||
}
|
||||
if ("Q".equalsIgnoreCase(resolveMixingMaterialStep(row))) {
|
||||
return "F";
|
||||
}
|
||||
if (row.getASegmentIndex() != null && row.getASegmentIndex() > 0) {
|
||||
return "B" + row.getASegmentIndex();
|
||||
}
|
||||
if (row.getStageIndex() != null && row.getStageIndex() > 0) {
|
||||
return "B" + row.getStageIndex();
|
||||
}
|
||||
return "B1";
|
||||
}
|
||||
|
||||
private String buildGeneratedRubberMaterialName(MesXslFormulaMixingGenerateRowVO row, String rubberName) {
|
||||
String baseName = StringUtils.defaultString(rubberName).trim();
|
||||
if (StringUtils.isBlank(baseName) && row != null && StringUtils.isNotBlank(row.getSpecCode())) {
|
||||
baseName = row.getSpecCode().trim();
|
||||
}
|
||||
String phase = resolveGeneratedMaterialPhase(row);
|
||||
if (StringUtils.isBlank(phase)) {
|
||||
return baseName;
|
||||
}
|
||||
return phase + baseName;
|
||||
}
|
||||
//update-end---author:cursor ---date:20260601 for:【XSLMES-20260601-A62】生成混炼示方改为同步B/F段胶至胶料信息-----------
|
||||
|
||||
@@ -947,9 +1031,9 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
|
||||
if (row != null && row.getStageIndex() != null && row.getStageIndex() > 0) {
|
||||
return Math.min(row.getStageIndex(), 7);
|
||||
}
|
||||
String specCode = row != null ? row.getSpecCode() : null;
|
||||
if (StringUtils.isNotBlank(specCode)) {
|
||||
Matcher matcher = Pattern.compile("(?i)B(\\d+)").matcher(specCode.trim());
|
||||
String normalizedSpecCode = row == null ? "" : StringUtils.trimToEmpty(row.getSpecCode());
|
||||
if (StringUtils.isNotEmpty(normalizedSpecCode)) {
|
||||
Matcher matcher = Pattern.compile("(?i)B(\\d+)").matcher(normalizedSpecCode);
|
||||
if (matcher.find()) {
|
||||
return Math.min(Integer.parseInt(matcher.group(1)), 7);
|
||||
}
|
||||
@@ -965,8 +1049,8 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
|
||||
if (row != null && StringUtils.isNotBlank(row.getStepType())) {
|
||||
return row.getStepType().trim().toUpperCase();
|
||||
}
|
||||
String specCode = row != null ? row.getSpecCode() : null;
|
||||
if (StringUtils.isNotBlank(specCode) && specCode.trim().toUpperCase().startsWith("F")) {
|
||||
String normalizedSpecCode = row == null ? "" : StringUtils.trimToEmpty(row.getSpecCode()).toUpperCase();
|
||||
if (StringUtils.isNotEmpty(normalizedSpecCode) && normalizedSpecCode.startsWith("F")) {
|
||||
return "Q";
|
||||
}
|
||||
return "A";
|
||||
@@ -984,7 +1068,6 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
|
||||
Map<String, String> categoryIdCache) {
|
||||
String stepFilter = StringUtils.isNotBlank(materialStep) ? materialStep.trim().toUpperCase() : "A";
|
||||
List<MesXslMixingSpecMaterial> materials = new ArrayList<>();
|
||||
int sort = 0;
|
||||
if ("Q".equals(stepFilter)) {
|
||||
//update-begin---author:cursor ---date:20260522 for:【XSLMES-20260522-A38】F段加入最后一段B炼好胶料一条再加Q配合剂-----------
|
||||
String rubberName = resolveRubberName(formula);
|
||||
|
||||
@@ -148,8 +148,7 @@ public class MesXslRawMaterialInspectRecordServiceImpl
|
||||
if (lineList == null || lineList.isEmpty()) {
|
||||
throw new JeecgBootException("请至少录入一条检验结果");
|
||||
}
|
||||
|
||||
boolean allPass = true;
|
||||
boolean hasAnyDetailUpdated = false;
|
||||
for (MesXslRawMaterialInspectRecordLine line : lineList) {
|
||||
if (StringUtils.isBlank(line.getId())) {
|
||||
throw new JeecgBootException("明细ID不能为空,请刷新后重试");
|
||||
@@ -158,6 +157,15 @@ public class MesXslRawMaterialInspectRecordServiceImpl
|
||||
if (dbLine == null || !recordId.equals(dbLine.getRecordId())) {
|
||||
throw new JeecgBootException("明细不存在或不属于当前送检记录");
|
||||
}
|
||||
// 已录入(非待检)明细不允许再次录入,防止重复覆盖。
|
||||
String dbPassFlag = normalize(dbLine.getPassFlag());
|
||||
if (!STATUS_PENDING.equals(dbPassFlag)) {
|
||||
throw new JeecgBootException("检验项目【" + dbLine.getInspectItemName() + "】已录入,不能重复录入");
|
||||
}
|
||||
// 允许分次录入:本次未填检验值的明细跳过,不改该行状态。
|
||||
if (line.getInspectValue() == null) {
|
||||
continue;
|
||||
}
|
||||
String passFlag =
|
||||
evaluatePassFlag(
|
||||
line.getInspectValue(),
|
||||
@@ -168,20 +176,37 @@ public class MesXslRawMaterialInspectRecordServiceImpl
|
||||
dbLine.setInspectValue(line.getInspectValue());
|
||||
dbLine.setPassFlag(passFlag);
|
||||
recordLineMapper.updateById(dbLine);
|
||||
hasAnyDetailUpdated = true;
|
||||
}
|
||||
if (!hasAnyDetailUpdated) {
|
||||
throw new JeecgBootException("请至少录入一条检验值后再保存");
|
||||
}
|
||||
|
||||
List<MesXslRawMaterialInspectRecordLine> allDbLines = selectLinesByRecordId(recordId);
|
||||
boolean allCompleted = true;
|
||||
boolean allPass = true;
|
||||
for (MesXslRawMaterialInspectRecordLine dbLine : allDbLines) {
|
||||
String passFlag = normalize(dbLine.getPassFlag());
|
||||
if (STATUS_PENDING.equals(passFlag) || StringUtils.isBlank(passFlag)) {
|
||||
allCompleted = false;
|
||||
continue;
|
||||
}
|
||||
if (!STATUS_PASS.equals(passFlag)) {
|
||||
allPass = false;
|
||||
}
|
||||
}
|
||||
|
||||
record.setInspectStatus(allPass ? STATUS_PASS : STATUS_FAIL);
|
||||
record.setResultTime(new Date());
|
||||
this.updateById(record);
|
||||
// 判定完成后回写原材料卡片检测结果
|
||||
if (StringUtils.isNotBlank(record.getRawMaterialCardId())) {
|
||||
MesXslRawMaterialCard card = new MesXslRawMaterialCard();
|
||||
card.setId(record.getRawMaterialCardId());
|
||||
card.setTestResult(allPass ? CARD_TEST_RESULT_PASS : CARD_TEST_RESULT_FAIL);
|
||||
rawMaterialCardService.updateById(card);
|
||||
// 仅当全部明细已完成录入时,才回写主表/卡片检验状态。
|
||||
if (allCompleted) {
|
||||
record.setInspectStatus(allPass ? STATUS_PASS : STATUS_FAIL);
|
||||
record.setResultTime(new Date());
|
||||
this.updateById(record);
|
||||
if (StringUtils.isNotBlank(record.getRawMaterialCardId())) {
|
||||
MesXslRawMaterialCard card = new MesXslRawMaterialCard();
|
||||
card.setId(record.getRawMaterialCardId());
|
||||
card.setTestResult(allPass ? CARD_TEST_RESULT_PASS : CARD_TEST_RESULT_FAIL);
|
||||
rawMaterialCardService.updateById(card);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user