From 085ee1403c0193111a63d48ffaa4563b9a83ea46 Mon Sep 17 00:00:00 2001 From: tzy1042411602 <1042411602@qq.com> Date: Sat, 7 Dec 2024 11:12:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E8=89=BA=E6=A8=A1=E5=9D=97,=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BomDetailsController.java | 47 +- .../controller/MaterialBomController.java | 19 +- .../controller/ProcessRouteController.java | 22 +- .../com/ruoyi/system/domain/MaterialBom.java | 6 +- .../ruoyi/system/domain/bo/MaterialBomBo.java | 7 +- .../system/domain/dto/BomUpdateRequest.java | 9 + .../system/domain/dto/MaterialUpdateDTO.java | 4 + .../ruoyi/system/domain/vo/MaterialBomVo.java | 9 +- .../system/mapper/ProcessRouteMapper.java | 40 +- .../java/com/ruoyi/system/runner/JdUtil.java | 4 + .../system/service/IBomDetailsService.java | 2 + .../system/service/IProcessRouteService.java | 4 + .../service/impl/BomDetailsServiceImpl.java | 15 +- .../service/impl/MaterialBomServiceImpl.java | 97 +++- .../impl/ProcessOrderProServiceImpl.java | 3 +- .../service/impl/ProcessRouteServiceImpl.java | 471 ++++++++++-------- .../impl/ProductionRouteTwoServiceImpl.java | 2 +- .../mapper/system/MaterialBomMapper.xml | 1 + 18 files changed, 487 insertions(+), 275 deletions(-) create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/BomUpdateRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MaterialUpdateDTO.java diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/BomDetailsController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/BomDetailsController.java index 9ba51c9..dc3e173 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/BomDetailsController.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/BomDetailsController.java @@ -24,8 +24,10 @@ import com.ruoyi.system.domain.BomDetails; import com.ruoyi.system.domain.MaterialProperties; import com.ruoyi.system.domain.bo.BomDetailsBo; import com.ruoyi.system.domain.vo.BomDetailsVo; +import com.ruoyi.system.runner.JdUtil; import com.ruoyi.system.service.IBomDetailsService; import com.ruoyi.system.service.IMaterialPropertiesService; +import com.ruoyi.system.service.IProcessRouteService; import lombok.RequiredArgsConstructor; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; @@ -60,9 +62,13 @@ import static org.aspectj.bridge.MessageUtil.fail; public class BomDetailsController extends BaseController { private final IBomDetailsService iBomDetailsService; + private final IMaterialPropertiesService iMaterialPropertiesService ; + + private final IProcessRouteService iProcessRouteService; private static final Logger log = LoggerFactory.getLogger(BomDetailsController.class); + /** * 查询bom明细列表 */ @@ -353,27 +359,29 @@ public class BomDetailsController extends BaseController { @Log(title = "非标金蝶物料清单更新") @SaCheckPermission("system:details:updateMaterial") @PostMapping("/updateFBMaterial") - public List updateFBMaterial(@RequestBody List bomDetail) { + public R updateFBMaterial(@RequestBody List> bomDetailParams) { List bomDetailsList = new ArrayList<>(); - for (String fnumber : bomDetail) { - List bomDetails = iBomDetailsService.selectByFNumber(fnumber); - System.out.println(fnumber); + + // 遍历前端传来的数据 + for (Map param : bomDetailParams) { + String fnumber = param.get("fnumber"); // 物料编码 + String totalWeight = param.get("totalWeight"); // 生产令号 + + // 根据物料编码和生产令号查询 + List bomDetails = iBomDetailsService.selectByFNumberAndTotalWeight(fnumber, totalWeight); + + System.out.println("处理物料编码:" + fnumber + ", 生产令号:" + totalWeight); + if (bomDetails != null && !bomDetails.isEmpty()) { - //物料清单保存方法 - FBloadBillOfMaterialsPreservation(bomDetails); + // 物料清单保存方法 + FBloadBillOfMaterialsPreservation(bomDetails); bomDetailsList.addAll(bomDetails); } } - return bomDetailsList; - + return R.ok("成功",bomDetailsList); } - /* - 非标物料清单保存方法 - */ - - /*s 物料清单保存方法 */ @@ -494,7 +502,7 @@ public class BomDetailsController extends BaseController { } //FBOM物料清单保存 - public static void FBloadBillOfMaterialsPreservation(List bomlist) { + public void FBloadBillOfMaterialsPreservation(List bomlist) { BomDetails bomDetails1 = bomlist.get(0); int verification = isMaterialVerification(bomDetails1.getFNumber(), bomDetails1.getFName()); @@ -564,15 +572,18 @@ public class BomDetailsController extends BaseController { // 添加FTreeEntity字段 fTreeEntityItem.addProperty("FReplaceGroup", 1); - // 检查备注是否为空 - if (details.getRemarks() != null) { - // 添加供应类型 - if (details.getRemarks().equals("采购")) { + if (details.getPartNumber() != null){ + if (iProcessRouteService.isAnTuDingGou(details.getPartNumber())) { fTreeEntityItem.addProperty("FSupplyType", "C"); + } else if (details.getRemarks().equals("伊特")) { + + fTreeEntityItem.addProperty("FSupplyType", "C"); + } else{ fTreeEntityItem.addProperty("FSupplyType", " "); } } + fTreeEntityItem.addProperty("FMATERIALTYPE", "1"); // 创建FMATERIALIDCHILD对象,并加入FTreeEntity JsonObject fMaterialIdChild = new JsonObject(); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/MaterialBomController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/MaterialBomController.java index e267363..e772a34 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/MaterialBomController.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/MaterialBomController.java @@ -78,30 +78,15 @@ public class MaterialBomController extends BaseController { List list =iMaterialBomService.getMaterialInfo(bo.getRouteDescription(),bo.getMaterialCode()); return R.ok(list); } - /* *//** - * 新增bomaterial - *//* + @SaCheckPermission("system:bom:add") @Log(title = "bomaterial", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping() public R add(@Validated(AddGroup.class) @RequestBody MaterialBomBo bo) { return toAjax(iMaterialBomService.insertByBo(bo)); - }*/ - /** - * 新增bomaterial - */ - @SaCheckPermission("system:bom:add") - @Log(title = "bomaterial", businessType = BusinessType.INSERT) - @RepeatSubmit() - @PostMapping() - public R addMaterialBom(@Validated(AddGroup.class) @RequestBody ProcessRoute bo) { - if (bo.getMaterialCode().equals("")|| bo.getMaterialName().equals("")){ - return R.fail("物料名称和物料代码不能为空"); - } - return toAjax( iMaterialBomService.addMaterialBom(bo)); - } + /** * 修改bomaterial */ diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/ProcessRouteController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/ProcessRouteController.java index 7c56393..b5593f8 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/controller/ProcessRouteController.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/ProcessRouteController.java @@ -117,17 +117,7 @@ public class ProcessRouteController extends BaseController { ProcessRouteVo child = new ProcessRouteVo(); child.setId(processRouteVo.getId()); child.setParentId(parentId); - /* child.setMaterialCode(materialCode); - child.setMaterialName(materialName);*/ - /* child.setMaterialCode(processRouteVo.getMaterialCode()); - child.setMaterialName(processRouteVo.getMaterialName()); - child.setMaterial(processRouteVo.getMaterial()); - child.setDiscWeight(processRouteVo.getDiscWeight()); - child.setRawMaterialCode(processRouteVo.getRawMaterialCode()); - child.setRawMaterialName(processRouteVo.getRawMaterialName()); - child.setDiscUsage(processRouteVo.getDiscUsage()); - child.setBomUnit(processRouteVo.getBomUnit()); - child.setBomMaterial(processRouteVo.getBomMaterial());*/ + child.setProcessNo(processRouteVo.getProcessNo()); child.setWorkCenter(processRouteVo.getWorkCenter()); child.setProcessName(processRouteVo.getProcessName()); @@ -331,18 +321,16 @@ public class ProcessRouteController extends BaseController { return ResponseEntity.ok(iProcessRouteService.getProcessMaterialList(materialCode,materialName,productionOrderNo)); } - @Log(title = "明细导入", businessType = BusinessType.IMPORT) + @Log(title = "导入时间", businessType = BusinessType.IMPORT) @SaCheckPermission("system:route:importDataTime") - @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @PostMapping(value = "/importDataTime", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public R importDataTime(@RequestParam("file") MultipartFile file) throws Exception { String originalFilename = file.getOriginalFilename(); log.info("读取文件名: " + originalFilename); ExcelResult result = ExcelUtil.importExcelSheet6(file.getInputStream(), ProcessRouteVo.class, true); List list = result.getList(); - for (ProcessRouteVo processRouteVo : list) { - String materialCode = processRouteVo.getMaterialCode(); - } - return null; + List list1 = iProcessRouteService.importDataTime(list); + return R.ok("更新成功"); } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/MaterialBom.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/MaterialBom.java index e525afd..678a65c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/MaterialBom.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/MaterialBom.java @@ -40,7 +40,7 @@ public class MaterialBom extends BaseEntity { /** * 用量 */ - private BigDecimal quantity; + private Double quantity; /** * 单位 */ @@ -57,4 +57,8 @@ public class MaterialBom extends BaseEntity { * 父级物料名称 */ private String parentMaterialName; + /** + * 库存 + */ + private Double stock; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/MaterialBomBo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/MaterialBomBo.java index 0ed56dc..e397443 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/MaterialBomBo.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/MaterialBomBo.java @@ -48,7 +48,7 @@ public class MaterialBomBo extends BaseEntity { * 用量 */ @NotNull(message = "用量不能为空", groups = { AddGroup.class, EditGroup.class }) - private BigDecimal quantity; + private Double quantity; /** * 单位 @@ -59,7 +59,6 @@ public class MaterialBomBo extends BaseEntity { /** * 材质 */ - @NotBlank(message = "材质不能为空", groups = { AddGroup.class, EditGroup.class }) private String materialType; /** @@ -73,5 +72,9 @@ public class MaterialBomBo extends BaseEntity { */ @NotBlank(message = "父级物料名称不能为空", groups = { AddGroup.class, EditGroup.class }) private String parentMaterialName; + /** + * 库存 + */ + private Double stock; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/BomUpdateRequest.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/BomUpdateRequest.java new file mode 100644 index 0000000..2723a49 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/BomUpdateRequest.java @@ -0,0 +1,9 @@ +package com.ruoyi.system.domain.dto; + +import lombok.Data; + +@Data +public class BomUpdateRequest { + private String fnumber; + private String totalWeight; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MaterialUpdateDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MaterialUpdateDTO.java new file mode 100644 index 0000000..ee7dd65 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MaterialUpdateDTO.java @@ -0,0 +1,4 @@ +package com.ruoyi.system.domain.dto; + +public class MaterialUpdateDTO { +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MaterialBomVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MaterialBomVo.java index fca8f8e..7c519f6 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MaterialBomVo.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MaterialBomVo.java @@ -48,7 +48,7 @@ public class MaterialBomVo { * 用量 */ @ExcelProperty(value = "用量") - private BigDecimal quantity; + private Double quantity; /** * 单位 @@ -74,4 +74,11 @@ public class MaterialBomVo { */ @ExcelProperty(value = "父级物料名称") private String parentMaterialName; + /** + * 库存 + */ + @ExcelProperty(value = "库存") + private Double stock; + + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ProcessRouteMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ProcessRouteMapper.java index d8ef776..8978178 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ProcessRouteMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ProcessRouteMapper.java @@ -20,14 +20,40 @@ public interface ProcessRouteMapper extends BaseMapperPlus= #{processNo} AND material_code = #{materialCode} AND AND route_description = #{routeDescription} ") void updateProcessNoAfterInsert(@Param("processNo") Long processNo, @Param("materialCode") String materialCode,@Param("route_description") String routeDescription); - // 更新所有比删除序号大的工艺路线 - @Update("UPDATE process_route SET process_no = process_no - 10 WHERE process_no > #{processNo} AND material_code = #{materialCode} AND route_description = #{routeDescription}") - void updateProcessNoAfterDelete(@Param("processNo") Long processNo, @Param("materialCode") String materialCode,@Param("route_description") String routeDescription); - - // 查询工艺序号是否已经存在,根据 materialCode @Select("SELECT COUNT(1) FROM process_route WHERE process_no = #{processNo} AND material_code = #{materialCode} AND route_description = #{routeDescription}") boolean existsByProcessNoAndMaterialCode(@Param("processNo") Long processNo, @Param("materialCode") String materialCode,@Param("route_description") String routeDescription); - @Select("SELECT * FROM process_route WHERE route_description = #{routeDescription} AND material_code = #{materialCode} AND material_name = #{materialName}") - List selectRouteByLinAndMaterialCode(String routeDescription, String materialCode, String materialName); + + // 检查工序号是否存在(排除自身) + @Select("SELECT COUNT(1) FROM process_route WHERE process_no = #{processNo} " + + "AND material_code = #{materialCode} " + + "AND route_description = #{routeDescription} " + + "AND id != #{id}") + boolean existsByProcessNoAndMaterialCodeExcludeSelf( + @Param("processNo") Long processNo, + @Param("materialCode") String materialCode, + @Param("routeDescription") String routeDescription, + @Param("id") Long id); + + // 更新序号范围(向下调整) + @Update("UPDATE process_route SET process_no = process_no - 10 " + + "WHERE process_no > #{startNo} AND process_no <= #{endNo} " + + "AND material_code = #{materialCode} " + + "AND route_description = #{routeDescription}") + void updateProcessNoForRangeDown( + @Param("startNo") Long startNo, + @Param("endNo") Long endNo, + @Param("materialCode") String materialCode, + @Param("routeDescription") String routeDescription); + + // 更新序号范围(向上调整) + @Update("UPDATE process_route SET process_no = process_no + 10 " + + "WHERE process_no >= #{startNo} AND process_no < #{endNo} " + + "AND material_code = #{materialCode} " + + "AND route_description = #{routeDescription}") + void updateProcessNoForRangeUp( + @Param("startNo") Long startNo, + @Param("endNo") Long endNo, + @Param("materialCode") String materialCode, + @Param("routeDescription") String routeDescription); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/runner/JdUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/runner/JdUtil.java index e8c317a..e2bce98 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/runner/JdUtil.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/runner/JdUtil.java @@ -14,6 +14,8 @@ import com.ruoyi.system.domain.vo.ProductionRouteTwoVo; import com.ruoyi.system.jdmain.rouplan.Model; import com.ruoyi.system.mapper.ImProductionPlanProMapper; import com.ruoyi.system.service.IImProductionPlanProService; +import com.ruoyi.system.service.IProcessRouteService; +import org.springframework.beans.factory.annotation.Autowired; import javax.annotation.Resource; import java.math.BigDecimal; @@ -28,6 +30,7 @@ public class JdUtil { private ImProductionPlanProMapper imProductionPlanProMapper; @Resource private IImProductionPlanProService imProductionPlanProService; + //入库状态 public static JsonArray storageProduce(String number, String FMaterialIdCode) { K3CloudApi client = new K3CloudApi(); @@ -432,5 +435,6 @@ public class JdUtil { // 转换为 List 格式 return null; } + //查询物料是否为按图订制 } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/IBomDetailsService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/IBomDetailsService.java index 85eb8ac..e51ab57 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/IBomDetailsService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/IBomDetailsService.java @@ -54,4 +54,6 @@ public interface IBomDetailsService { List selectByFNumber1(String fNumber,String partNumber,String partName); BomDetails selectBOMFNumber(String fnumbers); + + List selectByFNumberAndTotalWeight(String fnumber, String totalWeight); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/IProcessRouteService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/IProcessRouteService.java index ec02a0b..ba415d6 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/IProcessRouteService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/IProcessRouteService.java @@ -88,4 +88,8 @@ public interface IProcessRouteService { List getProcessMaterialList(String materialCode,String materialName, String productionOrderNo); List deleteRoute(ProcessRoute processRoute); + + List importDataTime(List list); + + boolean isAnTuDingGou(String materialCode); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BomDetailsServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BomDetailsServiceImpl.java index 06832d2..5991b70 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BomDetailsServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BomDetailsServiceImpl.java @@ -96,7 +96,7 @@ public class BomDetailsServiceImpl implements IBomDetailsService { lqw.eq(StringUtils.isNotBlank(bo.getFNumber()), BomDetails::getFNumber, bo.getFNumber()); lqw.eq(StringUtils.isNotBlank(bo.getMaterial()), BomDetails::getMaterial, bo.getMaterial()); lqw.eq(StringUtils.isNotBlank(bo.getUnitWeight()), BomDetails::getUnitWeight, bo.getUnitWeight()); - lqw.eq(StringUtils.isNotBlank(bo.getTotalWeight()), BomDetails::getTotalWeight, bo.getTotalWeight()); + lqw.like(StringUtils.isNotBlank(bo.getTotalWeight()), BomDetails::getTotalWeight, bo.getTotalWeight()); lqw.eq(StringUtils.isNotBlank(bo.getRemarks()), BomDetails::getRemarks, bo.getRemarks()); lqw.like(StringUtils.isNotBlank(bo.getFName()), BomDetails::getFName, bo.getFName()); lqw.eq(StringUtils.isNotBlank(bo.getStats()), BomDetails::getStats, bo.getStats()); @@ -181,6 +181,19 @@ public class BomDetailsServiceImpl implements IBomDetailsService { return baseMapper.selectOne(wrapper); } + /** + * @param fnumber + * @param totalWeight + * @return + */ + @Override + public List selectByFNumberAndTotalWeight(String fnumber, String totalWeight) { + LambdaQueryWrapper bomDetailsLambdaQueryWrapper = new LambdaQueryWrapper<>(); + bomDetailsLambdaQueryWrapper.eq(BomDetails::getTotalWeight,totalWeight) + .eq(BomDetails::getFNumber,fnumber); + return baseMapper.selectList(bomDetailsLambdaQueryWrapper); + } + public int loadMaterialPreservation(BomDetails bomDetails1) { K3CloudApi client = new K3CloudApi(); // 创建一个空的JsonObject diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MaterialBomServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MaterialBomServiceImpl.java index 2cd5a68..abfa87e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MaterialBomServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MaterialBomServiceImpl.java @@ -6,9 +6,16 @@ import com.ruoyi.common.core.domain.PageQuery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.system.domain.BomDetails; import com.ruoyi.system.domain.ProcessRoute; +import com.ruoyi.system.mapper.BomDetailsMapper; +import com.ruoyi.system.mapper.ProcessRouteMapper; +import com.ruoyi.system.service.IProcessRouteService; import lombok.RequiredArgsConstructor; import com.ruoyi.common.utils.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import com.ruoyi.system.domain.bo.MaterialBomBo; import com.ruoyi.system.domain.vo.MaterialBomVo; @@ -32,7 +39,10 @@ import java.util.Collection; public class MaterialBomServiceImpl implements IMaterialBomService { private final MaterialBomMapper baseMapper; + private final BomDetailsMapper bomDetailsMapper; + private final ProcessRouteMapper processRouteMapper; + private static final Logger logger = LoggerFactory.getLogger(IMaterialBomService.class); /** * 查询bomaterial */ @@ -71,6 +81,7 @@ public class MaterialBomServiceImpl implements IMaterialBomService { lqw.eq(StringUtils.isNotBlank(bo.getMaterialType()), MaterialBom::getMaterialType, bo.getMaterialType()); lqw.eq(StringUtils.isNotBlank(bo.getParentMaterialCode()), MaterialBom::getParentMaterialCode, bo.getParentMaterialCode()); lqw.like(StringUtils.isNotBlank(bo.getParentMaterialName()), MaterialBom::getParentMaterialName, bo.getParentMaterialName()); + lqw.eq(bo.getStock() != null, MaterialBom::getStock, bo.getStock()); return lqw; } @@ -79,15 +90,70 @@ public class MaterialBomServiceImpl implements IMaterialBomService { */ @Override public Boolean insertByBo(MaterialBomBo bo) { - MaterialBom add = BeanUtil.toBean(bo, MaterialBom.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setId(add.getId()); - } - return flag; - } + try { + // 1. 转换 BO 到实体类 + MaterialBom add = BeanUtil.toBean(bo, MaterialBom.class); + // 2. 查找对应的工艺路线 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ProcessRoute::getRouteDescription, bo.getProjectNumber()) + .eq(ProcessRoute::getProcessNo, "10") // 使用父级物料编码 + .eq(ProcessRoute::getMaterialCode, bo.getParentMaterialCode()) // 使用父级物料编码 + .eq(ProcessRoute::getMaterialName, bo.getParentMaterialName()); // 使用父级物料名称 + + ProcessRoute processRoute = processRouteMapper.selectOne(wrapper); + + // 3. 如果找到对应的工艺路线,更新相关字段 + if (processRoute != null) { + processRoute.setId(processRoute.getId()); + // 更新原材料相关信息 + processRoute.setRawMaterialCode(bo.getMaterialCode()); // BOM物料编码 + processRoute.setRawMaterialName(bo.getMaterialName()); // BOM物料名称 + processRoute.setDiscUsage(bo.getQuantity()); // 用量 + processRoute.setBomUnit(bo.getUnit()); // 单位 + processRoute.setBomMaterial(bo.getMaterialType()); + // 更新工艺路线 + int updateResult = processRouteMapper.updateById(processRoute); + if (updateResult <= 0) { + throw new ServiceException("更新工艺路线失败"); + } + } + + // 4. 验证并保存 BOM 材料 + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + + // 5. 如果保存成功,设置返回的 ID + if (flag) { + bo.setId(add.getId()); + } + Boolean b = insertByBoToBom(bo); + return flag; + } catch (Exception e) { + logger.error("新增BOM材料失败", e); + throw new ServiceException("新增BOM材料失败:" + e.getMessage()); + } + } + public Boolean insertByBoToBom(MaterialBomBo bo){ + //在BOM详情中添加原材料BOM + BomDetails bomDetails = new BomDetails(); + bomDetails.setTotalWeight(bo.getProjectNumber()); + bomDetails.setFNumber(bo.getParentMaterialCode()); + bomDetails.setFName(bo.getParentMaterialName()); + bomDetails.setPartNumber(bo.getMaterialCode()); + bomDetails.setName(bo.getMaterialName()); + bomDetails.setName(bo.getMaterialName()); + bomDetails.setDenominator(1.0); + bomDetails.setQuantity(bo.getQuantity()); + bomDetails.setStats("外购"); + bomDetails.setMaterial(bo.getMaterialType()); + int flag = bomDetailsMapper.insert(bomDetails); + if (flag>0){ + return true; + }else{ + return false; + } + } /** * 修改bomaterial */ @@ -103,6 +169,19 @@ public class MaterialBomServiceImpl implements IMaterialBomService { */ private void validEntityBeforeSave(MaterialBom entity){ //TODO 做一些数据校验,如唯一约束 + // 添加必要的数据验证逻辑 + if (StringUtils.isEmpty(entity.getMaterialCode())) { + throw new ServiceException("物料编码不能为空"); + } + if (StringUtils.isEmpty(entity.getMaterialName())) { + throw new ServiceException("物料名称不能为空"); + } + if (StringUtils.isEmpty(entity.getProjectNumber())) { + throw new ServiceException("项目令号不能为空"); + } + if (entity.getQuantity() == null ) { + throw new ServiceException("用量必须大于0"); + } } /** @@ -122,7 +201,7 @@ public class MaterialBomServiceImpl implements IMaterialBomService { materialBomBo.setProjectNumber(bo.getProcessDescription()); materialBomBo.setParentMaterialCode(bo.getMaterialCode()); materialBomBo.setParentMaterialName(bo.getMaterialName()); - materialBomBo.setQuantity(BigDecimal.valueOf(bo.getDiscUsage())); + materialBomBo.setQuantity(bo.getDiscUsage()); materialBomBo.setUnit(bo.getBomUnit()); materialBomBo.setMaterialType(bo.getBomMaterial()); materialBomBo.setMaterialCode(bo.getRawMaterialCode()); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProcessOrderProServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProcessOrderProServiceImpl.java index 9f3c42b..309c91a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProcessOrderProServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProcessOrderProServiceImpl.java @@ -66,10 +66,11 @@ public class ProcessOrderProServiceImpl implements IProcessOrderProService { private LambdaQueryWrapper buildQueryWrapper(ProcessOrderProBo bo) { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(StringUtils.isNotBlank(bo.getProductionOrderNo()), ProcessOrderPro::getProductionOrderNo, bo.getProductionOrderNo()); + lqw.like(StringUtils.isNotBlank(bo.getProductionOrderNo()), ProcessOrderPro::getProductionOrderNo, bo.getProductionOrderNo()); lqw.like(StringUtils.isNotBlank(bo.getProductionName()), ProcessOrderPro::getProductionName, bo.getProductionName()); lqw.eq(StringUtils.isNotBlank(bo.getDrawingNo()), ProcessOrderPro::getDrawingNo, bo.getDrawingNo()); lqw.like(StringUtils.isNotBlank(bo.getDrawingName()), ProcessOrderPro::getDrawingName, bo.getDrawingName()); + return lqw; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProcessRouteServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProcessRouteServiceImpl.java index 8472555..2b05c3d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProcessRouteServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProcessRouteServiceImpl.java @@ -1,6 +1,7 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.json.JSONUtil; import cn.hutool.poi.excel.cell.CellSetter; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -22,6 +23,7 @@ import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.controller.ProcessRouteController; import com.ruoyi.system.domain.*; import com.ruoyi.system.domain.bo.BomDetailsBo; +import com.ruoyi.system.domain.bo.MaterialBomBo; import com.ruoyi.system.domain.bo.ProcessRouteBo; import com.ruoyi.system.domain.dto.*; import com.ruoyi.system.domain.vo.*; @@ -36,11 +38,13 @@ import com.ruoyi.system.service.IBomDetailsService; import com.ruoyi.system.service.IMaterialPropertiesService; import com.ruoyi.system.service.IProcessRouteService; import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.ListUtils; import org.aspectj.bridge.MessageUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -110,7 +114,7 @@ public class ProcessRouteServiceImpl implements IProcessRouteService { private LambdaQueryWrapper buildQueryWrapper(ProcessRouteBo bo) { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.eq(StringUtils.isNotBlank(bo.getRouteDescription()), ProcessRoute::getRouteDescription, bo.getRouteDescription()); + lqw.like(StringUtils.isNotBlank(bo.getRouteDescription()), ProcessRoute::getRouteDescription, bo.getRouteDescription()); lqw.eq(StringUtils.isNotBlank(bo.getMaterialCode()), ProcessRoute::getMaterialCode, bo.getMaterialCode()); lqw.like(StringUtils.isNotBlank(bo.getMaterialName()), ProcessRoute::getMaterialName, bo.getMaterialName()); lqw.eq(StringUtils.isNotBlank(bo.getBomUnit()), ProcessRoute::getBomUnit, bo.getBomUnit()); @@ -164,18 +168,37 @@ public class ProcessRouteServiceImpl implements IProcessRouteService { */ @Override public Boolean updateByBo(ProcessRouteBo bo) { + // 直接更新整条记录 ProcessRoute update = BeanUtil.toBean(bo, ProcessRoute.class); - // 1. 检查指定 materialCode 下的 processNo 是否已存在 - if (baseMapper.existsByProcessNoAndMaterialCode(update.getProcessNo(), update.getMaterialCode(), update.getProcessDescription())) { - throw new ServiceException("该物料编码的工艺序号已存在,请选择其他序号"); + + // 1. 检查记录是否存在 + ProcessRoute oldRoute = baseMapper.selectById(update.getId()); + if (oldRoute == null) { + throw new ServiceException("要修改的工艺路线不存在"); } - // 2. 更新所有比新序号大的工艺路线,将它们的 processNo 增加步长(10) - baseMapper.updateProcessNoAfterInsert(update.getProcessNo(), update.getMaterialCode(), update.getProcessDescription()); + update.setRouteDescription(oldRoute.getRouteDescription()); + update.setMaterialCode(oldRoute.getMaterialCode()); + update.setMaterialName(oldRoute.getMaterialName()); + update.setMaterial(oldRoute.getMaterial()); + update.setDiscWeight(oldRoute.getDiscWeight()); - // 3. 插入新的工艺路线 - return baseMapper.insert(update) > 0; + // 2. 如果工序号变化了,才需要检查工序号 + if (!oldRoute.getProcessNo().equals(update.getProcessNo())) { + // 检查新工序号是否已存在(排除当前记录) + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ProcessRoute::getProcessNo, update.getProcessNo()) + .eq(ProcessRoute::getMaterialCode, update.getMaterialCode()) + .eq(ProcessRoute::getRouteDescription, update.getRouteDescription()) + .ne(ProcessRoute::getId, update.getId()); + + if (baseMapper.selectCount(wrapper) > 0) { + throw new ServiceException("该物料编码的工艺序号已存在,请选择其他序号"); + } + } + + // 3. 直接更新全部字段 + return baseMapper.updateById(update) > 0; } - /** * 保存前的数据校验 */ @@ -233,164 +256,11 @@ public class ProcessRouteServiceImpl implements IProcessRouteService { return true; } -/* @Override - public boolean saveData(List routeVoList, List productionOrderVos) { - List processRoutes = BeanUtil.copyToList(routeVoList, ProcessRoute.class); - List productionOrder = BeanUtil.copyToList(productionOrderVos, ProductionOrder.class); - if (processRoutes != null){ - log.info("保存到总装BOM:{}", processRoutes); - boolean b = productionOrderMapper.insertBatch(productionOrder); - } - //將材料bom 對應到processRoute 更新到材料BOM表中 - //装配bom父级 - String zFnumber = null; - String zFname = null; - String zFlinghao = null; - String proMaterials = null; - for (ProcessRoute processRoute : processRoutes) { - if (processRoute.getRawMaterialCode()!=null && processRoute.getRawMaterialName()!=null){ - MaterialBom materialBom = new MaterialBom(); - materialBom.setProjectNumber(processRoute.getProcessDescription()); - materialBom.setParentMaterialCode(processRoute.getMaterialCode()); - materialBom.setParentMaterialName(processRoute.getMaterialName()); - materialBom.setMaterialCode(processRoute.getRawMaterialCode()); - materialBom.setMaterialName(processRoute.getRawMaterialName()); - materialBom.setUnit(processRoute.getBomUnit()); - materialBom.setMaterialType(processRoute.getBomMaterial()); - materialBom.setQuantity(BigDecimal.valueOf(processRoute.getDiscUsage())); - - } - //同步到材料bom表 - baseMapper.insert(processRoute); - } - - List materialsToAdd = new ArrayList<>(); - List bomDetailsVos = new ArrayList<>(); - - for (ProcessRoute processRoute : processRoutes) { - if (processRoute.getRawMaterialCode()!= null){ - //封装bomdetils 的对象. - zFlinghao = processRoute.getProcessDescription(); - BomDetailsVo bomDetails = new BomDetailsVo(); - bomDetails.setTotalWeight(processRoute.getRouteDescription());//生产令号 - bomDetails.setFNumber(processRoute.getMaterialCode()); - bomDetails.setFName(processRoute.getMaterialName()); - bomDetails.setPartNumber(processRoute.getRawMaterialCode()); - bomDetails.setName(processRoute.getRawMaterialName()); - if (processRoute.getMaterial().equals("总装部件")){ - proMaterials = processRoute.getMaterial(); - zFnumber = processRoute.getMaterialCode(); - zFname = processRoute.getMaterialName(); - } - if (proMaterials != null && proMaterials.equals("总装部件")) { - log.info("开始新增装配bom"); - BomDetailsVo bomDetails1 = null; - for (ProductionOrderVo productionOrderVo : productionOrderVos) { - bomDetails1 = new BomDetailsVo(); - bomDetails1.setTotalWeight(zFlinghao); - bomDetails1.setFNumber(zFnumber); - bomDetails1.setFName(zFname); - bomDetails1.setPartdiagramCode(productionOrderVo.getProductionOrderNo()); - bomDetails1.setPartdiagramName(productionOrderVo.getParentPart()); - bomDetails1.setPartNumber(productionOrderVo.getDrawingNo()); - bomDetails1.setName(productionOrderVo.getDrawingName()); - bomDetails1.setQuantity(Double.valueOf(productionOrderVo.getQuantity())); - bomDetails1.setMaterial(productionOrderVo.getMaterial()); - if (productionOrderVo.getDrawingNo().startsWith("009") || productionOrderVo.getDrawingNo().startsWith("AA") || productionOrderVo.getDrawingNo().startsWith("AB") || productionOrderVo.getDrawingNo().startsWith("AC") || - productionOrderVo.getDrawingNo().contains("(M)") || productionOrderVo.getDrawingName().equals("按图定制") || productionOrderVo.getDrawingName().startsWith(" ") || productionOrderVo.getRemark().contains("外购件")) { - bomDetails1.setStats("外购"); - } else { - bomDetails1.setStats("自制"); - } - } - bomDetailsVos.add(bomDetails1); - } - - if (processRoute.getBomUnit()!= null){ - if (processRoute.getBomUnit().equals("mm")){ - bomDetails.setQuantity(processRoute.getDiscUsage()/1000);//转换成m - }else{ - bomDetails.setQuantity(processRoute.getDiscUsage()); - } - } - - if (processRoute.getRawMaterialCode().startsWith("009")||processRoute.getRawMaterialCode().startsWith("AA")||processRoute.getRawMaterialCode().startsWith("AB")|| - processRoute.getRawMaterialCode().startsWith("AC")||processRoute.getRawMaterialCode().startsWith("015")||processRoute.getRawMaterialCode().contains("(M)")||processRoute.getProcessName().equals("按图定制") - ){ - bomDetails.setStats("外购"); - }else{ - bomDetails.setStats("自制"); - } - bomDetails.setMaterial(processRoute.getBomMaterial()); - bomDetails.setDenominator(1.0);//分母 - Date xuEndTime = processRoute.getXuEndTime(); - Date xuStartTime = processRoute.getXuStartTime(); - bomDetailsVos.add(bomDetails); - - }else { - } - } - - - for (BomDetailsVo bomDetailsvo : bomDetailsVos) { - BomDetails bomDetails = BeanUtil.toBean(bomDetailsvo, BomDetails.class); - // 验证物料是否存在 - if (bomDetails.getFNumber() != null && bomDetails.getFName() != null && bomDetails.getPartNumber() != null && bomDetails.getName() != null) { - int verification = isMaterialVerification(bomDetails.getPartNumber(), bomDetails.getName()); - if (verification == 1) { - bomDetails.setUnitWeight("是"); - } else { - if (bomDetails.getStats() == null || bomDetails.getStats().equals("外购") || bomDetails.getFName().startsWith("009") || bomDetails.getFName().startsWith("AA") - || bomDetails.getFName().startsWith("AB") || bomDetails.getFName().startsWith("AC")|| bomDetails.getFName().startsWith("015")) { - materialsToAdd.add(bomDetails); - } else if (bomDetails.getStats().equals("自制")) { - materialsToAdd.add(bomDetails); - } else if (bomDetails.getStats().equals("委外")) { - materialsToAdd.add(bomDetails); - } - bomDetails.setUnitWeight("否"); - } - } - - // 保存当前记录 - BomDetailsVo bean = BeanUtil.toBean(bomDetails, BomDetailsVo.class); - - iBomDetailsService.insertByVo(bean); - } - - ArrayList bomDetails = new ArrayList<>(); - // 统一新增不存在的物料 - for (BomDetails material : materialsToAdd) { - //替换属性编码(金蝶) - if (material == null) { - continue; // 如果 material 为空,则跳过当前循环 - } - - String state = determineState(material); - log.info("开始新增不存在的物料==> 物料图号: " + material.getPartNumber() + " 物料名称: " + material.getName()); - int result = loadMaterialPreservation(material, state); - if (result == 1) { - log.info("新增物料成功==> 物料图号: " + material.getPartNumber() + " 物料名称: " + material.getName()); - material.setUnitWeight("新增成功"); - bomDetails.add(material); - } else { - log.error("新增物料失败==> 物料图号: " + material.getPartNumber() + " 物料名称: " + material.getName()); - material.setUnitWeight("新增成功"); - bomDetails.add(material); - } - BomDetailsBo bean = BeanUtil.toBean(bomDetails, BomDetailsBo.class); - iBomDetailsService.updateByBo(bean); - } - - - - return baseMapper.insertBatch(processRoutes); - - }*/ public boolean saveData(List routeVoList, List productionOrderVos) { // 将 ProcessRouteVo 转换为 ProcessRoute List processRoutes = BeanUtil.copyToList(routeVoList, ProcessRoute.class); + //firstBatchQuantity // 1. 处理材料 BOM processMaterialBom(processRoutes); @@ -401,10 +271,72 @@ public class ProcessRouteServiceImpl implements IProcessRouteService { // 3. 保存 BOM 详情 saveBomDetails(bomDetailsVos); List routeArrayList = new ArrayList<>(); - // 4. 批量插入 ProcessRoute 数据 - for (ProcessRoute processRoute : processRoutes) { - if (processRoute.getProcessNo() != null || processRoute.getProcessName() != null) { - routeArrayList.add(processRoute); + boolean allEmpty = processRoutes.stream() + .allMatch(route -> route.getProcessNo() == null && route.getProcessName() == null); + + if (allEmpty && !processRoutes.isEmpty()) { + // 1. 找出Excel中重复出现的组焊件物料编码 + List duplicateWeldingMaterials = processRoutes.stream() + .filter(route -> "组焊件".equals(route.getMaterial())) + .map(ProcessRoute::getMaterialCode) + .collect(Collectors.groupingBy(code -> code, Collectors.counting())) + .entrySet().stream() + .filter(entry -> entry.getValue() > 1) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + + // 2. 用于记录已处理的重复组焊件 + Set processedWeldingMaterials = new HashSet<>(); + + for (ProcessRoute processRoute : processRoutes) { + // 判断是否是重复的组焊件 + boolean isDuplicateWelding = "组焊件".equals(processRoute.getMaterial()) + && duplicateWeldingMaterials.contains(processRoute.getMaterialCode()); + + // 如果是重复的组焊件且已处理过,则跳过 + if (isDuplicateWelding && processedWeldingMaterials.contains(processRoute.getMaterialCode())) { + continue; + } + + // 生成4个默认工序 + for (int i = 0; i <2; i++) { + ProcessRoute defaultRoute = new ProcessRoute(); + BeanUtil.copyProperties(processRoute, defaultRoute); + + // 设置工序号 (10, 20, 30, 40) + defaultRoute.setProcessNo((long) ((i + 1) * 10)); + + // 清空工序相关信息 + defaultRoute.setWorkCenter(null); + defaultRoute.setProcessName(null); + defaultRoute.setProcessDescription(null); + defaultRoute.setProcessControl(null); + defaultRoute.setActivityDuration(null); + defaultRoute.setActivityUnit(null); + + // 设置创建时间和更新时间 + defaultRoute.setCreateTime(new Date()); + defaultRoute.setUpdateTime(new Date()); + + routeArrayList.add(defaultRoute); + } + + // 如果是重复的组焊件,标记为已处理 + if (isDuplicateWelding) { + processedWeldingMaterials.add(processRoute.getMaterialCode()); + log.info("为重复出现的组焊件物料 {} 生成了默认工序", processRoute.getMaterialCode()); + } else { + log.info("为物料 {} 生成了默认工序", processRoute.getMaterialCode()); + } + } + } else { + // 处理非空工序的情况 + for (ProcessRoute processRoute : processRoutes) { + if (processRoute.getProcessNo() != null || processRoute.getProcessName() != null) { + processRoute.setCreateTime(new Date()); + processRoute.setUpdateTime(new Date()); + routeArrayList.add(processRoute); + } } } return baseMapper.insertBatch(routeArrayList); @@ -418,7 +350,7 @@ public class ProcessRouteServiceImpl implements IProcessRouteService { String parentMaterialName = processRoute.getMaterialName(); String unit = processRoute.getBomUnit(); String materialType = processRoute.getBomMaterial(); - BigDecimal quantity = processRoute.getDiscUsage() != null ? BigDecimal.valueOf(processRoute.getDiscUsage()) : BigDecimal.ZERO; + Double quantity = processRoute.getDiscUsage() != null ? processRoute.getDiscUsage() : 0; if (projectNumber == null || parentMaterialCode == null || parentMaterialName == null || unit == null || materialType == null) { // 处理空值情况,例如记录日志或抛出异常 log.error("必填字段为空: {}", processRoute); @@ -448,7 +380,7 @@ public class ProcessRouteServiceImpl implements IProcessRouteService { for (ProcessRoute processRoute : processRoutes) { if (processRoute != null) { String zFlinghao = processRoute.getRouteDescription(); - if ("总装部件".equals(processRoute.getMaterial())&& !hasProcessedAssemblyPart) { + if ("总装部件".equals(processRoute.getMaterial()) && !hasProcessedAssemblyPart) { String zFnumber = processRoute.getMaterialCode(); String zFname = processRoute.getMaterialName(); // 将装配 BOM 详情填充进 BOM 详情列表 @@ -477,32 +409,31 @@ public class ProcessRouteServiceImpl implements IProcessRouteService { // 处理单位换算 if ("mm".equals(processRoute.getBomUnit())) { bomDetails.setQuantity(processRoute.getDiscUsage() / 1000.0); // 转换为米 - } else { + } else if ("根".equals(processRoute.getBomUnit())){ + bomDetails.setDenominator(processRoute.getDiscUsage()); + bomDetails.setQuantity(1.0); + }else { bomDetails.setQuantity(processRoute.getDiscUsage()); bomDetails.setDenominator(1.0); } - //处理原来材料分数格式 - if ("根".equals(processRoute.getBomUnit())) { - bomDetails.setDenominator(processRoute.getDiscUsage()); - bomDetails.setQuantity(1.0); - } + // 根据 RawMaterialCode 判断是否外购 - if (isOutsourced(processRoute.getMaterialCode())) { + if (isOutsourced(processRoute.getRawMaterialCode())) { bomDetails.setStats("外购"); } else { bomDetails.setStats("自制"); } bomDetails.setMaterial(processRoute.getBomMaterial()); - bomDetails.setDenominator(1.0); + return bomDetails; } private void createAssemblyBomDetails(String zFlinghao, String zFnumber, String zFname, List productionOrderVos) { ArrayList bomDetailsVos = new ArrayList<>(); for (ProductionOrderVo productionOrderVo : productionOrderVos) { - if (productionOrderVo !=null){ + if (productionOrderVo != null) { BomDetailsVo bomDetails = new BomDetailsVo(); bomDetails.setTotalWeight(zFlinghao); bomDetails.setFNumber(zFnumber); @@ -513,15 +444,16 @@ public class ProcessRouteServiceImpl implements IProcessRouteService { bomDetails.setName(productionOrderVo.getDrawingName()); bomDetails.setQuantity(Double.valueOf(productionOrderVo.getQuantity())); bomDetails.setMaterial(productionOrderVo.getMaterial()); + bomDetails.setRemarks(productionOrderVo.getRemark()); // 判断外购或自制 String drawingNo = productionOrderVo.getDrawingNo(); String remark = productionOrderVo.getRemark(); - if (drawingNo != null ){ - if ((isOutsourced(drawingNo) || (remark != null && remark.contains("外购件")) || drawingNo.startsWith(" "))||drawingNo.startsWith("009")) { - bomDetails.setStats("外购"); - } else { - bomDetails.setStats("自制"); - } + if (drawingNo != null) { + if ((isOutsourced(drawingNo) || (remark != null && remark.contains("外购件")) || drawingNo.startsWith(" ")) || drawingNo.startsWith("009")) { + bomDetails.setStats("外购"); + } else { + bomDetails.setStats("自制"); + } } // iBomDetailsService.insertByVo(bomDetails); @@ -728,7 +660,8 @@ public class ProcessRouteServiceImpl implements IProcessRouteService { } private boolean isOutsourced(String code) { - return code.startsWith("009") || code.startsWith("AA") || code.startsWith("AB(") || code.startsWith("AC(") || code.startsWith("015") || code.contains("(M)") || code.startsWith("BC("); + return code.startsWith("009") || code.startsWith("AA") || code.startsWith("AB(") || + code.startsWith("AC(") || code.startsWith("015") || code.contains("(M)") || code.startsWith("BC("); } //保存到 BomDetails 表中 @@ -780,8 +713,7 @@ public class ProcessRouteServiceImpl implements IProcessRouteService { materialsToAdd.add(bomDetails); } - // 保存 BomDetails 记录 - // iBomDetailsService.insertByVo(BeanUtil.toBean(bomDetails, BomDetailsVo.class)); + } // 新增不存在的物料 @@ -981,7 +913,6 @@ public class ProcessRouteServiceImpl implements IProcessRouteService { }); - // 检查 plannedProcessList 是否为 null,避免空指针异常 if (plannedProcessList != null && !plannedProcessList.isEmpty()) { plannedProcesses.addAll(plannedProcessList); // 将非空列表添加到最终列表中 @@ -1227,6 +1158,7 @@ public class ProcessRouteServiceImpl implements IProcessRouteService { route.setActivityDuration(vo.getActivityDuration()); route.setActivityUnit("分"); routeArrayList.add(route); + } if (baseMapper.insertBatch(routeArrayList)) { return R.ok(); @@ -1239,27 +1171,24 @@ public class ProcessRouteServiceImpl implements IProcessRouteService { * 查询材料bom */ @Override - public List getProcessMaterialList(ProcessRoute processRoute) { - if (processRoute == null) { + public List getProcessMaterialList(String materialCode, String materialName, String productionOrderNo) { + if (materialCode == null) { logger.error("做工艺的物料不存在"); throw new IllegalArgumentException("做工艺的物料不能为空"); } - String materialCode = processRoute.getMaterialCode(); - String materialName = processRoute.getMaterialName(); - if (materialCode == null || materialName == null) { - logger.error("MaterialCode or MaterialName is null"); - throw new IllegalArgumentException("MaterialCode and MaterialName cannot be null"); - } - - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("parent_material_code", processRoute.getMaterialCode()); - wrapper.eq("parent_material_name", processRoute.getMaterialName()); + wrapper.eq("parent_material_code", materialCode); + wrapper.eq("project_number", productionOrderNo); + wrapper.eq("parent_material_name", materialName); return materialBomMapper.selectList(wrapper); } + //是否是按图定制的物料 + public Boolean insertByBoToBom(MaterialBomBo bo){ + return false; + } /** * 删除工序 */ @@ -1289,7 +1218,149 @@ public class ProcessRouteServiceImpl implements IProcessRouteService { } } + /** + * 导入更新时间 + * @param list + * @return + */ + public List importDataTime1(List list) { + if (!list.isEmpty()){ + for (ProcessRouteVo processRouteVo : list) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ProcessRoute::getRouteDescription,processRouteVo.getRouteDescription()); + List processRoutes = baseMapper.selectList(wrapper); + for (ProcessRoute processRoute : processRoutes) { + if (processRouteVo.getMaterialCode().equals(processRoute.getMaterialCode())){ + processRoute.setXuStartTime(processRouteVo.getXuStartTime()); + processRoute.setXuEndTime(processRouteVo.getXuEndTime()); + } + baseMapper.updateById(processRoute); + } + + } + } + + + return null; + } + + /** + * 导入更新时间 + * @param list 工艺路线列表 + * @return 更新后的工艺路线列表 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public List importDataTime(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + + try { + // 1. 收集所有需要查询的令号 + Set routeDescriptions = list.stream() + .map(ProcessRouteVo::getRouteDescription) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + if (CollUtil.isEmpty(routeDescriptions)) { + return Collections.emptyList(); + } + + // 2. 批量查询所有相关的工艺路线 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(ProcessRoute::getRouteDescription, routeDescriptions); + List allProcessRoutes = baseMapper.selectList(wrapper); + + if (CollUtil.isEmpty(allProcessRoutes)) { + return Collections.emptyList(); + } + + // 3. 建立复合键映射关系,用于快速查找 + Map> routeMap = allProcessRoutes.stream() + .collect(Collectors.groupingBy(route -> + generateKey(route.getRouteDescription(), + route.getMaterialCode(), + route.getProcessNo(), + route.getMaterialName(), + route.getProcessName(), + route.getProcessControl(), + route.getActivityDuration()) + )); + + // 4. 批量更新数据 + List updatedRoutes = new ArrayList<>(); + for (ProcessRouteVo vo : list) { + String key = generateKey(vo.getRouteDescription(), + vo.getMaterialCode(), + vo.getProcessNo(), + vo.getMaterialName(), + vo.getProcessName(), + vo.getProcessControl(), + vo.getActivityDuration()); + + List matchingRoutes = routeMap.get(key); + if (CollUtil.isNotEmpty(matchingRoutes)) { + for (ProcessRoute route : matchingRoutes) { + // 更新时间 + route.setXuStartTime(vo.getXuStartTime()); + route.setXuEndTime(vo.getXuEndTime()); + route.setUpdateTime(new Date()); + updatedRoutes.add(route); + } + } + } + + // 5. 批量更新到数据库 + if (!updatedRoutes.isEmpty()) { + for (List batch : ListUtils.partition(updatedRoutes, 500)) { + baseMapper.updateBatchById(batch); + } + } + + return updatedRoutes; + } catch (Exception e) { + log.error("批量更新工艺路线时间失败", e); + throw new ServiceException("批量更新工艺路线时间失败"); + } + } + + /** + * 是否是按图订购 + * @param materialCode + * @return + */ + @Override + public boolean isAnTuDingGou(String materialCode) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ProcessRoute::getMaterialCode, materialCode); + wrapper.eq(ProcessRoute::getProcessName, "按图订制"); + //查询数量 + Long count = baseMapper.selectCount(wrapper); + return count > 0; + } + + /** + * 生成复合键 + * 用于匹配所有需要的字段 + */ + private String generateKey(String routeDescription, + String materialCode, + Long processNo, + String materialName, + String processName, + String processControl, + Double activityDuration) { + return String.format("%s:%s:%s:%s:%s:%s:%s", + StringUtils.defaultString(routeDescription, ""), + StringUtils.defaultString(materialCode, ""), + processNo == null ? "" : processNo.toString(), + StringUtils.defaultString(materialName, ""), + StringUtils.defaultString(processName, ""), + StringUtils.defaultString(processControl, ""), + activityDuration == null?"" : activityDuration.toString()); + } /** * 获取计划订单编号,然后获取计划订单详情 单据内码 行内码 */ diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProductionRouteTwoServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProductionRouteTwoServiceImpl.java index afc1344..75f4a1d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProductionRouteTwoServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ProductionRouteTwoServiceImpl.java @@ -182,7 +182,7 @@ public class ProductionRouteTwoServiceImpl implements IProductionRouteTwoService productionRouteTwo.setFworkcenteridFname(plannedProcess.getFWorkCenterName()); // 工作中心 productionRouteTwo.setFprocessidFname(plannedProcess.getFProcessName()); // 工艺名称 productionRouteTwo.setFOptCtrlCodeidFname(plannedProcess.getFOptCtrlCodeIFName()); - productionRouteTwo.setActivityLengh(Long.valueOf(String.valueOf(plannedProcess.getFActivity1BaseQty()))); + productionRouteTwo.setActivityLengh(plannedProcess.getFActivity1BaseQty().longValue()); // 填充物料相关数据 productionRouteTwo.setFMaterialid2ChildFnumber(materialUsageDTO.getMaterialCode()); // 物料编码 productionRouteTwo.setFMaterialName1(materialUsageDTO.getMaterialName()); // 物料名称 diff --git a/ruoyi-system/src/main/resources/mapper/system/MaterialBomMapper.xml b/ruoyi-system/src/main/resources/mapper/system/MaterialBomMapper.xml index 920b382..24715c8 100644 --- a/ruoyi-system/src/main/resources/mapper/system/MaterialBomMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/MaterialBomMapper.xml @@ -18,6 +18,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" +