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:
+2
@@ -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);
|
||||
}
|
||||
+14
-37
@@ -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);
|
||||
|
||||
+5
@@ -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>
|
||||
Reference in New Issue
Block a user