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);
|
List<String> generateReserveOrderNumber1(@Param("prefix") String prefix);
|
||||||
|
|
||||||
int existsByOrderNumber(@Param("inOrderNumber") String inOrderNumber);
|
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();
|
ReservationStockInOrderDO reservationStockInOrderDO = new ReservationStockInOrderDO();
|
||||||
StockInHeader stockInHeader = resultDTO.getStockInHeader();
|
StockInHeader stockInHeader = resultDTO.getStockInHeader();
|
||||||
// 业务单号:优先使用模板自带OrderNO,与系统已有入库业务单号重复时提示;
|
// 业务单号:优先使用模板自带OrderNO(不做格式规则校验),与系统已有业务单号重复时提示不允许导入;
|
||||||
// 模板未填单号时按 R+年月日+当日累加 规则生成(如R260717001、R260717002)
|
// 入库业务单号(in_order_number)不使用模板单号,统一由系统原本逻辑生成(见insertDomain);
|
||||||
|
// 模板未填单号时保持系统逻辑:业务单号默认=入库业务单号
|
||||||
String templateOrderNo = stockInHeader.getOrderNo() == null ? "" : stockInHeader.getOrderNo().trim();
|
String templateOrderNo = stockInHeader.getOrderNo() == null ? "" : stockInHeader.getOrderNo().trim();
|
||||||
if (!templateOrderNo.isEmpty()) {
|
if (!templateOrderNo.isEmpty()) {
|
||||||
// 先校验模板单号是否符合规则:R+年月日+3位及以上序号,如R260717001
|
// 按业务单号查重(入库业务单表 business_order_no 字段)
|
||||||
validateTemplateOrderNo(templateOrderNo);
|
if (stockInOrderMapper.existsByBusinessOrderNo(templateOrderNo) > 0) {
|
||||||
// 跨两张入库单表查重(与手工新增取号逻辑保持一致)
|
throw new ServiceException("业务单号已存在:" + templateOrderNo + ",请修改模板中的OrderNO后重新导入");
|
||||||
// 注意:本类字段命名易混淆——stockInOrderMapper为reservation表,reservationStockInOrderMapper为reserve表
|
|
||||||
boolean duplicated = stockInOrderMapper.existsByOrderNumber(templateOrderNo) > 0
|
|
||||||
|| reservationStockInOrderMapper.countByInOrderNumber(templateOrderNo) > 0;
|
|
||||||
if (duplicated) {
|
|
||||||
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.setOrganizationId(loginUser.getUserPo().getOrganizationId());
|
||||||
reservationStockInOrderDO.setOrganizationName(loginUser.getUserPo().getOrganizationName());
|
reservationStockInOrderDO.setOrganizationName(loginUser.getUserPo().getOrganizationName());
|
||||||
reservationStockInOrderDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId());
|
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)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public Boolean insertDomain(ReservationStockInOrderDO stockInOrderDO) {
|
public Boolean insertDomain(ReservationStockInOrderDO stockInOrderDO) {
|
||||||
// 仓库信息校验(保留原有行为:仓库信息获取失败直接报错)
|
// 仓库信息校验(保留原有行为:仓库信息获取失败直接报错)
|
||||||
@@ -624,12 +597,16 @@ public class ReservationStockInOrderImpl extends ServiceImpl<ReservationStockInO
|
|||||||
if (!"200".equals(String.valueOf(ajaxResult.get("code")))) {
|
if (!"200".equals(String.valueOf(ajaxResult.get("code")))) {
|
||||||
throw new ServiceException("获取仓库信息失败");
|
throw new ServiceException("获取仓库信息失败");
|
||||||
}
|
}
|
||||||
// 入库单号:调用方已设置(如导入时优先使用模板自带OrderNO,且已校验不重复)则沿用,不再覆盖;
|
// 入库单号:调用方未设置时按 R+年月日+当日累加 规则生成(如R260717001、R260717002),
|
||||||
// 未设置时按 R+年月日+当日累加 规则生成(如R260717001、R260717002),跨reservation/reserve两表取号防撞
|
// 跨reservation/reserve两表取号防撞;导入时不再使用模板OrderNO作为入库单号(模板单号只作业务单号)
|
||||||
if (stockInOrderDO.getInOrderNumber() == null || stockInOrderDO.getInOrderNumber().trim().isEmpty()) {
|
if (stockInOrderDO.getInOrderNumber() == null || stockInOrderDO.getInOrderNumber().trim().isEmpty()) {
|
||||||
stockInOrderDO.setInOrderNumber(reservationStockInOrderDomainService.generateReserveOrderNumber());
|
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);
|
BigDecimal quantity = stockInOrderDO.getMaterialDetailList().stream().map(ReservationInMaterialDetailDO::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
stockInOrderDO.setQuantity(quantity);
|
stockInOrderDO.setQuantity(quantity);
|
||||||
|
|||||||
+5
@@ -688,4 +688,9 @@
|
|||||||
<select id="existsByOrderNumber" resultType="java.lang.Integer" parameterType="java.lang.String">
|
<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 COUNT(1) FROM reservation_stock_in_order WHERE in_order_number = #{inOrderNumber}
|
||||||
</select>
|
</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>
|
</mapper>
|
||||||
Reference in New Issue
Block a user