| | |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.technology.bean.dto.TechnologyRoutingOperationDto; |
| | | import com.ruoyi.technology.bean.dto.TechnologyRoutingOperationParamSyncDto; |
| | | import com.ruoyi.technology.bean.vo.TechnologyRoutingOperationVo; |
| | | import com.ruoyi.technology.mapper.TechnologyOperationMapper; |
| | | import com.ruoyi.technology.mapper.TechnologyRoutingMapper; |
| | | import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper; |
| | | import com.ruoyi.technology.mapper.TechnologyRoutingOperationParamMapper; |
| | | import com.ruoyi.technology.pojo.TechnologyOperation; |
| | | import com.ruoyi.technology.pojo.TechnologyRouting; |
| | | import com.ruoyi.technology.pojo.TechnologyRoutingOperation; |
| | | import com.ruoyi.technology.pojo.TechnologyRoutingOperationParam; |
| | | import com.ruoyi.technology.service.TechnologyRoutingOperationParamService; |
| | | import com.ruoyi.technology.service.TechnologyRoutingOperationService; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.HashSet; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | import java.util.stream.Collectors; |
| | | |
| | | @Service |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | private final TechnologyRoutingOperationMapper technologyRoutingOperationMapper; |
| | | |
| | | private final TechnologyRoutingMapper technologyRoutingMapper; |
| | | private final TechnologyOperationMapper technologyOperationMapper; |
| | | private final TechnologyRoutingOperationParamMapper technologyRoutingOperationParamMapper; |
| | | private final TechnologyRoutingOperationParamService technologyRoutingOperationParamService; |
| | | |
| | | @Override |
| | |
| | | return saved; |
| | | } |
| | | |
| | | /** |
| | | * 全量保存工艺路线工序: |
| | | * 1) 按提交顺序作为工序顺序(dragSort 从 1 开始); |
| | | * 2) 每道工序只允许出现一次,与“按BOM工序去重生成”保持一致; |
| | | * 3) 工序产出规格固定为工艺路线的成品规格; |
| | | * 4) 未回传的工序连同参数快照一并删除。 |
| | | */ |
| | | @Override |
| | | public boolean saveRouteOperations(TechnologyRoutingOperationDto dto) { |
| | | if (dto == null) { |
| | | throw new ServiceException("参数不能为空"); |
| | | } |
| | | Long technologyRoutingId = dto.getTechnologyRoutingId() != null ? dto.getTechnologyRoutingId() : dto.getRouteId(); |
| | | if (technologyRoutingId == null) { |
| | | throw new ServiceException("工艺路线ID不能为空"); |
| | | } |
| | | TechnologyRouting technologyRouting = technologyRoutingMapper.selectById(technologyRoutingId); |
| | | if (technologyRouting == null) { |
| | | throw new ServiceException("工艺路线不存在"); |
| | | } |
| | | List<TechnologyRoutingOperationDto> operationList = dto.getOperationList() == null |
| | | ? Collections.emptyList() |
| | | : dto.getOperationList(); |
| | | |
| | | List<TechnologyRoutingOperation> dbList = this.list(Wrappers.<TechnologyRoutingOperation>lambdaQuery() |
| | | .eq(TechnologyRoutingOperation::getTechnologyRoutingId, technologyRoutingId)); |
| | | Set<Long> dbIds = dbList.stream().map(TechnologyRoutingOperation::getId).collect(Collectors.toSet()); |
| | | |
| | | Set<Long> submittedIds = new HashSet<>(); |
| | | Set<Long> submittedOperationIds = new HashSet<>(); |
| | | List<TechnologyRoutingOperation> insertList = new ArrayList<>(); |
| | | List<TechnologyRoutingOperation> updateList = new ArrayList<>(); |
| | | |
| | | int dragSort = 1; |
| | | for (TechnologyRoutingOperationDto item : operationList) { |
| | | Long technologyOperationId = item.getTechnologyOperationId(); |
| | | if (technologyOperationId == null) { |
| | | throw new ServiceException("请为所有工序选择工艺工序"); |
| | | } |
| | | TechnologyOperation technologyOperation = technologyOperationMapper.selectById(technologyOperationId); |
| | | if (technologyOperation == null) { |
| | | throw new ServiceException("工艺工序不存在"); |
| | | } |
| | | if (!submittedOperationIds.add(technologyOperationId)) { |
| | | throw new ServiceException("同一道工序不能重复出现在工艺路线中:" + technologyOperation.getName()); |
| | | } |
| | | |
| | | TechnologyRoutingOperation entity = new TechnologyRoutingOperation(); |
| | | entity.setTechnologyRoutingId(technologyRoutingId); |
| | | entity.setProductModelId(technologyRouting.getProductModelId()); |
| | | entity.setTechnologyOperationId(technologyOperationId); |
| | | entity.setDragSort(dragSort++); |
| | | entity.setIsQuality(technologyOperation.getIsQuality()); |
| | | entity.setIsProduction(technologyOperation.getIsProduction()); |
| | | entity.setType(technologyOperation.getType()); |
| | | |
| | | if (item.getId() == null) { |
| | | insertList.add(entity); |
| | | } else { |
| | | if (!dbIds.contains(item.getId())) { |
| | | throw new ServiceException("工艺路线工序不存在或不属于当前工艺路线"); |
| | | } |
| | | entity.setId(item.getId()); |
| | | submittedIds.add(item.getId()); |
| | | updateList.add(entity); |
| | | } |
| | | } |
| | | |
| | | Set<Long> deleteIds = new HashSet<>(dbIds); |
| | | deleteIds.removeAll(submittedIds); |
| | | if (!deleteIds.isEmpty()) { |
| | | // 删除工序时同时清理其参数快照,避免留下孤立数据 |
| | | technologyRoutingOperationParamMapper.delete(Wrappers.<TechnologyRoutingOperationParam>lambdaQuery() |
| | | .in(TechnologyRoutingOperationParam::getTechnologyRoutingOperationId, deleteIds)); |
| | | for (Long deleteId : deleteIds) { |
| | | removeTechnologyRoutingOperation(deleteId); |
| | | } |
| | | } |
| | | if (!updateList.isEmpty()) { |
| | | this.updateBatchById(updateList); |
| | | } |
| | | for (TechnologyRoutingOperation insert : insertList) { |
| | | saveTechnologyRoutingOperation(insert); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | public boolean removeTechnologyRoutingOperation(Long id) { |
| | | TechnologyRoutingOperation technologyRoutingOperation = this.getById(id); |