Browse Source

2026-01-08

销售发货装箱页面的扫描装箱,箱号的生成逻辑调整为"销售订单号"+三位流水号
master
fengyuan_yang 5 days ago
parent
commit
f079710670
  1. 12
      src/main/java/com/gaotao/modules/boxManage/dao/BoxForNotificationMapper.java
  2. 13
      src/main/java/com/gaotao/modules/boxManage/entity/SoReceiveBoxesDto.java
  3. 54
      src/main/java/com/gaotao/modules/boxManage/service/impl/BoxForNotificationServiceImpl.java
  4. 21
      src/main/resources/mapper/boxManage/BoxForNotificationMapper.xml

12
src/main/java/com/gaotao/modules/boxManage/dao/BoxForNotificationMapper.java

@ -21,6 +21,18 @@ public interface BoxForNotificationMapper {
void newSoReceiveBoxesData(SoReceiveBoxesData data);
/**
* 查询指定订单号下已有的所有箱号
* 用于生成新箱号时断号取号
*/
List<String> getExistingBoxNosByOrderNo(@Param("site") String site, @Param("buNo") String buNo, @Param("orderNo") String orderNo);
/**
* 查询以指定销售订单号为前缀的所有箱号
* 用于生成新箱号时断号取号
*/
List<String> getExistingBoxNosBySaleOrderNo(@Param("site") String site, @Param("buNo") String buNo, @Param("saleOrderNo") String saleOrderNo);
List<SoReceiveBoxRollsData> searchBoxRollDetail(SoReceiveBoxesData data);
SoReceiveBoxesData searchBoxData(SoReceiveBoxesData data);

13
src/main/java/com/gaotao/modules/boxManage/entity/SoReceiveBoxesDto.java

@ -85,6 +85,11 @@ public class SoReceiveBoxesDto {
*/
private Integer stdPackingQty;
/**
* 销售订单号用于生成箱号
*/
private String saleOrderNo;
public Integer getId() {
return id;
}
@ -212,4 +217,12 @@ public class SoReceiveBoxesDto {
public void setStdPackingQty(Integer stdPackingQty) {
this.stdPackingQty = stdPackingQty;
}
public String getSaleOrderNo() {
return saleOrderNo;
}
public void setSaleOrderNo(String saleOrderNo) {
this.saleOrderNo = saleOrderNo;
}
}

54
src/main/java/com/gaotao/modules/boxManage/service/impl/BoxForNotificationServiceImpl.java

@ -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

21
src/main/resources/mapper/boxManage/BoxForNotificationMapper.xml

@ -54,9 +54,28 @@
version,WareHouseID,bu_no) values
(#{site},#{boxNo},#{orderNo},#{status},#{rollsQty},#{boxType},'Y',GetDate(),#{createdBy},
0,#{wareHouseID},#{buNo})
</insert>
<!-- 查询指定订单号下已有的所有箱号,用于断号取号 -->
<select id="getExistingBoxNosByOrderNo" resultType="java.lang.String">
SELECT box_no
FROM so_receive_boxes
WHERE site = #{site}
AND bu_no = #{buNo}
AND order_no = #{orderNo}
ORDER BY box_no
</select>
<!-- 查询以指定销售订单号为前缀的所有箱号,用于断号取号 -->
<select id="getExistingBoxNosBySaleOrderNo" resultType="java.lang.String">
SELECT box_no
FROM so_receive_boxes
WHERE site = #{site}
AND bu_no = #{buNo}
AND box_no LIKE #{saleOrderNo} + '%'
ORDER BY box_no
</select>
<select id="searchBoxRollDetail" resultType="SoReceiveBoxRollsData">
select ROW_NUMBER() OVER (ORDER BY a.received_date) orderId, a.id,a.site,a.bu_no,a.box_no,a.final_roll_no,a.roll_qty,a.received_by,a.received_date,a.WareHouseID,a.part_no
from so_receive_box_rolls a

Loading…
Cancel
Save