tjx
2025-11-05 30ecd82c14c5b62bf5444f29edcbb7a044653b93
1111
已修改1个文件
已添加4个文件
679 ■■■■■ 文件已修改
Controllers/EquipmentInspectionController.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Entites/DbModels/MesEquipmentInspection.cs 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Entites/DbModels/MesEquipmentInspectionDetail.cs 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Entites/Dto/EquipmentInspectionDto.cs 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Services/EquipmentInspectionManager.cs 293 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/EquipmentInspectionController.cs
@@ -11,18 +11,24 @@
[Route("api/[controller]")]
public class EquipmentInspectionController : ControllerBase
{
    private readonly EquipmentInspectionManager _manager = new();
    /// <summary>
    /// æŸ¥è¯¢è®¾å¤‡ç‚¹æ£€è®°å½•
    /// </summary>
    /// <param name="query">查询参数:machineNo和date</param>
    /// <returns>点检记录数据</returns>
    [HttpPost("Query")]
    public ResponseResult Query(OrderMachineDto query)
    public ResponseResult Query(EquipmentInspectionQueryDto query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            var result = _manager.QueryInspectionRecord(query);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
                message = "查询成功",
                data = result
            };
        }
        catch (Exception ex)
@@ -31,18 +37,22 @@
        }
    }
    //GetWomdaasByEngineeringNo
    /// <summary>
    /// ä¿å­˜è®¾å¤‡ç‚¹æ£€è®°å½•
    /// </summary>
    /// <param name="saveDto">保存参数:machineNo、date、dailyChecks、monthlyChecks</param>
    /// <returns>保存结果</returns>
    [HttpPost("Save")]
    public ResponseResult Save(OrderMachineDto query)
    public ResponseResult Save(EquipmentInspectionSaveDto saveDto)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            var result = _manager.SaveInspectionRecord(saveDto);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
                message = "保存成功",
                data = result
            };
        }
        catch (Exception ex)
