using Cksoft.Data; using DllEapEntity; using DllEapEntity.Dtos; using DllEapEntity.OFILM; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; namespace DllEapDal.OFILM { public class ForecastDal { private IDatabase CurrDb = null; public ForecastDal(IDatabase db) { CurrDb = db; } /// /// 设备需求预测 /// /// /// /// /// /// /// /// public IEnumerable Get(int start, int length, string order, string sort, string filter, string errorinfo) { var sql = $@" select MAX(id) id,equipmentmodel,park,floor,MAX(score) score,IFNULL(MAX( number ),0) number FROM ( SELECT MAX(t.id) id,equipmentmodel,park,floor,MAX(score) score,planTime,CEILING(SUM(CASE WHEN locate('FQC',assignmentContent) >0 THEN genfive(number) WHEN accounting='0.25' THEN gensecfive(number) WHEN accounting='0.5' THEN genfive(number) WHEN accounting='1' THEN CEILING(number) ELSE number END )) number FROM ( SELECT tt.equipmentmodel, tt.id, tt.park, tt.floor, b.machineType, b.workshopSection, c.planTime, tt.score, c.dayPlan, b.assignmentContent, accounting, b.UPH, b.eropTurnoverRate, CASE b.workshopSection WHEN 'COB' THEN c.dayPlan/22/0.95/.97/ replace (b.eropTurnoverRate,'%','')*100 /b.UPH WHEN 'EOL' THEN c.dayPlan/22/0.95/ replace (b.eropTurnoverRate,'%','')*100/b.UPH ELSE 0 END number from ( (select id,equipmentmodel,accounting,'三号园区' as park,'2#1F' as floor,IFNULL(threeSecFir,0) as score from equipmentnumber) UNION (select id,equipmentmodel,accounting,'未来城' as park,'A1#1F' as floor,IFNULL(futureCity,0) as score from equipmentnumber) UNION (select id,equipmentmodel,accounting,'未来城' as park,'A1#3F' as floor,IFNULL(futureCityThird,0) as score from equipmentnumber) UNION (select id,equipmentmodel,accounting,'二号园区' as park,'A1#1F' as floor,IFNULL(secfirstFir,0) as score from equipmentnumber) UNION (select id,equipmentmodel,accounting,'二号园区' as park,'A1#2F' as floor,IFNULL(secFirstSec,0) as score from equipmentnumber) UNION (select id,equipmentmodel,accounting,'二号园区' as park,'A1#3F' as floor,IFNULL(secFirstThird,0) as score from equipmentnumber) UNION (select id,equipmentmodel,accounting,'二号园区' as park,'A2#1F' as floor,IFNULL(secSecFirst,0) as score from equipmentnumber) UNION (select id,equipmentmodel,accounting,'二号园区' as park,'A2#2F' as floor,IFNULL(secSecSec,0) as score from equipmentnumber) ) tt LEFT JOIN workingprocedure b on tt.equipmentModel=b.equipmentModel and tt.park = b.park and tt.Floor=b.floor LEFT JOIN (SELECT park,floor,customer,planTime,SUM(dayPlan) dayPlan FROM productionplan WHERE planTime>=CURRENT_DATE() GROUP BY park, floor,customer,planTime) c ON c.customer=b.machineType and c.Floor = b.Floor WHERE 1=1 {filter} order by equipmentmodel,tt.floor ) t GROUP BY equipmentmodel,park,floor,planTime ) e GROUP BY equipmentmodel,park,floor limit {start - 1},{length} "; var models = CurrDb.FindList(sql); return models; } /// /// 设备需求预测总数 /// /// /// public int GetCount(string filter) { string errorinfo = string.Empty; var sql = $@" select Count(*) Count FROM ( SELECT equipmentmodel,park,floor FROM ( SELECT tt.equipmentmodel, tt.park, tt.floor from ( (select id,equipmentmodel,accounting,'三号园区' as park,'2#1F' as floor,IFNULL(threeSecFir,0) as score from equipmentnumber) UNION (select id,equipmentmodel,accounting,'未来城' as park,'A1#1F' as floor,IFNULL(futureCity,0) as score from equipmentnumber) UNION (select id,equipmentmodel,accounting,'未来城' as park,'A1#3F' as floor,IFNULL(futureCityThird,0) as score from equipmentnumber) UNION (select id,equipmentmodel,accounting,'二号园区' as park,'A1#1F' as floor,IFNULL(secfirstFir,0) as score from equipmentnumber) UNION (select id,equipmentmodel,accounting,'二号园区' as park,'A1#2F' as floor,IFNULL(secFirstSec,0) as score from equipmentnumber) UNION (select id,equipmentmodel,accounting,'二号园区' as park,'A1#3F' as floor,IFNULL(secFirstThird,0) as score from equipmentnumber) UNION (select id,equipmentmodel,accounting,'二号园区' as park,'A2#1F' as floor,IFNULL(secSecFirst,0) as score from equipmentnumber) UNION (select id,equipmentmodel,accounting,'二号园区' as park,'A2#2F' as floor,IFNULL(secSecSec,0) as score from equipmentnumber) ) tt LEFT JOIN workingprocedure b on tt.equipmentModel=b.equipmentModel and tt.park = b.park and tt.Floor=b.floor LEFT JOIN (SELECT park,floor,customer FROM productionplan WHERE planTime>=CURRENT_DATE() GROUP BY park, floor,customer) c ON c.customer=b.machineType WHERE 1=1 {filter} order by equipmentmodel,tt.floor ) t GROUP BY equipmentmodel,park,floor ) e "; var entities = CurrDb.FindList(sql).FirstOrDefault(); if (entities != null) { return entities.Count; } return 0; } public IEnumerable getMainPlan() { string sql = "SELECT DISTINCT planTime FROM productionplan WHERE planTime like '%主计划%'"; var model = CurrDb.FindList(sql); return model; } public IEnumerable getMaxPlan() { string sql = "SELECT max(STR_TO_DATE(planTime,'%Y-%m-%d') ) planTime FROM productionplan WHERE planTime not like '%主计划%'"; var model = CurrDb.FindList(sql); return model; } public IEnumerable getMinPlan() { string sql = "SELECT min(STR_TO_DATE(planTime,'%Y-%m-%d') ) planTime FROM productionplan WHERE planTime not like '%主计划%'"; var model = CurrDb.FindList(sql); return model; } public string getsql(string filter,string subfilter) { string sql = $@" SELECT equipmentmodel,park,floor,MAX(sore) score,CEILING(SUM(CASE accounting WHEN '0.25' THEN gensecfive(number) WHEN '0.5' THEN genfive(number) ELSE number END )) number FROM ( SELECT tt.equipmentmodel, tt.park, tt.floor, b.machineType, tt.sore, c.dayPlan, accounting, c.planTime, b.eropTurnoverRate, CASE b.workshopSection WHEN 'COB' THEN c.dayPlan/28/22/0.95/.97/ replace (b.eropTurnoverRate,'%','')*100 /b.UPH WHEN 'EOL' THEN c.dayPlan/28/22/0.95/ replace (b.eropTurnoverRate,'%','')*100 /b.UPH ELSE 0 END number from ( (select id,equipmentmodel,accounting,'三号园区' as park,'2#1F' as floor,IFNULL(threeSecFir,0) as sore from equipmentnumber) UNION (select id,equipmentmodel,accounting,'未来城' as park,'A1#1F' as floor,IFNULL(futureCity,0) as sore from equipmentnumber) UNION (select id,equipmentmodel,accounting,'未来城' as park,'A1#3F' as floor,IFNULL(futureCityThird,0) as sore from equipmentnumber) UNION (select id,equipmentmodel,accounting,'二号园区' as park,'A1#1F' as floor,IFNULL(secfirstFir,0) as sore from equipmentnumber) UNION (select id,equipmentmodel,accounting,'二号园区' as park,'A1#2F' as floor,IFNULL(secFirstSec,0) as sore from equipmentnumber) UNION (select id,equipmentmodel,accounting,'二号园区' as park,'A1#3F' as floor,IFNULL(secFirstThird,0) as sore from equipmentnumber) UNION (select id,equipmentmodel,accounting,'二号园区' as park,'A2#1F' as floor,IFNULL(secSecFirst,0) as sore from equipmentnumber) UNION (select id,equipmentmodel,accounting,'二号园区' as park,'A2#2F' as floor,IFNULL(secSecSec,0) as sore from equipmentnumber) ) tt LEFT JOIN workingprocedure b on tt.equipmentModel=b.equipmentModel and tt.park = b.park and tt.Floor=b.floor LEFT JOIN (SELECT * FROM productionplan WHERE planTime = '{filter}') c ON c.customer=b.machineType WHERE 1=1 {subfilter} order by equipmentmodel,tt.floor -- limit 460,20 ) t GROUP BY equipmentmodel,park,floor"; return sql; } /// /// 预测详情总览 /// /// public IEnumerable getDetail(string filter) { string sql = $@"SELECT equipmentmodel,park,floor,MAX(sore) score,planTime,CEILING(SUM(CASE WHEN locate('FQC',assignmentContent) >0 THEN genfive(number) WHEN accounting='0.25' THEN gensecfive(number) WHEN accounting='0.5' THEN genfive(number) WHEN accounting='1' THEN CEILING(number) ELSE number END )) number FROM ( SELECT tt.equipmentmodel, tt.park, tt.floor, b.machineType, tt.sore, b.assignmentContent, c.dayPlan, accounting, DATE_FORMAT(c.planTime, '%Y-%m-%d') planTime, b.eropTurnoverRate, CASE b.workshopSection WHEN 'COB' THEN c.dayPlan / 22 / 0.95 / .97 / replace(b.eropTurnoverRate, '%', '') *100 /b.UPH WHEN 'EOL' THEN c.dayPlan / 22 / 0.95 / replace(b.eropTurnoverRate, '%', '') *100 /b.UPH ELSE 0 END number from ( (select id, equipmentmodel, accounting, '三号园区' as park, '2#1F' as floor, IFNULL(threeSecFir, 0) as sore from equipmentnumber) UNION (select id, equipmentmodel, accounting, '未来城' as park, 'A1#1F' as floor, IFNULL(futureCity, 0) as sore from equipmentnumber) UNION (select id, equipmentmodel, accounting, '未来城' as park, 'A1#3F' as floor, IFNULL(futureCityThird, 0) as sore from equipmentnumber) UNION (select id, equipmentmodel, accounting, '二号园区' as park, 'A1#1F' as floor, IFNULL(secfirstFir, 0) as sore from equipmentnumber) UNION (select id, equipmentmodel, accounting, '二号园区' as park, 'A1#2F' as floor, IFNULL(secFirstSec, 0) as sore from equipmentnumber) UNION (select id, equipmentmodel, accounting, '二号园区' as park, 'A1#3F' as floor, IFNULL(secFirstThird, 0) as sore from equipmentnumber) UNION (select id, equipmentmodel, accounting, '二号园区' as park, 'A2#1F' as floor, IFNULL(secSecFirst, 0) as sore from equipmentnumber) UNION (select id, equipmentmodel, accounting, '二号园区' as park, 'A2#2F' as floor, IFNULL(secSecSec, 0) as sore from equipmentnumber) ) tt LEFT JOIN workingprocedure b on tt.equipmentModel = b.equipmentModel and tt.park = b.park and tt.Floor = b.floor LEFT JOIN(SELECT* FROM productionplan WHERE planTime not like '%主计划%') c ON c.customer = b.machineType and c.Floor = b.Floor WHERE 1 = 1 {filter} order by equipmentmodel,tt.floor ) t WHERE planTime is not null GROUP BY equipmentmodel,park,floor,planTime order by planTime"; var model = CurrDb.FindList(sql); return model; } public IEnumerable getDetailTotal(string filter) { string sql = $@"SELECT sum(sore) score,planTime,CEILING(SUM(CASE WHEN locate('FQC',assignmentContent) >0 THEN genfive(number) WHEN accounting='0.25' THEN gensecfive(number) WHEN accounting='0.5' THEN genfive(number) WHEN accounting='1' THEN CEILING(number) ELSE number END )) number FROM ( SELECT tt.equipmentmodel, tt.park, tt.floor, b.machineType, tt.sore, b.assignmentContent, c.dayPlan, accounting, DATE_FORMAT(c.planTime, '%Y-%m-%d') planTime, b.eropTurnoverRate, CASE b.workshopSection WHEN 'COB' THEN c.dayPlan / 22 / 0.95 / .97 / replace(b.eropTurnoverRate, '%', '') *100 /b.UPH WHEN 'EOL' THEN c.dayPlan / 22 / 0.95 / replace(b.eropTurnoverRate, '%', '') *100 /b.UPH ELSE 0 END number from ( (select id, equipmentmodel, accounting, '三号园区' as park, '2#1F' as floor, IFNULL(threeSecFir, 0) as sore from equipmentnumber) UNION (select id, equipmentmodel, accounting, '未来城' as park, 'A1#1F' as floor, IFNULL(futureCity, 0) as sore from equipmentnumber) UNION (select id, equipmentmodel, accounting, '未来城' as park, 'A1#3F' as floor, IFNULL(futureCityThird, 0) as sore from equipmentnumber) UNION (select id, equipmentmodel, accounting, '二号园区' as park, 'A1#1F' as floor, IFNULL(secfirstFir, 0) as sore from equipmentnumber) UNION (select id, equipmentmodel, accounting, '二号园区' as park, 'A1#2F' as floor, IFNULL(secFirstSec, 0) as sore from equipmentnumber) UNION (select id, equipmentmodel, accounting, '二号园区' as park, 'A1#3F' as floor, IFNULL(secFirstThird, 0) as sore from equipmentnumber) UNION (select id, equipmentmodel, accounting, '二号园区' as park, 'A2#1F' as floor, IFNULL(secSecFirst, 0) as sore from equipmentnumber) UNION (select id, equipmentmodel, accounting, '二号园区' as park, 'A2#2F' as floor, IFNULL(secSecSec, 0) as sore from equipmentnumber) ) tt LEFT JOIN workingprocedure b on tt.equipmentModel = b.equipmentModel and tt.park = b.park and tt.Floor = b.floor LEFT JOIN(SELECT* FROM productionplan WHERE planTime not like '%主计划%') c ON c.customer = b.machineType WHERE 1 = 1 {filter} order by equipmentmodel,tt.floor ) t WHERE planTime is not null GROUP BY planTime order by planTime"; var model = CurrDb.FindList(sql); return model; } /// /// 预测详情总行数 /// /// /// public int GetEmCount(string filter) { string errorinfo = string.Empty; var sql = $@"select Count(1) Count from ( (select id,equipmentmodel,'三号园区' as park,'2#1F' as floor from equipmentnumber) UNION (select id,equipmentmodel,'未来城' as park,'A1#1F' as floor from equipmentnumber) UNION (select id,equipmentmodel,'未来城' as park,'A1#3F' as floor from equipmentnumber) UNION (select id,equipmentmodel,'二号园区' as park,'A1#1F' as floor from equipmentnumber) UNION (select id,equipmentmodel,'二号园区' as park,'A1#2F' as floor from equipmentnumber) UNION (select id,equipmentmodel,'二号园区' as park,'A1#3F' as floor from equipmentnumber) UNION (select id,equipmentmodel,'二号园区' as park,'A2#1F' as floor from equipmentnumber) UNION (select id,equipmentmodel,'二号园区' as park,'A2#2F' as floor from equipmentnumber) )tt where 1=1 {filter} "; var entities = CurrDb.FindList(sql).FirstOrDefault(); if (entities != null) { return entities.Count; } return 0; } /// /// 获取园区 /// /// /// public IEnumerable> GetMultipleSelects(string filter) { var sql = $@"select park value,park label FROM ( (select '三号园区' as park) UNION (select '未来城' as park) UNION (select '二号园区' as park) ) t"; var entities = CurrDb.FindList>(sql); return entities; } /// /// 获取机种下拉框 /// /// /// public IEnumerable> GetMultipleMacTypeSelects(string filter) { var sql = $@"select distinct MachineType value,MachineType label FROM WorkingProcedure where 1=1 {filter}"; var entities = CurrDb.FindList>(sql); return entities; } /// /// 获取楼层 /// /// /// public IEnumerable> GetMultipleSelectsFloor(string filter) { var sql = $@" select DISTINCT floor value,floor label FROM ( (select '三号园区' as park, '2#1F' as floor ) UNION (select '未来城' as park, 'A1#1F' as floor ) UNION (select '未来城' as park, 'A1#3F' as floor ) UNION (select '二号园区' as park, 'A1#1F' as floor ) UNION (select '二号园区' as park, 'A1#2F' as floor) UNION (select '二号园区' as park, 'A1#3F' as floor ) UNION (select '二号园区' as park, 'A2#1F' as floor ) UNION (select '二号园区' as park, 'A2#2F' as floor ) ) t WHERE 1=1 {filter}"; var entities = CurrDb.FindList>(sql); return entities; } /// /// 预测详情转DataTable /// /// /// public DataTable Getfor(IEnumerable roles) { string plantime = new ProductPlanDal(CurrDb).getMin().PlanTime; var plan = getMainPlan(); DataTable dt = new DataTable(); if (!string.IsNullOrEmpty(plantime)) { string time = plantime; DateTime st = Convert.ToDateTime(time); dt.Columns.Add("设备型号"); dt.Columns.Add("园区"); dt.Columns.Add("楼层"); dt.Columns.Add("现有数量"); dt.Columns.Add("ParkRowSpan"); dt.Columns.Add("ModelRowSpan"); dt.Columns.Add(st.ToString("MM") + "月预测"); for (int h = 1; h <= plan.Count(); h++) { dt.Columns.Add(st.AddMonths(h).ToString("MM") + "月预测"); } dt.Columns.Add(st.ToString("MM") + "月利用率"); for (int h = 1; h <= plan.Count(); h++) { dt.Columns.Add(st.AddMonths(h).ToString("MM") + "月利用率"); } dt.Columns.Add("预警"); if (dt != null && dt.Columns.Count > 0) { string subfilter = $" and tt.id in ( {string.Join(",", roles.Select(l => l.ID).ToArray())})"; Dictionary> dic = new Dictionary>(); foreach (var itemd in plan) { dic.Add(itemd.PlanTime, CurrDb.FindList(getsql(itemd.PlanTime, subfilter))); } string Equipmentmodel = ""; var last = roles.LastOrDefault(); foreach (var it in roles) { DataRow row = dt.NewRow(); if (string.IsNullOrEmpty(Equipmentmodel)) { Equipmentmodel = it.Equipmentmodel; #region row["设备型号"] = it.Equipmentmodel; row["园区"] = it.Park; row["楼层"] = it.Floor; row["现有数量"] = it.Score; row["ParkRowSpan"] = ""; row["ModelRowSpan"] = ""; row[st.ToString("MM") + "月预测"] = it.Number; int i = 0; foreach (var item in plan) { var planNew = dic[item.PlanTime]; string number = planNew.Where(l => l.Equipmentmodel == it.Equipmentmodel && l.Floor == it.Floor && l.Park == it.Park).Select(c => c.Number).FirstOrDefault(); row[st.AddMonths(i + 1).ToString("MM") + "月预测"] = (number == null ? "0" : number); i++; } if (it.Score?.Trim() == "0" || string.IsNullOrEmpty(it.Score) || it.Score=="0") { row[st.ToString("MM") + "月利用率"] = "0.00%"; } else { row[st.ToString("MM") + "月利用率"] = (Convert.ToDecimal(it.Number) / Convert.ToInt32(it.Score) * 100).ToString("0.00") + "%"; } int m = 0; foreach (var item in plan) { var planNew = dic[item.PlanTime]; string number = planNew.Where(l => l.Equipmentmodel == it.Equipmentmodel && l.Floor == it.Floor && l.Park == it.Park).Select(c => c.Number).FirstOrDefault(); if (number == "0" || string.IsNullOrEmpty(number) || it.Score=="0") { row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = "0.00%"; } else { row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = (Convert.ToDecimal(number) / Convert.ToInt32(it.Score) * 100).ToString("0.00") + "%"; } m++; } row["预警"] = "88%"; dt.Rows.Add(row); #endregion } else { if (Equipmentmodel != it.Equipmentmodel) { #region 合计 string Scores = roles.Where(l => l.Equipmentmodel == Equipmentmodel).Sum(p => Convert.ToInt32(p.Score)).ToString(); string numbers = roles.Where(l => l.Equipmentmodel == Equipmentmodel).Sum(p => Convert.ToInt32(p.Number)).ToString(); row["设备型号"] = "合计"; row["园区"] = "合计"; row["楼层"] = "合计"; row["现有数量"] = Scores; row["ParkRowSpan"] = ""; row["ModelRowSpan"] = ""; row[st.ToString("MM") + "月预测"] = numbers; int i = 0; foreach (var item in plan) { var planNew = dic[item.PlanTime]; string number = planNew.Where(l => l.Equipmentmodel == Equipmentmodel).Sum(c => Convert.ToInt32(c.Number)).ToString(); row[st.AddMonths(i + 1).ToString("MM") + "月预测"] = (number == null ? "0" : number); i++; } if (Scores == "0" || string.IsNullOrEmpty(Scores) || Scores=="0") { row[st.ToString("MM") + "月利用率"] = "0.00%"; } else { row[st.ToString("MM") + "月利用率"] = (Convert.ToDecimal(numbers) / Convert.ToInt32(Scores) * 100).ToString("0.00") + "%"; } int m = 0; foreach (var item in plan) { var planNew = dic[item.PlanTime]; string number = planNew.Where(l => l.Equipmentmodel == Equipmentmodel).Sum(c => Convert.ToInt32(c.Number)).ToString(); if (number == "0" || string.IsNullOrEmpty(number) || it.Score=="0") { row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = "0.00%"; } else { row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = (Convert.ToDecimal(number) / Convert.ToInt32(Scores) * 100).ToString("0.00") + "%"; } m++; } row["预警"] = "88%"; dt.Rows.Add(row); #endregion Equipmentmodel = it.Equipmentmodel; #region row = dt.NewRow(); row["设备型号"] = it.Equipmentmodel; row["园区"] = it.Park; row["楼层"] = it.Floor; row["现有数量"] = it.Score; row["ParkRowSpan"] = ""; row["ModelRowSpan"] = ""; row[st.ToString("MM") + "月预测"] = it.Number; i = 0; foreach (var item in plan) { var planNew = dic[item.PlanTime]; string number = planNew.Where(l => l.Equipmentmodel == it.Equipmentmodel && l.Floor == it.Floor && l.Park == it.Park).Select(c => c.Number).FirstOrDefault(); row[st.AddMonths(i + 1).ToString("MM") + "月预测"] = (number == null ? "0" : number); i++; } if (it.Score?.Trim() == "0" || string.IsNullOrEmpty(it.Score) || it.Score=="0") { row[st.ToString("MM") + "月利用率"] = "0.00%"; } else { row[st.ToString("MM") + "月利用率"] = (Convert.ToDecimal(it.Number) / Convert.ToInt32(it.Score) * 100).ToString("0.00") + "%"; } m = 0; foreach (var item in plan) { var planNew = dic[item.PlanTime]; string number = planNew.Where(l => l.Equipmentmodel == it.Equipmentmodel && l.Floor == it.Floor && l.Park == it.Park).Select(c => c.Number).FirstOrDefault(); if (number == "0" || string.IsNullOrEmpty(number) || it.Score=="0") { row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = "0.00%"; } else { row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = (Convert.ToDecimal(number) / Convert.ToInt32(it.Score) * 100).ToString("0.00") + "%"; } m++; } row["预警"] = "88%"; dt.Rows.Add(row); #endregion } else { #region row["设备型号"] = it.Equipmentmodel; row["园区"] = it.Park; row["楼层"] = it.Floor; row["现有数量"] = it.Score; row["ParkRowSpan"] = ""; row["ModelRowSpan"] = ""; row[st.ToString("MM") + "月预测"] = it.Number; int i = 0; foreach (var item in plan) { var planNew = dic[item.PlanTime]; string number = planNew.Where(l => l.Equipmentmodel == it.Equipmentmodel && l.Floor == it.Floor && l.Park == it.Park).Select(c => c.Number).FirstOrDefault(); row[st.AddMonths(i + 1).ToString("MM") + "月预测"] = (number == null ? "0" : number); i++; } if (it.Score?.Trim() == "0" || string.IsNullOrEmpty(it.Score) || it.Score=="0") { row[st.ToString("MM") + "月利用率"] = "0.00%"; } else { row[st.ToString("MM") + "月利用率"] = (Convert.ToDecimal(it.Number) / Convert.ToInt32(it.Score) * 100).ToString("0.00") + "%"; } int m = 0; foreach (var item in plan) { var planNew = dic[item.PlanTime]; string number = planNew.Where(l => l.Equipmentmodel == it.Equipmentmodel && l.Floor == it.Floor && l.Park == it.Park).Select(c => c.Number).FirstOrDefault(); if (number == "0" || string.IsNullOrEmpty(number) || it.Score=="0") { row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = "0.00%"; } else { row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = (Convert.ToDecimal(number) / Convert.ToInt32(it.Score) * 100).ToString("0.00") + "%"; } m++; } row["预警"] = "88%"; dt.Rows.Add(row); #endregion } } } if (last != null) { DataRow row = dt.NewRow(); #region 合计 string Scores = roles.Where(l => l.Equipmentmodel == last.Equipmentmodel).Sum(p => Convert.ToInt32(p.Score)).ToString(); string numbers = roles.Where(l => l.Equipmentmodel == last.Equipmentmodel).Sum(p => Convert.ToInt32(p.Number)).ToString(); row["设备型号"] = "合计"; row["园区"] = "合计"; row["楼层"] = "合计"; row["现有数量"] = Scores; row["ParkRowSpan"] = ""; row["ModelRowSpan"] = ""; row[st.ToString("MM") + "月预测"] = numbers; int i = 0; foreach (var item in plan) { var planNew = dic[item.PlanTime]; string number = planNew.Where(l => l.Equipmentmodel == last.Equipmentmodel).Sum(c => Convert.ToInt32(c.Number)).ToString(); row[st.AddMonths(i + 1).ToString("MM") + "月预测"] = (number == null ? "0" : number); i++; } if (Scores == "0" || string.IsNullOrEmpty(Scores) || Scores=="0") { row[st.ToString("MM") + "月利用率"] = "0.00%"; } else { row[st.ToString("MM") + "月利用率"] = (Convert.ToDecimal(numbers) / Convert.ToInt32(Scores) * 100).ToString("0.00") + "%"; } int m = 0; foreach (var item in plan) { var planNew = dic[item.PlanTime]; string number = planNew.Where(l => l.Equipmentmodel == last.Equipmentmodel).Sum(c => Convert.ToInt32(c.Number)).ToString(); if (number == "0" || string.IsNullOrEmpty(number) || last.Score=="0") { row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = "0.00%"; } else { row[st.AddMonths(m + 1).ToString("MM") + "月利用率"] = (Convert.ToDecimal(number) / Convert.ToInt32(Scores) * 100).ToString("0.00") + "%"; } m++; } row["预警"] = "88%"; dt.Rows.Add(row); #endregion } } } var modelGroup = roles.GroupBy(c => c.Equipmentmodel); // 合并行数 foreach (var model in modelGroup) { for (var i = 0; i < dt.Rows.Count; i++) { if (dt.Rows[i]["设备型号"].ToString() == model.Key) { dt.Rows[i]["ModelRowSpan"] = model.Count()+1; var parkGroup = roles.Where(l => l.Equipmentmodel == model.Key).GroupBy(c => c.Park); foreach (var it in parkGroup) { if (dt.Rows[i]["园区"].ToString() == it.Key) { dt.Rows[i]["ParkRowSpan"] = it.Count(); } } } } } return dt; } /// /// 预测详情转DataTable /// /// /// /// public DataTable GetForDetail(IEnumerable macList, IEnumerable Equipmentmodels) { DataTable dt = new DataTable(); dt.Columns.Add("设备型号"); dt.Columns.Add("园区"); dt.Columns.Add("楼层"); dt.Columns.Add("现有数量"); dt.Columns.Add("ParkRowSpan"); dt.Columns.Add("ModelRowSpan"); DateTime dd = DateTime.Now.AddDays(1 - DateTime.Now.Day).Date.AddMonths(1).AddDays(-1);//当月最后一天 DateTime maxplan = Convert.ToDateTime( getMaxPlan().FirstOrDefault().PlanTime); DateTime minplan = Convert.ToDateTime(getMinPlan().FirstOrDefault().PlanTime); int days = maxplan.Subtract(DateTime.Now).Days + 1; for (int i = 0; i <= days; i++) { var date = DateTime.Now.AddDays(i).ToString("MM月dd日"); dt.Columns.Add(date); } string Equipmentmodel = ""; var last = Equipmentmodels.LastOrDefault(); if (Equipmentmodels != null) { foreach (var mac in Equipmentmodels) { DataRow row = dt.NewRow(); if (string.IsNullOrEmpty(Equipmentmodel)) { Equipmentmodel = mac.Equipmentmodel; #region row["设备型号"] = mac.Equipmentmodel; row["园区"] = mac.Park; row["楼层"] = mac.Floor; row["现有数量"] = mac.Score; row["ParkRowSpan"] = ""; row["ModelRowSpan"] = ""; for (int i = 0; i <= days; i++) { var date = DateTime.Now.AddDays(i).ToString("yyyy-MM-dd"); string number = macList.Where(m => m.PlanTime == date && m.Equipmentmodel == mac.Equipmentmodel && m.Floor == mac.Floor && m.Park == mac.Park).Select(l => l.Number).FirstOrDefault(); row[DateTime.Now.AddDays(i).ToString("MM月dd日")] = (number == null ? "0" : number); } dt.Rows.Add(row); #endregion } else { if (Equipmentmodel != mac.Equipmentmodel) { #region 合计 string Scores = Equipmentmodels.Where(l => l.Equipmentmodel == Equipmentmodel).Sum(p => Convert.ToInt32(p.Score)).ToString(); string numbers = Equipmentmodels.Where(l => l.Equipmentmodel == Equipmentmodel).Sum(p => Convert.ToInt32(p.Number)).ToString(); row["设备型号"] = "合计"; ; row["园区"] = "合计"; ; row["楼层"] = "合计"; ; row["现有数量"] = Scores; row["ParkRowSpan"] = ""; row["ModelRowSpan"] = ""; for (int i = 0; i <= days; i++) { var date = DateTime.Now.AddDays(i).ToString("yyyy-MM-dd"); string number = macList.Where(m => m.PlanTime == date && m.Equipmentmodel == Equipmentmodel).Sum(l => Convert.ToInt32(l.Number)).ToString(); row[DateTime.Now.AddDays(i).ToString("MM月dd日")] = (number == null ? "0" : number); } dt.Rows.Add(row); #endregion Equipmentmodel = mac.Equipmentmodel; #region row = dt.NewRow(); row["设备型号"] = mac.Equipmentmodel; row["园区"] = mac.Park; row["楼层"] = mac.Floor; row["现有数量"] = mac.Score; row["ParkRowSpan"] = ""; row["ModelRowSpan"] = ""; for (int i = 0; i <= days; i++) { var date = DateTime.Now.AddDays(i).ToString("yyyy-MM-dd"); string number = macList.Where(m => m.PlanTime == date && m.Equipmentmodel == mac.Equipmentmodel && m.Floor == mac.Floor && m.Park == mac.Park).Select(l => l.Number).FirstOrDefault(); row[DateTime.Now.AddDays(i).ToString("MM月dd日")] = (number == null ? "0" : number); } dt.Rows.Add(row); #endregion } else { #region row["设备型号"] = mac.Equipmentmodel; row["园区"] = mac.Park; row["楼层"] = mac.Floor; row["现有数量"] = mac.Score; row["ParkRowSpan"] = ""; row["ModelRowSpan"] = ""; for (int i = 0; i <= days; i++) { var date = DateTime.Now.AddDays(i).ToString("yyyy-MM-dd"); string number = macList.Where(m => m.PlanTime == date && m.Equipmentmodel == mac.Equipmentmodel && m.Floor == mac.Floor && m.Park == mac.Park).Select(l => l.Number).FirstOrDefault(); row[DateTime.Now.AddDays(i).ToString("MM月dd日")] = (number == null ? "0" : number); } dt.Rows.Add(row); #endregion } } } } if (last != null) { DataRow row = dt.NewRow(); #region 合计 string Scores = Equipmentmodels.Where(l => l.Equipmentmodel == Equipmentmodel).Sum(p => Convert.ToInt32(p.Score)).ToString(); string numbers = Equipmentmodels.Where(l => l.Equipmentmodel == Equipmentmodel).Sum(p => Convert.ToInt32(p.Number)).ToString(); row["设备型号"] = "合计"; ; row["园区"] = "合计"; ; row["楼层"] = "合计"; ; row["现有数量"] = Scores; row["ParkRowSpan"] = ""; row["ModelRowSpan"] = ""; for (int i = 0; i <= days; i++) { var date = DateTime.Now.AddDays(i).ToString("yyyy-MM-dd"); string number = macList.Where(m => m.PlanTime == date && m.Equipmentmodel == last.Equipmentmodel).Sum(l => Convert.ToInt32(l.Number)).ToString(); row[DateTime.Now.AddDays(i).ToString("MM月dd日")] = (number == null ? "0" : number); } dt.Rows.Add(row); #endregion } var modelGroup = Equipmentmodels.GroupBy(c => c.Equipmentmodel); foreach (var model in modelGroup) { for (var i = 0; i < dt.Rows.Count; i++) { if (dt.Rows[i]["设备型号"].ToString() == model.Key) { dt.Rows[i]["ModelRowSpan"] = model.Count()+1; var parkGroup = Equipmentmodels.Where(l => l.Equipmentmodel == model.Key).GroupBy(c => c.Park); foreach (var it in parkGroup) { if (dt.Rows[i]["园区"].ToString() == it.Key) { dt.Rows[i]["ParkRowSpan"] = it.Count(); } } } } } return dt; } public AntdComplexTableDto GetComplexData(string filter, int start, int length) { string errorinfo = ""; var model = Get(start, length, "", "", filter, errorinfo); var dt = Getfor(model); var headers = new List(); if (dt != null && dt.Columns.Count > 0) { foreach (DataColumn item in dt.Columns) { if (item.ColumnName == "ParkRowSpan" || item.ColumnName == "ModelRowSpan") continue; headers.Add(new AntdColumn { ColName = item.ColumnName }); } } var antdData = new AntdComplexTableDto(); antdData.Columns = headers; antdData.Datas = dt; return antdData; } public AntdComplexTableDto GetComplexDataDetail(string filter, int start, int length) { var macList = getDetail(filter).ToList();//获取当月预测数据 var en = new EquipmentnumberDal(CurrDb); var Equipmentmodels = en.getEquipmentmodel(start, length, "", "", filter);//获取机型,园区,楼层 var dt = GetForDetail(macList, Equipmentmodels); var headers = new List(); if (dt != null && dt.Columns.Count > 0) { foreach (DataColumn item in dt.Columns) { if (item.ColumnName == "ParkRowSpan" || item.ColumnName == "ModelRowSpan") continue; headers.Add(new AntdColumn { ColName = item.ColumnName }); } } var antdData = new AntdComplexTableDto(); antdData.Columns = headers; antdData.Datas = dt; return antdData; } } }