diff --git a/src/Oms.Application/Dtos/PlatformStore/PlatformStoreDtos.cs b/src/Oms.Application/Dtos/PlatformStore/PlatformStoreDtos.cs
index 0681549..aca478e 100644
--- a/src/Oms.Application/Dtos/PlatformStore/PlatformStoreDtos.cs
+++ b/src/Oms.Application/Dtos/PlatformStore/PlatformStoreDtos.cs
@@ -96,6 +96,9 @@ public class PlatformStoreOrderListInput : PlatformStorePageInput
{
public int? StoreId { get; set; }
+ ///
+ /// 履约状态:pending / toShip / shipped / canceled / suspended / completed;空或 all 表示全部。
+ ///
public string? FulfillStatus { get; set; }
public string? PlatformOrderNo { get; set; }
diff --git a/src/Oms.Application/Dtos/Warehouse/WarehouseDtos.cs b/src/Oms.Application/Dtos/Warehouse/WarehouseDtos.cs
index 63e601a..3c803a4 100644
--- a/src/Oms.Application/Dtos/Warehouse/WarehouseDtos.cs
+++ b/src/Oms.Application/Dtos/Warehouse/WarehouseDtos.cs
@@ -152,6 +152,9 @@ public class WarehouseInboundListInput : WarehousePageInput
{
public int? WarehouseId { get; set; }
+ ///
+ /// 收货状态:forecasted / received / completed;空或 all 表示全部。
+ ///
public string? ReceiptStatus { get; set; }
public string? Keyword { get; set; }
@@ -314,6 +317,9 @@ public class WarehouseParcelListInput : WarehousePageInput
{
public int? WarehouseId { get; set; }
+ ///
+ /// 生命周期状态:inTransit / arrived / stored;空或 all 表示全部。
+ ///
public string? LifecycleStatus { get; set; }
public string? Keyword { get; set; }
diff --git a/src/Oms.Application/Services/Orders/PlatformStoreOrderService.cs b/src/Oms.Application/Services/Orders/PlatformStoreOrderService.cs
index eef3c11..11167d7 100644
--- a/src/Oms.Application/Services/Orders/PlatformStoreOrderService.cs
+++ b/src/Oms.Application/Services/Orders/PlatformStoreOrderService.cs
@@ -599,21 +599,73 @@ public class PlatformStoreOrderService : ApplicationService
private static Expression> BuildListPredicate(int? customerId, PlatformStoreOrderListInput input)
{
var (hasCustomerFilter, customerIdValue) = WarehouseCustomerHelper.ToCustomerFilter(customerId);
- var fulfillStatus = input.FulfillStatus?.Trim();
+ // 前端 Tab「全部」会传 all / 空;需忽略,不能按字面 FulfillStatus == "all" 过滤
+ var fulfillStatus = NormalizeFulfillStatusFilter(input.FulfillStatus);
+ var hasFulfillStatusFilter = !string.IsNullOrWhiteSpace(fulfillStatus);
var platformOrderNo = input.PlatformOrderNo?.Trim();
var hasStoreFilter = input.StoreId.HasValue;
var storeIdValue = input.StoreId.GetValueOrDefault();
- var hasFulfillStatusFilter = !string.IsNullOrWhiteSpace(fulfillStatus);
var hasPlatformOrderNoFilter = !string.IsNullOrWhiteSpace(platformOrderNo);
var hasSuspendedFilter = input.IsSuspended.HasValue;
var isSuspendedValue = input.IsSuspended.GetValueOrDefault();
- return x =>
- (!hasCustomerFilter || x.CustomerId == customerIdValue)
- && (!hasStoreFilter || x.StoreId == storeIdValue)
- && (!hasFulfillStatusFilter || x.FulfillStatus == fulfillStatus)
- && (!hasSuspendedFilter || x.IsSuspended == isSuspendedValue)
- && (!hasPlatformOrderNoFilter || x.PlatformOrderNo.Contains(platformOrderNo!));
+ return hasFulfillStatusFilter
+ ? x =>
+ (!hasCustomerFilter || x.CustomerId == customerIdValue)
+ && (!hasStoreFilter || x.StoreId == storeIdValue)
+ && x.FulfillStatus == fulfillStatus
+ && (!hasSuspendedFilter || x.IsSuspended == isSuspendedValue)
+ && (!hasPlatformOrderNoFilter || x.PlatformOrderNo.Contains(platformOrderNo!))
+ : x =>
+ (!hasCustomerFilter || x.CustomerId == customerIdValue)
+ && (!hasStoreFilter || x.StoreId == storeIdValue)
+ && (!hasSuspendedFilter || x.IsSuspended == isSuspendedValue)
+ && (!hasPlatformOrderNoFilter || x.PlatformOrderNo.Contains(platformOrderNo!));
+ }
+
+ ///
+ /// 规范化履约状态筛选:空 / all 表示不按状态过滤;已知编码统一为规范值。
+ ///
+ private static string? NormalizeFulfillStatusFilter(string? status)
+ {
+ var value = status?.Trim();
+ if (string.IsNullOrEmpty(value)
+ || value.Equals("all", StringComparison.OrdinalIgnoreCase))
+ {
+ return null;
+ }
+
+ if (value.Equals(SalesStoreFulfillStatusCodes.Pending, StringComparison.OrdinalIgnoreCase))
+ {
+ return SalesStoreFulfillStatusCodes.Pending;
+ }
+
+ if (value.Equals(SalesStoreFulfillStatusCodes.ToShip, StringComparison.OrdinalIgnoreCase))
+ {
+ return SalesStoreFulfillStatusCodes.ToShip;
+ }
+
+ if (value.Equals(SalesStoreFulfillStatusCodes.Canceled, StringComparison.OrdinalIgnoreCase))
+ {
+ return SalesStoreFulfillStatusCodes.Canceled;
+ }
+
+ if (value.Equals(SalesStoreFulfillStatusCodes.Suspended, StringComparison.OrdinalIgnoreCase))
+ {
+ return SalesStoreFulfillStatusCodes.Suspended;
+ }
+
+ if (value.Equals(SalesStoreFulfillStatusCodes.Shipped, StringComparison.OrdinalIgnoreCase))
+ {
+ return SalesStoreFulfillStatusCodes.Shipped;
+ }
+
+ if (value.Equals(SalesStoreFulfillStatusCodes.Completed, StringComparison.OrdinalIgnoreCase))
+ {
+ return SalesStoreFulfillStatusCodes.Completed;
+ }
+
+ return value;
}
private static PlatformStoreOrderOutput MapOrderOutput(
diff --git a/src/Oms.Application/Services/Plugin/PluginBrowserService.cs b/src/Oms.Application/Services/Plugin/PluginBrowserService.cs
index 6b55a8e..1aefa6b 100644
--- a/src/Oms.Application/Services/Plugin/PluginBrowserService.cs
+++ b/src/Oms.Application/Services/Plugin/PluginBrowserService.cs
@@ -10,12 +10,13 @@ using Oms.Domain.WarehouseAggregate.Repositories;
namespace Oms.Application.Services.Plugin;
///
-/// 浏览器采集插件草稿 / 查重(对齐哪哪发 wepost API)。
+/// 浏览器采集插件草稿 / 查重(对齐哪哪发插件 API)。
///
[ApiExplorerSettings(GroupName = "OMS-Plugin")]
public class PluginBrowserService : ApplicationService
{
- private static readonly TimeSpan DraftTtl = TimeSpan.FromSeconds(90);
+ // 确认页打开 / SPA 冷启动可能超过 90s,适当放宽避免「草稿已过期」误判为解析失败
+ private static readonly TimeSpan DraftTtl = TimeSpan.FromMinutes(5);
private ICustomerRepository CustomerRepository => LazyServiceProvider.GetRequiredService();
private ICParcelRepository ParcelRepository => LazyServiceProvider.GetRequiredService();
@@ -25,19 +26,20 @@ public class PluginBrowserService : ApplicationService
///
/// 缓存采集草稿,返回 key(确认页 getPackage 使用)。
+ /// 管理端须传 customerId(或会话可解析客户)。
///
[HttpPost("/plugin/browser/add")]
[Consumes("application/x-www-form-urlencoded", "multipart/form-data")]
- public async Task