From a8756c3526832332db4ef5685348d9b188c2bf2b Mon Sep 17 00:00:00 2001
From: wangxinhui <wangxinhui@hnkhzn.com>
Date: 星期六, 13 九月 2025 08:36:44 +0800
Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/MeiRuiAn/HuaiAn

---
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockViewService.cs |  458 +++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 394 insertions(+), 64 deletions(-)

diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockViewService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockViewService.cs"
index 7ff0ca5..0bcc37b 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockViewService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockViewService.cs"
@@ -1,5 +1,7 @@
 锘�
 using HslCommunication.Secs.Types;
+using Magicodes.ExporterAndImporter.Core;
+using Magicodes.ExporterAndImporter.Excel;
 using Microsoft.AspNetCore.Http;
 using SqlSugar;
 using System;
@@ -12,12 +14,15 @@
 using System.Reflection;
 using System.Text;
 using System.Threading.Tasks;
+using WIDESEA_Common.LocationEnum;
 using WIDESEA_Core;
 using WIDESEA_Core.BaseRepository;
 using WIDESEA_Core.BaseServices;
 using WIDESEA_Core.Const;
+using WIDESEA_Core.DB.Models;
 using WIDESEA_Core.Enums;
 using WIDESEA_Core.Helper;
+using WIDESEA_Core.HostedService;
 using WIDESEA_Core.Utilities;
 using WIDESEA_DTO.Stock;
 using WIDESEA_IStockRepository;
@@ -39,86 +44,172 @@
 
         public virtual PageGridData<StockViewDTO> GetPageData(PageDataOptions options)
         {
-            List<StockViewDTO> stockViewDTOs = new List<StockViewDTO>();
-
-            string where = string.Empty;
-            ISugarQueryable<Dt_StockInfo> sugarQueryable1 = _dbBase.Queryable<Dt_StockInfo>().Includes(x => x.Details);
-            if (!string.IsNullOrEmpty(options.Wheres))
+            try
             {
-                try
+                ISugarQueryable<Dt_StockInfo> sugarQueryable1 = _dbBase.Queryable<Dt_StockInfo>().Includes(x => x.Details);
+                if (!string.IsNullOrEmpty(options.Wheres))
                 {
-                    List<SearchParameters> searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>();
-                    if (searchParametersList.Count > 0)
+                    try
                     {
+                        List<SearchParameters> searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>();
+                        if (searchParametersList?.Any() == true)
                         {
-                            SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.MaterielCode).FirstLetterToLower());
-                            if (searchParameters != null)
+                            foreach (var param in searchParametersList)
                             {
-                                sugarQueryable1 = sugarQueryable1.Where(x => x.Details.Any(v => v.MaterielCode.Contains(searchParameters.Value)));
+                                switch (param.Name)
+                                {
+                                    case var name when name == nameof(Dt_StockInfoDetail.MaterielCode).FirstLetterToLower():
+                                        if (!string.IsNullOrEmpty(param.Value?.ToString()))
+                                        {
+                                            sugarQueryable1 = sugarQueryable1
+                                                .Where(x => x.Details.Any(v => v.MaterielCode.Contains(param.Value.ToString())));
+                                        }
+                                        break;
+                                    case var name when name == nameof(Dt_StockInfoDetail.BatchNo).FirstLetterToLower():
+                                        if (!string.IsNullOrEmpty(param.Value?.ToString()))
+                                        {
+                                            sugarQueryable1 = sugarQueryable1
+                                                .Where(x => x.Details.Any(v => v.BatchNo.Contains(param.Value.ToString())));
+                                        }
+                                        break;
+
+                                    case var name when name == nameof(Dt_StockInfo.LocationCode).FirstLetterToLower():
+                                        if (!string.IsNullOrEmpty(param.Value?.ToString()))
+                                        {
+                                            sugarQueryable1 = sugarQueryable1
+                                                .Where(x => x.LocationCode == param.Value.ToString());
+                                        }
+                                        break;
+
+                                    case var name when name == nameof(Dt_StockInfo.CreateDate).FirstLetterToLower():
+                                        if (DateTime.TryParse(param.Value?.ToString(), out DateTime minDate))
+                                        {
+                                            LinqExpressionType expressionType = param.DisplayType.GetLinqCondition();
+                                            if(expressionType == LinqExpressionType.ThanOrEqual)
+                                            {
+                                                sugarQueryable1 = sugarQueryable1.Where(x => x.CreateDate >= minDate);
+                                            }
+                                            else if(expressionType == LinqExpressionType.LessThanOrEqual)
+                                            {
+                                                sugarQueryable1 = sugarQueryable1.Where(x => x.CreateDate <= minDate);
+                                            }              
+                                        }
+                                        break;
+                                    case var name when name == nameof(Dt_StockInfoDetail.EffectiveDate).FirstLetterToLower():
+                                        // 鍓嶇浼犻�掔殑鍙傛暟闇�鏄� yyyy-MM-dd 鏍煎紡锛堝 "2025-05-08"锛夛紝鐩存帴浣滀负瀛楃涓插鐞�
+                                        string effectiveDateStr = param.Value?.ToString().Trim();
+                                        if (!string.IsNullOrEmpty(effectiveDateStr) && effectiveDateStr.Length == 10)
+                                        {
+                                            LinqExpressionType expressionType = param.DisplayType.GetLinqCondition();
+                                            if (expressionType == LinqExpressionType.ThanOrEqual)
+                                            {
+                                                sugarQueryable1 = sugarQueryable1.Where(x => x.Details
+                                                    .Any(d =>!string.IsNullOrEmpty(d.EffectiveDate) && d.EffectiveDate.CompareTo(effectiveDateStr) >= 0));      
+                                            }
+                                            else if (expressionType == LinqExpressionType.LessThanOrEqual)
+                                            {
+                                                sugarQueryable1 = sugarQueryable1.Where(x => x.Details
+                                                    .Any(d =>!string.IsNullOrEmpty(d.EffectiveDate) && d.EffectiveDate.CompareTo(effectiveDateStr) <= 0));
+                                                        
+                                                        
+                                            }
+                                        }
+                                        break;
+                                }
                             }
                         }
-
-                        {
-                            SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.BatchNo).FirstLetterToLower());
-                            if (searchParameters != null)
-                            {
-                                sugarQueryable1 = sugarQueryable1.Where(x => x.Details.Any(v => v.BatchNo.Contains(searchParameters.Value)));
-                            }
-                        }
-
                     }
