refactor(order): 移除链路演练功能
删除模拟签收 API 与 RBAC 菜单/权限种子,E2E 测试回退至待上网状态。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
c918faec97
commit
7ab6b6fb51
@ -1,7 +1,7 @@
|
|||||||
-- E2E 订单全链路测试主数据(固定 ID 段 900x / 99001)
|
-- E2E 订单全链路测试主数据(固定 ID 段 900x / 99001)
|
||||||
-- 前置:已执行 db.sql;库中已有 t_country.US
|
-- 前置:已执行 db.sql;库中已有 t_country.US
|
||||||
-- 用法:mysql ... oms_test < sql/seed_e2e_order_lifecycle.sql
|
-- 用法:mysql ... oms_test < sql/seed_e2e_order_lifecycle.sql
|
||||||
-- RBAC 菜单/权限:sql/seed_order_lab_rbac_menu.sql + sql/seed_order_lab_role_permissions.sql
|
-- RBAC 批量任务菜单/权限:sql/seed_order_lab_rbac_menu.sql + sql/seed_order_lab_role_permissions.sql
|
||||||
|
|
||||||
SET NAMES utf8mb4;
|
SET NAMES utf8mb4;
|
||||||
SET FOREIGN_KEY_CHECKS = 0;
|
SET FOREIGN_KEY_CHECKS = 0;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
-- 订单批量任务 + 链路演练 RBAC 菜单(Fake.Rbac menu 表)
|
-- 订单批量任务 RBAC 菜单(Fake.Rbac menu 表)
|
||||||
-- 执行库:RBAC 库(与 seed_xhs_rbac_menu.sql 相同)
|
-- 执行库:RBAC 库(与 seed_xhs_rbac_menu.sql 相同)
|
||||||
-- 幂等:可重复执行
|
-- 幂等:可重复执行
|
||||||
|
|
||||||
@ -24,8 +24,7 @@ INSERT INTO `menu` (
|
|||||||
`Id`, `PId`, `Name`, `PermissionCode`, `Type`, `Icon`, `Route`, `Component`, `Order`,
|
`Id`, `PId`, `Name`, `PermissionCode`, `Type`, `Icon`, `Route`, `Component`, `Order`,
|
||||||
`IsHidden`, `IsCached`, `Description`, `IsDeleted`,
|
`IsHidden`, `IsCached`, `Description`, `IsDeleted`,
|
||||||
`ConcurrencyStamp`, `CreateUserId`, `CreateTime`, `UpdateUserId`, `UpdateTime`
|
`ConcurrencyStamp`, `CreateUserId`, `CreateTime`, `UpdateUserId`, `UpdateTime`
|
||||||
) VALUES
|
) VALUES (
|
||||||
(
|
|
||||||
'b1b2c3d4-e5f6-7890-abcd-ef1234567901',
|
'b1b2c3d4-e5f6-7890-abcd-ef1234567901',
|
||||||
@ORDER_PID,
|
@ORDER_PID,
|
||||||
'批量任务',
|
'批量任务',
|
||||||
@ -37,19 +36,6 @@ INSERT INTO `menu` (
|
|||||||
4,
|
4,
|
||||||
0, 1, '订单 RabbitMQ 批量任务治理', 0,
|
0, 1, '订单 RabbitMQ 批量任务治理', 0,
|
||||||
UUID(), @ADMIN_USER_ID, NOW(), @ADMIN_USER_ID, NOW()
|
UUID(), @ADMIN_USER_ID, NOW(), @ADMIN_USER_ID, NOW()
|
||||||
),
|
|
||||||
(
|
|
||||||
'b1b2c3d4-e5f6-7890-abcd-ef1234567902',
|
|
||||||
@ORDER_PID,
|
|
||||||
'链路演练',
|
|
||||||
'Order.LifecycleLab',
|
|
||||||
1,
|
|
||||||
NULL,
|
|
||||||
'/order/lifecycleLab',
|
|
||||||
'views/order/lifecycleLab/index',
|
|
||||||
5,
|
|
||||||
0, 1, '订单全链路可视化演练(E2E)', 0,
|
|
||||||
UUID(), @ADMIN_USER_ID, NOW(), @ADMIN_USER_ID, NOW()
|
|
||||||
)
|
)
|
||||||
ON DUPLICATE KEY UPDATE
|
ON DUPLICATE KEY UPDATE
|
||||||
`Name` = VALUES(`Name`),
|
`Name` = VALUES(`Name`),
|
||||||
@ -61,3 +47,8 @@ ON DUPLICATE KEY UPDATE
|
|||||||
`Description` = VALUES(`Description`),
|
`Description` = VALUES(`Description`),
|
||||||
`CreateUserId` = VALUES(`CreateUserId`),
|
`CreateUserId` = VALUES(`CreateUserId`),
|
||||||
`UpdateUserId` = VALUES(`UpdateUserId`);
|
`UpdateUserId` = VALUES(`UpdateUserId`);
|
||||||
|
|
||||||
|
-- 清理已废弃的链路演练菜单
|
||||||
|
UPDATE `menu`
|
||||||
|
SET `IsDeleted` = 1, `UpdateTime` = NOW(), `UpdateUserId` = @ADMIN_USER_ID
|
||||||
|
WHERE `Route` = '/order/lifecycleLab' AND `IsDeleted` = 0;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
-- 为 Admin / Customer 角色追加批量任务、链路演练权限(幂等)
|
-- 为 Admin / Customer 角色追加批量任务权限(幂等)
|
||||||
-- RBAC 库执行;执行后登录用户需重新获取 token 或刷新权限缓存
|
-- RBAC 库执行;执行后登录用户需重新获取 token 或刷新权限缓存
|
||||||
|
|
||||||
SET @ADMIN_USER_ID = (
|
SET @ADMIN_USER_ID = (
|
||||||
@ -18,13 +18,14 @@ CROSS JOIN (
|
|||||||
SELECT 'Order.BatchJobs.Query' AS `Code` UNION ALL
|
SELECT 'Order.BatchJobs.Query' AS `Code` UNION ALL
|
||||||
SELECT 'Order.BatchJobs.View' UNION ALL
|
SELECT 'Order.BatchJobs.View' UNION ALL
|
||||||
SELECT 'Order.BatchJobs.Retry' UNION ALL
|
SELECT 'Order.BatchJobs.Retry' UNION ALL
|
||||||
SELECT 'Order.BatchJobs.Cancel' UNION ALL
|
SELECT 'Order.BatchJobs.Cancel'
|
||||||
SELECT 'Order.LifecycleLab.Query' UNION ALL
|
|
||||||
SELECT 'Order.LifecycleLab.RunStep' UNION ALL
|
|
||||||
SELECT 'Order.LifecycleLab.RunAll'
|
|
||||||
) p
|
) p
|
||||||
WHERE r.`Code` IN ('Admin', 'Customer')
|
WHERE r.`Code` IN ('Admin', 'Customer')
|
||||||
AND NOT EXISTS (
|
AND NOT EXISTS (
|
||||||
SELECT 1 FROM `role_permission` rp
|
SELECT 1 FROM `role_permission` rp
|
||||||
WHERE rp.`RoleId` = r.`Id` AND rp.`PermissionCode` = p.`Code`
|
WHERE rp.`RoleId` = r.`Id` AND rp.`PermissionCode` = p.`Code`
|
||||||
);
|
);
|
||||||
|
|
||||||
|
-- 清理已废弃的链路演练权限
|
||||||
|
DELETE FROM `role_permission`
|
||||||
|
WHERE `PermissionCode` LIKE 'Order.LifecycleLab.%';
|
||||||
|
|||||||
@ -1,41 +0,0 @@
|
|||||||
using Fake.Application;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using Oms.Application.Dtos.Orders;
|
|
||||||
using Oms.Application.Shared;
|
|
||||||
using Oms.Domain.OrdersAggregate.Consts;
|
|
||||||
|
|
||||||
namespace Oms.Application.Services.Orders;
|
|
||||||
|
|
||||||
public partial class OrderService
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 链路演练:模拟签收(待上网/运输中 → 派送成功)。
|
|
||||||
/// 仅供 E2E/演练;正式环境签收应接入轨迹同步。
|
|
||||||
/// </summary>
|
|
||||||
[HttpPost("/order/lifecycle-lab/sign")]
|
|
||||||
public async Task LifecycleLabSignAsync([FromBody] OrderActionInput input)
|
|
||||||
{
|
|
||||||
var order = await GetOrderOrThrowAsync(input.Id);
|
|
||||||
if (order.OrderStatus == OrderStatusCodes.DeliverySuccess)
|
|
||||||
{
|
|
||||||
throw new BusinessException("订单已签收");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (order.OrderStatus is not (OrderStatusCodes.PendingOnline or OrderStatusCodes.Shipping))
|
|
||||||
{
|
|
||||||
throw new BusinessException(
|
|
||||||
$"当前状态「{OmsDocHelper.GetOrderStatusName(order.OrderStatus)}」不可模拟签收,请先完成出库");
|
|
||||||
}
|
|
||||||
|
|
||||||
var now = DateTime.Now;
|
|
||||||
if (order.OrderStatus == OrderStatusCodes.PendingOnline)
|
|
||||||
{
|
|
||||||
order.OrderStatus = OrderStatusCodes.Shipping;
|
|
||||||
}
|
|
||||||
|
|
||||||
order.OrderStatus = OrderStatusCodes.DeliverySuccess;
|
|
||||||
order.SignTime = now;
|
|
||||||
order.UpdateTime = now;
|
|
||||||
await UpdateOrderAsync(order);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -8,7 +8,7 @@ using Oms.E2E.Tests.Support;
|
|||||||
namespace Oms.E2E.Tests.Scenarios;
|
namespace Oms.E2E.Tests.Scenarios;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 订单主链路:创建 → 入库 → 支付 → 出库 → 签收。
|
/// 订单主链路:创建 → 入库 → 支付 → 出库(至 pendingOnline)。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Collection(OrderE2eCollection.Name)]
|
[Collection(OrderE2eCollection.Name)]
|
||||||
[Trait("Category", "E2E")]
|
[Trait("Category", "E2E")]
|
||||||
@ -84,21 +84,14 @@ public sealed class OrderLifecycleHappyPathTests(OrderE2eFixture fixture)
|
|||||||
|
|
||||||
await AssertOrderStatusAsync(serviceNo, OrderStatusCodes.PendingOnline);
|
await AssertOrderStatusAsync(serviceNo, OrderStatusCodes.PendingOnline);
|
||||||
|
|
||||||
var signResponse = await fixture.Client.PostAsync("/order/lifecycle-lab/sign", E2eJson.AsJsonContent(new { id }));
|
|
||||||
var signText = await signResponse.Content.ReadAsStringAsync();
|
|
||||||
signResponse.IsSuccessStatusCode.Should().BeTrue($"sign failed: {signText}");
|
|
||||||
|
|
||||||
await AssertOrderStatusAsync(serviceNo, OrderStatusCodes.DeliverySuccess);
|
|
||||||
|
|
||||||
var detailResponse = await fixture.Client.GetAsync($"/order/detail?id={id}");
|
var detailResponse = await fixture.Client.GetAsync($"/order/detail?id={id}");
|
||||||
detailResponse.IsSuccessStatusCode.Should().BeTrue();
|
detailResponse.IsSuccessStatusCode.Should().BeTrue();
|
||||||
var detail = await E2eJson.ReadAsync<OrderOutput>(detailResponse);
|
var detail = await E2eJson.ReadAsync<OrderOutput>(detailResponse);
|
||||||
detail.Should().NotBeNull();
|
detail.Should().NotBeNull();
|
||||||
detail!.OrderStatus.Should().Be(OmsDocHelper.GetOrderStatusName(OrderStatusCodes.DeliverySuccess));
|
detail!.OrderStatus.Should().Be(OmsDocHelper.GetOrderStatusName(OrderStatusCodes.PendingOnline));
|
||||||
detail.ReceiveTime.Should().NotBeNull();
|
detail.ReceiveTime.Should().NotBeNull();
|
||||||
detail.PayTime.Should().NotBeNull();
|
detail.PayTime.Should().NotBeNull();
|
||||||
detail.ShipTime.Should().NotBeNull();
|
detail.ShipTime.Should().NotBeNull();
|
||||||
detail.SignTime.Should().NotBeNull();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static object BuildParcelCreateBody(string clientNo) => new
|
private static object BuildParcelCreateBody(string clientNo) => new
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user