|
|
@ -488,41 +488,9 @@ namespace TaskManager.Controllers |
|
|
|
await _repository.DeleteAsync(id); |
|
|
|
return new JsonResult(new { Code = 200, Message = "删除成功!" }); ; |
|
|
|
} |
|
|
|
/// <summary>
|
|
|
|
/// 分页
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="pageNumber">第几页</param>
|
|
|
|
/// <param name="pageSize">每页条数</param>
|
|
|
|
/// <param name="sortBy">排序字段</param>
|
|
|
|
/// <param name="isAscending">正序还是倒序</param>
|
|
|
|
/// <param name="filters">过滤条件</param>
|
|
|
|
/// <returns></returns>
|
|
|
|
//[HttpGet]
|
|
|
|
//public async Task<ActionResult> GetPaged(
|
|
|
|
//[FromQuery] int pageNumber = 1,
|
|
|
|
//[FromQuery] int pageSize = 10,
|
|
|
|
//[FromQuery] string sortBy = "",
|
|
|
|
//[FromQuery] bool isAscending = true,
|
|
|
|
//[FromQuery] Dictionary<string, string> filters = null)
|
|
|
|
//{
|
|
|
|
// var pagingParams = new PagingParams
|
|
|
|
// {
|
|
|
|
// PageNumber = pageNumber,
|
|
|
|
// PageSize = pageSize,
|
|
|
|
// SortBy = sortBy,
|
|
|
|
// IsAscending = isAscending,
|
|
|
|
// Filters = filters
|
|
|
|
// };
|
|
|
|
|
|
|
|
// // 可以在这里构建表达式树过滤条件
|
|
|
|
// Expression<Func<T, bool>> filter = null;
|
|
|
|
|
|
|
|
// var pagedResult = await _repository.GetPagedAsync(filter, pagingParams);
|
|
|
|
// return Ok(pagedResult);
|
|
|
|
//}
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 分页New
|
|
|
|
/// 分页
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="input"></param>
|
|
|
|
/// <returns></returns>
|
|
|
@ -553,34 +521,7 @@ namespace TaskManager.Controllers |
|
|
|
/// <param name="sortBy">排序字段</param>
|
|
|
|
/// <param name="isAscending">正序还是倒序</param>
|
|
|
|
/// <param name="filters">过滤条件</param>
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
|
|
// [HttpGet]
|
|
|
|
// public async Task<FileStreamResult> Export([FromQuery] int pageNumber = 1,
|
|
|
|
//[FromQuery] int pageSize = 10,
|
|
|
|
//[FromQuery] string sortBy = "",
|
|
|
|
//[FromQuery] bool isAscending = true,
|
|
|
|
//[FromQuery] Dictionary<string, string> filters = null)
|
|
|
|
// {
|
|
|
|
// var pagingParams = new PagingParams
|
|
|
|
// {
|
|
|
|
// PageNumber = pageNumber,
|
|
|
|
// PageSize = pageSize,
|
|
|
|
// SortBy = sortBy,
|
|
|
|
// IsAscending = isAscending,
|
|
|
|
// Filters = filters
|
|
|
|
// };
|
|
|
|
|
|
|
|
// // 可以在这里构建表达式树过滤条件
|
|
|
|
// //Expression<Func<T, bool>> filter = null;
|
|
|
|
|
|
|
|
// var pagedResult = await _repository.GetPagedAsync(null, pagingParams);
|
|
|
|
// return await ExportFile(pagedResult.Data, Guid.NewGuid().ToString() + ".xlsx");
|
|
|
|
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 导出New
|
|
|
|
/// </summary>
|
|
|
@ -777,3 +718,238 @@ namespace TaskManager.Controllers |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/*并发修改*/ |
|
|
|
|
|
|
|
//public class CheryRecurringJobOutPageController<T, ToutputDetial> : RecurringJobBaseController
|
|
|
|
// where T : CherryReadBaseEntity, new()
|
|
|
|
// where ToutputDetial : CherryReadBaseEntityDto
|
|
|
|
//{
|
|
|
|
// // 其他成员保持不变...
|
|
|
|
|
|
|
|
// // 并发控制参数
|
|
|
|
// private readonly int _maxConcurrency;
|
|
|
|
// private readonly SemaphoreSlim _semaphore;
|
|
|
|
|
|
|
|
// public CheryRecurringJobOutPageController(
|
|
|
|
// HttpClient httpClient,
|
|
|
|
// JobDbContext jobDbContext,
|
|
|
|
// LogController log,
|
|
|
|
// IRepository<T> repository,
|
|
|
|
// int maxConcurrency = 5) : base(httpClient, jobDbContext, log)
|
|
|
|
// {
|
|
|
|
// _repository = repository;
|
|
|
|
// _maxConcurrency = maxConcurrency;
|
|
|
|
// _semaphore = new SemaphoreSlim(maxConcurrency);
|
|
|
|
// }
|
|
|
|
|
|
|
|
// [NonAction]
|
|
|
|
// public async Task<List<ToutputDetial>> FetchAllDataAsync(string inputdate)
|
|
|
|
// {
|
|
|
|
// var allData = new List<ToutputDetial>();
|
|
|
|
// int totalItems = 0;
|
|
|
|
// int pageSize = 0;
|
|
|
|
// int currentPage = 1;
|
|
|
|
// string date = !string.IsNullOrEmpty(inputdate) ? inputdate : DateTime.Now.ToString("yyyy-MM-dd");
|
|
|
|
|
|
|
|
// var taskId = Guid.NewGuid();
|
|
|
|
// var version = date.Replace("-", "");
|
|
|
|
|
|
|
|
|
|
|
|
// var readedcount = _jobDbContext.Set<T>().Where(p => p.RequestDate == inputdate).Count();
|
|
|
|
// if (readedcount == 0)
|
|
|
|
// {
|
|
|
|
// PagedResponse<ToutputDetial> firstResponse = await GetPageAsync(new PAGE_DTO() { Date = date, PageSize = CPageSize, IsForce = false }, taskId, version);
|
|
|
|
|
|
|
|
// if (firstResponse == null || firstResponse.Code != 200)
|
|
|
|
// {
|
|
|
|
// await _logger.AddError("首次请求失败,无法获取分页信息。", TaskName, taskId, version);
|
|
|
|
// return allData;
|
|
|
|
// }
|
|
|
|
// if (firstResponse.Data.Total == "0")
|
|
|
|
// {
|
|
|
|
// await _logger.AddInfo("首次请求失败,Total为0是否已经全部读取过。", TaskName, taskId, version);
|
|
|
|
// return allData;
|
|
|
|
// }
|
|
|
|
// if (readedcount != int.Parse(firstResponse.Data.Total))
|
|
|
|
// {
|
|
|
|
// var ids = _jobDbContext.Set<T>().Where(p => p.RequestDate == inputdate).Select(p => p.Id).ToList();
|
|
|
|
// totalItems = int.Parse(firstResponse.Data.Total);
|
|
|
|
// pageSize = int.Parse(firstResponse.Data.PageSize);
|
|
|
|
// List<T> pagefirstList = new List<T>();
|
|
|
|
|
|
|
|
// foreach (var itm in firstResponse.Data.Rows)
|
|
|
|
// {
|
|
|
|
// T entity = new T();
|
|
|
|
// entity.InjectFrom(itm);
|
|
|
|
// entity.CreationTime = DateTime.Now;
|
|
|
|
// entity.RequestDate = date;
|
|
|
|
// pagefirstList.Add(entity);
|
|
|
|
// allData.Add(itm);
|
|
|
|
// }
|
|
|
|
|
|
|
|
// if (pagefirstList.Any())
|
|
|
|
// {
|
|
|
|
// await InsertDataAsync(pagefirstList);
|
|
|
|
// }
|
|
|
|
|
|
|
|
// // 计算总页数
|
|
|
|
// int totalPages = (int)Math.Ceiling((double)totalItems / pageSize);
|
|
|
|
|
|
|
|
// // 并发请求剩余页面
|
|
|
|
// await FetchPagesConcurrently(2, totalPages, date, taskId, version, ids, allData);
|
|
|
|
|
|
|
|
// await _logger.AddInfo($"所有数据获取完成,总共获取了 {allData.Count} 条记录", TaskName, taskId, version);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// else
|
|
|
|
// {
|
|
|
|
// // 类似的逻辑,修改为并发请求
|
|
|
|
// PagedResponse<ToutputDetial> firstResponse = await GetPageAsync(new PAGE_DTO() { Date = date, PageSize = CPageSize, IsForce = true }, taskId, version);
|
|
|
|
// if (firstResponse == null || firstResponse.Code != 200)
|
|
|
|
// {
|
|
|
|
// await _logger.AddInfo("首次请求失败,无法获取分页信息。", TaskName, taskId, version);
|
|
|
|
// return allData;
|
|
|
|
// }
|
|
|
|
// if (firstResponse.Data.Total == "0")
|
|
|
|
// {
|
|
|
|
// await _logger.AddInfo("首次请求失败,Total为0是否已经全部读取过。", TaskName, taskId, version);
|
|
|
|
// return allData;
|
|
|
|
// }
|
|
|
|
// if (readedcount != int.Parse(firstResponse.Data.Total))
|
|
|
|
// {
|
|
|
|
// var ids = _jobDbContext.Set<T>().Where(p => p.RequestDate == inputdate).Select(p => p.Id).ToList();
|
|
|
|
// totalItems = int.Parse(firstResponse.Data.Total);
|
|
|
|
// pageSize = int.Parse(firstResponse.Data.PageSize);
|
|
|
|
// List<T> pagefirstList = new List<T>();
|
|
|
|
|
|
|
|
// foreach (var itm in firstResponse.Data.Rows)
|
|
|
|
// {
|
|
|
|
// T entity = new T();
|
|
|
|
// entity.InjectFrom(itm);
|
|
|
|
// entity.CreationTime = DateTime.Now;
|
|
|
|
// entity.RequestDate = date;
|
|
|
|
// pagefirstList.Add(entity);
|
|
|
|
// allData.Add(itm);
|
|
|
|
// }
|
|
|
|
|
|
|
|
// if (pagefirstList.Any())
|
|
|
|
// {
|
|
|
|
// await InsertDataAsync(pagefirstList);
|
|
|
|
// }
|
|
|
|
|
|
|
|
// int totalPages = (int)Math.Ceiling((double)totalItems / pageSize);
|
|
|
|
|
|
|
|
// // 并发请求剩余页面
|
|
|
|
// await FetchPagesConcurrently(2, totalPages, date, taskId, version, ids, allData);
|
|
|
|
|
|
|
|
// await _logger.AddInfo($"所有数据获取完成,总共获取了 {allData.Count} 条记录", TaskName, taskId, version);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// return allData;
|
|
|
|
// }
|
|
|
|
|
|
|
|
// private async Task FetchPagesConcurrently(int startPage, int totalPages, string date, Guid taskId, string version, List<int> existingIds, List<ToutputDetial> allData)
|
|
|
|
// {
|
|
|
|
// var tasks = new List<Task>();
|
|
|
|
|
|
|
|
// // 为每个页面创建一个任务
|
|
|
|
// for (int page = startPage; page <= totalPages; page++)
|
|
|
|
// {
|
|
|
|
// int currentPage = page; // 避免闭包问题
|
|
|
|
// tasks.Add(ProcessPageAsync(currentPage, date, taskId, version, existingIds, allData));
|
|
|
|
// }
|
|
|
|
|
|
|
|
// // 分批执行任务,控制并发量
|
|
|
|
// for (int i = 0; i < tasks.Count; i += _maxConcurrency)
|
|
|
|
// {
|
|
|
|
// int batchSize = Math.Min(_maxConcurrency, tasks.Count - i);
|
|
|
|
// var batch = tasks.GetRange(i, batchSize);
|
|
|
|
// await Task.WhenAll(batch);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// private async Task ProcessPageAsync(int page, string date, Guid taskId, string version, List<int> existingIds, List<ToutputDetial> allData)
|
|
|
|
// {
|
|
|
|
// await _semaphore.WaitAsync(); // 限制并发量
|
|
|
|
// try
|
|
|
|
// {
|
|
|
|
// PAGE_DTO pageinput = new PAGE_DTO() { Date = date, PageNum = page, PageSize = CPageSize, IsForce = existingIds.Count == 0 ? false : true };
|
|
|
|
// //Console.WriteLine($"正在请求第 {page} 页...");
|
|
|
|
// PagedResponse<ToutputDetial> pageResponse = await GetPageAsync(pageinput, taskId, version);
|
|
|
|
|
|
|
|
// if (pageResponse?.Data.Rows != null && pageResponse.Data.Rows.Count > 0)
|
|
|
|
// {
|
|
|
|
// List<T> pageList = new List<T>();
|
|
|
|
|
|
|
|
// foreach (var itm in pageResponse.Data.Rows)
|
|
|
|
// {
|
|
|
|
// T entity = new T();
|
|
|
|
// entity.InjectFrom(itm);
|
|
|
|
// entity.CreationTime = DateTime.Now;
|
|
|
|
// entity.RequestDate = date;
|
|
|
|
// pageList.Add(entity);
|
|
|
|
// allData.Add(itm);
|
|
|
|
// }
|
|
|
|
|
|
|
|
// if (pageList.Any())
|
|
|
|
// {
|
|
|
|
// await InsertDataAsync(pageList);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// else
|
|
|
|
// {
|
|
|
|
// await _logger.AddInfo($"第 {page} 页未返回数据", TaskName, taskId, version);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// catch (Exception ex)
|
|
|
|
// {
|
|
|
|
// await _logger.AddError($"第 {page} 页请求出错: {ex.Message}", TaskName, taskId, version);
|
|
|
|
// }
|
|
|
|
// finally
|
|
|
|
// {
|
|
|
|
// _semaphore.Release(); // 释放信号量
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// // 优化数据库插入方法,支持批量处理
|
|
|
|
// private async Task InsertDataAsync(List<T> list)
|
|
|
|
// {
|
|
|
|
// if (list.Any())
|
|
|
|
// {
|
|
|
|
// // 使用分块处理大列表,避免内存压力
|
|
|
|
// int batchSize = 500;
|
|
|
|
// for (int i = 0; i < list.Count; i += batchSize)
|
|
|
|
// {
|
|
|
|
// int end = Math.Min(i + batchSize, list.Count);
|
|
|
|
// var batch = list.GetRange(i, end - i);
|
|
|
|
|
|
|
|
// using (var transaction = await _jobDbContext.Database.BeginTransactionAsync())
|
|
|
|
// {
|
|
|
|
// try
|
|
|
|
// {
|
|
|
|
// await _jobDbContext.BulkMergeAsync(batch, options => { options.ColumnPrimaryKeyExpression = p => p.Id; });
|
|
|
|
// await ConfirmDataInsertAsync(batch, _jobDbContext, transaction.GetDbTransaction());
|
|
|
|
// await transaction.CommitAsync();
|
|
|
|
// }
|
|
|
|
// catch (Exception ex)
|
|
|
|
// {
|
|
|
|
// await transaction.RollbackAsync();
|
|
|
|
// await _logger.AddError($"数据插入失败: {ex.Message}", TaskName, Guid.NewGuid(), "1.0");
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// // 短暂延迟,避免数据库过载
|
|
|
|
// await Task.Delay(100);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// // 其他方法保持不变...
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|