|
|
@@ -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; }
|