CLAUDE.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
CodeReviewReport.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
MES.Service/Dto/service/XJPageResult.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
MES.Service/Modes/MesQaIqc.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
MES.Service/Modes/MesQaItemsDetectDetail5.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
MES.Service/Modes/MessageCenter.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
MES.Service/service/MessageCenterManager.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
MES.Service/service/QC/LljService.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
MESApplication/Controllers/Base/MessageCenterController.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
MESApplication/README.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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()` CodeReviewReport.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,309 @@ # C# 代ç è´¨éå®¡æ¥æ¥å ## æ¦è¿° æ¬æ¥ååæäºæ¨çMES API项ç®ä¸å·²ä¿®æ¹çC#æä»¶ï¼è¯å«åºä»£ç è´¨éé®é¢å¹¶æä¾æ¹è¿å»ºè®®ã ## 主è¦é®é¢æ»ç» ### ð´ 严éé®é¢ 1. **å½åè§èä¸ä¸è´** - æ··å使ç¨PascalCaseåcamelCase 2. **SQLæ³¨å ¥é£é©** - åç¬¦ä¸²æ¼æ¥æå»ºSQLè¯å¥ 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; } // ä½¿ç¨æ£ç¡®çæ°æ®ç±»å public DateTime? EndDate { get; set; } public bool? ArrivalFilter { get; set; } // 使ç¨boolè䏿¯int ``` **åå **: - C#屿§åºä½¿ç¨PascalCaseå½åè§è - æ¥æåæ®µåºä½¿ç¨DateTimeè䏿¯string - å¸å°å¼åºä½¿ç¨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; } // æ£ç¡®å½ååç±»å ``` ### 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 // â æå为å¤ä¸ªèè´£åä¸çæ¹æ³ 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); // â éå¤ä»£ç } } ``` #### 建议æ¹è¿: ```csharp // â 使ç¨å¼ºç±»åååºååºç±»æ¹æ³ [HttpPost("ResetUpdate")] public ResponseResult ResetUpdate([FromBody] MessageCenter data) { return ExecuteWithErrorHandling(() => { var result = m.ResetUpdate(data); return CreateSuccessResponse(result); }); } // â åºç±»æ¹æ³åå°éå¤ä»£ç 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. **ç»ä¸å½åè§è** - ææå±æ§ä½¿ç¨PascalCase 3. **å®å ¨çç±»å转æ¢** - æ·»å TryParseéªè¯ ### â¡ å°½å¿«ä¿®å¤ (ä¸ä¼å 级) 1. **æ£ç¡®çæ°æ®ç±»å** - æ¥æä½¿ç¨DateTimeï¼å¸å°å¼ä½¿ç¨bool 2. **è¾å ¥éªè¯** - ææå ¬å ±æ¹æ³æ·»å åæ°éªè¯ 3. **常éå®ä¹** - æ¿æ¢éæ³æ°ååå符串 ### ð¡ 鿥æ¹è¿ (ä½ä¼å 级) 1. **æ¹æ³éæ** - æåå¤ææ¹æ³ 2. **ç»ä¸å¼å¸¸å¤ç** - 使ç¨åºç±»æ¹æ³åå°éå¤ 3. **强类åå** - é¿å 使ç¨dynamicåExpandoObject ## 代ç è§è建议 ### å½åè§è ```csharp // â æ£ç¡®çå½å 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 // â ä½¿ç¨æ£ç¡®çæ°æ®ç±»å 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; } ``` ## æ»ç» æ¨çä»£ç æ´ä½ç»æè¯å¥½ï¼ä½å¨ä»¥ä¸å 个æ¹é¢éè¦æ¹è¿ï¼ 1. **å½åè§èä¸è´æ§** - ä¸¥æ ¼éµå¾ªC#å½åçº¦å® 2. **ç±»åå®å ¨** - 使ç¨éå½çæ°æ®ç±»å 3. **å®å ¨æ§** - é¿å SQLæ³¨å ¥åè¾å ¥éªè¯ 4. **å¯ç»´æ¤æ§** - åå°ä»£ç éå¤ï¼æåå¤ææ¹æ³ 建议æç §ä¼å çº§éæ¥æ¹è¿ï¼ä»å®å ¨é®é¢å¼å§ï¼ç¶åæ¯å½åè§èï¼æåæ¯ä»£ç ç»æä¼åã 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; } } 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; } } 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; } MES.Service/Modes/MessageCenter.cs
@@ -1,11 +1,12 @@ using SqlSugar; using 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> /// è¿åçJSON /// </summary> /// è¿åçJSON ///</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; } /// æªè½¬ç json ///</summary> [SugarColumn(ColumnName = "DATA_INSERTED")] public string? DataInserted { get; set; } [SugarColumn(IsIgnore = true)] public int? isShow { get; set; } 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"); 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) { 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, MESApplication/README.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,302 @@ # XG_MES项ç®ç»æä¸åè½åæææ¡£ ## é¡¹ç®æ¦è¿° XG_MESæ¯ä¸ä¸ªåºäºASP.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åºåå ### è§£å³æ¹æ¡ç»æ ``` 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` - ç©æä¿¡æ¯ç®¡çï¼æ¯æERP忥 - `MesCustomerController` - 客æ·ä¿¡æ¯ç®¡ç - `MesSupplierController` - ä¾åºåä¿¡æ¯ç®¡ç - `MesStaffController` - å工信æ¯ç®¡ç - `MesDepotsController` - ä»åºä¿¡æ¯ç®¡ç - `OrganizeController` - ç»ç»æ¶æç®¡ç **ä¸å¡æå¡ï¼** - `MesItemsManager` - ç©æä¸»æ°æ®ç®¡çï¼æ¯ææ¹éæä½åERP忥 - `OrganizeManager` - ç»ç»æ¶æç®¡çï¼æ¯æå±çº§ç»æ - `MesCustomerManager` - 客æ·ä¿¡æ¯ç®¡çï¼æ¯æç¶ææ§å¶ **æ°æ®æ¨¡åï¼** - `MesItems` - ç©æä¸»æ°æ®ï¼æ¯æå¤åä½ãå¤ç¼ç ãERPéæ - `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åºç¡æå¡ï¼æ¯æBase64å¾çå¤ç **æ°æ®æ¨¡åï¼** - `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** - æ¶æ¯ä¸å¿ï¼è®°å½ææå¤é¨ç³»ç»æ¥å£è°ç¨ - **失败éè¯** - æ¯ææ¶æ¯æ¨é失败åçéè¯æºå¶ - **ç¶æè·è¸ª** - 宿´çæ°æ®åæ¥ç¶æè¿½è¸ª ## å ³é®ä¸å¡æµç¨ ### 1. 订åå°äº¤ä»æµç¨ ``` éå®è®¢å â ç产订å â å·¥åæ§è¡ â è´¨éæ£éª â åºåºåè´§ ``` ### 2. éè´å°å ¥åºæµç¨ ``` éè´è®¢å â ä¾åºåéè´§ â æ¥ææ£éª â å ¥åºä¸æ¶ ``` ### 3. ç产æ§è¡æµç¨ ``` å·¥åä¸è¾¾ â åæåºåº â ç产å å·¥ â å·¡æ£è´¨æ§ â æåå ¥åº ``` ### 4. è´¨éç®¡æ§æµç¨ ``` æ¥ææ£éª â é¦ä»¶æ£éª â çäº§å·¡æ£ â å ¥åºæ£éª â ä¸åæ ¼å¤ç ``` ## æ°æ®åºè®¾è®¡ç¹ç¹ ### 1. 主é®çç¥ - 大é¨å表使ç¨Oracleåºåçææ°åä¸»é® - å ³é®ä¸å¡è¡¨ä½¿ç¨GUID主é®ï¼å¦ç产订åï¼ ### 2. å®¡è®¡åæ®µæ åå æ¯ä¸ªä¸å¡è¡¨é½å 嫿 åå®¡è®¡åæ®µï¼ - `CREATE_BY`, `CREATE_DATE` - åå»ºä¿¡æ¯ - `LASTUPDATE_BY`, `LASTUPDATE_DATE` - æ´æ°ä¿¡æ¯ - `CREATE_ORG`, `USE_ORG` - ç»ç»æéæ§å¶ ### 3. ERPéæè®¾è®¡ - `FDOCUMENTSTATUS` - ERPåæ®ç¶æåæ¥ - åç§ERP_IDåæ®µ - ä¸ERPç³»ç»ä¸»é®æ å° - SAPç¸å ³å段 - SAPç³»ç»éææ¯æ ### 4. ç¶æç®¡çæ¨¡å¼ - ä½¿ç¨æ°å代ç 表示ä¸å¡ç¶æ - æ¯æå®¡æ ¸æµç¨ï¼å¶åâå®¡æ ¸âè¿è´¦ï¼ - ç¦ç¨ç¶æç®¡çèéç©çå é¤ ### 5. å¤ç»ç»æ¯æ éè¿`CREATE_ORG`å`USE_ORG`åæ®µå®ç°å¤ç»ç»æ°æ®é离åæéæ§å¶ ## ææ¯ç¹ç¹ ### 1. ç»ä¸çæ°æ®è®¿é®å± - ææManager类继æ¿Repositoryåºç±» - æä¾æ åCRUDæä½ - æ¯æäºå¡ç®¡ç ### 2. æ¡ç ææ¯åºç¨ - 广æ³ä½¿ç¨æ¡ç æ«æè¿è¡ä¸å¡æä½éªè¯ - æ¯æå¤ç§æ¡ç ç±»åï¼å®¢æ·ãä¾åºåãå é¨ï¼ - 宿´ç追溯é¾ç®¡ç ### 3. è´¨é管ç - å®ç°å®æ´çAQLæ½æ ·æ£éªæ å - æ¯æå¤å±æ¬¡è´¨éæ£éªæ§å¶ - å¾çä¸ä¼ åæ£éªæ åå¯¹æ¯ ### 4. 宿¶æ°æ®å¤ç - åºå宿¶æ´æ° - çäº§ç¶æå®æ¶è·è¸ª - è´¨éæ°æ®å®æ¶åé¦ ## ç³»ç»ä¼å¿ 1. **ä¸å¡å®æ´æ§** - è¦çMESç³»ç»çæ ¸å¿ä¸å¡é¢å 2. **æ°æ®ä¸è´æ§** - éè¿äºå¡ååå¨è¿ç¨ç¡®ä¿æ°æ®åç¡®æ§ 3. **坿©å±æ§** - æ¸ æ°ç模ååå便äºåè½æ©å± 4. **éæè½å** - ä¸ERPç³»ç»æ·±åº¦éæï¼å®ç°æ°æ®åæ¥ 5. **è´¨é管æ§** - 宿´çè´¨éæ£éªæµç¨ä¿è¯äº§åè´¨é 6. **宿¶æ§** - æ¡ç æ«æå宿¶æ°æ®å¤çæé«æä½æç 7. **å¤ç»ç»æ¯æ** - æ¯æå¤å·¥åãå¤ç»ç»çç®¡çæ¨¡å¼ ## å¼åæå ### 常ç¨å¼åå½ä»¤ ```bash # ç¼è¯æ´ä¸ªè§£å³æ¹æ¡ dotnet build MESApplication.sln # è¿è¡åºç¨ç¨åº dotnet run --project MESApplication # 访é®Swaggerææ¡£ http://localhost:5184/swagger ``` ### æ°æ®åºè¿æ¥ - è¿æ¥å符串é ç½®å¨ `appsettings.json` ç `AppSettings.DataBaseConn` - 使ç¨SqlSugar ORMè¿è¡æ°æ®è®¿é® - æ¯æSQLæ¥å¿è®°å½ä¾¿äºè°è¯ ### å¼åè§è - ææManager类继æ¿Repositoryåºç±» - 使ç¨DTO模å¼è¿è¡æ°æ®ä¼ è¾ - ç»ä¸çResponseResultè¿åæ ¼å¼ - æ¯ææ¹éæä½åäºå¡å¤ç æ¬ææ¡£ä¸ºXG_MES项ç®ç宿´ç»æä¸åè½åæï¼æ¶µçäºç³»ç»çææ¯æ¶æãä¸å¡æ¨¡åãæ°æ®æ¨¡ååå ³é®æµç¨ï¼ä¸ºé¡¹ç®çåç»å¼ååç»´æ¤æä¾éè¦åèã