Browse Source

提交

master
赵新宇 2 weeks ago
parent
commit
d4275c000e
  1. 9
      API/TaskManager.Contracts/Dtos/Dtos.cs
  2. 229
      API/Wood.Service/Controllers/RecurringJobInputPageController.cs
  3. 4
      API/Wood.Service/Controllers/RecurringJobOutPageController.cs
  4. 41
      API/Wood.Service/Controllers/TaskConifgureController.cs

9
API/TaskManager.Contracts/Dtos/Dtos.cs

@ -28,6 +28,15 @@ namespace TaskManager.Contracts.Dtos
public int PageSize { get; set; } public int PageSize { get; set; }
} }
public class PagedRequest<T>
{
public string batchNo { get; set; }
public int total { get; set; }
public int pageSize { get; set; }
public int pageNum { get; set; }
public List<T> list { get; set; }=new List<T>();
}
public class PagedResponse<T> public class PagedResponse<T>
{ {
[JsonPropertyName("code")] [JsonPropertyName("code")]

229
API/Wood.Service/Controllers/RecurringJobInputPageController.cs

@ -1,13 +1,17 @@
using Dapper; using Azure.Core;
using Dapper;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using System.Drawing.Printing; using System.Drawing.Printing;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using TaskManager.Contracts.Dtos; using TaskManager.Contracts.Dtos;
using TaskManager.Entity; using TaskManager.Entity;
using TaskManager.EntityFramework; using TaskManager.EntityFramework;
namespace TaskManager.Controllers namespace TaskManager.Controllers
{ {
public class RecurringJobInputPageController<T, TINPUT> : RecurringJobBaseController public class RecurringJobInputPageController<T,OUTPUT> : RecurringJobBaseController where T : BaseEntity
{ {
public RecurringJobInputPageController(HttpClient httpClient, JobDbContext jobDbContext, LogController log) : base(httpClient, jobDbContext, log) public RecurringJobInputPageController(HttpClient httpClient, JobDbContext jobDbContext, LogController log) : base(httpClient, jobDbContext, log)
@ -20,163 +24,136 @@ namespace TaskManager.Controllers
// 查询主表中未完成且子表存在的任务 // 查询主表中未完成且子表存在的任务
} }
private async Task<QRReturnInfo> PostPageAsync(PagedRequest<T> t)
private async Task SyncTaskSubTable(TaskSub master)
{ {
var page = master.SyncedPageCount + 1; // 下一页 try
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 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<T>(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<QRReturnInfo>(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); // 随机生成 "8EG" 的插入位置 (0-29)
if (subTableType == null) return; int position = random.Next(0, 30);
// 分页查询子表未同步记录
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()) for (int i = 0; i < position; i++)
{ {
// 所有子表记录已同步,标记主表完成 sb.Append(chars[random.Next(chars.Length)]);
master.IsSynced = true;
_dbContext.Update(master);
await _dbContext.SaveChangesAsync();
return;
} }
// 标记子表记录为已同步 // 插入 "8EG"
foreach (dynamic record in records) sb.Append("8EG");
// 生成后半部分随机字符串,补足32位
int remainingLength = 32 - sb.Length;
for (int i = 0; i < remainingLength; i++)
{ {
record.IsSynced = true; sb.Append(chars[random.Next(chars.Length)]);
_dbContext.Update(record);
} }
// 更新主表分页数 return sb.ToString();
master.SyncedPageCount = page; }
_dbContext.Update(master);
await _dbContext.SaveChangesAsync();
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<T>(str);//明细表
var records = entites.Skip((page - 1) * pageSize)
.Take(page).ToList();
PagedRequest<T> pagedRequest = new PagedRequest<T>()
{
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<string, Type>
{
{"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<TaskMaster>()
// .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<string, Type>
// {
// {"TaskSubTable1", typeof(TaskSubTable1)},
// {"TaskSubTable2", typeof(TaskSubTable2)}
// };
// return typeMap.TryGetValue(subTableName, out var type) ? type : null;
// }
//}

4
API/Wood.Service/Controllers/RecurringJobOutPageController.cs

@ -157,7 +157,7 @@ namespace TaskManager.Controllers
PagedResponse<ToutputDetial> firstResponse = await GetPageAsync(new PAGE_DTO() { Date = date, IsForce = true }); PagedResponse<ToutputDetial> firstResponse = await GetPageAsync(new PAGE_DTO() { Date = date, IsForce = true });
if (firstResponse == null || firstResponse.Code != 200) if (firstResponse == null || firstResponse.Code != 200)
{ {
await _logger.AddError("首次请求失败,无法获取分页信息。", TaskName); await _logger.AddInfo("首次请求失败,无法获取分页信息。", TaskName);
return allData; return allData;
} }
if (firstResponse.Data.Total == "0") if (firstResponse.Data.Total == "0")
@ -240,7 +240,7 @@ namespace TaskManager.Controllers
} }
else else
{ {
await _logger.AddError($"第 {currentPage} 页未返回数据", TaskName); await _logger.AddInfo($"第 {currentPage} 页未返回数据", TaskName);
} }
// 简单的请求间隔,避免过于频繁 // 简单的请求间隔,避免过于频繁
await Task.Delay(200); await Task.Delay(200);

41
API/Wood.Service/Controllers/TaskConifgureController.cs

@ -275,6 +275,7 @@ namespace TaskManager.Controllers
{ {
var url = task.Url; var url = task.Url;
var path = task.Api; var path = task.Api;
var client = task.Module;
@ -412,7 +413,7 @@ namespace TaskManager.Controllers
case "整车月度生产计划1": case "整车月度生产计划1":
RecurringJob.AddOrUpdate<SupplierProPlaningService>( RecurringJob.AddOrUpdate<SupplierProPlaningService>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName,client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -420,7 +421,7 @@ namespace TaskManager.Controllers
case "M+6月物料需求计划1": case "M+6月物料需求计划1":
RecurringJob.AddOrUpdate<SupplierMrpMonthService>( RecurringJob.AddOrUpdate<SupplierMrpMonthService>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -428,7 +429,7 @@ namespace TaskManager.Controllers
case "整车月度生产计划2": case "整车月度生产计划2":
RecurringJob.AddOrUpdate<SupplierProPlaningService>( RecurringJob.AddOrUpdate<SupplierProPlaningService>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -436,7 +437,7 @@ namespace TaskManager.Controllers
case "M+6月物料需求计划2": case "M+6月物料需求计划2":
RecurringJob.AddOrUpdate<SupplierMrpMonthService>( RecurringJob.AddOrUpdate<SupplierMrpMonthService>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -444,7 +445,7 @@ namespace TaskManager.Controllers
case "日物料需求计划": case "日物料需求计划":
RecurringJob.AddOrUpdate<SupplierMrpDataService>( RecurringJob.AddOrUpdate<SupplierMrpDataService>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -452,7 +453,7 @@ namespace TaskManager.Controllers
case "计划协议": case "计划协议":
RecurringJob.AddOrUpdate<SupplierSaWeekService>( RecurringJob.AddOrUpdate<SupplierSaWeekService>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -460,7 +461,7 @@ namespace TaskManager.Controllers
case "采购订单": case "采购订单":
RecurringJob.AddOrUpdate<SupplierPoService>( RecurringJob.AddOrUpdate<SupplierPoService>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -468,7 +469,7 @@ namespace TaskManager.Controllers
case "过焊装未过总装": case "过焊装未过总装":
RecurringJob.AddOrUpdate<SupplierPorHSCHEDULService>( RecurringJob.AddOrUpdate<SupplierPorHSCHEDULService>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -476,7 +477,7 @@ namespace TaskManager.Controllers
case "过涂装未过总装": case "过涂装未过总装":
RecurringJob.AddOrUpdate<supplierProTSCHEDULService>( RecurringJob.AddOrUpdate<supplierProTSCHEDULService>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -484,7 +485,7 @@ namespace TaskManager.Controllers
case "排序供货": case "排序供货":
RecurringJob.AddOrUpdate<SupplierProCSCHEDULService>( RecurringJob.AddOrUpdate<SupplierProCSCHEDULService>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -492,7 +493,7 @@ namespace TaskManager.Controllers
case "看板配送单": case "看板配送单":
RecurringJob.AddOrUpdate<SupplierDelStateService>( RecurringJob.AddOrUpdate<SupplierDelStateService>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -500,7 +501,7 @@ namespace TaskManager.Controllers
case "退货单": case "退货单":
RecurringJob.AddOrUpdate<SupplierReturnService>( RecurringJob.AddOrUpdate<SupplierReturnService>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -508,7 +509,7 @@ namespace TaskManager.Controllers
case "奇瑞RDC共享库存": case "奇瑞RDC共享库存":
RecurringJob.AddOrUpdate<SupplierInvDataService>( RecurringJob.AddOrUpdate<SupplierInvDataService>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -516,7 +517,7 @@ namespace TaskManager.Controllers
case "日MRP状态监控": case "日MRP状态监控":
RecurringJob.AddOrUpdate<SupplierMrpDataService>( RecurringJob.AddOrUpdate<SupplierMrpDataService>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -524,7 +525,7 @@ namespace TaskManager.Controllers
case "日MRP预警推移": case "日MRP预警推移":
RecurringJob.AddOrUpdate<SupplierMrpWarningService>( RecurringJob.AddOrUpdate<SupplierMrpWarningService>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -532,7 +533,7 @@ namespace TaskManager.Controllers
case "M+6月物料需求计划风险确认": case "M+6月物料需求计划风险确认":
RecurringJob.AddOrUpdate<SUPPLIER_CON_MMRP_CONTROLLER>( RecurringJob.AddOrUpdate<SUPPLIER_CON_MMRP_CONTROLLER>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -540,7 +541,7 @@ namespace TaskManager.Controllers
case "日物料需求计划风险确认": case "日物料需求计划风险确认":
RecurringJob.AddOrUpdate<SUPPLIER_CON_DATE_CONTROLLER>( RecurringJob.AddOrUpdate<SUPPLIER_CON_DATE_CONTROLLER>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -548,7 +549,7 @@ namespace TaskManager.Controllers
case "采购订单风险确认": case "采购订单风险确认":
RecurringJob.AddOrUpdate<SUPPLIER_CON_PO_CONTROLLER>( RecurringJob.AddOrUpdate<SUPPLIER_CON_PO_CONTROLLER>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -557,7 +558,7 @@ namespace TaskManager.Controllers
RecurringJob.AddOrUpdate<SupplierSinvDataService>( RecurringJob.AddOrUpdate<SupplierSinvDataService>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );
@ -565,7 +566,7 @@ namespace TaskManager.Controllers
case "供应商共享库存-晚上": case "供应商共享库存-晚上":
RecurringJob.AddOrUpdate<SupplierSinvDataService>( RecurringJob.AddOrUpdate<SupplierSinvDataService>(
task.TaskName, task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName), x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn, task.Corn,
TimeZoneInfo.Local TimeZoneInfo.Local
); );

Loading…
Cancel
Save