feat(oms):入库业务单导入模板OrderNO改为只作业务单号,去掉格式校验并按业务单号查重

需求:导入模板表格OrderNO值回显到字段"业务单号";"入库业务单号"仍由系统
原本逻辑生成;业务单号重复不允许导入并提示"业务单号已存在";模板未填单号
保持现有系统逻辑;业务单号去掉规则校验。
一、导入流程(ReservationStockInOrderImpl.parseStockInExcel):
   1. 模板OrderNO只写入业务单号(business_order_no),不再同时作为入库业务单号
   2. 删除validateTemplateOrderNo格式规则校验(R+年月日+3位序号),模板单号不再限格式
   3. 查重由按in_order_number跨两表改为按business_order_no查入库业务单表,
      Mapper新增existsByBusinessOrderNo;重复时报"业务单号已存在:xxx,请修改
      模板中的OrderNO后重新导入"
   4. 入库业务单号(in_order_number)统一由insertDomain按原逻辑生成
      (R+年月日+当日累加,跨reservation/reserve两表取号防撞)
二、insertDomain业务单号赋值改为仅在为空时默认=入库单号,导入带模板单号时不覆盖;
   模板未填单号保持现有逻辑。页面手工新增(DomainService.insert)与客户预约下发
   (ReserveStockInOrderDomainService)为独立链路,不受影响。
