From 36fdf1c876e5b9daa4446b9c33e9c532d725798b Mon Sep 17 00:00:00 2001
From: 啊鑫 <t2856754968@163.com>
Date: 星期二, 08 七月 2025 16:50:53 +0800
Subject: [PATCH] 重构代码质量和安全性改进

---
 MES.Service/Modes/MesQaIqc.cs                              |   27 
 MES.Service/Modes/MessageCenter.cs                         |  107 ++--
 MES.Service/service/MessageCenterManager.cs                |   34 +
 CLAUDE.md                                                  |  105 +++++
 CodeReviewReport.md                                        |  309 ++++++++++++++
 MES.Service/Dto/service/XJPageResult.cs                    |   30 +
 MESApplication/Controllers/Base/MessageCenterController.cs |   46 ++
 MESApplication/README.md                                   |  302 ++++++++++++++
 MES.Service/Modes/MesQaItemsDetectDetail5.cs               |    3 
 MES.Service/service/QC/LljService.cs                       |  271 +++++++++---
 10 files changed, 1,093 insertions(+), 141 deletions(-)

diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 0000000..a0011ac
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,105 @@
+# CLAUDE.md
+
+This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
+
+## Project Overview
+
+This is a Manufacturing Execution System (MES) API built with ASP.NET Core 8.0 and Oracle database. The solution consists of two main projects:
+
+- **MESApplication**: Web API project with controllers and startup configuration
+- **MES.Service**: Service layer with business logic, data models, and database operations
+
+## Database Environment
+
+Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
+
+- PL/SQL Release 11.2.0.1.0 - Production
+- CORE 11.2.0.1.0 Production
+- TNS for 64-bit Windows: Version 11.2.0.1.0 - Production
+- NLSRTL Version 11.2.0.1.0 - Production
+
+**IMPORTANT**: All code must be compatible with Oracle 11g Release 11.2.0.1.0
+鎵�鏈夌殑鍥炵瓟閮介渶瑕佸熀浜庤繖涓増鏈彲浠ュ吋瀹圭殑鍋氭硶
+
+## Architecture
+
+The project follows a layered architecture:
+
+- **Controllers**: Located in `MESApplication/Controllers/` organized by domain (BasicData, QC, Warehouse)
+- **Services**: Business logic in `MES.Service/service/` with managers for each domain
+- **Models**: Data models in `MES.Service/Modes/` representing database entities
+- **DTOs**: Data transfer objects in `MES.Service/Dto/` for API communication
+- **Database**: Oracle database access via SqlSugar ORM in `MES.Service/DB/`
+
+## Key Technologies
+
+- ASP.NET Core 8.0 Web API
+- Oracle Database with SqlSugar ORM
+- Swagger for API documentation
+- Newtonsoft.Json for JSON serialization
+- CORS enabled for cross-origin requests
+
+## Development Commands
+
+### Build and Run
+```bash
+# Build the entire solution
+dotnet build MESApplication.sln
+
+# Run the application in development mode
+dotnet run --project MESApplication
+
+# Run with specific profile
+dotnet run --project MESApplication --launch-profile http
+```
+
+### Development Server
+- Default URL: `http://localhost:5184`
+- Swagger UI: `http://localhost:5184/swagger`
+- IIS Express: `http://localhost:10054`
+
+### Database Operations
+- Uses SqlSugar ORM with Oracle database
+- Connection string configured in `appsettings.json`
+- Database context in `MES.Service/DB/SqlSugarHelper.cs`
+- SQL logging enabled in development for debugging
+
+## Project Structure
+
+### Domain Organization
+The API is organized into several business domains:
+
+- **BasicData**: Core master data (customers, items, suppliers, etc.)
+- **QC**: Quality control processes (inspection, testing, suspension)
+- **Warehouse**: Inventory management (stock, movements, receipts)
+- **MessageCenter**: System notifications and messaging
+
+### Key Patterns
+- Repository pattern implemented in `MES.Service/DB/Repository.cs`
+- Service layer with manager classes for each entity
+- DTO pattern for API request/response objects
+- Action filters for cross-cutting concerns in `MESApplication/Filter/`
+
+## Configuration
+
+### Database Configuration
+- Oracle database connection in `appsettings.json` under `AppSettings.DataBaseConn`
+- ERP integration URLs configured in `AppSettings` section
+
+### API Configuration
+- Swagger documentation enabled in development
+- CORS configured to allow all origins
+- JSON serialization uses camelCase naming
+- XML documentation generation enabled
+
+## Testing
+
+Use the `MESApplication.http` file for API testing with HTTP requests.
+
+## Development Notes
+
+- The application uses Chinese comments and naming conventions
+- Database entities follow Oracle naming conventions
+- API responses follow camelCase JSON format
+- All controllers inherit from base controller classes
+- Transaction support available through `SqlSugarHelper.UseTransactionWithOracle()`
\ No newline at end of file
diff --git a/CodeReviewReport.md b/CodeReviewReport.md
new file mode 100644
index 0000000..a5d2761
--- /dev/null
+++ b/CodeReviewReport.md
@@ -0,0 +1,309 @@
+# C# 浠g爜璐ㄩ噺瀹℃煡鎶ュ憡
+
+## 姒傝堪
+鏈姤鍛婂垎鏋愪簡鎮ㄧ殑MES API椤圭洰涓凡淇敼鐨凜#鏂囦欢锛岃瘑鍒嚭浠g爜璐ㄩ噺闂骞舵彁渚涙敼杩涘缓璁��
+
+## 涓昏闂鎬荤粨
+
+### 馃敶 涓ラ噸闂
+1. **鍛藉悕瑙勮寖涓嶄竴鑷�** - 娣峰悎浣跨敤PascalCase鍜宑amelCase
+2. **SQL娉ㄥ叆椋庨櫓** - 瀛楃涓叉嫾鎺ユ瀯寤篠QL璇彞
+3. **浜嬪姟绠$悊娣蜂贡** - 涓嶄竴鑷寸殑浜嬪姟澶勭悊妯″紡
+4. **寮傚父澶勭悊涓嶅綋** - 鎹曡幏鍚庨噸鏂版姏鍑洪�氱敤寮傚父
+
+### 馃煛 涓瓑闂
+1. **鏁版嵁绫诲瀷浣跨敤涓嶅綋** - 杩囧害浣跨敤string绫诲瀷
+2. **缂哄皯杈撳叆楠岃瘉** - 鏂规硶鍙傛暟鏈獙璇�
+3. **榄旀硶鏁板瓧鍜屽瓧绗︿覆** - 纭紪鐮佸�肩己灏戝父閲忓畾涔�
+4. **鏂规硶鑱岃矗杩囧** - 鍗曚釜鏂规硶鍖呭惈澶氱閫昏緫
+
+## 璇︾粏闂鍒嗘瀽
+
+### 1. XJPageResult.cs - DTO绫昏璁¢棶棰�
+
+**鏂囦欢浣嶇疆**: `MES.Service/Dto/service/XJPageResult.cs`
+
+#### 闂:
+```csharp
+public string? createUser { get; set; }    // 鉂� camelCase
+public string? SearchValue { get; set; }   // 鉁� PascalCase
+public string? startDate { get; set; }     // 鉂� camelCase
+```
+
+#### 寤鸿鏀硅繘:
+```csharp
+public string? CreateUser { get; set; }
+public string? SearchValue { get; set; }
+public DateTime? StartDate { get; set; }   // 浣跨敤姝g‘鐨勬暟鎹被鍨�
+public DateTime? EndDate { get; set; }
+public bool? ArrivalFilter { get; set; }   // 浣跨敤bool鑰屼笉鏄痠nt
+```
+
+**鍘熷洜**: 
+- C#灞炴�у簲浣跨敤PascalCase鍛藉悕瑙勮寖
+- 鏃ユ湡瀛楁搴斾娇鐢―ateTime鑰屼笉鏄痵tring
+- 甯冨皵鍊煎簲浣跨敤bool绫诲瀷
+
+### 2. MessageCenter.cs - 鏁版嵁妯″瀷闂
+
+**鏂囦欢浣嶇疆**: `MES.Service/Modes/MessageCenter.cs`
+
+#### 闂:
+```csharp
+[SugarColumn(ColumnName = "CREATE_DATE")]
+public string? CreateDate { get; set; }    // 鉂� 鏃ユ湡搴斾负DateTime
+
+[SugarColumn(ColumnName = "Content_Type")]  // 鉂� 鏁版嵁搴撳垪鍚嶄笉瑙勮寖
+public string? ContentType { get; set; }
+
+[SugarColumn(IsIgnore = true)] 
+public int? isShow { get; set; }           // 鉂� camelCase鍛藉悕
+```
+
+#### 寤鸿鏀硅繘:
+```csharp
+[SugarColumn(ColumnName = "CREATE_DATE")]
+public DateTime? CreateDate { get; set; }
+
+[SugarColumn(ColumnName = "CONTENT_TYPE")]  // 缁熶竴澶у啓涓嬪垝绾挎牸寮�
+public string? ContentType { get; set; }
+
+[SugarColumn(IsIgnore = true)] 
+public bool? IsShow { get; set; }          // 姝g‘鍛藉悕鍜岀被鍨�
+```
+
+### 3. MessageCenterManager.cs - 鏈嶅姟灞傞棶棰�
+
+**鏂囦欢浣嶇疆**: `MES.Service/service/MessageCenterManager.cs`
+
+#### 涓ラ噸闂 - SQL娉ㄥ叆椋庨櫓:
+```csharp
+var sql = string.Format(
+    "SELECT * FROM (SELECT \"ID\",\"TABLE_NAME\"... WHERE RowIndex BETWEEN {0} AND {1} ",
+    startRow, endRow);  // 鉂� 瀛樺湪SQL娉ㄥ叆椋庨櫓
+```
+
+#### 寤鸿鏀硅繘:
+```csharp
+public (List<MessageCenter> item, int TotalCount) GetPushFailedPage(MessageCenter query)
+{
+    var totalCount = IsShow(query);
+    
+    return Context.Queryable<MessageCenter>()
+        .Where(it => it.Result == 0 && it.Seq == 1 && it.Title != null)
+        .OrderByDescending(it => it.CreateDate)
+        .ToPageList(query.PageIndex, query.Limit, ref totalCount);
+}
+```
+
+#### 鍏朵粬闂:
+```csharp
+// 鉂� 纭紪鐮佺殑榄旀硶鏁板瓧
+entity.Result = 0;
+entity.DealWith = 0;
+entity.Status = 1;
+
+// 鉂� 瀛楃涓叉牸寮忓寲鏃ユ湡
+entity.CreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+```
+
+#### 寤鸿鏀硅繘:
+```csharp
+// 鉁� 浣跨敤甯搁噺
+public static class MessageStatus 
+{
+    public const short Failed = 0;
+    public const short Success = 1;
+    public const short Pending = 0;
+    public const short Processed = 1;
+}
+
+// 鉁� 浣跨敤DateTime绫诲瀷
+entity.CreateDate = DateTime.Now;
+```
+
+### 4. LljService.cs - 涓氬姟閫昏緫闂
+
+**鏂囦欢浣嶇疆**: `MES.Service/service/QC/LljService.cs`
+
+#### 涓ラ噸闂:
+```csharp
+public (List<LtsLlj> item, int TotalCount) GetPage(XJPageResult queryObj)
+{
+    if (queryObj.createUser.IsNullOrEmpty()) return ([], 0);  // 鉂� 鏃犺緭鍏ラ獙璇�
+    
+    var id = Convert.ToDecimal(queryObj.id);  // 鉂� 鍙兘鎶涘嚭寮傚父
+}
+```
+
+#### 寤鸿鏀硅繘:
+```csharp
+public (List<LtsLlj> item, int TotalCount) GetPage(XJPageResult queryObj)
+{
+    // 鉁� 杈撳叆楠岃瘉
+    if (queryObj == null)
+        throw new ArgumentNullException(nameof(queryObj));
+        
+    if (string.IsNullOrEmpty(queryObj.CreateUser))
+        return (new List<LtsLlj>(), 0);
+    
+    // 鉁� 瀹夊叏鐨勭被鍨嬭浆鎹�
+    if (!decimal.TryParse(queryObj.Id, out var id))
+        id = 0;
+}
+```
+
+#### 澶嶆潅鏂规硶闂:
+```csharp
+// 鉂� autoResult鏂规硶杩囦簬澶嶆潅(100+琛�)锛屽寘鍚绉嶈亴璐�
+private int autoResult(MesQaItemsDetectDetail12 detail)
+{
+    // 鏌ヨ妫�楠岄」鐩�
+    // 璁$畻妫�楠岀粨鏋�  
+    // 鏇存柊妫�楠岀姸鎬�
+    // 鏇存柊妫�楠屽崟鐘舵��
+    // 涓氬姟閫昏緫鍒ゆ柇
+    // 鏁版嵁搴撴洿鏂�
+}
+```
+
+#### 寤鸿鏀硅繘:
+```csharp
+// 鉁� 鎷嗗垎涓哄涓亴璐e崟涓�鐨勬柟娉�
+public int ProcessInspectionResult(MesQaItemsDetectDetail12 detail)
+{
+    var inspectionItem = GetInspectionItem(detail.MainId);
+    var inspectionCounts = CalculateInspectionCounts(detail.MainId);
+    var result = DetermineInspectionResult(inspectionCounts, inspectionItem);
+    
+    UpdateInspectionDetail(detail, result, inspectionCounts);
+    
+    if (IsInspectionComplete(detail.ReleaseNo))
+    {
+        UpdateInspectionOrder(detail);
+    }
+    
+    return 1;
+}
+```
+
+### 5. MessageCenterController.cs - 鎺у埗鍣ㄩ棶棰�
+
+**鏂囦欢浣嶇疆**: `MESApplication/Controllers/Base/MessageCenterController.cs`
+
+#### 闂:
+```csharp
+// 鉂� 閲嶅鐨勫紓甯稿鐞嗘ā寮�
+[HttpPost("ResetUpdate")]
+public ResponseResult ResetUpdate([FromBody] MessageCenter data)
+{
+    try
+    {
+        dynamic resultInfos = new ExpandoObject();  // 鉂� 浣跨敤dynamic
+        resultInfos.tbBillList = m.ResetUpdate(data);
+        return new ResponseResult { status = 0, message = "OK", data = resultInfos };
+    }
+    catch (Exception ex)
+    {
+        return ResponseResult.ResponseError(ex);  // 鉂� 閲嶅浠g爜
+    }
+}
+```
+
+#### 寤鸿鏀硅繘:
+```csharp
+// 鉁� 浣跨敤寮虹被鍨嬪搷搴斿拰鍩虹被鏂规硶
+[HttpPost("ResetUpdate")]
+public ResponseResult ResetUpdate([FromBody] MessageCenter data)
+{
+    return ExecuteWithErrorHandling(() => 
+    {
+        var result = m.ResetUpdate(data);
+        return CreateSuccessResponse(result);
+    });
+}
+
+// 鉁� 鍩虹被鏂规硶鍑忓皯閲嶅浠g爜
+protected ResponseResult ExecuteWithErrorHandling<T>(Func<T> action)
+{
+    try
+    {
+        var result = action();
+        return CreateSuccessResponse(result);
+    }
+    catch (Exception ex)
+    {
+        return ResponseResult.ResponseError(ex);
+    }
+}
+```
+
+## 鏀硅繘寤鸿浼樺厛绾�
+
+### 馃敟 绔嬪嵆淇 (楂樹紭鍏堢骇)
+1. **淇SQL娉ㄥ叆椋庨櫓** - MessageCenterManager.cs:20-22
+2. **缁熶竴鍛藉悕瑙勮寖** - 鎵�鏈夊睘鎬т娇鐢≒ascalCase
+3. **瀹夊叏鐨勭被鍨嬭浆鎹�** - 娣诲姞TryParse楠岃瘉
+
+### 鈿� 灏藉揩淇 (涓紭鍏堢骇)  
+1. **姝g‘鐨勬暟鎹被鍨�** - 鏃ユ湡浣跨敤DateTime锛屽竷灏斿�间娇鐢╞ool
+2. **杈撳叆楠岃瘉** - 鎵�鏈夊叕鍏辨柟娉曟坊鍔犲弬鏁伴獙璇�
+3. **甯搁噺瀹氫箟** - 鏇挎崲榄旀硶鏁板瓧鍜屽瓧绗︿覆
+
+### 馃挕 閫愭鏀硅繘 (浣庝紭鍏堢骇)
+1. **鏂规硶閲嶆瀯** - 鎷嗗垎澶嶆潅鏂规硶
+2. **缁熶竴寮傚父澶勭悊** - 浣跨敤鍩虹被鏂规硶鍑忓皯閲嶅
+3. **寮虹被鍨嬪寲** - 閬垮厤浣跨敤dynamic鍜孍xpandoObject
+
+## 浠g爜瑙勮寖寤鸿
+
+### 鍛藉悕瑙勮寖
+```csharp
+// 鉁� 姝g‘鐨勫懡鍚�
+public class MessageCenter           // PascalCase for classes
+{
+    public string TableName { get; set; }     // PascalCase for properties
+    public DateTime CreateDate { get; set; }   // PascalCase for properties
+    
+    private readonly string _connectionString; // camelCase with underscore for private fields
+    
+    public void ProcessMessage() { }           // PascalCase for methods
+}
+```
+
+### 绫诲瀷瀹夊叏
+```csharp
+// 鉁� 浣跨敤姝g‘鐨勬暟鎹被鍨�
+public class InspectionDto
+{
+    public DateTime? StartDate { get; set; }   // 鑰屼笉鏄� string
+    public bool IsCompleted { get; set; }      // 鑰屼笉鏄� int
+    public decimal Quantity { get; set; }      // 鑰屼笉鏄� string
+}
+```
+
+### 寮傚父澶勭悊
+```csharp
+// 鉁� 鍏蜂綋鐨勫紓甯稿鐞�
+public decimal ParseId(string idString)
+{
+    if (string.IsNullOrEmpty(idString))
+        throw new ArgumentException("ID cannot be null or empty", nameof(idString));
+        
+    if (!decimal.TryParse(idString, out var id))
+        throw new FormatException($"Invalid ID format: {idString}");
+        
+    return id;
+}
+```
+
+## 鎬荤粨
+
+鎮ㄧ殑浠g爜鏁翠綋缁撴瀯鑹ソ锛屼絾鍦ㄤ互涓嬪嚑涓柟闈㈤渶瑕佹敼杩涳細
+
+1. **鍛藉悕瑙勮寖涓�鑷存��** - 涓ユ牸閬靛惊C#鍛藉悕绾﹀畾
+2. **绫诲瀷瀹夊叏** - 浣跨敤閫傚綋鐨勬暟鎹被鍨�
+3. **瀹夊叏鎬�** - 閬垮厤SQL娉ㄥ叆鍜岃緭鍏ラ獙璇�
+4. **鍙淮鎶ゆ��** - 鍑忓皯浠g爜閲嶅锛屾媶鍒嗗鏉傛柟娉�
+
+寤鸿鎸夌収浼樺厛绾ч�愭鏀硅繘锛屼粠瀹夊叏闂寮�濮嬶紝鐒跺悗鏄懡鍚嶈鑼冿紝鏈�鍚庢槸浠g爜缁撴瀯浼樺寲銆�
\ No newline at end of file
diff --git a/MES.Service/Dto/service/XJPageResult.cs b/MES.Service/Dto/service/XJPageResult.cs
index 09cc6c5..b1e6db3 100644
--- a/MES.Service/Dto/service/XJPageResult.cs
+++ b/MES.Service/Dto/service/XJPageResult.cs
@@ -9,5 +9,35 @@
 
     public string? id { get; set; }
 
