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 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>
{
[JsonPropertyName("code")]

229
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<T, TINPUT> : RecurringJobBaseController
public class RecurringJobInputPageController<T,OUTPUT> : 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<QRReturnInfo> PostPageAsync(PagedRequest<T> 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<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);
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<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 });
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);

41
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<SupplierProPlaningService>(
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<SupplierMrpMonthService>(
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<SupplierProPlaningService>(
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<SupplierMrpMonthService>(
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<SupplierMrpDataService>(
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<SupplierSaWeekService>(
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<SupplierPoService>(
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<SupplierPorHSCHEDULService>(
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<supplierProTSCHEDULService>(
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<SupplierProCSCHEDULService>(
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<SupplierDelStateService>(
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<SupplierReturnService>(
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<SupplierInvDataService>(
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<SupplierMrpDataService>(
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<SupplierMrpWarningService>(
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<SUPPLIER_CON_MMRP_CONTROLLER>(
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<SUPPLIER_CON_DATE_CONTROLLER>(
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<SUPPLIER_CON_PO_CONTROLLER>(
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<SupplierSinvDataService>(
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<SupplierSinvDataService>(
task.TaskName,
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName),
x => ((IDoExecute)x).ExecuteAsync(url, path, task.TaskName, client),
task.Corn,
TimeZoneInfo.Local
);

Loading…
Cancel
Save