瀏覽代碼

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

Lyyyi 4 天之前
父節點
當前提交
5a09da3518

+ 0 - 1
OASystem/OASystem.Api/Controllers/MarketCustomerResourcesController.cs

@@ -1,6 +1,5 @@
 using Aspose.Cells;
 using EyeSoft.Extensions;
-using NPOI.SS.Formula.Functions;
 using OASystem.API.OAMethodLib;
 using OASystem.Domain.AesEncryption;
 using OASystem.Domain.Attributes;

+ 277 - 59
OASystem/OASystem.Api/Controllers/PersonnelModuleController.cs

@@ -3103,6 +3103,27 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
 5、行程结束后整理酒店发票与结算(团组结束后5天内)",
                         TaskAssignmentCTId: null  // 酒店不需要筛选任务分配
                     )
+                },
+                {
+                    GroupProcessType.Invitation,
+                    (
+                        TemplateId: 1487,
+                        ProcessName: "商邀",
+                        Rules: @"1、报批基础资料准备(建团后确认出团的时候开始) 4个工作日
+2、报批邀请函资料准备(建团后确认出团的时候开始) 2个工作日
+3、获得批件
+4、对接公务(团组出发前5日)",
+                        TaskAssignmentCTId: 81
+                    )
+                },
+                {
+                    GroupProcessType.FeeSettle,
+                    (
+                        TemplateId: 1474,
+                        ProcessName: "财务",
+                        Rules: @"",
+                        TaskAssignmentCTId: null
+                    )
                 }
             };
 
@@ -3143,6 +3164,7 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
                 x.Id,
                 CreateTime = x.CreateTime,
                 x.StepOperationTime,
+                x.VisitDays,
             })
             .ToListAsync();
 
@@ -3159,6 +3181,7 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
             // 查询每个团的团组进程
             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>()
@@ -3168,22 +3191,25 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
                 if (group_process != null)
                 {
                     var detailList = await _sqlSugar.Queryable<Grp_ProcessNode>()
-                    .Where(x => x.IsDel == 0 && x.ProcessId == group_process.ProcessOrder)
+                    .Where(x => x.IsDel == 0 && x.ProcessId == group_process.Id)
                     .Select(x => new
                     {
                         x.NodeName,
                         x.OverallStatus,
                         x.NodeDescTips,
                         x.ActualDone,
+                        x.IsFileUp,
+                        x.IsAssist,
+                        x.IsPart
                     })
                     .ToListAsync();
 
-                    var startTime = item.VisitDate.ToString("yyyy - MM - dd");
+                    var confirmStartTime = item.CreateTime.ToString("yyyy - MM - dd");
                     if (item.StepOperationTime.HasValue && item.StepOperationTime != DateTime.MinValue)
-                        startTime = item.StepOperationTime.Value.ToString("yyyy - MM - dd");
+                        confirmStartTime = item.StepOperationTime.Value.ToString("yyyy - MM - dd");
 
-                    group_process_data += $"团组名称:{item.TeamName}," +
-                    $"出访日期:{startTime},团组创建时间:{item.CreateTime.ToString("yyyy - MM - dd HH:mm:ss")},团组{config.ProcessName}进程信息如下:{JsonConvert.SerializeObject(detailList)}\r\n\r\n";
+                    group_process_data += $"团组名称:{item.TeamName},确认出团时间:{confirmStartTime}," +
+                    $"出访日期:{item.VisitDate.ToString("yyyy - MM - dd")} - {item.VisitDate.AddDays(item.VisitDays).ToString("yyyy - MM - dd")},团组创建时间:{item.CreateTime.ToString("yyyy - MM - dd HH:mm:ss")},团组{config.ProcessName}进程信息如下:{JsonConvert.SerializeObject(detailList)}\r\n\r\n";
                 }
             }
 
@@ -3201,7 +3227,6 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
 
             根据我提供的团组数据以及规则(ActualDone字段为实际完成时间,OverallStatus字段为节点状态 1=未开始,2=进行中,3=已完成),判断是否按时完成每个环节(没有指定时间则只要在团组出发前完成即可),并且分析该员工{user_entity.CnName}的工作情况。";
 
-            // 使用模板格式化问题(如果存在)
             try
             {
                 var str = await _sqlSugar.Queryable<Sys_SetData>().FirstAsync(x => x.Id == config.TemplateId && x.IsDel == 0);
@@ -3393,6 +3418,55 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
                 }
             }
 
