소스 검색

Merge branch 'develop' of http://132.232.92.186:3000/XinXiBu/OA2023 into develop

yuanrf 1 주 전
부모
커밋
2551a3c108

+ 48 - 5
OASystem/OASystem.Api/Controllers/FinancialController.cs

@@ -7175,14 +7175,58 @@ Group by PriceType ", dto.diId);
                 return Ok(jw);
             }
 
-            var _groupDatas = _sqlSugar.Queryable<Grp_DelegationInfo>()
+            // 构建搜索条件
+            var searchFields = new List<string>
+            {
+                "TeamName",
+            };
+
+            var searchConfig = new SearchConfig
+            {
+                EnableExactMatch = true,
+                EnablePrefixMatch = true,
+                EnableFuzzySearch = true,
+                EnableCharSearch = true,
+                RequireAllWords = true,
+                RequireAllChars = false,
+                EnableSmartSplitting = true,
+                MinSplitLength = 4,
+                RequireAllWordsForSplit = false
+            };
+
+            // 使用智能混合搜索模式
+            var (searchCondition, searchParameters) = AdvancedSearchHelper.BuildSugarSearchCondition(
+                searchTerm: teamName,
+                searchFields: searchFields,
+                prefix: "search_",
+                searchMode: SearchMode.AutoDetect,
+                combinationMode: CombinationMode.SmartMix,
+                config: searchConfig
+            );
+
+            // 主查询
+            var query = _sqlSugar.Queryable<Grp_DelegationInfo>()
                 .Where(x => x.IsDel == 0 &&
                         x.VisitDate >= _beginDt &&
-                        x.VisitDate <= _endDt
-                        )
-                .WhereIF(!string.IsNullOrEmpty(teamName), x => x.TeamName.Contains(teamName))
+                        x.VisitDate <= _endDt);
+
+            // 如果存在搜索条件,添加到查询中
+            if (!string.IsNullOrEmpty(searchCondition))
+            {
+                query = query.Where(searchCondition, searchParameters.ToArray());
+            }
+            else if (!string.IsNullOrEmpty(teamName))
+            {
+                // 如果搜索条件构建失败但有搜索词,使用简单包含匹配
+                query = query.Where(x => x.TeamName.Contains(teamName));
+            }
+
+            var _groupDatas = query
+                .OrderByDescending(x => x.CreateTime)
                 .ToList();
+
             var _groupIds = _groupDatas.Select(x => x.Id).ToList();
