refactor(system): 优化 BOM 和工艺路线相关逻辑

- 添加 jcifs 依赖用于共享文件夹操作
- 优化 BOM明细和工艺路线的数据处理逻辑
- 修复材料单位为根时的数量处理问题
- 优化材料属性的设置和处理
- 调整工艺路线的查询和更新逻辑
- 优化日志输出和错误处理
This commit is contained in:
tzy 2025-05-28 08:42:37 +08:00
parent b297a172fe
commit 31240dee30
7 changed files with 76 additions and 42 deletions

View File

@ -17,6 +17,7 @@
<dependencies>
<!-- Spring框架基本的核心工具 -->
<dependency>
<groupId>org.springframework</groupId>
@ -212,7 +213,12 @@
<version>9.1.9490</version>
</dependency>
<!-- jcifs 共享文件夹目录 -->
<dependency>
<groupId>eu.agno3.jcifs</groupId>
<artifactId>jcifs-ng</artifactId>
<version>2.1.9</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-springdoc-ui</artifactId>

View File

@ -722,6 +722,8 @@ public class BomDetailsController extends BaseController {
fTreeEntityItem.addProperty("F_HBYT_BJBM", details.getPartdiagramCode());
fTreeEntityItem.addProperty("F_HBYT_BJMC", details.getPartdiagramName());
fTreeEntityItem.addProperty("FDOSAGETYPE", "2");
//判断这个在原材料表中单位如果是根,的话 那分子就是1 分母就是分子
fTreeEntityItem.addProperty("FNUMERATOR", details.getQuantity());
fTreeEntityItem.addProperty("FDENOMINATOR", details.getDenominator());

View File

@ -647,7 +647,7 @@ public class ProcessRouteController extends BaseController {
materialBom.setUnit(materialUsageDTO.getChildUnit());
materialBom.setMaterialType(materialUsageDTO.getCaizhi());
//保留四位小数
materialBom.setQuantity( new BigDecimal(materialUsageDTO.getFenzi()).divide(new BigDecimal(materialUsageDTO.getFenmu()),2, RoundingMode.HALF_UP));
materialBom.setQuantity( new BigDecimal(materialUsageDTO.getFenzi()).divide(new BigDecimal(materialUsageDTO.getFenmu()),4, RoundingMode.HALF_UP));
return materialBom;
}
@ -659,8 +659,9 @@ public class ProcessRouteController extends BaseController {
bomDetails.setFName(materialAndRoute.getMaterialName());
bomDetails.setPartNumber(materialUsageDTO.getMaterialCode());
bomDetails.setUnitWeight("");
bomDetails.setWareHouse(materialUsageDTO.getChildUnit());
//子项分子
bomDetails.setQuantity(Double.valueOf(materialUsageDTO.getFenzi()));
bomDetails.setQuantity(materialUsageDTO.getFenzi());
//子项分母
bomDetails.setDenominator(Double.valueOf(materialUsageDTO.getFenmu()));
bomDetails.setName(materialUsageDTO.getMaterialName());
@ -703,7 +704,8 @@ public class ProcessRouteController extends BaseController {
processRoute.setFirstBatchQuantity(Double.valueOf(materialAndRoute.getDantai()));
List<MaterialUseDTO> materialUsageDTOList = materialAndRoute.getMaterialUseDTOS();
for (MaterialUseDTO materialUsageDTO : materialUsageDTOList) {
processRoute.setUnitQuantity(Double.valueOf(materialUsageDTO.getFenzi()));
processRoute.setUnitQuantity(materialUsageDTO.getFenzi());
processRoute.setBomMaterial(materialUsageDTO.getCaizhi());
processRoute.setRawMaterialCode(materialUsageDTO.getMaterialCode());
processRoute.setRawMaterialName(materialUsageDTO.getMaterialName());
processRoute.setBomUnit(materialUsageDTO.getChildUnit());
@ -783,6 +785,7 @@ public class ProcessRouteController extends BaseController {
List<MaterialUsageDTO> materialUsageDTOList = combinedDTO.getMaterialUsageDTOList();
for (MaterialUsageDTO materialUsageDTO : materialUsageDTOList) {
processRoute.setUnitQuantity(materialUsageDTO.getFNumerator());
processRoute.setBomMaterial(materialUsageDTO.getChildMaterial());
processRoute.setRawMaterialCode(materialUsageDTO.getMaterialCode());
processRoute.setRawMaterialName(materialUsageDTO.getMaterialName());
processRoute.setBomUnit(materialUsageDTO.getUnit());
@ -805,6 +808,7 @@ public class ProcessRouteController extends BaseController {
bomDetails.setFName(combinedDTO.getMaterialName());
bomDetails.setPartNumber(materialUsageDTO.getMaterialCode());
bomDetails.setUnitWeight("");
bomDetails.setWareHouse(materialUsageDTO.getUnit());
//子项分子
bomDetails.setQuantity(materialUsageDTO.getFNumerator());
//子项分母
@ -866,7 +870,7 @@ public class ProcessRouteController extends BaseController {
.headRowNumber(3)
.doRead();
List<ProcessRouteVo> list = listener.getExcelResult().getList();
List<JDMaterialAndRoute> list1 = iProcessRouteService.getProcessRouteGD(list);
List<JDMaterialAndRoute> list1 = iProcessRouteService.getProcessRouteGD(list);
List<BomDetails> bomDetailsList = new ArrayList<>();
List<ProcessRoute> routeList = new ArrayList<>();

View File

@ -23,7 +23,7 @@ public class MaterialUseDTO
private String materialName;
//分子
@JsonProperty("FNUMERATOR")
private Integer fenzi;
private Double fenzi;
//分母
@JsonProperty("FDENOMINATOR")
private Integer fenmu;

View File

@ -117,7 +117,7 @@ public class updatePcessPlanConver {
if (repoRet.getResult().getResponseStatus().isIsSuccess()) {
System.out.printf("接口返回结果: %s%n", gson.toJson(repoRet.getResult()));
} else {
fail("接口返回结果: " + gson.toJson(repoRet.getResult().getResponseStatus()));
fail("接口返回结果: " + gson.toJson(repoRet.getResult().getResponseStatus().getErrors().get(1)));
}
} catch (Exception e) {
fail(e.getMessage());

View File

@ -76,21 +76,21 @@ public class BomDetailsServiceImpl implements IBomDetailsService {
return baseMapper.selectVoList(lqw);
}
/* private LambdaQueryWrapper<BomDetails> buildQueryWrapper(BomDetailsBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<BomDetails> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getPartNumber()), BomDetails::getPartNumber, bo.getPartNumber());
lqw.like(StringUtils.isNotBlank(bo.getName()), BomDetails::getName, bo.getName());
lqw.like(StringUtils.isNotBlank(bo.getFName()), BomDetails::getFName, bo.getFName());
lqw.like(StringUtils.isNotBlank(bo.getFNumber()), BomDetails::getFNumber, bo.getFNumber());
lqw.eq(bo.getQuantity() != null, BomDetails::getQuantity, bo.getQuantity());
lqw.eq(StringUtils.isNotBlank(bo.getMaterial()), BomDetails::getMaterial, bo.getMaterial());
lqw.eq(bo.getUnitWeight() != null, BomDetails::getUnitWeight, bo.getUnitWeight());
lqw.eq(bo.getTotalWeight() != null, BomDetails::getTotalWeight, bo.getTotalWeight());
lqw.eq(StringUtils.isNotBlank(bo.getRemarks()), BomDetails::getRemarks, bo.getRemarks());
lqw.orderByAsc(BomDetails::getTotalWeight);
return lqw;
}*/
/* private LambdaQueryWrapper<BomDetails> buildQueryWrapper(BomDetailsBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<BomDetails> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getPartNumber()), BomDetails::getPartNumber, bo.getPartNumber());
lqw.like(StringUtils.isNotBlank(bo.getName()), BomDetails::getName, bo.getName());
lqw.like(StringUtils.isNotBlank(bo.getFName()), BomDetails::getFName, bo.getFName());
lqw.like(StringUtils.isNotBlank(bo.getFNumber()), BomDetails::getFNumber, bo.getFNumber());
lqw.eq(bo.getQuantity() != null, BomDetails::getQuantity, bo.getQuantity());
lqw.eq(StringUtils.isNotBlank(bo.getMaterial()), BomDetails::getMaterial, bo.getMaterial());
lqw.eq(bo.getUnitWeight() != null, BomDetails::getUnitWeight, bo.getUnitWeight());
lqw.eq(bo.getTotalWeight() != null, BomDetails::getTotalWeight, bo.getTotalWeight());
lqw.eq(StringUtils.isNotBlank(bo.getRemarks()), BomDetails::getRemarks, bo.getRemarks());
lqw.orderByAsc(BomDetails::getTotalWeight);
return lqw;
}*/
private LambdaQueryWrapper<BomDetails> buildQueryWrapper(BomDetailsBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<BomDetails> lqw = Wrappers.lambdaQuery();
@ -109,6 +109,7 @@ public class BomDetailsServiceImpl implements IBomDetailsService {
lqw.orderByAsc(BomDetails::getTotalWeight);
return lqw;
}
/**
* 新增bom明细
*/
@ -124,6 +125,7 @@ public class BomDetailsServiceImpl implements IBomDetailsService {
}
return flag;
}
@Override
public Boolean insertByVo(BomDetailsVo vo) {
BomDetails add = BeanUtil.toBean(vo, BomDetails.class);
@ -134,6 +136,7 @@ public class BomDetailsServiceImpl implements IBomDetailsService {
}
return flag;
}
/**
* 修改bom明细
*/
@ -147,7 +150,7 @@ public class BomDetailsServiceImpl implements IBomDetailsService {
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(BomDetails entity){
private void validEntityBeforeSave(BomDetails entity) {
//TODO 做一些数据校验,如唯一约束
}
@ -156,7 +159,7 @@ public class BomDetailsServiceImpl implements IBomDetailsService {
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
@ -171,18 +174,18 @@ public class BomDetailsServiceImpl implements IBomDetailsService {
}
@Override
public List<BomDetails> selectByFNumber1(String fNumber,String partNumber,String partName) {
public List<BomDetails> selectByFNumber1(String fNumber, String partNumber, String partName) {
LambdaQueryWrapper<BomDetails> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(fNumber), BomDetails::getFNumber, fNumber);
lqw.eq(StringUtils.isNotBlank(partNumber),BomDetails::getPartNumber,partNumber);
lqw.eq(StringUtils.isNotBlank(partName),BomDetails::getFName,partName);
lqw.eq(StringUtils.isNotBlank(partNumber), BomDetails::getPartNumber, partNumber);
lqw.eq(StringUtils.isNotBlank(partName), BomDetails::getFName, partName);
return baseMapper.selectList(lqw);
}
@Override
public BomDetails selectBOMFNumber(String fnumbers) {
LambdaQueryWrapper<BomDetails> wrapper = Wrappers.lambdaQuery();
wrapper.eq(BomDetails::getFNumber,fnumbers);
wrapper.eq(BomDetails::getFNumber, fnumbers);
return baseMapper.selectOne(wrapper);
}
@ -206,6 +209,7 @@ public class BomDetailsServiceImpl implements IBomDetailsService {
// 使用Map缓存MaterialBom避免双重循环带来的性能问题
if (!materialBoms.isEmpty() && !bomDetails.isEmpty()) {
Map<String, MaterialBom> materialBomMap = materialBoms.stream()
.collect(Collectors.toMap(
mb -> mb.getMaterialCode() + "-" + mb.getMaterialName(),
@ -217,7 +221,13 @@ public class BomDetailsServiceImpl implements IBomDetailsService {
String key = bomDetail.getPartNumber() + "-" + bomDetail.getName();
MaterialBom matchedMaterialBom = materialBomMap.get(key);
if (matchedMaterialBom != null) {
bomDetail.setQuantity(Double.valueOf(String.valueOf(matchedMaterialBom.getQuantity())));
if (matchedMaterialBom.getUnit().equals("")) {
bomDetail.setQuantity(1.0);
bomDetail.setDenominator(Double.valueOf(String.valueOf(matchedMaterialBom.getQuantity())));
} else {
bomDetail.setQuantity(Double.valueOf(String.valueOf(matchedMaterialBom.getQuantity())));
}
}
}
}
@ -242,10 +252,10 @@ public class BomDetailsServiceImpl implements IBomDetailsService {
model.addProperty("FNumber", bomDetails1.getPartNumber());
model.addProperty("FName", bomDetails1.getName());
MaterialProperties materialProperties = iMaterialPropertiesService.selectByAttribute(bomDetails1.getMaterial());
if (materialProperties!=null){
if (materialProperties != null) {
JsonObject FSVRIAssistant = new JsonObject();
FSVRIAssistant.addProperty("FNumber", materialProperties.getMaterialAttributeId());
model.add("F_SVRI_Assistant",FSVRIAssistant);
model.add("F_SVRI_Assistant", FSVRIAssistant);
}
// 创建FMaterialGroup对象并加入Model
JsonObject fMaterialGroup = new JsonObject();

View File

@ -50,6 +50,8 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
@ -197,11 +199,13 @@ public class ProcessRouteServiceImpl implements IProcessRouteService {
bomDetailsVo.setRouteDescription(bomDetail.getTotalWeight());
bomDetailsVo.setMaterialCode(bomDetail.getFNumber());
bomDetailsVo.setMaterialName(bomDetail.getFName());
bomDetailsVo.setMaterial(bomDetail.getMaterial());
bomDetailsVo.setMaterial(processRoute.getMaterial());
bomDetailsVo.setDiscUsage(bomDetail.getQuantity());
bomDetailsVo.setRawMaterialCode(bomDetail.getPartNumber());
bomDetailsVo.setRawMaterialName(bomDetail.getName());
bomDetailsVo.setBomMaterial(processRoute.getBomMaterial());
bomDetailsVo.setBomUnit(bomDetail.getWareHouse());
bomDetailsVo.setBomDanZhong(processRoute.getBomDanZhong());
// 找到对应的 ProcessRouteVo 位置并插入
@ -261,7 +265,6 @@ public class ProcessRouteServiceImpl implements IProcessRouteService {
continue;
}
//表格错乱错行了
JDMaterialAndRoute jdMaterialAndRoute = new JDMaterialAndRoute();
jdMaterialAndRoute.setMaterialCode(processRoute.getRouteDescription());
jdMaterialAndRoute.setMaterialName(processRoute.getMaterialCode());
@ -704,8 +707,16 @@ public class ProcessRouteServiceImpl implements IProcessRouteService {
materialBom.setMaterialName(processRoute.getRawMaterialName());
materialBom.setUnit(unit);
materialBom.setMaterialType(materialType);
//保留4位小数
materialBom.setQuantity(new BigDecimal(quantity));
// 保留4位小数转换成米当单位为 mm
if ("mm".equals(unit)) {
// 将毫米转换为米并保留4位小数
materialBom.setQuantity(new BigDecimal(quantity).divide(BigDecimal.valueOf(1000), 4, BigDecimal.ROUND_HALF_UP));
} else {
// 其他单位直接使用原值保留2位小数
materialBom.setQuantity(new BigDecimal(quantity).setScale(2, BigDecimal.ROUND_HALF_UP));
}
// 这里插入 materialBom 数据
materialBomMapper.insert(materialBom);
}
@ -1557,7 +1568,7 @@ public class ProcessRouteServiceImpl implements IProcessRouteService {
for (Model numDTO : numDTOS) {
tasks.add(() -> {
for (ProcessRoute processRoute : rawBomList) {
ProcessTimeInfo processTimeInfo = selectProcessRouteByMaterialCode(numDTO.getFProcessId_number());
ProcessTimeInfo processTimeInfo = selectProcessRouteByMaterialCode(numDTO.getFProcessId_number(),rooteProdet);
if (numDTO.getFProcessId_number().equals(processRoute.getMaterialCode())) {
numDTO.setFPlanStartTime(processTimeInfo.getTenthProcessStartTime());
numDTO.setFPlanFinishTime(processTimeInfo.getLastProcessEndTime());
@ -1597,7 +1608,7 @@ public class ProcessRouteServiceImpl implements IProcessRouteService {
log.info("更新成功" + repoRet.getResult().getResponseStatus().getSuccessEntitys().toString());
} else {
log.info("更新失败" + repoRet.getResult().getResponseStatus().getErrors().toString());
log.info("更新失败" + repoRet.getResult().getResponseStatus().getErrors().get(0));
}
return numDTOS;
}
@ -2017,9 +2028,10 @@ public class ProcessRouteServiceImpl implements IProcessRouteService {
return dateTime.format(formatter);
}
public ProcessTimeInfo selectProcessRouteByMaterialCode(String materialCode) {
public ProcessTimeInfo selectProcessRouteByMaterialCode(String materialCode,String rooteProdet) {
LambdaQueryWrapper<ProcessRoute> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ProcessRoute::getMaterialCode, materialCode);
wrapper.eq(ProcessRoute::getMaterialCode, materialCode)
.eq(ProcessRoute::getRouteDescription, rooteProdet);
List<ProcessRoute> processRoutes = baseMapper.selectList(wrapper);
ProcessTimeInfo timeInfo = new ProcessTimeInfo(); // 创建返回对象