From 94d0b18fa47a92a1cb4d1fef4520d35ef2c2c322 Mon Sep 17 00:00:00 2001
From: wbc <2597324127@qq.com>
Date: 星期二, 16 十二月 2025 21:56:49 +0800
Subject: [PATCH] 产能排产相关后端更新
---
WebApi/help.md | 386 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 386 insertions(+), 0 deletions(-)
diff --git a/WebApi/help.md b/WebApi/help.md
index da88776..f4144aa 100644
--- a/WebApi/help.md
+++ b/WebApi/help.md
@@ -93,3 +93,389 @@
- ASP.NET Core 瀹樻柟鏂囨。锛歨ttps://learn.microsoft.com/aspnet/core
- Swashbuckle.AspNetCore 鏂囨。锛歨ttps://github.com/domaindrivendev/Swashbuckle.AspNetCore
- .NET 鐢ㄦ埛瀵嗛挜绠$悊锛歨ttps://learn.microsoft.com/aspnet/core/security/app-secrets
+
+## 14. 椤圭洰缁撴瀯娣卞叆鐞嗚В
+
+### 14.1 瑙e喅鏂规缁勬垚
+```
+GsMesSolution/
+鈹溾攢鈹� Gs.HostIIS/ # 涓绘満搴旂敤锛學eb API 鍏ュ彛
+鈹溾攢鈹� Gs.Toolbox/ # 鏍稿績妗嗘灦搴擄紙.NET 6.0锛�
+鈹溾攢鈹� Gs.Entity/ # 缁熶竴瀹炰綋妯″瀷搴�
+鈹溾攢鈹� Gs.BaseInfo/ # 鍩虹淇℃伅妯″潡锛堢墿鏂欍�佸鎴枫�佷緵搴斿晢绛夛級
+鈹溾攢鈹� Gs.Warehouse/ # 浠撳偍绠$悊妯″潡
+鈹溾攢鈹� Gs.Sales/ # 閿�鍞ā鍧�
+鈹溾攢鈹� Gs.Report/ # 鎶ヨ〃妯″潡
+鈹溾攢鈹� Gs.Wom/ # 宸ュ崟绠$悊妯″潡
+鈹溾攢鈹� GS.QC/ # 璐ㄩ噺绠$悊妯″潡
+鈹溾攢鈹� Gs.Sys/ # 绯荤粺绠$悊妯″潡
+鈹溾攢鈹� Gs.JJGZ/ # 钖祫绠$悊妯″潡
+鈹溾攢鈹� Gs.Ww/ # 濮斿绠$悊妯″潡
+鈹溾攢鈹� Gs.QiTaRk/ # 鍏朵粬鍏ュ簱妯″潡
+鈹溾攢鈹� Gs.QiTaCk/ # 鍏朵粬鍑哄簱妯″潡
+鈹溾攢鈹� Gs.Pda/ # 绉诲姩绔敮鎸佹ā鍧�
+鈹溾攢鈹� Gs.OpenApi/ # 瀵瑰鎺ュ彛妯″潡
+鈹斺攢鈹� TemplateEngineHost/ # 妯℃澘寮曟搸
+```
+
+### 14.2 鍏抽敭鏂囦欢浣嶇疆绱㈠紩
+| 鍔熻兘 | 浣嶇疆 |
+|------|------|
+| 渚濊禆娉ㄥ叆閰嶇疆 | `Gs.HostIIS/Program.cs` |
+| 鍏ㄥ眬鎺堟潈杩囨护 | `Gs.HostIIS/RequestAuthorizeAttribute.cs` 鎴� `ApiAuthorizeAttribute.cs` |
+| 鑷畾涔夎矾鐢辫鍒� | `Gs.Toolbox/ApiCore/Extensions/ApplicationExtension.cs` |
+| 鎺у埗鍣ㄥ彂鐜版満鍒� | `Gs.Toolbox/ApiCore/CustomControllerFeatureProvider.cs` |
+| 浠撳偍鍩虹被 | `Gs.Toolbox/Repository.cs` |
+| 缁熶竴杩斿洖鏍煎紡 | `Gs.Toolbox/Models/ReturnDto.cs` 鎴� `Gs.Entity` |
+| Swagger 鍒嗙粍瀹氫箟 | `Gs.Toolbox/ApiCore/ApiGroupNames.cs` |
+| 閰嶇疆璇诲彇宸ュ叿 | `Gs.Toolbox/AppSettingsHelper.cs` |
+| Excel 瀵煎嚭 | `Gs.Toolbox/ExcelHelper.cs` |
+| HTTP 璋冪敤 | `Gs.Toolbox/InterfaceUtil.cs` 鎴� `HttpHelper.cs` |
+| 鏃ュ織璁板綍 | `Gs.Toolbox/LogHelper.cs` |
+| 鐢ㄦ埛涓婁笅鏂囨彁鍙� | `Gs.Toolbox/UtilityHelper.cs` |
+
+### 14.3 鏍稿績绫诲叧绯诲浘
+```
+IRomteService锛堟爣璁版帴鍙o級
+ 鈫� 瀹炵幇
+MesItemsManager 绛夋帶鍒跺櫒绫�
+ 鈫� 缁ф壙
+Repository<TEntity>
+ 鈫� 渚濊禆
+SqlSugarScope锛圖b 瀹炰緥锛�
+ 鈫� 杩炴帴
+SQL Server 鏁版嵁搴�
+```
+
+### 14.4 DI 鐢熷懡鍛ㄦ湡鏍囪鐨勪娇鐢ㄥ満鏅�
+- **ISingleton**锛氬叏灞�閰嶇疆璇诲彇鍣ㄣ�佺紦瀛樼鐞嗗櫒銆佹暟鎹簱杩炴帴姹�
+- **IScope**锛氫簨鍔$鐞嗗櫒銆佺敤鎴蜂笂涓嬫枃鎻愬彇鍣紙姣忎釜 HTTP 璇锋眰涓�涓疄渚嬶級
+- **ITransient**锛氫笟鍔¢�昏緫绫汇�佷复鏃跺伐鍏风被锛堟瘡娆℃敞鍏ュ垱寤烘柊瀹炰緥锛�
+
+绀轰緥锛�
+```csharp
+// 瀹氫箟 Scoped 鏈嶅姟
+public class UserContextService : IScope
+{
+ private readonly IHttpContextAccessor _http;
+ public UserContextService(IHttpContextAccessor http) => _http = http;
+ public Guid GetCurrentUserId() => UtilityHelper.GetUserGuidAndOrgGuid(_http).Item1;
+}
+
+// 鍦ㄥ叾浠栫被涓娇鐢�
+[ApiGroup(ApiGroupNames.BaseInfo)]
+public class MesItemsManager : Repository<MesItems>, IRomteService
+{
+ private readonly UserContextService _userContext;
+ public MesItemsManager(UserContextService userContext) => _userContext = userContext;
+}
+```
+
+## 15. 甯歌寮�鍙戜换鍔¢�熸煡琛�
+
+### 15.1 濡備綍娣诲姞鏂扮殑 API 绔偣
+1. 鍦ㄧ浉搴旀ā鍧楃殑 `Services/` 鐩綍涓嬪垱寤烘柊鐨� `*Manager.cs` 鎴� `*Controller.cs`
+2. 缁ф壙 `Repository<T>` 骞跺疄鐜� `IRomteService` 鎺ュ彛
+3. 鍦ㄧ被涓婃爣娉� `[ApiGroup(ApiGroupNames.xxx)]`
+4. 鍦ㄦ柟娉曚笂鏍囨敞 `[RequestMethod(RequestMethods.POST)]` 绛�
+5. 缂栬瘧鍚庢棤闇�閰嶇疆锛宍AddCustomController()` 浼氳嚜鍔ㄥ彂鐜�
+
+绀轰緥浠g爜锛�
+```csharp
+[ApiGroup(ApiGroupNames.BaseInfo)]
+public class CustomItemManager : Repository<MesItems>, IRomteService
+{
+ [RequestMethod(RequestMethods.POST)]
+ public ReturnDto<List<MesItems>> GetActiveItems(ItemQuery query)
+ {
+ var items = Db.Queryable<MesItems>()
+ .Where(x => x.IsActive == 1)
+ .ToList();
+ return new ReturnDto<List<MesItems>>
+ {
+ RtnCode = ReturnCode.Success,
+ RtnData = items
+ };
+ }
+}
+```
+
+### 15.2 濡備綍瀵煎嚭 Excel 鎶ヨ〃
+```csharp
+public ReturnDto<object> ExportItems(ItemQuery query)
+{
+ var data = Db.Queryable<MesItems>().ToList();
+ var filePath = ExcelHelper.ExportList(
+ data,
+ "鐗╂枡娓呭崟",
+ new[] { "ItemCode", "ItemName", "ItemSpec" } // 鍒楀悕
+ );
+ return new ReturnDto<object>
+ {
+ RtnCode = ReturnCode.Success,
+ RtnData = new { FilePath = filePath }
+ };
+}
+```
+
+### 15.3 濡備綍璋冪敤澶栭儴 ERP 鎺ュ彛
+```csharp
+public ReturnDto<object> SyncDataToErp(SyncRequest req)
+{
+ var erpUrl = AppSettingsHelper.getValueByKey("ProductionErpUrl");
+ var result = InterfaceUtil.PostJson(erpUrl + "/api/sync", JsonConvert.SerializeObject(req));
+
+ if (result.Success)
+ {
+ LogHelper.Info($"ERP 鍚屾鎴愬姛锛歿result.Data}");
+ return new ReturnDto<object> { RtnCode = ReturnCode.Success, RtnData = result };
+ }
+ else
+ {
+ LogHelper.Error($"ERP 鍚屾澶辫触锛歿result.Message}");
+ return new ReturnDto<object> { RtnCode = ReturnCode.Exception, RtnMsg = result.Message };
+ }
+}
+```
+
+### 15.4 濡備綍鎵ц鏁版嵁搴撲簨鍔�
+```csharp
+public ReturnDto<object> BatchUpdateItems(List<MesItems> items)
+{
+ try
+ {
+ var affectedRows = UseTransaction(db =>
+ {
+ foreach (var item in items)
+ {
+ db.Updateable(item).ExecuteCommand();
+ }
+ return db.Ado.AffectedRows;
+ });
+
+ return new ReturnDto<object>
+ {
+ RtnCode = ReturnCode.Success,
+ RtnData = new { AffectedRows = affectedRows }
+ };
+ }
+ catch (Exception ex)
+ {
+ LogHelper.Error($"鎵归噺鏇存柊澶辫触锛歿ex.Message}");
+ return new ReturnDto<object> { RtnCode = ReturnCode.Exception, RtnMsg = ex.Message };
+ }
+}
+```
+
+### 15.5 濡備綍鑾峰彇褰撳墠鐢ㄦ埛淇℃伅
+```csharp
+private readonly IHttpContextAccessor _http;
+
+public void SomeMethod()
+{
+ var (userGuid, orgGuid) = UtilityHelper.GetUserGuidAndOrgGuid(_http);
+
+ // 鏍规嵁鐢ㄦ埛鍜岀粍缁囪繃婊ゆ暟鎹�
+ var userItems = Db.Queryable<MesItems>()
+ .Where(x => x.OrgGuid == orgGuid)
+ .ToList();
+}
+```
+
+### 15.6 濡備綍瀹炵幇鍒嗛〉鏌ヨ
+```csharp
+[RequestMethod(RequestMethods.POST)]
+public ReturnDto<PageList<MesItems>> GetItemsPage(PageQuery query)
+{
+ // 鑷姩澶勭悊鍒嗛〉銆佹帓搴忋�佹ā绯婃悳绱�
+ var pageData = CommonPage(
+ Db.Queryable<MesItems>()
+ .Where(x => x.ItemStatus == 1), // 鍩虹杩囨护
+ query // PageQuery 鍖呭惈鍒嗛〉鍙傛暟
+ );
+
+ return new ReturnDto<PageList<MesItems>>
+ {
+ RtnCode = ReturnCode.Success,
+ RtnData = pageData
+ };
+}
+```
+
+### 15.7 濡備綍鍦� Swagger 涓殣钘忔垨鏍囪鎺ュ彛
+```csharp
+// 鏍囪涓哄凡杩囨湡鐨勬帴鍙�
+[Obsolete("宸茶 GetItemsPageV2 鏇夸唬")]
+[RequestMethod(RequestMethods.POST)]
+public ReturnDto<PageList<MesItems>> GetItemsPage(PageQuery query)
+{
+ // ...
+}
+
+// 浣跨敤 [AllowAnonymous] 缁曡繃鎺堟潈锛堢敓浜х幆澧冮渶璋ㄦ厧锛�
+[AllowAnonymous]
+[RequestMethod(RequestMethods.GET)]
+public ReturnDto<string> GetVersion()
+{
+ return new ReturnDto<string>
+ {
+ RtnCode = ReturnCode.Success,
+ RtnData = "1.0.0"
+ };
+}
+```
+
+## 16. 鎬ц兘浼樺寲涓庢渶浣冲疄璺�
+
+### 16.1 鏌ヨ浼樺寲寤鸿
+- 浣跨敤 SqlSugar 鐨� `Distinct()`銆乣Where()` 鍙婃棭杩囨护锛岄伩鍏� ORM 灞傝繃婊ゅぇ閲忔暟鎹�
+- 涓洪绻佹煡璇㈢殑瀛楁娣诲姞鏁版嵁搴撶储寮曪紙涓� DBA 鍗忎綔锛�
+- 绂佺敤鑷姩鏄犲皠鍏宠仈琛紝浣跨敤鏄惧紡 `Select()` 鎶曞奖闇�瑕佺殑鍒�
+- 鍒嗛〉鏌ヨ鍔″繀鎸囧畾 `OrderBy`锛屽惁鍒欑粨鏋滀笉绋冲畾
+
+### 16.2 鍐呭瓨浼樺寲寤鸿
+- 閬垮厤鍦ㄥ惊鐜腑鍒涘缓鏂扮殑鏁版嵁搴撹繛鎺ユ垨 HttpClient
+- 浣跨敤 `using` 鎴栦緷璧栨敞鍏ョ鐞嗚祫婧愮敓鍛藉懆鏈�
+- 澶ч噺鏁版嵁瀵煎嚭鏃惰�冭檻娴佸紡澶勭悊鎴栧垎鎵瑰鍑�
+- 缂撳瓨閰嶇疆鍊硷紙濡傚簲鐢ㄨ缃級鑰岄潪姣忔璇诲彇鏂囦欢
+
+### 16.3 瀹夊叏寤鸿
+- **楠岃瘉杈撳叆**锛氭墍鏈夋潵鑷鎴风鐨勫弬鏁板簲杩涜绫诲瀷妫�鏌ヤ笌闀垮害闄愬埗
+- **SQL 娉ㄥ叆闃叉姢**锛氫娇鐢� SqlSugar 鐨勫弬鏁板寲鏌ヨ锛岀姝㈠瓧绗︿覆鎷兼帴 SQL
+- **鏁忔劅鏁版嵁**锛氬姞瀵嗗瓨鍌ㄥ瘑鐮併�丄PI Key銆佹暟鎹簱杩炴帴瀛楃涓诧紝浣跨敤鐜鍙橀噺鎴栧瘑閽ュ簱
+- **鏃ュ織鑴辨晱**锛氶伩鍏嶈褰曠敤鎴峰瘑鐮併�佹敮浠樹俊鎭瓑鏁忔劅鏁版嵁
+- **CORS 鎺у埗**锛氱敓浜х幆澧冨簲闄愬埗 CORS 鏉ユ簮锛岃�岄潪鍏佽鎵�鏈夋潵婧�
+
+### 16.4 浠g爜瑙勮寖寤鸿
+- 鍦ㄧ被銆佹柟娉曘�佸弬鏁颁笂娣诲姞 XML 鏂囨。娉ㄩ噴锛坄///`锛夛紝渚夸簬 Swagger 鑷姩鐢熸垚鏂囨。
+- 浣跨敤鏈夋剰涔夌殑鍙橀噺鍚嶏紝閬垮厤鍗曞瓧姣嶅彉閲忥紙闄ゅ惊鐜鏁板櫒澶栵級
+- 寮傚父澶勭悊搴斿尯鍒嗕笟鍔″紓甯镐笌绯荤粺寮傚父锛岃繑鍥炲搴旂殑閿欒鐮�
+- 澶嶆潅涓氬姟閫昏緫搴旀媶鍒嗕负澶氫釜灏忔柟娉曪紝渚夸簬娴嬭瘯涓庣淮鎶�
+
+绀轰緥 XML 娉ㄩ噴锛�
+```csharp
+/// <summary>
+/// 鍒嗛〉鏌ヨ鐗╂枡鍒楄〃
+/// </summary>
+/// <param name="query">鍒嗛〉鍙婃悳绱㈠弬鏁�</param>
+/// <returns>鍖呭惈鍒嗛〉鏁版嵁鐨勮繑鍥炵粨鏋�</returns>
+[RequestMethod(RequestMethods.POST)]
+public ReturnDto<PageList<MesItems>> GetItemsPage(PageQuery query)
+{
+ // 瀹炵幇
+}
+```
+
+## 17. 鏁呴殰鎺掓煡杩涢樁鎸囧崡
+
+### 17.1 璋冭瘯鎶�宸�
+| 闂 | 鎺掓煡姝ラ |
+|------|--------|
+| 鎺у埗鍣ㄦ湭琚彂鐜� | 1. 妫�鏌ョ被鏄惁瀹炵幇 `IRomteService`<br>2. 妫�鏌ョ被鎵�鍦ㄧ▼搴忛泦鏄惁琚� `Gs.HostIIS` 寮曠敤<br>3. 妫�鏌ョ被鏄惁鍦� `Services/` 鐩綍<br>4. 杩愯 `dotnet build` 鐢熸垚 DLL<br>5. 鏌ョ湅 Swagger `/swagger` 鏄惁鍑虹幇 |
+| 鏂规硶鏈嚭鐜板湪 Swagger | 1. 妫�鏌ユ柟娉曟槸鍚︽爣娉� `[RequestMethod(...)]`<br>2. 妫�鏌ユ柟娉曚笂鏄惁鏈� XML 娉ㄩ噴<br>3. 妫�鏌� `appsettings.json` 涓� `ServicesPath` 閰嶇疆<br>4. 妫�鏌ョ敓鎴愮殑 XML 鏂囦欢鏄惁瀛樺湪 |
+| 鎺堟潈澶辫触锛坱oken 琚嫆锛� | 1. 妫�鏌ヨ姹傚ご鏍煎紡锛歚Authorization: token 3fa85f64-5717-4562-b3fc-2c963f66afa6`<br>2. 妫�鏌� token 闀垮害鏄惁 鈮� 5<br>3. 鍦ㄦ湰鍦版祴璇曠幆澧冨彲涓存椂淇敼 `ApiAuthorizeAttribute` 鐨勬渶灏忛暱搴︿负 0<br>4. 纭 `[AllowAnonymous]` 鏍囨敞鐨勬帴鍙d笉鍦ㄦ帶鍒跺櫒绾у埆锛屽惁鍒欐暣涓帶鍒跺櫒灏嗚璺宠繃 |
+| 鏁版嵁搴撹繛鎺ュけ璐� | 1. 妫�鏌� `ConnectionStrings` 鏄惁姝g‘<br>2. 楠岃瘉 SQL Server 鏈嶅姟鏄惁杩愯<br>3. 纭缃戠粶杩為�氭�э細`ping <database-server>`<br>4. 妫�鏌ラ槻鐏鏄惁寮�鏀� SQL Server 绔彛锛堥粯璁� 1433锛�<br>5. 楠岃瘉鏁版嵁搴撶敤鎴峰悕瀵嗙爜 |
+| CORS 璺ㄥ煙澶辫触 | 1. 妫�鏌ユ祻瑙堝櫒鎺у埗鍙扮殑 CORS 閿欒璇︽儏<br>2. 妫�鏌� `Gs.HostIIS/Program.cs` 涓殑 CORS 绛栫暐閰嶇疆<br>3. 楠岃瘉璇锋眰鐨� `Origin` 鏄惁鍦ㄥ厑璁稿垪琛ㄤ腑<br>4. 灏濊瘯浣跨敤 Postman 鎴� curl 鎺掗櫎娴忚鍣ㄩ檺鍒� |
+| Swagger UI 鎵撳紑缂撴參鎴栬秴鏃� | 1. 妫�鏌� Swagger 鍒嗙粍閰嶇疆鏄惁姝g‘<br>2. 鍒犻櫎 `bin/` 鍜� `obj/` 閲嶆柊缂栬瘧<br>3. 妫�鏌ユ槸鍚︽湁澶ч噺鏈娇鐢ㄧ殑鎺ュ彛鎴栧惊鐜緷璧�<br>4. 鑰冭檻鍦� `appsettings.json` 涓鐢ㄦ煇浜涘垎缁勪互鍔犻�熷姞杞� |
+
+### 17.2 鏃ュ織鍒嗘瀽
+- **鏃ュ織浣嶇疆**锛歚appsettings.json` 涓� `LogPath` 鎸囧畾鐨勭洰褰曪紙榛樿 `logs/`锛�
+- **鏌ョ湅 SQL 鎵ц**锛歋qlSugar 浼氳嚜鍔ㄨ緭鍑� SQL 璇彞鍒版帶鍒跺彴锛岃瀵熸墽琛岃鍒掍笌鍙傛暟
+- **寮傚父鍫嗘爤**锛氭崟鑾峰畬鏁寸殑寮傚父鍫嗘爤璺熻釜锛屽畾浣嶉棶棰樺彂鐢熷湪鍝竴琛屼唬鐮�
+- **鍏宠仈鐢ㄦ埛**锛氬湪鏃ュ織涓褰曟搷浣滅敤鎴枫�佹椂闂存埑锛屼究浜庝簨鍚庡璁�
+
+## 18. 鎵╁睍涓庨泦鎴�
+
+### 18.1 娣诲姞鏂扮殑涓氬姟妯″潡娴佺▼
+1. **鍒涘缓椤圭洰**锛氬湪 VS 涓柊寤� .NET 8.0 绫诲簱椤圭洰锛屽懡鍚嶄负 `Gs.NewModule`
+2. **閰嶇疆椤圭洰鏂囦欢**锛堝弬鑰� `CLAUDE.md` 涓殑 `.csproj` 妯℃澘锛�
+3. **娣诲姞寮曠敤**锛歚Gs.Entity` 鍜� `Gs.Toolbox`
+4. **鍒涘缓鐩綍缁撴瀯**锛�
+ ```
+ Gs.NewModule/
+ 鈹溾攢鈹� Models/ # 瀹炰綋鎴� DTO
+ 鈹溾攢鈹� Services/ # 鎺у埗鍣ㄧ被
+ 鈹斺攢鈹� Gs.NewModule.csproj
+ ```
+5. **缂栧啓鏈嶅姟绫�**锛氬疄鐜� `IRomteService`銆佺户鎵� `Repository<T>`
+6. **缂栬瘧閮ㄧ讲**锛欴LL 浼氳嚜鍔ㄨ緭鍑哄埌 `Gs.HostIIS/bin/Debug/`锛屽惎鍔ㄥ悗鑷姩琚彂鐜�
+
+### 18.2 涓庣涓夋柟绯荤粺闆嗘垚锛堝 ERP锛�
+- 浣跨敤 `InterfaceUtil` 鍙戦�� HTTP 璇锋眰
+- 鍦� `appsettings.json` 涓厤缃涓夋柟绯荤粺 URL
+- 瀹炵幇閲嶈瘯鏈哄埗涓庡紓甯稿鐞�
+- 璁板綍闆嗘垚鏃ュ織渚夸簬闂鎺掓煡
+
+### 18.3 娑堟伅闃熷垪闆嗘垚寤鸿锛堟湭鏉ユ墿灞曪級
+- 瀵逛簬寮傛鎿嶄綔锛堝澶ф壒閲忓鍏ャ�丒RP 鍚屾锛夛紝鑰冭檻鎺ュ叆 RabbitMQ銆丷edis 绛夐槦鍒�
+- 浣跨敤鍚庡彴浠诲姟搴擄紙濡� Hangfire銆丅ackgroundService锛夊鐞嗚�楁椂鎿嶄綔
+- 鎻愪緵寮傛鎺ュ彛缁欏墠绔紝浣跨敤杞鎴� WebSocket 鑾峰彇杩涘害
+
+## 19. 甯歌 API 璋冪敤绀轰緥
+
+### 19.1 鍒嗛〉鏌ヨ绀轰緥锛圥OST锛�
+```json
+璇锋眰 URL: http://localhost:5263/MesItemsManager/GetListPage
+璇锋眰澶�: {"token": "token 3fa85f64-5717-4562-b3fc-2c963f66afa6"}
+璇锋眰浣�: {
+ "currentPage": 1,
+ "everyPageSize": 10,
+ "sortName": "CreateTime",
+ "sortOrder": "desc",
+ "keyWord": "鐗╂枡鍚嶇О",
+ "keyType": "ItemName"
+}
+```
+
+### 19.2 瀵煎嚭 Excel 绀轰緥
+```json
+璇锋眰 URL: http://localhost:5263/SomeController/ExportItems
+璇锋眰澶�: {"token": "token ..."}
+鍝嶅簲浣�: {
+ "rtnCode": 1,
+ "rtnData": {
+ "filePath": "/download/items_20250101.xlsx"
+ },
+ "rtnMsg": "瀵煎嚭鎴愬姛"
+}
+```
+鍚庣画閫氳繃 `http://localhost:5263/download/items_20250101.xlsx` 涓嬭浇鏂囦欢
+
+### 19.3 涓庡瓨鍌ㄨ繃绋嬩氦浜�
+```csharp
+// 璋冪敤瀛樺偍杩囩▼鑾峰彇鎶ヨ〃鏁版嵁
+var result = Db.Ado.GetDataTable(
+ "EXEC sp_GetSalesReport @StartDate=@StartDate, @EndDate=@EndDate",
+ new SqlParameter("@StartDate", DateTime.Parse(query.StartDate)),
+ new SqlParameter("@EndDate", DateTime.Parse(query.EndDate))
+);
+```
+
+## 20. 鎬荤粨涓庤鍔ㄦ竻鍗�
+
+### 蹇�熷紑濮嬫竻鍗�
+- [ ] 鐜鍑嗗锛圫DK銆佹暟鎹簱銆丟it锛�
+- [ ] 瑙e喅鏂规缂栬瘧涓庡惎鍔�
+- [ ] 璁块棶 Swagger UI 楠岃瘉鎺ュ彛鍔犺浇
+- [ ] 浣跨敤鏍蜂緥 token 娴嬭瘯鎺堟潈鏈哄埗
+- [ ] 闃呰 CLAUDE.md 浜嗚В妗嗘灦缁嗚妭
+- [ ] 闃呰 MODULES.md 浜嗚В鍚勬ā鍧楄亴璐�
+- [ ] 閫夋嫨涓�涓皬鍔熻兘锛屽畬鏁村疄鐜颁竴涓柊绔偣
+- [ ] 鎻愪氦娴嬭瘯 PR 骞舵敹闆嗗弽棣�
+
+### 鏃ュ父寮�鍙戞竻鍗�
+- [ ] 缂栧啓鏂版帴鍙f椂娣诲姞 XML 娉ㄩ噴
+- [ ] 鏈湴缂栬瘧閫氳繃銆丼wagger 鏄剧ず姝g‘
+- [ ] 娴嬭瘯鎺ュ彛鐨勬巿鏉冦�佸弬鏁伴獙璇併�佸紓甯稿鐞�
+- [ ] 鎻愪氦鍓嶈繍琛� `dotnet build` 楠岃瘉鏃犵紪璇戣鍛�
+- [ ] PR 涓褰曟祴璇曟楠や笌楠岃瘉缁撴灉
+- [ ] 鏇存柊鐩稿叧鏂囨。锛堣嫢鏈夐厤缃垨鏁版嵁搴撳彉鏇达級
+
+### 涓婄嚎鍓嶆竻鍗�
+- [ ] 鎵�鏈夋晱鎰熶俊鎭粠浠g爜涓Щ闄�
+- [ ] 鐢熶骇鐜閰嶇疆鏂囦欢锛坄.config/*.json`锛夊凡鍑嗗
+- [ ] 杩愯瀹屾暣鐨勫啋鐑熸祴璇曪紙鏍稿績涓氬姟娴佺▼锛�
+- [ ] 鎬ц兘娴嬭瘯鎴栧熀鍑嗘祴璇曞凡瀹屾垚
+- [ ] 澶囦唤璁″垝涓庡洖婊氭柟妗堝凡鍑嗗
+- [ ] 鐩戞帶鍛婅瑙勫垯宸查厤缃�
+- [ ] 鐢ㄦ埛鏂囨。涓庢妧鏈枃妗e凡鏇存柊
--
Gitblit v1.9.3