From 4d134a9b4ec67ee14c71f05f7cb08bbc998bae4a Mon Sep 17 00:00:00 2001 From: fengyuan_yang <1976974459@qq.com> Date: Fri, 10 Apr 2026 15:01:51 +0800 Subject: [PATCH] =?UTF-8?q?2026-04-10=20=E6=96=B0=E5=A2=9E=E3=80=90Routing?= =?UTF-8?q?=20Operations=E3=80=91=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RoutingOperationsController.java | 39 +++++ .../dto/RoutingOperationsBatchSaveDto.java | 11 ++ .../dto/RoutingOperationsDescQueryDto.java | 10 ++ .../part/dto/RoutingOperationsQueryDto.java | 19 +++ .../part/mapper/RoutingOperationsMapper.java | 23 +++ .../service/RoutingManagementService.java | 2 + .../service/RoutingOperationsService.java | 12 ++ .../impl/RoutingManagementServiceImpl.java | 51 +++++++ .../impl/RoutingOperationsServiceImpl.java | 140 ++++++++++++++++++ .../modules/part/vo/RoutingOperationsVo.java | 46 ++++++ .../mapper/part/RoutingOperationsMapper.xml | 100 +++++++++++++ 11 files changed, 453 insertions(+) create mode 100644 src/main/java/com/spring/modules/part/controller/RoutingOperationsController.java create mode 100644 src/main/java/com/spring/modules/part/dto/RoutingOperationsBatchSaveDto.java create mode 100644 src/main/java/com/spring/modules/part/dto/RoutingOperationsDescQueryDto.java create mode 100644 src/main/java/com/spring/modules/part/dto/RoutingOperationsQueryDto.java create mode 100644 src/main/java/com/spring/modules/part/mapper/RoutingOperationsMapper.java create mode 100644 src/main/java/com/spring/modules/part/service/RoutingOperationsService.java create mode 100644 src/main/java/com/spring/modules/part/service/impl/RoutingOperationsServiceImpl.java create mode 100644 src/main/java/com/spring/modules/part/vo/RoutingOperationsVo.java create mode 100644 src/main/resources/mapper/part/RoutingOperationsMapper.xml diff --git a/src/main/java/com/spring/modules/part/controller/RoutingOperationsController.java b/src/main/java/com/spring/modules/part/controller/RoutingOperationsController.java new file mode 100644 index 00000000..692c0786 --- /dev/null +++ b/src/main/java/com/spring/modules/part/controller/RoutingOperationsController.java @@ -0,0 +1,39 @@ +package com.spring.modules.part.controller; + +import com.spring.common.utils.PageUtils; +import com.spring.common.utils.R; +import com.spring.modules.part.dto.RoutingOperationsBatchSaveDto; +import com.spring.modules.part.dto.RoutingOperationsQueryDto; +import com.spring.modules.part.dto.RoutingOperationsDescQueryDto; +import com.spring.modules.part.service.RoutingOperationsService; +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.RestController; + +@RestController +@RequestMapping("/plm/routingOperations") +public class RoutingOperationsController { + + @Autowired + private RoutingOperationsService routingOperationsService; + + @PostMapping("/search") + public R search(@RequestBody RoutingOperationsQueryDto query) { + PageUtils page = routingOperationsService.routingOperationsSearch(query); + return R.ok().put("page", page); + } + + @PostMapping("/batchSave") + public R batchSave(@RequestBody RoutingOperationsBatchSaveDto dto) { + routingOperationsService.batchSave(dto); + return R.ok(); + } + + @PostMapping("/getDesc") + public R getDesc(@RequestBody RoutingOperationsDescQueryDto dto) { + String desc = routingOperationsService.getDesc(dto); + return R.ok().put("desc", desc); + } +} diff --git a/src/main/java/com/spring/modules/part/dto/RoutingOperationsBatchSaveDto.java b/src/main/java/com/spring/modules/part/dto/RoutingOperationsBatchSaveDto.java new file mode 100644 index 00000000..a14b8e77 --- /dev/null +++ b/src/main/java/com/spring/modules/part/dto/RoutingOperationsBatchSaveDto.java @@ -0,0 +1,11 @@ +package com.spring.modules.part.dto; + +import com.spring.modules.part.entity.RoutingComponentEntity; +import lombok.Data; + +import java.util.List; + +@Data +public class RoutingOperationsBatchSaveDto { + private List items; +} diff --git a/src/main/java/com/spring/modules/part/dto/RoutingOperationsDescQueryDto.java b/src/main/java/com/spring/modules/part/dto/RoutingOperationsDescQueryDto.java new file mode 100644 index 00000000..51ae0fa3 --- /dev/null +++ b/src/main/java/com/spring/modules/part/dto/RoutingOperationsDescQueryDto.java @@ -0,0 +1,10 @@ +package com.spring.modules.part.dto; + +import lombok.Data; + +@Data +public class RoutingOperationsDescQueryDto { + private String site; + private String type; // workCenter or laborClass + private String code; +} diff --git a/src/main/java/com/spring/modules/part/dto/RoutingOperationsQueryDto.java b/src/main/java/com/spring/modules/part/dto/RoutingOperationsQueryDto.java new file mode 100644 index 00000000..242d76cc --- /dev/null +++ b/src/main/java/com/spring/modules/part/dto/RoutingOperationsQueryDto.java @@ -0,0 +1,19 @@ +package com.spring.modules.part.dto; + +import com.spring.common.utils.QueryPage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class RoutingOperationsQueryDto extends QueryPage { + private String site; + private String partNo; + private String partDesc; + private String routingType; + private Integer routingRevision; + private String alternativeNo; + private Integer operationNo; + private String operationName; + private String workCenterNo; +} diff --git a/src/main/java/com/spring/modules/part/mapper/RoutingOperationsMapper.java b/src/main/java/com/spring/modules/part/mapper/RoutingOperationsMapper.java new file mode 100644 index 00000000..b2bce1d7 --- /dev/null +++ b/src/main/java/com/spring/modules/part/mapper/RoutingOperationsMapper.java @@ -0,0 +1,23 @@ +package com.spring.modules.part.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.spring.modules.part.dto.RoutingOperationsQueryDto; +import com.spring.modules.part.entity.RoutingComponentEntity; +import com.spring.modules.part.vo.RoutingOperationsVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface RoutingOperationsMapper extends BaseMapper { + IPage routingOperationsSearch(Page page, @Param("query") RoutingOperationsQueryDto query); + + int countWorkCenter(@Param("site") String site, @Param("workCenterNo") String workCenterNo); + + int countLaborClass(@Param("site") String site, @Param("laborClassNo") String laborClassNo); + + String getWorkCenterDesc(@Param("site") String site, @Param("workCenterNo") String workCenterNo); + + String getLaborClassDesc(@Param("site") String site, @Param("laborClassNo") String laborClassNo); +} diff --git a/src/main/java/com/spring/modules/part/service/RoutingManagementService.java b/src/main/java/com/spring/modules/part/service/RoutingManagementService.java index 8c735778..aab62e5a 100644 --- a/src/main/java/com/spring/modules/part/service/RoutingManagementService.java +++ b/src/main/java/com/spring/modules/part/service/RoutingManagementService.java @@ -41,6 +41,8 @@ public interface RoutingManagementService { List updateRoutingComponent(RoutingComponentEntity data); + void batchUpdateRoutingComponent(List items); + List queryOperationList(OperationEntity data); Map routingDetailUpdate(RoutingDetailEntity data); diff --git a/src/main/java/com/spring/modules/part/service/RoutingOperationsService.java b/src/main/java/com/spring/modules/part/service/RoutingOperationsService.java new file mode 100644 index 00000000..5129bad1 --- /dev/null +++ b/src/main/java/com/spring/modules/part/service/RoutingOperationsService.java @@ -0,0 +1,12 @@ +package com.spring.modules.part.service; + +import com.spring.common.utils.PageUtils; +import com.spring.modules.part.dto.RoutingOperationsBatchSaveDto; +import com.spring.modules.part.dto.RoutingOperationsQueryDto; +import com.spring.modules.part.dto.RoutingOperationsDescQueryDto; + +public interface RoutingOperationsService { + PageUtils routingOperationsSearch(RoutingOperationsQueryDto query); + void batchSave(RoutingOperationsBatchSaveDto dto); + String getDesc(RoutingOperationsDescQueryDto dto); +} diff --git a/src/main/java/com/spring/modules/part/service/impl/RoutingManagementServiceImpl.java b/src/main/java/com/spring/modules/part/service/impl/RoutingManagementServiceImpl.java index 013491f8..3192c53a 100644 --- a/src/main/java/com/spring/modules/part/service/impl/RoutingManagementServiceImpl.java +++ b/src/main/java/com/spring/modules/part/service/impl/RoutingManagementServiceImpl.java @@ -924,6 +924,57 @@ public class RoutingManagementServiceImpl extends ServiceImpl items) { + if (items == null || items.isEmpty()) { + return; + } + + Map officialFlagCache = new HashMap<>(); + + Server srv = null; + if (dataUrl) { + srv = getIfsServer(items.get(0).getUpdateBy()); + } + + for (RoutingComponentEntity data : items) { + routingManagementMapper.updateRoutingComponent(data); + + if (dataUrl) { + String detailKey = data.getSite() + "_" + data.getPartNo() + "_" + data.getRoutingRevision() + "_" + data.getRoutingType() + "_" + data.getAlternativeNo(); + Boolean isOfficial = officialFlagCache.get(detailKey); + if (isOfficial == null) { + List routingDetailList = routingManagementMapper.queryRoutingDetailOfficialFlag(data); + isOfficial = !routingDetailList.isEmpty() && "Y".equals(routingDetailList.get(0).getOfficialFlag()); + officialFlagCache.put(detailKey, isOfficial); + } + + if (isOfficial) { + RoutingIfsItem routingIfsItem = routingManagementMapper.getRoutingComponentToIfs(data); + Map updateRoutingComponentResponse = routingServiceBean.modifyRoutingItem(srv, routingIfsItem); + if (!"200".equals(updateRoutingComponentResponse.get("resultCode"))) { + throw new RuntimeException("ifs RoutingItem修改异常:" + updateRoutingComponentResponse.get("resultMsg")); + } + // 更新 ifs_row_id ifs_row_version + String s = String.valueOf(updateRoutingComponentResponse.get("obj")); + RoutingIfsItem ifsItems = JSON.parseObject(s, RoutingIfsItem.class); + if (ifsItems != null) { + data.setIfsRowId(ifsItems.getIfsRowId()); + data.setIfsRowVersion(ifsItems.getIfsRowVersion()); + routingManagementMapper.updateRoutingComponentIfsRow(data); + } else { + throw new RuntimeException("ifs RoutingItem修改接口返回值异常!"); + } + } + } + } + } + /** * 删除routing子明细 * @param data diff --git a/src/main/java/com/spring/modules/part/service/impl/RoutingOperationsServiceImpl.java b/src/main/java/com/spring/modules/part/service/impl/RoutingOperationsServiceImpl.java new file mode 100644 index 00000000..43d393b8 --- /dev/null +++ b/src/main/java/com/spring/modules/part/service/impl/RoutingOperationsServiceImpl.java @@ -0,0 +1,140 @@ +package com.spring.modules.part.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.spring.common.utils.PageUtils; +import com.spring.modules.part.dto.RoutingOperationsBatchSaveDto; +import com.spring.modules.part.dto.RoutingOperationsQueryDto; +import com.spring.modules.part.dto.RoutingOperationsDescQueryDto; +import com.spring.modules.part.entity.RoutingComponentEntity; +import com.spring.modules.part.mapper.RoutingOperationsMapper; +import com.spring.modules.part.service.RoutingManagementService; +import com.spring.modules.part.service.RoutingOperationsService; +import com.spring.modules.part.vo.RoutingOperationsVo; +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; +import java.util.Map; +import java.util.HashMap; +import java.util.Arrays; + +@Service +public class RoutingOperationsServiceImpl implements RoutingOperationsService { + + @Autowired + private RoutingOperationsMapper routingOperationsMapper; + + @Autowired + private RoutingManagementService routingManagementService; + + @Override + public PageUtils routingOperationsSearch(RoutingOperationsQueryDto query) { + if (query == null || StringUtils.isBlank(query.getSite())) { + throw new RuntimeException("工厂(site)不能为空"); + } + if (StringUtils.isAllBlank(query.getPartNo(), query.getPartDesc(), query.getRoutingType(), + query.getAlternativeNo(), query.getOperationName(), query.getWorkCenterNo()) + && query.getRoutingRevision() == null && query.getOperationNo() == null) { + throw new RuntimeException("请至少填写一项查询条件"); + } + if (StringUtils.isNotBlank(query.getPartNo())) { + query.setPartNo(query.getPartNo().trim()); + } + if (StringUtils.isNotBlank(query.getPartDesc())) { + query.setPartDesc(query.getPartDesc().trim()); + } + IPage page = routingOperationsMapper.routingOperationsSearch( + new Page<>(query.getPage(), query.getLimit()), query); + return new PageUtils(page); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void batchSave(RoutingOperationsBatchSaveDto dto) { + if (dto == null || CollectionUtils.isEmpty(dto.getItems())) { + throw new RuntimeException("没有需要保存的数据"); + } + List items = dto.getItems(); + + Map workCenterCache = new HashMap<>(); + Map laborClassCache = new HashMap<>(); + List validRunTimeCodes = Arrays.asList("Units/Hour", "Hours/Unit", "Hours"); + + for (RoutingComponentEntity item : items) { + if (StringUtils.isAnyBlank(item.getSite(), item.getPartNo(), item.getRoutingType()) + || item.getRoutingRevision() == null + || item.getOperationId() == null) { + throw new RuntimeException("保存数据不完整:工厂、物料编码、工艺类型、版本号、工序ID不能为空"); + } + if (item.getAlternativeNo() == null) { + item.setAlternativeNo(""); + } + if (StringUtils.isBlank(item.getUpdateBy())) { + throw new RuntimeException("更新人不能为空"); + } + + // 校验加工中心编码 + if (StringUtils.isNotBlank(item.getWorkCenterNo())) { + String wcKey = item.getSite() + ":" + item.getWorkCenterNo(); + if (!workCenterCache.containsKey(wcKey)) { + int count = routingOperationsMapper.countWorkCenter(item.getSite(), item.getWorkCenterNo()); + workCenterCache.put(wcKey, count > 0); + } + if (!workCenterCache.get(wcKey)) { + throw new RuntimeException("加工中心编码不合法:" + item.getWorkCenterNo()); + } + } else { + throw new RuntimeException("加工中心编码不能为空"); + } + + // 校验调机过程中人员等级 + if (StringUtils.isNotBlank(item.getSetupLaborClassNo())) { + String lcKey = item.getSite() + ":" + item.getSetupLaborClassNo(); + if (!laborClassCache.containsKey(lcKey)) { + int count = routingOperationsMapper.countLaborClass(item.getSite(), item.getSetupLaborClassNo()); + laborClassCache.put(lcKey, count > 0); + } + if (!laborClassCache.get(lcKey)) { + throw new RuntimeException("调机过程中人员等级不合法:" + item.getSetupLaborClassNo()); + } + } + + // 校验人员等级 + if (StringUtils.isNotBlank(item.getLaborClassNo())) { + String lcKey = item.getSite() + ":" + item.getLaborClassNo(); + if (!laborClassCache.containsKey(lcKey)) { + int count = routingOperationsMapper.countLaborClass(item.getSite(), item.getLaborClassNo()); + laborClassCache.put(lcKey, count > 0); + } + if (!laborClassCache.get(lcKey)) { + throw new RuntimeException("人员等级不合法:" + item.getLaborClassNo()); + } + } + + // 校验产出单位 + if (StringUtils.isNotBlank(item.getRunTimeCode())) { + if (!validRunTimeCodes.contains(item.getRunTimeCode())) { + throw new RuntimeException("产出单位不合法,只能是 Units/Hour、Hours/Unit、Hours 之一"); + } + } + } + routingManagementService.batchUpdateRoutingComponent(items); + } + + @Override + public String getDesc(RoutingOperationsDescQueryDto dto) { + if (dto == null || StringUtils.isAnyBlank(dto.getSite(), dto.getType(), dto.getCode())) { + return ""; + } + if ("workCenter".equals(dto.getType())) { + return routingOperationsMapper.getWorkCenterDesc(dto.getSite(), dto.getCode()); + } else if ("laborClass".equals(dto.getType())) { + return routingOperationsMapper.getLaborClassDesc(dto.getSite(), dto.getCode()); + } + return ""; + } +} diff --git a/src/main/java/com/spring/modules/part/vo/RoutingOperationsVo.java b/src/main/java/com/spring/modules/part/vo/RoutingOperationsVo.java new file mode 100644 index 00000000..13d04336 --- /dev/null +++ b/src/main/java/com/spring/modules/part/vo/RoutingOperationsVo.java @@ -0,0 +1,46 @@ +package com.spring.modules.part.vo; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class RoutingOperationsVo { + private String site; + private String partNo; + private String partDesc; + private String routingType; + private Integer routingRevision; + private String alternativeNo; + private String status; + + private Integer operationId; + private Integer operationNo; + private String operationName; + + private String workCenterNo; + private String workCenterDesc; + private BigDecimal machSetupTime; + private BigDecimal machRunFactor; + private String setupLaborClassNo; + private String setupLaborClassDesc; + private BigDecimal laborSetupTime; + private BigDecimal setupCrewSize; + private String laborClassNo; + private String laborClassDesc; + private BigDecimal laborRunFactor; + private String runTimeCode; + private BigDecimal crewSize; + + private Date phaseInDate; + private Date phaseOutDate; + private BigDecimal overlap; + private BigDecimal efficiencyFactor; + private String outsideOpItem; + private Date createDate; + private String machineNo; + private String noteText; + private String ifsRowId; + private String ifsRowVersion; +} diff --git a/src/main/resources/mapper/part/RoutingOperationsMapper.xml b/src/main/resources/mapper/part/RoutingOperationsMapper.xml new file mode 100644 index 00000000..78e399a5 --- /dev/null +++ b/src/main/resources/mapper/part/RoutingOperationsMapper.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + +