You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
haoliang-net/src/CncRepository/Impl/DailyProductionRepository.cs

234 lines
16 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Linq;
using Dapper;
using CncModels.Entity;
using CncModels.Dto.Production;
using CncModels.Dto;
using CncRepository.Base;
using CncRepository.Interface;
namespace CncRepository.Impl
{
public class DailyProductionRepository : BusinessRepository, IDailyProductionRepository
{
public DailyProductionRepository(string connectionString) : base(connectionString) { }
public DailyProduction GetById(int id)
{
using (var conn = CreateConnection())
{
string sql = "SELECT * FROM cnc_daily_production WHERE id = @Id";
return conn.QuerySingleOrDefault<DailyProduction>(sql, new { Id = id });
}
}
public PagedResult<DailyProductionListItem> GetList(ProductionQuery query)
{
using (var conn = CreateConnection())
{
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,
(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 1=1";
if (query?.WorkshopId.HasValue == true)
{
baseSql += " AND m.workshop_id = @WorkshopId";
parameters.Add("WorkshopId", query.WorkshopId);
}
if (query?.MachineId.HasValue == true)
{
baseSql += " AND dp.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)";
parameters.Add("WorkerId", query.WorkerId);
}
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";
parameters.Add("Limit", query.PageSize);
parameters.Add("Offset", offset);
var items = conn.Query<DailyProductionListItem>(baseSql + paging, parameters).ToList();
int total = conn.ExecuteScalar<int>(countSql, parameters);
return new PagedResult<DailyProductionListItem> { Items = items, Total = total, Page = query.Page, PageSize = query.PageSize };
}
}
public List<DailyProduction> GetByMachineAndDate(int machineId, DateTime date)
{
using (var conn = CreateConnection())
{
string sql = "SELECT * FROM cnc_daily_production WHERE machine_id = @MachineId AND production_date = @Date";
return conn.Query<DailyProduction>(sql, new { MachineId = machineId, Date = date }).ToList();
}
}
public List<DailyProduction> GetByDateRange(DateTime startDate, DateTime endDate)
{
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";
return conn.Query<DailyProduction>(sql, new { Start = startDate, End = endDate }).ToList();
}
}
public decimal GetTotalByDateRange(DateTime startDate, DateTime endDate, int? workshopId)
{
using (var conn = CreateConnection())
{
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<decimal>(sql, new { Start = startDate, End = endDate, WorkshopId = workshopId.Value }); }
return conn.ExecuteScalar<decimal>(sql, new { Start = startDate, End = endDate });
}
}
public decimal GetTotalByWorkerAndDateRange(int workerId, DateTime startDate, DateTime endDate)
{
using (var conn = CreateConnection())
{
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<decimal?>(sql, new { Start = startDate, End = endDate });
return res ?? 0m;
}
}
public List<DailyProduction> GetMachineRankByDateRange(DateTime startDate, DateTime endDate, int top)
{
using (var conn = CreateConnection())
{
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<DailyProduction>(sql, new { Start = startDate, End = endDate, Top = top }).ToList();
}
}
public List<DailyProduction> GetWorkerRankByDateRange(DateTime startDate, DateTime endDate, int top)
{
using (var conn = CreateConnection())
{
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<DailyProduction>(sql, new { Start = startDate, End = endDate, Top = top }).ToList();
}
}
public MachineProductionSummaryResponse GetMachineSummary(DateTime startDate, DateTime endDate, int? workshopId)
{
using (var conn = CreateConnection())
{
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 AND dp.end_total_count > dp.base_total_count";
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); }
var result = conn.QuerySingleOrDefault<MachineProductionSummaryResponse>(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_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 dp.machine_id ORDER BY SUM(dp.end_total_count - dp.base_total_count) DESC LIMIT 1";
result.TopMachineName = result.TotalQuantity > 0 ? (conn.ExecuteScalar<string>(topSql, parameters) ?? "-") : "-";
return result;
}
}
public List<MachineProductionListItem> GetMachineList(DateTime startDate, DateTime endDate, int? workshopId, string machineIds)
{
using (var conn = CreateConnection())
{
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);
if (workshopId.HasValue) { sql += " AND m.workshop_id = @WorkshopId"; parameters.Add("WorkshopId", workshopId.Value); }
if (!string.IsNullOrWhiteSpace(machineIds))
{
var ids = machineIds.Split(',').Select(s => s.Trim()).Where(s => !string.IsNullOrEmpty(s)).ToList();
if (ids.Count > 0)
{
sql += " AND dp.machine_id IN @MachineIds";
parameters.Add("MachineIds", ids);
}
}
sql += " AND (dp.end_total_count > dp.base_total_count) GROUP BY dp.machine_id, dp.program_name, m.name HAVING SUM(dp.end_total_count - dp.base_total_count) > 0 ORDER BY TotalQuantity DESC";
var items = conn.Query<MachineProductionListItem>(sql, parameters).ToList();
for (int i = 0; i < items.Count; i++) { items[i].Rank = i + 1; items[i].DayStatus = items[i].DayStatus ?? ""; }
return items;
}
}
public WorkerProductionSummaryResponse GetWorkerSummary(DateTime startDate, DateTime endDate)
{
using (var conn = CreateConnection())
{
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 AND dp.end_total_count > dp.base_total_count";
var result = conn.QuerySingleOrDefault<WorkerProductionSummaryResponse>(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_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 = result.TotalQuantity > 0 ? (conn.ExecuteScalar<string>(topSql, new { Start = startDate, End = endDate }) ?? "-") : "-";
return result;
}
}
public List<WorkerProductionListItem> GetWorkerList(DateTime startDate, DateTime endDate, int? workerId)
{
using (var conn = CreateConnection())
{
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, GROUP_CONCAT(DISTINCT wm.machine_id) AS MachineIds, GROUP_CONCAT(DISTINCT dp.program_name) AS ProgramNames 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 AND dp.end_total_count > dp.base_total_count";
var parameters = new DynamicParameters();
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 HAVING COALESCE(SUM(dp.end_total_count - dp.base_total_count), 0) > 0 ORDER BY TotalQuantity DESC";
var items = conn.Query<WorkerProductionListItem>(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); } }
return items;
}
}
public ProgramProductionSummaryResponse GetProgramSummary(DateTime startDate, DateTime endDate, int? workshopId)
{
using (var conn = CreateConnection())
{
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 AND dp.end_total_count > dp.base_total_count";
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); }
var result = conn.QuerySingleOrDefault<ProgramProductionSummaryResponse>(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 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 dp.program_name ORDER BY SUM(dp.end_total_count - dp.base_total_count) DESC LIMIT 1";
result.TopProgramName = result.TotalQuantity > 0 ? (conn.ExecuteScalar<string>(topSql, parameters) ?? "-") : "-";
return result;
}
}
public List<ProgramProductionListItem> GetProgramList(DateTime startDate, DateTime endDate, string programNames)
{
using (var conn = CreateConnection())
{
string sql = @"SELECT dp.program_name AS ProgramName, GROUP_CONCAT(DISTINCT dp.machine_id) AS MachineIds, 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(programNames))
{
var names = programNames.Replace('', ',').Split(',').Select(s => s.Trim()).Where(s => !string.IsNullOrEmpty(s)).ToList();
if (names.Count > 0)
{
sql += " AND dp.program_name IN @ProgramNames";
parameters.Add("ProgramNames", names);
}
}
sql += " AND (dp.end_total_count > dp.base_total_count) GROUP BY dp.program_name HAVING SUM(dp.end_total_count - dp.base_total_count) > 0 ORDER BY TotalQuantity DESC";
var items = conn.Query<ProgramProductionListItem>(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); } }
return items;
}
}
}
}