Entites/DbModels/MesEquipmentInspection.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,118 @@
using SqlSugar;
namespace PadApplication.Entites.DbModels;
/// <summary>
/// è®¾å¤‡ç‚¹æ£€ä¸»è¡¨
/// </summary>
[SugarTable("MES_EquipmentInspection")]
public class MesEquipmentInspection
{
    /// <summary>
    /// ç‚¹æ£€è®°å½•ID,自增主键
    /// </summary>
    [SugarColumn(ColumnName = "InspectionId", IsPrimaryKey = true, IsIdentity = true)]
    public long InspectionId { get; set; }
    /// <summary>
    /// æœºå°ç¼–号(如:01, 02, 03)
    /// </summary>
    [SugarColumn(ColumnName = "MachineNo")]
    public string MachineNo { get; set; }
    /// <summary>
    /// ç‚¹æ£€å¹´ä»½ï¼ˆå¦‚:2025)
    /// </summary>
    [SugarColumn(ColumnName = "InspectionYear")]
    public int InspectionYear { get; set; }
    /// <summary>
    /// ç‚¹æ£€æœˆä»½ï¼ˆ1-12)
    /// </summary>
    [SugarColumn(ColumnName = "InspectionMonth")]
    public int InspectionMonth { get; set; }
    /// <summary>
    /// ç‚¹æ£€å¹´æœˆï¼ˆå†—余字段,格式:yyyy-MM,如:2025-11)
    /// </summary>
    [SugarColumn(ColumnName = "InspectionDate")]
    public string InspectionDate { get; set; }
    /// <summary>
    /// åˆ›å»ºäººè´¦å·
    /// </summary>
    [SugarColumn(ColumnName = "CreatedBy")]
    public string? CreatedBy { get; set; }
    /// <summary>
    /// åˆ›å»ºäººå§“名
    /// </summary>
    [SugarColumn(ColumnName = "CreatedByName")]
    public string? CreatedByName { get; set; }
    /// <summary>
    /// åˆ›å»ºæ—¶é—´
    /// </summary>
    [SugarColumn(ColumnName = "CreatedTime")]
    public DateTime CreatedTime { get; set; }
    /// <summary>
    /// æœ€åŽä¿®æ”¹äººè´¦å·
    /// </summary>
    [SugarColumn(ColumnName = "UpdatedBy")]
    public string? UpdatedBy { get; set; }
    /// <summary>
    /// æœ€åŽä¿®æ”¹äººå§“名
    /// </summary>
    [SugarColumn(ColumnName = "UpdatedByName")]
    public string? UpdatedByName { get; set; }
    /// <summary>
    /// æœ€åŽä¿®æ”¹æ—¶é—´
    /// </summary>
    [SugarColumn(ColumnName = "UpdatedTime")]
    public DateTime? UpdatedTime { get; set; }
    /// <summary>
    /// æ—¥å¸¸ç‚¹æ£€å®ŒæˆçŽ‡ï¼ˆ%)
    /// </summary>
    [SugarColumn(ColumnName = "DailyCompletionRate")]
    public decimal? DailyCompletionRate { get; set; }
    /// <summary>
    /// æœˆåº¦ç‚¹æ£€å®ŒæˆçŽ‡ï¼ˆ%)
    /// </summary>
    [SugarColumn(ColumnName = "MonthlyCompletionRate")]
    public decimal? MonthlyCompletionRate { get; set; }
    /// <summary>
    /// æ€»ç‚¹æ£€æ¬¡æ•°
    /// </summary>
    [SugarColumn(ColumnName = "TotalCheckCount")]
    public int? TotalCheckCount { get; set; }
    /// <summary>
    /// å·²å®Œæˆç‚¹æ£€æ¬¡æ•°
    /// </summary>
    [SugarColumn(ColumnName = "CompletedCheckCount")]
    public int? CompletedCheckCount { get; set; }
    /// <summary>
    /// çŠ¶æ€ï¼š0=草稿,1=已提交,2=已审核
    /// </summary>
    [SugarColumn(ColumnName = "Status")]
    public int Status { get; set; }
    /// <summary>
    /// æ˜¯å¦å·²åˆ é™¤ï¼š0=否,1=是
    /// </summary>
    [SugarColumn(ColumnName = "IsDeleted")]
    public bool IsDeleted { get; set; }
    /// <summary>
    /// å¤‡æ³¨
    /// </summary>
    [SugarColumn(ColumnName = "Remark")]
    public string? Remark { get; set; }
}
Entites/DbModels/MesEquipmentInspectionDetail.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,130 @@
using SqlSugar;
namespace PadApplication.Entites.DbModels;
/// <summary>
/// è®¾å¤‡ç‚¹æ£€æ˜Žç»†è¡¨
/// </summary>
[SugarTable("MES_EquipmentInspectionDetail")]
public class MesEquipmentInspectionDetail
{
    /// <summary>
    /// æ˜Žç»†ID,自增主键
    /// </summary>
    [SugarColumn(ColumnName = "DetailId", IsPrimaryKey = true, IsIdentity = true)]
    public long DetailId { get; set; }
    /// <summary>
    /// ç‚¹æ£€è®°å½•ID,关联主表
    /// </summary>
    [SugarColumn(ColumnName = "InspectionId")]
    public long InspectionId { get; set; }
    /// <summary>
    /// ç‚¹æ£€ç±»åž‹ï¼šdaily=日常点检,monthly=月度点检
    /// </summary>
    [SugarColumn(ColumnName = "ItemType")]
    public string ItemType { get; set; }
    /// <summary>
    /// ç‚¹æ£€é¡¹ç›®ç´¢å¼•(0-5为日常,0-1为月度)
    /// </summary>
    [SugarColumn(ColumnName = "ItemIndex")]
    public int ItemIndex { get; set; }
    /// <summary>
    /// ç‚¹æ£€é¡¹ç›®åç§°ï¼ˆå†—余字段,便于查询)
    /// </summary>
    [SugarColumn(ColumnName = "ItemName")]
    public string ItemName { get; set; }
    /// <summary>
    /// æœˆå†…日期(1-31)
    /// </summary>
    [SugarColumn(ColumnName = "DayOfMonth")]
    public int DayOfMonth { get; set; }
    /// <summary>
    /// æ˜¯å¦å®Œæˆç‚¹æ£€ï¼š0=未完成,1=已完成
    /// </summary>
    [SugarColumn(ColumnName = "IsChecked")]
    public bool IsChecked { get; set; }
    /// <summary>
    /// ç‚¹æ£€äººè´¦å·
    /// </summary>
    [SugarColumn(ColumnName = "CheckedBy")]
    public string? CheckedBy { get; set; }
    /// <summary>
    /// ç‚¹æ£€äººå§“名
    /// </summary>
    [SugarColumn(ColumnName = "CheckedByName")]
    public string? CheckedByName { get; set; }
    /// <summary>
    /// ç‚¹æ£€æ—¶é—´
    /// </summary>
    [SugarColumn(ColumnName = "CheckedTime")]
    public DateTime? CheckedTime { get; set; }
    /// <summary>
    /// ç‚¹æ£€ç»“果:正常、异常等
    /// </summary>
    [SugarColumn(ColumnName = "CheckResult")]
    public string? CheckResult { get; set; }
    /// <summary>
    /// å¼‚常备注
    /// </summary>
    [SugarColumn(ColumnName = "AbnormalRemark")]
    public string? AbnormalRemark { get; set; }
    /// <summary>
    /// ç‚¹æ£€å›¾ç‰‡URL列表(JSON格式)
    /// </summary>
    [SugarColumn(ColumnName = "ImageUrls")]
    public string? ImageUrls { get; set; }
    /// <summary>
    /// æ˜¯å¦å·²å®¡æ ¸ï¼š0=否,1=是
    /// </summary>
    [SugarColumn(ColumnName = "IsReviewed")]
    public bool IsReviewed { get; set; }
    /// <summary>
    /// å®¡æ ¸äººè´¦å·
    /// </summary>
    [SugarColumn(ColumnName = "ReviewedBy")]
    public string? ReviewedBy { get; set; }
    /// <summary>
    /// å®¡æ ¸äººå§“名
    /// </summary>
    [SugarColumn(ColumnName = "ReviewedByName")]
    public string? ReviewedByName { get; set; }
    /// <summary>
    /// å®¡æ ¸æ—¶é—´
    /// </summary>
    [SugarColumn(ColumnName = "ReviewedTime")]
    public DateTime? ReviewedTime { get; set; }
    /// <summary>
    /// å®¡æ ¸å¤‡æ³¨
    /// </summary>
    [SugarColumn(ColumnName = "ReviewRemark")]
    public string? ReviewRemark { get; set; }
    /// <summary>
    /// åˆ›å»ºæ—¶é—´
    /// </summary>
    [SugarColumn(ColumnName = "CreatedTime")]
    public DateTime CreatedTime { get; set; }
    /// <summary>
    /// ä¿®æ”¹æ—¶é—´
    /// </summary>
    [SugarColumn(ColumnName = "UpdatedTime")]
    public DateTime? UpdatedTime { get; set; }
}
Entites/Dto/EquipmentInspectionDto.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,110 @@
namespace PadApplication.Entites.Dto;
/// <summary>
/// è®¾å¤‡ç‚¹æ£€æŸ¥è¯¢è¯·æ±‚DTO
/// </summary>
public class EquipmentInspectionQueryDto
{
    /// <summary>
    /// æœºå°ç¼–号(必填)
    /// </summary>
    public string MachineNo { get; set; }
    /// <summary>
    /// å¹´æœˆæ ¼å¼ "yyyy-MM"(必填)
    /// </summary>
    public string Date { get; set; }
}
/// <summary>
/// è®¾å¤‡ç‚¹æ£€ä¿å­˜è¯·æ±‚DTO
/// </summary>
public class EquipmentInspectionSaveDto
{
    /// <summary>
    /// æœºå°ç¼–号(必填)
    /// </summary>
    public string MachineNo { get; set; }
    /// <summary>
    /// å¹´æœˆæ ¼å¼ "yyyy-MM"(必填)
    /// </summary>
    public string Date { get; set; }
    /// <summary>
    /// æ—¥å¸¸ç‚¹æ£€æ•°æ®ï¼ˆ6项×31天)
    /// </summary>
    public bool[][] DailyChecks { get; set; }
    /// <summary>
    /// æœˆåº¦ç‚¹æ£€æ•°æ®ï¼ˆ2项×31天)
    /// </summary>
    public bool[][] MonthlyChecks { get; set; }
    /// <summary>
    /// æ“ä½œå‘˜è´¦å·ï¼ˆå¯é€‰ï¼Œä»Žç™»å½•会话获取)
    /// </summary>
    public string? Operator { get; set; }
    /// <summary>
    /// æ“ä½œå‘˜å§“名(可选)
    /// </summary>
    public string? OperatorName { get; set; }
}
/// <summary>
/// è®¾å¤‡ç‚¹æ£€æŸ¥è¯¢å“åº”DTO
/// </summary>
public class EquipmentInspectionResponseDto
{
    /// <summary>
    /// æœºå°ç¼–号
    /// </summary>
    public string MachineNo { get; set; }
    /// <summary>
    /// å¹´æœˆ
    /// </summary>
    public string Date { get; set; }
    /// <summary>
    /// æ—¥å¸¸ç‚¹æ£€æ•°æ®ï¼ˆ6项×31天)
    /// </summary>
    public bool[][] DailyChecks { get; set; }
    /// <summary>
    /// æœˆåº¦ç‚¹æ£€æ•°æ®ï¼ˆ2项×31天)
    /// </summary>
    public bool[][] MonthlyChecks { get; set; }
    /// <summary>
    /// æœ€åŽæ›´æ–°æ—¶é—´
    /// </summary>
    public string? LastUpdateTime { get; set; }
    /// <summary>
    /// æœ€åŽæ“ä½œå‘˜
    /// </summary>
    public string? Operator { get; set; }
}
/// <summary>
/// è®¾å¤‡ç‚¹æ£€ä¿å­˜å“åº”DTO
/// </summary>
public class EquipmentInspectionSaveResponseDto
{
    /// <summary>
    /// æ˜¯å¦ä¿å­˜æˆåŠŸ
    /// </summary>
    public bool Success { get; set; }
    /// <summary>
    /// ç‚¹æ£€è®°å½•ID(可选)
    /// </summary>
    public string? RecordId { get; set; }
    /// <summary>
    /// ä¿å­˜æ—¶é—´ï¼ˆå¯é€‰ï¼‰
    /// </summary>
    public string? SavedTime { get; set; }
}
Services/EquipmentInspectionManager.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,293 @@
using PadApplication.DB;
using PadApplication.Entites.DbModels;
using PadApplication.Entites.Dto;
using SqlSugar;
namespace PadApplication.Services;
/// <summary>
/// è®¾å¤‡ç‚¹æ£€ç®¡ç†æœåŠ¡ç±»
/// è´Ÿè´£å¤„理设备点检记录的查询和保存操作
/// </summary>
public class EquipmentInspectionManager : Repository<MesEquipmentInspection>
{
    // æ—¥å¸¸ç‚¹æ£€é¡¹ç›®é…ç½®ï¼ˆå›ºå®šé¡ºåºï¼‰
    private readonly string[] _dailyInspectionItems =
    [
        "机芯是否清洁",
        "设备开关",
        "改善运行",
        "清理清洁或调试是否有异常",
        "工艺参数",
        "机油运行是否有异常"
    ];
    // æœˆåº¦ç‚¹æ£€é¡¹ç›®é…ç½®ï¼ˆå›ºå®šé¡ºåºï¼‰
    private readonly string[] _monthlyInspectionItems =
    [
        "电表油面是否正常是否有渗漏",
        "万向接头复查并加油"
    ];
    /// <summary>
    /// æŸ¥è¯¢è®¾å¤‡ç‚¹æ£€è®°å½•
    /// </summary>
    /// <param name="query">查询参数</param>
    /// <returns>点检记录响应DTO</returns>
    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<MesEquipmentInspection>()
            .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<MesEquipmentInspectionDetail>()
                .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
        };
    }
    /// <summary>
    /// ä¿å­˜è®¾å¤‡ç‚¹æ£€è®°å½•
    /// </summary>
    /// <param name="saveDto">保存参数</param>
    /// <returns>保存结果响应DTO</returns>
    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<MesEquipmentInspection>()
                .Where(x => x.MachineNo == saveDto.MachineNo
                            && x.InspectionYear == year
                            && x.InspectionMonth == month
                            && !x.IsDeleted)
                .First();
            if (existingInspection != null)
            {
                // æ›´æ–°çŽ°æœ‰è®°å½•
                inspectionId = existingInspection.InspectionId;
                db.Updateable<MesEquipmentInspection>()
                    .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<MesEquipmentInspectionDetail>()
                    .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
                };
                inspectionId = db.Insertable(newInspection)
                    .ExecuteReturnBigIdentity();
            }
            // æ’入明细记录
            var details = new List<MesEquipmentInspectionDetail>();
            // æ·»åŠ æ—¥å¸¸ç‚¹æ£€æ˜Žç»†
            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
                    });
                }
            }
            // æ‰¹é‡æ’入明细记录
            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")
        };
    }
    /// <summary>
    /// éªŒè¯ä¿å­˜æ•°æ®çš„æœ‰æ•ˆæ€§
    /// </summary>
    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 ä¸ªå…ƒç´ ");
        }
    }
    /// <summary>
    /// åˆå§‹åŒ–布尔二维数组
    /// </summary>
    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;
    }
}