using PadApplication.DB; using PadApplication.Entites.DbModels; using PadApplication.Entites.Dto; using SqlSugar; namespace PadApplication.Services; /// /// 设备点检管理服务类 /// 负责处理设备点检记录的查询和保存操作 /// public class EquipmentInspectionManager : Repository { // 日常点检项目配置(固定顺序) private readonly string[] _dailyInspectionItems = [ "机芯是否清洁", "设备开关", "改善运行", "清理清洁或调试是否有异常", "工艺参数", "机油运行是否有异常" ]; // 月度点检项目配置(固定顺序) private readonly string[] _monthlyInspectionItems = [ "电表油面是否正常是否有渗漏", "万向接头复查并加油" ]; /// /// 查询设备点检记录 /// /// 查询参数 /// 点检记录响应DTO public EquipmentInspectionResponseDto QueryInspectionRecord(EquipmentInspectionQueryDto query) { // 参数验证 if (string.IsNullOrWhiteSpace(query.MachineNo)) throw new Exception("机台编号不能为空"); if (string.IsNullOrWhiteSpace(query.Date)) throw new Exception("日期不能为空"); // 解析年月 if (!DateTime.TryParseExact(query.Date, "yyyy-MM", null, System.Globalization.DateTimeStyles.None, out var date)) throw new Exception("日期格式不正确,应为 yyyy-MM"); var year = date.Year; var month = date.Month; // 查询主表记录 var inspection = Db.Queryable() .Where(x => x.MachineNo == query.MachineNo && x.InspectionYear == year && x.InspectionMonth == month && !x.IsDeleted) .First(); // 初始化返回数据(全部为false) var dailyChecks = InitializeBoolArray(6, 31); var monthlyChecks = InitializeBoolArray(2, 31); string? lastUpdateTime = null; string? operatorName = null; // 如果存在记录,查询明细数据 if (inspection != null) { var details = Db.Queryable() .Where(x => x.InspectionId == inspection.InspectionId) .ToList(); // 填充日常点检数据 foreach (var detail in details.Where(d => d.ItemType == "daily")) { if (detail.ItemIndex >= 0 && detail.ItemIndex < 6 && detail.DayOfMonth >= 1 && detail.DayOfMonth <= 31) { dailyChecks[detail.ItemIndex][detail.DayOfMonth - 1] = detail.IsChecked; } } // 填充月度点检数据 foreach (var detail in details.Where(d => d.ItemType == "monthly")) { if (detail.ItemIndex >= 0 && detail.ItemIndex < 2 && detail.DayOfMonth >= 1 && detail.DayOfMonth <= 31) { monthlyChecks[detail.ItemIndex][detail.DayOfMonth - 1] = detail.IsChecked; } } lastUpdateTime = inspection.UpdatedTime?.ToString("yyyy-MM-dd HH:mm:ss") ?? inspection.CreatedTime.ToString("yyyy-MM-dd HH:mm:ss"); operatorName = inspection.UpdatedByName ?? inspection.CreatedByName; } return new EquipmentInspectionResponseDto { MachineNo = query.MachineNo, Date = query.Date, DailyChecks = dailyChecks, MonthlyChecks = monthlyChecks, LastUpdateTime = lastUpdateTime, Operator = operatorName }; } /// /// 保存设备点检记录 /// /// 保存参数 /// 保存结果响应DTO public EquipmentInspectionSaveResponseDto SaveInspectionRecord(EquipmentInspectionSaveDto saveDto) { // 参数验证 ValidateSaveData(saveDto); // 解析年月 var date = DateTime.ParseExact(saveDto.Date, "yyyy-MM", null); var year = date.Year; var month = date.Month; var savedTime = DateTime.Now; long inspectionId; // 使用事务保存数据 UseTransaction(db => { // 查询是否已存在记录 var existingInspection = db.Queryable() .Where(x => x.MachineNo == saveDto.MachineNo && x.InspectionYear == year && x.InspectionMonth == month && !x.IsDeleted) .First(); if (existingInspection != null) { // 更新现有记录 inspectionId = existingInspection.InspectionId; db.Updateable() .SetColumns(x => x.UpdatedBy == saveDto.Operator) .SetColumns(x => x.UpdatedByName == saveDto.OperatorName) .SetColumns(x => x.UpdatedTime == savedTime) .Where(x => x.InspectionId == inspectionId) .ExecuteCommand(); // 删除旧的明细记录 db.Deleteable() .Where(x => x.InspectionId == inspectionId) .ExecuteCommand(); } else { // 创建新记录 var newInspection = new MesEquipmentInspection { MachineNo = saveDto.MachineNo, InspectionYear = year, InspectionMonth = month, InspectionDate = saveDto.Date, CreatedBy = saveDto.Operator, CreatedByName = saveDto.OperatorName, CreatedTime = savedTime, Status = 0, IsDeleted = false }; // 插入主表记录(使用Oracle序列自动生成InspectionId) inspectionId = db.Insertable(newInspection) .ExecuteReturnBigIdentity(); } // 插入明细记录 var details = new List(); // 添加日常点检明细 for (int itemIndex = 0; itemIndex < 6; itemIndex++) { for (int day = 1; day <= 31; day++) { var isChecked = saveDto.DailyChecks[itemIndex][day - 1]; details.Add(new MesEquipmentInspectionDetail { InspectionId = inspectionId, ItemType = "daily", ItemIndex = itemIndex, ItemName = _dailyInspectionItems[itemIndex], DayOfMonth = day, IsChecked = isChecked, CheckedBy = isChecked ? saveDto.Operator : null, CheckedByName = isChecked ? saveDto.OperatorName : null, CheckedTime = isChecked ? savedTime : null, CreatedTime = savedTime, IsReviewed = false }); } } // 添加月度点检明细 for (int itemIndex = 0; itemIndex < 2; itemIndex++) { for (int day = 1; day <= 31; day++) { var isChecked = saveDto.MonthlyChecks[itemIndex][day - 1]; details.Add(new MesEquipmentInspectionDetail { InspectionId = inspectionId, ItemType = "monthly", ItemIndex = itemIndex, ItemName = _monthlyInspectionItems[itemIndex], DayOfMonth = day, IsChecked = isChecked, CheckedBy = isChecked ? saveDto.Operator : null, CheckedByName = isChecked ? saveDto.OperatorName : null, CheckedTime = isChecked ? savedTime : null, CreatedTime = savedTime, IsReviewed = false }); } } // 批量插入明细记录(使用Oracle序列自动生成DetailId) var insertCount = db.Insertable(details) .ExecuteCommand(); if (insertCount <= 0) throw new Exception("保存点检明细失败"); return insertCount; }); return new EquipmentInspectionSaveResponseDto { Success = true, RecordId = $"EI{saveDto.Date.Replace("-", "")}{saveDto.MachineNo}", SavedTime = savedTime.ToString("yyyy-MM-dd HH:mm:ss") }; } /// /// 验证保存数据的有效性 /// private void ValidateSaveData(EquipmentInspectionSaveDto saveDto) { if (string.IsNullOrWhiteSpace(saveDto.MachineNo)) throw new Exception("参数错误:机台编号不能为空"); if (string.IsNullOrWhiteSpace(saveDto.Date)) throw new Exception("参数错误:日期不能为空"); if (!DateTime.TryParseExact(saveDto.Date, "yyyy-MM", null, System.Globalization.DateTimeStyles.None, out _)) throw new Exception("参数错误:日期格式不正确,应为 yyyy-MM"); // 验证日常点检数据 if (saveDto.DailyChecks == null || saveDto.DailyChecks.Length != 6) throw new Exception("数据验证失败:dailyChecks 必须是 6 行的二维数组"); for (int i = 0; i < 6; i++) { if (saveDto.DailyChecks[i] == null || saveDto.DailyChecks[i].Length != 31) throw new Exception($"数据验证失败:dailyChecks[{i}] 必须包含 31 个元素"); } // 验证月度点检数据 if (saveDto.MonthlyChecks == null || saveDto.MonthlyChecks.Length != 2) throw new Exception("数据验证失败:monthlyChecks 必须是 2 行的二维数组"); for (int i = 0; i < 2; i++) { if (saveDto.MonthlyChecks[i] == null || saveDto.MonthlyChecks[i].Length != 31) throw new Exception($"数据验证失败:monthlyChecks[{i}] 必须包含 31 个元素"); } } /// /// 初始化布尔二维数组 /// private bool[][] InitializeBoolArray(int rows, int cols) { var array = new bool[rows][]; for (int i = 0; i < rows; i++) { array[i] = new bool[cols]; } return array; } }