diff --git a/src/main/java/com/spring/modules/part/controller/ManufacturingStructuresController.java b/src/main/java/com/spring/modules/part/controller/ManufacturingStructuresController.java new file mode 100644 index 00000000..3fe12a37 --- /dev/null +++ b/src/main/java/com/spring/modules/part/controller/ManufacturingStructuresController.java @@ -0,0 +1,29 @@ +package com.spring.modules.part.controller; + +import com.spring.common.utils.R; +import com.spring.modules.part.dto.ManufacturingStructuresBatchSaveDto; +import com.spring.modules.part.service.ManufacturingStructuresService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * 制造结构维护:批量保存(内部逐条调用 {@link com.spring.modules.part.service.BomManagementService#updateBomComponent}) + */ +@RestController +@RequestMapping("plm/manufacturingStructures") +public class ManufacturingStructuresController { + + @Autowired + private ManufacturingStructuresService manufacturingStructuresService; + + @PostMapping("/batchSave") + @ResponseBody + public R batchSave(@RequestBody ManufacturingStructuresBatchSaveDto dto) { + manufacturingStructuresService.batchSave(dto); + return R.ok(); + } +} diff --git a/src/main/java/com/spring/modules/part/dto/CompleteWhereUsedQueryDto.java b/src/main/java/com/spring/modules/part/dto/CompleteWhereUsedQueryDto.java index 07649660..156523d7 100644 --- a/src/main/java/com/spring/modules/part/dto/CompleteWhereUsedQueryDto.java +++ b/src/main/java/com/spring/modules/part/dto/CompleteWhereUsedQueryDto.java @@ -20,4 +20,13 @@ public class CompleteWhereUsedQueryDto extends QueryPage { private String componentPartType; /** 子件零件状态 */ private String componentPartStatus; + + /** 父件物料编码 */ + private String parentPartNo; + /** 父件描述 */ + private String parentPartDesc; + /** 父件零件类型 */ + private String parentPartType; + /** 父件零件状态 */ + private String parentPartStatus; } diff --git a/src/main/java/com/spring/modules/part/dto/ManufacturingStructuresBatchSaveDto.java b/src/main/java/com/spring/modules/part/dto/ManufacturingStructuresBatchSaveDto.java new file mode 100644 index 00000000..95977b08 --- /dev/null +++ b/src/main/java/com/spring/modules/part/dto/ManufacturingStructuresBatchSaveDto.java @@ -0,0 +1,15 @@ +package com.spring.modules.part.dto; + +import com.spring.modules.part.entity.BomComponentEntity; +import lombok.Data; + +import java.util.List; + +/** + * 制造结构维护:批量保存修改的 BOM 子件行(逐条调用与单条修改相同的业务逻辑,含正式替代时同步 IFS)。 + */ +@Data +public class ManufacturingStructuresBatchSaveDto { + + private List items; +} diff --git a/src/main/java/com/spring/modules/part/service/BomManagementService.java b/src/main/java/com/spring/modules/part/service/BomManagementService.java index 992fcdfa..d670c44d 100644 --- a/src/main/java/com/spring/modules/part/service/BomManagementService.java +++ b/src/main/java/com/spring/modules/part/service/BomManagementService.java @@ -38,6 +38,8 @@ public interface BomManagementService { Map updateBomComponent(BomComponentEntity data); + void batchUpdateBomComponent(List items); + Map bomDetailUpdate(BomDetailEntity data); Map updateAlternativeStatus(BomDetailEntity data); diff --git a/src/main/java/com/spring/modules/part/service/ManufacturingStructuresService.java b/src/main/java/com/spring/modules/part/service/ManufacturingStructuresService.java new file mode 100644 index 00000000..570b1aeb --- /dev/null +++ b/src/main/java/com/spring/modules/part/service/ManufacturingStructuresService.java @@ -0,0 +1,11 @@ +package com.spring.modules.part.service; + +import com.spring.modules.part.dto.ManufacturingStructuresBatchSaveDto; + +/** + * 制造结构维护(查询复用 completeWhereUsed,保存为批量封装) + */ +public interface ManufacturingStructuresService { + + void batchSave(ManufacturingStructuresBatchSaveDto dto); +} diff --git a/src/main/java/com/spring/modules/part/service/impl/BomManagementServiceImpl.java b/src/main/java/com/spring/modules/part/service/impl/BomManagementServiceImpl.java index 439dedd9..86b9fccf 100644 --- a/src/main/java/com/spring/modules/part/service/impl/BomManagementServiceImpl.java +++ b/src/main/java/com/spring/modules/part/service/impl/BomManagementServiceImpl.java @@ -845,6 +845,79 @@ public class BomManagementServiceImpl extends ServiceImpl items) { + if (items == null || items.isEmpty()) { + return; + } + + Map partInfoCache = new HashMap<>(); + Map officialFlagCache = new HashMap<>(); + + Server srv = null; + if (dataUrl) { + srv = getIfsServer(items.get(0).getUpdateBy()); + } + + for (BomComponentEntity data : items) { + if ("byProduct".equals(data.getProductFlag())) { + data.setQtyPerAssembly(data.getQtyPerAssembly().negate()); + } + + String partKey = data.getSite() + "_" + data.getComponentPart(); + PartInformationEntity partInformationEntity = partInfoCache.get(partKey); + if (partInformationEntity == null) { + partInformationEntity = partInformationMapper.selectOne(new QueryWrapper().eq("site", data.getSite()).eq("part_no", data.getComponentPart())); + if (partInformationEntity == null) { + throw new RuntimeException("子物料不存在: " + data.getComponentPart()); + } + partInfoCache.put(partKey, partInformationEntity); + } + + data.setPrintUnit(partInformationEntity.getUmId()); + bomManagementMapper.updateBomComponent(data); + + if (dataUrl) { + String detailKey = data.getSite() + "_" + data.getPartNo() + "_" + data.getEngChgLevel() + "_" + data.getBomType() + "_" + data.getAlternativeNo(); + Boolean isOfficial = officialFlagCache.get(detailKey); + if (isOfficial == null) { + List bomDetailList = bomManagementMapper.queryBomDetailOfficialFlag(data); + isOfficial = !bomDetailList.isEmpty() && "Y".equals(bomDetailList.get(0).getOfficialFlag()); + officialFlagCache.put(detailKey, isOfficial); + } + + if (isOfficial) { + BomIfsItem bomIfsItem = new BomIfsItem(); + bomIfsItem.setContract(data.getSite()); + bomIfsItem.setPartNo(data.getPartNo()); + bomIfsItem.setEngChgLevel(data.getEngChgLevel().toString()); + bomIfsItem.setBomType(data.getBomType()); + bomIfsItem.setAlternativeNo(data.getAlternativeNo()); + bomIfsItem.setComponentPart(data.getComponentPart()); + bomIfsItem.setQtyPerAssembly(data.getQtyPerAssembly().toString()); + bomIfsItem.setComponentScrap(data.getComponentScrap().toString()); + bomIfsItem.setIssueType(data.getIssueType()); + bomIfsItem.setShrinkageFactor(data.getShrinkageFactor().toString()); + bomIfsItem.setLineItemNo(data.getLineItemNo().toString()); + bomIfsItem.setLineSequence(data.getLineSequence().toString()); + bomIfsItem.setNoteText(data.getNoteText()); + bomIfsItem.setOperationNo(data.getOperationNo() == null ? "" : data.getOperationNo().toString()); + bomIfsItem.setConsumptionItem(data.getConsumptionItem()); + bomIfsItem.setProductFlag(data.getProductFlag()); + Map updateBomComponentResponse = bomServiceBean.modifyBomItem(srv, bomIfsItem); + if (!"200".equals(updateBomComponentResponse.get("resultCode"))) { + throw new RuntimeException("IFS BomItem修改异常:" + updateBomComponentResponse.get("resultMsg")); + } + } + } + } + } + /** * 删除bom子明细 * @param data diff --git a/src/main/java/com/spring/modules/part/service/impl/CompleteWhereUsedServiceImpl.java b/src/main/java/com/spring/modules/part/service/impl/CompleteWhereUsedServiceImpl.java index 18e54e92..5f579a09 100644 --- a/src/main/java/com/spring/modules/part/service/impl/CompleteWhereUsedServiceImpl.java +++ b/src/main/java/com/spring/modules/part/service/impl/CompleteWhereUsedServiceImpl.java @@ -22,7 +22,15 @@ public class CompleteWhereUsedServiceImpl implements CompleteWhereUsedService { if (query == null || StringUtils.isBlank(query.getSite())) { throw new RuntimeException("工厂(site)不能为空"); } - if (StringUtils.isAllBlank(query.getComponentPart(), query.getComponentPartDesc(), query.getComponentPartType(), query.getComponentPartStatus())) { + if (StringUtils.isAllBlank( + query.getComponentPart(), + query.getComponentPartDesc(), + query.getComponentPartType(), + query.getComponentPartStatus(), + query.getParentPartNo(), + query.getParentPartDesc(), + query.getParentPartType(), + query.getParentPartStatus())) { throw new RuntimeException("请至少填写一项查询条件"); } if (StringUtils.isNotBlank(query.getComponentPart())) { @@ -31,6 +39,12 @@ public class CompleteWhereUsedServiceImpl implements CompleteWhereUsedService { if (StringUtils.isNotBlank(query.getComponentPartDesc())) { query.setComponentPartDesc(query.getComponentPartDesc().trim()); } + if (StringUtils.isNotBlank(query.getParentPartNo())) { + query.setParentPartNo(query.getParentPartNo().trim()); + } + if (StringUtils.isNotBlank(query.getParentPartDesc())) { + query.setParentPartDesc(query.getParentPartDesc().trim()); + } IPage page = completeWhereUsedMapper.completeWhereUsedSearch( new Page<>(query.getPage(), query.getLimit()), query); return new PageUtils(page); diff --git a/src/main/java/com/spring/modules/part/service/impl/ManufacturingStructuresServiceImpl.java b/src/main/java/com/spring/modules/part/service/impl/ManufacturingStructuresServiceImpl.java new file mode 100644 index 00000000..a830e8de --- /dev/null +++ b/src/main/java/com/spring/modules/part/service/impl/ManufacturingStructuresServiceImpl.java @@ -0,0 +1,46 @@ +package com.spring.modules.part.service.impl; + +import com.spring.modules.part.dto.ManufacturingStructuresBatchSaveDto; +import com.spring.modules.part.entity.BomComponentEntity; +import com.spring.modules.part.service.BomManagementService; +import com.spring.modules.part.service.ManufacturingStructuresService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.List; + +@Service +public class ManufacturingStructuresServiceImpl implements ManufacturingStructuresService { + + @Autowired + private BomManagementService bomManagementService; + + @Override + @Transactional(rollbackFor = Exception.class) + public void batchSave(ManufacturingStructuresBatchSaveDto dto) { + if (dto == null || CollectionUtils.isEmpty(dto.getItems())) { + throw new RuntimeException("没有需要保存的数据"); + } + List items = dto.getItems(); + for (BomComponentEntity item : items) { + if (StringUtils.isAnyBlank(item.getSite(), item.getPartNo(), item.getBomType(), item.getComponentPart()) + || item.getEngChgLevel() == null + || item.getLineItemNo() == null) { + throw new RuntimeException("保存数据不完整:工厂、父件、BOM版本、制造类型、行号、子件编码不能为空"); + } + if (item.getAlternativeNo() == null) { + item.setAlternativeNo(""); + } + if (StringUtils.isBlank(item.getUpdateBy())) { + throw new RuntimeException("更新人不能为空"); + } + if (StringUtils.isBlank(item.getProductFlag())) { + item.setProductFlag("component"); + } + } + bomManagementService.batchUpdateBomComponent(items); + } +} diff --git a/src/main/resources/mapper/part/CompleteWhereUsedMapper.xml b/src/main/resources/mapper/part/CompleteWhereUsedMapper.xml index d8e54a87..c7fa082a 100644 --- a/src/main/resources/mapper/part/CompleteWhereUsedMapper.xml +++ b/src/main/resources/mapper/part/CompleteWhereUsedMapper.xml @@ -56,6 +56,18 @@ AND p2.part_status = #{query.componentPartStatus} + + AND pbc.part_no = #{query.parentPartNo} + + + AND dbo.get_part_name(pbc.site, pbc.part_no) LIKE #{query.parentPartDesc} + + + AND p1.part_type = #{query.parentPartType} + + + AND p1.part_status = #{query.parentPartStatus} + ORDER BY pbc.part_no,