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.
 
 
 

160 lines
5.2 KiB

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,OUTPUT> : RecurringJobBaseController where T : BaseEntity
{
public RecurringJobInputPageController(HttpClient httpClient, JobDbContext jobDbContext, LogController log) : base(httpClient, jobDbContext, log)
{
}
public async Task ProcessUnsyncedTasks()
{
// 查询主表中未完成且子表存在的任务
}
private async Task<QRReturnInfo> PostPageAsync(PagedRequest<T> t)
{
try
{
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))
{
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);
// 随机生成 "8EG" 的插入位置 (0-29)
int position = random.Next(0, 30);
// 生成前半部分随机字符串
for (int i = 0; i < position; i++)
{
sb.Append(chars[random.Next(chars.Length)]);
}
// 插入 "8EG"
sb.Append("8EG");
// 生成后半部分随机字符串,补足32位
int remainingLength = 32 - sb.Length;
for (int i = 0; i < remainingLength; i++)
{
sb.Append(chars[random.Next(chars.Length)]);
}
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;
//}
}
}
}
}
}