pom.xml
@@ -39,7 +39,7 @@ <tomcat.version>9.0.102</tomcat.version> <minio.version>8.4.3</minio.version> <okhttp.version>4.9.0</okhttp.version> <hutool.version>5.8.18</hutool.version> <hutool.version>5.8.38</hutool.version> <logback.version>1.2.13</logback.version> <spring-security.version>5.7.12</spring-security.version> <spring-framework.version>5.3.39</spring-framework.version> @@ -325,7 +325,11 @@ <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency> <dependency> <groupId>com.belerweb</groupId> <artifactId>pinyin4j</artifactId> <version>2.5.1</version> </dependency> </dependencies> <build> src/main/java/com/ruoyi/common/utils/StringUtils.java
@@ -6,6 +6,9 @@ import java.util.List; import java.util.Map; import java.util.Set; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.pinyin.PinyinUtil; import org.springframework.util.AntPathMatcher; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.text.StrFormatter; @@ -726,4 +729,36 @@ // 用空格补齐 return String.format("%-" + length + "s", str); } public static boolean containsChinese(String str) { if (str == null) return false; for (char c : str.toCharArray()) { if (Character.UnicodeScript.of(c) == Character.UnicodeScript.HAN) { return true; } } return false; } public static String getProcessNo(String processName) { if (StrUtil.isBlank(processName)) { return ""; } // 判断是否包含中文 if (StringUtils.containsChinese(processName)) { // 中文:拼音首字母 return StrUtil.toUpperCase(PinyinUtil.getFirstLetter(processName, "")); } else { // 英文:取大写字母 目前工序名称没有英文的形式 只能处理ExxxBxxx StringBuilder sb = new StringBuilder(); for (char c : processName.toCharArray()) { if (Character.isUpperCase(c)) { sb.append(c); } } return sb.toString(); } } } src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java
@@ -18,4 +18,13 @@ void down(HttpServletResponse response, ProductWorkOrder productWorkOrder); ProductWorkOrderDto getProductWorkOrderById(@NotNull Long id); /** * 自动生成生产工单号 * @param datePrefix yyyyMMdd 来获取当日的数量 * @param processName 工序名称 * @param npsNo 生产订单号 * @return String */ String generateProductWorkOrder(String datePrefix, String processName,String npsNo); } src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -7,16 +7,16 @@ 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.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.production.dto.ProductOrderDto; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.ProductOrderService; import com.ruoyi.production.service.ProductProcessService; import com.ruoyi.production.service.ProductWorkOrderService; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.pojo.QualityInspect; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -24,44 +24,37 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Service @RequiredArgsConstructor public class ProductOrderServiceImpl extends ServiceImpl<ProductOrderMapper, ProductOrder> implements ProductOrderService { private final ProductWorkOrderService productWorkOrderService; private final ProductProcessService productProcessService; @Autowired private ProductOrderMapper productOrderMapper; @Autowired private ProcessRouteMapper processRouteMapper; @Autowired private ProductProcessRouteMapper productProcessRouteMapper; @Autowired private ProcessRouteItemMapper processRouteItemMapper; @Autowired private ProductProcessRouteItemMapper productProcessRouteItemMapper; @Autowired private ProductWorkOrderMapper productWorkOrderMapper; @Autowired private ProductionProductMainMapper productionProductMainMapper; @Autowired private ProductionProductOutputMapper productionProductOutputMapper; @Autowired private ProductionProductInputMapper productionProductInputMapper; @Autowired private QualityInspectMapper qualityInspectMapper; @Autowired private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper; @Autowired private StockUtils stockUtils; @@ -82,8 +75,12 @@ productProcessRouteMapper.insert(productProcessRoute); //新增生产订单下的工艺路线子表 List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId())); Map<Long, ProductProcess> productProcessMap = productProcessService .list(new LambdaQueryWrapper<ProductProcess>().in(ProductProcess::getId, processRouteItems.stream().map(ProcessRouteItem::getProcessId).collect(Collectors.toList()))) .stream() .collect(Collectors.toMap(ProductProcess::getId, productProcess -> productProcess)); // 生成当前日期的前缀:年月日 String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); for (ProcessRouteItem processRouteItem : processRouteItems) { ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem(); productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId()); @@ -93,28 +90,13 @@ productProcessRouteItem.setDragSort(processRouteItem.getDragSort()); int insert = productProcessRouteItemMapper.insert(productProcessRouteItem); if (insert > 0) { // 查询今日已存在的最大工单号 ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix); 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 = "GD" + String.format("%s%03d", datePrefix, sequenceNumber); ProductWorkOrder productWorkOrder = new ProductWorkOrder(); productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId()); productWorkOrder.setProductOrderId(productOrder.getId()); ProductOrder order = productOrderMapper.selectById(productOrder.getId()); productWorkOrder.setPlanQuantity(order.getQuantity()); productWorkOrder.setWorkOrderNo(workOrderNoStr); productWorkOrder.setWorkOrderNo(productWorkOrderService.generateProductWorkOrder(null, productProcessMap.getOrDefault(productProcessRouteItem.getProcessId(), new ProductProcess()).getName(), productOrder.getNpsNo())); productWorkOrder.setStatus(1); productWorkOrderMapper.insert(productWorkOrder); } @@ -149,11 +131,11 @@ //如果已经开始生产,不能删除 //查询生产订单下的工单 List<ProductWorkOrder> productWorkOrders = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery().in(ProductWorkOrder::getProductOrderId, ids)); if (productWorkOrders.size()>0){ if (productWorkOrders.size() > 0) { //判断是否有报工数据 List<ProductionProductMain> productionProductMains = productionProductMainMapper.selectList(Wrappers.<ProductionProductMain>lambdaQuery() .in(ProductionProductMain::getWorkOrderId, productWorkOrders.stream().map(ProductWorkOrder::getId).collect(Collectors.toList()))); if (productionProductMains.size()>0){ if (productionProductMains.size() > 0) { throw new RuntimeException("生产订单已经开始生产,不能删除"); } //删除工单 @@ -184,8 +166,16 @@ } public String generateNextOrderNo(String datePrefix) { String maxOrderNo = getMaxOrderNoByDate(datePrefix); return "SC" + datePrefix + formatOrderSequence(datePrefix); } public String generateNextOrderByContractNo(String datePrefix, String contractNo) { return contractNo + formatOrderSequence(datePrefix); } private String formatOrderSequence(String datePrefix) { int sequence = 1; // 默认起始序号 String maxOrderNo = getMaxOrderNoByDate(datePrefix); if (maxOrderNo != null && !maxOrderNo.isEmpty()) { // 提取流水号部分(假设格式为 SC + 日期 + 流水号) String sequenceStr = maxOrderNo.substring(("SC" + datePrefix).length()); @@ -196,9 +186,7 @@ sequence = 1; } } // 生成新订单号 return "SC" + datePrefix + String.format("%04d", sequence); return String.format("%04d", sequence); } } src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
@@ -10,6 +10,8 @@ import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.ProductProcessRouteItemService; import com.ruoyi.production.service.ProductProcessService; import com.ruoyi.production.service.ProductWorkOrderService; import com.ruoyi.production.service.ProductionProductMainService; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.pojo.QualityInspect; @@ -51,6 +53,9 @@ private ProductOrderMapper productOrderMapper; private final ProductWorkOrderService productWorkOrderService; private final ProductProcessService productProcessService; @Override @@ -131,31 +136,16 @@ @Override public R addRouteItem(ProductProcessRouteItem productProcessRouteItem) { ProductOrder productOrder = productOrderMapper.selectById(productProcessRouteItem.getProductOrderId()); ProductProcess productProcess = productProcessService.getById(productProcessRouteItem.getProcessId()); int insert = productProcessRouteItemMapper.insert(productProcessRouteItem); // 生成当前日期的前缀:年月日 String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); if (insert > 0) { // 查询今日已存在的最大工单号 ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix); 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 = "GD" +String.format("%s%03d", datePrefix, sequenceNumber); ProductWorkOrder productWorkOrder = new ProductWorkOrder(); productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId()); productWorkOrder.setProductOrderId(productProcessRouteItem.getProductOrderId()); productWorkOrder.setPlanQuantity(productOrder.getQuantity()); productWorkOrder.setWorkOrderNo(workOrderNoStr); productWorkOrder.setWorkOrderNo(productWorkOrderService.generateProductWorkOrder(null,productProcess.getName(),productOrder.getNpsNo())); productWorkOrder.setStatus(1); productWorkOrderMapper.insert(productWorkOrder); } src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
@@ -1,6 +1,9 @@ package com.ruoyi.production.service.impl; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.pinyin.PinyinUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -10,6 +13,7 @@ import com.deepoove.poi.data.PictureRenderData; import com.deepoove.poi.data.Pictures; import com.ruoyi.common.utils.MatrixToImageWriter; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.production.dto.ProductWorkOrderDto; import com.ruoyi.production.mapper.ProductWorkOrderFileMapper; import com.ruoyi.production.mapper.ProductWorkOrderMapper; @@ -25,6 +29,8 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -35,7 +41,7 @@ public class ProductWorkOrderServiceImpl extends ServiceImpl<ProductWorkOrderMapper, ProductWorkOrder> implements ProductWorkOrderService { @Autowired private ProductWorkOrderMapper productWorkOrdermapper; private ProductWorkOrderMapper productWorkOrderMapper; @Autowired private ProductWorkOrderFileMapper productWorkOrderFileMapper; @@ -44,17 +50,17 @@ @Override public IPage<ProductWorkOrderDto> listPage(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) { return productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder); return productWorkOrderMapper.pageProductWorkOrder(page, productWorkOrder); } @Override public int updateProductWorkOrder(ProductWorkOrderDto productWorkOrderDto) { return productWorkOrdermapper.updateById(productWorkOrderDto); return productWorkOrderMapper.updateById(productWorkOrderDto); } @Override public void down(HttpServletResponse response, ProductWorkOrder productWorkOrder) { ProductWorkOrderDto productWorkOrderDto = productWorkOrdermapper.getProductWorkOrderFlowCard(productWorkOrder.getId()); ProductWorkOrderDto productWorkOrderDto = productWorkOrderMapper.getProductWorkOrderFlowCard(productWorkOrder.getId()); String codePath; try { codePath = new MatrixToImageWriter().code(productWorkOrderDto.getId().toString(), tempDir); @@ -112,8 +118,29 @@ @Override public ProductWorkOrderDto getProductWorkOrderById(Long id) { return productWorkOrdermapper.getProductWorkOrderFlowCard(id); return productWorkOrderMapper.getProductWorkOrderFlowCard(id); } @Override public String generateProductWorkOrder(String datePrefix,String processName, String npsNo) { datePrefix = StrUtil.isBlank(datePrefix) ? LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) : datePrefix; processName = StrUtil.isBlank(processName) ? "未知" : processName; Assert.notNull(npsNo, "生产订单号编号不能为空"); ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix); 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 processPinyin = StringUtils.getProcessNo(processName); return StrUtil.format("{}{}{}",processPinyin,npsNo,String.format("%03d", sequenceNumber)); } } src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -1,6 +1,7 @@ package com.ruoyi.quality.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; @@ -19,6 +20,8 @@ import com.ruoyi.production.mapper.ProductionProductMainMapper; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.ProductOrderService; import com.ruoyi.production.service.ProductProcessService; import com.ruoyi.production.service.ProductWorkOrderService; import com.ruoyi.quality.mapper.QualityUnqualifiedMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityUnqualified; @@ -33,12 +36,15 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @AllArgsConstructor @Service public class QualityUnqualifiedServiceImpl extends ServiceImpl<QualityUnqualifiedMapper, QualityUnqualified> implements IQualityUnqualifiedService { private final StockUtils stockUtils; private final ProductWorkOrderService productWorkOrderService; private QualityUnqualifiedMapper qualityUnqualifiedMapper; private IQualityInspectService qualityInspectService; private ProductOrderService productOrderService; @@ -47,6 +53,7 @@ private ProductProcessRouteItemMapper productProcessRouteItemMapper; private ProductWorkOrderMapper productWorkOrderMapper; private StockUninventoryService stockUninventoryService; private final ProductProcessService productProcessService; @Override public IPage<QualityUnqualified> qualityUnqualifiedListPage(Page page, QualityUnqualified qualityUnqualified) { @@ -89,8 +96,12 @@ productProcessRouteMapper.insert(newProcessRoute); //新增生产订单下的工艺路线子表 List<ProductProcessRouteItem> processRouteItems = productProcessRouteItemMapper.selectList(new QueryWrapper<ProductProcessRouteItem>().lambda().eq(ProductProcessRouteItem::getProductRouteId, productProcessRoute.getId())); // 生成当前日期的前缀:年月日 String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); Map<Long, ProductProcess> productProcessMap = productProcessService .list(new LambdaQueryWrapper<ProductProcess>().in(ProductProcess::getId, processRouteItems.stream().map(ProductProcessRouteItem::getProcessId).collect(Collectors.toList()))) .stream() .collect(Collectors.toMap(ProductProcess::getId, productProcess -> productProcess)); for (ProductProcessRouteItem processRouteItem : processRouteItems) { ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem(); BeanUtils.copyProperties(processRouteItem, productProcessRouteItem); @@ -98,27 +109,11 @@ productProcessRouteItem.setProductRouteId(newProcessRoute.getId()); int insert = productProcessRouteItemMapper.insert(productProcessRouteItem); if (insert > 0) { // 查询今日已存在的最大工单号 ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix); 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 = "FG" + String.format("%s%03d", datePrefix, sequenceNumber); ProductWorkOrder productWorkOrder = new ProductWorkOrder(); productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId()); productWorkOrder.setProductOrderId(order.getId()); productWorkOrder.setPlanQuantity(order.getQuantity()); productWorkOrder.setWorkOrderNo(workOrderNoStr); productWorkOrder.setWorkOrderNo("FG"+productWorkOrderService.generateProductWorkOrder(null, productProcessMap.getOrDefault(productProcessRouteItem.getProcessId(), new ProductProcess()).getName(), productOrder.getNpsNo())); productWorkOrder.setStatus(1); productWorkOrderMapper.insert(productWorkOrder); } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -6,13 +6,15 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.framework.web.domain.R; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.ProductProcessService; import com.ruoyi.production.service.ProductWorkOrderService; import com.ruoyi.production.service.impl.ProductOrderServiceImpl; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; @@ -56,24 +58,18 @@ @AllArgsConstructor public class SalesLedgerProductServiceImpl extends ServiceImpl<SalesLedgerProductMapper, SalesLedgerProduct> implements ISalesLedgerProductService { private final ProductWorkOrderService productWorkOrderService; private final ProductProcessService productProcessService; private SalesLedgerProductMapper salesLedgerProductMapper; private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper; private SalesLedgerMapper salesLedgerMapper; private PurchaseLedgerMapper purchaseLedgerMapper; private ProductOrderMapper productOrderMapper; private ProcessRouteItemMapper processRouteItemMapper; private ProductProcessRouteItemMapper productProcessRouteItemMapper; private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper; private ProcessRouteMapper processRouteMapper; private ProductProcessRouteMapper productProcessRouteMapper; private ProductWorkOrderMapper productWorkOrderMapper; private ProductionProductMainMapper productionProductMainMapper; private ProductionProductOutputMapper productionProductOutputMapper; @@ -81,11 +77,7 @@ private QualityInspectMapper qualityInspectMapper; private ShippingInfoMapper shippingInfoMapper; private ShippingInfoServiceImpl shippingInfoService; private StockUtils stockUtils; @Autowired private ProductStructureMapper productStructureMapper; @Autowired @@ -104,14 +96,14 @@ // queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerProduct.getSalesLedgerId()) // .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType()); List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectSalesLedgerProductList(salesLedgerProduct); if(!CollectionUtils.isEmpty(salesLedgerProducts)){ if (!CollectionUtils.isEmpty(salesLedgerProducts)) { salesLedgerProducts.forEach(item -> { // 发货信息 ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>() .eq(ShippingInfo::getSalesLedgerProductId, item.getId()) .orderByDesc(ShippingInfo::getCreateTime) .last("limit 1")); if(shippingInfo != null){ if (shippingInfo != null) { item.setShippingDate(shippingInfo.getShippingDate()); item.setShippingCarNumber(shippingInfo.getShippingCarNumber()); item.setShippingStatus(shippingInfo.getStatus()); @@ -131,8 +123,8 @@ BigDecimal noInvoiceNum = BigDecimal.ZERO; BigDecimal noInvoiceAmount = BigDecimal.ZERO; for (InvoiceRegistrationProductDto registrationProductDto : invoiceRegistrationProductDtoList) { if(ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()){ invoiceNum = invoiceNum.add(registrationProductDto.getInvoiceNum()); if (ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()) { invoiceNum = invoiceNum.add(registrationProductDto.getInvoiceNum()); invoiceAmount = invoiceAmount.add(registrationProductDto.getInvoiceAmount()); } } @@ -166,7 +158,7 @@ //删除发货信息 List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>() .in(ShippingInfo::getSalesLedgerProductId, Arrays.asList(ids))); if(!CollectionUtils.isEmpty(shippingInfos)){ if (!CollectionUtils.isEmpty(shippingInfos)) { shippingInfoService.delete(shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList())); } @@ -203,12 +195,12 @@ @Transactional(rollbackFor = Exception.class) public int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct) { // 待回款,付款 if(salesLedgerProduct.getType().equals(1)){ if (salesLedgerProduct.getType().equals(1)) { salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getInvoiceTotal())); //未开票数量+金额 salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity()); salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice()); }else{ } else { salesLedgerProduct.setPendingTicketsTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getTicketsTotal())); // 未来票数量+金额 salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity()); @@ -266,11 +258,14 @@ * 新增生产数据 */ public void addProductionData(SalesLedgerProduct salesLedgerProduct) { SalesLedger salesLedger = salesLedgerMapper.selectById(salesLedgerProduct.getSalesLedgerId()); ProductOrder productOrder = new ProductOrder(); productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId()); productOrder.setProductModelId(salesLedgerProduct.getProductModelId()); productOrder.setSaleLedgerProductId(salesLedgerProduct.getId()); String string = productOrderServiceImpl.generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))); String string = productOrderServiceImpl.generateNextOrderByContractNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")), salesLedger.getSalesContractNo()); productOrder.setNpsNo(string); productOrder.setQuantity(salesLedgerProduct.getQuantity());//需求数量 productOrder.setCompleteQuantity(BigDecimal.ZERO);//完成数量 @@ -279,7 +274,7 @@ List<ProcessRoute> processRoutes = processRouteMapper.selectList(new QueryWrapper<ProcessRoute>().lambda() .eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()) .orderByDesc(ProcessRoute::getCreateTime)); if (processRoutes.size()>0){ if (processRoutes.size() > 0) { ProcessRoute processRoute = processRoutes.get(0); //新增生产订单工艺路线主表 ProductProcessRoute productProcessRoute = new ProductProcessRoute(); @@ -290,8 +285,12 @@ 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")); Map<Long, ProductProcess> productProcessMap = productProcessService .list(new LambdaQueryWrapper<ProductProcess>().in(ProductProcess::getId, processRouteItems.stream().map(ProcessRouteItem::getProcessId).collect(Collectors.toList()))) .stream() .collect(Collectors.toMap(ProductProcess::getId, productProcess -> productProcess)); for (ProcessRouteItem processRouteItem : processRouteItems) { ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem(); productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId()); @@ -301,27 +300,11 @@ productProcessRouteItem.setDragSort(processRouteItem.getDragSort()); int insert = productProcessRouteItemMapper.insert(productProcessRouteItem); if (insert > 0) { // 查询今日已存在的最大工单号 ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix); 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 ="GD"+ String.format("%s%03d", datePrefix, sequenceNumber); ProductWorkOrder productWorkOrder = new ProductWorkOrder(); productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId()); productWorkOrder.setProductOrderId(productOrder.getId()); productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity()); productWorkOrder.setWorkOrderNo(workOrderNoStr); productWorkOrder.setWorkOrderNo(productWorkOrderService.generateProductWorkOrder(null, productProcessMap.getOrDefault(productProcessRouteItem.getProcessId(),new ProductProcess()).getName(), productOrder.getNpsNo())); productWorkOrder.setStatus(1); productWorkOrderMapper.insert(productWorkOrder); @@ -431,9 +414,9 @@ IPage<SalesLedgerProductDto> salesLedgerProductDtoIPage = salesLedgerProductMapper.listPage(page, salesLedgerProduct); salesLedgerProductDtoIPage.getRecords().forEach(item -> { // 判断状态 if(item.getTaxInclusiveTotalPrice().compareTo(item.getInvoiceTotal()) == 0){ if (item.getTaxInclusiveTotalPrice().compareTo(item.getInvoiceTotal()) == 0) { item.setStatusName("已完成付款"); }else{ } else { item.setStatusName("未完成付款"); } }); @@ -445,9 +428,9 @@ IPage<SalesLedgerProductDto> salesLedgerProductDtoIPage = salesLedgerProductMapper.listPagePurchaseLedger(page, salesLedgerProduct); salesLedgerProductDtoIPage.getRecords().forEach(item -> { // 判断状态 if(item.getTaxInclusiveTotalPrice().compareTo(item.getTicketsTotal()) == 0){ if (item.getTaxInclusiveTotalPrice().compareTo(item.getTicketsTotal()) == 0) { item.setStatusName("已完成付款"); }else{ } else { item.setStatusName("未完成付款"); } }); @@ -488,6 +471,7 @@ throw new RuntimeException("动态更新主表金额失败", e); } } @Override public R judgmentInventory(SalesLedgerProduct salesLedgerProduct) { //获取产品最新的工艺路线 @@ -495,7 +479,7 @@ if (processRoute == null) { return R.fail("请先设置工艺路线"); } List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomId(processRoute.getBomId(),false); List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomId(processRoute.getBomId(), false); if (productStructureDtos.isEmpty()) { return R.fail("请先设置产品结构"); } @@ -506,7 +490,7 @@ //所需数量 BigDecimal multiply = salesLedgerProduct.getQuantity().multiply(productStructureDto.getUnitQuantity()); BigDecimal subtract =stockInventory.getQualitity().subtract(stockInventory.getLockedQuantity()).subtract(multiply).divide(BigDecimal.ONE, 2, RoundingMode.CEILING); BigDecimal subtract = stockInventory.getQualitity().subtract(stockInventory.getLockedQuantity()).subtract(multiply).divide(BigDecimal.ONE, 2, RoundingMode.CEILING); if (subtract.compareTo(BigDecimal.ZERO) <= 0) { count++; stringBuffer.append(productStructureDto.getProductName()) @@ -517,9 +501,9 @@ .append(System.lineSeparator()); } } if (count>0) { if (count > 0) { return R.fail(stringBuffer.toString()); }else { } else { return R.ok(); } } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -664,12 +664,13 @@ @Override @Transactional(rollbackFor = Exception.class) public int addOrUpdateSalesLedger(SalesLedgerDto salesLedgerDto) { try { // 1. 校验客户信息 CustomerPrivatePoolDto customer = customerPrivatePoolMapper.selectInfo(salesLedgerDto.getCustomerId()); if (customer == null) { throw new BaseException("客户不存在"); } // 必须填写销售合同号 // Assert.notNull(salesLedgerDto.getSalesContractNo(), "销售合同号不能为空"); // 2. DTO转Entity SalesLedger salesLedger = convertToEntity(salesLedgerDto); @@ -677,10 +678,12 @@ salesLedger.setTenantId(customer.getTenantId()); // 3. 新增或更新主表 if (salesLedger.getId() == null) { String contractNo = generateSalesContractNoBy8Date(); // 为空 自动生成 String contractNo =StrUtil.isBlank(salesLedgerDto.getSalesContractNo())? generateSalesContractNoBy8Date():salesLedgerDto.getSalesContractNo(); salesLedger.setSalesContractNo(contractNo); salesLedgerMapper.insert(salesLedger); } else { salesLedger.setSalesContractNo(null); salesLedgerMapper.updateById(salesLedger); } @@ -696,6 +699,7 @@ SalesLedger.class ); } try { // 5. 迁移临时文件到正式目录 if (salesLedgerDto.getTempFileIds() != null && !salesLedgerDto.getTempFileIds().isEmpty()) {