+
+            //获取请假数据
+            var filters_qj = new List<IQiYeWeChatApiService.FilterCondition>(){
+                 new
+                  IQiYeWeChatApiService.FilterCondition{
+                     key = "creator",
+                     value = user_entity.QiyeChatUserId
+                  },
+                  new IQiYeWeChatApiService.FilterCondition{
+                    key="record_type",
+                    value="1"
+                  },
+                  new IQiYeWeChatApiService.FilterCondition{
+                    key="sp_status",
+                    value="2"
+                  }};
+
+            //获取企微请假申请信息
+            var approval_data_qj = await _qiYeWeChatApiService.GetApprovalInfoUpdateAsync(start, end, newCursor: "", size: 100, filters: filters_qj);
+            if (approval_data_qj.errcode != 0)
+            {
+                jw.Msg = "获取企微请假申请信息失败!" + approval_data_qj.errmsg;
+                return null;
+            }
+
+            //获取上月企微请假申请信息
+            var approval_data_qj_upMonth = await _qiYeWeChatApiService.GetApprovalInfoUpdateAsync(start.AddMonths(-1), start, newCursor: "", size: 100, filters: filters_qj);
+            if (approval_data_qj_upMonth.errcode != 0)
+            {
+                jw.Msg = "获取企微上月请假申请信息失败!" + approval_data_qj_upMonth.errmsg;
+                return null;
+            }
+
+            var ApprovalDetailList_qj = new List<ApprovalDetailView>();
+            //合并请假数据
+            approval_data_qj.sp_no_list.AddRange(approval_data_qj_upMonth.sp_no_list);
+            approval_data_qj.sp_no_list = approval_data_qj.sp_no_list.Distinct().ToList();
+
+            foreach (var item in approval_data_qj.sp_no_list)
+            {
+                var approval_detail = await _qiYeWeChatApiService.GetApprovalDetailAsync(item);
+                if (approval_detail.errcode != 0)
+                {
+                    jw.Msg = "获取企微请假申请详情失败!" + approval_detail.errmsg;
+                    return null;
+                }
+                ApprovalDetailList_qj.Add(approval_detail);
+            }
+
             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))
@@ -3405,7 +3479,8 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
                         user_entity.CnName,
                         start.ToString("yyyy-MM-dd"),
                         end.ToString("yyyy-MM-dd"),
-                        JsonConvert.SerializeObject(ApprovalDetailList)
+                        JsonConvert.SerializeObject(ApprovalDetailList),
+                        JsonConvert.SerializeObject(ApprovalDetailList_qj)
                     }
                 });
 
@@ -3473,6 +3548,7 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
                 x.Id,
                 CreateTime = x.CreateTime,
                 x.StepOperationTime,
+                x.VisitDays,
             })
             .ToListAsync();
 
@@ -3484,35 +3560,54 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
                 .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();
+                if (group_process != null)
+                {
+                    var detailList = await _sqlSugar.Queryable<Grp_ProcessNode>()
+                        .Where(x => x.IsDel == 0 && x.ProcessId == group_process.Id)
+                        .Select(x => new
+                        {
+                            x.NodeName,
+                            x.OverallStatus,
+                            x.NodeDescTips,
+                            x.ActualDone,
+                            x.IsFileUp,
+                            x.IsAssist,
+                            x.IsPart,
+                            x.Remark,
+                        })
+                        .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");
+                    //获取团组倒推表数据
+                    var back_data = await _sqlSugar.Queryable<Grp_InvertedList>()
+                    .Where(x => x.IsDel == 0 && x.DiId == item.Id)
+                    .ToListAsync();
 
-                group_process_data += $"团组名称:{item.TeamName}," +
-                $"出访日期:{startTime},团组创建时间:{item.CreateTime.ToString("yyyy - MM - dd HH:mm:ss")},团组签证进程信息如下:{JsonConvert.SerializeObject(group_process)}\r\n\r\n";
+                    var confirmStartTime = item.CreateTime.ToString("yyyy - MM - dd");
+                    if (item.StepOperationTime.HasValue && item.StepOperationTime != DateTime.MinValue)
+                        confirmStartTime = item.StepOperationTime.Value.ToString("yyyy - MM - dd");
 
-                if (back_data.Count > 0)
-                {
-                    group_process_data += $"该团组倒退表信息如下:{JsonConvert.SerializeObject(back_data)}\r\n\r\n";
-                }
-                else
-                {
-                    group_process_data += $"该团组倒退表信息为空!\r\n\r\n";
-                }
+                    group_process_data += $"团组名称:{item.TeamName},确认出团时间:{confirmStartTime}," +
+                    $"出访日期:{item.VisitDate.ToString("yyyy - MM - dd")} - {item.VisitDate.AddDays(item.VisitDays).ToString("yyyy - MM - dd")},团组创建时间:{item.CreateTime.ToString("yyyy - MM - dd HH:mm:ss")},团组签证进程信息如下:{JsonConvert.SerializeObject(group_process)}\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";
+                    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 (detailList.Any())
+                    {
+                        group_process_data += $"团组签证进程时间如下:{JsonConvert.SerializeObject(detailList)}\r\n\r\n";
+                    }
+                    else
+                    {
+                        group_process_data += $"团组签证进程时间为空!\r\n\r\n";
+                    }
                 }
