using System.Text.Json; using YLErp.Helpers; using YLErp.Modules.TradeModule; namespace YLErp.Web.WebAPI.Controllers { /// /// OA用印状态同步定时任务接口(无鉴权,供PowerJob等外部调度系统调用) /// [ApiController] public class TradeOAJobController : ControllerBase { private static readonly IYcLogger logger = LogFactory.GetLogger(); /// /// 同步OA用印状态 /// /// /// 无需鉴权,建议通过内网限制或Nginx限制来源IP。 /// 可选:在请求Header中携带 X-Job-Api-Key 进行简单校验。 /// [HttpPost] [Route("api/job/tradeContract/syncOAStampStatus")] public JsonResult SyncOAStampStatus() { try { // 可选:简单 API Key 校验 var configKey = AppManager.GetConfiguration()["JobConfig:ApiKey"]; if (!string.IsNullOrEmpty(configKey)) { var requestKey = Request.Headers["X-Job-Api-Key"].FirstOrDefault(); if (configKey != requestKey) { return JsonError(401, "Invalid API Key"); } } logger.Info("开始执行OA用印状态同步任务"); // 使用系统用户身份执行 var systemUser = new OptUserInfo(0, "系统用印同步", OptUserFrom.System); var service = new TradeOAService(systemUser); var results = service.SyncOAStampStatus(); var successCount = results.Count(r => r.Success); var failCount = results.Count(r => !r.Success); logger.Info($"OA用印状态同步任务完成,共处理 {results.Count} 条,成功 {successCount} 条,失败 {failCount} 条"); return JsonSuccess(new { total = results.Count, successCount, failCount, executeTime = DateTime.Now, details = results.Select(r => new { r.TradeId, r.Success, r.Message }).ToList() }); } catch (Exception ex) { logger.Error($"OA用印状态同步任务异常: {ex.Message}", ex); return JsonError($"同步OA用印状态失败: {ex.Message}"); } } #region JSON消息处理 private static readonly JsonSerializerOptions _jsonOptions = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }; private JsonResult JsonSuccess(object data, string msg = null) { return new JsonResult(new ApiResult { code = 0, msg = msg, data = data }, _jsonOptions); } private JsonResult JsonError(string msg) { return new JsonResult(new ApiResult { code = 1, msg = msg, data = null }, _jsonOptions); } private JsonResult JsonError(int code, string msg) { return new JsonResult(new ApiResult { code = code, msg = msg, data = null }, _jsonOptions); } #endregion } }