diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/doc/代码修改日志 b/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/doc/代码修改日志 index dbdbf90..e53a9b0 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/doc/代码修改日志 +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/doc/代码修改日志 @@ -315,3 +315,19 @@ jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingSpecModal.vue jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingMaterialSelectModal.vue jeecgboot-vue3/src/views/xslmes/mesXslMixerMaterialKindCfg/MesXslMixerMaterialKindCfgList.vue + +-- author:cursor---date:20260525--for: 【XSLMES-20260525-A54】母炼胶明细行绑定已同步密炼物料主数据及种类配置解析 ----------- +jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java + +-- author:cursor---date:20260525--for: 【XSLMES-20260525-A55】混炼示方明细新增密炼物料ID字段 ----------- +jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.2_104__mes_xsl_mixing_spec_material_mixer_material_id.sql +jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/entity/MesXslMixingSpecMaterial.java +jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java +jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslMixingSpecServiceImpl.java +jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts + +-- author:cursor---date:20260525--for: 【XSLMES-20260525-A56】混炼示方批量删除性能优化(子表批量删+去重同步删密炼物料) ----------- +jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslMixingSpecServiceImpl.java + +-- author:cursor---date:20260525--for: 【XSLMES-20260525-A57】混合步骤动作/组合下拉最多展示20条 ----------- +jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingStepSelectCell.vue diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/entity/MesXslMixingSpecMaterial.java b/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/entity/MesXslMixingSpecMaterial.java index 942c299..ac39f3c 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/entity/MesXslMixingSpecMaterial.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/entity/MesXslMixingSpecMaterial.java @@ -40,6 +40,11 @@ public class MesXslMixingSpecMaterial implements Serializable { @Schema(description = "种类") private String materialKind; + //update-begin---author:cursor ---date:20260525 for:【XSLMES-20260525-A55】混炼示方明细关联密炼物料ID----------- + @Schema(description = "密炼物料ID(关联mes_mixer_material.id)") + private String mixerMaterialId; + //update-end---author:cursor ---date:20260525 for:【XSLMES-20260525-A55】混炼示方明细关联密炼物料ID----------- + @Schema(description = "密炼物料名称") private String mixerMaterialName; diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java index 1a3fbaa..9b6361d 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslFormulaSpecServiceImpl.java @@ -562,7 +562,15 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl materials = buildMixingMaterials( - formula, lines, mixingColumn, materialStep, mixerCache, categoryNameCache, kindLookup); + formula, + lines, + mixingColumn, + materialStep, + mixerCache, + categoryNameCache, + kindLookup, + compoundSpecificGravity, + categoryIdCache); for (MesXslFormulaMixingGenerateMachineVO machine : row.getMachines()) { if (machine == null || oConvertUtils.isEmpty(machine.getMachineId())) { continue; @@ -935,7 +943,9 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl mixerCache, Map categoryNameCache, - MesXslMixerMaterialKindLookupVO kindLookup) { + MesXslMixerMaterialKindLookupVO kindLookup, + BigDecimal compoundSpecificGravity, + Map categoryIdCache) { String stepFilter = StringUtils.isNotBlank(materialStep) ? materialStep.trim().toUpperCase() : "A"; List materials = new ArrayList<>(); int sort = 0; @@ -947,7 +957,17 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl 0) { String motherSpecCode = appendFormulaCodeSuffix("B" + lastBSegment + rubberName, codeSuffix); BigDecimal motherWeight = resolveStageCumulativeTotal(formula, lines, lastBSegment); - materials.add(createMotherRubberMaterial(motherSpecCode, rubberName, motherWeight, materials.size(), kindLookup)); + materials.add( + createMotherRubberMaterial( + motherSpecCode, + motherWeight, + materials.size(), + formula, + compoundSpecificGravity, + categoryIdCache, + mixerCache, + categoryNameCache, + kindLookup)); } appendQStageColumnAgents(lines, stageIndex, materials, mixerCache, categoryNameCache, kindLookup); reindexMaterialSortNo(materials); @@ -966,7 +986,17 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl categoryIdCache, + Map mixerCache, + Map categoryNameCache, MesXslMixerMaterialKindLookupVO kindLookup) { + ensureMotherRubberMixerMaterialSynced(motherSpecCode, formula, compoundSpecificGravity, categoryIdCache); MesXslMixingSpecMaterial material = new MesXslMixingSpecMaterial(); material.setSortNo(sortNo); - material.setMixerMaterialName(motherSpecCode); - material.setMixerMaterialDesc(StringUtils.isNotBlank(rubberName) ? rubberName : motherSpecCode); - String rubberKind = - kindLookup != null && StringUtils.isNotBlank(kindLookup.getRubberKindName()) - ? kindLookup.getRubberKindName() - : "胶料"; - material.setMaterialKind(rubberKind); material.setUnitWeight(unitWeight); + MesMixerMaterial mixer = findMixerMaterialByCodeOrName(motherSpecCode.trim()); + if (mixer != null) { + fillMixingMaterialFromMixerMaterial(material, mixer, null, mixerCache, categoryNameCache, kindLookup); + return material; + } + log.warn("[混炼示方生成] 未找到上一段密炼物料 {},明细行回退为示方编号展示", motherSpecCode); + material.setMixerMaterialName(motherSpecCode); + material.setMixerMaterialDesc(motherSpecCode); + fillMotherRubberCategoryFallback(material, categoryIdCache, categoryNameCache, kindLookup); return material; } + /** 上一段 B 段胶尚未写入主数据时,按母炼胶/A胶分类补建一条密炼物料 */ + private void ensureMotherRubberMixerMaterialSynced( + String motherSpecCode, + MesXslFormulaSpec formula, + BigDecimal compoundSpecificGravity, + Map categoryIdCache) { + if (StringUtils.isBlank(motherSpecCode)) { + return; + } + String normalized = motherSpecCode.trim(); + if (findMixerMaterialByCodeOrName(normalized) != null) { + return; + } + MesXslFormulaMixingGenerateRowVO stub = new MesXslFormulaMixingGenerateRowVO(); + stub.setSpecCode(normalized); + stub.setStepType("A"); + syncGeneratedRubberMixerMaterial(stub, formula, compoundSpecificGravity, categoryIdCache); + } + + /** 按密炼物料主数据回填混炼示方明细行(名称/大小类/种类) */ + private void fillMixingMaterialFromMixerMaterial( + MesXslMixingSpecMaterial material, + MesMixerMaterial mixer, + String weighMode, + Map mixerCache, + Map categoryNameCache, + MesXslMixerMaterialKindLookupVO kindLookup) { + if (material == null || mixer == null) { + return; + } + String displayName = + StringUtils.isNotBlank(mixer.getMaterialName()) ? mixer.getMaterialName() : mixer.getMaterialCode(); + material.setMixerMaterialName(displayName); + material.setMixerMaterialDesc( + StringUtils.isNotBlank(mixer.getMaterialDesc()) ? mixer.getMaterialDesc() : displayName); + String majorName = resolveCategoryName(mixer.getMajorCategoryId(), categoryNameCache); + String minorName = resolveCategoryName(mixer.getMinorCategoryId(), categoryNameCache); + material.setMaterialMajor(majorName); + material.setMaterialMinor(minorName); + //update-begin---author:cursor ---date:20260525 for:【XSLMES-20260525-A55】混炼示方明细回填密炼物料ID----------- + material.setMixerMaterialId(mixer.getId()); + //update-end---author:cursor ---date:20260525 for:【XSLMES-20260525-A55】混炼示方明细回填密炼物料ID----------- + material.setMaterialKind( + mesXslMixerMaterialKindCfgService.resolveMixingMaterialKind( + kindLookup, mixer.getMinorCategoryId(), weighMode, minorName)); + if (mixerCache != null && StringUtils.isNotBlank(mixer.getId())) { + mixerCache.put(mixer.getId(), mixer); + } + } + + /** 未查到密炼物料时,按母炼胶/A胶分类从配置表解析种类 */ + private void fillMotherRubberCategoryFallback( + MesXslMixingSpecMaterial material, + Map categoryIdCache, + Map categoryNameCache, + MesXslMixerMaterialKindLookupVO kindLookup) { + String majorCategoryId = resolveCategoryIdByCode(CATEGORY_MASTER_MAJOR, categoryIdCache); + String minorCategoryId = resolveCategoryIdByCode(CATEGORY_MASTER_MINOR_A, categoryIdCache); + material.setMaterialMajor(resolveCategoryName(majorCategoryId, categoryNameCache)); + material.setMaterialMinor(resolveCategoryName(minorCategoryId, categoryNameCache)); + material.setMaterialKind( + mesXslMixerMaterialKindCfgService.resolveMixingMaterialKind( + kindLookup, minorCategoryId, null, material.getMaterialMinor())); + } + //update-end---author:cursor ---date:20260525 for:【XSLMES-20260525-A54】母炼胶明细行绑定已同步密炼物料主数据----------- + /** 混合段累计合计:优先主表 stageNTotal,否则按明细该列求和 */ private BigDecimal resolveStageCumulativeTotal(MesXslFormulaSpec formula, List lines, int column) { BigDecimal fromMain = readStageTotalFromMain(formula, column); @@ -1129,6 +1236,24 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl mixerCache, + Map categoryNameCache, + MesXslMixerMaterialKindLookupVO kindLookup) { + if (oConvertUtils.isEmpty(mixerMaterialId)) { + return; + } + MesMixerMaterial mixer = mixerCache.computeIfAbsent(mixerMaterialId, id -> mesMixerMaterialService.getById(id)); + if (mixer == null) { + return; + } + String weighMode = line != null ? line.getWeighMode() : null; + fillMixingMaterialFromMixerMaterial(material, mixer, weighMode, mixerCache, categoryNameCache, kindLookup); + } + private BigDecimal readStageValue(MesXslFormulaSpecLine line, int stageIndex) { if (line == null || stageIndex < 1 || stageIndex > 7) { return null; @@ -1145,32 +1270,6 @@ public class MesXslFormulaSpecServiceImpl extends ServiceImpl mixerCache, - Map categoryNameCache, - MesXslMixerMaterialKindLookupVO kindLookup) { - if (oConvertUtils.isEmpty(mixerMaterialId)) { - return; - } - MesMixerMaterial mixer = mixerCache.computeIfAbsent(mixerMaterialId, id -> mesMixerMaterialService.getById(id)); - if (mixer == null) { - return; - } - String weighMode = line != null ? line.getWeighMode() : null; - String majorName = resolveCategoryName(mixer.getMajorCategoryId(), categoryNameCache); - String minorName = resolveCategoryName(mixer.getMinorCategoryId(), categoryNameCache); - material.setMaterialMajor(majorName); - material.setMaterialMinor(minorName); - //update-begin---author:cursor ---date:20260525 for:【XSLMES-20260525-A52】生成混炼示方种类改读密炼物料种类配置----------- - material.setMaterialKind( - mesXslMixerMaterialKindCfgService.resolveMixingMaterialKind( - kindLookup, mixer.getMinorCategoryId(), weighMode, minorName)); - //update-end---author:cursor ---date:20260525 for:【XSLMES-20260525-A52】生成混炼示方种类改读密炼物料种类配置----------- - } - private String resolveCategoryName(String categoryId, Map cache) { if (oConvertUtils.isEmpty(categoryId)) { return null; diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslMixingSpecServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslMixingSpecServiceImpl.java index 6f55c62..72c7101 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslMixingSpecServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslMixingSpecServiceImpl.java @@ -8,11 +8,16 @@ import java.io.Serializable; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.regex.Pattern; +import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.constant.CommonConstant; @@ -114,14 +119,12 @@ public class MesXslMixingSpecServiceImpl extends ServiceImpl ids = idList.stream() + .filter(Objects::nonNull) + .map(String::valueOf) + .filter(StringUtils::isNotBlank) + .distinct() + .collect(Collectors.toList()); + if (ids.isEmpty()) { + return; + } + List mains = this.listByIds(ids); + if (CollectionUtils.isEmpty(mains)) { + return; + } + clearChildrenBatch(ids); + this.removeByIds(ids); + Set specNames = new LinkedHashSet<>(); + for (MesXslMixingSpec main : mains) { + if (main != null && StringUtils.isNotBlank(main.getSpecName())) { + specNames.add(main.getSpecName().trim()); } } + for (String specName : specNames) { + syncDeleteGeneratedRubberMixerMaterial(specName); + } + //update-end---author:cursor ---date:20260525 for:【XSLMES-20260525-A56】混炼示方批量删除性能优化----------- } @Override @@ -269,6 +293,19 @@ public class MesXslMixingSpecServiceImpl extends ServiceImpl mainIds) { + if (CollectionUtils.isEmpty(mainIds)) { + return; + } + materialMapper.delete(new LambdaQueryWrapper().in(MesXslMixingSpecMaterial::getMixingSpecId, mainIds)); + stepMapper.delete(new LambdaQueryWrapper().in(MesXslMixingSpecStep::getMixingSpecId, mainIds)); + downStepMapper.delete(new LambdaQueryWrapper().in(MesXslMixingSpecDownStep::getMixingSpecId, mainIds)); + tcuMapper.delete(new LambdaQueryWrapper().in(MesXslMixingSpecTcu::getMixingSpecId, mainIds)); + } + //update-end---author:cursor ---date:20260525 for:【XSLMES-20260525-A56】混炼示方批量删除性能优化----------- + private void saveChildren( String mainId, List materialList, @@ -545,9 +582,12 @@ public class MesXslMixingSpecServiceImpl extends ServiceImpl().eq(MesXslMixingSpecMaterial::getMixerMaterialName, specCode)); + long referencedCount = countMaterialReference(specCode, null); if (referencedCount > 0) { log.info( "[混炼示方删除] 示方编号 {} 仍被 {} 条混炼示方明细引用,跳过密炼物料同步删除", @@ -648,6 +687,15 @@ public class MesXslMixingSpecServiceImpl extends ServiceImpl 0) { + log.info( + "[混炼示方删除] 密炼物料 id={}, code={} 仍被 {} 条混炼示方明细引用,跳过同步删除", + material.getId(), + specCode, + referencedCount); + return; + } Map categoryIdCache = new HashMap<>(); if (!isGeneratedRubberMixerMaterial(material, isFinalStage, categoryIdCache)) { log.info( @@ -706,6 +754,18 @@ public class MesXslMixingSpecServiceImpl extends ServiceImpl qw = new LambdaQueryWrapper<>(); + qw.and(wrapper -> { + wrapper.eq(MesXslMixingSpecMaterial::getMixerMaterialName, specCode); + if (StringUtils.isNotBlank(mixerMaterialId)) { + wrapper.or().eq(MesXslMixingSpecMaterial::getMixerMaterialId, mixerMaterialId); + } + }); + return materialMapper.selectCount(qw); + } + private String resolveCategoryIdByCode(String categoryCode, Map cache) { if (StringUtils.isBlank(categoryCode)) { return null; diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.2_104__mes_xsl_mixing_spec_material_mixer_material_id.sql b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.2_104__mes_xsl_mixing_spec_material_mixer_material_id.sql new file mode 100644 index 0000000..be80cfe --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.2_104__mes_xsl_mixing_spec_material_mixer_material_id.sql @@ -0,0 +1,7 @@ +-- 混炼示方明细:关联密炼物料主数据 ID +SET NAMES utf8mb4; + +ALTER TABLE `mes_xsl_mixing_spec_material` + ADD COLUMN `mixer_material_id` varchar(32) DEFAULT NULL COMMENT '密炼物料ID(关联mes_mixer_material.id)' AFTER `material_kind`; + +CREATE INDEX `idx_mxmix_mat_mixer_id` ON `mes_xsl_mixing_spec_material` (`mixer_material_id`); diff --git a/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts b/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts index 1fae248..734c5bb 100644 --- a/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts +++ b/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/MesXslMixingSpec.data.ts @@ -88,6 +88,9 @@ export const mainSchema: FormSchema[] = [ //update-begin---author:cursor ---date:20260522 for:【XSLMES-20260522-A17】橡胶及配合剂明细列展示设置----------- export const materialColumns: JVxeColumn[] = [ + //update-begin---author:cursor ---date:20260525 for:【XSLMES-20260525-A55】混炼示方明细关联密炼物料ID----------- + { title: '密炼物料ID', key: 'mixerMaterialId', type: JVxeTypes.hidden }, + //update-end---author:cursor ---date:20260525 for:【XSLMES-20260525-A55】混炼示方明细关联密炼物料ID----------- { title: '物料大类', key: 'materialMajor', type: JVxeTypes.input, width: 100, minWidth: MIXING_MATERIAL_MIN_COLUMN_WIDTH }, { title: '物料小类', key: 'materialMinor', type: JVxeTypes.input, width: 120, minWidth: MIXING_MATERIAL_MIN_COLUMN_WIDTH }, { title: '种类', key: 'materialKind', type: JVxeTypes.input, width: 80, minWidth: MIXING_MATERIAL_MIN_COLUMN_WIDTH }, @@ -219,7 +222,7 @@ function isMixingMaterialDataRow(row: Recordable): boolean { if (!row) { return false; } - return !!(row.mixerMaterialName || row.materialKind || row.unitWeight != null && row.unitWeight !== ''); + return !!(row.mixerMaterialId || row.mixerMaterialName || row.materialKind || row.unitWeight != null && row.unitWeight !== ''); } /** 规范化种类字段,用于连续行分组 */ @@ -1100,6 +1103,9 @@ export function applyMixingMaterialFromSelection(row: Recordable, material: Reco if (!row || !material) { return; } + //update-begin---author:cursor ---date:20260525 for:【XSLMES-20260525-A55】选料回填密炼物料ID----------- + row.mixerMaterialId = material.id || material.mixerMaterialId || ''; + //update-end---author:cursor ---date:20260525 for:【XSLMES-20260525-A55】选料回填密炼物料ID----------- row.mixerMaterialName = material.materialName || material.materialCode || ''; row.mixerMaterialDesc = material.materialDesc || material.materialName || material.materialCode || ''; row.materialMajor = material.majorCategoryId_dictText || ''; diff --git a/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingStepSelectCell.vue b/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingStepSelectCell.vue index 198a64b..89adc97 100644 --- a/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingStepSelectCell.vue +++ b/jeecgboot-vue3/src/views/xslmes/mesXslMixingSpec/components/MesXslMixingStepSelectCell.vue @@ -10,6 +10,7 @@ size="small" class="mixing-step-select" popup-class-name="mixing-step-select-dropdown" + :list-height="listHeight" :placeholder="placeholder" :get-popup-container="getPopupContainer" @update:value="handleChange" @@ -19,9 +20,14 @@