+
             if (_groupIds.Count < 1)
             {
                 jw.Msg = $"该时间段暂无出访的团组!";
@@ -7201,7 +7245,6 @@ Group by PriceType ", dto.diId);
             _DailyFeePaymentResult.gz = _paymentDatas.Where(it => it.OrbitalPrivateTransfer == 0).Sum(it => ((it.PayMoney * it.DayRate) / 100) * it.PayPercentage); //公转
             _DailyFeePaymentResult.sz = _paymentDatas.Where(it => it.OrbitalPrivateTransfer == 1).Sum(it => ((it.PayMoney * it.DayRate) / 100) * it.PayPercentage); ; //私转
 
-
             #region 相关基础数据源
             var userDatas = _sqlSugar.Queryable<Sys_Users>().ToList();
             var setDatas = _sqlSugar.Queryable<Sys_SetData>().Where(it => it.IsDel == 0).ToList();

+ 71 - 34
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -6518,65 +6518,102 @@ FROM
         ///  费用审核
         ///  团组列表 Page
         /// </summary>
-        /// <param name="_dto">团组列表请求dto</param>
+        /// <param name="dto">团组列表请求dto</param>
         /// <returns></returns>
         [HttpPost]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
-        public async Task<IActionResult> PostExpenseAuditGroupPageItems(ExpenseAuditGroupPageItemsDto _dto)
+        public async Task<IActionResult> PostExpenseAuditGroupPageItems(ExpenseAuditGroupPageItemsDto dto)
         {
             #region  参数验证
-            if (_dto.UserId < 1) return Ok(JsonView(false, "员工Id为空"));
-            if (_dto.PageId < 1) return Ok(JsonView(false, "页面Id为空"));
+            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);
+            var pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(dto.UserId, dto.PageId);
 
             if (pageFunAuthView.CheckAuth == 0) return Ok(JsonView(false, "您没有查看权限"));
             #endregion
 
             #endregion
-            if (_dto.PortType == 1 || _dto.PortType == 2 || _dto.PortType == 3) // web/Android/IOS
+
+            if (dto.PortType == 1 || dto.PortType == 2 || dto.PortType == 3) // web/Android/IOS
             {
-                string sqlWhere = string.Empty;
-                if (_dto.IsSure == 0) //未完成
+                string sqlWhere = "WHERE gdi.IsDel = 0";
+                var parameters = new List<SugarParameter>();
+
+                // 状态条件(保持不变)
+                if (dto.IsSure >= 0)
                 {
-                    sqlWhere += string.Format(@" And IsSure = 0");
+                    sqlWhere += $" AND IsSure = {dto.IsSure}";
                 }
-                else if (_dto.IsSure == 1) //已完成
+                
+                // 搜索条件
+                if (!string.IsNullOrEmpty(dto.SearchCriteria))
                 {
-                    sqlWhere += string.Format(@" And IsSure = 1");
-                }
+                    var searchFields = new List<string>
+                    {
+                        "ssd.Name",
+                        "TeamName",
+                        "ClientName",
+                        "su.CnName"
+                    };
 
-                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 su.CnName  Like '%{3}%')",
-                       tj, tj, tj, tj);
-                }
+                    // 使用更宽松的配置
+                    var config = new SearchConfig
+                    {
+                        EnableSmartSplitting = true,
+                        RequireAllWordsForSplit = false,
+                        MinSplitLength = 4
+                    };
 
-                string sql = string.Format(@"Select Row_Number,Id,SalesQuoteNo,TourCode,TeamTypeId, TeamType,
-					                       TeamName,ClientName,ClientUnit, TeamLevId,TeamLev,VisitDate,
-										   VisitDays,VisitPNumber,JietuanOperator,IsSure,CreateTime
-					                From (
-					                    Select row_number() over(order by gdi.VisitDate Desc) as Row_Number,
-					                    gdi.Id,SalesQuoteNo,TourCode,ssd1.Id TeamLevId,ssd1.Name TeamLev,TeamName,
-										ClientName,ClientUnit,ssd.Id TeamTypeId, ssd.Name TeamType,VisitDate,
-										VisitDays,VisitPNumber,su.CnName JietuanOperator,IsSure,gdi.CreateTime
-					                    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  ", sqlWhere);
+                    // 使用智能混合模式
+                    var (searchCondition, searchParams) = AdvancedSearchHelper.BuildEnhancedSearchCondition(
+                        dto.SearchCriteria,
+                        searchFields,
+                        "search_groupFee_",
+                        SearchMode.AutoDetect,
+                        CombinationMode.SmartMix,
+                        config  // 传入配置
+                    );
 
-                RefAsync<int> total = 0;//REF和OUT不支持异步,想要真的异步这是最优解
-                var _DelegationList = await _sqlSugar.SqlQueryable<DelegationListView>(sql).ToPageListAsync(_dto.PageIndex, _dto.PageSize, total);//ToPageAsync
+                    if (!string.IsNullOrEmpty(searchCondition))
+                    {
+                        sqlWhere += $" AND ({searchCondition})";
+                        parameters.AddRange(searchParams);
+                    }
+                }
+
+                // 基础查询sql
+                string sql = $@"
+                SELECT Row_Number, Id, SalesQuoteNo, TourCode, TeamTypeId, TeamType,
+                       TeamName, ClientName, ClientUnit, TeamLevId, TeamLev, VisitDate,
+                       VisitDays, VisitPNumber, JietuanOperator, IsSure, CreateTime
+                FROM (
+                    SELECT ROW_NUMBER() OVER (ORDER BY gdi.VisitDate DESC) AS Row_Number,
+                           gdi.Id, gdi.SalesQuoteNo, gdi.TourCode, 
+                           ssd1.Id AS TeamLevId, ssd1.Name AS TeamLev,
+                           gdi.TeamName, gdi.ClientName, gdi.ClientUnit,
+                           ssd.Id AS TeamTypeId, ssd.Name AS TeamType,
+                           gdi.VisitDate, gdi.VisitDays, gdi.VisitPNumber,
+                           su.CnName AS JietuanOperator, gdi.IsSure, gdi.CreateTime
+                    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
+                    {sqlWhere}
+                ) AS temp";
+
+                RefAsync<int> total = 0;
+                var _DelegationList = await _sqlSugar.SqlQueryable<DelegationListView>(sql)
+                    .AddParameters(parameters.ToArray())
+                    .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
 
                 var _view = new
                 {
                     PageFuncAuth = pageFunAuthView,
                     Data = _DelegationList
                 };
+
                 return Ok(JsonView(true, "查询成功!", _view, total));
 
             }

