using OASystem.API.OAMethodLib; using OASystem.Domain.Entities.System; using OASystem.Domain.ViewModels; using OASystem.Infrastructure.Tools; using Quartz; using SqlSugar; using Newtonsoft.Json; namespace OASystem.API.OAMethodLib.Quartz.Jobs { /// /// 绩效生成定时任务 /// 每月1号5点执行 /// public class PerformanceJob : IJob { private readonly ILogger _logger; private readonly IHttpClientFactory _httpClientFactory; public PerformanceJob(ILogger logger, IHttpClientFactory httpClientFactory) { _logger = logger; _httpClientFactory = httpClientFactory; } /// /// 绩效生成 /// /// /// public async Task Execute(IJobExecutionContext context) { _logger.LogInformation("调用绩效生成任务 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); try { string baseUrl = "http://132.232.92.186:8888/"; baseUrl = baseUrl.TrimEnd('/'); // 创建HttpClient var httpClient = _httpClientFactory.CreateClient(); httpClient.Timeout = TimeSpan.FromMinutes(30); // 设置超时时间 // 计算上个月的时间范围(因为每月1号执行,所以生成上个月的绩效) var now = DateTime.Now; var lastMonth = now.AddMonths(-1); var startDate = new DateTime(lastMonth.Year, lastMonth.Month, 1); var endDate = new DateTime(lastMonth.Year, lastMonth.Month, DateTime.DaysInMonth(lastMonth.Year, lastMonth.Month), 23, 59, 59); _logger.LogInformation($"开始生成绩效数据,时间范围:{startDate:yyyy-MM-dd HH:mm:ss} 至 {endDate:yyyy-MM-dd HH:mm:ss}"); // 获取需要生成绩效的用户列表(通过数据库查询) var sqlSugar = AutofacIocManager.Instance.GetService(); if (sqlSugar == null) { _logger.LogError("无法获取数据库连接,绩效生成任务终止"); return; } // 获取需要生成绩效的用户列表(排除已删除的用户,排除配置中指定的用户ID) var notidsJson = sqlSugar.Queryable().First(x => x.Id == 1463 && x.IsDel == 0)?.Remark; var notids = new List(); if (!string.IsNullOrWhiteSpace(notidsJson)) { try { notids = JsonConvert.DeserializeObject>(notidsJson) ?? new List(); } catch { _logger.LogWarning("解析排除用户ID配置失败"); } } var users = await sqlSugar.Queryable() .LeftJoin((u, d) => u.DepId == d.Id) .LeftJoin((u, d, jp) => u.JobPostId == jp.Id) .Where((u, d, jp) => u.IsDel == 0 && !notids.Contains(u.Id)) .Select((u, d, jp) => new { u.Id, u.CnName, DepName = d.DepName ?? "", JobName = jp.JobName ?? "" }) .ToListAsync(); if (users == null || users.Count == 0) { _logger.LogWarning("未找到需要生成绩效的用户"); return; } _logger.LogInformation($"找到 {users.Count} 个用户需要生成绩效数据"); // 系统管理员ID(用于createUserId参数) int createUserId = 4; // 管理员ID // 为每个用户调用绩效分析API int successCount = 0; int failCount = 0; //添加不同岗位的绩效分析API foreach (var user in users) { try { // 构建API URL string apiUrl = $"{baseUrl}/api/PersonnelModule/AiPerformanceAnalysis_AllDepartment"; // 构建查询参数 var queryParams = new Dictionary { { "userId", user.Id.ToString() }, { "start", startDate.ToString("yyyy-MM-dd HH:mm:ss") }, { "end", endDate.ToString("yyyy-MM-dd HH:mm:ss") }, { "createUserId", createUserId.ToString() } }; // 构建完整URL var queryString = string.Join("&", queryParams.Select(kvp => $"{kvp.Key}={Uri.EscapeDataString(kvp.Value)}")); string fullUrl = $"{apiUrl}?{queryString}"; _logger.LogInformation($"正在为用户 {user.CnName}(ID:{user.Id}, 部门:{user.DepName}) 生成绩效数据..."); _logger.LogInformation($"API URL: {fullUrl}"); // 发送HTTP GET请求 var response = await httpClient.GetAsync(fullUrl); var responseContent = await response.Content.ReadAsStringAsync(); if (response.IsSuccessStatusCode) { // 尝试解析响应结果 try { var result = JsonConvert.DeserializeObject(responseContent); if (result != null && result.Code == 200) { _logger.LogInformation($"用户 {user.CnName}(ID:{user.Id}, 部门:{user.DepName}) 绩效数据生成成功"); successCount++; } else { _logger.LogWarning($"用户 {user.CnName}(ID:{user.Id}, 部门:{user.DepName}) 绩效数据生成失败:{result?.Msg ?? "未知错误"}"); failCount++; } } catch (Exception ex) { _logger.LogError(ex, $"解析用户 {user.CnName}(ID:{user.Id}, 部门:{user.DepName}) 的API响应失败"); failCount++; } } else { _logger.LogError($"用户 {user.CnName}(ID:{user.Id}, 部门:{user.DepName}) 绩效数据生成API调用失败,状态码: {response.StatusCode}, 响应内容: {responseContent}"); failCount++; } // 添加延迟,避免请求过于频繁 await Task.Delay(3000); // 延迟3秒 } catch (Exception ex) { _logger.LogError(ex, $"为用户 {user.CnName}(ID:{user.Id}, 部门:{user.DepName}) 生成绩效数据时发生异常"); failCount++; } } _logger.LogInformation($"绩效生成任务完成!成功:{successCount},失败:{failCount},总计:{users.Count}"); } catch (Exception ex) { _logger.LogError(ex, $"调用绩效生成任务失败 ErrorMsg:{ex.Message} " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } await Task.CompletedTask; } } }