You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

183 lines
5.6 KiB

using Dapper;
using Microsoft.EntityFrameworkCore;
using System.Drawing.Printing;
using TaskManager.Contracts.Dtos;
using TaskManager.Entity;
using TaskManager.EntityFramework;
namespace TaskManager.Controllers
{
public class RecurringJobInputPageController<T, TINPUT> : RecurringJobBaseController
{
public RecurringJobInputPageController(HttpClient httpClient, JobDbContext jobDbContext, LogController log) : base(httpClient, jobDbContext, log)
{
}
public async Task ProcessUnsyncedTasks()
{
// 查询主表中未完成且子表存在的任务
}
private async Task SyncTaskSubTable(TaskSub master)
{
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())
{
foreach (var sub in sublist)
{
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();
}
}
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;
}
}
//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;
// }
//}
}