From 346f41c204a482f82fd322e25f59f63b12ef0586 Mon Sep 17 00:00:00 2001 From: zzh <1368735060@qq.com> Date: Tue, 27 Oct 2026 09:48:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=BF=90=E5=8D=95=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E7=AD=9B=E9=80=89=E8=A1=A5=E9=BD=90=E6=8B=A6=E6=88=AA/?= =?UTF-8?q?=E5=81=8F=E8=BF=9C/COD=E5=8F=8A=E5=A4=84=E7=90=86=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E7=AD=89=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- .../Orders/OrderRepository.cs | 127 +++++++++++++++++- 1 file changed, 120 insertions(+), 7 deletions(-) diff --git a/src/Oms.SqlSugarCore/Orders/OrderRepository.cs b/src/Oms.SqlSugarCore/Orders/OrderRepository.cs index 90288bc..df1e482 100644 --- a/src/Oms.SqlSugarCore/Orders/OrderRepository.cs +++ b/src/Oms.SqlSugarCore/Orders/OrderRepository.cs @@ -470,15 +470,51 @@ public class OrderRepository : OmsSqlSugarRepository, IOrderRepository, I q => q.Where(x => x.AllocationPendingReason == null || x.AllocationPendingReason == string.Empty), q => q.Where(x => x.AllocationPendingReason != null && x.AllocationPendingReason != string.Empty)); } - else if (string.Equals(field, "isPaid", StringComparison.OrdinalIgnoreCase)) + else if (string.Equals(field, "isPaid", StringComparison.OrdinalIgnoreCase) + || string.Equals(field, "isIntercept", StringComparison.OrdinalIgnoreCase) + || string.Equals(field, "isRemote", StringComparison.OrdinalIgnoreCase) + || string.Equals(field, "isCod", StringComparison.OrdinalIgnoreCase)) { - if (byte.TryParse(value, out var paid) || TryParseBoolByte(value, out paid)) + query = ApplyByteFlagField(query, field, op, value, values); + } + else if (string.Equals(field, "handleStatus", StringComparison.OrdinalIgnoreCase)) + { + query = ApplyStringField(query, op, value, values, + (q, v) => q.Where(x => (x.HandleStatus ?? string.Empty).Contains(v)), + (q, v) => q.Where(x => x.HandleStatus == v), + (q, v) => q.Where(x => x.HandleStatus != v), + (q, list) => q.Where(x => x.HandleStatus != null && list.Contains(x.HandleStatus)), + (q, list) => q.Where(x => x.HandleStatus == null || !list.Contains(x.HandleStatus)), + q => q.Where(x => x.HandleStatus == null || x.HandleStatus == string.Empty), + q => q.Where(x => x.HandleStatus != null && x.HandleStatus != string.Empty)); + } + else if (string.Equals(field, "previousOrderStatus", StringComparison.OrdinalIgnoreCase)) + { + query = ApplyStringField(query, op, value, values, + (q, v) => q.Where(x => (x.PreviousOrderStatus ?? string.Empty).Contains(v)), + (q, v) => q.Where(x => x.PreviousOrderStatus == v), + (q, v) => q.Where(x => x.PreviousOrderStatus != v), + (q, list) => q.Where(x => x.PreviousOrderStatus != null && list.Contains(x.PreviousOrderStatus)), + (q, list) => q.Where(x => x.PreviousOrderStatus == null || !list.Contains(x.PreviousOrderStatus)), + q => q.Where(x => x.PreviousOrderStatus == null || x.PreviousOrderStatus == string.Empty), + q => q.Where(x => x.PreviousOrderStatus != null && x.PreviousOrderStatus != string.Empty)); + } + else if (string.Equals(field, "stockBindStatus", StringComparison.OrdinalIgnoreCase)) + { + var statusValue = values.Count == 1 ? values[0] : value; + if (!string.IsNullOrWhiteSpace(statusValue) + && (op is "eq" or "in" or "like" || string.IsNullOrWhiteSpace(op))) { - query = op switch - { - "ne" => query.Where(x => x.IsPaid != paid), - _ => query.Where(x => x.IsPaid == paid) - }; + query = ApplyStockBindStatusFilter(query, statusValue); + } + } + else if (string.Equals(field, "fulfillProgress", StringComparison.OrdinalIgnoreCase)) + { + var progressValue = values.Count == 1 ? values[0] : value; + if (!string.IsNullOrWhiteSpace(progressValue) + && (op is "eq" or "in" or "like" || string.IsNullOrWhiteSpace(op))) + { + query = ApplyFulfillProgressFilter(query, progressValue); } } else if (string.Equals(field, "payableAmount", StringComparison.OrdinalIgnoreCase)) @@ -557,6 +593,83 @@ public class OrderRepository : OmsSqlSugarRepository, IOrderRepository, I return false; } + private static List ResolveBoolBytes(string value, List values) + { + var raw = values.Count > 0 + ? values + : string.IsNullOrWhiteSpace(value) + ? [] + : value.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) + .ToList(); + var flags = new List(); + foreach (var item in raw) + { + if (byte.TryParse(item, out var flag) || TryParseBoolByte(item, out flag)) + { + flags.Add(flag); + } + } + + return flags.Distinct().ToList(); + } + + /// + /// 字节布尔标志筛选(0/1),支持 eq / ne / in / notIn。 + /// + private static ISugarQueryable ApplyByteFlagField( + ISugarQueryable query, + string field, + string op, + string value, + List values) + { + var flags = ResolveBoolBytes(value, values); + if (flags.Count == 0) + { + return query; + } + + var negate = op is "ne" or "notIn"; + var multi = op is "in" or "notIn" || flags.Count > 1; + if (string.Equals(field, "isPaid", StringComparison.OrdinalIgnoreCase)) + { + return negate + ? query.Where(x => !flags.Contains(x.IsPaid)) + : multi + ? query.Where(x => flags.Contains(x.IsPaid)) + : query.Where(x => x.IsPaid == flags[0]); + } + + if (string.Equals(field, "isIntercept", StringComparison.OrdinalIgnoreCase)) + { + return negate + ? query.Where(x => !flags.Contains(x.IsIntercept)) + : multi + ? query.Where(x => flags.Contains(x.IsIntercept)) + : query.Where(x => x.IsIntercept == flags[0]); + } + + if (string.Equals(field, "isRemote", StringComparison.OrdinalIgnoreCase)) + { + return negate + ? query.Where(x => !flags.Contains(x.IsRemote)) + : multi + ? query.Where(x => flags.Contains(x.IsRemote)) + : query.Where(x => x.IsRemote == flags[0]); + } + + if (string.Equals(field, "isCod", StringComparison.OrdinalIgnoreCase)) + { + return negate + ? query.Where(x => !flags.Contains(x.IsCod)) + : multi + ? query.Where(x => flags.Contains(x.IsCod)) + : query.Where(x => x.IsCod == flags[0]); + } + + return query; + } + private static ISugarQueryable ApplyStringField( ISugarQueryable query, string op,