update 配方信息关联称量、混炼

master
yinq 2 days ago
parent f193b796c4
commit 1da704861c

@ -19,6 +19,7 @@ import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.mes.domain.vo.ProdRecipeInfoVo; import org.dromara.mes.domain.vo.ProdRecipeInfoVo;
import org.dromara.mes.domain.bo.ProdRecipeInfoBo; import org.dromara.mes.domain.bo.ProdRecipeInfoBo;
import org.dromara.mes.domain.bo.RecipeDetailSaveBo;
import org.dromara.mes.service.IProdRecipeInfoService; import org.dromara.mes.service.IProdRecipeInfoService;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
@ -108,10 +109,20 @@ public class ProdRecipeInfoController extends BaseController {
/** /**
* - * -
*/ */
@GetMapping("/getProdRecipeInfoList") @GetMapping("/getProdRecipeInfoList")
public R<List<ProdRecipeInfoVo>> getProdRecipeInfoList(ProdRecipeInfoBo bo) { public R<List<ProdRecipeInfoVo>> getProdRecipeInfoList(ProdRecipeInfoBo bo) {
List<ProdRecipeInfoVo> list = prodRecipeInfoService.queryList(bo); List<ProdRecipeInfoVo> list = prodRecipeInfoService.queryList(bo);
return R.ok(list); return R.ok(list);
} }
/**
* ++
*/
@SaCheckPermission("mes:recipeInfo:edit")
@Log(title = "配方明细", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PostMapping("/saveDetail")
public R<Void> saveDetail(@Validated @RequestBody RecipeDetailSaveBo bo) {
return toAjax(prodRecipeInfoService.saveDetail(bo));
}
} }

