1
heshaofeng
2026-03-25 37454e625df68d40897112b2e8c2e3cf4d7163e3
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_Core/BaseServices/ServiceBase.cs
@@ -12,6 +12,7 @@
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Metadata;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.Const;
using WIDESEA_Core.DB.Models;
@@ -133,8 +134,9 @@
                }
                for (int j = 0; j < results.Count(); j++)
                {
                    LinqExpressionType expressionType = searchParametersList[i].DisplayType.ToLower().GetLinqCondition();
                    if (expressionType == LinqExpressionType.In)
                    if (searchParametersList[i].DisplayType == null) continue;
                    var expressionType = searchParametersList[i].DisplayType.ToLower().GetLinqCondition();
                    if (expressionType != null && expressionType == LinqExpressionType.In)
                    {
                        Expression<Func<TEntity, bool>> expression = GetWhereExpression(property.Name, results.Select(x => x.Item3).ToArray(), null, expressionType);
                        sugarQueryable = sugarQueryable.Where(expression);
@@ -147,6 +149,100 @@
                    }
                }
            }
        }
        protected string ValidatePageOptions(PageDataOptions options)
        {
            options = options ?? new PageDataOptions();
            string where = "";
            List<SearchParameters> searchParametersList = new List<SearchParameters>();
            if (options.Filter != null && options.Filter.Count > 0)
            {
                searchParametersList.AddRange(options.Filter);
            }
            else if (!string.IsNullOrEmpty(options.Wheres))
            {
                try
                {
                    searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>();
                    options.Filter = searchParametersList;
                }
                catch { }
            }
            QueryRelativeList?.Invoke(searchParametersList);
            for (int i = 0; i < searchParametersList.Count; i++)
            {
                if (string.IsNullOrEmpty(searchParametersList[i].Value))
                {
                    continue;
                }
                PropertyInfo property = TProperties.Where(c => c.Name.ToUpper() == searchParametersList[i].Name.ToUpper()).FirstOrDefault();
                if (property == null) continue;
                (bool, string, object) result = property.ValidationVal(searchParametersList[i].Value);
                if (!result.Item1)
                {
                    continue;
                }
                LinqExpressionType expressionType = searchParametersList[i].DisplayType.GetLinqCondition();
                if (expressionType == LinqExpressionType.Equal)
                {
                    if (string.IsNullOrEmpty(where))
                    {
                        // é’ˆå¯¹å­—符串类型的字段使用模糊查询
                        //where += $"{searchParametersList[i].Name} like '%{searchParametersList[i].Value}%'";
                        if (searchParametersList[i].Value.ToLower() == "true" || searchParametersList[i].Value.ToLower() == "false")
                        {
                            where += $" {searchParametersList[i].Name} = '{searchParametersList[i].Value.ToLower()}'";
                        }
                        else
                        {
                            where += $"[{searchParametersList[i].Name}] like '%{searchParametersList[i].Value}%'";
                        }
                    }
                    else
                    {
                        // é’ˆå¯¹å¸ƒå°”类型字段进行精确查询
                        if (searchParametersList[i].Value.ToLower() == "true" || searchParametersList[i].Value.ToLower() == "false")
                        {
                            where += $" and {searchParametersList[i].Name} = '{searchParametersList[i].Value.ToLower()}'";
                        }
                        else
                        {
                            where += $" and [{searchParametersList[i].Name}] like '%{searchParametersList[i].Value}%'";
                        }
                    }
                }
                else
                {
                    if (searchParametersList[i].DisplayType.GetLinqCondition() == LinqExpressionType.ThanOrEqual)
                    {
                        if (string.IsNullOrEmpty(where))
                            where += $"{searchParametersList[i].Name} >= '{searchParametersList[i].Value}'";
                        else
                            where += $" and {searchParametersList[i].Name} >= '{searchParametersList[i].Value}'";
                    }
                    else if (searchParametersList[i].DisplayType.GetLinqCondition() == LinqExpressionType.LessThanOrEqual)
                    {
                        if (string.IsNullOrEmpty(where))
                            where += $"{searchParametersList[i].Name} <= '{searchParametersList[i].Value}'";
                        else
                            where += $" and {searchParametersList[i].Name} <= '{searchParametersList[i].Value}'";
                    }
                    else
                    {
                        if (string.IsNullOrEmpty(where))
                            where += $"{searchParametersList[i].Name} {searchParametersList[i].DisplayType} '{searchParametersList[i].Value}'";
                        else
                            where += $" and {searchParametersList[i].Name} {searchParametersList[i].DisplayType} '{searchParametersList[i].Value}'";
                    }
                }
            }
            return where;
        }
        protected Expression<Func<TEntity, bool>> GetWhereExpression(string propertyName, object propertyValue, ParameterExpression parameter, LinqExpressionType expressionType)