-
+                    catch (Exception ex)
+                    {
+                    }
                 }
-                catch { }
-            }
 
-            EntityProperties.ValidatePageOptions(options, ref sugarQueryable1);
+                string whereSto = GetDataRole(typeof(Dt_StockInfo));
+                sugarQueryable1 = sugarQueryable1.Where(whereSto);
 
-            ISugarQueryable<Dt_LocationInfo> sugarQueryable = _dbBase.Queryable<Dt_LocationInfo>();
+                EntityProperties.ValidatePageOptions(options, ref sugarQueryable1);
 
-            EntityProperties.ValidatePageOptions(options, ref sugarQueryable);
+                string whereLo = GetDataRole(typeof(Dt_LocationInfo));
+                ISugarQueryable<Dt_LocationInfo> sugarQueryable = _dbBase.Queryable<Dt_LocationInfo>()
+                    .Where(whereLo);
+                EntityProperties.ValidatePageOptions(options, ref sugarQueryable);
 
-            ISugarQueryable<StockViewDTO> list = sugarQueryable1.InnerJoin(sugarQueryable, (b, a) => a.LocationCode == b.LocationCode).Select((b, a)
-                => new StockViewDTO
+                ISugarQueryable<StockViewDTO> list = sugarQueryable1
+                    .InnerJoin(sugarQueryable, (b, a) => a.LocationCode == b.LocationCode)
+                    .Select((b, a) => new StockViewDTO
+                    {
+                        LocationCode = b.LocationCode,
+                        Expirationlabel = b.Expirationlabel,
+                        Column = a.Column,
+                        WarehouseId = b.WarehouseId,
+                        CreateDate = b.CreateDate,
+                        Creater = b.Creater,
+                        Depth = a.Depth,
+                        EnalbeStatus = a.EnableStatus,
+                        Layer = a.Layer,
+                        LocationName = a.LocationName,
+                        LocationStatus = a.LocationStatus,
+                        LocationType = a.LocationType,
+                        Modifier = b.Modifier,
+                        ModifyDate = b.ModifyDate,
+                        PalletCode = b.PalletCode,
+                        StockRemark = b.Remark,
+                        RoadwayNo = a.RoadwayNo,
+                        Row = a.Row,
+                        StockId = b.Id,
+                        StockStatus = b.StockStatus,
+                        Details = b.Details,
+                    });
+
+                // 骞冲簱浣嶆暟鎹煡璇�
+                var pklist = sugarQueryable1
+                    .Where(b => b.LocationCode == "骞冲簱浣�")
+                    .Select(b => new StockViewDTO
+                    {
+                        LocationCode = b.LocationCode,
+                        Column = 0,
+                        WarehouseId = b.WarehouseId,
+                        CreateDate = b.CreateDate,
+                        Expirationlabel = b.Expirationlabel,
+                        Creater = b.Creater,
+                        Depth = 0,
+                        EnalbeStatus = EnableStatusEnum.Normal.ObjToInt(),
+                        Layer = 0,
+                        LocationName = "骞冲簱浣�",
+                        LocationStatus = LocationStatusEnum.InStock.ObjToInt(),
+                        LocationType = LocationTypeEnum.Undefined.ObjToInt(),
+                        Modifier = b.Modifier,
+                        ModifyDate = b.ModifyDate,
+                        PalletCode = b.PalletCode,
+                        StockRemark = b.Remark,
+                        RoadwayNo = "骞冲簱",
+                        Row = 0,
+                        StockId = b.Id,
+                        StockStatus = b.StockStatus,
+                        Details = b.Details,
+                    });
+
+                int totalCount = 0;
+                int pktotalCount = 0;
+                var stockViewDTOs = list.ToPageList(options.Page, options.Rows, ref totalCount);
+                stockViewDTOs.AddRange(pklist.ToPageList(options.Page, options.Rows, ref pktotalCount));
+
+                stockViewDTOs.ForEach(x =>
                 {
-                    WarehouseId=a.WarehouseId,
-                    LocationCode = b.LocationCode,
-                    Column = a.Column,
-                    CreateDate = b.CreateDate,
-                    Creater = b.Creater,
-                    Depth = a.Depth,
-                    EnalbeStatus = a.EnableStatus,
-                    Layer = a.Layer,
-                    WarehouseId = b.WarehouseId,
-                    LocationName = a.LocationName,
-                    LocationStatus = a.LocationStatus,
-                    LocationType = a.LocationType,
-                    Modifier = b.Modifier,
-                    ModifyDate = b.ModifyDate,
-                    PalletCode = b.PalletCode,
-                    StockRemark = b.Remark,
-                    RoadwayNo = a.RoadwayNo,
-                    Row = a.Row,
-                    StockId = b.Id,
-                    StockStatus = b.StockStatus,
-                    Details = b.Details,
+                    x.MaterielCode = string.Join(",", x.Details.Select(d => d.MaterielCode).Distinct());
+                    x.BatchNo = string.Join(",", x.Details.Select(d => d.BatchNo).Distinct());
+                    x.MaterielSpec = x.Details.FirstOrDefault()?.MaterielSpec ?? "";
+                    x.MaterielName = x.Details.FirstOrDefault()?.MaterielName ?? "";
                 });
 
-
-            int totalCount = 0;
-
-            stockViewDTOs = list.ToPageList(options.Page, options.Rows, ref totalCount);
-
-            stockViewDTOs.ForEach(x =>
-            {
-                x.MaterielCode = string.Join(",", x.Details.Select(x => x.MaterielCode).Distinct());
-                x.BatchNo = string.Join(",", x.Details.Select(x => x.BatchNo).Distinct());
+                return new PageGridData<StockViewDTO>(totalCount + pktotalCount, stockViewDTOs);
             }
-            );
-
-            return new PageGridData<StockViewDTO>(totalCount, stockViewDTOs);
-
+            catch (Exception ex)
+            {
+            }
+            return new PageGridData<StockViewDTO>();
         }
