优化
This commit is contained in:
@@ -2528,14 +2528,38 @@ CREATE TABLE IF NOT EXISTS fl_inbound_order (
|
|||||||
) ENGINE=InnoDB COMMENT='二期头程入库单聚合根和列表查询快照';
|
) ENGINE=InnoDB COMMENT='二期头程入库单聚合根和列表查询快照';
|
||||||
|
|
||||||
UPDATE baiyue_order.ord_order o
|
UPDATE baiyue_order.ord_order o
|
||||||
LEFT JOIN baiyue_firstleg.fl_inbound_order i
|
JOIN baiyue_firstleg.fl_inbound_order i
|
||||||
ON i.tenant_id = o.tenant_id AND i.order_id = o.id AND i.deleted = 0
|
ON i.tenant_id = o.tenant_id AND i.order_id = o.id AND i.deleted = 0
|
||||||
SET o.inbound_code = COALESCE(i.inbound_code, CONCAT('RK-', o.id))
|
SET o.inbound_code = i.inbound_code
|
||||||
WHERE o.deleted = 0
|
WHERE o.deleted = 0
|
||||||
AND o.status <> 'DRAFT'
|
AND o.status <> 'DRAFT'
|
||||||
AND (o.submitted_at IS NOT NULL
|
AND (o.submitted_at IS NOT NULL
|
||||||
OR o.status IN ('SUBMITTED', 'APPROVED', 'ACCEPTED', 'PROCESSING', 'COMPLETED'))
|
OR o.status IN ('SUBMITTED', 'APPROVED', 'ACCEPTED', 'PROCESSING', 'COMPLETED'))
|
||||||
AND o.inbound_code IS NULL;
|
AND o.inbound_code IS NULL
|
||||||
|
AND i.inbound_code IS NOT NULL
|
||||||
|
AND TRIM(i.inbound_code) <> '';
|
||||||
|
|
||||||
|
-- 非草稿订单若既无订单入仓码也无 Firstleg 权威入仓码,禁止用内部 ID 伪造业务键。
|
||||||
|
DROP PROCEDURE IF EXISTS assert_submitted_order_inbound_code;
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE PROCEDURE assert_submitted_order_inbound_code()
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM baiyue_order.ord_order o
|
||||||
|
WHERE o.deleted = 0
|
||||||
|
AND o.status <> 'DRAFT'
|
||||||
|
AND (o.submitted_at IS NOT NULL
|
||||||
|
OR o.status IN ('SUBMITTED', 'APPROVED', 'ACCEPTED', 'PROCESSING', 'COMPLETED'))
|
||||||
|
AND (o.inbound_code IS NULL OR TRIM(o.inbound_code) = '')
|
||||||
|
) THEN
|
||||||
|
SIGNAL SQLSTATE '45000'
|
||||||
|
SET MESSAGE_TEXT = '存在已提交订单缺少权威入仓码,请先修复订单/Firstleg业务事实后重跑';
|
||||||
|
END IF;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
||||||
|
CALL assert_submitted_order_inbound_code();
|
||||||
|
DROP PROCEDURE IF EXISTS assert_submitted_order_inbound_code;
|
||||||
|
|
||||||
-- 从未提交的草稿或由草稿直接取消的订单不应拥有入仓码。
|
-- 从未提交的草稿或由草稿直接取消的订单不应拥有入仓码。
|
||||||
UPDATE baiyue_order.ord_order
|
UPDATE baiyue_order.ord_order
|
||||||
|
|||||||
+6
-1
@@ -9,6 +9,7 @@ import com.baiyue.common.core.exception.BizException;
|
|||||||
import com.baiyue.firstleg.dto.OrderApprovedInboundCommand;
|
import com.baiyue.firstleg.dto.OrderApprovedInboundCommand;
|
||||||
import com.baiyue.firstleg.dto.InboundOrderReference;
|
import com.baiyue.firstleg.dto.InboundOrderReference;
|
||||||
import com.baiyue.firstleg.service.InboundOrderCreationService;
|
import com.baiyue.firstleg.service.InboundOrderCreationService;
|
||||||
|
import com.baiyue.firstleg.service.InboundCartonLabelService;
|
||||||
import com.baiyue.firstleg.service.UnifiedInboundQueryService;
|
import com.baiyue.firstleg.service.UnifiedInboundQueryService;
|
||||||
import com.baiyue.firstleg.dto.UnifiedInboundDetail;
|
import com.baiyue.firstleg.dto.UnifiedInboundDetail;
|
||||||
import com.baiyue.firstleg.dto.UnifiedInboundQuery;
|
import com.baiyue.firstleg.dto.UnifiedInboundQuery;
|
||||||
@@ -35,6 +36,8 @@ public class InternalInboundOrderController {
|
|||||||
@Resource
|
@Resource
|
||||||
private InboundOrderCreationService service;
|
private InboundOrderCreationService service;
|
||||||
@Resource
|
@Resource
|
||||||
|
private InboundCartonLabelService cartonLabels;
|
||||||
|
@Resource
|
||||||
private UnifiedInboundQueryService unifiedQueryService;
|
private UnifiedInboundQueryService unifiedQueryService;
|
||||||
@Value("${baiyue.security.internal-service-token}")
|
@Value("${baiyue.security.internal-service-token}")
|
||||||
private String internalToken;
|
private String internalToken;
|
||||||
@@ -59,7 +62,9 @@ public class InternalInboundOrderController {
|
|||||||
|| command.totalPackageCount() != null && command.totalPackageCount() < 1) {
|
|| command.totalPackageCount() != null && command.totalPackageCount() < 1) {
|
||||||
throw new BizException(ResultCode.BAD_REQUEST, "订单入库快照不完整");
|
throw new BizException(ResultCode.BAD_REQUEST, "订单入库快照不完整");
|
||||||
}
|
}
|
||||||
return ApiResponse.success(service.createFromApprovedOrder(command));
|
long inboundId = service.createFromApprovedOrder(command);
|
||||||
|
cartonLabels.getOrCreate(command.tenantId(), inboundId);
|
||||||
|
return ApiResponse.success(inboundId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/order-preparing")
|
@PostMapping("/order-preparing")
|
||||||
|
|||||||
+4
@@ -4,6 +4,7 @@ import com.baiyue.common.core.exception.BizException;
|
|||||||
import com.baiyue.firstleg.dto.InboundOrderReference;
|
import com.baiyue.firstleg.dto.InboundOrderReference;
|
||||||
import com.baiyue.firstleg.dto.OrderApprovedInboundCommand;
|
import com.baiyue.firstleg.dto.OrderApprovedInboundCommand;
|
||||||
import com.baiyue.firstleg.service.InboundOrderCreationService;
|
import com.baiyue.firstleg.service.InboundOrderCreationService;
|
||||||
|
import com.baiyue.firstleg.service.InboundCartonLabelService;
|
||||||
import com.baiyue.firstleg.service.UnifiedInboundQueryService;
|
import com.baiyue.firstleg.service.UnifiedInboundQueryService;
|
||||||
import com.baiyue.firstleg.dto.UnifiedInboundQuery;
|
import com.baiyue.firstleg.dto.UnifiedInboundQuery;
|
||||||
import com.baiyue.common.core.api.PageResult;
|
import com.baiyue.common.core.api.PageResult;
|
||||||
@@ -27,6 +28,8 @@ class InternalInboundOrderReferenceControllerTest {
|
|||||||
@MockBean
|
@MockBean
|
||||||
private InboundOrderCreationService service;
|
private InboundOrderCreationService service;
|
||||||
@MockBean
|
@MockBean
|
||||||
|
private InboundCartonLabelService cartonLabels;
|
||||||
|
@MockBean
|
||||||
private UnifiedInboundQueryService unifiedQueryService;
|
private UnifiedInboundQueryService unifiedQueryService;
|
||||||
@Resource
|
@Resource
|
||||||
private InternalInboundOrderController controller;
|
private InternalInboundOrderController controller;
|
||||||
@@ -79,6 +82,7 @@ class InternalInboundOrderReferenceControllerTest {
|
|||||||
|
|
||||||
assertThat(controller.createFromApprovedOrder("internal-token", command).data()).isEqualTo(88L);
|
assertThat(controller.createFromApprovedOrder("internal-token", command).data()).isEqualTo(88L);
|
||||||
verify(service).createFromApprovedOrder(command);
|
verify(service).createFromApprovedOrder(command);
|
||||||
|
verify(cartonLabels).getOrCreate(10001L, 88L);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static OrderApprovedInboundCommand approvedCommand(String inboundCode, Long carrierId) {
|
private static OrderApprovedInboundCommand approvedCommand(String inboundCode, Long carrierId) {
|
||||||
|
|||||||
@@ -64,19 +64,17 @@ public class OrderApplicationService {
|
|||||||
private Long createDraftInternal(long tenantId, long userId, OrderRequests.SaveRequest request) {
|
private Long createDraftInternal(long tenantId, long userId, OrderRequests.SaveRequest request) {
|
||||||
productImageGuard.requireOwned(tenantId, request.cargoes());
|
productImageGuard.requireOwned(tenantId, request.cargoes());
|
||||||
var snapshots = masterDataGuard.validate(tenantId, request);
|
var snapshots = masterDataGuard.validate(tenantId, request);
|
||||||
String inboundCodePrefix = pricingChannelGuard.requireAvailable(tenantId, request.receivingWarehouseId(),
|
pricingChannelGuard.requireAvailable(tenantId, request.receivingWarehouseId(),
|
||||||
request.channelCode(), request.destinationType());
|
request.channelCode(), request.destinationType());
|
||||||
OrderEntity order = new OrderEntity();
|
OrderEntity order = new OrderEntity();
|
||||||
long orderId = IdWorker.getId();
|
long orderId = IdWorker.getId();
|
||||||
order.setId(orderId); order.setTenantId(tenantId); order.setOrderNo(nextNo(orderId));
|
order.setId(orderId); order.setTenantId(tenantId); order.setOrderNo(nextNo(orderId));
|
||||||
order.setStatus(OrderStatus.DRAFT);
|
order.setStatus(OrderStatus.DRAFT);
|
||||||
apply(order, tenantId, request, snapshots);
|
apply(order, tenantId, request, snapshots);
|
||||||
order.setInboundCode(nextInboundCode(inboundCodePrefix));
|
|
||||||
order.setCreatedBy(userId); order.setUpdatedBy(userId);
|
order.setCreatedBy(userId); order.setUpdatedBy(userId);
|
||||||
repository.insertOrder(order);
|
repository.insertOrder(order);
|
||||||
saveChildren(tenantId, userId, order.getId(), request);
|
saveChildren(tenantId, userId, order.getId(), request);
|
||||||
record(tenantId, order.getId(), null, OrderStatus.DRAFT, "CREATE", null, userId, null);
|
record(tenantId, order.getId(), null, OrderStatus.DRAFT, "CREATE", null, userId, null);
|
||||||
prepareDraftInbound(order, request);
|
|
||||||
return order.getId();
|
return order.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,7 +114,7 @@ public class OrderApplicationService {
|
|||||||
repository.replaceDraftChildren(tenantId, id);
|
repository.replaceDraftChildren(tenantId, id);
|
||||||
saveChildren(tenantId, userId, id, request);
|
saveChildren(tenantId, userId, id, request);
|
||||||
record(tenantId, id, before, order.getStatus(), "UPDATE", null, userId, null);
|
record(tenantId, id, before, order.getStatus(), "UPDATE", null, userId, null);
|
||||||
prepareDraftInbound(order, request);
|
if (before == OrderStatus.SUBMITTED) prepareDraftInbound(order, request);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
|
|||||||
@@ -29,6 +29,9 @@ class OrderPickupSqlContractTest {
|
|||||||
assertThat(relax).isGreaterThanOrEqualTo(0).isLessThan(clearDraft);
|
assertThat(relax).isGreaterThanOrEqualTo(0).isLessThan(clearDraft);
|
||||||
assertThat(sql).contains(
|
assertThat(sql).contains(
|
||||||
"column_name = 'requested_pickup_at'",
|
"column_name = 'requested_pickup_at'",
|
||||||
"ALTER TABLE baiyue_order.ord_order ADD COLUMN requested_pickup_at DATETIME(3) NULL");
|
"ALTER TABLE baiyue_order.ord_order ADD COLUMN requested_pickup_at DATETIME(3) NULL",
|
||||||
|
"CREATE PROCEDURE assert_submitted_order_inbound_code()",
|
||||||
|
"SIGNAL SQLSTATE '45000'");
|
||||||
|
assertThat(sql).doesNotContain("CONCAT('RK-', o.id)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ class OrderApplicationServiceStateTest {
|
|||||||
assertThat(orderId).isNotNull();
|
assertThat(orderId).isNotNull();
|
||||||
verify(eligibility, never()).requireApproved(anyLong());
|
verify(eligibility, never()).requireApproved(anyLong());
|
||||||
verify(repository).insertOrder(argThat(order -> order.getStatus() == OrderStatus.DRAFT
|
verify(repository).insertOrder(argThat(order -> order.getStatus() == OrderStatus.DRAFT
|
||||||
&& order.getInboundCode().matches("PCHWK\\d{6}0001")));
|
&& order.getInboundCode() == null));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user