This commit is contained in:
rcx
2026-08-27 14:10:38 +08:00
parent f1dec2298d
commit 76d95c1b2d
3 changed files with 21 additions and 37 deletions
@@ -77,4 +77,6 @@ public interface ReservationStockInOrderMapper extends BaseMapper<ReservationSto
List<String> generateReserveOrderNumber1(@Param("prefix") String prefix);
int existsByOrderNumber(@Param("inOrderNumber") String inOrderNumber);
int existsByBusinessOrderNo(@Param("businessOrderNo") String businessOrderNo);
}
@@ -486,25 +486,17 @@ public class ReservationStockInOrderImpl extends ServiceImpl<ReservationStockInO
}
ReservationStockInOrderDO reservationStockInOrderDO = new ReservationStockInOrderDO();
StockInHeader stockInHeader = resultDTO.getStockInHeader();
// 业务单号:优先使用模板自带OrderNO,与系统已有入库业务单号重复时提示;
// 模板未填单号时按 R+年月日+当日累加 规则生成(如R260717001、R260717002
// 业务单号:优先使用模板自带OrderNO(不做格式规则校验),与系统已有业务单号重复时提示不允许导入
// 入库业务单号(in_order_number)不使用模板单号,统一由系统原本逻辑生成(见insertDomain);
// 模板未填单号时保持系统逻辑:业务单号默认=入库业务单号
String templateOrderNo = stockInHeader.getOrderNo() == null ? "" : stockInHeader.getOrderNo().trim();
if (!templateOrderNo.isEmpty()) {
// 先校验模板单号是否符合规则:R+年月日+3位及以上序号,如R260717001
validateTemplateOrderNo(templateOrderNo);
// 跨两张入库单表查重(与手工新增取号逻辑保持一致)
// 注意:本类字段命名易混淆——stockInOrderMapper为reservation表,reservationStockInOrderMapper为reserve表
boolean duplicated = stockInOrderMapper.existsByOrderNumber(templateOrderNo) > 0
|| reservationStockInOrderMapper.countByInOrderNumber(templateOrderNo) > 0;
if (duplicated) {
throw new ServiceException("入库业务单号已存在:" + templateOrderNo + ",请修改模板中的OrderNO后重新导入");
// 按业务单号查重(入库业务单表 business_order_no 字段)
if (stockInOrderMapper.existsByBusinessOrderNo(templateOrderNo) > 0) {
throw new ServiceException("业务单号已存在:" + templateOrderNo + ",请修改模板中的OrderNO后重新导入");
}
reservationStockInOrderDO.setBusinessOrderNo(templateOrderNo);
}
if (templateOrderNo.isEmpty()) {
templateOrderNo = reservationStockInOrderDomainService.generateReserveOrderNumber();
}
reservationStockInOrderDO.setInOrderNumber(templateOrderNo);
reservationStockInOrderDO.setBusinessOrderNo(templateOrderNo);
reservationStockInOrderDO.setOrganizationId(loginUser.getUserPo().getOrganizationId());
reservationStockInOrderDO.setOrganizationName(loginUser.getUserPo().getOrganizationName());
reservationStockInOrderDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
@@ -597,25 +589,6 @@ public class ReservationStockInOrderImpl extends ServiceImpl<ReservationStockInO
}
/**
* 校验模板自带业务单号是否符合规则:R + 年月日(yyMMdd) + 3位及以上序号
* 示例:R260717001、R260717002
* 格式不符或年月日部分非有效日期(如R261332001)时抛出提示
*/
private void validateTemplateOrderNo(String orderNo) {
// R + 6位年月日 + 至少3位数字序号
if (!orderNo.matches("R\\d{9,}")) {
throw new ServiceException("入库业务单号格式不正确:正确格式为R+年月日+3位序号,如R260717001");
}
try {
SimpleDateFormat fmt = new SimpleDateFormat("yyMMdd");
fmt.setLenient(false);
fmt.parse(orderNo.substring(1, 7));
} catch (java.text.ParseException e) {
throw new ServiceException("入库业务单号格式不正确:正确格式为R+年月日+3位序号,如R260717001");
}
}
@Transactional(rollbackFor = Exception.class)
public Boolean insertDomain(ReservationStockInOrderDO stockInOrderDO) {
// 仓库信息校验(保留原有行为:仓库信息获取失败直接报错)
@@ -624,12 +597,16 @@ public class ReservationStockInOrderImpl extends ServiceImpl<ReservationStockInO
if (!"200".equals(String.valueOf(ajaxResult.get("code")))) {
throw new ServiceException("获取仓库信息失败");
}
// 入库单号:调用方设置(如导入时优先使用模板自带OrderNO,且已校验不重复)则沿用,不再覆盖;
// 未设置时按 R+年月日+当日累加 规则生成(如R260717001、R260717002),跨reservation/reserve两表取号防撞
// 入库单号:调用方设置时按 R+年月日+当日累加 规则生成(如R260717001、R260717002),
// 跨reservation/reserve两表取号防撞;导入时不再使用模板OrderNO作为入库单号(模板单号只作业务单号)
if (stockInOrderDO.getInOrderNumber() == null || stockInOrderDO.getInOrderNumber().trim().isEmpty()) {
stockInOrderDO.setInOrderNumber(reservationStockInOrderDomainService.generateReserveOrderNumber());
}
stockInOrderDO.setBusinessOrderNo(stockInOrderDO.getInOrderNumber());
// 业务单号:未设置时默认=入库单号(模板未填OrderNO的导入及常规场景);
// 导入且模板带OrderNO时由调用方已设置,此处沿用不覆盖
if (stockInOrderDO.getBusinessOrderNo() == null || stockInOrderDO.getBusinessOrderNo().trim().isEmpty()) {
stockInOrderDO.setBusinessOrderNo(stockInOrderDO.getInOrderNumber());
}
//统计总计划数
BigDecimal quantity = stockInOrderDO.getMaterialDetailList().stream().map(ReservationInMaterialDetailDO::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
stockInOrderDO.setQuantity(quantity);
@@ -688,4 +688,9 @@
<select id="existsByOrderNumber" resultType="java.lang.Integer" parameterType="java.lang.String">
SELECT COUNT(1) FROM reservation_stock_in_order WHERE in_order_number = #{inOrderNumber}
</select>
<!-- 导入模板自带OrderNO按业务单号查重 -->
<select id="existsByBusinessOrderNo" resultType="java.lang.Integer" parameterType="java.lang.String">
SELECT COUNT(1) FROM reservation_stock_in_order WHERE business_order_no = #{businessOrderNo}
</select>
</mapper>