+ 105 - 35
OASystem/OASystem.Api/Controllers/StatisticsController.cs

@@ -1,5 +1,6 @@
 using Aspose.Cells;
 using FluentValidation;
+using Humanizer;
 using OASystem.API.OAMethodLib;
 using OASystem.API.OAMethodLib.JuHeAPI;
 using OASystem.Domain.AesEncryption;
@@ -72,67 +73,136 @@ namespace OASystem.API.Controllers
         ///  团组报表
         ///  Items 
         /// </summary>
-        /// <param name="_dto">团组列表请求dto</param>
+        /// <param name="dto">团组列表请求dto</param>
         /// <returns></returns>
         [HttpPost("PostGroupStatementItems")]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
-        public async Task<IActionResult> PostGroupStatementItems(GroupStatementItemsDto _dto)
+        public async Task<IActionResult> PostGroupStatementItems(GroupStatementItemsDto dto)
         {
             #region  参数验证
-            if (_dto.UserId < 1) return Ok(JsonView(false, "员工Id为空"));
-            if (_dto.PageId < 1) return Ok(JsonView(false, "页面Id为空"));
+            if (dto.UserId < 1) return Ok(JsonView(false, "员工Id为空"));
+            if (dto.PageId < 1) return Ok(JsonView(false, "页面Id为空"));
 
             PageFunAuthViewBase pageFunAuthView = new PageFunAuthViewBase();
             #region 页面操作权限验证
-            pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(_dto.UserId, _dto.PageId);
+            pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(dto.UserId, dto.PageId);
 
             if (pageFunAuthView.CheckAuth == 0) return Ok(JsonView(false, "您没有查看权限"));
             #endregion
 
             #endregion
-            if (_dto.PortType == 1 || _dto.PortType == 2 || _dto.PortType == 3) // web/Android/IOS
+            if (dto.PortType == 1 || dto.PortType == 2 || dto.PortType == 3) // web/Android/IOS
             {
-                string sqlWhere = string.Empty;
-                if (_dto.IsSure == 0) //未完成
+                // 构建基础查询
+                var query = _sqlSugar.Queryable<Grp_DelegationInfo, Sys_SetData, Sys_SetData, Sys_Users, Fin_ProceedsReceived>(
+                        (gdi, ssd, ssd1, su, pr) => new JoinQueryInfos(
+                            JoinType.Left, gdi.TeamDid == ssd.Id,
+                            JoinType.Left, gdi.TeamLevSId == ssd1.Id,
+                            JoinType.Left, gdi.JietuanOperator == su.Id,
+                            JoinType.Left, gdi.Id == pr.Diid
+                        )
+                    )
+                    .Where((gdi, ssd, ssd1, su, pr) => gdi.IsDel == 0)
+                    .Select((gdi, ssd, ssd1, su, pr) => new GroupStatementItemView
+                    {
+                        Id = gdi.Id,
+                        TourCode = gdi.TourCode,
+                        TeamName = gdi.TeamName,
+                        ClientName = gdi.ClientName,
+                        ClientUnit = gdi.ClientUnit,
+                        VisitDate = gdi.VisitDate,
+                        VisitDays = gdi.VisitDays,
+                        VisitPNumber = gdi.VisitPNumber,
+                        IsSure = gdi.IsSure,
+                        TeamTypeId = ssd.Id,
+                        TeamType = ssd.Name,
+                        TeamLevId = ssd1.Id,
+                        TeamLev = ssd1.Name,
+                        JietuanOperator = su.CnName,
+                        LastCollectionTime = SqlFunc.AggregateMax(pr.CreateTime)
+                    });
+
+                // 完成状态筛选
+                if (dto.IsSure == 0) // 未完成
                 {
-                    sqlWhere += string.Format(@" And IsSure = 0");
+                    query = query.Where(gdi => gdi.IsSure == 0);
                 }
-                else if (_dto.IsSure == 1) //已完成
+                else if (dto.IsSure == 1) // 已完成
                 {
-                    sqlWhere += string.Format(@" And IsSure = 1");
+                    query = query.Where(gdi => gdi.IsSure == 1);
                 }
 
-                if (!string.IsNullOrEmpty(_dto.SearchCriteria))
+                // 高级搜索处理
+                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);
+                    string searchTerm = dto.SearchCriteria;
+
+                    // 搜索字段列表(对应查询中的字段)
+                    var searchFields = new List<string>
+                    {
+                        "TeamName",         // 团队名称
+                        "ClientName",       // 客户名称
+                        "JietuanOperator",  // 接团操作员
+                        "TourCode",         // 团号
+                        "ClientUnit",       // 客户单位
+                        "TeamType",         // 团队类型
+                        "TeamLev"           // 团队级别
+                    };
+
+                    // 搜索配置
+                    var searchConfig = new SearchConfig
+                    {
+                        EnableExactMatch = true,
+                        EnablePrefixMatch = true,
+                        EnableFuzzySearch = true,
+                        EnableCharSearch = true,
+                        RequireAllWords = true,
+                        RequireAllChars = false,
+                        EnableSmartSplitting = true,
+                        MinSplitLength = 4
+                    };
+
+                    // 构建搜索条件
+                    var (searchCondition, searchParameters) = AdvancedSearchHelper.BuildEnhancedSearchCondition(
+                        searchTerm: searchTerm,
+                        searchFields: searchFields,
+                        prefix: "search_groupExcel_",
+                        searchMode: SearchMode.AutoDetect,
+                        combinationMode: CombinationMode.SmartMix,
+                        config: searchConfig
+                    );
+
+                    if (!string.IsNullOrEmpty(searchCondition))
+                    {
+                        // 添加搜索条件和参数
+                        query = query.Where(searchCondition, searchParameters.ToArray());
+                    }
+                    else
+                    {
+                        // 回退到简单搜索
+                        query = query.Where(gdi =>
+                            gdi.TeamName.Contains(searchTerm) ||
+                            gdi.ClientName.Contains(searchTerm) ||
+                            gdi.JietuanOperator.Contains(searchTerm) ||
+                            gdi.TourCode.Contains(searchTerm) ||
+                            gdi.ClientUnit.Contains(searchTerm) ||
+                            gdi.TeamType.Contains(searchTerm) ||
+                            gdi.TeamLev.Contains(searchTerm));
+                    }
                 }
 