+    /// <summary>
+    ///     鎼滅储鏉′欢锛屽疄闄呯敤鎴疯緭鍏ョ殑鍐呭
+    /// </summary>
     public string? SearchValue { get; set; }
+
+    /// <summary>
+    ///     涓嬫媺妗嗘悳绱㈡潯浠�
+    /// </summary>
+    public string? SelectedIndex { get; set; }
+
+    /// <summary>
+    ///     鎼滃叏閮紝鎴栬�呭綋鍓嶇敤鎴凤紙榛樿0锛屽綋鍓嶇敤鎴凤紝1锛氬叏閮級
+    /// </summary>
+    public string? UserIndex { get; set; }
+
+    /// <summary>
+    ///     寮�濮嬫椂闂�
+    /// </summary>
+    public string? startDate { get; set; }
+
+    /// <summary>
+    ///     缁撴潫鏃堕棿
+    /// </summary>
+    public string? endDate { get; set; }
+
+    /// <summary>
+    ///     鐘舵�侊紙鍚堟牸 or 涓嶅悎鏍硷級
+    /// </summary>
+    public string? state { get; set; }
+    
+    public int? arrivalFilter { get; set; }
 }
\ No newline at end of file
diff --git a/MES.Service/Modes/MesQaIqc.cs b/MES.Service/Modes/MesQaIqc.cs
index 48e030e..421f96c 100644
--- a/MES.Service/Modes/MesQaIqc.cs
+++ b/MES.Service/Modes/MesQaIqc.cs
@@ -3,17 +3,11 @@
 namespace MES.Service.Modes;
 
 /// <summary>
