配合示方生成混炼示方完善

This commit is contained in:
2026-07-30 11:28:26 +08:00
parent 2310f79f43
commit 5c27bacd11
231 changed files with 33361 additions and 184 deletions

View File

@@ -1264,3 +1264,100 @@ jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/ser
jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/controller/MesXslMixerConditionController.java
jeecgboot-vue3/src/views/xslmes/mesXslMixerCondition/MesXslMixerCondition.api.ts
jeecgboot-vue3/src/views/xslmes/mesXslMixerCondition/MesXslMixerCondition.data.ts
-- author:jiangxh---date:20260729--for: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λС<CEBB><D0A1> ---
jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/MesXslFormulaSpec.data.ts
jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/components/MesXslFormulaSpecModal.vue
jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java
-- author:jiangxh---date:20260729--for: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><33><CEBB>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><33><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2λ ---
jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts
jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingSpecModal.vue
jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java
-- author:jiangxh---date:20260729--for: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>λС<CEBB><D0A1> ---
jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingSpecModal.vue
jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts
jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java
-- author:jiangxh---date:20260729--for: <20><><EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>ϼ<EFBFBD>ʾ<EFBFBD><CABE>ѡ<EFBFBD>ϸ<EFBFBD>Ϊģ<CEAA><C4A3><EFBFBD><EFBFBD>ѯ ---
jeecgboot-vue3/src/views/mes/material/materialQuery.util.ts
jeecgboot-vue3/src/views/mes/material/MesMixerMaterialList.vue
jeecgboot-vue3/src/views/mes/material/MesMaterialList.vue
jeecgboot-vue3/src/views/mes/material/modules/MesMixerMaterialSelectModal.vue
jeecgboot-vue3/src/views/mes/material/modules/MesMaterialSelectModal.vue
jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingMaterialSelectModal.vue
-- author:jiangxh---date:20260729--for: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>ϡ<EFBFBD><CFA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<E0BCAD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ψһ ---
jeecgboot-vue3/src/views/mes/material/MesMixerMaterial.api.ts
jeecgboot-vue3/src/views/mes/material/MesMixerMaterial.data.ts
jeecgboot-vue3/src/views/mes/material/MesMaterial.api.ts
jeecgboot-vue3/src/views/mes/material/MesMaterial.data.ts
-- author:jiangxh---date:20260729--for: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϡ<EFBFBD><CFA1><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD>365<36><35> ---
jeecgboot-vue3/src/views/mes/material/MesMixerMaterial.data.ts
yy-admin-master/YY.Admin/ViewModels/MixerMaterial/MixerMaterialEditDialogViewModel.cs
-- author:jiangxh---date:20260729--for: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD>%/<2F><><EFBFBD><EFBFBD>ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λС<CEBB><D0A1> ---
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java
jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.2_171__mes_xsl_formula_spec_line_decimal3.sql
jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/MesXslFormulaSpec.data.ts
jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/components/MesXslFormulaSpecModal.vue
-- author:jiangxh---date:20260729--for: <20><>WebSocket<65><74>pongTimeout 1s<31><73>10s <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ---
jeecgboot-vue3/src/hooks/web/useWebSocket.ts
-- author:jiangxh---date:20260729--for: <20><>WebSocket<65><74><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Redis<69>ذ<EFBFBD><D8B0><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ---
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java
jeecgboot-vue3/src/hooks/web/useWebSocket.ts
-- author:jiangxh---date:20260729--for: <20><>HTTP<54><50>Ĭ<EFBFBD>ϳ<EFBFBD>ʱ10s<30><73>60s<30><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>120s ---
jeecgboot-vue3/src/utils/http/axios/index.ts
jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/MesXslFormulaSpec.api.ts
-- author:jiangxh---date:20260729--for: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>ɡ<EFBFBD>B/F<><46><EFBFBD>ϸ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>ƥ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ά<EFBFBD><CEAC> ---
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java
-- author:jiangxh---date:20260729--for: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>ɡ<EFBFBD><C9A1>ս<EFBFBD><D5BD><EFBFBD>ϸĸ<CFB8><C4B8><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EBBDBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ---
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java
-- author:jiangxh---date:20260729--for: <20><>ѡ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>/<2F><><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD> ---
jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts
jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingMaterialSelectModal.vue
jeecgboot-vue3/src/views/mes/material/modules/MesMaterialSelectModal.vue
jeecgboot-vue3/src/views/mes/material/materialQuery.util.ts
-- author:jiangxh---date:20260730--for: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>ɡ<EFBFBD><C9A1>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɻ<EFBFBD><C9BB><EFBFBD>ʾ<EFBFBD><CABE>Ԥ<EFBFBD><D4A4>ʱ<EFBFBD><CAB1>ƥ<EFBFBD><EFBFBD><E4BDBA><EFBFBD>б<EFBFBD> ---
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java
jeecgboot-vue3/src/views/xslmes/mesXslFormulaSpec/components/MesXslFormulaGenerateMixingModal.vue
-- author:jiangxh---date:20260730--for: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>ɡ<EFBFBD>B/Fƥ<46><C6A5><EFBFBD><EFBFBD><EFBFBD>Ž<EFBFBD>ǰ׺+<2B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƴSA01<30>Ȱ汾<C8B0><E6B1BE>׺ ---
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java
-- author:jiangxh---date:20260730--for: <20><><EFBFBD><EFBFBD><EFBFBD>ϡ<EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>ֶΣ<D6B6>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ---
jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/entity/MesMaterial.java
jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/controller/MesMaterialController.java
jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/IMesMaterialService.java
jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/impl/MesMaterialServiceImpl.java
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslMixingSpecServiceImpl.java
jeecgboot-vue3/src/views/mes/material/MesMaterial.data.ts
jeecgboot-vue3/src/views/mes/material/MesMaterial.api.ts
jeecgboot-vue3/src/views/mes/material/modules/MesMaterialSelectModal.vue
jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts
-- author:jiangxh---date:20260730--for: <20><><EFBFBD><EFBFBD><EFBFBD>ϡ<EFBFBD><CFA1>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD><EFBFBD>ŸĶ<C5B8> ---
jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/entity/MesMaterial.java
jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/controller/MesMaterialController.java
jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/IMesMaterialService.java
jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/service/impl/MesMaterialServiceImpl.java
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslMixingSpecServiceImpl.java
jeecgboot-vue3/src/views/mes/material/MesMaterial.data.ts
jeecgboot-vue3/src/views/mes/material/MesMaterial.api.ts
jeecgboot-vue3/src/views/mes/material/modules/MesMaterialSelectModal.vue
jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts
-- author:jiangxh---date:20260730--for: <20><><EFBFBD><EFBFBD><EFBFBD>ϡ<EFBFBD><CFA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EBBDBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> ---
jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/mes/material/controller/MesMaterialController.java
jeecgboot-vue3/src/views/mes/material/MesMaterial.data.ts

