From 08a3995c956079a262ed395e19c58057deeb3e6d Mon Sep 17 00:00:00 2001
From: Administrator <2856754968@qq.com>
Date: 星期三, 05 十一月 2025 21:05:59 +0800
Subject: [PATCH] 111

---
 Entites/DbModels/MesEquipmentInspection.cs       |  118 +++++++++
 Services/EquipmentInspectionManager.cs           |  295 ++++++++++++++++++++++++
 Entites/Dto/EquipmentInspectionDto.cs            |  110 +++++++++
 Controllers/EquipmentInspectionController.cs     |   28 +
 Entites/DbModels/MesEquipmentInspectionDetail.cs |  130 ++++++++++
 5 files changed, 672 insertions(+), 9 deletions(-)

diff --git a/Controllers/EquipmentInspectionController.cs b/Controllers/EquipmentInspectionController.cs
index a326495..091ece6 100644
--- a/Controllers/EquipmentInspectionController.cs
+++ b/Controllers/EquipmentInspectionController.cs
@@ -11,18 +11,24 @@
 [Route("api/[controller]")]
 public class EquipmentInspectionController : ControllerBase
 {
+    private readonly EquipmentInspectionManager _manager = new();
 
+    /// <summary>
+    /// 鏌ヨ璁惧鐐规璁板綍
+    /// </summary>
+    /// <param name="query">鏌ヨ鍙傛暟锛歮achineNo鍜宒ate</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">淇濆瓨鍙傛暟锛歮achineNo銆乨ate銆乨ailyChecks銆乵onthlyChecks</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)
diff --git a/Entites/DbModels/MesEquipmentInspection.cs b/Entites/DbModels/MesEquipmentInspection.cs
new file mode 100644
index 0000000..53d7d73
--- /dev/null
+++ b/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", OracleSequenceName = "SEQ_MES_EquipmentInspection", IsPrimaryKey = 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>
+    /// 鐐规骞存湀锛堝啑浣欏瓧娈碉紝鏍煎紡锛歽yyy-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; }
+}
diff --git a/Entites/DbModels/MesEquipmentInspectionDetail.cs b/Entites/DbModels/MesEquipmentInspectionDetail.cs
new file mode 100644
index 0000000..4308999
--- /dev/null
+++ b/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", OracleSequenceName = "SEQ_MES_EquipInspDetail", IsPrimaryKey = true)]
+    public long DetailId { get; set; }
+
+    /// <summary>
+    /// 鐐规璁板綍ID锛屽叧鑱斾富琛�
+    /// </summary>
+    [SugarColumn(ColumnName = "InspectionId")]
+    public long InspectionId { get; set; }
+
+    /// <summary>
+    /// 鐐规绫诲瀷锛歞aily=鏃ュ父鐐规锛宮onthly=鏈堝害鐐规
+    /// </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鍒楄〃锛圝SON鏍煎紡锛�
+    /// </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; }
+}
diff --git a/Entites/Dto/EquipmentInspectionDto.cs b/Entites/Dto/EquipmentInspectionDto.cs
new file mode 100644
index 0000000..92d987d
--- /dev/null
+++ b/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; }
+}
diff --git a/Services/EquipmentInspectionManager.cs b/Services/EquipmentInspectionManager.cs
new file mode 100644
index 0000000..a252837
--- /dev/null
+++ b/Services/EquipmentInspectionManager.cs
@@ -0,0 +1,295 @@
+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 =
+    [
+        "鐢佃〃娌归潰鏄惁姝e父鏄惁鏈夋笚婕�",
+        "涓囧悜鎺ュご澶嶆煡骞跺姞娌�"
+    ];
+
+    /// <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("鏃ユ湡涓嶈兘涓虹┖");
+
+        // 瑙f瀽骞存湀
+        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();
+
+        // 鍒濆鍖栬繑鍥炴暟鎹紙鍏ㄩ儴涓篺alse锛�
+        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);
+
+        // 瑙f瀽骞存湀
+        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
+                };
+
+                // 鎻掑叆涓昏〃璁板綍锛堜娇鐢∣racle搴忓垪鑷姩鐢熸垚InspectionId锛�
+                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
+                    });
+                }
+            }
+
+            // 鎵归噺鎻掑叆鏄庣粏璁板綍锛堜娇鐢∣racle搴忓垪鑷姩鐢熸垚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")
+        };
+    }
+
+    /// <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("鍙傛暟閿欒锛氭棩鏈熸牸寮忎笉姝g‘锛屽簲涓� yyyy-MM");
+
+        // 楠岃瘉鏃ュ父鐐规鏁版嵁
+        if (saveDto.DailyChecks == null || saveDto.DailyChecks.Length != 6)
+            throw new Exception("鏁版嵁楠岃瘉澶辫触锛歞ailyChecks 蹇呴』鏄� 6 琛岀殑浜岀淮鏁扮粍");
+
+        for (int i = 0; i < 6; i++)
+        {
+            if (saveDto.DailyChecks[i] == null || saveDto.DailyChecks[i].Length != 31)
+                throw new Exception($"鏁版嵁楠岃瘉澶辫触锛歞ailyChecks[{i}] 蹇呴』鍖呭惈 31 涓厓绱�");
+        }
+
+        // 楠岃瘉鏈堝害鐐规鏁版嵁
+        if (saveDto.MonthlyChecks == null || saveDto.MonthlyChecks.Length != 2)
+            throw new Exception("鏁版嵁楠岃瘉澶辫触锛歮onthlyChecks 蹇呴』鏄� 2 琛岀殑浜岀淮鏁扮粍");
+
+        for (int i = 0; i < 2; i++)
+        {
+            if (saveDto.MonthlyChecks[i] == null || saveDto.MonthlyChecks[i].Length != 31)
+                throw new Exception($"鏁版嵁楠岃瘉澶辫触锛歮onthlyChecks[{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;
+    }
+}

--
Gitblit v1.9.3