diff --git a/SGGL/BLL/Common/Funs.cs b/SGGL/BLL/Common/Funs.cs index cf58f845..adfb9664 100644 --- a/SGGL/BLL/Common/Funs.cs +++ b/SGGL/BLL/Common/Funs.cs @@ -1467,6 +1467,37 @@ namespace BLL return ""; } } + /// + /// 将List 中的数据平均拆分为多个List + /// + /// + /// 原始List + /// 拆分后的子列表数量 + /// + /**们首先计算出每个子列表的大小chunkSize和余数remainder。然后,使用一个循环来创建并添加子列表到splitLists中。 + +在每次迭代中,我们根据当前索引是否小于余数来确定子列表的大小。如果小于余数,则将子列表大小加1,以确保最后一个子列表包含余数部分。 + +最后,我们更新startIndex以便正确获取下一个子列表的元素范围*/ + public static List> SplitList(List originalList, int numberOfLists) + { + List> splitLists = new List>(); + int chunkSize = originalList.Count / numberOfLists; + int remainder = originalList.Count % numberOfLists; + + int startIndex = 0; + for (int i = 0; i < numberOfLists; i++) + { + int sublistSize = chunkSize + (i < remainder ? 1 : 0); + List sublist = originalList.GetRange(startIndex, sublistSize); + splitLists.Add(sublist); + + startIndex += sublistSize; + } + + return splitLists; + } + } } diff --git a/SGGL/BLL/PHTGL/ContractCompile/PhtglContracttrackService .cs b/SGGL/BLL/PHTGL/ContractCompile/PhtglContracttrackService .cs index ce936b25..f9dfc9b8 100644 --- a/SGGL/BLL/PHTGL/ContractCompile/PhtglContracttrackService .cs +++ b/SGGL/BLL/PHTGL/ContractCompile/PhtglContracttrackService .cs @@ -3,6 +3,7 @@ using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; +using System.Threading.Tasks; using EmitMapper; using EmitMapper.MappingConfiguration; using FineUIPro; @@ -358,7 +359,8 @@ namespace BLL { var responeData = new ResponeData(); List rows; - List goingAddList =new List(); + List thisContractTracks =new List(); + var sheetNames = MiniExcel.GetSheetNames(path); foreach (var sheet in sheetNames) ////澶歴heet瀵煎叆 { @@ -376,6 +378,7 @@ namespace BLL ObjectMapperManager.DefaultInstance.GetMapper, List>(); var modeList = mapper.Map(rows); + List goingAddList = new List(); if (modeList.Count == 0) { responeData.code = 0; @@ -401,6 +404,7 @@ namespace BLL item.ProjectCode = item.MainItemCode + "-" + item.ProjectCode; } + if (resultModel!=null) { item.Id = resultModel.Id; @@ -409,10 +413,15 @@ namespace BLL else { item.Id = SQLHelper.GetNewID(); - AddPHTGL_ContractTrack(item); + goingAddList.Add(item); + //AddPHTGL_ContractTrack(item); } - PhtglContracttrackprogressService.CreateTemplateByContractTrackId(item.Id); + thisContractTracks.Add(item); + //PhtglContracttrackprogressService.CreateTemplateByContractTrackId(item.Id); } + + AddBulkPHTGL_ContractTrack(goingAddList); + PhtglContracttrackprogressService.CreateTemplateByContractList(goingAddList,projectid); } return responeData; diff --git a/SGGL/BLL/PHTGL/ContractCompile/PhtglContracttrackprogressService.cs b/SGGL/BLL/PHTGL/ContractCompile/PhtglContracttrackprogressService.cs index 7f9a8c83..b5476a22 100644 --- a/SGGL/BLL/PHTGL/ContractCompile/PhtglContracttrackprogressService.cs +++ b/SGGL/BLL/PHTGL/ContractCompile/PhtglContracttrackprogressService.cs @@ -1,8 +1,10 @@ 锘縰sing System; using System.Collections; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Globalization; using System.Linq; +using System.Threading.Tasks; using FineUIPro; using Model; @@ -110,6 +112,7 @@ namespace BLL ContractTrackId = ContractTrackId, Date= month.ToString("yyyy-MM") }; + if (!GetPHTGL_ContractTrackProgressByModle(querymodel).Any()) { var newmodel = new Model.PHTGL_ContractTrackProgress(); @@ -122,6 +125,75 @@ namespace BLL } } } + public static void CreateTemplateByContractList(List contractTrackList,string projectid) + { + var dbcontractTrack=(from x in Funs.DB.PHTGL_ContractTrack where x.ProjectId==projectid select x).ToList(); + var dbContractTrackProgress=(from x in Funs.DB.PHTGL_ContractTrackProgress + join y in Funs.DB.PHTGL_ContractTrack on x.ContractTrackId equals y.Id + where y.ProjectId==projectid select x).ToList(); + + List> splitLists = new List>(); + if (contractTrackList.Count>10) + { + splitLists = Funs.SplitList(contractTrackList, 10); + } + else + { + splitLists = Funs.SplitList(contractTrackList, 1); + } + ConcurrentBag contractTrackProgressList = new ConcurrentBag();//鐢ㄤ簬鎵归噺鏂板鐨勬暟鎹 + + ParallelOptions parallelOptions = new ParallelOptions(); + parallelOptions.MaxDegreeOfParallelism = Environment.ProcessorCount; + + Parallel.ForEach(splitLists, parallelOptions, sublist => + { + + foreach (var item in sublist) + { + var model =( from x in dbcontractTrack where x.Id==item.Id select x).FirstOrDefault() ; + if (model == null) return; + var contractNum = model.ContractNum; + var contractmode = ContractService.GetContractByContractNum(contractNum); + if (contractmode.ContractStartDate != null && contractmode.ContractEndDate != null) + { + var startDate = (DateTime)contractmode.ContractStartDate; + var endDate = (DateTime)contractmode.ContractEndDate; + List months = GetMonthsBetween(startDate, endDate);//鑾峰彇鍚堝悓璧锋鏃ユ湡 + + foreach (DateTime month in months) + { + var querymodel = new Model.PHTGL_ContractTrackProgress + { + ContractTrackId = item.Id, + Date = month.ToString("yyyy-MM") + }; + var q = (from x in dbContractTrackProgress + where + (string.IsNullOrEmpty(querymodel.ContractTrackId) || + x.ContractTrackId.Contains(querymodel.ContractTrackId)) && + (string.IsNullOrEmpty(querymodel.Date) || + x.Date.Contains(querymodel.Date)) + orderby x.Date + select x).ToList() + ; + if (!q.Any()) + { + var newmodel = new Model.PHTGL_ContractTrackProgress(); + newmodel.ContractTrackProgressId = SQLHelper.GetNewID(typeof(Model.PHTGL_ContractTrackProgress)); + newmodel.ContractTrackId = item.Id; + newmodel.Date = month.ToString("yyyy-MM"); + contractTrackProgressList.Add(newmodel); + // AddPHTGL_ContractTrackProgress(newmodel); + } + } + } + } // 澶勭悊瀹屾垚鍚庯紝鍙互灏嗙粨鏋滀繚瀛樺埌闆嗗悎鎴栧叾浠栧湴鏂 + + }); + + AddBulkPHTGL_ContractTrackProgress(contractTrackProgressList.ToList()); + } public static List GetMonthsBetween(DateTime startDate, DateTime endDate) { @@ -157,6 +229,12 @@ namespace BLL Funs.DB.SubmitChanges(); } + public static void AddBulkPHTGL_ContractTrackProgress(List newtableList) + { + Funs.DB.PHTGL_ContractTrackProgress.InsertAllOnSubmit(newtableList); + Funs.DB.SubmitChanges(); + } + public static void UpdatePHTGL_ContractTrackProgress(PHTGL_ContractTrackProgress newtable) { var table = Funs.DB.PHTGL_ContractTrackProgress.FirstOrDefault(x =>