View File

@@ -12,6 +12,7 @@ import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -300,6 +301,9 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
//update-begin---author:cursor ---date:20260521 for配合示方明细重量%按PHR/总PHR自动计算-----------
fillWeightPercent(line, weightBase);
//update-end---author:cursor ---date:20260521 for配合示方明细重量%按PHR/总PHR自动计算-----------
//update-begin---author:jiangxh ---date:20260729 for【配合示方】明细重量%/体积统一保留三位小数-----------
normalizeLineDecimals(line);
//update-end---author:jiangxh ---date:20260729 for【配合示方】明细重量%/体积统一保留三位小数-----------
if (line.getCreateTime() == null) {
line.setCreateTime(now);
}
@@ -339,7 +343,9 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
if (material == null || material.getSpecificGravity() == null || material.getSpecificGravity().compareTo(BigDecimal.ZERO) <= 0) {
return;
}
line.setVolume(line.getPhr().divide(material.getSpecificGravity(), 6, RoundingMode.HALF_UP));
//update-begin---author:jiangxh ---date:20260729 for【配合示方】明细体积保留三位小数-----------
line.setVolume(line.getPhr().divide(material.getSpecificGravity(), 3, RoundingMode.HALF_UP));
//update-end---author:jiangxh ---date:20260729 for【配合示方】明细体积保留三位小数-----------
}
private void fillWeightPercent(MesXslFormulaSpecLine line, BigDecimal totalPhr) {
@@ -347,10 +353,27 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
if (line.getWeightPercent() != null || line.getPhr() == null || totalPhr == null || totalPhr.compareTo(BigDecimal.ZERO) <= 0) {
return;
}
line.setWeightPercent(line.getPhr().multiply(BigDecimal.valueOf(100)).divide(totalPhr, 4, RoundingMode.HALF_UP));
//update-begin---author:jiangxh ---date:20260729 for【配合示方】明细重量%/体积保留三位小数-----------
line.setWeightPercent(line.getPhr().multiply(BigDecimal.valueOf(100)).divide(totalPhr, 3, RoundingMode.HALF_UP));
//update-end---author:jiangxh ---date:20260729 for【配合示方】明细重量%/体积保留三位小数-----------
//update-end---author:cursor ---date:20260521 for配合示方明细重量%按PHR/总PHR自动计算可手工覆盖-----------
}
//update-begin---author:jiangxh ---date:20260729 for【配合示方】明细重量%/体积统一保留三位小数-----------
/** 明细重量%、体积统一四舍五入到三位小数(含手工录入值) */
private void normalizeLineDecimals(MesXslFormulaSpecLine line) {
if (line == null) {
return;
}
if (line.getWeightPercent() != null) {
line.setWeightPercent(line.getWeightPercent().setScale(3, RoundingMode.HALF_UP));
}
if (line.getVolume() != null) {
line.setVolume(line.getVolume().setScale(3, RoundingMode.HALF_UP));
}
}
//update-end---author:jiangxh ---date:20260729 for【配合示方】明细重量%/体积统一保留三位小数-----------
//update-begin---author:cursor ---date:20260521 for【配合示方】保存后汇总A/Q胶比重写入数据库-----------
/** 根据明细重新汇总主表 TOTAL PHR、A胶TOTAL PHR、比重与人工配料标记 */
private void refreshMainSummary(String mainId) {
@@ -457,7 +480,9 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
if (material == null || material.getSpecificGravity() == null || material.getSpecificGravity().compareTo(BigDecimal.ZERO) <= 0) {
return null;
}
return line.getPhr().divide(material.getSpecificGravity(), 6, RoundingMode.HALF_UP);
//update-begin---author:jiangxh ---date:20260729 for【配合示方】明细体积保留三位小数-----------
return line.getPhr().divide(material.getSpecificGravity(), 3, RoundingMode.HALF_UP);
//update-end---author:jiangxh ---date:20260729 for【配合示方】明细体积保留三位小数-----------
}
//update-end---author:cursor ---date:20260521 for【配合示方】保存后汇总A/Q胶比重写入数据库-----------
@@ -540,7 +565,6 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
throw new IllegalArgumentException("请先维护混合段数");
}
String rubberName = resolveRubberName(main);
String formulaCodeSuffix = resolveFormulaCodeSuffix(main);
boolean hasQ = hasStepQ(main.getLineList());
List<MesXslFormulaMixingGeneratePreviewItemVO> items = new ArrayList<>();
int aIndex = 0;
@@ -551,16 +575,24 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
item.setStageIndex(i);
if (isQSegment) {
item.setStepType("Q");
item.setSpecCode(appendFormulaCodeSuffix("F" + rubberName, formulaCodeSuffix));
//update-begin---author:jiangxh ---date:20260730 for【混炼示方生成】B/F匹配编号不拼版本后缀-----------
item.setSpecCode(buildBfRubberSpecCode("F", rubberName));
//update-end---author:jiangxh ---date:20260730 for【混炼示方生成】B/F匹配编号不拼版本后缀-----------
item.setASegmentIndex(null);
} else {
aIndex++;
item.setStepType("A");
item.setASegmentIndex(aIndex);
item.setSpecCode(appendFormulaCodeSuffix("B" + aIndex + rubberName, formulaCodeSuffix));
//update-begin---author:jiangxh ---date:20260730 for【混炼示方生成】B/F匹配编号不拼版本后缀-----------
item.setSpecCode(buildBfRubberSpecCode("B" + aIndex, rubberName));
//update-end---author:jiangxh ---date:20260730 for【混炼示方生成】B/F匹配编号不拼版本后缀-----------
}
items.add(item);
}
//update-begin---author:jiangxh ---date:20260730 for【混炼示方生成】列表点生成混炼示方时即匹配胶料列表-----------
// 点击「生成混炼示方」打开预览时即校验拼接示方编号是否已在胶料列表维护
assertRequiredRubberMaterialsExist(toGenerateRowsFromPreviewItems(items), main, main.getLineList());
//update-end---author:jiangxh ---date:20260730 for【混炼示方生成】列表点生成混炼示方时即匹配胶料列表-----------
MesXslFormulaMixingGeneratePreviewVO preview = new MesXslFormulaMixingGeneratePreviewVO();
preview.setFormulaSpecId(formulaSpecId);
preview.setRubberName(rubberName);
@@ -598,10 +630,10 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
int created = 0;
int totalStages = normalizeMixingStages(formula.getMixingStages());
Date today = Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant());
//update-begin---author:cursor ---date:20260525 forXSLMES-20260525-A48】生成混炼示方同步B/F段胶至密炼物料-----------
Set<String> syncedRubberSpecCodes = new HashSet<>();
//update-begin---author:jiangxh ---date:20260729 for混炼示方生成】B/F胶料改为胶料列表匹配不存在则提示先维护-----------
Map<String, String> categoryIdCache = new HashMap<>();
//update-end---author:cursor ---date:20260525 for【XSLMES-20260525-A48】生成混炼示方同步B/F段胶至密炼物料-----------
assertRequiredRubberMaterialsExist(request.getRows(), formula, lines);
//update-end---author:jiangxh ---date:20260729 for【混炼示方生成】B/F胶料改为胶料列表匹配不存在则提示先维护-----------
for (MesXslFormulaMixingGenerateRowVO row : request.getRows()) {
if (row == null || oConvertUtils.isEmpty(row.getSpecCode()) || row.getStageIndex() == null) {
continue;
@@ -609,11 +641,6 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
if (CollectionUtils.isEmpty(row.getMachines())) {
throw new IllegalArgumentException("示方「" + row.getSpecCode() + "」请至少选择一个机台");
}
//update-begin---author:cursor ---date:20260525 for【XSLMES-20260525-A48】生成混炼示方同步B/F段胶至密炼物料-----------
if (syncedRubberSpecCodes.add(row.getSpecCode().trim())) {
syncGeneratedRubberMixerMaterial(row, formula, compoundSpecificGravity, categoryIdCache);
}
//update-end---author:cursor ---date:20260525 for【XSLMES-20260525-A48】生成混炼示方同步B/F段胶至密炼物料-----------
String materialStep = resolveMixingMaterialStep(row);
int mixingColumn = resolveMixingColumn(row, formula);
List<MesXslMixingSpecMaterial> materials = buildMixingMaterials(
@@ -647,11 +674,15 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
//update-begin---author:cursor ---date:20260525 for【XSLMES-20260525-A44】生成混炼示方时按设备有效体积计算填充体积-----------
mixing.setConvertFactor(BigDecimal.ONE);
boolean isFinalStage = "Q".equalsIgnoreCase(row.getStepType());
//update-begin---author:jiangxh ---date:20260729 for【混炼示方】母胶/终炼胶比重保留三位小数-----------
if (isFinalStage) {
mixing.setFinalRubberSg(compoundSpecificGravity);
} else {
mixing.setMotherRubberSg(formula.getARubberSg());
if (compoundSpecificGravity != null) {
mixing.setFinalRubberSg(compoundSpecificGravity.setScale(3, RoundingMode.HALF_UP));
}
} else if (formula.getARubberSg() != null) {
mixing.setMotherRubberSg(formula.getARubberSg().setScale(3, RoundingMode.HALF_UP));
}
//update-end---author:jiangxh ---date:20260729 for【混炼示方】母胶/终炼胶比重保留三位小数-----------
BigDecimal specificGravity = isFinalStage ? compoundSpecificGravity : formula.getARubberSg();
String machineLabel = StringUtils.defaultIfBlank(machine.getMachineName(), machine.getMachineId());
MesXslEquipmentLedger equipment = equipmentCache.computeIfAbsent(
@@ -766,15 +797,88 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
.divide(effectiveVolume, 6, RoundingMode.HALF_UP)
.multiply(BigDecimal.valueOf(100))
.multiply(factor)
.setScale(6, RoundingMode.HALF_UP);
//update-begin---author:jiangxh ---date:20260729 for【混炼示方】填充体积保留两位小数-----------
.setScale(2, RoundingMode.HALF_UP);
//update-end---author:jiangxh ---date:20260729 for【混炼示方】填充体积保留两位小数-----------
}
//update-end---author:cursor ---date:20260525 for【XSLMES-20260525-A44】生成混炼示方时按设备有效体积计算填充体积-----------
//update-begin---author:cursor ---date:20260601 for【XSLMES-20260601-A62】生成混炼示方改为同步B/F段胶至胶料信息-----------
//update-begin---author:jiangxh ---date:20260729 for【混炼示方生成】B/F胶料改为胶料列表匹配不存在则提示先维护-----------
//update-begin---author:jiangxh ---date:20260730 for【混炼示方生成】预览项转生成行供胶料匹配校验-----------
/** 预览行转为生成行结构,供胶料匹配校验复用 */
private List<MesXslFormulaMixingGenerateRowVO> toGenerateRowsFromPreviewItems(
List<MesXslFormulaMixingGeneratePreviewItemVO> items) {
List<MesXslFormulaMixingGenerateRowVO> rows = new ArrayList<>();
if (CollectionUtils.isEmpty(items)) {
return rows;
}
for (MesXslFormulaMixingGeneratePreviewItemVO item : items) {
if (item == null) {
continue;
}
MesXslFormulaMixingGenerateRowVO row = new MesXslFormulaMixingGenerateRowVO();
row.setSpecCode(item.getSpecCode());
row.setStageIndex(item.getStageIndex());
row.setASegmentIndex(item.getASegmentIndex());
row.setStepType(item.getStepType());
rows.add(row);
}
return rows;
}
//update-end---author:jiangxh ---date:20260730 for【混炼示方生成】预览项转生成行供胶料匹配校验-----------
/**
* 生成混炼示方时,将 B 段/F 段胶料同步写入「胶料信息」(mes_material)
* 除 ERP 编号留空、编码/名称为示方编号外,其余字段按配合示方所选原胶料信息赋值
* 生成前校验:按 B段序号/F + 胶料名 拼出的示方编号,必须已在胶料信息中存在;不再自动新建。
* 在列表点击「生成混炼示方」预览时即调用,确认生成时再次校验
*/
private void assertRequiredRubberMaterialsExist(
List<MesXslFormulaMixingGenerateRowVO> rows,
MesXslFormulaSpec formula,
List<MesXslFormulaSpecLine> lines) {
if (CollectionUtils.isEmpty(rows)) {
return;
}
LinkedHashSet<String> requiredCodes = new LinkedHashSet<>();
String rubberName = resolveRubberName(formula);
for (MesXslFormulaMixingGenerateRowVO row : rows) {
if (row == null || StringUtils.isBlank(row.getSpecCode())) {
continue;
}
requiredCodes.add(row.getSpecCode().trim());
String stepFilter = resolveMixingMaterialStep(row);
int mixingColumn = resolveMixingColumn(row, formula);
if ("Q".equalsIgnoreCase(stepFilter)) {
int lastBSegment = resolveLastBSegmentIndex(formula, lines);
if (lastBSegment > 0 && StringUtils.isNotBlank(rubberName)) {
//update-begin---author:jiangxh ---date:20260730 for【混炼示方生成】母胶匹配不拼版本后缀-----------
requiredCodes.add(buildBfRubberSpecCode("B" + lastBSegment, rubberName));
//update-end---author:jiangxh ---date:20260730 for【混炼示方生成】母胶匹配不拼版本后缀-----------
}
} else if (mixingColumn > 1 && StringUtils.isNotBlank(rubberName)) {
//update-begin---author:jiangxh ---date:20260730 for【混炼示方生成】母胶匹配不拼版本后缀-----------
requiredCodes.add(buildBfRubberSpecCode("B" + (mixingColumn - 1), rubberName));
//update-end---author:jiangxh ---date:20260730 for【混炼示方生成】母胶匹配不拼版本后缀-----------
}
}
List<String> missing = new ArrayList<>();
for (String code : requiredCodes) {
if (StringUtils.isBlank(code)) {
continue;
}
if (findRubberMaterialByCodeOrName(code.trim()) == null) {
missing.add(code.trim());
}
}
if (!missing.isEmpty()) {
throw new IllegalArgumentException("请先维护母胶和终胶信息:" + String.join("", missing));
}
}
/**
* @deprecated 已改为仅匹配胶料列表,保留方法避免历史调用编译缺口;生成流程不再自动写入胶料。
*/
@Deprecated
private void syncGeneratedRubberMixerMaterial(
MesXslFormulaMixingGenerateRowVO row,
MesXslFormulaSpec formula,
@@ -784,60 +888,9 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
return;
}
String specCode = row.getSpecCode().trim();
boolean isFinalStage = "Q".equalsIgnoreCase(resolveMixingMaterialStep(row));
String materialPhase = resolveGeneratedMaterialPhase(row);
MesMaterial sourceRubber = resolveSourceRubberMaterial(formula);
String categoryId = sourceRubber != null ? sourceRubber.getCategoryId() : null;
String rubberName = resolveRubberName(formula);
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);
}
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={}, phase={}, categoryId={}, isFinal={}",
existing.getId(),
specCode,
materialPhase,
categoryId,
isFinalStage);
return;
if (findRubberMaterialByCodeOrName(specCode) == null) {
throw new IllegalArgumentException("请先维护母胶和终胶信息:" + specCode);
}
MesMaterial material = new MesMaterial();
copyGeneratedMaterialFieldsFromSource(material, sourceRubber);
material.setMaterialCode(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);
material.setCreateTime(now);
material.setUpdateTime(now);
mesMaterialService.save(material);
log.info(
"[混炼示方生成] 新增胶料信息 id={}, code={}, phase={}, categoryId={}, isFinal={}",
material.getId(),
specCode,
materialPhase,
categoryId,
isFinalStage);
}
private void copyGeneratedMaterialFieldsFromSource(MesMaterial target, MesMaterial source) {
@@ -867,6 +920,7 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
target.setLastErpSyncTime(source.getLastErpSyncTime());
target.setRemark(source.getRemark());
}
//update-end---author:jiangxh ---date:20260729 for【混炼示方生成】B/F胶料改为胶料列表匹配不存在则提示先维护-----------
private MesMaterial resolveSourceRubberMaterial(MesXslFormulaSpec formula) {
if (formula == null || StringUtils.isBlank(formula.getRubberMaterialId())) {
@@ -967,8 +1021,10 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
}
/**
* 配合示方胶料代号/示方编号中,胶料名称之后的后缀原样截取(如 SA01、SB01 等,不做固定拼接)。
* 配合示方胶料代号/示方编号中,胶料名称之后的后缀原样截取(如 SA01、SB01 等)。
* @deprecated 生成混炼示方匹配胶料已改为仅 B/F+胶料名,不再拼接版本后缀
*/
@Deprecated
private String resolveFormulaCodeSuffix(MesXslFormulaSpec main) {
if (main == null) {
return "";
@@ -995,6 +1051,10 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
return "";
}
/**
* @deprecated 生成混炼示方匹配胶料已改为仅 B/F+胶料名,请使用 {@link #buildBfRubberSpecCode(String, String)}
*/
@Deprecated
private String appendFormulaCodeSuffix(String baseSpecCode, String formulaCodeSuffix) {
if (StringUtils.isBlank(baseSpecCode)) {
return baseSpecCode;
@@ -1005,6 +1065,16 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
return baseSpecCode + formulaCodeSuffix;
}
//update-begin---author:jiangxh ---date:20260730 for【混炼示方生成】B/F匹配编号仅前缀+胶料名-----------
/**
* 生成/匹配用示方编号仅「B{n}/F + 胶料名」,不拼接 SA01 等版本号。
* 例:胶料 XC001 三段 → B1XC001、B2XC001、FXC001
*/
private String buildBfRubberSpecCode(String phasePrefix, String rubberName) {
return StringUtils.defaultString(phasePrefix) + StringUtils.defaultString(rubberName).trim();
}
//update-end---author:jiangxh ---date:20260730 for【混炼示方生成】B/F匹配编号仅前缀+胶料名-----------
private boolean hasStepQ(List<MesXslFormulaSpecLine> lines) {
if (CollectionUtils.isEmpty(lines)) {
return false;
@@ -1071,10 +1141,11 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
if ("Q".equals(stepFilter)) {
//update-begin---author:cursor ---date:20260522 for【XSLMES-20260522-A38】F段加入最后一段B炼好胶料一条再加Q配合剂-----------
String rubberName = resolveRubberName(formula);
String codeSuffix = resolveFormulaCodeSuffix(formula);
int lastBSegment = resolveLastBSegmentIndex(formula, lines);
if (lastBSegment > 0) {
String motherSpecCode = appendFormulaCodeSuffix("B" + lastBSegment + rubberName, codeSuffix);
//update-begin---author:jiangxh ---date:20260730 for【混炼示方生成】母胶编号不拼版本后缀-----------
String motherSpecCode = buildBfRubberSpecCode("B" + lastBSegment, rubberName);
//update-end---author:jiangxh ---date:20260730 for【混炼示方生成】母胶编号不拼版本后缀-----------
BigDecimal motherWeight = resolveStageCumulativeTotal(formula, lines, lastBSegment);
materials.add(
createMotherRubberMaterial(
@@ -1095,7 +1166,6 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
}
int bColumn = Math.max(stageIndex, 1);
String rubberName = resolveRubberName(formula);
String codeSuffix = resolveFormulaCodeSuffix(formula);
if (bColumn <= 1) {
appendBStageColumnAgents(lines, 1, materials, mixerCache, categoryNameCache, kindLookup);
reindexMaterialSortNo(materials);
@@ -1103,7 +1173,9 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
}
// B2/B3…上一段炼好胶料一条(如 B1+胶料名) + 本段列配合剂
int prevB = bColumn - 1;
String motherSpecCode = appendFormulaCodeSuffix("B" + prevB + rubberName, codeSuffix);
//update-begin---author:jiangxh ---date:20260730 for【混炼示方生成】母胶编号不拼版本后缀-----------
String motherSpecCode = buildBfRubberSpecCode("B" + prevB, rubberName);
//update-end---author:jiangxh ---date:20260730 for【混炼示方生成】母胶编号不拼版本后缀-----------
BigDecimal motherWeight = resolveStageCumulativeTotal(formula, lines, prevB);
materials.add(
createMotherRubberMaterial(
@@ -1205,7 +1277,7 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
//update-end---author:cursor ---date:20260601 for【XSLMES-20260601-A62】上一段母胶明细行改绑胶料信息-----------
}
/** 上一段 B 段胶尚未写入胶料信息时,按配合示方胶料类别补建一条胶料信息 */
/** 上一段 B 段胶必须已在胶料信息中维护,不再自动补建 */
private void ensureMotherRubberMaterialSynced(
String motherSpecCode,
MesXslFormulaSpec formula,
@@ -1214,13 +1286,12 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
return;
}
String normalized = motherSpecCode.trim();
//update-begin---author:jiangxh ---date:20260729 for【混炼示方生成】上一段母胶改为胶料列表匹配不存在则提示-----------
if (findRubberMaterialByCodeOrName(normalized) != null) {
return;
}
MesXslFormulaMixingGenerateRowVO stub = new MesXslFormulaMixingGenerateRowVO();
stub.setSpecCode(normalized);
stub.setStepType("A");
syncGeneratedRubberMixerMaterial(stub, formula, null, categoryIdCache);
throw new IllegalArgumentException("请先维护母胶和终胶信息:" + normalized);
//update-end---author:jiangxh ---date:20260729 for【混炼示方生成】上一段母胶改为胶料列表匹配不存在则提示-----------
}
/** 按密炼物料主数据回填混炼示方明细行(名称/大小类/种类) */
@@ -1272,9 +1343,17 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
material.setMaterialMajor(null);
material.setMaterialMinor(categoryName);
material.setMixerMaterialId(rubber.getId());
material.setMaterialKind(
mesXslMixerMaterialKindCfgService.resolveMixingMaterialKind(
kindLookup, rubber.getCategoryId(), null, categoryName));
//update-begin---author:jiangxh ---date:20260729 for【混炼示方生成】母胶行种类按配置解析未命中则带入胶料兜底种类-----------
String kind = mesXslMixerMaterialKindCfgService.resolveMixingMaterialKind(
kindLookup, rubber.getCategoryId(), null, categoryName);
if (StringUtils.isBlank(kind) && kindLookup != null && StringUtils.isNotBlank(kindLookup.getRubberKindName())) {
kind = kindLookup.getRubberKindName().trim();
}
if (StringUtils.isBlank(kind)) {
kind = "胶料";
}
material.setMaterialKind(kind);
//update-end---author:jiangxh ---date:20260729 for【混炼示方生成】母胶行种类按配置解析未命中则带入胶料兜底种类-----------
}
/** 未查到胶料信息时,按配合示方胶料类别从配置表解析种类 */
@@ -1287,9 +1366,17 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl<MesXslFormulaSpecM
String categoryName = resolveCategoryName(categoryId, categoryNameCache);
material.setMaterialMajor(null);
material.setMaterialMinor(categoryName);
material.setMaterialKind(
mesXslMixerMaterialKindCfgService.resolveMixingMaterialKind(
kindLookup, categoryId, null, categoryName));
//update-begin---author:jiangxh ---date:20260729 for【混炼示方生成】母胶兜底种类带入胶料种类-----------
String kind = mesXslMixerMaterialKindCfgService.resolveMixingMaterialKind(
kindLookup, categoryId, null, categoryName);
if (StringUtils.isBlank(kind) && kindLookup != null && StringUtils.isNotBlank(kindLookup.getRubberKindName())) {
kind = kindLookup.getRubberKindName().trim();
}
if (StringUtils.isBlank(kind)) {
kind = "胶料";
}
material.setMaterialKind(kind);
//update-end---author:jiangxh ---date:20260729 for【混炼示方生成】母胶兜底种类带入胶料种类-----------
}
//update-end---author:cursor ---date:20260601 for【XSLMES-20260601-A62】母胶明细行按胶料信息回填-----------
//update-end---author:cursor ---date:20260525 for【XSLMES-20260525-A54】母炼胶明细行绑定已同步密炼物料主数据-----------