From 1da704861cdb8ebef698c787392b2acb8b315815 Mon Sep 17 00:00:00 2001 From: yinq Date: Thu, 12 Feb 2026 20:57:29 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E9=85=8D=E6=96=B9=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=85=B3=E8=81=94=E7=A7=B0=E9=87=8F=E3=80=81=E6=B7=B7=E7=82=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ProdRecipeInfoController.java | 13 ++- .../mes/domain/bo/ProdRecipeMixingBo.java | 1 - .../mes/domain/bo/ProdRecipeWeightBo.java | 19 +--- .../mes/domain/bo/RecipeDetailSaveBo.java | 33 ++++++ .../mes/service/IProdRecipeInfoService.java | 9 ++ .../mes/service/IProdRecipeMixingService.java | 8 ++ .../mes/service/IProdRecipeWeightService.java | 8 ++ .../impl/ProdRecipeInfoServiceImpl.java | 104 +++++++++++++++++- .../impl/ProdRecipeMixingServiceImpl.java | 5 + .../impl/ProdRecipeWeightServiceImpl.java | 7 +- 10 files changed, 186 insertions(+), 21 deletions(-) create mode 100644 ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/RecipeDetailSaveBo.java diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/controller/ProdRecipeInfoController.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/controller/ProdRecipeInfoController.java index 8cd396c0..790f08d0 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/controller/ProdRecipeInfoController.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/controller/ProdRecipeInfoController.java @@ -19,6 +19,7 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.mes.domain.vo.ProdRecipeInfoVo; import org.dromara.mes.domain.bo.ProdRecipeInfoBo; +import org.dromara.mes.domain.bo.RecipeDetailSaveBo; import org.dromara.mes.service.IProdRecipeInfoService; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -108,10 +109,20 @@ public class ProdRecipeInfoController extends BaseController { /** * 下拉框查询配方-基础信息列表 */ - @GetMapping("/getProdRecipeInfoList") public R> getProdRecipeInfoList(ProdRecipeInfoBo bo) { List list = prodRecipeInfoService.queryList(bo); return R.ok(list); } + + /** + * 配方明细一次保存(基本信息+称量信息+混炼信息) + */ + @SaCheckPermission("mes:recipeInfo:edit") + @Log(title = "配方明细", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/saveDetail") + public R saveDetail(@Validated @RequestBody RecipeDetailSaveBo bo) { + return toAjax(prodRecipeInfoService.saveDetail(bo)); + } } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/ProdRecipeMixingBo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/ProdRecipeMixingBo.java index d8ccee61..afaa28ba 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/ProdRecipeMixingBo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/ProdRecipeMixingBo.java @@ -29,7 +29,6 @@ public class ProdRecipeMixingBo extends BaseEntity { /** * 配方ID */ - @NotNull(message = "配方ID不能为空", groups = { AddGroup.class, EditGroup.class }) private Long recipeId; /** diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/ProdRecipeWeightBo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/ProdRecipeWeightBo.java index ff1394ce..62532901 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/ProdRecipeWeightBo.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/ProdRecipeWeightBo.java @@ -22,93 +22,78 @@ import java.math.BigDecimal; public class ProdRecipeWeightBo extends BaseEntity { /** - * 主键标识 + * 主键标识(新增时可为空,由数据库生成) */ - @NotNull(message = "主键标识不能为空", groups = { AddGroup.class, EditGroup.class }) private Long weightId; /** * 配方ID */ - @NotNull(message = "配方ID不能为空", groups = { AddGroup.class, EditGroup.class }) private Long recipeId; /** * 称量序号 */ - @NotNull(message = "称量序号不能为空", groups = { AddGroup.class, EditGroup.class }) private Long weightSeq; /** * 机台ID */ - @NotNull(message = "机台ID不能为空", groups = { AddGroup.class, EditGroup.class }) private Long machineId; /** * 版本号 */ - @NotNull(message = "版本号不能为空", groups = { AddGroup.class, EditGroup.class }) private Long edtCode; /** * 称量类型 */ - @NotBlank(message = "称量类型不能为空", groups = { AddGroup.class, EditGroup.class }) private String weightType; /** * 秤编码 */ - @NotNull(message = "秤编码不能为空", groups = { AddGroup.class, EditGroup.class }) private Long scaleCode; /** * 动作编码 */ - @NotBlank(message = "动作编码不能为空", groups = { AddGroup.class, EditGroup.class }) private String actCode; /** * 设定重量 */ - @NotNull(message = "设定重量不能为空", groups = { AddGroup.class, EditGroup.class }) private BigDecimal setWeight; /** * 误差允许 */ - @NotNull(message = "误差允许不能为空", groups = { AddGroup.class, EditGroup.class }) private BigDecimal errorAllow; /** * 父级编码 */ - @NotBlank(message = "父级编码不能为空", groups = { AddGroup.class, EditGroup.class }) private String fatherCode; /** * 单位 */ - @NotNull(message = "单位不能为空", groups = { AddGroup.class, EditGroup.class }) private Long unitId; /** * 子级编码 */ - @NotBlank(message = "子级编码不能为空", groups = { AddGroup.class, EditGroup.class }) - private String childCode; + private Long childCode; /** * 是否使用批次 */ - @NotBlank(message = "是否使用批次不能为空", groups = { AddGroup.class, EditGroup.class }) private String ifUseBat; /** * 最大比例 */ - @NotBlank(message = "最大比例不能为空", groups = { AddGroup.class, EditGroup.class }) private String maxRate; diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/RecipeDetailSaveBo.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/RecipeDetailSaveBo.java new file mode 100644 index 00000000..09f161b1 --- /dev/null +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/domain/bo/RecipeDetailSaveBo.java @@ -0,0 +1,33 @@ +package org.dromara.mes.domain.bo; + +import lombok.Data; + +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import java.util.List; + +/** + * 配方明细一次保存 DTO(基本信息+称量信息+混炼信息) + * + * @author system + */ +@Data +public class RecipeDetailSaveBo { + + /** + * 配方基本信息 + */ + @NotNull(message = "配方基本信息不能为空") + @Valid + private ProdRecipeInfoBo recipeInfo; + + /** + * 称量信息列表 + */ + private List weightList; + + /** + * 混炼信息列表 + */ + private List mixingList; +} diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdRecipeInfoService.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdRecipeInfoService.java index 1e50e790..f08aed4b 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdRecipeInfoService.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdRecipeInfoService.java @@ -3,6 +3,7 @@ package org.dromara.mes.service; import org.dromara.mes.domain.ProdRecipeInfo; import org.dromara.mes.domain.vo.ProdRecipeInfoVo; import org.dromara.mes.domain.bo.ProdRecipeInfoBo; +import org.dromara.mes.domain.bo.RecipeDetailSaveBo; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; @@ -66,4 +67,12 @@ public interface IProdRecipeInfoService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 配方明细一次保存(基本信息+称量信息+混炼信息) + * + * @param bo 配方明细保存对象 + * @return 是否成功 + */ + Boolean saveDetail(RecipeDetailSaveBo bo); } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdRecipeMixingService.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdRecipeMixingService.java index 842a5ce7..cbe095b7 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdRecipeMixingService.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdRecipeMixingService.java @@ -66,4 +66,12 @@ public interface IProdRecipeMixingService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 按配方ID删除混炼信息 + * + * @param recipeId 配方ID + * @return 是否删除成功 + */ + Boolean deleteByRecipeId(Long recipeId); } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdRecipeWeightService.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdRecipeWeightService.java index e519e879..e0544791 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdRecipeWeightService.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/IProdRecipeWeightService.java @@ -66,4 +66,12 @@ public interface IProdRecipeWeightService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 按配方ID删除称量信息 + * + * @param recipeId 配方ID + * @return 是否删除成功 + */ + Boolean deleteByRecipeId(Long recipeId); } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdRecipeInfoServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdRecipeInfoServiceImpl.java index 457b7217..eccf0fec 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdRecipeInfoServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdRecipeInfoServiceImpl.java @@ -10,15 +10,23 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.dromara.mes.domain.bo.ProdRecipeInfoBo; +import org.dromara.mes.domain.bo.ProdRecipeWeightBo; +import org.dromara.mes.domain.bo.ProdRecipeMixingBo; +import org.dromara.mes.domain.bo.RecipeDetailSaveBo; import org.dromara.mes.domain.vo.ProdRecipeInfoVo; import org.dromara.mes.domain.ProdRecipeInfo; import org.dromara.mes.mapper.ProdRecipeInfoMapper; import org.dromara.mes.service.IProdRecipeInfoService; +import org.dromara.mes.service.IProdRecipeWeightService; +import org.dromara.mes.service.IProdRecipeMixingService; import java.util.List; import java.util.Map; import java.util.Collection; +import java.util.ArrayList; +import java.util.stream.Collectors; /** * 配方-基础信息Service业务层处理 @@ -31,6 +39,8 @@ import java.util.Collection; public class ProdRecipeInfoServiceImpl implements IProdRecipeInfoService { private final ProdRecipeInfoMapper baseMapper; + private final IProdRecipeWeightService prodRecipeWeightService; + private final IProdRecipeMixingService prodRecipeMixingService; /** * 查询配方-基础信息 @@ -75,7 +85,7 @@ public class ProdRecipeInfoServiceImpl implements IProdRecipeInfoService { .selectAll(ProdRecipeInfo.class) .eq(bo.getRecipeId() != null, ProdRecipeInfo::getRecipeId, bo.getRecipeId()) .eq(bo.getMachineId() != null, ProdRecipeInfo::getMachineId, bo.getMachineId()) - .eq(StringUtils.isNotBlank(bo.getMaterialId()), ProdRecipeInfo::getMaterialId, bo.getMaterialId()) + .eq(bo.getMaterialId() != null, ProdRecipeInfo::getMaterialId, bo.getMaterialId()) .eq(bo.getEdtCode() != null, ProdRecipeInfo::getEdtCode, bo.getEdtCode()) .eq(bo.getRecipeType() != null, ProdRecipeInfo::getRecipeType, bo.getRecipeType()) .eq(StringUtils.isNotBlank(bo.getUserEdtCode()), ProdRecipeInfo::getUserEdtCode, bo.getUserEdtCode()) @@ -189,4 +199,96 @@ public class ProdRecipeInfoServiceImpl implements IProdRecipeInfoService { } return baseMapper.deleteByIds(ids) > 0; } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean saveDetail(RecipeDetailSaveBo bo) { + ProdRecipeInfoBo recipeInfo = bo.getRecipeInfo(); + if (recipeInfo == null || recipeInfo.getRecipeId() == null) { + throw new IllegalArgumentException("配方ID不能为空"); + } + Long recipeId = recipeInfo.getRecipeId(); + // 1. 更新配方基本信息 + updateByBo(recipeInfo); + + // 2. 称量信息:有主键则更新,无主键则插入;删除提交列表中已不存在的原记录 + List weightList = bo.getWeightList() != null ? bo.getWeightList() : new ArrayList<>(); + List submittedWeightIds = weightList.stream() + .map(ProdRecipeWeightBo::getWeightId) + .filter(id -> id != null) + .collect(Collectors.toList()); + ProdRecipeWeightBo weightQuery = new ProdRecipeWeightBo(); + weightQuery.setRecipeId(recipeId); + List existingWeightIds = prodRecipeWeightService.queryList(weightQuery).stream() + .map(vo -> vo.getWeightId()) + .collect(Collectors.toList()); + List weightIdsToDelete = existingWeightIds.stream() + .filter(id -> !submittedWeightIds.contains(id)) + .collect(Collectors.toList()); + if (!weightIdsToDelete.isEmpty()) { + prodRecipeWeightService.deleteWithValidByIds(weightIdsToDelete, false); + } + int weightSeq = 0; + for (ProdRecipeWeightBo w : weightList) { + if (w.getSetWeight() == null && StringUtils.isBlank(w.getActCode()) && StringUtils.isNull(w.getChildCode())) { + continue; + } + weightSeq++; + w.setRecipeId(recipeId); + if (w.getMachineId() == null) { + w.setMachineId(recipeInfo.getMachineId()); + } + if (w.getEdtCode() == null) { + w.setEdtCode(recipeInfo.getEdtCode()); + } + w.setWeightSeq((long) weightSeq); + if (w.getWeightId() != null) { + prodRecipeWeightService.updateByBo(w); + } else { + w.setWeightId(null); + prodRecipeWeightService.insertByBo(w); + } + } + + // 3. 混炼信息:有主键则更新,无主键则插入;删除提交列表中已不存在的原记录 + List mixingList = bo.getMixingList() != null ? bo.getMixingList() : new ArrayList<>(); + List submittedMixingIds = mixingList.stream() + .map(ProdRecipeMixingBo::getMixingId) + .filter(id -> id != null) + .collect(Collectors.toList()); + ProdRecipeMixingBo mixingQuery = new ProdRecipeMixingBo(); + mixingQuery.setRecipeId(recipeId); + List existingMixingIds = prodRecipeMixingService.queryList(mixingQuery).stream() + .map(vo -> vo.getMixingId()) + .collect(Collectors.toList()); + List mixingIdsToDelete = existingMixingIds.stream() + .filter(id -> !submittedMixingIds.contains(id)) + .collect(Collectors.toList()); + if (!mixingIdsToDelete.isEmpty()) { + prodRecipeMixingService.deleteWithValidByIds(mixingIdsToDelete, false); + } + int mixSeq = 0; + for (ProdRecipeMixingBo m : mixingList) { + if (StringUtils.isBlank(m.getActCode()) && m.getSetTime() == null && m.getSetTemp() == null) { + continue; + } + mixSeq++; + m.setRecipeId(recipeId); + if (m.getMachineId() == null) { + m.setMachineId(recipeInfo.getMachineId()); + } + if (m.getEdtCode() == null) { + m.setEdtCode(recipeInfo.getEdtCode()); + } + m.setMixId((long) mixSeq); + if (m.getMixingId() != null) { + prodRecipeMixingService.updateByBo(m); + } else { + m.setMixingId(null); + prodRecipeMixingService.insertByBo(m); + } + } + return true; + } + } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdRecipeMixingServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdRecipeMixingServiceImpl.java index 40984492..77a0361d 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdRecipeMixingServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdRecipeMixingServiceImpl.java @@ -150,4 +150,9 @@ public class ProdRecipeMixingServiceImpl implements IProdRecipeMixingService { } return baseMapper.deleteByIds(ids) > 0; } + + @Override + public Boolean deleteByRecipeId(Long recipeId) { + return baseMapper.delete(Wrappers.lambdaQuery().eq(ProdRecipeMixing::getRecipeId, recipeId)) > 0; + } } diff --git a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdRecipeWeightServiceImpl.java b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdRecipeWeightServiceImpl.java index 8c3b6cc7..9204b9ea 100644 --- a/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdRecipeWeightServiceImpl.java +++ b/ruoyi-modules/hwmom-mes/src/main/java/org/dromara/mes/service/impl/ProdRecipeWeightServiceImpl.java @@ -85,7 +85,7 @@ public class ProdRecipeWeightServiceImpl implements IProdRecipeWeightService { .eq(bo.getErrorAllow() != null, ProdRecipeWeight::getErrorAllow, bo.getErrorAllow()) .eq(StringUtils.isNotBlank(bo.getFatherCode()), ProdRecipeWeight::getFatherCode, bo.getFatherCode()) .eq(bo.getUnitId() != null, ProdRecipeWeight::getUnitId, bo.getUnitId()) - .eq(StringUtils.isNotBlank(bo.getChildCode()), ProdRecipeWeight::getChildCode, bo.getChildCode()) + .eq(bo.getChildCode() != null, ProdRecipeWeight::getChildCode, bo.getChildCode()) .eq(StringUtils.isNotBlank(bo.getIfUseBat()), ProdRecipeWeight::getIfUseBat, bo.getIfUseBat()) .eq(StringUtils.isNotBlank(bo.getMaxRate()), ProdRecipeWeight::getMaxRate, bo.getMaxRate()) .orderByDesc(ProdRecipeWeight::getCreateTime); @@ -143,4 +143,9 @@ public class ProdRecipeWeightServiceImpl implements IProdRecipeWeightService { } return baseMapper.deleteByIds(ids) > 0; } + + @Override + public Boolean deleteByRecipeId(Long recipeId) { + return baseMapper.delete(Wrappers.lambdaQuery().eq(ProdRecipeWeight::getRecipeId, recipeId)) > 0; + } }