diff --git a/API/Wood.Service/Controllers/CheryRecurringJobInputPageController.cs b/API/Wood.Service/Controllers/CheryRecurringJobInputPageController.cs index 2e78741..09f735f 100644 --- a/API/Wood.Service/Controllers/CheryRecurringJobInputPageController.cs +++ b/API/Wood.Service/Controllers/CheryRecurringJobInputPageController.cs @@ -205,6 +205,7 @@ namespace TaskManager.Controllers } [NonAction] + public async Task SyncTaskSubTable(string taskName, string client) { var version = DateTime.Now.ToString("yyyyMMdd"); @@ -214,30 +215,38 @@ namespace TaskManager.Controllers await _logger.AddError("任务名称或客户端不能为空", taskName, Guid.NewGuid(), version); return; } - var sublist = _jobDbContext.TaskSub.Where(p => taskName.Contains(p.TaskName) && p.WriteState == false && p.Subscriber == client).ToList(); + + var sublist = _jobDbContext.TaskSub + .Where(p => taskName.Contains(p.TaskName) && p.WriteState == false && p.Subscriber == client) + .ToList(); int pageSize = CPageSize; + if (sublist.Any()) { foreach (var sub in sublist) { - string querystr = $"select * from {sub.TableName} where TaskId='{sub.TaskId}' and WriteState=0 and ReadState=1 order by uid";//任务表 - var entites = _jobDbContext.Database.GetDbConnection().Query(querystr);//明细表 + string querystr = $"select * from {sub.TableName} where TaskId='{sub.TaskId}' and WriteState=0 and ReadState=1 order by uid"; + var entites = _jobDbContext.Database.GetDbConnection().Query(querystr); + if (entites.Any()) { - var total = entites.Count(); sub.DataCount = total; int totalPages = (int)Math.Ceiling((double)total / pageSize); int startPage = sub.SyncedPageCount == 0 ? 1 : sub.SyncedPageCount; int errorNumber = 0; - List errorlist=new List(); + int failedRecordCount = 0; // 新增:记录失败的总记录数 + List errorPages = new List(); // 新增:记录失败的页码 for (int i = startPage; i <= totalPages; i++) { + int pageRecordCount = Math.Min(pageSize, total - (i - 1) * pageSize); // 计算当前页实际记录数 var records = entites.Skip((i - 1) * pageSize) - .Take(pageSize).ToList(); - #region dto转换作为参数发给客户API 因为实体比DTO字段多 + .Take(pageRecordCount) + .ToList(); + + #region dto转换作为参数发给客户API List dtos = new List(); foreach (var itm in records) { @@ -254,16 +263,19 @@ namespace TaskManager.Controllers pageNum = i }; #endregion + foreach (var itm in records) { itm.WriteState = true; itm.RequestDate = requestDate; } + var result = await PostPageAsync(pagedRequest, sub.TaskId, version); if (result.code == 200) { await _logger.AddSuccess($"第 {i} 页奇瑞数据保存成功", TaskName, sub.TaskId, version); _jobDbContext.BulkUpdate(records, options => options.UseTableLock = true); + List logs = new List(); foreach (var itm in records) { @@ -276,6 +288,7 @@ namespace TaskManager.Controllers logs.Add(log); } _jobDbContext.BulkInsert(logs, options => options.UseTableLock = true); + sub.SyncedPageCount = i; if (i == totalPages) { @@ -287,11 +300,12 @@ namespace TaskManager.Controllers } else { - //sub.FailedCount = i * pageSize; - //sub.FailedInfo = $"第 {i} 页奇瑞数据保存失败 {result.message}。"; errorNumber++; + failedRecordCount += pageRecordCount; // 累加失败的记录数 + errorPages.Add($"第 {i} 页"); // 记录失败的页码 + string inputjson = string.Empty; - if (TaskName == "日物料需求计划风险确认")//格式特殊处理 + if (TaskName == "日物料需求计划风险确认") { inputjson = JsonSerializer.Serialize(pagedRequest, new JsonSerializerOptions @@ -299,14 +313,13 @@ namespace TaskManager.Controllers PropertyNamingPolicy = JsonNamingPolicy.CamelCase, Converters = { - new DecimalTrimConverter(), - new InputCustomDateTimeConverter(), - new InputCustomNullableDateTimeConverter() + new DecimalTrimConverter(), + new InputCustomDateTimeConverter(), + new InputCustomNullableDateTimeConverter() }, - WriteIndented = false,// 可选,用于格式化输出 + WriteIndented = false, Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All) - } - ); + }); } else { @@ -316,22 +329,25 @@ namespace TaskManager.Controllers PropertyNamingPolicy = JsonNamingPolicy.CamelCase, Converters = { - new DecimalTrimConverter(), + new DecimalTrimConverter(), }, - WriteIndented = false,// 可选,用于格式化输出 + WriteIndented = false, Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All) - } - ); + }); } - errorlist.Add($"第 {i} 页奇瑞数据保存失败 {result.message}"); - await _logger.AddError($"第 {i} 页奇瑞数据保存失败 {result.message}。", TaskName, sub.TaskId, version,inputjson); + await _logger.AddError($"第 {i} 页奇瑞数据保存失败 {result.message}。", TaskName, sub.TaskId, version, inputjson); } } - if (errorNumber> 0) + + if (errorNumber > 0) { await _logger.AddError($"奇瑞{sub.TaskId}任务失败,请检查数据。", TaskName, sub.TaskId, version); - sub.FailedCount = errorNumber>totalPages? totalPages* pageSize: errorNumber * pageSize; - sub.FailedInfo = $"奇瑞{sub.TaskId}任务失败{errorlist.FirstOrDefault()},请检查数据。"; + + sub.FailedCount = failedRecordCount; + + + sub.FailedInfo = $"奇瑞{sub.TaskId}任务在{string.Join("、", errorPages)}失败,共{failedRecordCount}条记录失败,请检查数据。"; + sub.WriteState = true; _jobDbContext.Set().Update(sub); _jobDbContext.SaveChanges(); @@ -340,7 +356,143 @@ namespace TaskManager.Controllers } } } - + + //public async Task SyncTaskSubTable(string taskName, string client) + //{ + // var version = DateTime.Now.ToString("yyyyMMdd"); + // var requestDate = DateTime.Now.ToString("yyyy-MM-dd"); + // if (string.IsNullOrEmpty(taskName) || string.IsNullOrEmpty(client)) + // { + // await _logger.AddError("任务名称或客户端不能为空", taskName, Guid.NewGuid(), version); + // return; + // } + // var sublist = _jobDbContext.TaskSub.Where(p => taskName.Contains(p.TaskName) && p.WriteState == false && p.Subscriber == client).ToList(); + // int pageSize = CPageSize; + // if (sublist.Any()) + // { + // foreach (var sub in sublist) + // { + // string querystr = $"select * from {sub.TableName} where TaskId='{sub.TaskId}' and WriteState=0 and ReadState=1 order by uid";//任务表 + // var entites = _jobDbContext.Database.GetDbConnection().Query(querystr);//明细表 + // if (entites.Any()) + // { + + // var total = entites.Count(); + // sub.DataCount = total; + // int totalPages = (int)Math.Ceiling((double)total / pageSize); + // int startPage = sub.SyncedPageCount == 0 ? 1 : sub.SyncedPageCount; + + // int errorNumber = 0; + // List errorlist=new List(); + + // for (int i = startPage; i <= totalPages; i++) + // { + // var records = entites.Skip((i - 1) * pageSize) + // .Take(pageSize).ToList(); + // #region dto转换作为参数发给客户API 因为实体比DTO字段多 + // List dtos = new List(); + // foreach (var itm in records) + // { + // TDTO dto = new TDTO(); + // dto.InjectFrom(itm); + // dtos.Add(dto); + // } + // PagedRequest pagedRequest = new PagedRequest() + // { + // batchNo = GenerateRandomStringWith8EG(), + // total = entites.Count(), + // pageSize = pageSize, + // list = dtos, + // pageNum = i + // }; + // #endregion + // foreach (var itm in records) + // { + // itm.WriteState = true; + // itm.RequestDate = requestDate; + // } + // var result = await PostPageAsync(pagedRequest, sub.TaskId, version); + // if (result.code == 200) + // { + // await _logger.AddSuccess($"第 {i} 页奇瑞数据保存成功", TaskName, sub.TaskId, version); + // _jobDbContext.BulkUpdate(records, options => options.UseTableLock = true); + // List logs = new List(); + // foreach (var itm in records) + // { + // TLOGS log = new TLOGS(); + // log.InjectFrom(itm); + // log.RequestDate = requestDate; + // log.TaskId = sub.TaskId; + // log.WriteState = true; + // log.ReadState = true; + // logs.Add(log); + // } + // _jobDbContext.BulkInsert(logs, options => options.UseTableLock = true); + // sub.SyncedPageCount = i; + // if (i == totalPages) + // { + // sub.WriteState = true; + // _jobDbContext.Set().Update(sub); + // _jobDbContext.SaveChanges(); + // await _logger.AddSuccess($"奇瑞{sub.TaskId}任务完成据保存成功", TaskName, sub.TaskId, version); + // } + // } + // else + // { + // //sub.FailedCount = i * pageSize; + // //sub.FailedInfo = $"第 {i} 页奇瑞数据保存失败 {result.message}。"; + // errorNumber++; + // string inputjson = string.Empty; + // if (TaskName == "日物料需求计划风险确认")//格式特殊处理 + // { + // inputjson = JsonSerializer.Serialize(pagedRequest, + // new JsonSerializerOptions + // { + // PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + // Converters = + // { + // new DecimalTrimConverter(), + // new InputCustomDateTimeConverter(), + // new InputCustomNullableDateTimeConverter() + // }, + // WriteIndented = false,// 可选,用于格式化输出 + // Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All) + // } + // ); + // } + // else + // { + // inputjson = JsonSerializer.Serialize(pagedRequest, + // new JsonSerializerOptions + // { + // PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + // Converters = + // { + // new DecimalTrimConverter(), + // }, + // WriteIndented = false,// 可选,用于格式化输出 + // Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All) + // } + // ); + // } + // errorlist.Add($"第 {i} 页奇瑞数据保存失败 {result.message}"); + // await _logger.AddError($"第 {i} 页奇瑞数据保存失败 {result.message}。", TaskName, sub.TaskId, version,inputjson); + // } + // } + // if (errorNumber> 0) + // { + // await _logger.AddError($"奇瑞{sub.TaskId}任务失败,请检查数据。", TaskName, sub.TaskId, version); + // sub.FailedCount = errorNumber>totalPages? totalPages* pageSize: errorNumber * pageSize; + // sub.FailedInfo = $"奇瑞{sub.TaskId}任务失败{errorlist.FirstOrDefault()},请检查数据。"; + // sub.WriteState = true; + // _jobDbContext.Set().Update(sub); + // _jobDbContext.SaveChanges(); + // } + // } + // } + // } + //} + [HttpGet] public async Task>> GetAll() {