feat(serial-number): 添加物料批次号生成功能

- 在BasdeSerialNumber实体中添加desc字段用于存储物料编号
- 新增generateInventoryInBatchNo方法支持按物料号生成唯一批次号
- 集成重试机制确保批次号生成的可靠性
- 将库存入库、生产回退和生产订单盈余流程中的序列号生成改为使用物料相关批次号
- 批次号格式包含前缀、日期和递增序列以确保唯一性
This commit is contained in:
曹鹏飞 2026-06-12 15:52:01 +08:00
parent 20357115be
commit 775f066d92
5 changed files with 39 additions and 7 deletions

View File

@ -231,7 +231,7 @@ public class InCostCenterBackController extends BaseController {
.setFactoryNo(order.getWerks())
.setWarehouseNo(order.getLgort())
.setNum(item.getLeft())
.setBatchNo(serialNumberControllerService.generateSerialNumber(46, 3))
.setBatchNo(serialNumberControllerService.generateInventoryInBatchNo(item.getMatnr()))
.setBinNo(item.getLgpbe())
.setMustScan(noScanningBaseControllerService.existsQrCode(item.getMatnr()))
)

View File

@ -239,7 +239,7 @@ public class InProduceBackController extends BaseController {
.setFactoryNo(order.getDwerk())
.setWarehouseNo(order.getLgort2())
.setNum(item.getSqsl().subtract(item.getNum()))
.setBatchNo(serialNumberControllerService.generateSerialNumber(46, 3))
.setBatchNo(serialNumberControllerService.generateInventoryInBatchNo(item.getMatnr()))
.setBinNo(item.getLgpbe())
.setMustScan(noScanningBaseControllerService.existsQrCode(item.getMatnr()))
)

View File

@ -425,7 +425,7 @@ public class InProduceOrderSurplusController extends BaseController {
.setFactoryNo(order.getDwerk())
.setWarehouseNo(order.getLgort2())
.setNum(item.getLeftNum())
.setBatchNo(serialNumberControllerService.generateSerialNumber(46, 3))
.setBatchNo(serialNumberControllerService.generateInventoryInBatchNo(item.getMatnr()))
.setBinNo(item.getLgpbe())
.setMustScan(noScanningBaseControllerService.existsQrCode(item.getMatnr()))
)

View File

@ -54,4 +54,36 @@ public class BasdeSerialNumberControllerService {
public String generateSerialNumber(Integer businessType) {
return generateSerialNumber(businessType, 4);
}
@Retryable(
maxAttempts = 5, // 最大重试次数包括第一次调用
backoff = @Backoff(delay = 1000) // 重试间隔1秒
)
public String generateInventoryInBatchNo(String materialNo) {
String currentDate = LocalDate.now().format(DATE_FORMATTER);
BasdeSerialNumber serialNumber = basdeSerialNumberService.lambdaQuery()
.eq(BasdeSerialNumber::getDesc, materialNo)
.one();
if (Objects.isNull(serialNumber)) {
serialNumber = new BasdeSerialNumber()
.setDesc(materialNo)
.setMaxSerial(0)
.setBusinessPrefixNumber("9")
.setVersion(0);
basdeSerialNumberService.save(serialNumber);
}
int nextSerial = 0;
if (StrUtil.equals(currentDate, serialNumber.getCurrentDateStr())) {
nextSerial = serialNumber.getMaxSerial();
}
nextSerial = nextSerial + 1;
serialNumber.setMaxSerial(nextSerial);
serialNumber.setCurrentDateStr(currentDate);
basdeSerialNumberService.updateById(serialNumber);
// 格式化为4位数字不足补零
return serialNumber.getBusinessPrefixNumber() + currentDate
+ StrUtil.padPre(String.valueOf(nextSerial), 3, '0');
}
}

View File

@ -1,9 +1,6 @@
package com.nflg.wms.repository.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import com.baomidou.mybatisplus.annotation.*;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
@ -58,4 +55,7 @@ public class BasdeSerialNumber implements Serializable {
* 业务单号的前缀
*/
private String businessPrefixNumber;
@TableField(value = "\"desc\"")
private String desc;
}