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