-///     鏁版嵁婧愬鍏�
+///     IQC妫�楠岄」鐩鍥�
 /// </summary>
-[SugarTable("Mes_Qa_Iqc")]
+[SugarTable("MES_QA_IQC")]
 public class MesQaIqc
 {
-    /// <summary>
-    ///     鎺ユ敹姘村钩
-    /// </summary>
-    [SugarColumn(ColumnName = "ITEM_NO")]
-    public string? ItemNo { get; set; }
-
     /// <summary>
     ///     鎺ユ敹姘村钩
     /// </summary>
@@ -48,7 +42,7 @@
     ///     鏍囧噯
     /// </summary>
     [SugarColumn(ColumnName = "FSTAND")]
-    public decimal? Fstand { get; set; }
+    public string? Fstand { get; set; }
 
     /// <summary>
     ///     涓婇檺
@@ -69,17 +63,32 @@
     public string? FspecRequ { get; set; }
 
     /// <summary>
+    ///     鏄惁鍙敤
     /// </summary>
     [SugarColumn(ColumnName = "ISENABLED")]
     public short? Isenabled { get; set; }
 
     /// <summary>
+    ///     AQL鏄惁鍙敤
     /// </summary>
     [SugarColumn(ColumnName = "EE")]
     public short? Ee { get; set; }
 
     /// <summary>
+    ///     鍒嗙被
     /// </summary>
     [SugarColumn(ColumnName = "FTYPE")]
     public string? Ftype { get; set; }
+
+    /// <summary>
+    ///     鐗╂枡缂栫爜
+    /// </summary>
+    [SugarColumn(ColumnName = "ITEM_NO")]
+    public string? ItemNo { get; set; }
+
+    /// <summary>
+    ///     鐗╂枡ID
+    /// </summary>
+    [SugarColumn(ColumnName = "ITEM_ID")]
+    public string? ItemId { get; set; }
 }
