出入库单按规则生成;

This commit is contained in:
王奎兴
2026-08-08 18:36:36 +08:00
parent 296176c85e
commit 5e65d63a4f
4 changed files with 170 additions and 21 deletions
@@ -8,6 +8,7 @@ import com.mhd.common.core.exception.ServiceException;
import com.mhd.common.core.utils.OrderSequence; import com.mhd.common.core.utils.OrderSequence;
import com.mhd.common.core.utils.StringUtils; import com.mhd.common.core.utils.StringUtils;
import com.mhd.common.core.utils.bean.BeanUtils; import com.mhd.common.core.utils.bean.BeanUtils;
import com.mhd.common.core.web.domain.AjaxResult;
import com.mhd.common.security.utils.SecurityUtils; import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.oms.domain.businessDeliveryDetailsLink.entity.BusinessDeliveryDetailsLink; import com.mhd.oms.domain.businessDeliveryDetailsLink.entity.BusinessDeliveryDetailsLink;
import com.mhd.oms.domain.businessDeliveryDetailsLink.repository.facade.IBusinessDeliveryDetailsLinkService; import com.mhd.oms.domain.businessDeliveryDetailsLink.repository.facade.IBusinessDeliveryDetailsLinkService;
@@ -38,6 +39,8 @@ import com.mhd.oms.domain.reservationInventoryAdjustmentRecord.repository.mapper
import com.mhd.oms.domain.reservationMaterialInventory.entity.ReservationMaterialInventory; import com.mhd.oms.domain.reservationMaterialInventory.entity.ReservationMaterialInventory;
import com.mhd.oms.domain.reservationMaterialInventory.repository.mapper.ReservationMaterialInventoryMapper; import com.mhd.oms.domain.reservationMaterialInventory.repository.mapper.ReservationMaterialInventoryMapper;
import com.mhd.oms.domain.reservationStockInOrder.repository.mapper.ReservationStockInOrderMapper; import com.mhd.oms.domain.reservationStockInOrder.repository.mapper.ReservationStockInOrderMapper;
import com.mhd.oms.domain.reserveStockInOrder.repository.mapper.ReserveStockInOrderMapper;
import com.mhd.oms.domain.reserveStockOutOrder.repository.mapper.ReserveStockOutOrderMapper;
import com.mhd.system.api.SystemServiceFeign; import com.mhd.system.api.SystemServiceFeign;
import com.mhd.system.api.WmsServiceFeign; import com.mhd.system.api.WmsServiceFeign;
import com.mhd.system.api.domain.*; import com.mhd.system.api.domain.*;
@@ -50,6 +53,7 @@ import org.springframework.util.CollectionUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -96,6 +100,8 @@ public class ExecutionStockOutOrderDomainService {
private ReservationMaterialInventoryMapper reservationMaterialInventoryMapper; private ReservationMaterialInventoryMapper reservationMaterialInventoryMapper;
@Autowired @Autowired
private ReservationStockInOrderMapper stockInOrderMapper; private ReservationStockInOrderMapper stockInOrderMapper;
@Autowired
private ReserveStockOutOrderMapper reserveStockOutOrderMapper;
/** /**
* 分页查询出库单列表 * 分页查询出库单列表
*/ */
@@ -103,14 +109,74 @@ public class ExecutionStockOutOrderDomainService {
return stockOutOrderService.queryList(stockOutOrderDO); return stockOutOrderService.queryList(stockOutOrderDO);
} }
/**
* 从单号列表中提取最大序号
* 单号格式: prefix + 数字序号(如 RK260807001 中 prefix=RK260807, 序号=001
* 即使中间有删单,也能保证序号递增不重复
*
* @param orderNumbers 匹配的单号列表
* @param prefixLength 前缀长度(序号从该位置开始截取)
* @return 最大序号值,列表为空时返回0
*/
private int extractMaxSequenceNumber(List<String> orderNumbers, int prefixLength) {
if (orderNumbers == null || orderNumbers.isEmpty()) {
return 0;
}
int maxSeq = 0;
for (String orderNumber : orderNumbers) {
if (orderNumber != null && orderNumber.length() > prefixLength) {
try {
String seqStr = orderNumber.substring(prefixLength);
int seq = Integer.parseInt(seqStr);
if (seq > maxSeq) {
maxSeq = seq;
}
} catch (NumberFormatException e) {
// 序号部分非数字,跳过
}
}
}
return maxSeq;
}
/** /**
* 新增出库单 * 新增出库单
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean insert(ExecutionStockOutOrderDO stockOutOrderDO) { public Boolean insert(ExecutionStockOutOrderDO stockOutOrderDO) {
if (stockOutOrderDO.getOutOrderNumber() == null) { //设置单号
stockOutOrderDO.setOutOrderNumber(OrderSequence.getOrderCode("CK")); Long warehouseId = stockOutOrderDO.getWarehouseId();
AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(warehouseId);
if (!"200".equals(String.valueOf(ajaxResult.get("code")))) {
throw new ServiceException("获取仓库信息失败");
}
//仓库信息
WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class);
String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule();
String prefix = warehouseFeignPO.getOutOrderNoPrefix();
if ("yang_pin_chu_ku".equals(stockOutOrderDO.getBusinessType())) {
prefix = warehouseFeignPO.getSampleOutOrderNoPrefix();
}
if (prefix == null || prefix.isEmpty()) {
prefix = "CK";
}
Long organizationId = stockOutOrderDO.getOrganizationId();
Long warehouseIdForCount = stockOutOrderDO.getWarehouseId();
if (orderNoGenerateRule != null && "0".equals(orderNoGenerateRule)) {
//日期累加: 前缀 + 当前日期yymmdd + 当天最大序号+1
String dateStr = new SimpleDateFormat("yyMMdd").format(new Date());
String datePrefix = prefix + dateStr;
List<String> orderNumbers = reserveStockOutOrderMapper.getMaxStockOutOrderByPrefixAndOrgAndWarehouse(datePrefix, organizationId, warehouseIdForCount);
int maxSeq = extractMaxSequenceNumber(orderNumbers, datePrefix.length());
String seq = String.format("%03d", maxSeq + 1);
stockOutOrderDO.setOutOrderNumber(datePrefix + seq);
stockOutOrderDO.setBusinessOrderNo(datePrefix + seq);
} else {
//历史累加: 前缀 + 历史最大序号+1
List<String> orderNumbers = reserveStockOutOrderMapper.getMaxStockOutOrderByPrefixAndOrgAndWarehouse(prefix, organizationId, warehouseIdForCount);
int maxSeq = extractMaxSequenceNumber(orderNumbers, prefix.length());
String seq = String.format("%03d", maxSeq + 1);
stockOutOrderDO.setOutOrderNumber(prefix + seq);
stockOutOrderDO.setBusinessOrderNo(prefix + seq);
} }
// 与 update / batchInsert 一致:前端传计划数量为 quantity,非 outboundQuantity // 与 update / batchInsert 一致:前端传计划数量为 quantity,非 outboundQuantity
setMaterialDetailInfo(stockOutOrderDO); setMaterialDetailInfo(stockOutOrderDO);
@@ -147,8 +213,40 @@ public class ExecutionStockOutOrderDomainService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean batchInsert(List<ExecutionStockOutOrderDO> stockOutOrderDOList) { public Boolean batchInsert(List<ExecutionStockOutOrderDO> stockOutOrderDOList) {
for (ExecutionStockOutOrderDO stockOutOrderDO : stockOutOrderDOList){ for (ExecutionStockOutOrderDO stockOutOrderDO : stockOutOrderDOList){
if (StringUtils.isBlank(stockOutOrderDO.getOutOrderNumber())){ //设置单号
stockOutOrderDO.setOutOrderNumber(OrderSequence.getOrderCode("CK")); Long warehouseId = stockOutOrderDO.getWarehouseId();
AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(warehouseId);
if (!"200".equals(String.valueOf(ajaxResult.get("code")))) {
throw new ServiceException("获取仓库信息失败");
}
//仓库信息
WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class);
String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule();
String prefix = warehouseFeignPO.getOutOrderNoPrefix();
if ("yang_pin_chu_ku".equals(stockOutOrderDO.getBusinessType())) {
prefix = warehouseFeignPO.getSampleOutOrderNoPrefix();
}
if (prefix == null || prefix.isEmpty()) {
prefix = "CK";
}
Long organizationId = stockOutOrderDO.getOrganizationId();
Long warehouseIdForCount = stockOutOrderDO.getWarehouseId();
if (orderNoGenerateRule != null && "0".equals(orderNoGenerateRule)) {
//日期累加: 前缀 + 当前日期yymmdd + 当天最大序号+1
String dateStr = new SimpleDateFormat("yyMMdd").format(new Date());
String datePrefix = prefix + dateStr;
List<String> orderNumbers = reserveStockOutOrderMapper.getMaxStockOutOrderByPrefixAndOrgAndWarehouse(datePrefix, organizationId, warehouseIdForCount);
int maxSeq = extractMaxSequenceNumber(orderNumbers, datePrefix.length());
String seq = String.format("%03d", maxSeq + 1);
stockOutOrderDO.setOutOrderNumber(datePrefix + seq);
stockOutOrderDO.setBusinessOrderNo(datePrefix + seq);
} else {
//历史累加: 前缀 + 历史最大序号+1
List<String> orderNumbers = reserveStockOutOrderMapper.getMaxStockOutOrderByPrefixAndOrgAndWarehouse(prefix, organizationId, warehouseIdForCount);
int maxSeq = extractMaxSequenceNumber(orderNumbers, prefix.length());
String seq = String.format("%03d", maxSeq + 1);
stockOutOrderDO.setOutOrderNumber(prefix + seq);
stockOutOrderDO.setBusinessOrderNo(prefix + seq);
} }
//设置物料信息 //设置物料信息
setMaterialDetailInfo(stockOutOrderDO); setMaterialDetailInfo(stockOutOrderDO);
@@ -167,9 +167,12 @@ public class ReservationStockOutOrderDomainService {
//仓库信息 //仓库信息
WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class); WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class);
String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule(); String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule();
String prefix = warehouseFeignPO.getInOrderNoPrefix(); String prefix = warehouseFeignPO.getOutOrderNoPrefix();
if ("yang_pin_chu_ku".equals(stockOutOrderDO.getBusinessType())) {
prefix = warehouseFeignPO.getSampleOutOrderNoPrefix();
}
if (prefix == null || prefix.isEmpty()) { if (prefix == null || prefix.isEmpty()) {
prefix = "RK"; prefix = "CK";
} }
Long organizationId = stockOutOrderDO.getOrganizationId(); Long organizationId = stockOutOrderDO.getOrganizationId();
Long warehouseIdForCount = stockOutOrderDO.getWarehouseId(); Long warehouseIdForCount = stockOutOrderDO.getWarehouseId();
@@ -241,9 +244,12 @@ public class ReservationStockOutOrderDomainService {
//仓库信息 //仓库信息
WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class); WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class);
String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule(); String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule();
String prefix = warehouseFeignPO.getInOrderNoPrefix(); String prefix = warehouseFeignPO.getOutOrderNoPrefix();
if ("yang_pin_chu_ku".equals(stockOutOrderDO.getBusinessType())) {
prefix = warehouseFeignPO.getSampleOutOrderNoPrefix();
}
if (prefix == null || prefix.isEmpty()) { if (prefix == null || prefix.isEmpty()) {
prefix = "RK"; prefix = "CK";
} }
Long organizationId = stockOutOrderDO.getOrganizationId(); Long organizationId = stockOutOrderDO.getOrganizationId();
Long warehouseIdForCount = stockOutOrderDO.getWarehouseId(); Long warehouseIdForCount = stockOutOrderDO.getWarehouseId();
@@ -498,9 +504,12 @@ public class ReservationStockOutOrderDomainService {
//仓库信息 //仓库信息
WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class); WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class);
String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule(); String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule();
String prefix = warehouseFeignPO.getInOrderNoPrefix(); String prefix = warehouseFeignPO.getOutOrderNoPrefix();
if ("yang_pin_chu_ku".equals(stockOutOrderDO.getBusinessType())) {
prefix = warehouseFeignPO.getSampleOutOrderNoPrefix();
}
if (prefix == null || prefix.isEmpty()) { if (prefix == null || prefix.isEmpty()) {
prefix = "RK"; prefix = "CK";
} }
Long organizationId = stockOutOrderDO.getOrganizationId(); Long organizationId = stockOutOrderDO.getOrganizationId();
Long warehouseIdForCount = stockOutOrderDO.getWarehouseId(); Long warehouseIdForCount = stockOutOrderDO.getWarehouseId();
@@ -660,9 +669,12 @@ public class ReservationStockOutOrderDomainService {
//仓库信息 //仓库信息
WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class); WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class);
String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule(); String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule();
String prefix = warehouseFeignPO.getInOrderNoPrefix(); String prefix = warehouseFeignPO.getOutOrderNoPrefix();
if ("yang_pin_chu_ku".equals(stockOutOrderDO.getBusinessType())) {
prefix = warehouseFeignPO.getSampleOutOrderNoPrefix();
}
if (prefix == null || prefix.isEmpty()) { if (prefix == null || prefix.isEmpty()) {
prefix = "RK"; prefix = "CK";
} }
Long organizationId = stockOutOrderDO.getOrganizationId(); Long organizationId = stockOutOrderDO.getOrganizationId();
Long warehouseIdForCount = stockOutOrderDO.getWarehouseId(); Long warehouseIdForCount = stockOutOrderDO.getWarehouseId();
@@ -133,9 +133,12 @@ public class ReserveStockOutOrderDomainService {
//仓库信息 //仓库信息
WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class); WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class);
String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule(); String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule();
String prefix = warehouseFeignPO.getInOrderNoPrefix(); String prefix = warehouseFeignPO.getOutOrderNoPrefix();
if ("yang_pin_chu_ku".equals(stockOutOrderDO.getBusinessType())) {
prefix = warehouseFeignPO.getSampleOutOrderNoPrefix();
}
if (prefix == null || prefix.isEmpty()) { if (prefix == null || prefix.isEmpty()) {
prefix = "RK"; prefix = "CK";
} }
Long organizationId = stockOutOrderDO.getOrganizationId(); Long organizationId = stockOutOrderDO.getOrganizationId();
Long warehouseIdForCount = stockOutOrderDO.getWarehouseId(); Long warehouseIdForCount = stockOutOrderDO.getWarehouseId();
@@ -194,9 +197,12 @@ public class ReserveStockOutOrderDomainService {
//仓库信息 //仓库信息
WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class); WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class);
String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule(); String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule();
String prefix = warehouseFeignPO.getInOrderNoPrefix(); String prefix = warehouseFeignPO.getOutOrderNoPrefix();
if ("yang_pin_chu_ku".equals(stockOutOrderDO.getBusinessType())) {
prefix = warehouseFeignPO.getSampleOutOrderNoPrefix();
}
if (prefix == null || prefix.isEmpty()) { if (prefix == null || prefix.isEmpty()) {
prefix = "RK"; prefix = "CK";
} }
Long organizationId = stockOutOrderDO.getOrganizationId(); Long organizationId = stockOutOrderDO.getOrganizationId();
Long warehouseIdForCount = stockOutOrderDO.getWarehouseId(); Long warehouseIdForCount = stockOutOrderDO.getWarehouseId();
@@ -248,9 +248,12 @@ public class StockOutOrderDomainService {
//仓库信息 //仓库信息
WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class); WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class);
String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule(); String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule();
String prefix = warehouseFeignPO.getInOrderNoPrefix(); String prefix = warehouseFeignPO.getOutOrderNoPrefix();
if ("yang_pin_chu_ku".equals(stockOutOrderDO.getBusinessType())) {
prefix = warehouseFeignPO.getSampleOutOrderNoPrefix();
}
if (prefix == null || prefix.isEmpty()) { if (prefix == null || prefix.isEmpty()) {
prefix = "RK"; prefix = "CK";
} }
Long organizationId = stockOutOrderDO.getOrganizationId(); Long organizationId = stockOutOrderDO.getOrganizationId();
Long warehouseIdForCount = stockOutOrderDO.getWarehouseId(); Long warehouseIdForCount = stockOutOrderDO.getWarehouseId();
@@ -297,8 +300,38 @@ public class StockOutOrderDomainService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean batchInsert(List<StockOutOrderDO> stockOutOrderDOList) { public Boolean batchInsert(List<StockOutOrderDO> stockOutOrderDOList) {
for (StockOutOrderDO stockOutOrderDO : stockOutOrderDOList){ for (StockOutOrderDO stockOutOrderDO : stockOutOrderDOList){
if (StringUtils.isBlank(stockOutOrderDO.getOutOrderNumber())){ //设置单号
stockOutOrderDO.setOutOrderNumber(OrderSequence.getOrderCode("CK")); Long warehouseId = stockOutOrderDO.getWarehouseId();
AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(warehouseId);
if (!"200".equals(String.valueOf(ajaxResult.get("code")))) {
throw new ServiceException("获取仓库信息失败");
}
//仓库信息
WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class);
String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule();
String prefix = warehouseFeignPO.getOutOrderNoPrefix();
if ("yang_pin_chu_ku".equals(stockOutOrderDO.getBusinessType())) {
prefix = warehouseFeignPO.getSampleOutOrderNoPrefix();
}
if (prefix == null || prefix.isEmpty()) {
prefix = "CK";
}
Long organizationId = stockOutOrderDO.getOrganizationId();
Long warehouseIdForCount = stockOutOrderDO.getWarehouseId();
if (orderNoGenerateRule != null && "0".equals(orderNoGenerateRule)) {
//日期累加: 前缀 + 当前日期yymmdd + 当天最大序号+1
String dateStr = new SimpleDateFormat("yyMMdd").format(new Date());
String datePrefix = prefix + dateStr;
List<String> orderNumbers = stockOutOrderMapper.getMaxStockOutOrderByPrefixAndOrgAndWarehouse(datePrefix, organizationId, warehouseIdForCount);
int maxSeq = extractMaxSequenceNumber(orderNumbers, datePrefix.length());
String seq = String.format("%03d", maxSeq + 1);
stockOutOrderDO.setOutOrderNumber(datePrefix + seq);
} else {
//历史累加: 前缀 + 历史最大序号+1
List<String> orderNumbers = stockOutOrderMapper.getMaxStockOutOrderByPrefixAndOrgAndWarehouse(prefix, organizationId, warehouseIdForCount);
int maxSeq = extractMaxSequenceNumber(orderNumbers, prefix.length());
String seq = String.format("%03d", maxSeq + 1);
stockOutOrderDO.setOutOrderNumber(prefix + seq);
} }
//设置物料信息 //设置物料信息
setMaterialDetailInfo(stockOutOrderDO); setMaterialDetailInfo(stockOutOrderDO);