-                string sql = string.Format(@"Select row_number() over(order by gdi.VisitStartDate Desc) as Row_Number, 
-											    gdi.Id,TourCode,ssd1.Id TeamLevId,ssd1.Name TeamLev,TeamName,
-											    ClientName,ClientUnit,VisitDate,ssd.Id TeamTypeId, ssd.Name TeamType,
-											    VisitDays,VisitPNumber,su.CnName JietuanOperator,IsSure,gdi.CreateTime,
-											    pr.LastCollectionTime
-											    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
-											    Left Join (
-												    SELECT Diid, MAX(CreateTime) LastCollectionTime
-												    FROM Fin_ProceedsReceived
-												    Where IsDel = 0
-												    GROUP BY Diid
-											    ) pr On gdi.Id = pr.Diid
-										    Where gdi.IsDel = 0 {0} ", sqlWhere);
-
-                RefAsync<int> total = 0;//REF和OUT不支持异步,想要真的异步这是最优解
-                var _DelegationList = await _sqlSugar.SqlQueryable<GroupStatementItemView>(sql).ToPageListAsync(_dto.PageIndex, _dto.PageSize, total);//ToPageAsync
+                // 获取总数
+                RefAsync<int> total = 0;
+
+                // 执行分页查询
+                var delegationList = await query
+                    .OrderByDescending(gdi => gdi.VisitDate)
+                    .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
 
                 var _view = new
                 {
                     PageFuncAuth = pageFunAuthView,
-                    Data = _DelegationList
+                    Data = delegationList
                 };
                 return Ok(JsonView(true, "查询成功!", _view, total));
 

+ 46 - 0
OASystem/OASystem.Domain/Entities/PersonnelModule/FinanceKpi.cs

@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Entities.PersonnelModule
+{
+    /// <summary>
+    /// 财务部绩效考核
+    /// </summary>
+    [SugarTable("FinanceKpi", "财务部绩效考核")]
+    public class FinanceKpi : EntityBase
+    {
+        /// <summary>
+        /// 月份(yyyy-MM)
+        /// </summary>
+        [SugarColumn(ColumnName = "Month", ColumnDescription = "月份(yyyy-MM)", IsNullable = true, ColumnDataType = "varchar(30)")]
+        public string Month { get; set; }
+
+        /// <summary>
+        /// 考核人
+        /// </summary>
+        [SugarColumn(ColumnName = "Evaluator", ColumnDescription = "考核人", IsNullable = true, ColumnDataType = "int")]
+        public int Evaluator { get; set; }
+
+        /// <summary>
+        /// 考核内容
+        /// </summary>
+        [SugarColumn(ColumnName = "EvalContent", ColumnDescription = "考核内容", IsNullable = true, ColumnDataType = "int")]
+        public int EvalContent { get; set; }
+
+        /// <summary>
+        /// 是否失误
+        /// </summary>
+        [SugarColumn(ColumnName = "EvalContent", ColumnDescription = "是否失误", IsNullable = true, ColumnDataType = "bit")]
+        public bool IsMistake { get; set; }
+        
+        /// <summary>
+        /// 失误原因
+        /// </summary>
+        [SugarColumn(ColumnName = "EvalContent", ColumnDescription = "考核内容", IsNullable = true, ColumnDataType = "varchar(300)")]
+        public string MistakeReason { get; set; }
+
+    }
+}

+ 2 - 0
OASystem/OASystem.Infrastructure/Repositories/Groups/DelegationInfoRepository.cs

@@ -7,6 +7,8 @@ using OASystem.Domain.Entities.Customer;
 using OASystem.Domain.Entities.Groups;
 using OASystem.Domain.ViewModels.Groups;
 using OASystem.Infrastructure.Repositories.System;
+using OASystem.Infrastructure.Tools;
+using System.Diagnostics;
 
 namespace OASystem.Infrastructure.Repositories.Groups
 {

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 2521 - 0
OASystem/OASystem.Infrastructure/Tools/AdvancedSearchHelper.cs