feat(serial-number): 扩展序列号生成功能并优化批次号管理

- 为generateSerialNumber方法添加suffixLen参数支持可变长度后缀
- 在序列号服务中实现可配置长度的数字补零功能
- 移除组件出库控制器中的空批次号设置
- 在成本中心回退、生产回退和生产订单盈余控制器中实现序列号生成
- 将批次号生成逻辑重构为独立的genBatchNo方法
- 优化流处理中的lambda表达式格式化
- 统一操作类型常量的格式化表示
This commit is contained in:
曹鹏飞 2026-06-12 15:14:44 +08:00
parent 30741347d7
commit 5667b92cd4
6 changed files with 29 additions and 13 deletions

View File

@ -433,7 +433,6 @@ public class ComponentOutboundController extends BaseController {
.setFactoryNo(order.getFactoryNo()) .setFactoryNo(order.getFactoryNo())
.setWarehouseNo(item.getLgort()) .setWarehouseNo(item.getLgort())
.setNum(getNoScanOutQty(item)) .setNum(getNoScanOutQty(item))
.setBatchNo("")
.setBinNo(item.getLgobe()) .setBinNo(item.getLgobe())
.setMustScan(noScanningBaseControllerService.cannotOutNoScanning(item.getIdnrk(),order.getFactoryNo(),item.getLgort())) .setMustScan(noScanningBaseControllerService.cannotOutNoScanning(item.getIdnrk(),order.getFactoryNo(),item.getLgort()))
) )

View File

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

View File

@ -239,7 +239,7 @@ public class InProduceBackController extends BaseController {
.setFactoryNo(order.getDwerk()) .setFactoryNo(order.getDwerk())
.setWarehouseNo(order.getLgort2()) .setWarehouseNo(order.getLgort2())
.setNum(item.getSqsl().subtract(item.getNum())) .setNum(item.getSqsl().subtract(item.getNum()))
.setBatchNo("") .setBatchNo(serialNumberControllerService.generateSerialNumber(46, 3))
.setBinNo(item.getLgpbe()) .setBinNo(item.getLgpbe())
.setMustScan(noScanningBaseControllerService.existsQrCode(item.getMatnr())) .setMustScan(noScanningBaseControllerService.existsQrCode(item.getMatnr()))
) )
@ -317,7 +317,10 @@ public class InProduceBackController extends BaseController {
.setLgort(ri.getWarehouseNo()) .setLgort(ri.getWarehouseNo())
.setMenge(data.getNum()) .setMenge(data.getNum())
.setMenge_T(item.getEnmng()) .setMenge_T(item.getEnmng())
.setMeins(item.getMeins()), (e, i) -> { e.setMenge(e.getMenge().add(i.getMenge())); return e; }); .setMeins(item.getMeins()), (e, i) -> {
e.setMenge(e.getMenge().add(i.getMenge()));
return e;
});
if (StrUtil.isNotBlank(data.getSerialNo())) { if (StrUtil.isNotBlank(data.getSerialNo())) {
input2.put(item.getRspos(), data.getSerialNo()); input2.put(item.getRspos(), data.getSerialNo());
} }

View File