+
 
         public virtual object GetDetailPage(PageDataOptions pageData)
         {
@@ -136,11 +227,250 @@
                 Navigate? navigate = propertyInfo.GetCustomAttribute<Navigate>();
                 if (navigate != null)
                 {
-                    List<ExpandoObject> list = _dbBase.Queryable(detailType.Name, "detail").Where(navigate.GetName(), "=", pageData.Value).ToPageList(pageData.Page, pageData.Rows, ref totalCount);
-                    return new PageGridData<ExpandoObject>(totalCount, list);
+                    List<Dt_StockInfoDetail> list = _dbBase.Queryable<Dt_StockInfoDetail>().Where(navigate.GetName(), "=", pageData.Value).ToPageList(pageData.Page, pageData.Rows, ref totalCount);
+                    decimal sum = 0;
+                    list.ForEach(x =>
+                    {
+                        sum += Convert.ToDecimal(x.StockQuantity);
+                    });
+                    PageGridData<Dt_StockInfoDetail> pageGridData = new PageGridData<Dt_StockInfoDetail>()
+                    {
+                        Total = totalCount,
+                        Rows = list,
+                        Summary = new
+                        {
+                            StockQuantity = Math.Round(sum, 3),
+                        }
+                    };
+                    return pageGridData;
                 }
             }
             return new PageGridData<object>(total: 0, null);
         }