+
             }
 
             group_process_question += @$"团组数据:
@@ -3636,7 +3731,7 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
             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))
-            .Where(x => x.ProcessType == GroupProcessType.AirTicket)
+            .Where(x => x.ProcessType == GroupProcessType.LocalGuide)
             .ToListAsync();
 
             var blackCode_group_list = await _sqlSugar.Queryable<Air_TicketBlackCode>()
@@ -3662,30 +3757,48 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
                 //获取团组进程
                 var group_process = process_group_list
                 .Where(x => x.GroupId == item.Id)
-                .ToList();
-
-                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";
+                .FirstOrDefault();
 
-                if (blackCode_data is null)
-                {
-                    group_process_data += "该团组无机票行程代码信息\r\n\r\n";
-                }
-                else
+                if (group_process != null)
                 {
-                    group_process_data += $"该团组机票行程代码最后一个时间为:{blackCode_data.CreateTime.ToString("yyyy - MM - dd HH:mm:ss")}\r\n\r\n";
-                }
+                    var detailList = await _sqlSugar.Queryable<Grp_ProcessNode>()
+                    .Where(x => x.IsDel == 0 && x.ProcessId == group_process.Id)
+                    .Select(x => new
+                    {
+                        x.NodeName,
+                        x.OverallStatus,
+                        x.NodeDescTips,
+                        x.ActualDone,
+                        x.IsFileUp,
+                        x.IsAssist,
+                        x.IsPart
+                    })
+                    .ToListAsync();
 
-                if (back_data.Count > 0)
-                {
-                    group_process_data += $"该团组倒推表开行前会时间为:{back_data.FirstOrDefault()?.PreTripMeetingDt}\r\n\r\n";
-                }
-                else
-                {
-                    group_process_data += "该团组无倒推表开行前会信息\r\n\r\n";
+                    var confirmStartTime = item.CreateTime.ToString("yyyy - MM - dd");
+                    if (item.StepOperationTime.HasValue && item.StepOperationTime != DateTime.MinValue)
+                        confirmStartTime = item.StepOperationTime.Value.ToString("yyyy - MM - dd");
+
+                    group_process_data += $"团组名称:{item.TeamName},确认出团时间:{confirmStartTime}," +
+                    $"出访日期:{item.VisitDate.ToString("yyyy - MM - dd")} - {item.VisitDate.AddDays(item.VisitDays).ToString("yyyy - MM - dd")},团组创建时间:{item.CreateTime.ToString("yyyy - MM - dd HH:mm:ss")},团组机票进程信息如下:{JsonConvert.SerializeObject(detailList)}\r\n\r\n";
+
+                    if (blackCode_data is null)
+                    {
+                        group_process_data += "该团组无机票行程代码信息\r\n\r\n";
+                    }
+                    else
+                    {
+                        group_process_data += $"该团组机票行程代码最后一个时间为:{blackCode_data.CreateTime.ToString("yyyy - MM - dd HH:mm:ss")}\r\n\r\n";
+                    }
+
+                    if (back_data.Count > 0)
+                    {
+                        group_process_data += $"该团组倒推表开行前会时间为:{back_data.FirstOrDefault()?.PreTripMeetingDt}\r\n\r\n";
+                    }
+                    else
+                    {
+                        group_process_data += "该团组无倒推表开行前会信息\r\n\r\n";
+                    }
                 }
             }
 
@@ -3776,9 +3889,7 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
         [HttpGet]
         public async Task<IActionResult> AiPerformanceAnalysis_BusinessInvitationAsync(int userId, DateTime start, DateTime end, int createUserId)
         {
-            var jw = JsonView(false);
-
-            return Ok(jw);
+            return await AiPerformanceAnalysisAsync(userId, start, end, createUserId, GroupProcessType.Invitation);
         }
 
         /// <summary>
@@ -3796,7 +3907,7 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
         }
 
         /// <summary>
