From f8eadfe47cabfb592303945725623bde2386ad65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=A6=20=E8=B5=B5?= <89237069@qq.com> Date: Thu, 12 Jun 2025 10:09:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CheryRecurringJobOutPageController.cs | 296 ++++++++++++++---- .../CherySupplierConMmrpService.cs | 16 + .../CherySupplierMrpMonthService.cs | 20 ++ 3 files changed, 272 insertions(+), 60 deletions(-) diff --git a/API/Wood.Service/Controllers/CheryRecurringJobOutPageController.cs b/API/Wood.Service/Controllers/CheryRecurringJobOutPageController.cs index 5889592..8c700f5 100644 --- a/API/Wood.Service/Controllers/CheryRecurringJobOutPageController.cs +++ b/API/Wood.Service/Controllers/CheryRecurringJobOutPageController.cs @@ -488,41 +488,9 @@ namespace TaskManager.Controllers await _repository.DeleteAsync(id); return new JsonResult(new { Code = 200, Message = "删除成功!" }); ; } - /// - /// 分页 - /// - /// 第几页 - /// 每页条数 - /// 排序字段 - /// 正序还是倒序 - /// 过滤条件 - /// - //[HttpGet] - //public async Task GetPaged( - //[FromQuery] int pageNumber = 1, - //[FromQuery] int pageSize = 10, - //[FromQuery] string sortBy = "", - //[FromQuery] bool isAscending = true, - //[FromQuery] Dictionary filters = null) - //{ - // var pagingParams = new PagingParams - // { - // PageNumber = pageNumber, - // PageSize = pageSize, - // SortBy = sortBy, - // IsAscending = isAscending, - // Filters = filters - // }; - - // // 可以在这里构建表达式树过滤条件 - // Expression> filter = null; - - // var pagedResult = await _repository.GetPagedAsync(filter, pagingParams); - // return Ok(pagedResult); - //} /// - /// 分页New + /// 分页 /// /// /// @@ -553,34 +521,7 @@ namespace TaskManager.Controllers /// 排序字段 /// 正序还是倒序 /// 过滤条件 - /// - - // [HttpGet] - // public async Task Export([FromQuery] int pageNumber = 1, - //[FromQuery] int pageSize = 10, - //[FromQuery] string sortBy = "", - //[FromQuery] bool isAscending = true, - //[FromQuery] Dictionary filters = null) - // { - // var pagingParams = new PagingParams - // { - // PageNumber = pageNumber, - // PageSize = pageSize, - // SortBy = sortBy, - // IsAscending = isAscending, - // Filters = filters - // }; - // // 可以在这里构建表达式树过滤条件 - // //Expression> filter = null; - - // var pagedResult = await _repository.GetPagedAsync(null, pagingParams); - // return await ExportFile(pagedResult.Data, Guid.NewGuid().ToString() + ".xlsx"); - - - // } - - /// /// 导出New /// @@ -777,3 +718,238 @@ namespace TaskManager.Controllers } + + +/*并发修改*/ + +//public class CheryRecurringJobOutPageController : 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 repository, +// int maxConcurrency = 5) : base(httpClient, jobDbContext, log) +// { +// _repository = repository; +// _maxConcurrency = maxConcurrency; +// _semaphore = new SemaphoreSlim(maxConcurrency); +// } + +// [NonAction] +// public async Task> FetchAllDataAsync(string inputdate) +// { +// var allData = new List(); +// 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().Where(p => p.RequestDate == inputdate).Count(); +// if (readedcount == 0) +// { +// PagedResponse 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().Where(p => p.RequestDate == inputdate).Select(p => p.Id).ToList(); +// totalItems = int.Parse(firstResponse.Data.Total); +// pageSize = int.Parse(firstResponse.Data.PageSize); +// List pagefirstList = new List(); + +// 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 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().Where(p => p.RequestDate == inputdate).Select(p => p.Id).ToList(); +// totalItems = int.Parse(firstResponse.Data.Total); +// pageSize = int.Parse(firstResponse.Data.PageSize); +// List pagefirstList = new List(); + +// 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 existingIds, List allData) +// { +// var tasks = new List(); + +// // 为每个页面创建一个任务 +// 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 existingIds, List 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 pageResponse = await GetPageAsync(pageinput, taskId, version); + +// if (pageResponse?.Data.Rows != null && pageResponse.Data.Rows.Count > 0) +// { +// List pageList = new List(); + +// 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 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); +// } +// } +// } + +// // 其他方法保持不变... +//} + + + + diff --git a/API/Wood.Service/Controllers/CherySupplierConMmrpService.cs b/API/Wood.Service/Controllers/CherySupplierConMmrpService.cs index aa9b8ac..7a12d94 100644 --- a/API/Wood.Service/Controllers/CherySupplierConMmrpService.cs +++ b/API/Wood.Service/Controllers/CherySupplierConMmrpService.cs @@ -19,6 +19,22 @@ namespace TaskManager.Controllers public CherySupplierConMmrpService(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository repository) : base(httpClient, jobDbContext, log, repository) { } + + [HttpGet] + public async Task GetDetialByID(String id) + { + + SUPPLIER_MRP_MONTH first = new SUPPLIER_MRP_MONTH(); + var m = await _jobDbContext.SUPPLIER_MRP_MONTH.FirstOrDefaultAsync(p => p.Id == id); + if (m != null) + { + return m; + } + return first; + + } + + /// /// 审批通过 /// diff --git a/API/Wood.Service/Controllers/CherySupplierMrpMonthService.cs b/API/Wood.Service/Controllers/CherySupplierMrpMonthService.cs index a7a8665..4579a5b 100644 --- a/API/Wood.Service/Controllers/CherySupplierMrpMonthService.cs +++ b/API/Wood.Service/Controllers/CherySupplierMrpMonthService.cs @@ -1,11 +1,15 @@ using Magicodes.ExporterAndImporter.Core; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; using System.Data.Common; +using System.Linq.Dynamic.Core; using TaskManager.Contracts.Dtos; using TaskManager.Controllers; using TaskManager.Entity; using TaskManager.Entity.Entitys; using TaskManager.EntityFramework; using Z.BulkOperations; +using Z.EntityFramework.Extensions; namespace TaskManager.Controllers @@ -21,6 +25,22 @@ namespace TaskManager.Controllers } + + [HttpGet] + public async Task GetDetialByID(String id) + { + + SUPPLIER_MRP_MONTH first = new SUPPLIER_MRP_MONTH(); + var m = await _jobDbContext.SUPPLIER_MRP_MONTH.FirstOrDefaultAsync(p => p.Id == id); + if (m != null) + { + return m; + } + return first; + + } + + protected override async Task ConfirmDataInsertAsync(List plist, JobDbContext dbContext, DbTransaction dbTransaction) { if (plist.Count > 0)