+        public virtual WebResponseContent Export(PageDataOptions options)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                Type t = typeof(StockViewDTO);
+
+                string savePath = AppDomain.CurrentDomain.BaseDirectory + $"ExcelExport";
+                IExporter exporter = new ExcelExporter();
+                options.Page = 1;
+                options.Rows = 30;
+                options.Order = "desc";
+                options.Sort = "stockId";
+                List<StockViewDTO> stockViewDTOs = new List<StockViewDTO>();
+
+                string where = string.Empty;
+                ISugarQueryable<Dt_StockInfo> sugarQueryable1 = _dbBase.Queryable<Dt_StockInfo>().Includes(x => x.Details);
+                if (!string.IsNullOrEmpty(options.Wheres))
+                {
+                    try
+                    {
+                        List<SearchParameters> searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>();
+                        if (searchParametersList?.Any() == true)
+                        {
+                            foreach (var param in searchParametersList)
+                            {
+                                switch (param.Name)
+                                {
+                                    case var name when name == nameof(Dt_StockInfoDetail.MaterielCode).FirstLetterToLower():
+                                        if (!string.IsNullOrEmpty(param.Value?.ToString()))
+                                        {
+                                            sugarQueryable1 = sugarQueryable1
+                                                .Where(x => x.Details.Any(v => v.MaterielCode.Contains(param.Value.ToString())));
+                                        }
+                                        break;
+                                    case var name when name == nameof(Dt_StockInfoDetail.BatchNo).FirstLetterToLower():
+                                        if (!string.IsNullOrEmpty(param.Value?.ToString()))
+                                        {
+                                            sugarQueryable1 = sugarQueryable1
+                                                .Where(x => x.Details.Any(v => v.BatchNo.Contains(param.Value.ToString())));
+                                        }
+                                        break;
+
+                                    case var name when name == nameof(Dt_StockInfo.LocationCode).FirstLetterToLower():
+                                        if (!string.IsNullOrEmpty(param.Value?.ToString()))
+                                        {
+                                            sugarQueryable1 = sugarQueryable1
+                                                .Where(x => x.LocationCode == param.Value.ToString());
+                                        }
+                                        break;
+
+                                    case var name when name == nameof(Dt_StockInfo.CreateDate).FirstLetterToLower():
+                                        if (DateTime.TryParse(param.Value?.ToString(), out DateTime minDate))
+                                        {
+                                            LinqExpressionType expressionType = param.DisplayType.GetLinqCondition();
+                                            if (expressionType == LinqExpressionType.ThanOrEqual)
+                                            {
+                                                sugarQueryable1 = sugarQueryable1.Where(x => x.CreateDate >= minDate);
+                                            }
+                                            else if (expressionType == LinqExpressionType.LessThanOrEqual)
+                                            {
+                                                sugarQueryable1 = sugarQueryable1.Where(x => x.CreateDate <= minDate);
+                                            }
+                                        }
+                                        break;
+                                    case var name when name == nameof(Dt_StockInfoDetail.EffectiveDate).FirstLetterToLower():
+                                        // 鍓嶇浼犻�掔殑鍙傛暟闇�鏄� yyyy-MM-dd 鏍煎紡锛堝 "2025-05-08"锛夛紝鐩存帴浣滀负瀛楃涓插鐞�
+                                        string effectiveDateStr = param.Value?.ToString().Trim();
+                                        if (!string.IsNullOrEmpty(effectiveDateStr) && effectiveDateStr.Length == 10)
+                                        {
+                                            LinqExpressionType expressionType = param.DisplayType.GetLinqCondition();
+                                            if (expressionType == LinqExpressionType.ThanOrEqual)
+                                            {
+                                                sugarQueryable1 = sugarQueryable1.Where(x => x.Details
+                                                    .Any(d => !string.IsNullOrEmpty(d.EffectiveDate) && d.EffectiveDate.CompareTo(effectiveDateStr) >= 0));
+                                            }
+                                            else if (expressionType == LinqExpressionType.LessThanOrEqual)
+                                            {
+                                                sugarQueryable1 = sugarQueryable1.Where(x => x.Details
+                                                    .Any(d => !string.IsNullOrEmpty(d.EffectiveDate) && d.EffectiveDate.CompareTo(effectiveDateStr) <= 0));
+
+
+                                            }
+                                        }
+                                        break;
+                                }
+                            }
+                        }
+                    }
+                    catch (Exception ex)
+                    {
+                    }
+                }
+                string whereSto = GetDataRole(typeof(Dt_StockInfo));
+                sugarQueryable1 = sugarQueryable1.Where(whereSto);
+                EntityProperties.ValidatePageOptions(options, ref sugarQueryable1);
+
+                string whereLo = GetDataRole(typeof(Dt_LocationInfo));
+                ISugarQueryable<Dt_LocationInfo> sugarQueryable = _dbBase.Queryable<Dt_LocationInfo>().Where(whereLo);
+
+                EntityProperties.ValidatePageOptions(options, ref sugarQueryable);
+
+                ISugarQueryable<StockViewDTO> list = sugarQueryable1.InnerJoin(sugarQueryable, (b, a) => a.LocationCode == b.LocationCode).Select((b, a)
+                    => new StockViewDTO
+                    {
+                        LocationCode = b.LocationCode,
+                        Column = a.Column,
+                        Expirationlabel = b.Expirationlabel,
+                        WarehouseId = b.WarehouseId,
+                        CreateDate = b.CreateDate,
+                        Creater = b.Creater,
+                        Depth = a.Depth,
+                        EnalbeStatus = a.EnableStatus,
+                        Layer = a.Layer,
+                        LocationName = a.LocationName,
+                        LocationStatus = a.LocationStatus,
+                        LocationType = a.LocationType,
+                        Modifier = b.Modifier,
+                        ModifyDate = b.ModifyDate,
+                        PalletCode = b.PalletCode,
+                        StockRemark = b.Remark,
+                        RoadwayNo = a.RoadwayNo,
+                        Row = a.Row,
+                        StockId = b.Id,
+                        StockStatus = b.StockStatus,
+                        Details = b.Details,
+                    });
+
+                var pklist = sugarQueryable1.Where(b => b.LocationCode == "骞冲簱浣�").Select(b => new StockViewDTO
+                {
+                    LocationCode = b.LocationCode,
+                    Column = 0,
+                    WarehouseId = b.WarehouseId,
+                    Expirationlabel = b.Expirationlabel,
+                    CreateDate = b.CreateDate,
+                    Creater = b.Creater,
+                    Depth = 0,
+                    EnalbeStatus = EnableStatusEnum.Normal.ObjToInt(),
+                    Layer = 0,
+                    LocationName = "骞冲簱浣�",
+                    LocationStatus = LocationStatusEnum.InStock.ObjToInt(),
+                    LocationType = LocationTypeEnum.Undefined.ObjToInt(),
+                    Modifier = b.Modifier,
+                    ModifyDate = b.ModifyDate,
+                    PalletCode = b.PalletCode,
+                    StockRemark = b.Remark,
+                    RoadwayNo = "骞冲簱",
+                    Row = 0,
+                    StockId = b.Id,
+                    StockStatus = b.StockStatus,
+                    Details = b.Details,
+                });
+                stockViewDTOs = list.ToList();
+                stockViewDTOs.AddRange(pklist.ToList());
+                stockViewDTOs.ForEach(x =>
+                {
+                    x.MaterielCode = (string.Join(",", x.Details.Select(x => x.MaterielCode).Distinct())) ?? "绌虹";
+                    x.BatchNo = (string.Join(",", x.Details.Select(x => x.BatchNo).Distinct())) ?? "鏃�";
+                    x.StockCounts = Math.Round(x.Details.Sum(x => x.StockQuantity),3).ToString() + x.Details.FirstOrDefault()?.Unit;
+                    x.MaterielSpec= x.Details.FirstOrDefault()?.MaterielSpec ?? "";
+                    x.MaterielName= x.Details.FirstOrDefault()?.MaterielName ?? "";
+                }
+                );
+
+                byte[] data = exporter.ExportAsByteArray(stockViewDTOs).Result;
+                
+                string fileName = "搴撳瓨瑙嗗浘.xlsx";
+               
+                FileHelper.WriteFile(savePath, fileName, data);
+
+                content = WebResponseContent.Instance.OK(data: savePath + "\\" + fileName);
+            }
+            catch (Exception ex)
+            {
+                content = WebResponseContent.Instance.Error(ex.Message);
+            }
+            return content;
+        }
+        private string GetDataRole(Type type)
+        {
+            try
+            {
+                UserRole? userRole = PermissionDataHostService.UserRoles.FirstOrDefault(x => x.UserId == App.User.UserId);
+                if (userRole == null)
+                    throw new Exception($"鏃犳潈闄�");
+
+                if (type.IsAssignableFrom(typeof(BaseWarehouseEntity)) || type.GetProperty(nameof(BaseWarehouseEntity.WarehouseId)) != null)
+                {
+                    if (userRole.WarehouseIds.Count > 0)
+                    {
+                        return $"{nameof(BaseWarehouseEntity.WarehouseId)} in ({userRole.WarehouseIds.Serialize().Replace("[", "").Replace("]", "")})";
+                    }
+
+                    else
+                        return $"1 != 1";
+                }
+                else
+                {
+                    return "1 = 1";
+                }
+
+                //UserRole? userRole = PermissionDataHostService.UserRoles.FirstOrDefault(x => x.UserId == App.User.UserId);
+                //if (userRole == null)
+                //    throw new Exception($"鏃犳潈闄�");
+
+                //if (userRole.AuthorityScope == (int)AuthorityScopeEnum.CurrentRole)
+                //{
+                //    List<int> userId = PermissionDataHostService.UserRoles.Where(x => x.RoleId == userRole.RoleId).Select(x => x.UserId).ToList();
+                //    return $"creater in ({userId.Serialize()})";
+                //}
+                //else if (userRole.AuthorityScope == (int)AuthorityScopeEnum.OnlySelf)
+                //{
+                //    return $"creater = '{userRole.UserName}'";
+                //}
+                //else if (userRole.AuthorityScope == (int)AuthorityScopeEnum.None)
+                //{
+                //    return $"1 != 1";
+                //}
+                //return "";
+            }
+            catch (Exception ex)
+            {
+                throw new Exception($"鏃犳潈闄愶紝{ex.Message}");
+            }
+        }
     }
 }

--
Gitblit v1.9.3