From ca1c7d27e81d590f5e48b4102d18898b85d5d2fa Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期二, 07 四月 2026 13:32:08 +0800
Subject: [PATCH] feat:采购/库存入库添加批号
---
src/main/resources/mapper/production/ProductWorkOrderMapper.xml | 1
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java | 62 ++++++++++++++++++--
src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java | 2
src/main/java/com/ruoyi/production/controller/ProductOrderController.java | 9 +--
src/main/java/com/ruoyi/production/dto/ProductOrderDto.java | 3 +
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java | 13 ++--
src/main/java/com/ruoyi/production/service/ProductOrderService.java | 3
src/main/resources/application-dev.yml | 45 +++++++++------
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java | 5 +
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java | 3
src/main/java/com/ruoyi/production/pojo/ProductOrder.java | 3
src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java | 3 +
12 files changed, 108 insertions(+), 44 deletions(-)
diff --git a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
index 7f6ef39..119f5fc 100644
--- a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
+++ b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -126,12 +126,15 @@
* @param recordType
* @param recordId
*/
- public void substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId) {
+ public void substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId,String batchNo) {
StockInventoryDto stockInventoryDto = new StockInventoryDto();
stockInventoryDto.setRecordId(recordId);
stockInventoryDto.setRecordType(String.valueOf(recordType));
stockInventoryDto.setQualitity(quantity);
stockInventoryDto.setProductModelId(productModelId);
+ if (batchNo !=null && !batchNo.isEmpty()) {
+ stockInventoryDto.setBatchNo(batchNo);
+ }
stockInventoryService.subtractStockInventory(stockInventoryDto);
}
diff --git a/src/main/java/com/ruoyi/production/controller/ProductOrderController.java b/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
index e1c22d1..14baf04 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
@@ -1,13 +1,11 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProductOrderDto;
-import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.pojo.ProductOrder;
import com.ruoyi.production.service.ProductOrderService;
import io.swagger.annotations.Api;
@@ -16,7 +14,6 @@
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
-import java.math.BigDecimal;
import java.util.List;
@RequestMapping("productOrder")
@@ -65,9 +62,9 @@
@ApiOperation("鏂板鐢熶骇璁㈠崟")
- @PostMapping("addProductOrder")
- public R addProductOrder(@RequestBody ProductOrder productOrder) {
- return R.ok(productOrderService.addProductOrder(productOrder));
+ @PostMapping("/addProductOrder")
+ public R addProductOrder(@RequestBody ProductOrderDto productOrderDto) {
+ return R.ok(productOrderService.addProductOrder(productOrderDto));
}
@ApiOperation("鍒犻櫎鐢熶骇璁㈠崟")
diff --git a/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java b/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
index a9fedcc..c61d252 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
@@ -62,4 +62,7 @@
//鏄惁鍙戣揣(鍙拌处椤甸潰棰滆壊鎺у埗)
private Boolean isFh;
+
+ @ApiModelProperty(value = "鍨嬪彿")
+ private String productModelName;
}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java b/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
index 3108a30..5518c27 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
@@ -83,4 +83,7 @@
// 涓嶅悎鏍煎鐞嗙粨鏋�
@ApiModelProperty(value = "涓嶅悎鏍煎鐞嗙粨鏋�")
private String dealResult;
+
+ @ApiModelProperty(value = "鐢熶骇鎵瑰彿")
+ private String batchNo;
}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductOrder.java b/src/main/java/com/ruoyi/production/pojo/ProductOrder.java
index 12340b7..8963f24 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductOrder.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductOrder.java
@@ -3,7 +3,6 @@
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
-import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
@@ -52,7 +51,7 @@
private String priority;
/**
- * 浼樺厛绾�
+ * 鐢熶骇鎵瑰彿
*/
@ApiModelProperty(value = "鐢熶骇鎵瑰彿")
private String batchNo;
diff --git a/src/main/java/com/ruoyi/production/service/ProductOrderService.java b/src/main/java/com/ruoyi/production/service/ProductOrderService.java
index 5a714a6..2fb06bd 100644
--- a/src/main/java/com/ruoyi/production/service/ProductOrderService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductOrderService.java
@@ -3,7 +3,6 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
-import com.ruoyi.production.dto.ProductBomDto;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.pojo.ProcessRoute;
@@ -22,7 +21,7 @@
List<ProductStructureDto> listProcessBom(Long orderId);
- Boolean addProductOrder(ProductOrder productOrder);
+ Boolean addProductOrder(ProductOrderDto productOrderDto);
Boolean delete(Long[] id);
}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
index 77c2e06..84311a8 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -7,8 +7,7 @@
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.common.utils.bean.BeanUtils;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.production.dto.ProductStructureDto;
@@ -16,7 +15,8 @@
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.ProductOrderService;
import com.ruoyi.quality.mapper.QualityInspectMapper;
-import com.ruoyi.quality.pojo.QualityInspect;
+import com.ruoyi.stock.mapper.StockInventoryMapper;
+import com.ruoyi.stock.pojo.StockInventory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -24,6 +24,8 @@
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
@Service
@@ -64,6 +66,9 @@
@Autowired
private StockUtils stockUtils;
+
+ @Autowired
+ private StockInventoryMapper stockInventoryMapper;
@Override
public IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder) {
@@ -135,10 +140,33 @@
}
@Override
- public Boolean addProductOrder(ProductOrder productOrder) {
+ public Boolean addProductOrder(ProductOrderDto productOrderDto) {
String string = generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
+ ProductOrder productOrder = new ProductOrder();
+ BeanUtils.copyProperties(productOrderDto, productOrder);
productOrder.setNpsNo(string);
productOrder.setCompleteQuantity(BigDecimal.ZERO);
+ List<StockInventory> stockInventoryList = stockInventoryMapper.selectList(null);
+ if (productOrder.getBatchNo() == null || productOrder.getBatchNo().isEmpty()) {
+ String batchNo;
+ // 鑾峰彇褰撳墠鏈堜唤锛堜袱浣嶏級
+ LocalDate now = LocalDate.now();
+ String monthFlag = now.format(DateTimeFormatter.ofPattern("MM"));
+
+ // 鑾峰彇褰撳墠鏈堜唤鐨勬渶澶ф祦姘村彿
+ int maxSeq = getCurrentMonthMaxSeq(productOrderDto.getMaterialCode(),
+ productOrderDto.getProductModelName(), monthFlag, stockInventoryList);
+
+ // 鏂版祦姘村彿 = 鏈�澶ф祦姘村彿 + 1
+ int newSeq = maxSeq + 1;
+ String seqStr = String.format("%03d", newSeq);
+
+ // 缁勮batchNo
+ batchNo = productOrderDto.getMaterialCode() + productOrderDto.getProductModelName() + "P" + monthFlag + seqStr;
+ productOrder.setBatchNo(batchNo);
+ } else {
+ productOrder.setBatchNo(productOrder.getBatchNo());
+ }
this.save(productOrder);
if (ObjectUtils.isNotEmpty(productOrder.getRouteId())) {
this.bindingRoute(productOrder);
@@ -146,16 +174,38 @@
return true;
}
+ /**
+ * 鏌ヨ褰撳墠鏈堜唤宸插瓨鍦ㄧ殑鏈�澶ф祦姘村彿
+ */
+ private static int getCurrentMonthMaxSeq(String materialCode, String model, String monthFlag, List<StockInventory> existingList) {
+ int maxSeq = 0;
+ String prefix = materialCode + model + "P" + monthFlag;
+ // 姝e垯鍖归厤锛氬墠缂� + 3浣嶆暟瀛�
+ Pattern pattern = Pattern.compile(Pattern.quote(prefix) + "(\\d{3})");
+ for (StockInventory item : existingList) {
+ String batchNo = item.getBatchNo();
+ if (batchNo == null) continue;
+ Matcher matcher = pattern.matcher(batchNo);
+ if (matcher.find()) {
+ int seq = Integer.parseInt(matcher.group(1));
+ if (seq > maxSeq) {
+ maxSeq = seq;
+ }
+ }
+ }
+ return maxSeq;
+ }
+
@Override
public Boolean delete(Long[] ids) {
//濡傛灉宸茬粡寮�濮嬬敓浜�,涓嶈兘鍒犻櫎
//鏌ヨ鐢熶骇璁㈠崟涓嬬殑宸ュ崟
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("鐢熶骇璁㈠崟宸茬粡寮�濮嬬敓浜�,涓嶈兘鍒犻櫎");
}
//鍒犻櫎宸ュ崟
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index 3722729..ec3d367 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -13,8 +13,8 @@
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.procurementrecord.utils.StockUtils;
@@ -32,14 +32,14 @@
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.ruoyi.production.mapper.ProductionProductMainMapper;
import java.math.BigDecimal;
-import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
import java.util.stream.Collectors;
@Service
@@ -177,7 +177,7 @@
productionProductMainMapper.insert(productionProductMain);
/*鏂板鎶ュ伐鎶曞叆琛�*/
List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcessRoute.getBomId(), productProcess.getId());
- if (productStructureDtos.size() == 0) {
+ if (productStructureDtos.isEmpty()) {
//濡傛灉璇ュ伐搴忔病鏈変骇鍝佺粨鏋勭殑鎶曞叆鍝�,閭h繖涓姇鍏ュ搧鍜屼骇鍑哄搧鏄悓涓�涓�
ProductStructureDto productStructureDto = new ProductStructureDto();
productStructureDto.setProductModelId(productProcessRouteItem.getProductModelId());
@@ -191,8 +191,7 @@
productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
productionProductInput.setProductMainId(productionProductMain.getId());
productionProductInputMapper.insert(productionProductInput);
- stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId());
-
+ stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId(),dto.getBatchNo());
}
/*鏂板鎶ュ伐浜у嚭琛�*/
ProductionProductOutput productionProductOutput = new ProductionProductOutput();
diff --git a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
index df94a16..a39cb72 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -66,7 +66,7 @@
//鎵e噺搴撳瓨
if(!"宸插彂璐�".equals(byId.getStatus())){
SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(byId.getSalesLedgerProductId());
- stockUtils.substractStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
+ stockUtils.substractStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId(),null);
}
byId.setExpressNumber(req.getExpressNumber());
byId.setExpressCompany(req.getExpressCompany());
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
index 0e66a5c..0073fdb 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -250,7 +250,8 @@
stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
stockOutRecordDto.setType("0");
stockOutRecordService.add(stockOutRecordDto);
- StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()));
+ StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId())
+ .eq(StockInventory::getBatchNo, stockInventoryDto.getBatchNo()));
if (ObjectUtils.isEmpty(oldStockInventory)) {
throw new RuntimeException("浜у搧搴撳瓨涓嶅瓨鍦�");
}
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index ff56f9d..aa7941b 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -28,7 +28,7 @@
# 寮�鍙戠幆澧冮厤缃�
server:
# 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
- port: 7003
+ port: 8888
servlet:
# 搴旂敤鐨勮闂矾寰�
context-path: /
@@ -42,13 +42,6 @@
max: 800
# Tomcat鍚姩鍒濆鍖栫殑绾跨▼鏁帮紝榛樿鍊�10
min-spare: 100
-
-# 鏃ュ織閰嶇疆
-logging:
- level:
- org.quartz: DEBUG
- com.ruoyi: warn
- org.springframework: warn
minio:
endpoint: http://114.132.189.42/
@@ -74,8 +67,10 @@
druid:
# 涓诲簱鏁版嵁婧�
master:
- url: jdbc:mysql://localhost:3306/product-inventory-management-new?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+# url: jdbc:mysql://1.15.17.182:9999/product-inventory-management-new?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+ url: jdbc:mysql://localhost:3307/product-inventory-management-pcdz?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
+# password: xd@123456..
password: 123456
# 浠庡簱鏁版嵁婧�
slave:
@@ -154,7 +149,7 @@
database: 0
# 瀵嗙爜
# password: root2022!
- password:
+ password: 123456
# 杩炴帴瓒呮椂鏃堕棿
timeout: 10s
@@ -205,16 +200,30 @@
# MyBatis Plus閰嶇疆
mybatis-plus:
- # 鎼滅储鎸囧畾鍖呭埆鍚� 鏍规嵁鑷繁鐨勯」鐩潵
- typeAliasesPackage: com.ruoyi.**.pojo
- # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
- mapperLocations: classpath*:mapper/**/*Mapper.xml
- # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
- configLocation: classpath:mybatis/mybatis-config.xml
+ configuration:
+ log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+ map-underscore-to-camel-case: true
+ type-aliases-package: com.ruoyi.**.pojo
+ mapper-locations: classpath*:mapper/**/*Mapper.xml
global-config:
- enable-sql-runner: true
+ banner: false
db-config:
id-type: auto
+
+# 鏃ュ織閰嶇疆
+logging:
+ level:
+ root: INFO
+ com.ruoyi.production.mapper: DEBUG
+ org.apache.ibatis: DEBUG
+ org.mybatis: DEBUG
+ java.sql: DEBUG
+ java.sql.Connection: DEBUG
+ java.sql.Statement: DEBUG
+ java.sql.PreparedStatement: DEBUG
+ java.sql.ResultSet: DEBUG
+ com.baomidou.mybatisplus: DEBUG
+ com.baomidou.mybatisplus.core: DEBUG
# PageHelper鍒嗛〉鎻掍欢
pagehelper:
@@ -253,4 +262,4 @@
file:
temp-dir: D:/ruoyi/temp/uploads # 涓存椂鐩綍
- upload-dir: D:/ruoyi/prod/uploads # 姝e紡鐩綍
\ No newline at end of file
+ upload-dir: D:/ruoyi/prod/uploads # 姝e紡鐩綍
diff --git a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
index 417f029..60aa635 100644
--- a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -21,6 +21,7 @@
<select id="pageProductWorkOrder" resultType="com.ruoyi.production.dto.ProductWorkOrderDto">
SELECT
pwo.*,
+ po.batch_no as batchNo,
pp.id as processId,
pp.NAME as processName,
pp.qualified_rate as processQualifiedRate,
--
Gitblit v1.9.3