@ -29,7 +29,6 @@ public class ProdRecipeMixingBo extends BaseEntity {
/** /**
* ID * ID
*/ */
@NotNull(message = "配方ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long recipeId; private Long recipeId;
/** /**

@ -22,93 +22,78 @@ import java.math.BigDecimal;
public class ProdRecipeWeightBo extends BaseEntity { public class ProdRecipeWeightBo extends BaseEntity {
/** /**
* *
*/ */
@NotNull(message = "主键标识不能为空", groups = { AddGroup.class, EditGroup.class })
private Long weightId; private Long weightId;
/** /**
* ID * ID
*/ */
@NotNull(message = "配方ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long recipeId; private Long recipeId;
/** /**
* *
*/ */
@NotNull(message = "称量序号不能为空", groups = { AddGroup.class, EditGroup.class })
private Long weightSeq; private Long weightSeq;
/** /**
* ID * ID
*/ */
@NotNull(message = "机台ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long machineId; private Long machineId;
/** /**
* *
*/ */
@NotNull(message = "版本号不能为空", groups = { AddGroup.class, EditGroup.class })
private Long edtCode; private Long edtCode;
/** /**
* *
*/ */
@NotBlank(message = "称量类型不能为空", groups = { AddGroup.class, EditGroup.class })
private String weightType; private String weightType;
/** /**
* *
*/ */
@NotNull(message = "秤编码不能为空", groups = { AddGroup.class, EditGroup.class })
private Long scaleCode; private Long scaleCode;
/** /**
* *
*/ */
@NotBlank(message = "动作编码不能为空", groups = { AddGroup.class, EditGroup.class })
private String actCode; private String actCode;
/** /**
* *
*/ */
@NotNull(message = "设定重量不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal setWeight; private BigDecimal setWeight;
/** /**
* *
*/ */
@NotNull(message = "误差允许不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal errorAllow; private BigDecimal errorAllow;
/** /**
* *
*/ */
@NotBlank(message = "父级编码不能为空", groups = { AddGroup.class, EditGroup.class })
private String fatherCode; private String fatherCode;
/** /**
* *
*/ */
@NotNull(message = "单位不能为空", groups = { AddGroup.class, EditGroup.class })
private Long unitId; private Long unitId;
/** /**
* *
*/ */
@NotBlank(message = "子级编码不能为空", groups = { AddGroup.class, EditGroup.class }) private Long childCode;
private String childCode;
/** /**
* 使 * 使
*/ */
@NotBlank(message = "是否使用批次不能为空", groups = { AddGroup.class, EditGroup.class })
private String ifUseBat; private String ifUseBat;
/** /**
* *
*/ */
@NotBlank(message = "最大比例不能为空", groups = { AddGroup.class, EditGroup.class })
private String maxRate; private String maxRate;

@ -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<ProdRecipeWeightBo> weightList;
/**
*
*/
private List<ProdRecipeMixingBo> mixingList;
}

@ -3,6 +3,7 @@ package org.dromara.mes.service;
import org.dromara.mes.domain.ProdRecipeInfo; import org.dromara.mes.domain.ProdRecipeInfo;
import org.dromara.mes.domain.vo.ProdRecipeInfoVo; import org.dromara.mes.domain.vo.ProdRecipeInfoVo;
import org.dromara.mes.domain.bo.ProdRecipeInfoBo; 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.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
@ -66,4 +67,12 @@ public interface IProdRecipeInfoService {
* @return * @return
*/ */
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* ++
*
* @param bo
* @return
*/
Boolean saveDetail(RecipeDetailSaveBo bo);
} }

@ -66,4 +66,12 @@ public interface IProdRecipeMixingService {
* @return * @return
*/ */
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* ID
*
* @param recipeId ID
* @return
*/
Boolean deleteByRecipeId(Long recipeId);
} }

@ -66,4 +66,12 @@ public interface IProdRecipeWeightService {
* @return * @return
*/ */
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* ID
*
* @param recipeId ID
* @return
*/
Boolean deleteByRecipeId(Long recipeId);
} }

@ -10,15 +10,23 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.dromara.mes.domain.bo.ProdRecipeInfoBo; 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.vo.ProdRecipeInfoVo;
import org.dromara.mes.domain.ProdRecipeInfo; import org.dromara.mes.domain.ProdRecipeInfo;
import org.dromara.mes.mapper.ProdRecipeInfoMapper; import org.dromara.mes.mapper.ProdRecipeInfoMapper;
import org.dromara.mes.service.IProdRecipeInfoService; 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.List;
import java.util.Map; import java.util.Map;
import java.util.Collection; import java.util.Collection;
import java.util.ArrayList;
import java.util.stream.Collectors;
/** /**
* -Service * -Service
@ -31,6 +39,8 @@ import java.util.Collection;
public class ProdRecipeInfoServiceImpl implements IProdRecipeInfoService { public class ProdRecipeInfoServiceImpl implements IProdRecipeInfoService {
private final ProdRecipeInfoMapper baseMapper; private final ProdRecipeInfoMapper baseMapper;
private final IProdRecipeWeightService prodRecipeWeightService;
private final IProdRecipeMixingService prodRecipeMixingService;
/** /**
* - * -
@ -75,7 +85,7 @@ public class ProdRecipeInfoServiceImpl implements IProdRecipeInfoService {
.selectAll(ProdRecipeInfo.class) .selectAll(ProdRecipeInfo.class)
.eq(bo.getRecipeId() != null, ProdRecipeInfo::getRecipeId, bo.getRecipeId()) .eq(bo.getRecipeId() != null, ProdRecipeInfo::getRecipeId, bo.getRecipeId())
.eq(bo.getMachineId() != null, ProdRecipeInfo::getMachineId, bo.getMachineId()) .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.getEdtCode() != null, ProdRecipeInfo::getEdtCode, bo.getEdtCode())
.eq(bo.getRecipeType() != null, ProdRecipeInfo::getRecipeType, bo.getRecipeType()) .eq(bo.getRecipeType() != null, ProdRecipeInfo::getRecipeType, bo.getRecipeType())
.eq(StringUtils.isNotBlank(bo.getUserEdtCode()), ProdRecipeInfo::getUserEdtCode, bo.getUserEdtCode()) .eq(StringUtils.isNotBlank(bo.getUserEdtCode()), ProdRecipeInfo::getUserEdtCode, bo.getUserEdtCode())
@ -189,4 +199,96 @@ public class ProdRecipeInfoServiceImpl implements IProdRecipeInfoService {
} }
return baseMapper.deleteByIds(ids) > 0; 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<ProdRecipeWeightBo> weightList = bo.getWeightList() != null ? bo.getWeightList() : new ArrayList<>();
List<Long> submittedWeightIds = weightList.stream()
.map(ProdRecipeWeightBo::getWeightId)
.filter(id -> id != null)
.collect(Collectors.toList());
ProdRecipeWeightBo weightQuery = new ProdRecipeWeightBo();
weightQuery.setRecipeId(recipeId);
List<Long> existingWeightIds = prodRecipeWeightService.queryList(weightQuery).stream()
.map(vo -> vo.getWeightId())
.collect(Collectors.toList());
List<Long> 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<ProdRecipeMixingBo> mixingList = bo.getMixingList() != null ? bo.getMixingList() : new ArrayList<>();
List<Long> submittedMixingIds = mixingList.stream()
.map(ProdRecipeMixingBo::getMixingId)
.filter(id -> id != null)
.collect(Collectors.toList());
ProdRecipeMixingBo mixingQuery = new ProdRecipeMixingBo();
mixingQuery.setRecipeId(recipeId);
List<Long> existingMixingIds = prodRecipeMixingService.queryList(mixingQuery).stream()
.map(vo -> vo.getMixingId())
.collect(Collectors.toList());
List<Long> 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;
}
} }

@ -150,4 +150,9 @@ public class ProdRecipeMixingServiceImpl implements IProdRecipeMixingService {
} }
return baseMapper.deleteByIds(ids) > 0; return baseMapper.deleteByIds(ids) > 0;
} }
@Override
public Boolean deleteByRecipeId(Long recipeId) {
return baseMapper.delete(Wrappers.<ProdRecipeMixing>lambdaQuery().eq(ProdRecipeMixing::getRecipeId, recipeId)) > 0;
}
} }

@ -85,7 +85,7 @@ public class ProdRecipeWeightServiceImpl implements IProdRecipeWeightService {
.eq(bo.getErrorAllow() != null, ProdRecipeWeight::getErrorAllow, bo.getErrorAllow()) .eq(bo.getErrorAllow() != null, ProdRecipeWeight::getErrorAllow, bo.getErrorAllow())
.eq(StringUtils.isNotBlank(bo.getFatherCode()), ProdRecipeWeight::getFatherCode, bo.getFatherCode()) .eq(StringUtils.isNotBlank(bo.getFatherCode()), ProdRecipeWeight::getFatherCode, bo.getFatherCode())
.eq(bo.getUnitId() != null, ProdRecipeWeight::getUnitId, bo.getUnitId()) .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.getIfUseBat()), ProdRecipeWeight::getIfUseBat, bo.getIfUseBat())
.eq(StringUtils.isNotBlank(bo.getMaxRate()), ProdRecipeWeight::getMaxRate, bo.getMaxRate()) .eq(StringUtils.isNotBlank(bo.getMaxRate()), ProdRecipeWeight::getMaxRate, bo.getMaxRate())
.orderByDesc(ProdRecipeWeight::getCreateTime); .orderByDesc(ProdRecipeWeight::getCreateTime);
@ -143,4 +143,9 @@ public class ProdRecipeWeightServiceImpl implements IProdRecipeWeightService {
} }
return baseMapper.deleteByIds(ids) > 0; return baseMapper.deleteByIds(ids) > 0;
} }
@Override
public Boolean deleteByRecipeId(Long recipeId) {
return baseMapper.delete(Wrappers.<ProdRecipeWeight>lambdaQuery().eq(ProdRecipeWeight::getRecipeId, recipeId)) > 0;
}
} }

Loading…
Cancel
Save