diff --git a/API/TaskManager.Contracts/Dtos/Dtos.cs b/API/TaskManager.Contracts/Dtos/Dtos.cs index bab83f5..df0335f 100644 --- a/API/TaskManager.Contracts/Dtos/Dtos.cs +++ b/API/TaskManager.Contracts/Dtos/Dtos.cs @@ -28,6 +28,15 @@ namespace TaskManager.Contracts.Dtos public int PageSize { get; set; } } + public class PagedRequest + { + public string batchNo { get; set; } + public int total { get; set; } + public int pageSize { get; set; } + public int pageNum { get; set; } + public List list { get; set; }=new List(); + } + public class PagedResponse { [JsonPropertyName("code")] diff --git a/API/Wood.Service/Controllers/RecurringJobInputPageController.cs b/API/Wood.Service/Controllers/RecurringJobInputPageController.cs index 6ae7e06..9453803 100644 --- a/API/Wood.Service/Controllers/RecurringJobInputPageController.cs +++ b/API/Wood.Service/Controllers/RecurringJobInputPageController.cs @@ -1,13 +1,17 @@ -using Dapper; +using Azure.Core; +using Dapper; using Microsoft.EntityFrameworkCore; using System.Drawing.Printing; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; using TaskManager.Contracts.Dtos; using TaskManager.Entity; using TaskManager.EntityFramework; namespace TaskManager.Controllers { - public class RecurringJobInputPageController : RecurringJobBaseController + public class RecurringJobInputPageController : RecurringJobBaseController where T : BaseEntity { public RecurringJobInputPageController(HttpClient httpClient, JobDbContext jobDbContext, LogController log) : base(httpClient, jobDbContext, log) @@ -20,163 +24,136 @@ namespace TaskManager.Controllers // 查询主表中未完成且子表存在的任务 } - - private async Task SyncTaskSubTable(TaskSub master) + private async Task PostPageAsync(PagedRequest t) { - var page = master.SyncedPageCount + 1; // 下一页 - var sublist=_jobDbContext.TaskSub.Where(p => p.TaskName == master.TaskName && p.WriteState == false).ToList(); - int pageSize = 1000; - - if (!sublist.Any()) + try { - foreach (var sub in sublist) + var inputjson = JsonSerializer.Serialize(t, + new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + WriteIndented = true // 可选,用于格式化输出 + } + ); + inputjson = RemoveWhitespace(inputjson); + var content = await Post(Url, Path, inputjson); + if (!string.IsNullOrEmpty(content)) { - string str = $"select * from {sub.TableName} where TaskId={sub.TaskId} and WriteState=false order by uid"; - var entites=_jobDbContext.Database.GetDbConnection().Query(str); - var subTableQuery=entites.Skip((page - 1) * pageSize) - .Take(page).ToList(); - - - - - - + var options = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + Converters = { + new JsonStringEnumConverter(), // 枚举转换 + new CustomDateTimeConverter("yyyy-MM-dd HH:mm:ss") // 日期转换 + } + }; + return JsonSerializer.Deserialize(content, options); + } + else + { + await _logger.AddError($"调用接口无返回值{Url}", TaskName); + return null; } } + catch (Exception ex) + { + await _logger.AddError($"调用接口无返回值错误{ex.Message}", TaskName); + return null; + } + } + public static string GenerateRandomStringWith8EG() + { + const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + var random = new Random(); + var sb = new StringBuilder(32); - Type subTableType = GetSubTableType(master.SubTableName); - if (subTableType == null) return; - - // 分页查询子表未同步记录 - var subTableQuery = _dbContext.Set(subTableType) - .Where($"TaskId == {master.TaskId} AND IsSynced == false") - .OrderBy("Id") // 假设子表有排序字段 - .Skip((page - 1) * PageSize) - .Take(PageSize); + // 随机生成 "8EG" 的插入位置 (0-29) + int position = random.Next(0, 30); - var records = await subTableQuery.ToListAsync(); - if (!records.Any()) + // 生成前半部分随机字符串 + for (int i = 0; i < position; i++) { - // 所有子表记录已同步,标记主表完成 - master.IsSynced = true; - _dbContext.Update(master); - await _dbContext.SaveChangesAsync(); - return; + sb.Append(chars[random.Next(chars.Length)]); } - // 标记子表记录为已同步 - foreach (dynamic record in records) + // 插入 "8EG" + sb.Append("8EG"); + + // 生成后半部分随机字符串,补足32位 + int remainingLength = 32 - sb.Length; + for (int i = 0; i < remainingLength; i++) { - record.IsSynced = true; - _dbContext.Update(record); + sb.Append(chars[random.Next(chars.Length)]); } - // 更新主表分页数 - master.SyncedPageCount = page; - _dbContext.Update(master); - await _dbContext.SaveChangesAsync(); + return sb.ToString(); + } + private async Task SyncTaskSubTable(TaskSub master) + { + var sublist = _jobDbContext.TaskSub.Where(p => p.TaskName == master.TaskName && p.WriteState == false).ToList(); + int pageSize = 1000; + if (!sublist.Any()) + { + foreach (var sub in sublist) + { + var page = sub.SyncedPageCount + 1; // 下一页 + string str = $"select * from {sub.TableName} where TaskId='{sub.TaskId}' and WriteState=0 order by uid";//任务表 + var entites = _jobDbContext.Database.GetDbConnection().Query(str);//明细表 + var records = entites.Skip((page - 1) * pageSize) + .Take(page).ToList(); + PagedRequest pagedRequest = new PagedRequest() + { + batchNo = GenerateRandomStringWith8EG(), + total = entites.Count(), + pageSize = pageSize, + list = records, + pageNum = page + }; + foreach (var itm in records) + { + itm.WriteState = true; + } + var result = await PostPageAsync(pagedRequest); + if (result.code == "200") + { + _jobDbContext.BulkUpdate(records); + sub.SyncedPageCount = page; + } + else + { + await _logger.AddError($"第 {page} 页数据保存失败,请检查数据。", TaskName); + } + //if (!records.Any()) + //{ + // // 所有子表记录已同步,标记主表完成 + // master.WriteState = true; + // _dbContext.Update(master); + // await _dbContext.SaveChangesAsync(); + // return; + //} + } + } } - private Type GetSubTableType(string subTableName) - { - // 示例:通过子表名映射实体类型(实际需根据业务逻辑实现) - var typeMap = new Dictionary - { - {"TaskSubTable1", typeof(TaskSubTable1)}, - {"TaskSubTable2", typeof(TaskSubTable2)} - }; - return typeMap.TryGetValue(subTableName, out var type) ? type : null; - } + } - //public class TaskSyncService - //{ - // private readonly DbContext _dbContext; - // private const int PageSize = 100; // 每页读取数量 - - // public TaskSyncService(DbContext dbContext) - // { - // _dbContext = dbContext; - // } - - // public async Task ProcessUnsyncedTasks() - // { - // // 查询主表中未完成且子表存在的任务 - // var masters = await _dbContext.Set() - // .Where(m => !m.IsSynced && !string.IsNullOrEmpty(m.SubTableName)) - // .ToListAsync(); - - // foreach (var master in masters) - // { - // await SyncTaskSubTable(master); - // } - // } - - // private async Task SyncTaskSubTable(TaskMaster master) - // { - // var page = master.SyncedPageCount + 1; // 下一页 - - // // 动态获取子表类型(需根据实际场景实现,如通过字典映射子表名到实体类型) - // Type subTableType = GetSubTableType(master.SubTableName); - // if (subTableType == null) return; - - // // 分页查询子表未同步记录 - // var subTableQuery = _dbContext.Set(subTableType) - // .Where($"TaskId == {master.TaskId} AND IsSynced == false") - // .OrderBy("Id") // 假设子表有排序字段 - // .Skip((page - 1) * PageSize) - // .Take(PageSize); - - // var records = await subTableQuery.ToListAsync(); - // if (!records.Any()) - // { - // // 所有子表记录已同步,标记主表完成 - // master.IsSynced = true; - // _dbContext.Update(master); - // await _dbContext.SaveChangesAsync(); - // return; - // } - - // // 标记子表记录为已同步 - // foreach (dynamic record in records) - // { - // record.IsSynced = true; - // _dbContext.Update(record); - // } - - // // 更新主表分页数 - // master.SyncedPageCount = page; - // _dbContext.Update(master); - // await _dbContext.SaveChangesAsync(); - // } - - // private Type GetSubTableType(string subTableName) - // { - // // 示例:通过子表名映射实体类型(实际需根据业务逻辑实现) - // var typeMap = new Dictionary - // { - // {"TaskSubTable1", typeof(TaskSubTable1)}, - // {"TaskSubTable2", typeof(TaskSubTable2)} - // }; - // return typeMap.TryGetValue(subTableName, out var type) ? type : null; - // } - //} diff --git a/API/Wood.Service/Controllers/RecurringJobOutPageController.cs b/API/Wood.Service/Controllers/RecurringJobOutPageController.cs index 3ce39ef..fece58f 100644 --- a/API/Wood.Service/Controllers/RecurringJobOutPageController.cs +++ b/API/Wood.Service/Controllers/RecurringJobOutPageController.cs @@ -157,7 +157,7 @@ namespace TaskManager.Controllers PagedResponse firstResponse = await GetPageAsync(new PAGE_DTO() { Date = date, IsForce = true }); if (firstResponse == null || firstResponse.Code != 200) { - await _logger.AddError("首次请求失败,无法获取分页信息。", TaskName); + await _logger.AddInfo("首次请求失败,无法获取分页信息。", TaskName); return allData; } if (firstResponse.Data.Total == "0") @@ -240,7 +240,7 @@ namespace TaskManager.Controllers } else { - await _logger.AddError($"第 {currentPage} 页未返回数据", TaskName); + await _logger.AddInfo($"第 {currentPage} 页未返回数据", TaskName); } // 简单的请求间隔,避免过于频繁 await Task.Delay(200); diff --git a/API/Wood.Service/Controllers/TaskConifgureController.cs b/API/Wood.Service/Controllers/TaskConifgureController.cs index 63451ee..bc3f779 100644 --- a/API/Wood.Service/Controllers/TaskConifgureController.cs +++ b/API/Wood.Service/Controllers/TaskConifgureController.cs @@ -275,6 +275,7 @@ namespace TaskManager.Controllers { var url = task.Url; var path = task.Api; + var client = task.Module; @@ -412,7 +413,7 @@ namespace TaskManager.Controllers case "整车月度生产计划1": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName,client), task.Corn, TimeZoneInfo.Local ); @@ -420,7 +421,7 @@ namespace TaskManager.Controllers case "M+6月物料需求计划1": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local ); @@ -428,7 +429,7 @@ namespace TaskManager.Controllers case "整车月度生产计划2": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local ); @@ -436,7 +437,7 @@ namespace TaskManager.Controllers case "M+6月物料需求计划2": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local ); @@ -444,7 +445,7 @@ namespace TaskManager.Controllers case "日物料需求计划": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local ); @@ -452,7 +453,7 @@ namespace TaskManager.Controllers case "计划协议": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local ); @@ -460,7 +461,7 @@ namespace TaskManager.Controllers case "采购订单": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local ); @@ -468,7 +469,7 @@ namespace TaskManager.Controllers case "过焊装未过总装": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local ); @@ -476,7 +477,7 @@ namespace TaskManager.Controllers case "过涂装未过总装": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local ); @@ -484,7 +485,7 @@ namespace TaskManager.Controllers case "排序供货": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local ); @@ -492,7 +493,7 @@ namespace TaskManager.Controllers case "看板配送单": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local ); @@ -500,7 +501,7 @@ namespace TaskManager.Controllers case "退货单": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local ); @@ -508,7 +509,7 @@ namespace TaskManager.Controllers case "奇瑞RDC共享库存": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local ); @@ -516,7 +517,7 @@ namespace TaskManager.Controllers case "日MRP状态监控": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local ); @@ -524,7 +525,7 @@ namespace TaskManager.Controllers case "日MRP预警推移": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local ); @@ -532,7 +533,7 @@ namespace TaskManager.Controllers case "M+6月物料需求计划风险确认": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local ); @@ -540,7 +541,7 @@ namespace TaskManager.Controllers case "日物料需求计划风险确认": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local ); @@ -548,7 +549,7 @@ namespace TaskManager.Controllers case "采购订单风险确认": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local ); @@ -557,7 +558,7 @@ namespace TaskManager.Controllers RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local ); @@ -565,7 +566,7 @@ namespace TaskManager.Controllers case "供应商共享库存-晚上": RecurringJob.AddOrUpdate( task.TaskName, - x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), + x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client), task.Corn, TimeZoneInfo.Local );