Kaynağa Gözat

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

Lyyyi 1 gün önce
ebeveyn
işleme
49128c3e15

+ 292 - 12
OASystem/OASystem.Api/Controllers/PersonnelModuleController.cs

@@ -1,6 +1,4 @@
 using Aspose.Cells;
-using Aspose.Words;
-using Dm.util;
 using FluentValidation;
 using Markdig;
 using Microsoft.AspNetCore.SignalR;
@@ -24,7 +22,6 @@ using OASystem.Infrastructure.Repositories.PersonnelModule;
 using System.Data;
 using System.Diagnostics;
 using System.Globalization;
-using System.Threading.Tasks;
 using static OASystem.API.OAMethodLib.JWTHelper;
 
 namespace OASystem.API.Controllers
@@ -1289,7 +1286,7 @@ WHERE
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> PostTaskAllocationSetHaveStatus(TaskAllocationStatusDto dto)
         {
-            var _view = await _taskAllocationRep.TaskSetHaveStatus(dto.SubId,dto.UserId);
+            var _view = await _taskAllocationRep.TaskSetHaveStatus(dto.SubId, dto.UserId);
             if (_view.Code == 0)
             {
                 //发送消息
@@ -1332,7 +1329,7 @@ WHERE
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> PostTaskAllocationSetAuditStatus(TaskAllocationSetAuditStatusDto dto)
         {
-            var _view = _taskAllocationRep.TaskSetAuditStatus(dto.Id,dto.UserId,dto.OverTime);
+            var _view = _taskAllocationRep.TaskSetAuditStatus(dto.Id, dto.UserId, dto.OverTime);
             if (_view.Code == 0)
             {
                 //发送消息
@@ -1344,7 +1341,7 @@ WHERE
                     if (taskInfo != null)
                     {
                         var userIds = _taskAllocationRep._sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.TAId == dto.Id).Select(it => it.UserId).ToList();
-                        
+
                         string title = $"[{taskInfo.TaskName}] 进度更新!";
                         string content = $"任务已完成!若需查看,请前往任务页面查看详情!";
                         string yw_content = $"任务已完成!";
@@ -1383,7 +1380,7 @@ WHERE
 
             #endregion
 
-            var _view = await _taskAllocationRep.TaskTermination(dto.Id,dto.UserId);
+            var _view = await _taskAllocationRep.TaskTermination(dto.Id, dto.UserId);
             if (_view.Code == 0)
             {
                 //发送消息
@@ -3142,7 +3139,8 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
 
             // 检索时间段团组信息
             var group_data = await _sqlSugar.Queryable<Grp_DelegationInfo>()
-            .Where(x => x.IsDel == 0 && x.VisitDate >= start && x.VisitDate <= end)
+             .Where(x => x.IsDel == 0)
+             .Where(x => SqlFunc.Between(x.VisitDate, start, end.AddDays(1)))
             .Select(x => new
             {
                 x.TeamName,
@@ -3251,11 +3249,10 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
 
             jw.Code = 200;
             jw.Msg = "操作成功!";
-            jw.Data = new
+            jw.Data = new AiResponse()
             {
                 Answer = group_process_resp.Answer,
                 KaoqinAnswer = kaoqinResp.Answer,
-                group_process_data,
             };
 
             // 保存至数据库中
@@ -3276,7 +3273,7 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
         }
 
         /// <summary>
-        /// 机票员工分析(兼容性方法,调用统一函数)
+        /// 机票员工分析
         /// </summary>
         [HttpGet]
         public async Task<IActionResult> AiPerformanceAnalysis_AirTicketAsync(int userId, DateTime start, DateTime end, int createUserId)
@@ -3285,7 +3282,7 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
         }
 
         /// <summary>
-        /// 酒店员工分析(兼容性方法,调用统一函数)
+        /// 酒店员工分析
         /// </summary>
         [HttpGet]
         public async Task<IActionResult> AiPerformanceAnalysis_HotelAsync(int userId, DateTime start, DateTime end, int createUserId)
@@ -3293,6 +3290,289 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
             return await AiPerformanceAnalysisAsync(userId, start, end, createUserId, GroupProcessType.Hotel);
         }
 
+        /// <summary>
+        /// 获取考勤数据并进行AI分析
+        /// </summary>
+        /// <param name="user_entity">用户实体</param>
+        /// <param name="start">开始时间</param>
+        /// <param name="end">结束时间</param>
+        /// <param name="jw">JsonView对象,用于返回错误信息</param>
+        /// <param name="errorMessagePrefix">错误消息前缀(用于区分不同的分析类型)</param>
+        /// <returns>考勤分析结果,失败时返回null</returns>
+        private async Task<string> GetKaoqinAnalysisAsync(Sys_Users user_entity, DateTime start, DateTime end, JsonView jw, string errorMessagePrefix = "Ai分析用户绩效")
+        {
+            List<string> useridlist = new List<string> { user_entity.QiyeChatUserId };
+            var checkin_data = await _qiYeWeChatApiService.GetCheckinDataAsync(useridlist, 1, start, end);
+            if (checkin_data.errcode != 0)
+            {
+                jw.Msg = "获取企微上下班考勤打卡信息失败!" + checkin_data.errmsg;
+                return null;
+            }
+
+            string question = string.Empty;
+            var settingTemp = await _sqlSugar.Queryable<Sys_SetData>().FirstAsync(x => x.Id == 1462 && x.IsDel == 0);
+            if (settingTemp != null && !string.IsNullOrEmpty(settingTemp.Remark))
+            {
+                var stringFormatResp = await GeneralMethod.StringFormatAsync(new StringFormatDto
+                {
+                    FormatTemplate = settingTemp.Remark,
+                    Parameters = new List<string> {
+                        JsonConvert.SerializeObject(checkin_data.checkindata),
+                        user_entity.CnName
+                    }
+                });
+
+                if (stringFormatResp.Success)
+                {
+                    question = stringFormatResp.FormattedResult;
+                }
+                else
+                {
+                    jw.Msg = "获取ai绩效分析模板失败!" + stringFormatResp.Message;
+                    return null;
+                }
+            }
+
+            var kaoqinResp = await _deepSeekService.ChatAsync(question);
+            if (!kaoqinResp.Success)
+            {
+                jw.Msg = $"{errorMessagePrefix}失败!" + kaoqinResp.Message;
+                return null;
+            }
+
+            return kaoqinResp.Answer;
+        }
+
+        /// <summary>
+        /// 签证员工分析
+        /// </summary>
+        /// <param name="userId"></param>
+        /// <param name="start"></param>
+        /// <param name="end"></param>
+        /// <param name="createUserId"></param>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<IActionResult> AiPerformanceAnalysis_VisaAsync(int userId, DateTime start, DateTime end, int createUserId)
+        {
+            var jw = JsonView(false);
+
+            // 验证用户
+            var user_entity = await _sqlSugar.Queryable<Sys_Users>()
+                .FirstAsync(e => e.Id == userId && e.IsDel == 0);
+            if (user_entity == null)
+            {
+                jw.Msg = "用户不存在!";
+                return Ok(jw);
+            }
+
+            // 获取考勤分析结果
+            var kaoqinAnswer = await GetKaoqinAnalysisAsync(user_entity, start, end, jw, "Ai分析签证考勤");
+            if (kaoqinAnswer == null)
+            {
+                return Ok(jw);
+            }
+
+
+            // 检索时间段团组信息
+            var group_data = await _sqlSugar.Queryable<Grp_DelegationInfo>()
+             .Where(x => x.IsDel == 0)
+             .Where(x => SqlFunc.Between(x.VisitDate, start, end.AddDays(1)))
+            .Select(x => new
+            {
+                x.TeamName,
+                x.VisitDate,
+                x.Id,
+                CreateTime = x.CreateTime,
+                x.StepOperationTime,
+            })
+            .ToListAsync();
+
+            string group_process_question = string.Empty;
+            string group_process_data = string.Empty;
+            foreach (var item in group_data)
+            {
+                var group_process = await _sqlSugar.Queryable<Grp_ProcessOverview>()
+                .Where(x => x.IsDel == 0 && x.GroupId == item.Id && x.ProcessType == GroupProcessType.Visa)
+                .FirstAsync();
+
+                //获取团组倒推表数据
+                var back_data = await _sqlSugar.Queryable<Grp_InvertedList>()
+                .Where(x => x.IsDel == 0 && x.DiId == item.Id)
+                .ToListAsync();
+
+                var startTime = item.VisitDate.ToString("yyyy - MM - dd");
+                if (item.StepOperationTime.HasValue && item.StepOperationTime != DateTime.MinValue)
+                    startTime = item.StepOperationTime.Value.ToString("yyyy - MM - dd");
+
+                group_process_data += $"团组名称:{item.TeamName}," +
+                $"出访日期:{startTime},团组创建时间:{item.CreateTime.ToString("yyyy - MM - dd HH:mm:ss")},团组签证进程信息如下:{JsonConvert.SerializeObject(group_process)}\r\n\r\n";
+
+                if (back_data.Count > 0)
+                {
+                    group_process_data += $"该团组倒退表信息如下:{JsonConvert.SerializeObject(back_data)}\r\n\r\n";
+                }
+                else
+                {
+                    group_process_data += $"该团组倒退表信息为空!\r\n\r\n";
+                }
+
+                if (group_process != null)
+                {
+                    group_process_data += $"团组签证进程时间如下:{JsonConvert.SerializeObject(group_process)}\r\n\r\n";
+                }
+                else
+                {
+                    group_process_data += $"团组签证进程时间为空!\r\n\r\n";
+                }
+            }
+
+            group_process_question += @$"团组数据:
+            {group_process_data} 
+
+            根据倒推表和团组签证进程时间做匹配,做超时等判断,总结分析出该员工{user_entity.CnName}的工作饱和度、工作详细完成度、工作效率、完成度、风险点、问题出现的地方及改进建议";
+
+            //处理模板
+            try
+            {
+                var str = await _sqlSugar.Queryable<Sys_SetData>().FirstAsync(x => x.Id == 1467 && x.IsDel == 0);
+                if (str != null && !string.IsNullOrEmpty(str.Remark))
+                {
+                    var stringFormatResp = await GeneralMethod.StringFormatAsync(new StringFormatDto
+                    {
+                        FormatTemplate = str.Remark,
+                        Parameters = new List<string> {
+                            group_process_data,
+                            user_entity.CnName
+                        }
+                    });
+
+                    if (stringFormatResp.Success)
+                    {
+                        group_process_question = stringFormatResp.FormattedResult;
+                    }
+                    else
+                    {
+                        _logger.LogError($"签证模板格式化失败,模板ID:{1467}, 时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}, 错误:{stringFormatResp.Message}");
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                jw.Msg = "模板格式化失败!" + ex.Message;
+                return Ok(jw);
+            }
+
+            var group_process_resp = await _deepSeekService.ChatAsync(group_process_question);
+            if (!group_process_resp.Success)
+            {
+                jw.Msg = "Ai分析用户签证进程失败!" + group_process_resp.Message;
+                return Ok(jw);
+            }
+
+            jw.Code = 200;
+            jw.Msg = "操作成功!";
+            jw.Data = new AiResponse()
+            {
+                Answer = group_process_resp.Answer,
+                KaoqinAnswer = kaoqinAnswer,
+            };
+
+            //保存至数据库中
+            Pm_PerformanceAnalysis insertData = new Pm_PerformanceAnalysis
+            {
+                CreateTime = DateTime.Now,
+                CreateUserId = createUserId,
+                IsDel = 0,
+                Year = start.Year,
+                Month = start.Month,
+                JsonResult = JsonConvert.SerializeObject(jw.Data),
+                UserId = userId,
+            };
+
+            await _sqlSugar.Insertable(insertData).ExecuteCommandAsync();
+
+            return Ok(jw);
+        }
+
+
+        /// <summary>
+        /// OP员工分析
+        /// </summary>
+        /// <param name="userId"></param>
+        /// <param name="start"></param>
+        /// <param name="end"></param>
+        /// <param name="createUserId"></param>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<IActionResult> AiPerformanceAnalysis_OPAsync(int userId, DateTime start, DateTime end, int createUserId)
+        {
+            var jw = JsonView(false);
+
+            // 验证用户
+            var user_entity = await _sqlSugar.Queryable<Sys_Users>()
+                .FirstAsync(e => e.Id == userId && e.IsDel == 0);
+            if (user_entity == null)
+            {
+                jw.Msg = "用户不存在!";
+                return Ok(jw);
+            }
+
+            // 获取考勤分析结果
+            var kaoqinAnswer = await GetKaoqinAnalysisAsync(user_entity, start, end, jw, "Ai分析OP考勤");
+            if (kaoqinAnswer == null)
+            {
+                return Ok(jw);
+            }
+
+            //检索负责的团组
+            var group_data = await _sqlSugar.Queryable<Grp_DelegationInfo>()
+            .Where(x => x.IsDel == 0)
+            .Where(x => SqlFunc.Between(x.VisitDate, start, end.AddDays(1)))
+            .ToListAsync();
+
+            string sqlAssignment = @$"
+                    SELECT DIId FROM Grp_GroupsTaskAssignment 
+                    WHERE isdel = 0 and CTId = 79 and UId = {userId}
+                    order by id desc ";
+            var assignmentList = await _sqlSugar.Ado.SqlQueryAsync<int>(sqlAssignment);
+            group_data = group_data.Where(x => assignmentList.Contains(x.Id)).ToList();
+
+            string group_process_question = string.Empty;
+            string group_process_data = string.Empty;
+
+            var back_group_list = await _sqlSugar.Queryable<Grp_InvertedList>()
+            .Where(x => x.IsDel == 0)
+            .Where(x => group_data.Select(y => y.Id).ToList().Contains(x.DiId))
+            .ToListAsync();
+
+            var process_group_list = await _sqlSugar.Queryable<Grp_ProcessOverview>()
+            .Where(x => x.IsDel == 0)
+            .Where(x => group_data.Select(y => y.Id).ToList().Contains(x.GroupId))
+            .ToListAsync();
+
+            foreach (var item in group_data)
+            {
+                //获取团组倒退表
+                var back_data = back_group_list.Where(x => x.DiId == item.Id).ToList();
+                //获取团组进程
+                var process_data = process_group_list.Where(x => x.GroupId == item.Id).ToList();
+            }
+
+            //检索黑屏代码最后的时间
+
+            //业务分析
+            jw.Code = 200;
+            jw.Msg = "操作成功!";
+            jw.Data = new AiResponse()
+            {
+                KaoqinAnswer = kaoqinAnswer,
+            };
+
+            return Ok(jw);
+
+        }
+
+
         class wordTable
         {
             public int 序号 { get; set; }