-        /// 财务部员工分析
+        /// 财务部员工分析(曾)
         /// </summary>
         /// <param name="userId"></param>
         /// <param name="start"></param>
@@ -3806,7 +3917,114 @@ OPTION (MAXRECURSION 0); -- 允许无限递归      ";
         [HttpGet]
         public async Task<IActionResult> AiPerformanceAnalysis_FinancialDepartmentAsync(int userId, DateTime start, DateTime end, int createUserId)
         {
-            return Ok(await AiPerformanceAnalysis_TaskAllocationAsync(userId, start, end, createUserId, 1474));
+            return await AiPerformanceAnalysisAsync(userId, start, end, createUserId, GroupProcessType.FeeSettle);
+        }
+
+        /// <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_Financial_Fu_DepartmentAsync(int userId, DateTime start, DateTime end, int createUserId)
+        {
+            var jw = JsonView(false);
+            var month = start.ToString("yyyy-MM");
+            var user_entity = await _sqlSugar.Queryable<Sys_Users>().FirstAsync(x => x.Id == userId && x.IsDel == 0);
+            if (user_entity == null)
+            {
+                jw.Msg = "用户不存在!";
+                return Ok(jw);
+            }
+
+            var data = await _companyDailyKyiRep.InfoAsync(month, userId);
+            if (data.Code == 200)
+            {
+                var value = data.Data as List<CompanyDailyKpiView>;
+
+                if (value == null || value.Count == 0)
+                {
+                    jw.Msg = "用户没有日常考情数据!";
+                    return Ok(jw);
+                }
+
+                var valueFormat = value.Select(x => new
+                {
+                    年月 = x.Month,
+                    序号 = x.EvalContentOrder,
+                    内容 = x.EvalContent,
+                    考核人 = x.EvaluatorName,
+                    是否出现失误 = x.IsMistake,
+                    失误原因 = x.MistakeReason
+                }
+                ).ToList();
+
+                string question = string.Empty;
+                var settingTemp = await _sqlSugar.Queryable<Sys_SetData>().FirstAsync(x => x.Id == 1488 && x.IsDel == 0);
+                if (settingTemp != null && !string.IsNullOrEmpty(settingTemp.Remark))
+                {
+                    var temp = await GeneralMethod.StringFormatAsync(new StringFormatDto
+                    {
+                        FormatTemplate = settingTemp.Remark,
+                        Parameters = new List<string> {
+                            JsonConvert.SerializeObject(valueFormat),
+                            user_entity.CnName,
+                            month
+                        }
+                    });
+                    if (temp.Success)
+                    {
+                        question = temp.FormattedResult;
+                    }
+                }
+
+                var resp = await _deepSeekService.ChatAsync(question);
+                if (!resp.Success)
+                {
+                    jw.Msg = "Ai分析用户财务绩效失败!" + resp.Message;
+                    return Ok(jw);
+                }
+
+                var kaoqinResp = await GetKaoqinAnalysisAsync(user_entity, start, end, jw, "Ai分析用户财务绩效");
+                if (string.IsNullOrEmpty(kaoqinResp))
+                {
+                    return Ok(jw);
+                }
+
+                jw.Code = 200;
+                jw.Msg = "操作成功!";
+                jw.Data = new AiResponse()
+                {
+                    Answer = resp.Answer,
+                    KaoqinAnswer = kaoqinResp
+                };
+
+                //存入数据库
+                Pm_PerformanceAnalysis insertData = new Pm_PerformanceAnalysis
+                {
+                    CreateTime = DateTime.Now,
+                    CreateUserId = createUserId,
+                    IsDel = 0,
+                    Year = start.Year,
+                    Month = start.Month,
+                    JsonResult = JsonConvert.SerializeObject(jw.Data),
+                    StartDate = start,
+                    EndDate = end,
+                    UserId = userId
+                };
+
+                await _sqlSugar.Insertable(insertData).ExecuteCommandAsync();
+
+                return Ok(jw);
+            }
+            else
+            {
+                jw.Msg = "获取用户财务绩效数据失败!";
+                return Ok(jw);
+            }
         }
 
         /// <summary>
@@ -5102,7 +5320,7 @@ ORDER BY MonthNumber, CollectionDays";
         /// </param>
         /// <returns></returns>
         [HttpGet]
-        public async Task<IActionResult> KpiInfo(string depName,string jobName)
+        public async Task<IActionResult> KpiInfo(string depName, string jobName)
         {
             var info = await _companyDailyKyiRep.KpiTemplateDataAsync(depName, jobName);
             return Ok(JsonView(info.Item3));