@ -47,13 +47,57 @@ public class BoxForNotificationServiceImpl implements BoxForNotificationService
@Override
public String newSoReceiveBoxesData ( SoReceiveBoxesData inData ) {
TransNoControl transNo = transNoService . getTransNo ( inData . getSite ( ) , "BOX" , inData . getBuNo ( ) ) ;
if ( transNo = = null ) {
throw new RuntimeException ( "箱号生成失败,请联系管理员!" ) ;
/ / 生成箱号 : 销售订单号 + 三位流水号 , 支持断号取号
String saleOrderNo = inData . getSaleOrderNo ( ) ;
if ( saleOrderNo = = null | | saleOrderNo . isEmpty ( ) ) {
throw new RuntimeException ( "销售订单号不能为空!" ) ;
}
inData . setBoxNo ( transNo . getNewTransNo ( ) ) ;
/ / 查询以该销售订单号为前缀的所有箱号 ( 用于断号取号 )
List < String > existingBoxNos = boxForNotificationMapper . getExistingBoxNosBySaleOrderNo (
inData . getSite ( ) , inData . getBuNo ( ) , saleOrderNo ) ;
/ / 生成新的箱号 ( 断号取号 ) , 使用销售订单号作为前缀
String newBoxNo = generateBoxNoWithGapFilling ( saleOrderNo , existingBoxNos ) ;
inData . setBoxNo ( newBoxNo ) ;
boxForNotificationMapper . newSoReceiveBoxesData ( inData ) ;
return transNo . getNewTransNo ( ) ;
return newBoxNo ;
}
/ * *
* 生成箱号 , 支持断号取号
* 格式 : 订单号 + 三位流水号 ( 001 - 999 )
* 例如 : 已有AAA001和AAA003 , 下次生成AAA002
* /
private String generateBoxNoWithGapFilling ( String orderNo , List < String > existingBoxNos ) {
/ / 提取已使用的流水号
java . util . Set < Integer > usedSeqNos = new java . util . HashSet < > ( ) ;
String prefix = orderNo ;
for ( String boxNo : existingBoxNos ) {
if ( boxNo ! = null & & boxNo . startsWith ( prefix ) & & boxNo . length ( ) = = prefix . length ( ) + 3 ) {
try {
String seqStr = boxNo . substring ( prefix . length ( ) ) ;
int seqNo = Integer . parseInt ( seqStr ) ;
usedSeqNos . add ( seqNo ) ;
} catch ( NumberFormatException e ) {
/ / 忽略非数字后缀的箱号
}
}
}
/ / 找到第一个未使用的流水号 ( 断号取号 )
int newSeqNo = 1 ;
while ( usedSeqNos . contains ( newSeqNo ) & & newSeqNo < = 999 ) {
newSeqNo + + ;
}
if ( newSeqNo > 999 ) {
throw new RuntimeException ( "箱号流水号已达到上限999,无法继续生成!" ) ;
}
/ / 生成三位流水号
return prefix + String . format ( "%03d" , newSeqNo ) ;
}
@Override