package com.ruoyi.production.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; 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.production.dto.ProcessRouteDto; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.mapper.ProcessRouteItemMapper; import com.ruoyi.production.mapper.ProcessRouteMapper; import com.ruoyi.production.mapper.ProductOrderMapper; import com.ruoyi.production.pojo.ProcessRoute; import com.ruoyi.production.pojo.ProcessRouteItem; import com.ruoyi.production.pojo.ProductOrder; import com.ruoyi.production.service.ProcessRouteService; import com.ruoyi.production.service.ProductStructureService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @Service @AllArgsConstructor @Slf4j public class ProcessRouteServiceImpl extends ServiceImpl implements ProcessRouteService { @Autowired private ProcessRouteMapper processRouteMapper; @Autowired private ProcessRouteItemMapper processRouteItemMapper; @Autowired private ProductOrderMapper productOrderMapper; @Autowired private ProductStructureService productStructureService; @Override public IPage pageProcessRouteDto(Page page, ProcessRouteDto processRouteDto) { return processRouteMapper.pageProcessRouteDto(page, processRouteDto); } @Override public Integer saveProcessRoute(ProcessRoute processRoute) { normalizeProductModelIds(processRoute); this.save(processRoute); String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); String idStr = String.format("%06d", processRoute.getId()); String routeCode = "GYLX" + dateStr + idStr; processRoute.setProcessRouteCode(routeCode); List productStructureDtos = productStructureService.listDetailBybomId(processRoute.getBomId()); if (CollectionUtils.isNotEmpty(productStructureDtos)) { AtomicInteger i = new AtomicInteger(1); productStructureDtos.forEach(productStructureDto -> { ProcessRouteItem processRouteItem = new ProcessRouteItem(); processRouteItem.setRouteId(processRoute.getId()); processRouteItem.setProcessId(productStructureDto.getProcessId()); processRouteItem.setProductModelId(processRoute.getProductModelId()); processRouteItem.setProductModelIds(processRoute.getProductModelIds()); processRouteItem.setDragSort(i.get()); processRouteItem.setIsQuality(false); processRouteItemMapper.insert(processRouteItem); i.getAndIncrement(); }); } return processRouteMapper.updateById(processRoute); } @Override public int batchDelete(List ids) { List productOrders = productOrderMapper.selectList( Wrappers.lambdaQuery().in(ProductOrder::getRouteId, ids) ); if (!productOrders.isEmpty()) { throw new RuntimeException("该工艺路线已被生产订单引用,不能删除"); } processRouteItemMapper.delete(Wrappers.lambdaQuery().in(ProcessRouteItem::getRouteId, ids)); return processRouteMapper.deleteBatchIds(ids); } private void normalizeProductModelIds(ProcessRoute processRoute) { if (processRoute == null) { return; } String ids = joinProductModelIds( processRoute.getProductModelIdList(), processRoute.getProductModelIds(), processRoute.getProductModelId() ); processRoute.setProductModelIds(ids); processRoute.setProductModelId(firstProductModelId(ids, processRoute.getProductModelId())); } private String joinProductModelIds(List idList, String ids, Long fallbackId) { if (CollectionUtils.isNotEmpty(idList)) { return idList.stream() .filter(item -> item != null && item > 0) .distinct() .map(String::valueOf) .collect(Collectors.joining(",")); } if (StringUtils.hasText(ids)) { return Arrays.stream(ids.split(",")) .map(String::trim) .filter(StringUtils::hasText) .distinct() .collect(Collectors.joining(",")); } return fallbackId == null ? null : String.valueOf(fallbackId); } private Long firstProductModelId(String ids, Long fallbackId) { if (!StringUtils.hasText(ids)) { return fallbackId; } String first = ids.split(",")[0].trim(); if (!StringUtils.hasText(first)) { return fallbackId; } try { return Long.parseLong(first); } catch (NumberFormatException ignore) { return fallbackId; } } }