src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -9,6 +9,8 @@ import com.ruoyi.production.pojo.*; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.sales.dto.InvoiceRegistrationProductDto; import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper; import com.ruoyi.sales.mapper.SalesLedgerMapper; @@ -42,6 +44,7 @@ public class SalesLedgerProductServiceImpl extends ServiceImpl<SalesLedgerProductMapper, SalesLedgerProduct> implements ISalesLedgerProductService { private SalesLedgerProductMapper salesLedgerProductMapper; private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper; private SalesLedgerMapper salesLedgerMapper; @@ -59,6 +62,10 @@ private ProductProcessRouteMapper productProcessRouteMapper; private ProductWorkOrderMapper productWorkOrderMapper; private ProductionProductMainMapper productionProductMainMapper; private ProductionProductOutputMapper productionProductOutputMapper; private ProductionProductInputMapper productionProductInputMapper; private QualityInspectMapper qualityInspectMapper; @Override public SalesLedgerProduct selectSalesLedgerProductById(Long id) { @@ -192,6 +199,54 @@ Long salesLedgerId = salesLedgerProduct.getSalesLedgerId(); if (salesLedgerProduct.getId() == null) { result = salesLedgerProductMapper.insert(salesLedgerProduct); addProductionData(salesLedgerProduct); } else { //查询原本的产品型号id salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity()); result = salesLedgerProductMapper.updateById(salesLedgerProduct); /*删除对应的生产数据并重新新增*/ deleteProductionData(Arrays.asList(salesLedgerProduct.getId())); // 删除生产核算数据 LambdaQueryWrapper<SalesLedgerProductionAccounting> reportWrapper = new LambdaQueryWrapper<>(); reportWrapper.in(SalesLedgerProductionAccounting::getSalesLedgerId, salesLedgerId); salesLedgerProductionAccountingMapper.delete(reportWrapper); addProductionData(salesLedgerProduct); } // 如果插入或更新成功,并且有 salesLedgerId,才继续更新主表金额 if (result > 0 && salesLedgerId != null) { // 查询该主表下的所有子表数据 LambdaQueryWrapper<SalesLedgerProduct> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId) .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType()); List<SalesLedgerProduct> productList = salesLedgerProductMapper.selectList(wrapper); if (salesLedgerProduct.getType() == 1) { // 调用通用方法更新主表金额 updateMainContractAmount( salesLedgerId, productList, SalesLedgerProduct::getTaxInclusiveTotalPrice, salesLedgerMapper, SalesLedger.class ); } else { // 调用通用方法更新主表金额 updateMainContractAmount( salesLedgerId, productList, SalesLedgerProduct::getTaxInclusiveTotalPrice, purchaseLedgerMapper, PurchaseLedger.class ); } } return result; } /** * 新增生产数据 */ public void addProductionData(SalesLedgerProduct salesLedgerProduct) { ProductOrder productOrder = new ProductOrder(); productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId()); productOrder.setProductModelId(salesLedgerProduct.getId()); @@ -200,10 +255,11 @@ productOrder.setCompleteQuantity(BigDecimal.ZERO);//完成数量 productOrderMapper.insert(productOrder); ProcessRoute processRoute = processRouteMapper.selectList(new QueryWrapper<ProcessRoute>().lambda() List<ProcessRoute> processRoutes = processRouteMapper.selectList(new QueryWrapper<ProcessRoute>().lambda() .eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()) .orderByDesc(ProcessRoute::getCreateTime)).get(0); if (ObjectUtils.isNotNull(processRoute)) { .orderByDesc(ProcessRoute::getCreateTime)); if (processRoutes.size()>0){ ProcessRoute processRoute = processRoutes.get(0); //新增生产订单工艺路线主表 ProductProcessRoute productProcessRoute = new ProductProcessRoute(); productProcessRoute.setProductModelId(processRoute.getProductModelId()); @@ -259,39 +315,90 @@ productOrder.setRouteId(processRoute.getId()); productOrderMapper.updateById(productOrder); } } else { salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity()); result = salesLedgerProductMapper.updateById(salesLedgerProduct); } // 如果插入或更新成功,并且有 salesLedgerId,才继续更新主表金额 if (result > 0 && salesLedgerId != null) { // 查询该主表下的所有子表数据 LambdaQueryWrapper<SalesLedgerProduct> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId) .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType()); List<SalesLedgerProduct> productList = salesLedgerProductMapper.selectList(wrapper); if (salesLedgerProduct.getType() == 1) { // 调用通用方法更新主表金额 updateMainContractAmount( salesLedgerId, productList, SalesLedgerProduct::getTaxInclusiveTotalPrice, salesLedgerMapper, SalesLedger.class /** * 删除生产数据 */ public void deleteProductionData(List<Long> productIds) { //批量查询productOrder List<ProductOrder> productOrders = productOrderMapper.selectList( new LambdaQueryWrapper<ProductOrder>() .in(ProductOrder::getProductModelId, productIds) ); } else { // 调用通用方法更新主表金额 updateMainContractAmount( salesLedgerId, productList, SalesLedgerProduct::getTaxInclusiveTotalPrice, purchaseLedgerMapper, PurchaseLedger.class if (!org.springframework.util.CollectionUtils.isEmpty(productOrders)) { List<Long> orderIds = productOrders.stream() .map(ProductOrder::getId) .collect(Collectors.toList()); // 批量查询processRouteItems List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList( new LambdaQueryWrapper<ProductProcessRouteItem>() .in(ProductProcessRouteItem::getProductOrderId, orderIds) ); if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(allRouteItems)) { // 获取要删除的工序项ID List<Long> routeItemIds = allRouteItems.stream() .map(ProductProcessRouteItem::getId) .collect(Collectors.toList()); // 查询关联的工单ID List<ProductWorkOrder> workOrders = productWorkOrderMapper.selectList( new LambdaQueryWrapper<ProductWorkOrder>() .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds) ); if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(workOrders)) { List<Long> workOrderIds = workOrders.stream() .map(ProductWorkOrder::getId) .collect(Collectors.toList()); // 查询关联的生产主表ID List<ProductionProductMain> productMains = productionProductMainMapper.selectList( new LambdaQueryWrapper<ProductionProductMain>() .in(ProductionProductMain::getWorkOrderId, workOrderIds) ); List<Long> productMainIds = productMains.stream() .map(ProductionProductMain::getId) .collect(Collectors.toList()); // 删除产出表、投入表数据 if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(productMainIds)) { productionProductOutputMapper.deleteByProductMainIds(productMainIds); productionProductInputMapper.deleteByProductMainIds(productMainIds); List<QualityInspect> qualityInspects = qualityInspectMapper.selectList( new LambdaQueryWrapper<QualityInspect>() .in(QualityInspect::getProductMainId, productMainIds) ); qualityInspects.forEach(qualityInspect -> { //inspectState=1 已提交 不能删除 if (qualityInspect.getInspectState() == 1) { throw new RuntimeException("已提交的检验单不能删除"); } }); qualityInspectMapper.deleteByProductMainIds(productMainIds); } // 删除生产主表数据 productionProductMainMapper.deleteByWorkOrderIds(workOrderIds); // 删除工单数据 productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>() .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds)); } } return result; // 批量删除processRouteItem productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>() .in(ProductProcessRouteItem::getProductOrderId, orderIds)); // 批量删除productProcessRoute productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>() .in(ProductProcessRoute::getProductOrderId, orderIds)); // 批量删除productOrder productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>() .in(ProductOrder::getProductModelId, productIds)); } } /** src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -32,6 +32,7 @@ import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.mapper.*; import com.ruoyi.sales.pojo.*; import com.ruoyi.sales.service.ISalesLedgerProductService; import com.ruoyi.sales.service.ISalesLedgerService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -77,6 +78,7 @@ private final CustomerMapper customerMapper; private final SalesLedgerProductMapper salesLedgerProductMapper; private final SalesLedgerProductServiceImpl salesLedgerProductServiceImpl; private final CommonFileMapper commonFileMapper; @@ -393,86 +395,8 @@ List<Long> productIds = products.stream() .map(SalesLedgerProduct::getId) .collect(Collectors.toList()); //批量查询productOrder List<ProductOrder> productOrders = productOrderMapper.selectList( new LambdaQueryWrapper<ProductOrder>() .in(ProductOrder::getProductModelId, productIds) ); if (!org.springframework.util.CollectionUtils.isEmpty(productOrders)) { List<Long> orderIds = productOrders.stream() .map(ProductOrder::getId) .collect(Collectors.toList()); // 批量查询processRouteItems List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList( new LambdaQueryWrapper<ProductProcessRouteItem>() .in(ProductProcessRouteItem::getProductOrderId, orderIds) ); if (!CollectionUtils.isEmpty(allRouteItems)) { // 获取要删除的工序项ID List<Long> routeItemIds = allRouteItems.stream() .map(ProductProcessRouteItem::getId) .collect(Collectors.toList()); // 查询关联的工单ID List<ProductWorkOrder> workOrders = productWorkOrderMapper.selectList( new LambdaQueryWrapper<ProductWorkOrder>() .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds) ); if (!CollectionUtils.isEmpty(workOrders)) { List<Long> workOrderIds = workOrders.stream() .map(ProductWorkOrder::getId) .collect(Collectors.toList()); // 查询关联的生产主表ID List<ProductionProductMain> productMains = productionProductMainMapper.selectList( new LambdaQueryWrapper<ProductionProductMain>() .in(ProductionProductMain::getWorkOrderId, workOrderIds) ); List<Long> productMainIds = productMains.stream() .map(ProductionProductMain::getId) .collect(Collectors.toList()); // 删除产出表、投入表数据 if (!CollectionUtils.isEmpty(productMainIds)) { productionProductOutputMapper.deleteByProductMainIds(productMainIds); productionProductInputMapper.deleteByProductMainIds(productMainIds); List<QualityInspect> qualityInspects = qualityInspectMapper.selectList( new LambdaQueryWrapper<QualityInspect>() .in(QualityInspect::getProductMainId, productMainIds) ); qualityInspects.forEach(qualityInspect -> { //inspectState=1 已提交 不能删除 if(qualityInspect.getInspectState() == 1){ throw new RuntimeException("已提交的检验单不能删除"); } }); qualityInspectMapper.deleteByProductMainIds(productMainIds); } // 删除生产主表数据 productionProductMainMapper.deleteByWorkOrderIds(workOrderIds); // 删除工单数据 productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>() .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds)); } } // 批量删除processRouteItem productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>() .in(ProductProcessRouteItem::getProductOrderId, orderIds)); // 批量删除productProcessRoute productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>() .in(ProductProcessRoute::getProductOrderId, orderIds)); // 批量删除productOrder productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>() .in(ProductOrder::getProductModelId, productIds)); } //删除生产数据 salesLedgerProductServiceImpl.deleteProductionData(productIds); // 批量删除产品子表 if (!productIds.isEmpty()) { @@ -512,7 +436,7 @@ LambdaQueryWrapper<SalesLedgerWork> workOrderWrapper = new LambdaQueryWrapper<>(); workOrderWrapper.in(SalesLedgerWork::getSalesLedgerId, idList); salesLedgerWorkMapper.delete(workOrderWrapper); // 删除生产报工数据 // 删除生产核算数据 LambdaQueryWrapper<SalesLedgerProductionAccounting> reportWrapper = new LambdaQueryWrapper<>(); reportWrapper.in(SalesLedgerProductionAccounting::getSalesLedgerId, idList); salesLedgerProductionAccountingMapper.delete(reportWrapper); @@ -693,73 +617,8 @@ salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity()); salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice()); salesLedgerProductMapper.insert(salesLedgerProduct); ProductOrder productOrder = new ProductOrder(); productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId()); productOrder.setProductModelId(salesLedgerProduct.getId()); productOrder.setNpsNo("SC" + String.format("%08d", salesLedgerProduct.getId())); productOrder.setQuantity(salesLedgerProduct.getQuantity());//需求数量 productOrder.setCompleteQuantity(BigDecimal.ZERO);//完成数量 productOrderMapper.insert(productOrder); ProcessRoute processRoute = processRouteMapper.selectList(new QueryWrapper<ProcessRoute>().lambda() .eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()) .orderByDesc(ProcessRoute::getCreateTime)).get(0); if (ObjectUtils.isNotNull(processRoute)) { //新增生产订单工艺路线主表 ProductProcessRoute productProcessRoute = new ProductProcessRoute(); productProcessRoute.setProductModelId(processRoute.getProductModelId()); productProcessRoute.setProcessRouteCode(processRoute.getProcessRouteCode()); productProcessRoute.setProductOrderId(productOrder.getId()); productProcessRoute.setBomId(processRoute.getBomId()); productProcessRouteMapper.insert(productProcessRoute); //新增生产订单工艺路线子表 List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId())); // 生成当前日期的前缀:年月日 String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); for (ProcessRouteItem processRouteItem : processRouteItems) { ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem(); productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId()); productProcessRouteItem.setProcessId(processRouteItem.getProcessId()); productProcessRouteItem.setProductOrderId(productOrder.getId()); productProcessRouteItem.setProductRouteId(productProcessRoute.getId()); productProcessRouteItem.setDragSort(processRouteItem.getDragSort()); int insert = productProcessRouteItemMapper.insert(productProcessRouteItem); if (insert > 0) { // 查询今日已存在的最大工单号 QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>(); queryWrapper.likeRight("work_order_no", datePrefix) .orderByDesc("work_order_no") .last("LIMIT 1"); ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper); int sequenceNumber = 1; // 默认序号 if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) { String lastNo = lastWorkOrder.getWorkOrderNo().toString(); if (lastNo.startsWith(datePrefix)) { String seqStr = lastNo.substring(datePrefix.length()); try { sequenceNumber = Integer.parseInt(seqStr) + 1; } catch (NumberFormatException e) { sequenceNumber = 1; } } } // 生成完整的工单号 String workOrderNoStr = String.format("%s%03d", datePrefix, sequenceNumber); ProductWorkOrder productWorkOrder = new ProductWorkOrder(); productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity()); productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId()); productWorkOrder.setProductOrderId(productOrder.getId()); productWorkOrder.setWorkOrderNo(workOrderNoStr); productWorkOrder.setStatus(1); productWorkOrderMapper.insert(productWorkOrder); } } productOrder.setRouteId(processRoute.getId()); productOrderMapper.updateById(productOrder); } // 添加生产数据 salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct); } } }