@ -137,9 +137,6 @@ public class InProduceOrderController extends BaseController {
.setCreateBy(UserUtil.getUserName()) .setCreateBy(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now()); .setCreateTime(LocalDateTime.now());
produceOrderService.save(order); produceOrderService.save(order);
String date = DateTimeUtil.format(LocalDate.now(), "yyMMdd");
stringRedisTemplate.opsForValue().setIfAbsent("index:batchNo:" + date, "0", 24 - LocalDateTime.now().getHour(), TimeUnit.HOURS);
String index = StrUtil.padPre(String.valueOf(stringRedisTemplate.opsForValue().increment("index:batchNo:" + date)), 4, "0");
WmsInProduceOrderItem parent = new WmsInProduceOrderItem() WmsInProduceOrderItem parent = new WmsInProduceOrderItem()
.setId(IdUtil.getSnowflakeNextId()) .setId(IdUtil.getSnowflakeNextId())
.setOrderId(order.getId()) .setOrderId(order.getId())
@ -151,7 +148,7 @@ public class InProduceOrderController extends BaseController {
.setFactoryNo(request.getPwerk()) .setFactoryNo(request.getPwerk())
.setWarehouseNo(request.getLgort()) .setWarehouseNo(request.getLgort())
.setOrderNum(request.getPsmng()) .setOrderNum(request.getPsmng())
.setBatchNo(date + index) .setBatchNo(genBatchNo())
.setSernr(request.getSernr()) .setSernr(request.getSernr())
.setWorkbenchNo(request.getWorkbenchNo()) .setWorkbenchNo(request.getWorkbenchNo())
.setModelNo(request.getModelNo()); .setModelNo(request.getModelNo());
@ -219,6 +216,14 @@ public class InProduceOrderController extends BaseController {
return ApiResult.success(order.getId()); return ApiResult.success(order.getId());
} }
private String genBatchNo() {
String date = DateTimeUtil.format(LocalDate.now(), "yyMMdd");
stringRedisTemplate.opsForValue()
.setIfAbsent("index:batchNo:" + date, "0", 24 - LocalDateTime.now().getHour(), TimeUnit.HOURS);
String index = StrUtil.padPre(String.valueOf(stringRedisTemplate.opsForValue().increment("index:batchNo:" + date)), 4, "0");
return date + index;
}
/** /**
* 搜索 * 搜索
* @param request 搜索参数 * @param request 搜索参数
@ -441,7 +446,7 @@ public class InProduceOrderController extends BaseController {
.setFactoryNo(item.getFactoryNo()) .setFactoryNo(item.getFactoryNo())
.setWarehouseNo(item.getWarehouseNo()) .setWarehouseNo(item.getWarehouseNo())
.setNum(item.getNum()) .setNum(item.getNum())
.setBatchNo(NoUtil.getBatchNo(item.getBatchNo())) .setBatchNo(genBatchNo())
.setBinNo(item.getBinNos()) .setBinNo(item.getBinNos())
.setMustScan(noScanningBaseControllerService.existsQrCode(item.getMaterialNo())) .setMustScan(noScanningBaseControllerService.existsQrCode(item.getMaterialNo()))
) )

View File

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

View File

@ -24,7 +24,7 @@ public class BasdeSerialNumberControllerService {
maxAttempts = 5, // 最大重试次数包括第一次调用 maxAttempts = 5, // 最大重试次数包括第一次调用
backoff = @Backoff(delay = 1000) // 重试间隔1秒 backoff = @Backoff(delay = 1000) // 重试间隔1秒
) )
public String generateSerialNumber(Integer businessType) { public String generateSerialNumber(Integer businessType, Integer suffixLen) {
String currentDate = LocalDate.now().format(DATE_FORMATTER); String currentDate = LocalDate.now().format(DATE_FORMATTER);
BasdeSerialNumber serialNumber = basdeSerialNumberService.lambdaQuery() BasdeSerialNumber serialNumber = basdeSerialNumberService.lambdaQuery()
@ -43,6 +43,15 @@ public class BasdeSerialNumberControllerService {
serialNumber.setCurrentDateStr(currentDate); serialNumber.setCurrentDateStr(currentDate);
basdeSerialNumberService.updateById(serialNumber); basdeSerialNumberService.updateById(serialNumber);
// 格式化为4位数字不足补零 // 格式化为4位数字不足补零
return serialNumber.getBusinessPrefixNumber() + currentDate + String.format("%04d", nextSerial); return serialNumber.getBusinessPrefixNumber() + currentDate
+ StrUtil.padPre(String.valueOf(nextSerial), suffixLen, '0');
}
@Retryable(
maxAttempts = 5, // 最大重试次数包括第一次调用
backoff = @Backoff(delay = 1000) // 重试间隔1秒
)
public String generateSerialNumber(Integer businessType) {
return generateSerialNumber(businessType, 4);
} }
} }