\ No newline at end of file
diff --git a/MES.Service/Modes/MesQaItemsDetectDetail5.cs b/MES.Service/Modes/MesQaItemsDetectDetail5.cs
index 1424654..7866250 100644
--- a/MES.Service/Modes/MesQaItemsDetectDetail5.cs
+++ b/MES.Service/Modes/MesQaItemsDetectDetail5.cs
@@ -9,7 +9,8 @@
 public class MesQaItemsDetectDetail5
 {
     /// <summary>
-    /// </summary>
+    ///  
+    ///</summary>
     [SugarColumn(ColumnName = "ID", IsPrimaryKey = true)]
     public decimal Id { get; set; }
 
diff --git a/MES.Service/Modes/MessageCenter.cs b/MES.Service/Modes/MessageCenter.cs
index de26f7e..7e37f11 100644
--- a/MES.Service/Modes/MessageCenter.cs
+++ b/MES.Service/Modes/MessageCenter.cs
@@ -1,11 +1,12 @@
-锘縰sing SqlSugar;
+锘縰sing MES.Service.Dto.@base;
+using SqlSugar;
 
 namespace MES.Service.Modes;
 
 /// <summary>
 /// </summary>
 [SugarTable("MESSAGE_CENTER")]
-public class MessageCenter
+public class MessageCenter : Page
 {
     /// <summary>
     ///     瀵瑰簲搴忓垪SEQ_MSG
@@ -15,120 +16,124 @@
     public decimal? Id { get; set; }
 
     /// <summary>
-    ///     琛ㄥ悕/瑙嗗浘鍚�
-    /// </summary>
+    /// 琛ㄥ悕/瑙嗗浘鍚� 
+    ///</summary>
     [SugarColumn(ColumnName = "TABLE_NAME")]
     public string? TableName { get; set; }
 
     /// <summary>
-    ///     璇锋眰鍦板潃
-    /// </summary>
+    /// 璇锋眰鍦板潃 
+    ///</summary>
     [SugarColumn(ColumnName = "URL")]
     public string? Url { get; set; }
 
     /// <summary>
-    ///     璇锋眰鏂瑰紡
-    /// </summary>
+    /// 璇锋眰鏂瑰紡 
+    ///</summary>
     [SugarColumn(ColumnName = "METHOD")]
     public string? Method { get; set; }
 
     /// <summary>
-    ///     璇锋眰鍐呭
-    /// </summary>
-    [SugarColumn(ColumnName = "DATA")]
-    public string? Data { get; set; }
-
-    /// <summary>
-    ///     鏄惁鎴愬姛  0琛ㄧず澶辫触  1 琛ㄧず鎴愬姛
-    /// </summary>
+    /// 鏄惁鎴愬姛  0琛ㄧず澶辫触  1 琛ㄧず鎴愬姛 
+    ///</summary>
     [SugarColumn(ColumnName = "RESULT")]
     public short? Result { get; set; }
 
     /// <summary>
-    ///     杩斿洖鐨凧SON
-    /// </summary>
+    /// 杩斿洖鐨凧SON 
+    ///</summary>
     [SugarColumn(ColumnName = "RESULT_DATA")]
     public string? ResultData { get; set; }
 
     /// <summary>
-    ///     鐘舵��  0琛ㄧず鏈帹閫�  1 琛ㄧず宸叉帹閫�
-    /// </summary>
+    /// 鐘舵��  0琛ㄧず鏈帹閫�  1 琛ㄧず宸叉帹閫� 
+    ///</summary>
     [SugarColumn(ColumnName = "STATUS")]
     public short? Status { get; set; }
 
     /// <summary>
-    ///     鍒涘缓浜�
-    /// </summary>
+    /// 鍒涘缓浜� 
+    ///</summary>
     [SugarColumn(ColumnName = "CREATE_BY")]
     public string? CreateBy { get; set; }
 
     /// <summary>
-    ///     鍒涘缓鏃堕棿
-    /// </summary>
+    /// 鍒涘缓鏃堕棿 
+    ///</summary>
     [SugarColumn(ColumnName = "CREATE_DATE")]
     public string? CreateDate { get; set; }
 
     /// <summary>
-    ///     涓氬姟鏍囬
-    /// </summary>
+    /// 涓氬姟鏍囬 
+    ///</summary>
     [SugarColumn(ColumnName = "TITLE")]
     public string? Title { get; set; }
 
     /// <summary>
-    ///     椤甸潰鍚嶇О
-    /// </summary>
+    /// 椤甸潰鍚嶇О 
+    ///</summary>
     [SugarColumn(ColumnName = "PAGE_NAME")]
     public string? PageName { get; set; }
 
     /// <summary>
-    ///     鏄惁澶勭悊锛�0琛ㄧず鏈鐞� 1琛ㄧず宸插鐞�
-    /// </summary>
+    /// 鏄惁澶勭悊锛�0琛ㄧず鏈鐞� 1琛ㄧず宸插鐞� 
+    ///</summary>
     [SugarColumn(ColumnName = "DEAL_WITH")]
     public short? DealWith { get; set; }
 
     /// <summary>
-    ///     鎵规
-    /// </summary>
+    /// 鎵规id 
+    ///</summary>
     [SugarColumn(ColumnName = "PID")]
-    public int? Pid { get; set; }
-
+    public decimal? Pid { get; set; }
 
     /// <summary>
-    ///     鎵ц椤哄簭
-    /// </summary>
+    /// 鎵ц椤哄簭 
+    ///</summary>
     [SugarColumn(ColumnName = "SEQ")]
     public short? Seq { get; set; }
 
     /// <summary>
-    ///     椤甸潰璺緞
-    /// </summary>
+    /// 椤甸潰璺緞 
+    ///</summary>
     [SugarColumn(ColumnName = "ROUTE")]
     public string? Route { get; set; }
 
     /// <summary>
-    ///     鍙傛暟绫诲瀷
-    /// </summary>
-    [SugarColumn(ColumnName = "Content_Type")]
+    ///  瀹為檯璇锋眰鐨勬暟鎹�
+    ///</summary>
+    [SugarColumn(ColumnName = "DATA")]
+    public string? Data { get; set; }
+
+    /// <summary>
+    /// 鍙傛暟绫诲瀷 
+    ///</summary>
+    [SugarColumn(ColumnName = "CONTENT_TYPE")]
     public string? ContentType { get; set; }
 
-    //
     /// <summary>
-    ///     鏄惁鏄秷鎭�  0涓烘帹閫佸け璐� 1涓烘秷鎭�,榛樿涓�0
-    /// </summary>
-    [SugarColumn(ColumnName = "is_message")]
+    /// 鏄惁鏄秷鎭�  0涓烘帹閫佸け璐� 1涓烘秷鎭� 
+    ///</summary>
+    [SugarColumn(ColumnName = "IS_MESSAGE")]
     public short? IsMessage { get; set; }
 
     /// <summary>
-    ///     鏈�鍚庝竴娆′慨鏀逛汉
-    /// </summary>
+    /// 淇敼鏃堕棿 
+    ///</summary>
+    [SugarColumn(ColumnName = "UPDATE_DATE")]
+    public string? UpdateDate { get; set; }
+
+    /// <summary>
+    /// 淇敼浜� 
+    ///</summary>
     [SugarColumn(ColumnName = "UPDATE_BY")]
     public string? UpdateBy { get; set; }
 
     /// <summary>
-    ///     鏈�鍚庝竴娆′慨鏀规椂闂�
-    /// </summary>
-    [SugarColumn(ColumnName = "UPDATE_DATE")]
-    public string? UpdateDate { get; set; }
+    /// 鏈浆鐮乯son 
+    ///</summary>
+    [SugarColumn(ColumnName = "DATA_INSERTED")]
+    public string? DataInserted { get; set; }
 
 
     [SugarColumn(IsIgnore = true)] public int? isShow { get; set; }
diff --git a/MES.Service/service/MessageCenterManager.cs b/MES.Service/service/MessageCenterManager.cs
index b377f2d..9cd1679 100644
--- a/MES.Service/service/MessageCenterManager.cs
+++ b/MES.Service/service/MessageCenterManager.cs
@@ -8,17 +8,45 @@
 {
     //褰撳墠绫诲凡缁忕户鎵夸簡 Repository 澧炪�佸垹銆佹煡銆佹敼鐨勬柟娉�
 
-    public List<MessageCenter> GetPushFailedPage(MessageCenter query)
+    public (List<MessageCenter> item, int TotalCount) GetPushFailedPage(
+        MessageCenter query)
+    {
+        var totalCount = IsShow(query);
+
+        // 浣跨敤SqlSugar鐨勫畨鍏ㄦ煡璇㈡柟娉曪紝閬垮厤SQL娉ㄥ叆椋庨櫓
+        var messageCenters = Db.Queryable<MessageCenter>()
+            .Where(it => it.Result == 0 && it.Seq == 1 && it.Title != null)
+            .OrderByDescending(it => it.CreateDate)
+            .ToPageList(query.PageIndex, query.Limit, ref totalCount);
+
+        return (messageCenters, totalCount);
+    }
+
+    //鏌ョ湅鏄惁鏈夋湭澶勭悊鐨勬秷鎭�
+    public int IsShow(MessageCenter query)
     {
         return Context.Queryable<MessageCenter>()
             .Where(it =>
                 it.Result == 0 && it.Status == 1 &&
                 it.Seq == 1 && it.Title != null)
             .WhereIF(query.isShow == 1, it => it.DealWith == 0)
-            .OrderByDescending(it => it.CreateDate)
-            .ToPageList(1, 20);
+            .Count();
     }
 
+
+    //灏嗘秷鎭缃负宸茶鐨�
+    public int UpdateRead(MessageCenter query)
+    {
+        return Db.Updateable<MessageCenter>()
+            .SetColumns(s => s.DealWith == 1)
+            .SetColumns(s => s.UpdateBy == query.UpdateBy)
+            .SetColumns(s =>
+                s.UpdateDate == DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
+            .Where(s => s.Id == query.Id)
+            .ExecuteCommand();
+    }
+
+
     public int save(MessageCenter entity)
     {
         entity.CreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
diff --git a/MES.Service/service/QC/LljService.cs b/MES.Service/service/QC/LljService.cs
index 7eef5e6..790f525 100644
--- a/MES.Service/service/QC/LljService.cs
+++ b/MES.Service/service/QC/LljService.cs
@@ -14,11 +14,19 @@
 {
     public (List<LtsLlj> item, int TotalCount) GetPage(XJPageResult queryObj)
     {
+        if (queryObj == null)
+            throw new ArgumentNullException(nameof(queryObj));
+
+        if (string.IsNullOrEmpty(queryObj.createUser))
+            return (new List<LtsLlj>(), 0);
+
         if (queryObj.createUser.IsNullOrEmpty()) return ([], 0);
 
         var db = SqlSugarHelper.GetInstance();
 
-        var id = Convert.ToDecimal(queryObj.id);
+        //瀹夊叏鐨勭被鍨嬭浆鎹�
+        if (!decimal.TryParse(queryObj.id, out var id))
+            id = 0;
 
         var totalCount = 0;
 
@@ -37,13 +45,26 @@
 
             //鍔犵瓫閫夋潯浠�,鏍规嵁渚涘簲鍟嗭紝鐗╂枡缂栫爜锛岀墿鏂欏悕绉版悳绱�
             //.WhereIF(queryObj.SearchValue!=null && queryObj.SearchValue!="", (a) => a.SuppName == queryObj.SearchValue|| a.ItemName == queryObj.SearchValue || a.ItemNo == queryObj.SearchValue )
-            .WhereIF(!string.IsNullOrEmpty(queryObj.SearchValue),
-                a => a.SuppName.ToLower()
-                         .Contains(queryObj.SearchValue.ToLower())
-                     || a.ItemName.ToLower()
-                         .Contains(queryObj.SearchValue.ToLower())
-                     || a.ItemNo.ToLower()
-                         .Contains(queryObj.SearchValue.ToLower()))
+            .WhereIF(
+                queryObj.SelectedIndex == "0" &&
+                !string.IsNullOrEmpty(queryObj.SearchValue),
+                a => (a.ItemNo.ToLower()
+                    .Contains(queryObj.SearchValue.ToLower())))
+            .WhereIF(
+                queryObj.SelectedIndex == "1" &&
+                !string.IsNullOrEmpty(queryObj.SearchValue),
+                a => (a.ItemName.ToLower()
+                    .Contains(queryObj.SearchValue.ToLower())))
+            .WhereIF(
+                queryObj.SelectedIndex == "2" &&
+                !string.IsNullOrEmpty(queryObj.SearchValue),
+                a => (a.SuppName.ToLower()
+                    .Contains(queryObj.SearchValue.ToLower())))
+            .WhereIF(queryObj.result == "宸插畬鎴�",
+                a => (a.IqcDate >= queryObj.startDate.ToDateTime() &&
+                      a.IqcDate <= queryObj.endDate.ToDateTime().AddDays(1)))
+            .WhereIF(queryObj.result == "宸插畬鎴�" && queryObj.state != "鎵�鏈夌姸鎬�",
+                a => a.FcheckResu == queryObj.state)
             .OrderByDescending(a => a.Id)
             .ToPageList(queryObj.PageIndex, queryObj.Limit, ref totalCount);
 
@@ -74,7 +95,7 @@
     //                 FcheckItem = b.FcheckItem,
     //                 FdownAllow = b.FdownAllow,
     //                 FcheckLevel = b.Frequency,
-    //                 Fstand = b.Fstand,
+    //                 Fstand = decimal.Parse(b.Fstand),
     //                 FupAllow = b.FupAllow,
     //                 SampleSizeNo = b.SampleSizeNo,
     //                 FenterQty = 0,
@@ -248,9 +269,10 @@
     {
         var db = SqlSugarHelper.GetInstance();
 
-        return db.Queryable<MesQaItemsDetectDetail5, MesQaItemsDetectDetail12>(
-                (a, b) =>
-                    new JoinQueryInfos(JoinType.Left, a.Id == b.MainId))
+        return db
+            .Queryable<MesQaItemsDetectDetail5,
+                MesQaItemsDetectDetail12>((a, b) =>
+                new JoinQueryInfos(JoinType.Left, a.Id == b.MainId))
             .Where((a, b) => a.ReleaseNo == releaseNo)
             // .WhereIF(id > 0, (a, b) => a.Id == id)
             .GroupBy((a, b) => new
@@ -325,96 +347,193 @@
     }
 
 
+    /// <summary>
+    /// 鑷姩澶勭悊妫�楠岀粨鏋滅殑涓绘柟娉�
+    /// </summary>
     private int autoResult(MesQaItemsDetectDetail12 detail)
     {
-        var db = SqlSugarHelper.GetInstance();
+        // 鑾峰彇妫�楠岄」鐩俊鎭�
+        var inspectionItem = GetInspectionItem(detail.MainId);
+        if (inspectionItem == null) return 0;
 
-        // Single 娌℃湁鏌ヨ鍒扮粨鏋滄椂杩斿洖Null锛屽鏋滅粨鏋滃ぇ浜�1鏉′細鎶涘嚭閿欒
-        var QsItemOqcItem = db.Queryable<MesQaItemsDetectDetail5>()
-            .Single(s => s.Id == detail.MainId);
-
-        if (QsItemOqcItem == null) return 0;
-
-        //鏌ヨ杩欎釜妫�楠岄」鐩笅鐨勬楠岀粨鏋�
-        var count = db.Queryable<MesQaItemsDetectDetail12>()
-            .Where(s => s.MainId == detail.MainId).Count();
-
+        // 鑾峰彇妫�楠岃鏁颁俊鎭�
+        var inspectionCounts = GetInspectionCounts(detail.MainId);
+        
+        // 鏇存柊妫�楠屾槑缁�
         updateDetail5(detail);
-        var result = "";
 
-        //妫�楠屽疄闄呯粨鏋滀笉绛変簬搴旇妫�楠岀殑涓暟鏃剁洿鎺ユ帹鍑�
-        if (QsItemOqcItem.CheckQyt != count) return 0;
+        // 妫�鏌ユ槸鍚︽楠屽畬鎴�
+        if (!IsInspectionItemComplete(inspectionItem, inspectionCounts.TotalCount))
+            return 0;
 
-        //鍚堟牸鐨勬湁澶氬皯涓�
+        // 纭畾妫�楠岀粨鏋�
+        var itemResult = DetermineInspectionItemResult(inspectionCounts, inspectionItem);
+        
+        // 鏇存柊妫�楠岄」鐩粨鏋�
+        var updateResult = UpdateInspectionItemResult(detail.MainId, itemResult, inspectionCounts.TotalCount);
+
+        // 妫�鏌ユ暣涓楠屽崟鏄惁瀹屾垚
+        if (IsInspectionOrderComplete(detail.ReleaseNo))
+        {
+            ProcessCompleteInspectionOrder(detail);
+        }
+
+        return updateResult;
+    }
+
+    /// <summary>
+    /// 鑾峰彇妫�楠岄」鐩俊鎭�
+    /// </summary>
+    private MesQaItemsDetectDetail5? GetInspectionItem(decimal? mainId)
+    {
+        var db = SqlSugarHelper.GetInstance();
+        return db.Queryable<MesQaItemsDetectDetail5>()
+            .Single(s => s.Id == mainId);
+    }
+
+    /// <summary>
+    /// 鑾峰彇妫�楠岃鏁颁俊鎭�
+    /// </summary>
+    private (int TotalCount, int PassCount, int FailCount) GetInspectionCounts(decimal? mainId)
+    {
+        var db = SqlSugarHelper.GetInstance();
+        
+        var totalCount = db.Queryable<MesQaItemsDetectDetail12>()
+            .Where(s => s.MainId == mainId).Count();
+            
         var passCount = db.Queryable<MesQaItemsDetectDetail12>()
-            .Where(s => s.MainId == detail.MainId && s.Fstand == "鈭�").Count();
-        //涓嶅悎鏍肩殑鏈夊灏戜釜
-        var noCount = db.Queryable<MesQaItemsDetectDetail12>()
-            .Where(s => s.MainId == detail.MainId && s.Fstand == "脳").Count();
+            .Where(s => s.MainId == mainId && s.Fstand == "鈭�").Count();
+            
+        var failCount = db.Queryable<MesQaItemsDetectDetail12>()
+            .Where(s => s.MainId == mainId && s.Fstand == "脳").Count();
 
-        if (count == passCount)
-            result = "鍚堟牸";
-        //else if (count - passCount < QsItemOqcItem.FreQty) 
-        //    result = "涓嶅悎鏍�";
-        else if (noCount >= QsItemOqcItem.FreQty)
-            result = "涓嶅悎鏍�";
-        var useTransactionWithOracle = SqlSugarHelper.UseTransactionWithOracle(
-            db =>
-            {
-                var commit = 0;
-                commit += db.Updateable<MesQaItemsDetectDetail5>()
-                    .SetColumns(s => s.FcheckResu == result)
-                    .SetColumns(s => s.FenterQty == count)
-                    .Where(s => s.Id == detail.MainId)
-                    .ExecuteCommand();
+        return (totalCount, passCount, failCount);
+    }
 
-                return commit;
-            });
+    /// <summary>
+    /// 妫�鏌ユ楠岄」鐩槸鍚﹀畬鎴�
+    /// </summary>
+    private bool IsInspectionItemComplete(MesQaItemsDetectDetail5 inspectionItem, int actualCount)
+    {
+        return inspectionItem.CheckQyt == actualCount;
+    }
 
-        var isNull = db.Queryable<MesQaItemsDetectDetail5>()
-            .Where(s => s.ReleaseNo == detail.ReleaseNo && s.FcheckResu == null)
+    /// <summary>
+    /// 纭畾妫�楠岄」鐩粨鏋�
+    /// </summary>
+    private string DetermineInspectionItemResult((int TotalCount, int PassCount, int FailCount) counts, 
+        MesQaItemsDetectDetail5 inspectionItem)
+    {
+        if (counts.TotalCount == counts.PassCount)
+            return "鍚堟牸";
+        else if (counts.FailCount >= inspectionItem.FreQty)
+            return "涓嶅悎鏍�";
+        else
+            return string.Empty; // 鏈畬鎴愮姸鎬�
+    }
+
+    /// <summary>
+    /// 鏇存柊妫�楠岄」鐩粨鏋�
+    /// </summary>
+    private int UpdateInspectionItemResult(decimal? mainId, string result, int count)
+    {
+        return SqlSugarHelper.UseTransactionWithOracle(db =>
+        {
+            return db.Updateable<MesQaItemsDetectDetail5>()
+                .SetColumns(s => s.FcheckResu == result)
+                .SetColumns(s => s.FenterQty == count)
+                .Where(s => s.Id == mainId)
+                .ExecuteCommand();
+        });
+    }
+
+    /// <summary>
+    /// 妫�鏌ユ暣涓楠屽崟鏄惁瀹屾垚
+    /// </summary>
+    private bool IsInspectionOrderComplete(string? releaseNo)
+    {
+        var db = SqlSugarHelper.GetInstance();
+        
+        // 妫�鏌ユ槸鍚﹁繕鏈夋湭瀹屾垚鐨勬楠岄」鐩�
+        var incompleteCount = db.Queryable<MesQaItemsDetectDetail5>()
+            .Where(s => s.ReleaseNo == releaseNo && s.FcheckResu == null)
             .Count();
 
-        if (isNull > 0) return 1;
+        return incompleteCount == 0;
+    }
 
+    /// <summary>
+    /// 澶勭悊瀹屾垚鐨勬楠屽崟
+    /// </summary>
+    private void ProcessCompleteInspectionOrder(MesQaItemsDetectDetail12 detail)
+    {
+        var db = SqlSugarHelper.GetInstance();
+        
+        // 鑾峰彇妫�楠屽崟涓嬬殑鎵�鏈夋楠岄」鐩�
+        var inspectionCounts = GetInspectionOrderCounts(detail.ReleaseNo);
+        
+        // 纭畾鏁翠釜妫�楠屽崟鐨勭粨鏋�
+        var orderResult = DetermineInspectionOrderResult(inspectionCounts);
+        
+        // 鑾峰彇鐢ㄦ埛淇℃伅
+        var sysUser = GetUserInfo(detail.CreateBy);
+        
+        // 鏇存柊妫�楠屽崟缁撴灉
+        UpdateInspectionOrderResult(detail.ReleaseNo, orderResult, sysUser?.Fname, detail.CreateBy);
+    }
 
-        //鑾峰彇妫�楠屽崟鐨勬楠岄」鐩殑涓暟
-        var sum = db.Queryable<MesQaItemsDetectDetail5>()
-            .Where(s => s.ReleaseNo == detail.ReleaseNo).Count();
-
-        if (sum == 0) return 1;
-
-        //鑾峰彇妫�楠屽崟涓嬬殑鍚堟牸鐨勬楠岄」鐩釜鏁�
-        var icount = db.Queryable<MesQaItemsDetectDetail5>()
-            .Where(s => s.ReleaseNo == detail.ReleaseNo && s.FcheckResu == "鍚堟牸")
+    /// <summary>
+    /// 鑾峰彇妫�楠屽崟缁熻淇℃伅
+    /// </summary>
+    private (int TotalItems, int PassedItems) GetInspectionOrderCounts(string? releaseNo)
+    {
+        var db = SqlSugarHelper.GetInstance();
+        
+        var totalItems = db.Queryable<MesQaItemsDetectDetail5>()
+            .Where(s => s.ReleaseNo == releaseNo).Count();
+            
+        var passedItems = db.Queryable<MesQaItemsDetectDetail5>()
+            .Where(s => s.ReleaseNo == releaseNo && s.FcheckResu == "鍚堟牸")
             .Count();
 
-        var FcheckResu = "涓嶅悎鏍�";
+        return (totalItems, passedItems);
+    }
 
-        //瀹為檯涓暟绛変簬鐞嗚涓暟鏃跺妫�楠屽崟杩涜鍒ゅ畾
-        if (sum == icount)
-            //鍚堟牸鐨勬楠岀粨鏋滅瓑浜庢�绘楠屾暟瑙嗕负鍚堟牸
-            FcheckResu = "鍚堟牸";
+    /// <summary>
+    /// 纭畾妫�楠屽崟缁撴灉
+    /// </summary>
+    private string DetermineInspectionOrderResult((int TotalItems, int PassedItems) counts)
+    {
+        // 鎵�鏈夋楠岄」鐩兘鍚堟牸鏃讹紝鏁翠釜妫�楠屽崟鎵嶅悎鏍�
+        return counts.TotalItems == counts.PassedItems ? "鍚堟牸" : "涓嶅悎鏍�";
+    }
 
-        var sysUser = db.Queryable<SysUser>()
-            .Where(s => s.Fcode == detail.CreateBy).First();
+    /// <summary>
+    /// 鑾峰彇鐢ㄦ埛淇℃伅
+    /// </summary>
+    private SysUser? GetUserInfo(string? userCode)
+    {
+        var db = SqlSugarHelper.GetInstance();
+        return db.Queryable<SysUser>()
+            .Where(s => s.Fcode == userCode).First();
+    }
 
+    /// <summary>
+    /// 鏇存柊妫�楠屽崟缁撴灉
+    /// </summary>
+    private void UpdateInspectionOrderResult(string? releaseNo, string result, string? checkedBy, string? updatedBy)
+    {
         SqlSugarHelper.UseTransactionWithOracle(db =>
         {
             return db.Updateable<MesQaItemsDetect01>()
-                .SetColumns(s => s.FcheckResu == FcheckResu)
+                .SetColumns(s => s.FcheckResu == result)
                 .SetColumns(s => s.FcheckDate == DateTime.Now)
-                .SetColumns(s => s.FcheckBy == sysUser.Fname)
-                .SetColumns(s => s.LastupdateBy == detail.CreateBy)
+                .SetColumns(s => s.FcheckBy == checkedBy)
+                .SetColumns(s => s.LastupdateBy == updatedBy)
                 .SetColumns(s => s.LastupdateDate == DateTime.Now)
-                .Where(s => s.ReleaseNo == detail.ReleaseNo)
+                .Where(s => s.ReleaseNo == releaseNo)
                 .ExecuteCommand();
         });
-        //  if (FcheckResu.Equals("涓嶅悎鏍�"))
-        //鑷姩鐢熸垚鍏ュ簱妫�寮傚父瀵圭瓥
-        ///     saveDetect02(detail.Id, detail.CreateBy);
-
-        return useTransactionWithOracle;
     }
     /*  public int saveDetect02(decimal? gid, string? createBy)
      {
diff --git a/MESApplication/Controllers/Base/MessageCenterController.cs b/MESApplication/Controllers/Base/MessageCenterController.cs
index 529df7f..3b2e28a 100644
--- a/MESApplication/Controllers/Base/MessageCenterController.cs
+++ b/MESApplication/Controllers/Base/MessageCenterController.cs
@@ -109,7 +109,51 @@
         try
         {
             dynamic resultInfos = new ExpandoObject();
-            resultInfos.tbBillList = m.GetPushFailedPage(query);
+            var (item, totalCount) = m.GetPushFailedPage(query);
+            resultInfos.tbBillList = item;
+            return new ResponseResult
+            {
+                status = 0,
+                message = "OK",
+                data = resultInfos,
+                TotalCount = totalCount
+            };
+        }
+        catch (Exception ex)
+        {
+            return ResponseResult.ResponseError(ex);
+        }
+    }
+
+    //IsShow
+    [HttpPost("IsShow")]
+    public ResponseResult IsShow(MessageCenter query)
+    {
+        try
+        {
+            dynamic resultInfos = new ExpandoObject();
+            resultInfos.tbBillList = m.IsShow(query);
+            return new ResponseResult
+            {
+                status = 0,
+                message = "OK",
+                data = resultInfos
+            };
+        }
+        catch (Exception ex)
+        {
+            return ResponseResult.ResponseError(ex);
+        }
+    }
+
+    //UpdateRead
+    [HttpPost("UpdateRead")]
+    public ResponseResult UpdateRead(MessageCenter query)
+    {
+        try
+        {
+            dynamic resultInfos = new ExpandoObject();
+            resultInfos.tbBillList = m.UpdateRead(query);
             return new ResponseResult
             {
                 status = 0,
diff --git a/MESApplication/README.md b/MESApplication/README.md
new file mode 100644
index 0000000..e2d45cb
--- /dev/null
+++ b/MESApplication/README.md
@@ -0,0 +1,302 @@
+# XG_MES椤圭洰缁撴瀯涓庡姛鑳藉垎鏋愭枃妗�
+
+## 椤圭洰姒傝堪
+
+XG_MES鏄竴涓熀浜嶢SP.NET Core 8.0鏋勫缓鐨勫埗閫犳墽琛岀郴缁�(MES)锛岄噰鐢ㄥ垎灞傛灦鏋勮璁★紝浣跨敤Oracle 11g鏁版嵁搴擄紝閫氳繃SqlSugar ORM杩涜鏁版嵁璁块棶銆傜郴缁熻鐩栦簡浠庤鍗曠鐞嗗埌鐢熶骇鎵ц銆佽川閲忔帶鍒躲�佷粨鍌ㄧ鐞嗙殑瀹屾暣鍒堕�犱笟鍔℃祦绋嬨��
+
+## 鎶�鏈灦鏋�
+
+### 鏍稿績鎶�鏈爤
+- **.NET 8.0** - 涓昏寮�鍙戞鏋�
+- **ASP.NET Core Web API** - API鏈嶅姟妗嗘灦
+- **Oracle 11g Release 11.2.0.1.0** - 鏁版嵁搴撶郴缁�
+- **SqlSugar ORM** - 瀵硅薄鍏崇郴鏄犲皠妗嗘灦
+- **Swagger** - API鏂囨。鐢熸垚
+- **Newtonsoft.Json** - JSON搴忓垪鍖�
+
+### 瑙e喅鏂规缁撴瀯
+```
+XG_MES_API/
+鈹溾攢鈹� MESApplication/          # Web API椤圭洰
+鈹�   鈹溾攢鈹� Controllers/         # API鎺у埗鍣�
+鈹�   鈹溾攢鈹� Filter/             # 杩囨护鍣�
+鈹�   鈹溾攢鈹� Properties/         # 椤圭洰灞炴��
+鈹�   鈹溾攢鈹� Program.cs          # 搴旂敤绋嬪簭鍏ュ彛
+鈹�   鈹斺攢鈹� Startup.cs          # 鏈嶅姟閰嶇疆
+鈹斺攢鈹� MES.Service/            # 涓氬姟閫昏緫灞�
+    鈹溾攢鈹� DB/                 # 鏁版嵁璁块棶灞�
+    鈹溾攢鈹� Dto/                # 鏁版嵁浼犺緭瀵硅薄
+    鈹溾攢鈹� Modes/              # 鏁版嵁妯″瀷
+    鈹溾攢鈹� service/            # 涓氬姟鏈嶅姟
+    鈹斺攢鈹� util/               # 宸ュ叿绫�
+```
+
+## 涓氬姟妯″潡璇︾粏鍒嗘瀽
+
+### 1. 鍩虹绠$悊妯″潡
+
+**涓昏鍔熻兘锛�**
+- 鐢ㄦ埛璁よ瘉涓庢潈闄愮鐞�
+- 绯荤粺娑堟伅涓績
+- 鍩虹鏁版嵁缁存姢
+
+**鏍稿績鎺у埗鍣細**
+- `LoginController` - 鐢ㄦ埛鐧诲綍銆佸瘑鐮侀噸缃�佹潈闄愯幏鍙�
+- `MessageCenterController` - 娑堟伅鎺ㄩ�併�佺姸鎬佺鐞�
+- `DemoController` - 绯荤粺婕旂ず鍔熻兘
+
+**涓氬姟鏈嶅姟锛�**
+- `LoginService` - 鐢ㄦ埛韬唤楠岃瘉锛屾敮鎸佽嚜瀹氫箟鍔犲瘑绠楁硶
+- `MessageCenterManager` - 娑堟伅涓績绠$悊锛屾敮鎸佹帹閫佸け璐ラ噸璇�
+- `SysUserService` - 鐢ㄦ埛鏉冮檺鏌ヨ锛岃皟鐢ㄥ瓨鍌ㄨ繃绋嬭幏鍙栨潈闄愭暟鎹�
+
+### 2. 鍩虹鏁版嵁绠$悊妯″潡
+
+**涓昏鍔熻兘锛�**
+- 鐗╂枡涓绘暟鎹鐞�
+- 瀹㈡埛渚涘簲鍟嗕俊鎭淮鎶�
+- 浜哄憳缁勭粐鏋舵瀯绠$悊
+- 浠撳簱搴撲綅绠$悊
+
+**鏍稿績鎺у埗鍣細**
+- `MesItemsController` - 鐗╂枡淇℃伅绠$悊锛屾敮鎸丒RP鍚屾
+- `MesCustomerController` - 瀹㈡埛淇℃伅绠$悊
+- `MesSupplierController` - 渚涘簲鍟嗕俊鎭鐞�
+- `MesStaffController` - 鍛樺伐淇℃伅绠$悊
+- `MesDepotsController` - 浠撳簱淇℃伅绠$悊
+- `OrganizeController` - 缁勭粐鏋舵瀯绠$悊
+
+**涓氬姟鏈嶅姟锛�**
+- `MesItemsManager` - 鐗╂枡涓绘暟鎹鐞嗭紝鏀寔鎵归噺鎿嶄綔鍜孍RP鍚屾
+- `OrganizeManager` - 缁勭粐鏋舵瀯绠$悊锛屾敮鎸佸眰绾х粨鏋�
+- `MesCustomerManager` - 瀹㈡埛淇℃伅绠$悊锛屾敮鎸佺姸鎬佹帶鍒�
+
+**鏁版嵁妯″瀷锛�**
+- `MesItems` - 鐗╂枡涓绘暟鎹紝鏀寔澶氬崟浣嶃�佸缂栫爜銆丒RP闆嗘垚
+- `MesCustomer` - 瀹㈡埛淇℃伅锛屽寘鍚壒娆$鐞嗛厤缃�
+- `MesSupplier` - 渚涘簲鍟嗕俊鎭紝鏀寔澶氱粍缁囨潈闄愭帶鍒�
+- `Organize` - 缁勭粐鏋舵瀯锛屾敮鎸佸眰绾х鐞�
+
+### 3. 鐢熶骇璁㈠崟绠$悊妯″潡
+
+**涓昏鍔熻兘锛�**
+- 閿�鍞鍗曠鐞�
+- 鐢熶骇璁″垝璋冨害
+- 宸ュ崟鎵ц绠$悊
+- 鍙戣揣鍑哄簱绠$悊
+
+**鏍稿績鎺у埗鍣細**
+- `SalesOrderController` - 閿�鍞鍗曠鐞�
+- `ProductionOrderController` - 鐢熶骇璁㈠崟绠$悊
+- `WomcaaController` - 宸ュ崟涓昏〃绠$悊
+- `SalesDeliveryNoticeController` - 閿�鍞彂璐ч�氱煡
+
+**涓氬姟鏈嶅姟锛�**
+- `ProductionOrderManager` - 鐢熶骇璁㈠崟绠$悊锛屾敮鎸佷富瀛愯〃鍏宠仈
+- `SalesOrderManager` - 閿�鍞鍗曠鐞嗭紝鏀寔瀹屾暣鐢熷懡鍛ㄦ湡
+- `WomcaaManager` - 宸ュ崟绠$悊锛屼笌ERP绯荤粺闆嗘垚
+
+**鏁版嵁妯″瀷锛�**
+- `SalesOrder` - 閿�鍞鍗曚富琛紝鏀寔璁㈠崟鐘舵�佹祦杞�
+- `ProductionOrder` - 鐢熶骇璁㈠崟涓昏〃锛屾敮鎸佸澶栫敓浜�
+- `Womcaa` - 宸ュ崟琛紝鏀寔鐢熶骇鐘舵�佺鐞�
+- `MesProductionNotice` - 鐢熶骇閫氱煡鍗�
+
+### 4. 璐ㄩ噺鎺у埗妯″潡
+
+**涓昏鍔熻兘锛�**
+- 鏉ユ枡妫�楠岀鐞�
+- 鐢熶骇宸℃鎺у埗
+- 鍏ュ簱璐ㄩ噺妫�楠�
+- 棣栦欢妫�楠岀‘璁�
+- 涓嶅悎鏍煎搧澶勭悊
+
+**鏍稿績鎺у埗鍣細**
+- `LljController` - 鏉ユ枡妫�楠岀鐞�
+- `XJController` - 宸℃绠$悊
+- `RKJController` - 鍏ュ簱妫�楠�
+- `SJController` - 棣栦欢妫�楠�
+- `SuspendController` - 鏆傚仠绠$悊
+
+**涓氬姟鏈嶅姟锛�**
+- `LljService` - 鏉ユ枡妫�楠屾湇鍔★紝瀹炵幇瀹屾暣AQL鎶芥牱妫�楠屾爣鍑�
+- `XJService` - 宸℃鏈嶅姟锛屾敮鎸佺敓浜х嚎瀹炴椂璐ㄩ噺鐩戞帶
+- `SJService` - 棣栦欢妫�楠屾湇鍔★紝鏀寔鍥剧墖涓婁紶鍜屾爣鍑嗗姣�
+- `BaseService` - QC鍩虹鏈嶅姟锛屾敮鎸丅ase64鍥剧墖澶勭悊
+
+**鏁版嵁妯″瀷锛�**
+- `MesQa` - 妫�楠岄」鐩富琛�
+- `MesQaItem` - 妫�楠岄」鐩槑缁�
+- `QsItemIpiReq` - IQC妫�楠岀敵璇�
+- `QsItemOqcReq` - OQC妫�楠岀敵璇�
+- `MesQualityStandard` - 璐ㄩ噺鏍囧噯
+- `MesQmAql1/2/3` - AQL妫�楠屾爣鍑�
+
+### 5. 浠撳偍绠$悊妯″潡
+
+**涓昏鍔熻兘锛�**
+- 搴撳瓨瀹炴椂绠$悊
+- 鍑哄叆搴撳崟鎹鐞�
+- 搴撳瓨绉诲姩鍜岃皟鏁�
+- 鏉$爜杩芥函绠$悊
+- 搴撲綅绮剧‘绠$悊
+
+**鏍稿績鎺у埗鍣細**
+- `MesInvItemStocksController` - 搴撳瓨绠$悊
+- `MesInvItemOutsController` - 鍑哄簱鍗曠鐞�
+- `MesInvItemMovesController` - 搴撳瓨绉诲姩
+- `MesInvItemBarcodesController` - 鏉$爜绠$悊
+- `MesDepotSectionsController` - 搴撲綅绠$悊
+
+**涓氬姟鏈嶅姟锛�**
+- `MesInvItemOutsManager` - 鍑哄簱绠$悊锛屾敮鎸佹潯鐮佹壂鎻忓拰瀹℃牳娴佺▼
+- `MesInvItemMovesManager` - 搴撳瓨璋冩嫧锛屽疄鐜板畬鏁寸殑鍑哄叆搴撴祦绋�
+- `MesInvItemStocksManager` - 搴撳瓨绠$悊锛屽熀纭�CRUD鎿嶄綔
+
+**鏁版嵁妯″瀷锛�**
+- `MesInvItemStocks` - 鐗╂枡搴撳瓨琛紝鏀寔澶氱淮搴﹀簱瀛樼鐞�
+- `MesInvItemOuts` - 鐗╂枡鍑哄簱涓昏〃锛屾敮鎸佸绉嶅嚭搴撶被鍨�
+- `MesInvItemMoves` - 鐗╂枡绉诲簱涓昏〃锛屾敮鎸佷粨搴撻棿璋冩嫧
+- `MesInvItemBarcodes` - 鐗╂枡鏉$爜琛紝鏀寔瀹屾暣杩芥函閾�
+- `MesDepots` - 浠撳簱涓绘暟鎹紝鏀寔澶氱浠撳簱绫诲瀷
+
+### 6. 閲囪喘绠$悊妯″潡
+
+**涓昏鍔熻兘锛�**
+- 鍘熸潗鏂欓噰璐叆搴�
+- 閫佽揣鍗曞鐞�
+- 閲囪喘鏉$爜绠$悊
+- 渚涘簲鍟嗛�佽揣璺熻釜
+
+**鏍稿績鎺у埗鍣細**
+- `MesRohInController` - 鍘熸潗鏂欏叆搴撶鐞�
+- `MesDeliveryNoteController` - 閫佽揣鍗曠鐞�
+- `PurdhbController` - 閲囪喘鏀惰揣
+
+**涓氬姟鏈嶅姟锛�**
+- `MesRohInManager` - 鍘熸潗鏂欏叆搴撶鐞�
+- `MesDeliveryNoteManager` - 閫佽揣鍗曠鐞�
+- `PurdhbManager` - 閲囪喘鏀惰揣绠$悊
+
+**鏁版嵁妯″瀷锛�**
+- `MesRohIn` - 鏀舵枡鏁版嵁涓昏〃
+- `MesDeliveryNote` - 閫佽揣鍗曚富琛�
+- `Purdhb` - 閲囪喘鍒拌揣鍗曡〃韬�
+
+## 绯荤粺闆嗘垚鏋舵瀯
+
+### ERP绯荤粺闆嗘垚
+- **GetErpParametersServer** - ERP闆嗘垚鍙傛暟绠$悊
+- **HTTP闆嗘垚妯″紡** - 鍩轰簬HTTP璇锋眰鐨勫紓姝ユ秷鎭帹閫�
+- **涓氬姟鍦烘櫙鏀寔** - 閲囪喘鍏ュ簱銆侀噰璐��璐с�佺敓浜ч鏂欑瓑澶氱涓氬姟
+
+### 鏁版嵁鍚屾鏈哄埗
+- **MessageCenter** - 娑堟伅涓績锛岃褰曟墍鏈夊閮ㄧ郴缁熸帴鍙h皟鐢�
+- **澶辫触閲嶈瘯** - 鏀寔娑堟伅鎺ㄩ�佸け璐ュ悗鐨勯噸璇曟満鍒�
+- **鐘舵�佽窡韪�** - 瀹屾暣鐨勬暟鎹悓姝ョ姸鎬佽拷韪�
+
+## 鍏抽敭涓氬姟娴佺▼
+
+### 1. 璁㈠崟鍒颁氦浠樻祦绋�
+```
+閿�鍞鍗� 鈫� 鐢熶骇璁㈠崟 鈫� 宸ュ崟鎵ц 鈫� 璐ㄩ噺妫�楠� 鈫� 鍑哄簱鍙戣揣
+```
+
+### 2. 閲囪喘鍒板叆搴撴祦绋�
+```
+閲囪喘璁㈠崟 鈫� 渚涘簲鍟嗛�佽揣 鈫� 鏉ユ枡妫�楠� 鈫� 鍏ュ簱涓婃灦
+```
+
+### 3. 鐢熶骇鎵ц娴佺▼
+```
+宸ュ崟涓嬭揪 鈫� 鍘熸枡鍑哄簱 鈫� 鐢熶骇鍔犲伐 鈫� 宸℃璐ㄦ帶 鈫� 鎴愬搧鍏ュ簱
+```
+
+### 4. 璐ㄩ噺绠℃帶娴佺▼
+```
+鏉ユ枡妫�楠� 鈫� 棣栦欢妫�楠� 鈫� 鐢熶骇宸℃ 鈫� 鍏ュ簱妫�楠� 鈫� 涓嶅悎鏍煎鐞�
+```
+
+## 鏁版嵁搴撹璁$壒鐐�
+
+### 1. 涓婚敭绛栫暐
+- 澶ч儴鍒嗚〃浣跨敤Oracle搴忓垪鐢熸垚鏁板瓧涓婚敭
+- 鍏抽敭涓氬姟琛ㄤ娇鐢℅UID涓婚敭锛堝鐢熶骇璁㈠崟锛�
+
+### 2. 瀹¤瀛楁鏍囧噯鍖�
+姣忎釜涓氬姟琛ㄩ兘鍖呭惈鏍囧噯瀹¤瀛楁锛�
+- `CREATE_BY`, `CREATE_DATE` - 鍒涘缓淇℃伅
+- `LASTUPDATE_BY`, `LASTUPDATE_DATE` - 鏇存柊淇℃伅
+- `CREATE_ORG`, `USE_ORG` - 缁勭粐鏉冮檺鎺у埗
+
+### 3. ERP闆嗘垚璁捐
+- `FDOCUMENTSTATUS` - ERP鍗曟嵁鐘舵�佸悓姝�
+- 鍚勭ERP_ID瀛楁 - 涓嶦RP绯荤粺涓婚敭鏄犲皠
+- SAP鐩稿叧瀛楁 - SAP绯荤粺闆嗘垚鏀寔
+
+### 4. 鐘舵�佺鐞嗘ā寮�
+- 浣跨敤鏁板瓧浠g爜琛ㄧず涓氬姟鐘舵��
+- 鏀寔瀹℃牳娴佺▼锛堝埗鍗曗啋瀹℃牳鈫掕繃璐︼級
+- 绂佺敤鐘舵�佺鐞嗚�岄潪鐗╃悊鍒犻櫎
+
+### 5. 澶氱粍缁囨敮鎸�
+閫氳繃`CREATE_ORG`鍜宍USE_ORG`瀛楁瀹炵幇澶氱粍缁囨暟鎹殧绂诲拰鏉冮檺鎺у埗
+
+## 鎶�鏈壒鐐�
+
+### 1. 缁熶竴鐨勬暟鎹闂眰
+- 鎵�鏈塎anager绫荤户鎵縍epository鍩虹被
+- 鎻愪緵鏍囧噯CRUD鎿嶄綔
+- 鏀寔浜嬪姟绠$悊
+
+### 2. 鏉$爜鎶�鏈簲鐢�
+- 骞挎硾浣跨敤鏉$爜鎵弿杩涜涓氬姟鎿嶄綔楠岃瘉
+- 鏀寔澶氱鏉$爜绫诲瀷锛堝鎴枫�佷緵搴斿晢銆佸唴閮級
+- 瀹屾暣鐨勮拷婧摼绠$悊
+
+### 3. 璐ㄩ噺绠$悊
+- 瀹炵幇瀹屾暣鐨凙QL鎶芥牱妫�楠屾爣鍑�
+- 鏀寔澶氬眰娆¤川閲忔楠屾帶鍒�
+- 鍥剧墖涓婁紶鍜屾楠屾爣鍑嗗姣�
+
+### 4. 瀹炴椂鏁版嵁澶勭悊
+- 搴撳瓨瀹炴椂鏇存柊
+- 鐢熶骇鐘舵�佸疄鏃惰窡韪�
+- 璐ㄩ噺鏁版嵁瀹炴椂鍙嶉
+
+## 绯荤粺浼樺娍
+
+1. **涓氬姟瀹屾暣鎬�** - 瑕嗙洊MES绯荤粺鐨勬牳蹇冧笟鍔¢鍩�
+2. **鏁版嵁涓�鑷存��** - 閫氳繃浜嬪姟鍜屽瓨鍌ㄨ繃绋嬬‘淇濇暟鎹噯纭��
+3. **鍙墿灞曟��** - 娓呮櫚鐨勬ā鍧楀垝鍒嗕究浜庡姛鑳芥墿灞�
+4. **闆嗘垚鑳藉姏** - 涓嶦RP绯荤粺娣卞害闆嗘垚锛屽疄鐜版暟鎹悓姝�
+5. **璐ㄩ噺绠℃帶** - 瀹屾暣鐨勮川閲忔楠屾祦绋嬩繚璇佷骇鍝佽川閲�
+6. **瀹炴椂鎬�** - 鏉$爜鎵弿鍜屽疄鏃舵暟鎹鐞嗘彁楂樻搷浣滄晥鐜�
+7. **澶氱粍缁囨敮鎸�** - 鏀寔澶氬伐鍘傘�佸缁勭粐鐨勭鐞嗘ā寮�
+
+## 寮�鍙戞寚鍗�
+
+### 甯哥敤寮�鍙戝懡浠�
+```bash
+# 缂栬瘧鏁翠釜瑙e喅鏂规
+dotnet build MESApplication.sln
+
+# 杩愯搴旂敤绋嬪簭
+dotnet run --project MESApplication
+
+# 璁块棶Swagger鏂囨。
+http://localhost:5184/swagger
+```
+
+### 鏁版嵁搴撹繛鎺�
+- 杩炴帴瀛楃涓查厤缃湪 `appsettings.json` 鐨� `AppSettings.DataBaseConn`
+- 浣跨敤SqlSugar ORM杩涜鏁版嵁璁块棶
+- 鏀寔SQL鏃ュ織璁板綍渚夸簬璋冭瘯
+
+### 寮�鍙戣鑼�
+- 鎵�鏈塎anager绫荤户鎵縍epository鍩虹被
+- 浣跨敤DTO妯″紡杩涜鏁版嵁浼犺緭
+- 缁熶竴鐨凴esponseResult杩斿洖鏍煎紡
+- 鏀寔鎵归噺鎿嶄綔鍜屼簨鍔″鐞�
+
+鏈枃妗d负XG_MES椤圭洰鐨勫畬鏁寸粨鏋勪笌鍔熻兘鍒嗘瀽锛屾兜鐩栦簡绯荤粺鐨勬妧鏈灦鏋勩�佷笟鍔℃ā鍧椼�佹暟鎹ā鍨嬪拰鍏抽敭娴佺▼锛屼负椤圭洰鐨勫悗缁紑鍙戝拰缁存姢鎻愪緵閲嶈鍙傝�冦��
\ No newline at end of file

--
Gitblit v1.9.3