From c79c56874cc877ea9b2dff815793e4c24b58f72b Mon Sep 17 00:00:00 2001 From: haoliang <821644@qq.com> Date: Fri, 15 May 2026 23:02:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=A7=E9=87=8F=E6=8A=A5?= =?UTF-8?q?=E8=A1=A8=EF=BC=9ADailyProductionRepository=E5=85=A8=E9=83=A8?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E6=9F=A5=E8=AF=A2cnc=5Fdaily=5Fproduction?= =?UTF-8?q?=E6=96=B0=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Impl/DailyProductionRepository.cs | 215 ++++-------------- 1 file changed, 38 insertions(+), 177 deletions(-) diff --git a/src/CncRepository/Impl/DailyProductionRepository.cs b/src/CncRepository/Impl/DailyProductionRepository.cs index f019f6b..447dc0d 100644 --- a/src/CncRepository/Impl/DailyProductionRepository.cs +++ b/src/CncRepository/Impl/DailyProductionRepository.cs @@ -10,9 +10,6 @@ using CncRepository.Interface; namespace CncRepository.Impl { - /// - /// cnc_daily_production 产量仓储实现(业务库) - /// public class DailyProductionRepository : BusinessRepository, IDailyProductionRepository { public DailyProductionRepository(string connectionString) : base(connectionString) { } @@ -33,54 +30,33 @@ namespace CncRepository.Impl var parameters = new DynamicParameters(); string baseSql = @"SELECT dp.machine_id AS MachineId, m.name AS MachineName, dp.program_name AS ProgramName, dp.production_date AS ProductionDate, - CAST(dp.total_quantity AS SIGNED) AS Quantity, - dp.segment_count AS SegmentCount, - dp.total_run_time AS TotalRunTime, dp.total_cutting_time AS TotalCuttingTime + (dp.end_total_count - dp.base_total_count) AS Quantity FROM cnc_daily_production dp JOIN cnc_machine m ON dp.machine_id = m.id - WHERE dp.total_quantity > 0"; - string realtimeSql = @"SELECT seg.machine_id AS MachineId, m.name AS MachineName, - seg.program_name AS ProgramName, seg.production_date AS ProductionDate, - CAST(SUM(CASE WHEN seg.is_settled=1 THEN seg.quantity - ELSE COALESCE(seg.end_part_count, seg.start_part_count) - seg.start_part_count END) AS SIGNED) AS Quantity, - COUNT(*) AS SegmentCount, 0 AS TotalRunTime, 0 AS TotalCuttingTime - FROM cnc_production_segment seg - JOIN cnc_machine m ON seg.machine_id = m.id - WHERE 1=1"; + WHERE 1=1"; if (query?.WorkshopId.HasValue == true) { baseSql += " AND m.workshop_id = @WorkshopId"; - realtimeSql += " AND m.workshop_id = @WorkshopId"; parameters.Add("WorkshopId", query.WorkshopId); } if (query?.MachineId.HasValue == true) { baseSql += " AND dp.machine_id = @MachineId"; - realtimeSql += " AND seg.machine_id = @MachineId"; parameters.Add("MachineId", query.MachineId); } if (query?.WorkerId.HasValue == true) { baseSql += " AND EXISTS (SELECT 1 FROM cnc_worker_machine wm WHERE wm.machine_id = dp.machine_id AND wm.worker_id = @WorkerId)"; - realtimeSql += " AND EXISTS (SELECT 1 FROM cnc_worker_machine wm WHERE wm.machine_id = seg.machine_id AND wm.worker_id = @WorkerId)"; parameters.Add("WorkerId", query.WorkerId); } - realtimeSql += " GROUP BY seg.machine_id, seg.production_date, seg.program_name, m.name"; - string unionSql = $"{baseSql} UNION ALL {realtimeSql}"; - string countSql = $"SELECT COUNT(*) FROM ({unionSql}) AS t"; + string countSql = $"SELECT COUNT(*) FROM ({baseSql}) AS t"; int offset = (query.Page - 1) * query.PageSize; - string paging = $" ORDER BY ProductionDate DESC, MachineName LIMIT @Limit OFFSET @Offset"; + string paging = " ORDER BY ProductionDate DESC, MachineName LIMIT @Limit OFFSET @Offset"; parameters.Add("Limit", query.PageSize); parameters.Add("Offset", offset); - var items = conn.Query(unionSql + paging, parameters).ToList(); + var items = conn.Query(baseSql + paging, parameters).ToList(); int total = conn.ExecuteScalar(countSql, parameters); - return new PagedResult - { - Items = items, - Total = total, - Page = query.Page, - PageSize = query.PageSize - }; + return new PagedResult { Items = items, Total = total, Page = query.Page, PageSize = query.PageSize }; } } @@ -97,10 +73,7 @@ namespace CncRepository.Impl { using (var conn = CreateConnection()) { - string sql = @"SELECT dp.* FROM cnc_daily_production dp - LEFT JOIN cnc_machine m ON dp.machine_id = m.id - WHERE dp.production_date BETWEEN @Start AND @End - ORDER BY dp.production_date DESC"; + string sql = @"SELECT dp.* FROM cnc_daily_production dp LEFT JOIN cnc_machine m ON dp.machine_id = m.id WHERE dp.production_date BETWEEN @Start AND @End ORDER BY dp.production_date DESC"; return conn.Query(sql, new { Start = startDate, End = endDate }).ToList(); } } @@ -109,14 +82,8 @@ namespace CncRepository.Impl { using (var conn = CreateConnection()) { - string sql = @"SELECT SUM(dp.total_quantity) FROM cnc_daily_production dp - LEFT JOIN cnc_machine m ON dp.machine_id = m.id - WHERE dp.production_date BETWEEN @Start AND @End"; - if (workshopId.HasValue) - { - sql += " AND m.workshop_id = @WorkshopId"; - return conn.ExecuteScalar(sql, new { Start = startDate, End = endDate, WorkshopId = workshopId.Value }); - } + string sql = @"SELECT SUM(dp.end_total_count - dp.base_total_count) FROM cnc_daily_production dp LEFT JOIN cnc_machine m ON dp.machine_id = m.id WHERE dp.production_date BETWEEN @Start AND @End"; + if (workshopId.HasValue) { sql += " AND m.workshop_id = @WorkshopId"; return conn.ExecuteScalar(sql, new { Start = startDate, End = endDate, WorkshopId = workshopId.Value }); } return conn.ExecuteScalar(sql, new { Start = startDate, End = endDate }); } } @@ -125,8 +92,7 @@ namespace CncRepository.Impl { using (var conn = CreateConnection()) { - string sql = @"SELECT SUM(total_quantity) FROM cnc_daily_production - WHERE production_date BETWEEN @Start AND @End"; + string sql = @"SELECT SUM(end_total_count - base_total_count) FROM cnc_daily_production WHERE production_date BETWEEN @Start AND @End"; var res = conn.ExecuteScalar(sql, new { Start = startDate, End = endDate }); return res ?? 0m; } @@ -136,15 +102,7 @@ namespace CncRepository.Impl { using (var conn = CreateConnection()) { - string sql = @"SELECT m.id AS Id, m.id AS MachineId, m.name AS MachineName, - SUM(dp.total_quantity) AS TotalQuantity, NULL AS ProgramName, - NULL AS ProductionDate, NULL AS SegmentCount, - NULL AS TotalRunTime, NULL AS TotalCuttingTime, NULL AS TotalCycleTime - FROM cnc_daily_production dp - JOIN cnc_machine m ON dp.machine_id = m.id - WHERE dp.production_date BETWEEN @Start AND @End - GROUP BY m.id, m.name - ORDER BY SUM(dp.total_quantity) DESC LIMIT @Top"; + string sql = @"SELECT m.id AS Id, m.id AS MachineId, m.name AS MachineName, SUM(dp.end_total_count - dp.base_total_count) AS TotalQuantity, NULL AS ProgramName, NULL AS ProductionDate FROM cnc_daily_production dp JOIN cnc_machine m ON dp.machine_id = m.id WHERE dp.production_date BETWEEN @Start AND @End GROUP BY m.id, m.name ORDER BY SUM(dp.end_total_count - dp.base_total_count) DESC LIMIT @Top"; return conn.Query(sql, new { Start = startDate, End = endDate, Top = top }).ToList(); } } @@ -153,48 +111,25 @@ namespace CncRepository.Impl { using (var conn = CreateConnection()) { - string sql = @"SELECT 0 AS Id, NULL AS MachineId, NULL AS MachineName, - SUM(total_quantity) AS TotalQuantity, NULL AS ProductionDate, - NULL AS ProgramName, NULL AS SegmentCount, - NULL AS TotalRunTime, NULL AS TotalCuttingTime, NULL AS TotalCycleTime - FROM cnc_daily_production - WHERE production_date BETWEEN @Start AND @End - GROUP BY machine_id - ORDER BY SUM(total_quantity) DESC LIMIT @Top"; + string sql = @"SELECT 0 AS Id, NULL AS MachineId, NULL AS MachineName, SUM(end_total_count - base_total_count) AS TotalQuantity, NULL AS ProductionDate, NULL AS ProgramName FROM cnc_daily_production WHERE production_date BETWEEN @Start AND @End GROUP BY machine_id ORDER BY SUM(end_total_count - base_total_count) DESC LIMIT @Top"; return conn.Query(sql, new { Start = startDate, End = endDate, Top = top }).ToList(); } } - #region 三维度产量报表 - public MachineProductionSummaryResponse GetMachineSummary(DateTime startDate, DateTime endDate, int? workshopId) { using (var conn = CreateConnection()) { - string sql = @"SELECT COALESCE(SUM(CASE WHEN seg.is_settled=1 THEN seg.quantity - ELSE COALESCE(seg.end_part_count, seg.start_part_count) - seg.start_part_count END), 0) AS TotalQuantity, - COUNT(DISTINCT seg.machine_id) AS RunningMachineCount - FROM cnc_production_segment seg - LEFT JOIN cnc_machine m ON seg.machine_id = m.id - WHERE seg.production_date BETWEEN @Start AND @End"; + string sql = @"SELECT COALESCE(SUM(dp.end_total_count - dp.base_total_count), 0) AS TotalQuantity, COUNT(DISTINCT dp.machine_id) AS RunningMachineCount FROM cnc_daily_production dp LEFT JOIN cnc_machine m ON dp.machine_id = m.id WHERE dp.production_date BETWEEN @Start AND @End"; var parameters = new DynamicParameters(); - parameters.Add("Start", startDate); - parameters.Add("End", endDate); - if (workshopId.HasValue) - { - sql += " AND m.workshop_id = @WorkshopId"; - parameters.Add("WorkshopId", workshopId.Value); - } + parameters.Add("Start", startDate); parameters.Add("End", endDate); + if (workshopId.HasValue) { sql += " AND m.workshop_id = @WorkshopId"; parameters.Add("WorkshopId", workshopId.Value); } var result = conn.QuerySingleOrDefault(sql, parameters); if (result == null) return new MachineProductionSummaryResponse(); - if (result.RunningMachineCount > 0) - result.AvgPerMachine = Math.Round((decimal)result.TotalQuantity / result.RunningMachineCount, 1); - string topSql = @"SELECT m.name FROM cnc_production_segment seg - LEFT JOIN cnc_machine m ON seg.machine_id = m.id - WHERE seg.production_date BETWEEN @Start AND @End"; + if (result.RunningMachineCount > 0) result.AvgPerMachine = Math.Round((decimal)result.TotalQuantity / result.RunningMachineCount, 1); + string topSql = @"SELECT m.name FROM cnc_daily_production dp LEFT JOIN cnc_machine m ON dp.machine_id = m.id WHERE dp.production_date BETWEEN @Start AND @End"; if (workshopId.HasValue) topSql += " AND m.workshop_id = @WorkshopId"; - topSql += @" GROUP BY seg.machine_id ORDER BY SUM(CASE WHEN seg.is_settled=1 THEN seg.quantity - ELSE COALESCE(seg.end_part_count, seg.start_part_count) - seg.start_part_count END) DESC LIMIT 1"; + topSql += " GROUP BY dp.machine_id ORDER BY SUM(dp.end_total_count - dp.base_total_count) DESC LIMIT 1"; result.TopMachineName = conn.ExecuteScalar(topSql, parameters) ?? ""; return result; } @@ -204,29 +139,12 @@ namespace CncRepository.Impl { using (var conn = CreateConnection()) { - string sql = @"SELECT m.name AS MachineName, seg.program_name AS ProgramName, - SUM(CASE WHEN seg.is_settled=1 THEN seg.quantity - ELSE COALESCE(seg.end_part_count, seg.start_part_count) - seg.start_part_count END) AS TotalQuantity, - cr_runtime.run_hours AS RunTime - FROM cnc_production_segment seg - LEFT JOIN cnc_machine m ON seg.machine_id = m.id - LEFT JOIN ( - SELECT cr.machine_id, DATE(cr.collect_time) AS d, - COALESCE(ROUND(SUM(max_min.delta)/3600,1), 0) AS run_hours - FROM cnc_collect_record cr - JOIN (SELECT machine_id, DATE(collect_time) AS dd, - MAX(cutting_time)-MIN(cutting_time) AS delta - FROM cnc_collect_record GROUP BY machine_id, DATE(collect_time)) max_min - ON cr.machine_id = max_min.machine_id AND DATE(cr.collect_time) = max_min.dd - GROUP BY cr.machine_id, DATE(cr.collect_time) - ) cr_runtime ON cr_runtime.machine_id = seg.machine_id AND cr_runtime.d = seg.production_date - WHERE seg.production_date BETWEEN @Start AND @End"; + string sql = @"SELECT m.name AS MachineName, dp.program_name AS ProgramName, SUM(dp.end_total_count - dp.base_total_count) AS TotalQuantity FROM cnc_daily_production dp LEFT JOIN cnc_machine m ON dp.machine_id = m.id WHERE dp.production_date BETWEEN @Start AND @End"; var parameters = new DynamicParameters(); - parameters.Add("Start", startDate); - parameters.Add("End", endDate); + parameters.Add("Start", startDate); parameters.Add("End", endDate); if (workshopId.HasValue) { sql += " AND m.workshop_id = @WorkshopId"; parameters.Add("WorkshopId", workshopId.Value); } - if (machineId.HasValue) { sql += " AND seg.machine_id = @MachineId"; parameters.Add("MachineId", machineId.Value); } - sql += " GROUP BY seg.machine_id, seg.program_name, m.name, cr_runtime.run_hours ORDER BY TotalQuantity DESC"; + if (machineId.HasValue) { sql += " AND dp.machine_id = @MachineId"; parameters.Add("MachineId", machineId.Value); } + sql += " GROUP BY dp.machine_id, dp.program_name, m.name ORDER BY TotalQuantity DESC"; var items = conn.Query(sql, parameters).ToList(); for (int i = 0; i < items.Count; i++) { items[i].Rank = i + 1; items[i].DayStatus = items[i].DayStatus ?? ""; } return items; @@ -237,23 +155,11 @@ namespace CncRepository.Impl { using (var conn = CreateConnection()) { - string sql = @"SELECT COALESCE(SUM(CASE WHEN seg.is_settled=1 THEN seg.quantity - ELSE COALESCE(seg.end_part_count, seg.start_part_count) - seg.start_part_count END), 0) AS TotalQuantity, - COUNT(DISTINCT w.id) AS ActiveWorkerCount - FROM cnc_production_segment seg - JOIN cnc_worker_machine wm ON seg.machine_id = wm.machine_id - JOIN cnc_worker w ON wm.worker_id = w.id - WHERE seg.production_date BETWEEN @Start AND @End"; + string sql = @"SELECT COALESCE(SUM(dp.end_total_count - dp.base_total_count), 0) AS TotalQuantity, COUNT(DISTINCT w.id) AS ActiveWorkerCount FROM cnc_daily_production dp JOIN cnc_worker_machine wm ON dp.machine_id = wm.machine_id JOIN cnc_worker w ON wm.worker_id = w.id WHERE dp.production_date BETWEEN @Start AND @End"; var result = conn.QuerySingleOrDefault(sql, new { Start = startDate, End = endDate }); if (result == null) return new WorkerProductionSummaryResponse(); - if (result.ActiveWorkerCount > 0) - result.AvgPerWorker = Math.Round((decimal)result.TotalQuantity / result.ActiveWorkerCount, 1); - string topSql = @"SELECT w.name FROM cnc_production_segment seg - JOIN cnc_worker_machine wm ON seg.machine_id = wm.machine_id - JOIN cnc_worker w ON wm.worker_id = w.id - WHERE seg.production_date BETWEEN @Start AND @End - GROUP BY w.id, w.name ORDER BY SUM(CASE WHEN seg.is_settled=1 THEN seg.quantity - ELSE COALESCE(seg.end_part_count, seg.start_part_count) - seg.start_part_count END) DESC LIMIT 1"; + if (result.ActiveWorkerCount > 0) result.AvgPerWorker = Math.Round((decimal)result.TotalQuantity / result.ActiveWorkerCount, 1); + string topSql = @"SELECT w.name FROM cnc_daily_production dp JOIN cnc_worker_machine wm ON dp.machine_id = wm.machine_id JOIN cnc_worker w ON wm.worker_id = w.id WHERE dp.production_date BETWEEN @Start AND @End GROUP BY w.id, w.name ORDER BY SUM(dp.end_total_count - dp.base_total_count) DESC LIMIT 1"; result.TopWorkerName = conn.ExecuteScalar(topSql, new { Start = startDate, End = endDate }) ?? ""; return result; } @@ -263,30 +169,13 @@ namespace CncRepository.Impl { using (var conn = CreateConnection()) { - string sql = @"SELECT w.name AS WorkerName, - COUNT(DISTINCT wm.machine_id) AS MachineCount, - COUNT(DISTINCT seg.program_name) AS ProgramCount, - COALESCE(SUM(CASE WHEN seg.is_settled=1 THEN seg.quantity - ELSE COALESCE(seg.end_part_count, seg.start_part_count) - seg.start_part_count END), 0) AS TotalQuantity - FROM cnc_worker w - JOIN cnc_worker_machine wm ON wm.worker_id = w.id - LEFT JOIN cnc_production_segment seg ON seg.machine_id = wm.machine_id - AND seg.production_date BETWEEN @Start AND @End"; + string sql = @"SELECT w.name AS WorkerName, COUNT(DISTINCT wm.machine_id) AS MachineCount, COUNT(DISTINCT dp.program_name) AS ProgramCount, COALESCE(SUM(dp.end_total_count - dp.base_total_count), 0) AS TotalQuantity FROM cnc_worker w JOIN cnc_worker_machine wm ON wm.worker_id = w.id LEFT JOIN cnc_daily_production dp ON dp.machine_id = wm.machine_id AND dp.production_date BETWEEN @Start AND @End"; var parameters = new DynamicParameters(); - parameters.Add("Start", startDate); - parameters.Add("End", endDate); + parameters.Add("Start", startDate); parameters.Add("End", endDate); if (workerId.HasValue) { sql += " AND w.id = @WorkerId"; parameters.Add("WorkerId", workerId.Value); } sql += " GROUP BY w.id, w.name ORDER BY TotalQuantity DESC"; var items = conn.Query(sql, parameters).ToList(); - if (items.Count > 0) - { - int grandTotal = items.Sum(x => x.TotalQuantity); - for (int i = 0; i < items.Count; i++) - { - items[i].Rank = i + 1; - if (grandTotal > 0) items[i].Percentage = Math.Round((decimal)items[i].TotalQuantity / grandTotal * 100, 1); - } - } + if (items.Count > 0) { int grandTotal = items.Sum(x => x.TotalQuantity); for (int i = 0; i < items.Count; i++) { items[i].Rank = i + 1; if (grandTotal > 0) items[i].Percentage = Math.Round((decimal)items[i].TotalQuantity / grandTotal * 100, 1); } } return items; } } @@ -295,26 +184,16 @@ namespace CncRepository.Impl { using (var conn = CreateConnection()) { - string sql = @"SELECT COALESCE(SUM(CASE WHEN seg.is_settled=1 THEN seg.quantity - ELSE COALESCE(seg.end_part_count, seg.start_part_count) - seg.start_part_count END), 0) AS TotalQuantity, - COUNT(DISTINCT seg.program_name) AS RunningProgramCount - FROM cnc_production_segment seg - LEFT JOIN cnc_machine m ON seg.machine_id = m.id - WHERE seg.production_date BETWEEN @Start AND @End"; + string sql = @"SELECT COALESCE(SUM(dp.end_total_count - dp.base_total_count), 0) AS TotalQuantity, COUNT(DISTINCT dp.program_name) AS RunningProgramCount FROM cnc_daily_production dp LEFT JOIN cnc_machine m ON dp.machine_id = m.id WHERE dp.production_date BETWEEN @Start AND @End"; var parameters = new DynamicParameters(); - parameters.Add("Start", startDate); - parameters.Add("End", endDate); + parameters.Add("Start", startDate); parameters.Add("End", endDate); if (workshopId.HasValue) { sql += " AND m.workshop_id = @WorkshopId"; parameters.Add("WorkshopId", workshopId.Value); } var result = conn.QuerySingleOrDefault(sql, parameters); if (result == null) return new ProgramProductionSummaryResponse(); - if (result.RunningProgramCount > 0) - result.AvgPerProgram = Math.Round((decimal)result.TotalQuantity / result.RunningProgramCount, 1); - string topSql = @"SELECT seg.program_name FROM cnc_production_segment seg - LEFT JOIN cnc_machine m ON seg.machine_id = m.id - WHERE seg.production_date BETWEEN @Start AND @End"; + if (result.RunningProgramCount > 0) result.AvgPerProgram = Math.Round((decimal)result.TotalQuantity / result.RunningProgramCount, 1); + string topSql = @"SELECT dp.program_name FROM cnc_daily_production dp LEFT JOIN cnc_machine m ON dp.machine_id = m.id WHERE dp.production_date BETWEEN @Start AND @End"; if (workshopId.HasValue) topSql += " AND m.workshop_id = @WorkshopId"; - topSql += @" GROUP BY seg.program_name ORDER BY SUM(CASE WHEN seg.is_settled=1 THEN seg.quantity - ELSE COALESCE(seg.end_part_count, seg.start_part_count) - seg.start_part_count END) DESC LIMIT 1"; + topSql += " GROUP BY dp.program_name ORDER BY SUM(dp.end_total_count - dp.base_total_count) DESC LIMIT 1"; result.TopProgramName = conn.ExecuteScalar(topSql, parameters) ?? ""; return result; } @@ -324,33 +203,15 @@ namespace CncRepository.Impl { using (var conn = CreateConnection()) { - string sql = @"SELECT seg.program_name AS ProgramName, - COUNT(DISTINCT seg.machine_id) AS MachineCount, - COALESCE(SUM(CASE WHEN seg.is_settled=1 THEN seg.quantity - ELSE COALESCE(seg.end_part_count, seg.start_part_count) - seg.start_part_count END), 0) AS TotalQuantity - FROM cnc_production_segment seg - LEFT JOIN cnc_machine m ON seg.machine_id = m.id - WHERE seg.production_date BETWEEN @Start AND @End"; + string sql = @"SELECT dp.program_name AS ProgramName, COUNT(DISTINCT dp.machine_id) AS MachineCount, SUM(dp.end_total_count - dp.base_total_count) AS TotalQuantity FROM cnc_daily_production dp LEFT JOIN cnc_machine m ON dp.machine_id = m.id WHERE dp.production_date BETWEEN @Start AND @End"; var parameters = new DynamicParameters(); - parameters.Add("Start", startDate); - parameters.Add("End", endDate); - if (!string.IsNullOrWhiteSpace(programName)) { sql += " AND seg.program_name = @ProgramName"; parameters.Add("ProgramName", programName); } - sql += " GROUP BY seg.program_name ORDER BY TotalQuantity DESC"; + parameters.Add("Start", startDate); parameters.Add("End", endDate); + if (!string.IsNullOrWhiteSpace(programName)) { sql += " AND dp.program_name = @ProgramName"; parameters.Add("ProgramName", programName); } + sql += " GROUP BY dp.program_name ORDER BY TotalQuantity DESC"; var items = conn.Query(sql, parameters).ToList(); - if (items.Count > 0) - { - int grandTotal = items.Sum(x => x.TotalQuantity); - for (int i = 0; i < items.Count; i++) - { - items[i].Rank = i + 1; - if (items[i].MachineCount > 0) items[i].AvgPerMachine = Math.Round((decimal)items[i].TotalQuantity / items[i].MachineCount, 1); - if (grandTotal > 0) items[i].Percentage = Math.Round((decimal)items[i].TotalQuantity / grandTotal * 100, 1); - } - } + if (items.Count > 0) { int grandTotal = items.Sum(x => x.TotalQuantity); for (int i = 0; i < items.Count; i++) { items[i].Rank = i + 1; if (items[i].MachineCount > 0) items[i].AvgPerMachine = Math.Round((decimal)items[i].TotalQuantity / items[i].MachineCount, 1); if (grandTotal > 0) items[i].Percentage = Math.Round((decimal)items[i].TotalQuantity / grandTotal * 100, 1); } } return items; } } - - #endregion } }