瀏覽代碼

重构团组查询逻辑并优化代码结构

- 调整参数验证和权限验证代码格式,提升可读性。
- 使用 StringBuilder 和参数化查询重构查询条件构建逻辑。
- 重构 SQL 查询逻辑,动态生成查询语句,提升灵活性。
- 新增批量处理团组数据的逻辑,支持操作人和背景颜色设置。
- 在 DelegationInfoView 中新增 UseRedBackground 属性。
- 优化分页查询逻辑,提升安全性和性能。
- 增加查询结果为空时的友好提示信息。
- 移除冗余代码,删除硬编码 SQL 和未使用逻辑。
- 提升代码可读性,通过方法拆分和注释优化维护性。
Lyyyi 1 天之前
父節點
當前提交
a84ffd1183

+ 142 - 83
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -1167,108 +1167,167 @@ namespace OASystem.API.Controllers
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> PostGroupPageList(GroupPageListDto dto)
         {
-            #region  参数验证
-            if (dto.UserId < 1) return Ok(JsonView(false, "员工Id为空"));
-            if (dto.PageId < 1) return Ok(JsonView(false, "页面Id为空"));
+            #region 参数验证
+            if (dto.UserId < 1)
+                return Ok(JsonView(false, "员工Id为空"));
+            if (dto.PageId < 1)
+                return Ok(JsonView(false, "页面Id为空"));
 
             #region 页面操作权限验证
             var pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(dto.UserId, dto.PageId);
-
-            if (pageFunAuthView.CheckAuth == 0) return Ok(JsonView(false, "您没有查看权限"));
+            if (pageFunAuthView.CheckAuth == 0)
+                return Ok(JsonView(false, "您没有查看权限"));
             #endregion
-
             #endregion
-            if (dto.PortType == 1 || dto.PortType == 2) // web/Android
-            {
-                string sqlWhere = string.Empty;
-                if (dto.IsSure == 0) //未完成
-                {
-                    sqlWhere += string.Format(@" And IsSure = 0");
-                }
-                else if (dto.IsSure == 1) //已完成
-                {
-                    sqlWhere += string.Format(@" And IsSure = 1");
-                }
-
-                if (!string.IsNullOrEmpty(dto.SearchCriteria))
-                {
-                    string tj = dto.SearchCriteria;
-                    sqlWhere += string.Format(@"And (ssd.Name Like '%{0}%' Or TeamName Like '%{1}%' Or ClientName Like '%{2}%' Or  ClientName Like '%{3}%' Or su.CnName  Like '%{4}%')",
-                       tj, tj, tj, tj, tj);
-                }
-
-                if (int.TryParse(dto.Rank, out int rankId))
-                {
-                    if (rankId > 0) sqlWhere += string.Format("And gdi.TeamLevSId = {0}", rankId);
-                }
 
-                string sqlWhere1 = string.Empty;
-                if (!string.IsNullOrEmpty(dto.Department) && !dto.Department.Equals("全部"))
-                {
-                    sqlWhere1 = string.Format("Where Department = '{0}'", dto.Department);
-                }
+            //if (dto.PortType != 1 && dto.PortType != 2) // web/Android
+            //    return Ok(JsonView(false, "不支持的端口类型"));
 
-                string sql = string.Format(@"Select Row_Number,Id,SalesQuoteNo,TourCode,TeamTypeId, TeamType,Department,
-                                             	TeamLevId,TeamLev,TeamName,ClientName,ClientUnit,
-                                             	VisitDate,VisitDays,VisitPNumber,JietuanOperatorId,
-                                             	JietuanOperator,IsSure,CreateTime,IsBid,Step
-                                             	From (
-                                             	Select row_number() over(order by gdi.VisitStartDate Desc) as Row_Number,
-                                                CASE WHEN gdi.JietuanOperator = 4 OR gdi.JietuanOperator = 21 THEN '国交部'
-                                                ELSE (Select DepName FROM OA2023DB.dbo.Sys_Department WHERE Id = su.DepId) END AS 'Department',
-                                             	gdi.Id,SalesQuoteNo,TourCode,ssd.Id TeamTypeId, ssd.Name TeamType,gdi.Step,
-                                             	ssd1.Id TeamLevId,ssd1.Name TeamLev,TeamName,ClientName,ClientUnit,
-                                             	VisitDate,VisitDays,VisitPNumber,JietuanOperator JietuanOperatorId,
-                                             	su.CnName JietuanOperator,IsSure,gdi.CreateTime,gdi.IsBid
-                                             	From  Grp_DelegationInfo gdi
-                                             	Left Join Sys_SetData ssd On gdi.TeamDid = ssd.Id 
-                                             	Left Join Sys_SetData ssd1 On gdi.TeamLevSId = ssd1.Id
-                                             	Left Join Sys_Users su On gdi.JietuanOperator = su.Id
-                                             	Where gdi.IsDel = 0 {0}
-                                             ) temp {1}", sqlWhere, sqlWhere1);
+            // 构建查询条件
+            var sqlWhereBuilder = new StringBuilder(" WHERE gdi.IsDel = 0");
+            var parameters = new List<SugarParameter>();
 
-                RefAsync<int> total = 0;//REF和OUT不支持异步,想要真的异步这是最优解
-                var _DelegationList = await _sqlSugar.SqlQueryable<DelegationListView>(sql).ToPageListAsync(dto.PageIndex, dto.PageSize, total);//ToPageAsync
+            // 完成状态筛选
+            if (dto.IsSure == 0 || dto.IsSure == 1)
+            {
+                sqlWhereBuilder.Append(" AND gdi.IsSure = @IsSure");
+                parameters.Add(new SugarParameter("@IsSure", dto.IsSure));
+            }
 
-                //处理 团组模块实际操作人
-                _DelegationList.ForEach(async x =>
-                {
+            // 搜索条件
+            if (!string.IsNullOrWhiteSpace(dto.SearchCriteria))
+            {
+                var searchParam = $"%{dto.SearchCriteria.Trim()}%";
+                sqlWhereBuilder.Append(@"
+                AND (ssd.Name LIKE @SearchCriteria 
+                     OR gdi.TeamName LIKE @SearchCriteria 
+                     OR gdi.ClientName LIKE @SearchCriteria 
+                     OR su.CnName LIKE @SearchCriteria)");
+                parameters.Add(new SugarParameter("@SearchCriteria", searchParam));
+            }
 
-                    var operators = GeneralMethod.GetGroupModuleOperators(x.Id);
-                    var operatorNames = new StringBuilder();
-                    //operatorNames.AppendLine("各模块实际操作人:");
-                    if (operators.Any())
-                    {
-                        operators.ForEach(y =>
-                        {
+            // 等级筛选
+            if (int.TryParse(dto.Rank, out int rankId) && rankId > 0)
+            {
+                sqlWhereBuilder.Append(" AND gdi.TeamLevSId = @RankId");
+                parameters.Add(new SugarParameter("@RankId", rankId));
+            }
 
-                            string label = string.Empty;
-                            if (y.OperationUsers.Any())
-                            {
-                                var users = y.OperationUsers.Select(x => x.UserName).ToList();
-                                label = string.Join('、', users);
-                            }
-                            else label = "暂未指定";
+            // 部门筛选
+            var departmentWhere = string.Empty;
+            if (!string.IsNullOrWhiteSpace(dto.Department) && !dto.Department.Equals("全部"))
+            {
+                departmentWhere = " WHERE Department = @Department";
+                parameters.Add(new SugarParameter("@Department", dto.Department));
+            }
 
-                            operatorNames.AppendLine($"{y.CTableName}:{label}");
-                            operatorNames.AppendLine();
-                        });
-                    }
+            // 构建SQL查询
+            string sql = $@"
+            SELECT Row_Number, Id, SalesQuoteNo, TourCode, TeamTypeId, TeamType, Department,
+                   TeamLevId, TeamLev, TeamName, ClientName, ClientUnit,
+                   VisitDate, VisitDays, VisitPNumber, JietuanOperatorId,
+                   JietuanOperator, IsSure, CreateTime, IsBid, Step
+            FROM (
+                SELECT ROW_NUMBER() OVER(ORDER BY gdi.VisitStartDate DESC) AS Row_Number,
+                       CASE 
+                           WHEN gdi.JietuanOperator IN (4, 21) THEN '国交部'
+                           ELSE (SELECT DepName FROM OA2023DB.dbo.Sys_Department WHERE Id = su.DepId) 
+                       END AS 'Department',
+                       gdi.Id, SalesQuoteNo, TourCode, ssd.Id AS TeamTypeId, ssd.Name AS TeamType, gdi.Step,
+                       ssd1.Id AS TeamLevId, ssd1.Name AS TeamLev, TeamName, ClientName, ClientUnit,
+                       VisitDate, VisitDays, VisitPNumber, JietuanOperator AS JietuanOperatorId,
+                       su.CnName AS JietuanOperator, IsSure, gdi.CreateTime, gdi.IsBid
+                FROM Grp_DelegationInfo gdi
+                LEFT JOIN Sys_SetData ssd ON gdi.TeamDid = ssd.Id 
+                LEFT JOIN Sys_SetData ssd1 ON gdi.TeamLevSId = ssd1.Id
+                LEFT JOIN Sys_Users su ON gdi.JietuanOperator = su.Id
+                {sqlWhereBuilder}
+            ) temp {departmentWhere}";
 
-                    x.OperatorLabel = operatorNames.ToString().TrimEnd('\n', '\r');
-                });
+            // 执行分页查询
+            RefAsync<int> total = 0;
+            var delegationList = await _sqlSugar.SqlQueryable<DelegationListView>(sql)
+                .AddParameters(parameters)
+                .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
 
-                var _view = new
+            if (!delegationList.Any())
+            {
+                var emptyView = new
                 {
                     PageFuncAuth = pageFunAuthView,
-                    Data = _DelegationList
+                    Data = delegationList
                 };
-                return Ok(JsonView(true, "查询成功!", _view, total));
+                return Ok(JsonView(true, "查询成功,暂无数据", emptyView, total));
             }
-            else
+
+            // 批量处理团组模块实际操作人和背景颜色设置
+            await ProcessDelegationListData(delegationList);
+
+            var resultView = new
             {
-                return Ok(JsonView(false, "查询失败"));
-            }
+                PageFuncAuth = pageFunAuthView,
+                Data = delegationList
+            };
+
+            return Ok(JsonView(true, "查询成功!", resultView, total));
+        }
+
+        /// <summary>
+        /// 批量处理团组数据
+        /// </summary>
+        private async Task ProcessDelegationListData(List<DelegationListView> delegationList)
+        {
+            var groupIds = delegationList.Select(x => x.Id).ToList();
+
+            // 批量查询信用卡支付记录
+            var creditCardPayments = await _sqlSugar.Queryable<Grp_CreditCardPayment>()
+                .Where(y => groupIds.Contains(y.DIId) && y.IsDel == 0)
+                .Select(y => y.DIId)
+                .Distinct()
+                .ToListAsync();
+
+            // 批量查询费用确认记录
+            var feeAcknowledgements = await _sqlSugar.Queryable<Grp_FeeEntryAcknowledge>()
+                .Where(y => groupIds.Contains(y.GroupId) && y.IsDel == 0)
+                .Where(y => y.IsAcknowledged == AcknowledgeStatusEnum.Acknowledged)
+                .Select(y => y.GroupId)
+                .Distinct()
+                .ToListAsync();
+
+            var creditCardPaymentSet = creditCardPayments.ToHashSet();
+            var feeAcknowledgementSet = feeAcknowledgements.ToHashSet();
+
+            // 并行处理每个团组
+            var tasks = delegationList.Select(async x =>
+            {
+                // 处理团组模块实际操作人
+                var operators = GeneralMethod.GetGroupModuleOperators(x.Id);
+                var operatorNames = new StringBuilder();
+
+                if (operators.Any())
+                {
+                    foreach (var operatorInfo in operators)
+                    {
+                        string label = operatorInfo.OperationUsers.Any()
+                            ? string.Join('、', operatorInfo.OperationUsers.Select(u => u.UserName))
+                            : "暂未指定";
+
+                        operatorNames.AppendLine($"{operatorInfo.CTableName}:{label}");
+                        operatorNames.AppendLine();
+                    }
+                }
+
+                x.OperatorLabel = operatorNames.ToString().TrimEnd('\n', '\r');
+
+                // 设置背景颜色为红色
+                // C表没数据并且没点提醒确认按钮(无成本费用按钮)的团组该行显示红色
+                bool hasCreditCardPayment = creditCardPaymentSet.Contains(x.Id);
+                bool hasFeeAcknowledgement = feeAcknowledgementSet.Contains(x.Id);
+
+                x.UseRedBackground = !hasCreditCardPayment && !hasFeeAcknowledgement;
+            });
+
+            await Task.WhenAll(tasks);
         }
 
         /// <summary>

+ 5 - 1
OASystem/OASystem.Domain/ViewModels/Groups/DelegationInfoView.cs

@@ -546,10 +546,14 @@ namespace OASystem.Domain.ViewModels.Groups
                     2 => "企微消息通知(报批)",
                     _ => "未设置"
                 };
-
             }
         }
 
+        /// <summary>
+        /// 使用红色背景
+        /// </summary>
+        public bool UseRedBackground { get; set; } = false;
+
     }