Browse Source

2026-04-09

新增【Manufacturing Structures】功能
master
fengyuan_yang 2 months ago
parent
commit
fd1a77caf5
  1. 29
      src/main/java/com/spring/modules/part/controller/ManufacturingStructuresController.java
  2. 9
      src/main/java/com/spring/modules/part/dto/CompleteWhereUsedQueryDto.java
  3. 15
      src/main/java/com/spring/modules/part/dto/ManufacturingStructuresBatchSaveDto.java
  4. 2
      src/main/java/com/spring/modules/part/service/BomManagementService.java
  5. 11
      src/main/java/com/spring/modules/part/service/ManufacturingStructuresService.java
  6. 73
      src/main/java/com/spring/modules/part/service/impl/BomManagementServiceImpl.java
  7. 16
      src/main/java/com/spring/modules/part/service/impl/CompleteWhereUsedServiceImpl.java
  8. 46
      src/main/java/com/spring/modules/part/service/impl/ManufacturingStructuresServiceImpl.java
  9. 12
      src/main/resources/mapper/part/CompleteWhereUsedMapper.xml

29
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();
}
}

9
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;
}

15
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<BomComponentEntity> items;
}

2
src/main/java/com/spring/modules/part/service/BomManagementService.java

@ -38,6 +38,8 @@ public interface BomManagementService {
Map<String, Object> updateBomComponent(BomComponentEntity data);
void batchUpdateBomComponent(List<BomComponentEntity> items);
Map<String, Object> bomDetailUpdate(BomDetailEntity data);
Map<String, Object> updateAlternativeStatus(BomDetailEntity data);

11
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);
}

73
src/main/java/com/spring/modules/part/service/impl/BomManagementServiceImpl.java

@ -845,6 +845,79 @@ public class BomManagementServiceImpl extends ServiceImpl<BomManagementMapper, B
return map;
}
/**
* 批量修改bom子明细用于反查页面批量替换
* @param items
*/
@Override
@Transactional
public void batchUpdateBomComponent(List<BomComponentEntity> items) {
if (items == null || items.isEmpty()) {
return;
}
Map<String, PartInformationEntity> partInfoCache = new HashMap<>();
Map<String, Boolean> 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<PartInformationEntity>().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<BomDetailEntity> 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<String, String> updateBomComponentResponse = bomServiceBean.modifyBomItem(srv, bomIfsItem);
if (!"200".equals(updateBomComponentResponse.get("resultCode"))) {
throw new RuntimeException("IFS BomItem修改异常:" + updateBomComponentResponse.get("resultMsg"));
}
}
}
}
}
/**
* 删除bom子明细
* @param data

16
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<CompleteWhereUsedVo> page = completeWhereUsedMapper.completeWhereUsedSearch(
new Page<>(query.getPage(), query.getLimit()), query);
return new PageUtils(page);

46
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<BomComponentEntity> 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);
}
}

12
src/main/resources/mapper/part/CompleteWhereUsedMapper.xml

@ -56,6 +56,18 @@
<if test="query.componentPartStatus != null and query.componentPartStatus != ''">
AND p2.part_status = #{query.componentPartStatus}
</if>
<if test="query.parentPartNo != null and query.parentPartNo != ''">
AND pbc.part_no = #{query.parentPartNo}
</if>
<if test="query.parentPartDesc != null and query.parentPartDesc != ''">
AND dbo.get_part_name(pbc.site, pbc.part_no) LIKE #{query.parentPartDesc}
</if>
<if test="query.parentPartType != null and query.parentPartType != ''">
AND p1.part_type = #{query.parentPartType}
</if>
<if test="query.parentPartStatus != null and query.parentPartStatus != ''">
AND p1.part_status = #{query.parentPartStatus}
</if>
</where>
ORDER BY
pbc.part_no,

Loading…
Cancel
Save