refactor(system): 优化 BOM 和工艺路线相关逻辑
- 添加 jcifs 依赖用于共享文件夹操作 - 优化 BOM明细和工艺路线的数据处理逻辑 - 修复材料单位为根时的数量处理问题 - 优化材料属性的设置和处理 - 调整工艺路线的查询和更新逻辑 - 优化日志输出和错误处理
This commit is contained in:
parent
b297a172fe
commit
31240dee30
@ -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>
|
||||
|
||||
@ -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());
|
||||
|
||||
|
||||
@ -55,7 +55,7 @@ import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 工艺路线
|
||||
*
|
||||
*
|
||||
* @date 2024-10-09
|
||||
*/
|
||||
@Validated
|
||||
@ -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<>();
|
||||
|
||||
@ -23,7 +23,7 @@ public class MaterialUseDTO
|
||||
private String materialName;
|
||||
//分子
|
||||
@JsonProperty("FNUMERATOR")
|
||||
private Integer fenzi;
|
||||
private Double fenzi;
|
||||
//分母
|
||||
@JsonProperty("FDENOMINATOR")
|
||||
private Integer fenmu;
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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);
|
||||
}
|
||||
@ -791,7 +802,7 @@ public class ProcessRouteServiceImpl implements IProcessRouteService {
|
||||
bomDetails.setFName(processRoute.getMaterialName());
|
||||
bomDetails.setPartNumber(processRoute.getRawMaterialCode());
|
||||
bomDetails.setName(processRoute.getRawMaterialName());
|
||||
|
||||
|
||||
// 添加单重验证和日志
|
||||
Double discWeight = processRoute.getDiscWeight();
|
||||
|
||||
@ -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(); // 创建返回对象
|
||||
|
||||
@ -2362,7 +2374,7 @@ public class ProcessRouteServiceImpl implements IProcessRouteService {
|
||||
|
||||
/**
|
||||
* 更新生产订单的计划开始时间和计划结束时间
|
||||
*
|
||||
*
|
||||
* @param rooteProdet
|
||||
* @return
|
||||
*/
|
||||
|
||||
Loading…
Reference in New Issue
Block a user