@@ -358,19 +454,138 @@
            Type t = typeof(TEntity);
            if (pageData.Value == null) return new PageGridData<object>(total: 0, null);
            string keyName = t.GetKeyName();
            ////生成查询条件
            //Expression<Func<TEntity, bool>> whereExpression = keyName.CreateExpression<TEntity>(pageData.Value, LinqExpressionType.Equal);
            int totalCount = 0;
            PropertyInfo propertyInfo = t.GetProperties().FirstOrDefault(x => x.GetCustomAttribute<Navigate>() != null);
            List<ExpandoObject> detailList = new List<ExpandoObject>();
            if (propertyInfo != null)
            {
                Type detailType = propertyInfo.PropertyType.GetGenericArguments()[0];
                Navigate navigate = propertyInfo.GetCustomAttribute<Navigate>();
                List<ExpandoObject> list = BaseDal.Db.Queryable(detailType.Name, "detail").Where(navigate.GetName(), "=", pageData.Value).ToPageList(pageData.Page, pageData.Rows, ref totalCount);
                return new PageGridData<ExpandoObject>(totalCount, list);
                detailList = BaseDal.Db.Queryable(detailType.Name, "detail")
                    .Where(navigate.GetName(), "=", pageData.Value)
                    .ToPageList(pageData.Page, pageData.Rows, ref totalCount);
                if (detailList.Any())
                {
                    // 1. æå–明细有效barcode
                    List<string> allBarcodes = new List<string>();
                    foreach (var expando in detailList)
                    {
                        var detailDict = (IDictionary<string, object>)expando;
                        if (detailDict.ContainsKey("barcode") && detailDict["barcode"] != null)
                        {
                            string barcodeValue = (detailDict["barcode"] as string)?.Trim() ?? string.Empty;
                            if (!string.IsNullOrWhiteSpace(barcodeValue))
                            {
                                allBarcodes.Add(barcodeValue);
                            }
                        }
                    }
                    if (allBarcodes.Count == 0)
                    {
                        foreach (var expando in detailList)
                        {
                            var detailDict = (IDictionary<string, object>)expando;
                            detailDict["palletCode"] = "";
                        }
                        return new PageGridData<ExpandoObject>(totalCount, detailList);
                    }
                    // 2. æŸ¥åº“存明细表,获取barcode â†’ StockId映射
                    Dictionary<string, object> barcodeToStockIdDict = new Dictionary<string, object>();
                    var distinctBarcodes = allBarcodes.Distinct().ToList();
                    var barcodeStockIdList = BaseDal.Db.Queryable("Dt_StockInfoDetail", "sd")
                        .In("sd.barcode", distinctBarcodes)
                        .Select("sd.barcode, sd.StockId")
                        .ToList();
                    foreach (var item in barcodeStockIdList)
                    {
                        if (item == null) continue;
                        var itemDict = (IDictionary<string, object>)item;
                        if (itemDict.ContainsKey("barcode") && itemDict["barcode"] != null)
                        {
                            string barcode = (itemDict["barcode"] as string)?.Trim() ?? string.Empty;
                            object stockId = itemDict.ContainsKey("StockId") ? itemDict["StockId"] : null;
                            if (!string.IsNullOrWhiteSpace(barcode) && !barcodeToStockIdDict.ContainsKey(barcode))
                            {
                                barcodeToStockIdDict.Add(barcode, stockId);
                            }
                        }
                    }
                    if (barcodeToStockIdDict.Count == 0)
                    {
                        foreach (var expando in detailList)
                        {
                            var detailDict = (IDictionary<string, object>)expando;
                            detailDict["palletCode"] = "";
                        }
                        return new PageGridData<ExpandoObject>(totalCount, detailList);
                    }
                    Dictionary<object, string> stockIdToPalletDict = new Dictionary<object, string>();
                    var allStockIds = barcodeToStockIdDict.Values.Distinct().ToList();
                    var stockIdPalletList = BaseDal.Db.Queryable("Dt_StockInfo", "s")
                        .In("s.Id", allStockIds)
                        .Select("s.Id, s.PalletCode")
                        .ToList();
                    // æå– PalletCode
                    foreach (var item in stockIdPalletList)
                    {
                        if (item == null) continue;
                        var itemDict = (IDictionary<string, object>)item;
                        if (itemDict.ContainsKey("Id") && itemDict["Id"] != null)
                        {
                            object stockId = itemDict["Id"];
                            string palletCode = itemDict.ContainsKey("PalletCode") && itemDict["PalletCode"] != null
                                ? (itemDict["PalletCode"] as string)?.Trim() ?? string.Empty
                                : string.Empty;
                            if (!stockIdToPalletDict.ContainsKey(stockId))
                            {
                                stockIdToPalletDict.Add(stockId, palletCode);
                            }
                        }
                    }
                    // 5. ç»™æ˜Žç»†çš„palletCode字段赋值主表的PalletCode值
                    foreach (var expando in detailList)
                    {
                        var detailDict = (IDictionary<string, object>)expando;
                        string palletValue = string.Empty;
                        if (detailDict.ContainsKey("barcode") && detailDict["barcode"] != null)
                        {
                            string barcode = (detailDict["barcode"] as string)?.Trim() ?? string.Empty;
                            // é€šè¿‡barcode获取StockId
                            if (!string.IsNullOrWhiteSpace(barcode) && barcodeToStockIdDict.TryGetValue(barcode, out var stockId))
                            {
                                // é€šè¿‡StockId获取主表的PalletCode
                                stockIdToPalletDict.TryGetValue(stockId, out palletValue);
                            }
                        }
                        // åŠ¨æ€æ›´æ–°/添加palletCode字段
                        if (detailDict.ContainsKey("palletCode"))
                        {
                            detailDict["palletCode"] = palletValue;
                        }
                        else
                        {
                            detailDict.Add("palletCode", palletValue);
                        }
                    }
                }
            }
            return new PageGridData<object>(total: 0, null);
            return new PageGridData<ExpandoObject>(totalCount, detailList);
        }
        /// <summary>
@@ -445,6 +660,10 @@
                        saveModel.MainData.Remove(keyPro.Name.FirstLetterToLower());
                    }
                }
                    saveModel.MainData["CreateType"] = (int)OrderCreateTypeEnum.CreateInSystem;
                    saveModel.MainData["ReturnToMESStatus"] = 5;
                TEntity entity = saveModel.MainData.DicToModel<TEntity>();
                if (saveModel.DetailData == null || saveModel.DetailData.Count == 0)
                {