package com.ruoyi.production.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; 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.ProcessRouteAnticlockwiseDto; import com.ruoyi.production.dto.ProcessRouteDto; import com.ruoyi.production.mapper.ProcessRouteItemMapper; import com.ruoyi.production.mapper.ProcessRouteMapper; import com.ruoyi.production.mapper.ProductOrderMapper; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.*; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; @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; @Autowired private ProcessRouteItemService processRouteItemService; @Autowired private ProductWorkOrderService productWorkOrderService; @Autowired private ProductBomService productBomService; @Autowired private ProductProcessRouteService productProcessRouteService; @Autowired private ProductProcessRouteItemService productProcessRouteItemService; @Autowired private ProductOrderService productOrderService; @Autowired private ProductProcessService productProcessService; @Override public IPage pageProcessRouteDto(Page page, ProcessRouteDto processRouteDto) { return processRouteMapper.pageProcessRouteDto(page, processRouteDto); } @Override public Integer saveProcessRoute(ProcessRoute processRoute) { this.save(processRoute); String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); String idStr = String.format("%06d", processRoute.getId()); String newProductCode = "GYLX" + dateStr + idStr; // 更新数据库中的productCode processRoute.setProcessRouteCode(newProductCode); return processRouteMapper.updateById(processRoute); } @Override public int batchDelete(List ids) { //先判断是否已经引用了 List productOrders = productOrderMapper.selectList(Wrappers.lambdaQuery().in(ProductOrder::getRouteId, ids)); if (productOrders.size() > 0) { throw new RuntimeException("该工艺路线生产已引用,不能删除"); } //删除工艺路线详情 processRouteItemMapper.delete(Wrappers.lambdaQuery().in(ProcessRouteItem::getRouteId, ids)); return processRouteMapper.deleteBatchIds(ids); } /** * 工艺路线反向新增 新增了bom bom子表 工艺路线 工艺路线子表 生产工艺路线主表 生产工艺路线子表 工单表 * * @param processRouteAnticlockwiseDtos 工艺子表 * @param productModelId 成品规格型号id * @param productOrderId 生产订单id * @return */ @Transactional(rollbackFor = Exception.class) @Override public Long processRouteAnticlockwise(List processRouteAnticlockwiseDtos, Long productModelId, Long productOrderId) { ProductOrder byId = productOrderService.getById(productOrderId); // 1. 新增BOM ProductBom productBom = createProductBom(productModelId); // 2. 新增BOM子表 List productStructures = buildProductStructures(processRouteAnticlockwiseDtos, productBom.getId()); productStructureService.saveBatch(productStructures); // 3. 新增工艺路线 ProcessRoute processRoute = createProcessRoute(productModelId, productBom.getId()); // 4. 新增工艺路线子表 List processRouteItems = buildProcessRouteItems(processRouteAnticlockwiseDtos, processRoute.getId(), productModelId); processRouteItemService.saveBatch(processRouteItems); // 5. 新增生产工艺路线 ProductProcessRoute productProcessRoute = createProductProcessRoute(productModelId, productOrderId, productBom.getId(), processRoute.getProcessRouteCode()); // 6. 新增生产工艺路线子表 buildProductProcessRouteItems(processRouteAnticlockwiseDtos, productProcessRoute.getId(), productModelId,productOrderId); return processRoute.getId(); } /** * 创建产品BOM */ private ProductBom createProductBom(Long productModelId) { ProductBom productBom = new ProductBom(); productBom.setProductModelId(productModelId); productBom.setVersion("1.0.0"); productBomService.save(productBom); productBom.setBomNo("BM." + String.format("%05d", productBom.getId())); productBomService.updateById(productBom); return productBom; } /** * 构建产品结构列表 */ private List buildProductStructures(List dtos, Integer bomId) { List structures = new ArrayList<>(dtos.size()); for (ProcessRouteAnticlockwiseDto dto : dtos) { ProductStructure structure = new ProductStructure(); structure.setProductModelId(dto.getProductModelId()); structure.setProcessId(dto.getProcessId()); structure.setUnitQuantity(new BigDecimal(1)); structure.setProcessRouteOpenNum(dto.getProcessRouteOpenNum()); structure.setProcessRouteNum(dto.getProcessRouteNum()); structure.setProcessRouteAddNum(dto.getProcessRouteAddNum()); structure.setProcessRouteRequire(dto.getProcessRouteRequire()); structure.setBomId(bomId); structure.setProcessRouteName(dto.getProcessRouteName()); structures.add(structure); } return structures; } /** * 创建工艺路线 */ private ProcessRoute createProcessRoute(Long productModelId, Integer bomId) { ProcessRoute processRoute = new ProcessRoute(); processRoute.setProductModelId(productModelId); processRoute.setBomId(bomId); processRoute.setDescription(""); this.save(processRoute); processRoute.setProcessRouteCode("GYLX." + String.format("%05d", processRoute.getId())); this.updateById(processRoute); return processRoute; } /** * 构建工艺路线子项列表 */ private List buildProcessRouteItems(List dtos, Long routeId, Long productModelId) { List items = new ArrayList<>(dtos.size()); Integer num = 0; for (ProcessRouteAnticlockwiseDto dto : dtos) { ProcessRouteItem item = new ProcessRouteItem(); item.setRouteId(routeId); item.setProcessId(dto.getProcessId()); item.setProductModelId(productModelId); item.setProcessRouteName(dto.getProcessRouteName()); item.setProcessRouteOpenNum(dto.getProcessRouteOpenNum()); item.setProcessRouteNum(dto.getProcessRouteNum()); item.setProcessRouteAddNum(dto.getProcessRouteAddNum()); item.setProcessRouteRequire(dto.getProcessRouteRequire()); item.setDragSort(num++); items.add(item); } return items; } /** * 创建生产工艺路线 */ private ProductProcessRoute createProductProcessRoute(Long productModelId, Long productOrderId, Integer bomId, String processRouteCode) { ProductProcessRoute productProcessRoute = new ProductProcessRoute(); productProcessRoute.setProductModelId(productModelId); productProcessRoute.setProductOrderId(productOrderId); productProcessRoute.setBomId(bomId); productProcessRoute.setProcessRouteCode(processRouteCode); productProcessRouteService.save(productProcessRoute); return productProcessRoute; } /** * 构建生产工艺路线子项列表 */ private void buildProductProcessRouteItems(List dtos, Long productRouteId, Long productModelId,Long productOrderId) { ProductOrder byId = productOrderService.getById(productOrderId); Integer num = 0; for (ProcessRouteAnticlockwiseDto dto : dtos) { ProductProcessRouteItem item = new ProductProcessRouteItem(); item.setProductRouteId(productRouteId); item.setProcessId(dto.getProcessId()); if (num >= dtos.size()-1) { item.setProductModelId(productModelId); }else { item.setProductModelId(dto.getProductModelId()); } item.setProcessRouteName(dto.getProcessRouteName()); item.setProcessRouteOpenNum(dto.getProcessRouteOpenNum()); item.setProcessRouteNum(dto.getProcessRouteNum()); item.setProcessRouteAddNum(dto.getProcessRouteAddNum()); item.setProcessRouteRequire(dto.getProcessRouteRequire()); item.setDragSort(num++); item.setUuid(dto.getUuid()); productProcessRouteItemService.save(item); ProductProcess productProcess = productProcessService.getById(item.getProcessId()); //同步新增生产工单 ProductWorkOrder productWorkOrder = new ProductWorkOrder(); productWorkOrder.setProductProcessRouteItemId(item.getId()); productWorkOrder.setProductOrderId(productOrderId); productWorkOrder.setPlanQuantity(new BigDecimal(dto.getProcessRouteNum())); productWorkOrder.setDeviceId(dto.getDeviceId()); productWorkOrder.setUserIds(dto.getUserIds()); productWorkOrder.setUserNames(dto.getUserNames()); productWorkOrder.setWorkOrderNo(productWorkOrderService.generateProductWorkOrder( productProcess.getName(), byId.getNpsNo())); productWorkOrder.setStatus(1); productWorkOrderService.save(productWorkOrder); } } }