| DevApp/DevFrm详细分析.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| DevApp/Gs.DevApp/DevFrm/FrmLogin.resx | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| DevApp/Gs.DevApp/DevFrm/QC/MesQcExceptional.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| DevApp/HELP.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| README.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
DevApp/DevFrmÏêϸ·ÖÎö.md
@@ -1,33 +1,164 @@ # DevFrmä¸å¡æ¨¡å详ç»åæ # DevFrm ä¸å¡æ¨¡å详ç»åæ ## ç®å½æ¦è¿° DevFrmæ¯èå®MESç³»ç»çæ ¸å¿ä¸å¡æ¨¡åç®å½ï¼å 嫿æä¸å¡åè½çªä½åç¸å ³ç»ä»¶ã该ç®å½éç¨æä¸å¡åè½æ¨¡åååçç»ç»ç»æï¼æ¯ä¸ªåç®å½ä»£è¡¨ä¸ä¸ªå®æ´çä¸å¡é¢åã ## æ¦è¿° ## æ ¸å¿å ¥å£æä»¶ **DevFrm** æ¯ LanBMes MES ç³»ç»çæ ¸å¿ä¸å¡æ¨¡åç®å½ï¼å 嫿æä¸å¡åè½çªä½åç¸å ³ç»ä»¶ã ### FrmMain.cs - 主çªä½ (MDI容å¨) **åè½ï¼** ç³»ç»ä¸»çé¢ï¼éç¨DevExpress FluentDesignForm设计 **主è¦ç¹æ§ï¼** - 使ç¨FluentDesignç°ä»£åçé¢é£æ ¼ - TabControl夿 ç¾é¡µç®¡çï¼æ¯æå¨ææ·»å /å ³éæ ç¾é¡µ - éæå¯¼èªæ ï¼å¨æå è½½åè½èå - æ¯æå³é®èåæä½ï¼å ³éå½åãå ³éå ¨é¨çï¼ - ç¨æ·ç»å½ç¶æç®¡çåæéæ§å¶ - ç³»ç»é ç½®ä¿¡æ¯æ¾ç¤º - **项ç®ä½ç½®**: `Gs.DevApp/DevFrm/` - **æ¨¡åæ°é**: 18 个ä¸å¡å模å + 1 个主çªä½ - **çªä½æ»æ°**: 136 个主çªä½ï¼ä¸å« Designer.csï¼ - **æ ¸å¿æ¡æ¶**: Windows Forms + DevExpress v22.2 - **æ¶ææ¨¡å¼**: 夿¨¡ååè®¾è®¡ï¼æä¸å¡åç»ç» - **éä¿¡æºå¶**: éä¸å¼ HTTP REST APIï¼éè¿ `UtilityHelper.HttpPost()`ï¼ - **å½åè§è**: `Gs.DevApp.DevFrm.{模åå}.{çªä½å}` ### FrmLogin.cs - ç»å½çªä½ **åè½ï¼** ç¨æ·ç»å½è®¤è¯çé¢ **主è¦ç¹æ§ï¼** - ç¨æ·èº«ä»½éªè¯ - èªå¨æ´æ°æ£æ¥éæ - è®°ä½ç»å½ç¶æ - å¤è¯è¨æ¯æåå¤ ## å¿«éå¯¼èª | 模å | çªä½æ° | èè´£ | æ ¸å¿çªä½ | |------|--------|------|--------| | **WOM** | 15 | å·¥åå ¨çå½å¨æ | å·¥åå建ãå·¥èºæµç¨ã派工ãå ¥åºãåå² | | **Ck** | 12 | åºåºç®¡ç | 颿ãè¡¥æãéè´éè´§ãç产éåºãéªæ¶éè´§ | | **BasicData** | 11 | åºç¡æ°æ®ç®¡ç | 客æ·ãä¾åºåãç©æåç±»ãä»åºã车é´äº§çº¿ãåå·¥ | | **WW** | 10 | 车é´ç°åºç®¡ç | 车é´è¡¥æã颿ãæäº§ãå·¥ååé ãç产订å | | **Warehouse** | 9 | ä»åºç»¼å管ç | æ¡ç 管çãå§æå å·¥ãè°æ¨ãåææå ¥åº | | **Sales** | 9 | éå®ç®¡ç | éå®è®¢åãåè´§ãéè´§éç¥ | | **QC** | 8 | è´¨éæ§å¶éç¨ | æ£éªæ¨¡æ¿ã缺é·ä»£ç ãAQLæ åãæ£éªé¡¹ç® | | **RkQC** | 8 | æ¥æè´¨éæ§å¶ | æ¥ææ£éªãæ½æ£ãå§ææ£éªãå ¶ä»å ¥åºæ£éª | | **Rk** | 7 | å ¥åºç®¡ç | å°è´§å ¥åºãæ£éªå ¥åºãå ¶ä»å ¥åºãå ¥åºå°è´¦ | | **Work** | 7 | ç产ä½ä¸æ§è¡ | å¼å·¥ãä½ä¸ç®¡çãå·¥åºæµè½¬ãè¿ä¿®ãå·¥èºææ¯ | | **JJGZ** | 7 | 计件工èµç®¡ç | 计件/计æ¶å·¥èµãæçãèå¤ãå线管ç | | **IPQC** | 6 | è¿ç¨è´¨éæ§å¶ | é¦ä»¶æ£éªãå·¡æ£ç®¡çï¼å«H5çï¼ | | **User** | 6 | ç¨æ·æé管ç | ç¨æ·ç®¡çãè§è²ç®¡çãæéåé ãå¯ç 设置 | | **Sys** | 4 | ç³»ç»é ç½® | ç³»ç»é ç½®ã页é¢è§å¾ãæå°ç®¡ç | | **FQC** | 3 | æç»è´¨éæ§å¶ | FQCæ£éªãæ£æµæµç¨ãæ£éªé¡¹ç® | | **PDA** | 3 | ç§»å¨è®¾å¤éæ | ç¨æ·ç»å®ãåºåç»å®ãç»å®å表 | | **Rpt** | 1 | æ¥è¡¨æ¥è¯¢ | MESæ¥è¯¢æ¥è¡¨ï¼FastReportéæï¼ | | **BarCode** | 1 | æ¡ç 管ç | ç®±ç çæåæå° | ## æ ¸å¿åºç¨å ¥å£ ### FrmMain.cs - ç³»ç»ä¸»çªä½ **å ³é®èè´£**: - FluentDesignForm ç°ä»£åçé¢å®¹å¨ - 卿å è½½èåï¼éè¿åå°å APIï¼ - XtraTabControl 夿 ç¾é¡µç®¡ç - 表åç¼å鲿¢éå¤æå¼ - ç»ç»åæ¢ä¸ææ¡ - ç¨æ·ç»åºä¸ç¶æç®¡ç **工使µ**: ```csharp // 1. å¯å¨æ¶å è½½èåï¼API: User/GetUserLoginInfoï¼ // 2. èåç¹å»è§¦åå¨æè¡¨åå è½½ï¼API: MenuAction/GetModelByNameSpaceï¼ // 3. æ°å»ºæåæ¢å°ç°ææ ç¾é¡µ // 4. æ¯ææ ç¾é¡µå³é®æä½ï¼å ³éãå ¨å ³éçï¼ ``` **å ³é®ä»£ç ä½ç½®**: `Gs.DevApp/FrmMain.cs:1-100+` ### FrmLogin.cs - ç»å½è®¤è¯çªä½ **å ³é®èè´£**: - ç¨æ·èº«ä»½éªè¯ï¼API: User/UserLoginï¼ - èªå¨æ´æ°æ£æ¥ï¼AutoUpdater.NETï¼ - ç»å½ç¶æç¼å - ç»ç»åæ¢æ¶éæ°è®¤è¯ **è®¤è¯æµç¨**: ``` ç»å½çé¢ â HTTP POST /User/UserLogin â è¿å LoginInfoModel (token + ç¨æ·ä¿¡æ¯) â åå¨å°éæ LoginInfoModel.CurrentUser â FrmMain 读åå½åç¨æ·ä¿¡æ¯ ``` **å ³é®ä»£ç ä½ç½®**: `Gs.DevApp/FrmLogin.cs:1-150+` --- ## 模åå½åè§èå代ç ä½ç½® ### æ åå½åè§è **主çªä½å½åï¼** - **æ åæ ¼å¼ï¼** `Frm_{ä¸å¡åç§°}.cs` - 示ä¾ï¼`Frm_Customer.cs`ã`Frm_MesWorkProd.cs`ã`Frm_SalesOrder.cs` - **ç¹æ®æ ¼å¼ï¼User模åï¼ï¼** ä¸ä½¿ç¨ `Frm_` åç¼ - 示ä¾ï¼`User.cs`ã`Role.cs`ã`ViewRole.cs` - **åçªä½/å¯¹è¯æ¡å½åï¼** - æ£æµçªä½ï¼`Frm_{ä¸å¡}Detect01.cs`ã`Frm_{ä¸å¡}Detect01H5.cs` - åæ®çªä½ï¼`Frm_{ä¸å¡}Dj.cs`ï¼Dj=åæ®ï¼ - ç³è¯·çªä½ï¼`Frm_{ä¸å¡}Sq.cs`ï¼Sq=ç³è¯·ï¼ - éæ©çªä½ï¼`Select{ä¸å¡}.cs` - å±ç¤ºçªä½ï¼`Frm_{ä¸å¡}Show.cs` **è¾ å©ç»ä»¶å½åï¼** - ç¨æ·æ§ä»¶ï¼`Uc{åè½å}.cs`ï¼Uc=UserControlï¼ - éæ©ç»ä»¶ï¼`Select{对象}.cs` - æ¥æ¾ç»ä»¶ï¼`UcLook{对象}.cs` - å®ä½æ¨¡åï¼`Mes{对象}.cs`ï¼éå¸¸å¨ Models/ åç®å½ï¼ ### 代ç è·¯å¾æ å° | 模å | ç©çè·¯å¾ | å½åç©ºé´ | |------|---------|---------| | BasicData | `Gs.DevApp\DevFrm\BasicData\` | `Gs.DevApp.DevFrm.BasicData` | | Work | `Gs.DevApp\DevFrm\Work\` | `Gs.DevApp.DevFrm.Work` | | WOM | `Gs.DevApp\DevFrm\WOM\` | `Gs.DevApp.DevFrm.WOM` | | Ck | `Gs.DevApp\DevFrm\Ck\` | `Gs.DevApp.DevFrm.Ck` | | Rk | `Gs.DevApp\DevFrm\Rk\` | `Gs.DevApp.DevFrm.Rk` | | QC | `Gs.DevApp\DevFrm\QC\` | `Gs.DevApp.DevFrm.QC` | | IPQC | `Gs.DevApp\DevFrm\IPQC\` | `Gs.DevApp.DevFrm.IPQC` | | FQC | `Gs.DevApp\DevFrm\FQC\` | `Gs.DevApp.DevFrm.FQC` | | RkQC | `Gs.DevApp\DevFrm\RkQC\` | `Gs.DevApp.DevFrm.RkQC` | | Warehouse | `Gs.DevApp\DevFrm\Warehouse\` | `Gs.DevApp.DevFrm.Warehouse` | | WW | `Gs.DevApp\DevFrm\WW\` | `Gs.DevApp.DevFrm.WW` | | Sales | `Gs.DevApp\DevFrm\Sales\` | `Gs.DevApp.DevFrm.Sales` | | JJGZ | `Gs.DevApp\DevFrm\JJGZ\` | `Gs.DevApp.DevFrm.JJGZ` | | BarCode | `Gs.DevApp\DevFrm\BarCode\` | `Gs.DevApp.DevFrm.BarCode` | | PDA | `Gs.DevApp\DevFrm\PDA\` | `Gs.DevApp.DevFrm.PDA` | | Rpt | `Gs.DevApp\DevFrm\Rpt\` | `Gs.DevApp.DevFrm.Rpt` | | Sys | `Gs.DevApp\DevFrm\Sys\` | `Gs.DevApp.DevFrm.Sys` | | User | `Gs.DevApp\DevFrm\User\` | `Gs.DevApp.DevFrm.User` | ### ä¸æç¼©åå¯¹ç §è¡¨ 为便äºç解代ç ä¸ç䏿æ¼é³ç¼©åï¼ä»¥ä¸æ¯å¸¸è§ç¼©åå¯¹ç §ï¼ | 缩å | 䏿 | è±æ | ç¤ºä¾ | |------|------|------|------| | **Dj** | åæ® | Document | `Frm_MesItemClDj.cs` - ææåºåºåæ® | | **Sq** | ç³è¯· | Application | `Frm_MesCgthSq.cs` - éè´éè´§ç³è¯· | | **Bl** | è¡¥æ | Supplement Material | `Frm_MesItemBl.cs` - è¡¥æç³è¯· | | **Cl** | ææ/åºæ | Material Out | `Frm_MesItemCl.cs` - ææåºåº | | **Rk** | å ¥åº | Receipt/Incoming | `Frm_MesItemTbl_RK.cs` - å ¥åºåæ® | | **Ck** | åºåº | Issue/Outgoing | `Frm_MesItemQt.cs` - å ¶ä»åºåº | | **Tbl** | å°è´¦ | Ledger | `Frm_MesItemTbl.cs` - ææå°è´¦ | | **Gx** | å·¥åº/å·¥èº | Process/Routing | `Frm_MesProcGx.cs` - å·¥èºæµç¨ | | **Wom** | 工忍¡å | Work Order Management | `Frm_Womdaa.cs` - 工忡£æ¡ | | **Daa** | æ¡£æ¡ | Archives | `Frm_Womdaa.cs` - 工忡£æ¡ | | **Caa** | ææ¬æ¡£æ¡ | Cost Archives | `Frm_Womcaa.cs` - 工忿¬åæ | | **Pba** | æ´¾å·¥æ¡£æ¡ | Production Batch Archives | `Frm_Wompba.cs` - 工忴¾å·¥ | | **Cgth** | éè´éè´§ | Purchase Return | `Frm_MesCgthSq.cs` - éè´éè´§ç³è¯· | | **Sctk** | ç产éåº | Production Return | `Frm_MesSctkSq.cs` - ç产éåºç³è¯· | | **Scrk** | çäº§å ¥åº | Production Receipt | `Frm_MesScrkDj.cs` - çäº§å ¥åºåæ® | | **Qt** | å ¶ä» | Other | `Frm_MesItemQt.cs` - å ¶ä»åºåº | | **Qtrk** | å ¶ä»å ¥åº | Other Receipt | `Frm_MesItemQtrk.cs` - å ¶ä»å ¥åº | | **Wwrk** | å§å¤å ¥åº | Outsourcing Receipt | `Frm_WwrkDetect01.cs` - å§å¤å ¥åºæ£éª | | **Cq** | æ½æ£ | Sampling Inspection | `Frm_Cqfa.cs` - æ½æ£æ¹æ¡ | | **Pc** | æäº§ | Production Scheduling | `Frm_WwPc.cs` - è½¦é´æäº§ | | **Gd** | å·¥å | Work Order | `Frm_WwGd.cs` - 车é´å·¥å | | **JJ** | 计件 | Piece-rate | `Frm_MesJJSalary.cs` - è®¡ä»¶å·¥èµ | | **JS** | è®¡æ¶ | Time-based | `Frm_MesJSSalary.cs` - 计æ¶å·¥èµ | --- ## ä¸å¡æ¨¡å详ç»åæ ## 1. BasicData/ - åºç¡æ°æ®ç®¡ç模å ## 1ï¸â£ BasicData/ - åºç¡æ°æ®ç®¡ç模å **模åèè´£ï¼** ç³»ç»åºç¡ä¸»æ°æ®çç»´æ¤å管çï¼ä¸ºå ¶ä»ä¸å¡æ¨¡åæä¾æ°æ®æ¯æ ### æ ¸å¿çªä½åè½ï¼ @@ -270,36 +401,89 @@ ## 5. WOM/ - å·¥åç®¡çæ¨¡å **模åèè´£ï¼** ç产工åçå ¨çå½å¨æç®¡çï¼ä»å·¥åå建å°å®å·¥å ¥åº **çªä½æ»æ°ï¼** 15 个主çªä½ï¼ç³»ç»ä¸æå¤§çä¸å¡æ¨¡åï¼ ### å·¥åæ ¸å¿ç®¡çï¼ - **Frm_MesWorkProd.cs** - ç产工å管ç - å·¥åå建ãç¼è¾ãå®¡æ ¸ - å·¥åç¶æè·è¸ª - 工忧è¡çæ§ - å·¥å BOM 管ç ### å·¥èºæµç¨ç®¡çï¼ - **Frm_MesProcGx.cs** - å·¥èºæµç¨ç®¡ç - **Frm_MesProcGx0.cs** - å·¥èºæµç¨åºç¡ç ### å·¥èºæµç¨ç®¡çï¼Gxç³»åï¼ï¼ - **Frm_MesProcGx.cs** - å·¥èºæµç¨ç®¡çï¼å®æ´çï¼ - å·¥èºè·¯çº¿è®¾è®¡ - å·¥åºæµç¨é ç½® - å·¥èºåæ°è®¾ç½® - **Frm_MesProcGx0.cs** - å·¥èºæµç¨ç®¡çï¼åºç¡çï¼ - ç®åçå·¥èºæµç¨é ç½® - éç¨äºç®åå·¥èºè·¯çº¿ - **Frm_MesProcGxShow.cs** - å·¥èºæµç¨å±ç¤º - å·¥èºæµç¨æ¥çåå±ç¤º - å·¥èºæ§è¡æå¯¼ - å·¥èºåå²è®°å½ ### 工忡£æ¡ç®¡çï¼ ### 工忡£æ¡ç®¡çï¼Daaç³»åï¼ï¼ - **Frm_Womdaa.cs** - 工忡£æ¡ç®¡ç - **Frm_Womdaahb.cs** - 工忡£æ¡æ±æ» - **Frm_WomdaaNbz.cs** - 工忡£æ¡å é¨è½¬ç§» - 工忡£æ¡å»ºç«åç»´æ¤ - å·¥åå®é æ§è¡è®°å½ - å·¥åç©ææ¶è追踪 ### å·¥ååæåæ´¾å·¥ï¼ - **Frm_Womcaa.cs** - 工忿¬åæ - **Frm_Wompba.cs** - 工忴¾å·¥ç®¡ç - **Frm_Womdaahb.cs** - 工忡£æ¡æ±æ» - 工忡£æ¡æ±æ»ç»è®¡ - å¤å·¥ååå¹¶åæ - æ¡£æ¡æ°æ®å¯¼åº - **Frm_WomdaaNbz.cs** - 工忡£æ¡å é¨è½¬ç§» - å·¥åå 鍿µè½¬ç®¡ç - 车é´é´å·¥å转移 - 转移记å½è¿½è¸ª ### å·¥ååæå派工ï¼Caa/Pbaç³»åï¼ï¼ - **Frm_Womcaa.cs** - 工忿¬åæï¼Cost Analysis Archivesï¼ - 工忿¬æ ¸ç® - ç©æææ¬åæ - äººå·¥ææ¬ç»è®¡ - **Frm_Wompba.cs** - 工忴¾å·¥ç®¡çï¼Production Batch Archivesï¼ - 工忴¾å·¥åé - çç»ä»»å¡ææ´¾ - 派工è¿åº¦è·è¸ª - **Frm_WompbaGx.cs** - 工忴¾å·¥å·¥åº - æ´¾å·¥å·¥åºæç»ç®¡ç - å·¥åºçº§å«ä»»å¡åé - å·¥åºå®æç¡®è®¤ ### ç¹æ®å·¥åå¤çï¼ - **Frm_WomFanGong.cs** - è¿å·¥å管ç - **FrmAutoRk.cs** - èªå¨å ¥åº - **FrmBackFlash.cs** - åå²å¤ç - è¿å·¥åå建åå®¡æ¹ - è¿å·¥æµç¨è·è¸ª - è¿å·¥è´¨é确认 - è¿å·¥ææ¬æ ¸ç® ### å·¥åå ¥åºç®¡çï¼ - **Frm_MesScrkDj.cs** - çäº§å ¥åºåæ® - **Frm_MesScrksqDj.cs** - çäº§å ¥åºç³è¯·åæ® - **FrmAutoRk.cs** - èªå¨å ¥åº - å·¥åå®å·¥èªå¨å ¥åº - æ¹éå ¥åºå¤ç - å ¥åºåæ®èªå¨çæ - **FrmBackFlash.cs** - åå²å¤ç - ç©æå岿£æ - åå²è§åé ç½® - åå²è®°å½ç®¡ç ### å·¥åå ¥åºç®¡çï¼Scrkç³»åï¼ï¼ - **Frm_MesScrkDj.cs** - çäº§å ¥åºåæ®ï¼çäº§å ¥åº-åæ®ï¼ - ç产å®å·¥å ¥åºåæ® - å ¥åºåæ®å®¡æ ¸ - å ¥åºåæ®æå° - **Frm_MesScrksqDj.cs** - çäº§å ¥åºç³è¯·åæ®ï¼çäº§å ¥åºç³è¯·-åæ®ï¼ - çäº§å ¥åºç³è¯·æµç¨ - ç³è¯·åæ®å®¡æ¹ - ç³è¯·è½¬æ£å¼å ¥åº ### è¾ å©ç»ä»¶ï¼ - **MesProcInfo.cs** - å·¥åºä¿¡æ¯ç»ä»¶ @@ -357,38 +541,66 @@ --- ## 7. WW/ - 车é´ç®¡ç模å ## 7. WW/ - 车é´ç®¡ç模å **模åèè´£ï¼** 车é´ç°åºä½ä¸åç产è°åº¦ç®¡ç **çªä½æ»æ°ï¼** 10 个主çªä½ ### 车é´ç©æç®¡çï¼ - **è¡¥æç®¡ç** - **è¡¥æç®¡çï¼Blç³»åï¼** - `Frm_WwBl.cs` - 车é´è¡¥æç³è¯· - ç产è¿ç¨ä¸çç©æè¡¥å ç³è¯· - è¡¥æéæ±åæ®å建 - è¡¥æå®¡æ¹æµç¨ - `Frm_WwBlDj.cs` - 车é´è¡¥æåæ® - è¡¥æåæ®ç®¡çåå®¡æ ¸ - è¡¥æåæ¾è®°å½ - è¡¥æåæ®æå° - **é¢æç®¡ç** - **é¢æç®¡çï¼Cl/Llç³»åï¼** - `Frm_WwCl.cs` - 车é´é¢æç³è¯· - `Frm_WwClDj.cs` - 车é´é¢æåæ® - `Frm_WwLlDj.cs` - 车é´é¢æåæ® - ç产å¼å·¥æ¶çç©æé¢ç¨ç³è¯· - æå·¥å BOM 颿 - é¢æåæ®çæ ### 车é´å°è´¦ç®¡çï¼ - `Frm_WwClDj.cs` - 车é´é¢æåæ® - é¢æåæ®å®¡æ ¸ååæ¾ - é¢æè®°å½ç®¡ç - 颿忮æå° - `Frm_WwLlDj.cs` - 车é´é¢æåæ®ï¼å¤ç¨çï¼ - 颿忮çå¦ä¸ç§å¤çæµç¨ - å¯è½ç¨äºç¹å®ä¸å¡åºæ¯ ### 车é´å°è´¦ç®¡çï¼Tblç³»åï¼ï¼ - **Frm_WwTbl.cs** - 车é´å°è´¦ - 车é´ç©æåºåå°è´¦ - 车é´å¨å¶å管ç - å°è´¦æ°æ®æ¥è¯¢åç»è®¡ - **Frm_WwTblDj.cs** - 车é´å°è´¦åæ® - å°è´¦åæ®ç®¡ç - å°è´¦è°æ´è®°å½ - å°è´¦çç¹åè½ ### ç产è°åº¦ç®¡çï¼ - **Frm_WwPc.cs** - è½¦é´æäº§ç®¡ç - ç产计åå¶å® - **Frm_WwPc.cs** - è½¦é´æäº§ç®¡çï¼Pc=æäº§ï¼ - ç产计åå¶å®åä¸è¾¾ - 产è½å¹³è¡¡åæ - ç产è°åº¦ä¼å - èµæºè´è·åæ - **Frm_WwGd.cs** - 车é´å·¥å管ç - 车é´å·¥ååé - **Frm_WwGd.cs** - 车é´å·¥å管çï¼Gd=å·¥åï¼ - 车é´å·¥ååé åæ¥æ¶ - 工忧è¡è·è¸ª - å·¥åå®æç¡®è®¤ - å·¥åè¿åº¦æ±æ¥ - **Frm_ProductionOrder.cs** - ç产订å管ç - ç产订åå建 - è®¢åæ§è¡çæ§ - ç产订åå建åç»´æ¤ - è®¢åæ§è¡çæ§åçæ¿ - 订å交æç®¡ç - 订åä¼å çº§è°æ´ ### è¾ å©ç»ä»¶ï¼ - **SelectWwPc.cs** - è½¦é´æäº§éæ© @@ -625,60 +837,129 @@ ## 15. User/ - ç¨æ·ç®¡ç模å **模åèè´£ï¼** ç¨æ·æéåè§è²ç®¡ç **çªä½æ»æ°ï¼** 6 个主çªä½ **å½åç¹ç¹ï¼** æ¤æ¨¡å使ç¨ç®åç±»åï¼UserãRoleï¼ï¼ä¸ä½¿ç¨ Frm_ åç¼ ### ç¨æ·ç®¡çï¼ - **User.cs** - ç¨æ·ç®¡ç - ç¨æ·è´¦æ·å建 - ç¨æ·ä¿¡æ¯ç»´æ¤ - ç¨æ·ç¶æç®¡ç - **User.cs** - ç¨æ·ç®¡çï¼ä¸»çªä½ï¼ - ç¨æ·è´¦æ·å建ãç¼è¾ãå é¤ - ç¨æ·åºæ¬ä¿¡æ¯ç»´æ¤ - ç¨æ·ç¶æç®¡çï¼å¯ç¨/ç¦ç¨ï¼ - ç¨æ·ç»ç»å½å±è®¾ç½® - è·¯å¾ï¼`Gs.DevApp/DevFrm/User/User.cs` - **UserSetPwd.cs** - ç¨æ·å¯ç 设置 - 管çåéç½®ç¨æ·å¯ç - å¯ç çç¥ç®¡ç - å¯ç éç½®åè½ - å¯ç å¤æåº¦éªè¯ - å¯ç å®å ¨æ£æ¥ ### è§è²ç®¡çï¼ - **Role.cs** - è§è²ç®¡ç - è§è²å®ä¹åå建 - è§è²æéåé - è§è²å±çº§ç®¡ç - **ViewRole.cs** - è§è²æ¥ç - è§è²ä¿¡æ¯å±ç¤º - æéæç»æ¥è¯¢ - è§è²ä½¿ç¨ç»è®¡ ### æéåé ï¼ - **UserSelectRole.cs** - ç¨æ·éæ©è§è² - ç¨æ·è§è²å ³è - å¤è§è²åé - ç¨æ·è§è²å ³èååé - æ¯æå¤è§è²åé - è§è²æéæ¥ç - è§è²åæ¢åè½ ### è§è²ç®¡çï¼ - **Role.cs** - è§è²ç®¡çï¼ä¸»çªä½ï¼ - è§è²å®ä¹åå建 - è§è²ä¿¡æ¯ç»´æ¤ - è§è²å±çº§ç®¡ç - è§è²ç¶æç®¡ç - è·¯å¾ï¼`Gs.DevApp/DevFrm/User/Role.cs` - **ViewRole.cs** - è§è²æ¥ç - è§è²ä¿¡æ¯å±ç¤ºåæ¥è¯¢ - æéæç»æ¥è¯¢ - è§è²ä½¿ç¨ç»è®¡ - å ³èç¨æ·å表 - **RoleSelectAction.cs** - è§è²éæ©æé - åè½æéåé - åè½æéåé ï¼Action级å«ï¼ - æéç©éµç®¡ç - èåæéé ç½® - æé®æéæ§å¶ - æéç»§æ¿å ³ç³» --- ## æ»ç» DevFrmç®å½ç»ææ¸ æ°ï¼æä¸å¡åè½æ¨¡ååç»ç»ï¼ä½ç°äºå®æ´çå¶é æ§è¡ç³»ç»ä¸å¡æµç¨ï¼ DevFrmç®å½ç»ææ¸ æ°ï¼æä¸å¡åè½æ¨¡ååç»ç»ï¼ä½ç°äºå®æ´çå¶é æ§è¡ç³»ç»ä¸å¡æµç¨ã ### ä¸å¡æµç¨éç¯ï¼ 1. **åºç¡æ°æ®** â **å·¥å管ç** â **ç产ä½ä¸** â **è´¨éæ§å¶** â **ä»åºç®¡ç** â **éå®åè´§** 2. **éè´å ¥åº** â **çäº§é¢æ** â **车é´ä½ä¸** â **æåå ¥åº** â **è´¨éæ£éª** â **客æ·äº¤ä»** ### 模åè§æ¨¡ç»è®¡ ### ææ¯ç¹ç¹ï¼ - éç¨Windows Forms + DevExpress UIæ¡æ¶ - MDIå¤ææ¡£çé¢è®¾è®¡ - 模ååç»ä»¶å¤ç¨ - ç»ä¸çæ°æ®å®ä½æ¨¡å - å®åçæéæ§å¶ä½ç³» **æ»ä½è§æ¨¡ï¼** - **æ¨¡åæ»æ°ï¼** 18 个ä¸å¡å模å + 1 个主çªä½ï¼FrmMainï¼ - **çªä½æ»æ°ï¼** 136 个主çªä½ï¼ä¸å« Designer.cs æä»¶ï¼ - **代ç è·¯å¾ï¼** `E:\LanBMes\LB_MesClient\DevApp\Gs.DevApp\DevFrm\` ### æ©å±æ§ï¼ - æ¸ æ°ç模åè¾¹çï¼ä¾¿äºåè½æ©å± - 丰å¯çè¾ å©ç»ä»¶ï¼æ¯æä¸å¡å®å¶ - ç»ä¸çå¼å模å¼ï¼éä½ç»´æ¤ææ¬ **模åè§æ¨¡åå¸ï¼** è¯¥æ¶æä¸ºå¶é ä¼ä¸æä¾äºå®æ´çä¿¡æ¯åè§£å³æ¹æ¡ï¼è¦çäºä»åºç¡æ°æ®ç®¡çå°ç产æ§è¡ãè´¨éæ§å¶ãä»å¨ç©æµçå ¨ä¸å¡æµç¨ã | è§æ¨¡åç±» | æ¨¡åæ° | 模åå表 | |---------|--------|---------| | **è¶ å¤§åï¼10+çªä½ï¼** | 3 | WOM(15)ãCk(12)ãBasicData(11) | | **大åï¼7-9çªä½ï¼** | 6 | WW(10)ãWarehouse(9)ãSales(9)ãQC(8)ãRkQC(8)ãRk(7)ãWork(7)ãJJGZ(7) | | **ä¸åï¼3-6çªä½ï¼** | 5 | IPQC(6)ãUser(6)ãSys(4)ãFQC(3)ãPDA(3) | | **å°åï¼1-2çªä½ï¼** | 2 | Rpt(1)ãBarCode(1) | ### ä¸å¡æµç¨éç¯ **宿´ä¸å¡é¾ï¼** 1. **åºç¡æ°æ®é ç½®** (BasicData) â **éå®è®¢å** (Sales) â **å·¥å管ç** (WOM) â **ç产派工** (WOM) 2. **çäº§é¢æ** (Ck) â **车é´ä½ä¸** (Work/WW) â **è¿ç¨æ£éª** (IPQC) â **å®å·¥å ¥åº** (WOM/Rk) 3. **æç»æ£éª** (FQC) â **ä»åºç®¡ç** (Warehouse) â **éå®åè´§** (Sales) â **客æ·äº¤ä»** **è´¨éæ§å¶ä½ç³»ï¼** QC(éç¨é ç½®) â RkQC(æ¥ææ£éª) â IPQC(è¿ç¨æ£éª) â FQC(æç»æ£éª) **åºå管çä½ç³»ï¼** éè´å ¥åº(Rk) â çäº§é¢æ(Ck) â 车é´è¡¥æ(WW) â æåå ¥åº(Rk) â åè´§åºåº(Ck) ### ææ¯ç¹ç¹ - **UIæ¡æ¶ï¼** Windows Forms + DevExpress v22.2 æ§ä»¶å¥ä»¶ - **ç颿¨¡å¼ï¼** FluentDesignForm + 夿 ç¾é¡µï¼XtraTabControlï¼ - **çªä½å è½½ï¼** 卿åå°å è½½ï¼è¿è¡æ¶æ ¹æ®èåæéå®ä¾åï¼ - **æ°æ®éä¿¡ï¼** éä¸å¼ HTTP REST APIï¼`UtilityHelper.HttpPost()`ï¼ - **ç»ä»¶å¤ç¨ï¼** 150+ å¯å¤ç¨ UserControl ç»ä»¶ï¼`Gs.DevApp/UserControl/`ï¼ - **æ°æ®æ¨¡åï¼** ç»ä¸çå®ä½æ¨¡åï¼Entity/ã忍¡åç Models/ åç®å½ï¼ - **æéæ§å¶ï¼** åºäºè§è²çæéä½ç³»ï¼User 模å + èå卿å è½½ï¼ ### æ¶æä¼å¿ **æ¸ æ°ç模åè¾¹çï¼** - æä¸å¡ååç´ååï¼BasicDataãWorkãWOMãQCçï¼ - æ¯ä¸ªæ¨¡åç¬ç«ç®¡çèªå·±ççªä½åè¾ å©ç»ä»¶ - 模åé´éè¿å端 API åå®ä½æ¨¡åæ¾è¦å **丰å¯çè¾ å©ç»ä»¶ï¼** - 60+ æ°æ®éæ©æ§ä»¶ï¼`UcLook*.cs`ï¼ - ç»ä¸ç CRUD å·¥å ·æ ï¼`UcToolBarMenu.cs`ï¼ - å页æ§ä»¶ãåå ¸éæ©å¨ãToast éç¥ç **ç»ä¸çå¼å模å¼ï¼** - æ åçå½åè§èï¼`Frm_{ä¸å¡å}.cs`ï¼User 模åé¤å¤ï¼ - ä¸è´ç HTTP è°ç¨æ¨¡å¼ï¼`UtilityHelper.HttpPost()`ï¼ - ç»ä¸çæ¶æ¯æç¤ºï¼`MsgHelper`ï¼åæ¥å¿è®°å½ï¼`LogHelper`ï¼ - æ ååç Grid åå§åï¼`UtilityHelper.InitGridControl()`ï¼ **è¯å¥½ç坿©å±æ§ï¼** - æ°å¢æ¨¡ååªéæ·»å æä»¶å¤¹åçªä½ï¼å端é ç½®èåå³å¯ - æ¯æå·¥èºæµç¨å®å¶ï¼å¤çæ¬çªä½ï¼GxãGx0ãGxShowï¼ - æ¯æå¤ç§æ£éªæ¨¡å¼ï¼Detect01ãDetect01H5ãDetect01Inputï¼ - ç§»å¨ç«¯éææ¯æï¼PDA 模å + H5 çæ¬çªä½ï¼ ### åºç¨åºæ¯ è¯¥æ¶æä¸ºå¶é ä¼ä¸æä¾äºå®æ´ç MES ä¿¡æ¯åè§£å³æ¹æ¡ï¼è¦çï¼ - â **åºç¡æ°æ®ç®¡ç**ï¼å®¢æ·ãä¾åºåãç©æãä»åºãé¨é¨ãåå·¥ - â **çäº§è®¡åæ§è¡**ï¼å·¥åå建ãå·¥èºè·¯çº¿ã派工ãè¿åº¦è·è¸ª - â **车é´ç°åºç®¡ç**ï¼å¼å·¥æ¥å·¥ãæ°æ®ééãè¡¥æãè¿ä¿® - â **è´¨é管çä½ç³»**ï¼IQCãIPQCãFQC å ¨æµç¨è´¨éæ§å¶ - â **ä»å¨ç©æµç®¡ç**ï¼åºå ¥åºãè°æ¨ãæ¡ç 管çãå§æå å·¥ - â **éå®å货管ç**ï¼è®¢å管çãåè´§ãéè´§å¤ç - â **ææ¬æ ¸ç®ç®¡ç**ï¼è®¡ä»¶å·¥èµã计æ¶å·¥èµãè夿ç - â **æ¥è¡¨æ¥è¯¢åæ**ï¼åä¸å¡åæ¥è¡¨ãFastReport éæ - â **ç³»ç»é 置管ç**ï¼ç¨æ·æéãè§è²ç®¡çãç³»ç»åæ° è¯¥ç³»ç»éç¨äºç¦»æ£å¶é ãçµåè£ é ãæºæ¢°å å·¥çè¡ä¸ï¼æ¯æå¤å·¥åãå¤è½¦é´ãå¤ç»ç»çä¼ä¸çº§åºç¨åºæ¯ã DevApp/Gs.DevApp/DevFrm/FrmLogin.resx
@@ -121,20 +121,20 @@ <data name="btnCancel.ImageOptions.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value> iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABF0RVh0VGl0 bGUAQ2xvc2U7RXhpdDsFGf+FAAAArElEQVQ4T7XSOwoCQRCE4c0E8XEDQTMRA+/gTTykGBuYGm6olxBE tP1LHGl1WoZVg2+DYrqYZrYys6/cPvVibk38teBUkkUFNcbYuGyFCXYuyxYcMYSyPlSi4fY9m+KMsECW aEF5D2m4gzUeZ6MC8SXZYflU4K8taZ2nc1GBH+4i3eStJFdwwABpWNf268xwQVggW4zgd1aJnnbvsrBA 9JyvWfGPVOx3Bc1ZdQWpA3U147gCvgAAAABJRU5ErkJggg== bGUAQ2xvc2U7RXhpdDsFGf+FAAAAqElEQVQ4T7WSMQoCQRRDtxNk1RsIaydi4R1ykxxSrC1sLVPqJQQR HfnLCJ913BlcLTJFII+EP1UIoRqi9hERvtFfAbcS7xNAIpYiDs7biViJOOUAVxGNCPNmEWLhcfTWIu59 ANNWxCgGpi5ci9jnGqQgyXAO4Gv7OUUAH564Jm+QFOAiYu7CVtvP2Yh49AFMRxGLzmaD2GnPuQYv2Tm7 XvFHKtbvAEP0BKkDdTUPi1CNAAAAAElFTkSuQmCC </value> </data> <data name="btnLogin.ImageOptions.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value> iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACB0RVh0VGl0 bGUATmV3O05ld0VtcGxveWVlO05ld1BlcnNvbjveWVScAAAA3ElEQVQ4T5WOPQ5BQRSF3wYsgohCJXRq PRWJJaktgFLUOjsQ0egURKEgaj/NOEfuyJl5E4/iy8y5c7+Tyc6LruI0O+cKUbEVnUkhxhd4ycOcDUdL cgVjULKcK1AxyCbwJBPLuYKiH/iCm+VkgZf0VJlcKJNUgRZ9sshkRpkEBRr8AmiCJ/Ay75z9XED64GQM bPZGnSDYAsUjqFgmZXAAPWZ1goDHBngAfnsDqqAGtjbjW12duGBui9+YqhMXnKPlFCd14oJ9tJxip05c 0AFrcLdlhbMVaKsTFPyPy16LX4vunIH/egAAAABJRU5ErkJggg== bGUATmV3O05ld0VtcGxveWVlO05ld1BlcnNvbjveWVScAAAA10lEQVQ4T52RPQoCMRCF9wIeQhELK9HO 2l4rhTnS1B5AS7G2ezcQsbGzUCy2WLH2p4kMJDBmx0QsPrJvkvcRskW1GRcKp7NzLosuDqK1dtgiCEIp ILkghnAjxpwYDZ9rAl38yL4gq7D4JsjdIAjuKYH5BqosXFMC8y9EgpUp0CEcIEafGC9Vlm+Z/SwQpsQo PTO9lxNI8UKMlio1iXEmxiQn6BHj6a+9J0abGB1iHPxM9ropwTp6OItlSlAZhZgyJTgZhZhjSjAixo4Y D6Mosy0xhl8F//AGi1+L7i5kYh4AAAAASUVORK5CYII= </value> </data> </root> DevApp/Gs.DevApp/DevFrm/QC/MesQcExceptional.cs
@@ -252,16 +252,20 @@ // è·åå½åæç»è¡çGUID Guid? _guid = UtilityHelper.ToGuid(row["guid"].ToString()); // æ·»å æç»é¡¹å°è¯·æ±å¯¹è±¡ // 说æï¼ // â æ§é»è¾ä½¿ç¨ row["process"].ToString()ï¼åå°åªè¦æååæ¹æ processName/gs003 æåå¨å¤§å°åå·®å¼ï¼å°±ä¼æåº âColumn 'process' does not belong to tableâ å¼å¸¸ï¼ // â¡ GetRowString ä¼å¨ DataTable 䏿ä¸åºå大å°åçæ¹å¼é个å¹é åéååï¼å¹¶æ DBNull/null ç»ä¸è½¬æ¢ä¸ºç©ºå符串ï¼å ¼å®¹ä¸åæ¥å£ä¸å岿°æ®ï¼ // â¢ åæ®µå表æä¾å¤ä¸ªåéå¼ï¼process/processName/processDesc/processWay/gs003ï¼ï¼ç¡®ä¿åç«¯åæ®µå½åè°æ´æ¶ä»è½æåä¿åã _obj.list.Add(new { Guid = _guid, BatchQty = (row["batchQty"].ToString()), // æ¹æ¬¡æ°é GfRkqty = (row["gfRkqty"].ToString()), // åæ ¼å ¥åºæ°é LfRkqtyz = (row["lfRkqty"].ToString()), // ä¸åæ ¼å ¥åºæ°é HandResult = (row["handResult"].ToString()), // éå«ç±»å ChooseType = (row["chooseType"].ToString()), // å¤çæè§ Process = (row["process"].ToString()), // éææ¹å¼ BatchQty = GetRowString(row, "batchQty"), // æ¹æ¬¡æ°é //GfRkqty = GetRowString(row, "gfRkqty"), // åæ ¼å ¥åºæ° //LfRkqtyz = GetRowString(row, "lfRkqty"), // 临æ¾å ¥åºæ° HandResult = GetRowString(row, "handResult"), // éå«æè§ ChooseType = GetRowString(row, "chooseType"), // å¼å¸¸ç±»å« Process = GetRowString(row, "process"), // éææ¹å¼ }); } } @@ -430,6 +434,7 @@ // å°æç»æ°æ®çJSONæ°ç»è½¬æ¢ä¸ºDataTableï¼éåä½ä¸ºç½æ ¼æ§ä»¶çæ°æ®æºï¼ DataTable dt = JsonConvert.DeserializeObject<DataTable>(array.ToString()); EnsureProcessColumn(dt); // è¥æç»æ°æ®åå¨ï¼DataTableè¡æ°>0ï¼ if (dt.Rows.Count > 0) @@ -465,6 +470,124 @@ } } /// <summary> /// ç»ä¸å°è£ DataRow åæ®µè¯»åé»è¾ï¼æç §åéåååè¡¨ä¾æ¬¡æ¥æ¾çå®åï¼å¿½ç¥å¤§å°åå¹¶è§é¿ DBNullã /// </summary> /// <param name="row">å½å循ç¯å°ç DataRowï¼è¥ä¸º null ç´æ¥è¿å空å符串ã</param> /// <param name="columnCandidates">æä¼å 级æåçåéååéåï¼ä¾å¦ process/processName/gs003ï¼ã</param> /// <returns>å¹é å°çåå¼ï¼è¥ææåéååä¸å卿å¼ä¸º DBNullï¼åè¿å string.Emptyã</returns> /// <remarks> /// MesQcExceptional çä¿åå¨ä½ä¾èµè¯¥æ¹æ³ï¼ä»¥å ¼å®¹å端æ¥å£å段æ¹åæå¤§å°åå·®å¼ï¼é¿å 忬¡åºç° âColumn 'process' does not belong to tableâ å¼å¸¸ã /// </remarks> private static string GetRowString(DataRow row, params string[] columnCandidates) { if (row == null || row.Table == null || columnCandidates == null) return string.Empty; foreach (var candidate in columnCandidates) { if (string.IsNullOrEmpty(candidate)) continue; var match = FindMatchingColumn(row.Table, candidate); if (!string.IsNullOrEmpty(match)) return NormalizeValue(row[match]); } return string.Empty; } private static string FindMatchingColumn(DataTable table, string columnName) { if (table == null || string.IsNullOrEmpty(columnName)) return null; foreach (DataColumn column in table.Columns) { if (string.Equals(column.ColumnName, columnName, StringComparison.OrdinalIgnoreCase)) return column.ColumnName; } return null; } private static string FindFirstAvailableColumn(DataTable table, params string[] candidates) { if (table == null || candidates == null) return null; foreach (var candidate in candidates) { var match = FindMatchingColumn(table, candidate); if (!string.IsNullOrEmpty(match)) return match; } return null; } private static bool HasColumnExact(DataTable table, string columnName) { if (table == null || string.IsNullOrEmpty(columnName)) return false; foreach (DataColumn column in table.Columns) { if (string.Equals(column.ColumnName, columnName, StringComparison.Ordinal)) return true; } return false; } private static void CopyColumn(DataTable table, string sourceColumnName, string targetColumnName) { if (table == null || string.IsNullOrEmpty(sourceColumnName) || string.IsNullOrEmpty(targetColumnName)) return; if (!HasColumnExact(table, targetColumnName)) table.Columns.Add(targetColumnName, typeof(string)); foreach (DataRow row in table.Rows) { row[targetColumnName] = NormalizeValue(row[sourceColumnName]); } } /// <summary> /// å¨ç»å® gvMx1 æç»åç¡®ä¿ DataTable ä¸åå¨å为 process çåï¼ /// 1. ä¼å å¤ç¨ä¸åºå大å°åå¹é å°çåååï¼ä¿è¯ GridColumn23 çç»å®ä¸åå½±åï¼ /// 2. è¥æ åååï¼åå°è¯ä½¿ç¨å¸¸è§å«åï¼processName/processDesc/processWay/gs003ï¼å¤å¶çæï¼ /// 3. è¥ä»æ æ³å®ä½ææåï¼åå建空ç process åï¼é¿å åç«¯è®¿é®æ¶æåºåä¸åå¨å¼å¸¸ã /// </summary> /// <param name="table">æ¥å£è¿åçæç» DataTableã</param> private static void EnsureProcessColumn(DataTable table) { if (table == null) return; var existing = FindMatchingColumn(table, "process"); if (!string.IsNullOrEmpty(existing)) { if (!HasColumnExact(table, "process")) CopyColumn(table, existing, "process"); return; } var fallback = FindFirstAvailableColumn(table, "processName", "processDesc", "processWay", "gs003"); if (string.IsNullOrEmpty(fallback)) { if (!HasColumnExact(table, "process")) table.Columns.Add("process", typeof(string)); return; } CopyColumn(table, fallback, "process"); } private static string NormalizeValue(object value) { return value == null || value == DBNull.Value ? string.Empty : value.ToString(); } /// <summary> /// å·¥å ·æ¡äºä»¶ /// </summary> /// <param name="inFieldValue"></param> DevApp/HELP.md
@@ -1,107 +1,1474 @@ # èå® MES 客æ·ç«¯å¸®å©æå # èå® MES 客æ·ç«¯å¸®å©æå (G-MES V2.0) > **LanBMes MES Client** æ¯åºäº .NET Framework 4.8 å DevExpress WinForms æå»ºçä¼ä¸çº§å¶é æ§è¡ç³»ç»(MES)æ¡é¢åºç¨ç¨åº,为å¶é è½¦é´æä¾å ¨é¢çç产æ§è¡ãä»å¨ç®¡çãè´¨éæ§å¶åæ¥è¡¨åæè½åã ## ç®å½ - [1. é¡¹ç®æ¦è§](#1-é¡¹ç®æ¦è§) - [2. è§£å³æ¹æ¡ç»æ](#2-è§£å³æ¹æ¡ç»æ) - [3. æ ¸å¿ææ¯æ ](#3-æ ¸å¿ææ¯æ ) - [4. å¼åç¯å¢é ç½®](#4-å¼åç¯å¢é ç½®) - [5. æå»ºä¸è¿è¡](#5-æå»ºä¸è¿è¡) - [6. DevFrm åè½æ¨¡å详解](#6-devfrm-åè½æ¨¡å详解) - [7. æ¶æä¸è®¾è®¡æ¨¡å¼](#7-æ¶æä¸è®¾è®¡æ¨¡å¼) - [8. å·¥å ·ç±»ä¸å ¬å ±ç»ä»¶](#8-å·¥å ·ç±»ä¸å ¬å ±ç»ä»¶) - [9. é 置说æ](#9-é 置说æ) - [10. é¨ç½²æå](#10-é¨ç½²æå) - [11. å¼åè§è䏿佳å®è·µ](#11-å¼åè§è䏿佳å®è·µ) - [12. 常è§é®é¢ä¸æ éææ¥](#12-常è§é®é¢ä¸æ éææ¥) --- ## 1. é¡¹ç®æ¦è§ - **è§£å³æ¹æ¡åç§°**ï¼`GsDevSolution.sln` - **主è¦ç¨é**ï¼é¢åå¶é ç°åºç MES Windows 客æ·ç«¯ï¼è¦çç产ãä»å¨ãè´¨æ£ãç³»ç»é ç½®çä¸å¡ã - **æ ¸å¿åºç¨**ï¼`Gs.DevApp`ï¼DevExpress WinForms 客æ·ç«¯ï¼ï¼è¾ 以称éééç«ç¹ä¸å®è£ ç¨åºã ### 1.1 åºæ¬ä¿¡æ¯ | é¡¹ç® | 说æ | |------|------| | **è§£å³æ¹æ¡åç§°** | `GsDevSolution.sln` | | **产ååç§°** | G-MES V2.0 | | **主è¦ç¨é** | é¢åå¶é ç°åºç MES Windows 客æ·ç«¯ | | **æ ¸å¿åºç¨** | `Gs.DevApp` (主客æ·ç«¯) | | **è¾ å©åºç¨** | `Gs.WeightIqc` (IQCç§°é), `Gs.WeightLine` (产线称é) | | **å¼åç¯å¢** | Visual Studio 2022+ | | **ç®æ æ¡æ¶** | .NET Framework 4.8 | | **æå»ºå¹³å°** | Any CPU | ### 1.2 æ ¸å¿ç¹æ§ - â **ç°ä»£å UI**: åºäº DevExpress v22.2 ç FluentDesign çé¢ - â **卿å è½½**: éè¿åå°æºå¶å®ç°èååçªä½ç卿å è½½ - â **æéæ§å¶**: åºäºè§è²çèåæéåæä½æé管ç - â **å¯å¤ç¨ç»ä»¶**: 150+ ä¸å¡æ§ä»¶,æé«å¼åæç - â **夿°æ®åºæ¯æ**: å ¼å®¹ Oracle å SQL Server - â **èªå¨æ´æ°**: éæ AutoUpdater.NET å®ç°èªå¨å级 - â **åµå ¥å¼æµè§å¨**: CefSharp æ¯æ H5 页é¢éæ - â **å·¥ä¸éä¿¡**: NModbus æ¯æ Modbus TCP/RTU 设å¤éä¿¡ - â **éä¸å¼æ¥å¿**: ç»ä¸çæ¥å¿è®°å½åé误追踪æºå¶ ### 1.3 ä¸å¡è¦çèå´ ``` åºç¡æ°æ®ç®¡ç â ç产计å â å·¥å管ç â ç产æ§è¡ â è´¨éæ£éª â ä»å¨ç©æµ â æ¥è¡¨åæ â â â â â â â 客æ·/ä¾åºå æäº§è°æ´ ä»»å¡ä¸è¾¾ å·¥åºå¼å·¥ å¤çº§è´¨æ£ åºå ¥åºç®¡ç FastReport ç©æä¸»æ°æ® 产线åé æµç¨å¡ æ°æ®éé 缺é·è¿½è¸ª åºåè°æ¨ ç»è®¡åæ å·¥è£ è®¾å¤ èµæºåè° è¿åº¦è¿½è¸ª è¿å·¥ç»´ä¿® AQLæ½æ · æ¡ç 管ç èªå®ä¹æ¥è¡¨ ``` --- ## 2. è§£å³æ¹æ¡ç»æ | ç®å½ | 说æ | | --- | --- | | `Gs.DevApp/` | 主客æ·ç«¯é¡¹ç®ï¼å å«å ¨é¨ä¸å¡çªä½ãå·¥å ·åºãèµæºåé ç½®ã | | ââ `DevFrm/` | ä¸å¡çªä½ï¼æé¢åååï¼`BasicData/` åºç¡æ°æ®ã`Work/` å¶ç¨ã`QC/` è´¨æ£ã`Sys/` ç³»ç»è®¾ç½®çï¼ã | | ââ `Entity/` | DTO ä¸éç¨æ¨¡åï¼å¦ `PageQueryModel`ã`ReturnModel`ï¼ã | | ââ `ToolBox/` | å ¬å ±å·¥å ·ç±»ï¼HTTPãæ¥å¿ãModbusãå¯¹è¯æ¡å è£ çï¼ã | | ââ `UserControl/` | å¯å¤ç¨æ§ä»¶ï¼å·¥å ·æ ãåé¡µãæ°æ®åå ¸ãæ¥è¯¢éæ©å¨çï¼ã | | `Gs.WeightIqc/` | IQC æ¥æç§°é客æ·ç«¯ï¼è´è´£ä¸²å£/Modbus ééä¸ä¸ä¼ ã | | `Gs.WeightLine/` | 产线称é客æ·ç«¯ï¼æ¯æå¤æ¡çº¿ä½åæ¢ä¸å®æ¶çæ§ã | | `Gs.Setup/` | Visual Studio Installer 项ç®ï¼`.vdproj`ï¼ï¼ç¨äºæå åå¸ã | | `packages/` | NuGet ç¼åç®å½ï¼å å« DevExpressãCefSharpãNModbusãSystem.* ä¾èµã | ### 2.1 项ç®ç»æ ## 3. æ ¸å¿ææ¯æ - **.NET Framework 4.8 / C# WinForms**ï¼åºç¨åºç¡æ¡æ¶ã - **DevExpress v22.2**ï¼UI ç»ä»¶ï¼FluentDesignãXtraGridãXtraTabãWaitDialog çï¼ã - **CefSharp 109 + AutoUpdater.NET**ï¼åµå ¥å¼æµè§å¨ä¸å¯éçèªå¨æ´æ°è½åã - **NModbusãSerialPort**ï¼å·¥ä¸è®¾å¤éä¿¡ï¼æ¶µç TCP ä¸ RTUã - **Newtonsoft.JsonãConfigurationManager**ï¼API æ°æ®è§£æä¸é 置读åã - **Oracle.ManagedDataAccessãSystem.Data.SqlClient**ï¼æåºæ¯è®¿é® Oracle æ SQL Serverã ``` GsDevSolution/ âââ Gs.DevApp/ ã主客æ·ç«¯é¡¹ç®ã â âââ DevFrm/ - 18个ä¸å¡é¢å模å (150+ çªä½) â â âââ BasicData/ - åºç¡æ°æ® (客æ·/ä¾åºå/ç©æ/产线) â â âââ Work/ - ç产æ§è¡ (å¼å·¥/æ°æ®éé/è¿å·¥) â â âââ WOM/ - å·¥å管ç (ä»»å¡ä¸è¾¾/æäº§) â â âââ QC/ - è´¨é管çéç¨æ¨¡å â â âââ IPQC/ - å¶ç¨æ£éª (é¦ä»¶/å·¡æ£) â â âââ FQC/ - æåç»æ£ â â âââ RkQC/ - æ¥æè´¨æ£ â â âââ Ck/ - åºåºç®¡ç (颿/è¡¥æ/éè´§) â â âââ Rk/ - å ¥åºç®¡ç (æ¥æ/éåº/å ¶ä») â â âââ Warehouse/ - ä»åºæä½ (è°æ¨/çç¹/æ¡ç ) â â âââ Sales/ - éå®è®¢åä¸åè´§ â â âââ WW/ - å§å¤ç®¡ç â â âââ Rpt/ - æ¥è¡¨è®¾è®¡ä¸æ§è¡ â â âââ Sys/ - ç³»ç»è®¾ç½® (èå/ç»ç»/åå·è§å) â â âââ User/ - ç¨æ·ä¸æé管ç â â âââ JJGZ/ - å¤¹å ·å·¥è£ ä¸è®¾å¤å°è´¦ â â âââ BarCode/ - æ¡ç çæä¸æå° â â âââ PDA/ - ææç»ç«¯çé¢ â âââ Entity/ - æ°æ®ä¼ è¾å¯¹è±¡ (DTO) â âââ ToolBox/ - å ¬å ±å·¥å ·ç±» â âââ UserControl/ - å¯å¤ç¨æ§ä»¶åº (150+) â âââ Resources/ - èµæºæä»¶ (徿 /å¾ç) â âââ App.config - åºç¨é ç½®æä»¶ â âââ Program.cs - åºç¨ç¨åºå ¥å£ âââ Gs.WeightIqc/ ãIQC ç§°é客æ·ç«¯ã âââ Gs.WeightLine/ ã产线称é客æ·ç«¯ã âââ Gs.Setup/ ãå®è£ ç¨åºé¡¹ç®ã(.vdproj) âââ packages/ ãNuGet å ç®å½ã ``` ## 4. DevFrm åè½æ¨¡å详解 ### 2.2 æ ¸å¿ç®å½è¯¦è§£ ### 4.1 ç»å½ä¸ä¸»æ¡æ¶ - `Program.cs`ï¼åå®ä¾å®æ¤ãCefSharp åå§åãå¯å¨ç»å½æµç¨ã - `FrmLogin`ï¼èªå¨æ´æ°ï¼AutoUpdater.NETï¼ãåä½å è½½ãè´¦å·è®°å¿ãè°ç¨ `User/UserLogin`ã - `FrmMain`ï¼DevExpress FluentDesign 主çé¢ï¼è´è´£èåæ å è½½ï¼`User/GetUserLoginInfo`ï¼ã页ç¾çå½å¨æãç»ç»åæ¢ãåºé¨ç¶ææ åçªå£é´äºä»¶ä¼ éã #### DevFrm/ - ä¸å¡çªä½ ### 4.2 åºç¡æ°æ®å - **`BasicData/`**ï¼ç»´æ¤ç³»ç»ä¸»æ°æ®ãå ¸åçªä½å æ¬ `Frm_Customer`ï¼å®¢æ·ï¼ã`Frm_Supplier` & `Frm_SupplierSrm`ï¼ä¾åºåä¸ SRM å ³ç³»ï¼ã`Frm_MesItems`/`Frm_MesItemsShow`ï¼ç©æï¼ã`Frm_MesWorkshopLine`ï¼äº§çº¿ï¼ã`Frm_Staff`ã`Frm_Department` çã - **`BarCode/`**ï¼æ¡ç æ¹éçæãæå°æ¨¡æ¿è®¾ç½®ï¼å¸¸è§çªä½å¦ `Frm_BarcodePrint`, `Frm_BarcodeTemplate`ã - **`JJGZ/`**ï¼å¤¹å ·å·¥è£ å设å¤ç¹æ£ç¸å ³ä¸»æ°æ®ï¼ç»´æ¤å·¥è£ å°è´¦ãç¹æ£é¡¹ç®ã ææä¸å¡çªä½æé¢ååå,æ¯ä¸ªåç®å½å å«è¯¥é¢åçææè¡¨ååå¯¹è¯æ¡ã ### 4.3 ä»å¨ç®¡çå - **`Ck/`ï¼åºåºï¼**ï¼è¦çææãè¡¥æãå ¶ä»ãéè´§ãå§å¤çåºåºæµç¨ï¼å¦ `Frm_MesItemBl`ï¼è¡¥æåºåºï¼ã`Frm_MesCgthSq`ï¼éè´éè´§ç³è¯·ï¼ã`Frm_MesInvItemOut_SCLL`ï¼çäº§é¢æåºåºï¼ã - **`Rk/`ï¼å ¥åºï¼**ï¼æ¥æãéåºåæé¡¹å ¥åºï¼å¦ `Frm_MesInvItemArn`ï¼å°è´§å ¥åºï¼ã`Frm_MesItemTbl`ï¼ææå ¥åºå°è´¦ï¼ã`Frm_MesItemQtrk`ï¼å ¶ä»å ¥åºï¼ã - **`Warehouse/`**ï¼åºå æä½ä¸æ¡ç ç»´æ¤ï¼å å« `Frm_MesDbck`ï¼è°æ¨åºåºï¼ã`Frm_MesRohIn`ï¼åæå ¥åºï¼ã`Frm_ArrivalBarcode`ã`Frm_InitialBarcode` çæ¡ç å¤çã - **`PDA/`**ï¼ä¸ææè®¾å¤äº¤äºçç®åçé¢ï¼æä¾æ«ç ãçè´§ãçç¹çç°åºå¨ä½ã **å½åè§è**: `Frm_{ä¸å¡åç§°}.cs` æ `Frm_{ä¸å¡åç§°}_{åç±»å}.cs` ### 4.4 è´¨é管çå - **`QC/`**ï¼è´¨ééç¨æ¨¡åä¸åå ¸ç»´æ¤ï¼å«ç¼ºé·ä»£ç ï¼`DefectCode*.cs`ï¼ãæ£éªé¡¹ç®ï¼`Frm_MesQaItemsDetect01`ï¼ãAQL æ½æ ·è®¾ç½®ï¼`Frm_MesQmAql1`ï¼çï¼å¹¶æä¾ `Models/` DTOã - **`IPQC/`**ï¼å¶ç¨è¿ç¨æ£éªï¼å¦ `Frm_ShouJian`ï¼é¦ä»¶ï¼ã`Frm_XunJian`ï¼å·¡æ£ï¼ãH5 æ£éªçé¢çã - **`FQC/`**ï¼æåç»æ£ï¼å æ¬ `Frm_Fqc`ã`Frm_FqcDetect01`ãå¼å¸¸å¤ç `MesFqcExceptional`ã - **`RkQC/`**ï¼æ¥æè´¨æ£ï¼æä¾ `Frm_Cqfa`ï¼æ½æ£æ¹æ¡ï¼ã`Frm_CqfaItems`ã`Frm_QtrkDetect01`ã`Frm_WwrkDetect01` çã - **`WW/`**ï¼å§å¤è´¨é管çï¼å¦å§å¤æ£éªãå¼å¸¸åä¼ ã #### Entity/ - æ°æ®æ¨¡å ### 4.5 å¶é æ§è¡å - **`Work/`**ï¼å¶ç¨ä½ä¸æ ¸å¿ï¼å¦ `Frm_WorkStart`ï¼å·¥åºå¼å·¥ï¼ã`Frm_WorkProcesses`ï¼æµç¨å¡æ§ï¼ã`Frm_Work01/09`ï¼å·¥ç«æ°æ®ééï¼å« ModbusãSQLServer 交äºï¼ã`Frm_Repair`ï¼è¿å·¥ç»´ä¿®ï¼çã - **`WOM/`**ï¼å·¥å管çï¼è´è´£ç产任å¡ä¸è¾¾ãæäº§è°æ´ãå·¥å追踪ã | æä»¶ | 说æ | |------|------| | `LoginInfoModel.cs` | ç»å½ç¨æ·ä¿¡æ¯æ¨¡å | | `PageQueryModel.cs` | å页æ¥è¯¢éç¨æ¨¡å | | `ReturnModel.cs` | API è¿åç»æå°è£ | ### 4.6 éå®ãæ¥è¡¨ä¸ç»è®¡ - **`Sales/`**ï¼éå®è®¢åãåè´§ãéè´§çå端ä¸å¡ã - **`Rpt/`**ï¼æ¥è¡¨ä¸å¿ï¼å å« FastReport/DevExpress æ¥è¡¨è®¾è®¡ãè¿è¡ãæ°æ®æºé ç½®ï¼å¦ `EasyRptDesign`, `EasyRptEdt`, `SysHelp` çã #### ToolBox/ - å·¥å ·ç±»åº ### 4.7 ç³»ç»ä¸æé - **`Sys/`**ï¼ç³»ç»è®¾ç½®ä¸åå°ç®¡çãåè½å æ¬ `SysMenu`ï¼èåç»æï¼ã`Organization`ï¼ç»ç»æ ï¼ã`DocNoRule`ï¼åå·è§åï¼ã`SysLog`ã`SysHelp`ã`Frm_Config` çã - **`User/`**ï¼ç¨æ·ãè§è²ãè§è²ææãå¯ç åæ´çï¼å¦ `User`, `Role`, `RoleSelectAction`, `UserSetPwd`ã | æä»¶ | 说æ | |------|------| | `UtilityHelper.cs` | **æ ¸å¿å·¥å ·ç±»**: HTTP请æ±ãJSONè§£æãGridåå§åç | | `LogHelper.cs` | æ¥å¿è®°å½å·¥å · (åå ¥ `logs/{yyyy-MM-dd}.log`) | | `MsgHelper.cs` | ç»ä¸æ¶æ¯æç¤ºå°è£ (åºäº DevExpress) | | `UpdateParentEventArgs.cs` | çªä½é´äºä»¶éä¿¡æºå¶ | | `ModbusHelper.cs` | Modbus 设å¤éä¿¡å°è£ | ### 4.8 å ¶å®æ¯æå - `JJGZ/`ï¼å¤¹å ·å·¥è£ ã计é设å¤å°è´¦ä¸ç¹æ£ä»»å¡ï¼ä¸ºè´¨éä¸ç»´æ¤æ¨¡åæä¾åºç¡æ°æ®ã - `WW/`ï¼å§å¤ååä½ä¸åè´¨æ£éç¯ï¼è¡æ¥å¤åæµç¨ã - `PDA/`ï¼ææç»ç«¯çé¢éï¼ç¨äºä»å¨ãç产ãè´¨æ£åºæ¯çæ«ç ä½ä¸ã - æ ¹ç®å½ä¸ç `FrmMain`ã`FrmLogin`ã`XtraForm*` ççªä½æä¾éç¨ç¤ºä¾æè°è¯å ¥å£ï¼å¯ä½ä¸ºæ°æ¨¡ååèæ¨¡æ¿ã #### UserControl/ - å¯å¤ç¨æ§ä»¶ ## 5. å·¥å ·ãæ§ä»¶ä¸å ¬å ±è½å - `ToolBox/UtilityHelper`ï¼å°è£ `HttpPost`ãJSON è§£æï¼`ReturnToDynamic/ReturnToTablePage`ï¼ãèµæºå è½½ãGrid åå§åãè¿æ»¤æ¡ä»¶æè¿°çã - `ToolBox/LogHelper`ï¼ææ¥æåå ¥ `logs/{yyyy-MM-dd}.log`ï¼GUI å±ç»ä¸éè¿ `MsgHelper` æç¤ºã - `ToolBox/UpdateParentEventArgs`ï¼ç¨äºåçªä½ä¸ä¸»çªä½ä¹é´çäºä»¶éä¿¡ã - `UserControl/`ï¼`UcToolBarMenu`ã`UcPageBar`ã`UcDictionarySelect`ã`UcLook*` çæ§ä»¶æåå¤ç¨æ§ï¼`Toast` ç¨äºè½»éæç¤ºã ## 6. è¾ å©é¡¹ç®è¯´æ - **Gs.WeightIqc**ï¼å®æ¶è¯»å串å£ç§°éæ°æ®ï¼éè¿ `WorkWeight/EditModel` API 䏿¥ï¼å«çº¿ç¨ç®¡çã串å£é ç½®ãæ¥å¿è®°å½ã - **Gs.WeightLine**ï¼ç±»ä¼¼ IQCï¼ä½æ¯æçº¿ä½ä¸æéæ©ãå计æ¶å¨å·æ°ä»¥åæ´å¤çé¢äº¤äºã - **Gs.Setup**ï¼çæå®è£ å æ ClickOnce é¨ç½²æéçå®è£ å·¥ç¨ï¼ä¸ Release æå»ºè¾åºé å¥ã ## 7. é ç½®ä¸ç¯å¢ - 主é ç½®æä»¶ï¼`Gs.DevApp/App.config`ï¼è¿è¡æè¯»å `Gs.DevApp.exe.config`ï¼ã - å ³é®é®å¼ï¼`WebApiUrl`ã`ProductName`ã`Version`ã`IsAutoUpdater`ã`AutoUpdaterXml`ã`LogPath`ã`AsyncSeconds`ã`TimingMailInterval` çã - 设å¤ä¸æ°æ®åºå°åé»è®¤æåå ç½ IPï¼å¦ `192.168.0.51`ã`192.168.60.51`ï¼ï¼é¨ç½²åéæç¯å¢è°æ´ã - ç§°éæ¨¡å使ç¨ä¸²å£åæ°ï¼æ³¢ç¹çã端å£å·ï¼å Modbus ç«å·/å¯åå¨é ç½®ï¼å»ºè®®å°ç¡¬ç¼ç è·¯å¾æ½ç¦»å°é ç½®æåå°åæ°è¡¨ã - æ¥å¿é»è®¤åå ¥åºç¨ç®å½ä¸ `logs/`ï¼è¯·ç¡®ä¿å®¢æ·ç«¯å ·å¤åæéææ¹ä¸ºå ¬å ±æ°æ®ç®å½ã ## 8. æå»ºä¸é¨ç½² - è°è¯æå»ºï¼`msbuild GsDevSolution.sln /p:Configuration=Debug` - åå¸æå»ºï¼`msbuild .\Gs.DevApp\Gs.DevApp.csproj /t:Rebuild /p:Configuration=Release` - 坿§è¡æä»¶ä½äº `bin\{Configuration}\`ï¼å叿¶éæºå¸¦ DevExpressãCefSharp ä¾èµå `x86/x64` åç®å½ã - å®è£ å ï¼å¨ Release æå»ºåæå¼ `Gs.Setup/Gs.Setup.vdproj` å¯¼åº MSI/EXEã - èªå¨æ´æ°ï¼è¥å¯ç¨ `IsAutoUpdater=1`ï¼éè¦é¨ç½² `AutoUpdaterXml` æåçæ´æ°æè¿°æä»¶ä¸å®è£ å ã ## 9. å¼åä¸è°è¯å»ºè®® - éµå¾ªç°æç®å½ååï¼æ°å¢åè½ä¼å æ¾ç½®äºç¸åºä¸å¡åç®å½ã - å¤ç¨ `ToolBox`ã`UserControl` ä¸çå ¬å ±è½åï¼é¿å éå¤å®ç° HTTPãæ¥å¿ãå页ãéæ©å¨çé»è¾ã - å ³é® API è°ç¨ååè®°å½æ¥å¿ï¼å¼å¸¸æ¶ä½¿ç¨ `MsgHelper` å±ç¤ºå好信æ¯ï¼å¹¶å¨åå°æ¥å¿é带ä¸ä¸æï¼å·¥ç«ãæ¡ç ãç¨æ·çï¼ã - 卿¶å硬件æé¿èæ¶æä½æ¶ï¼ä½¿ç¨åå°çº¿ç¨/弿¥æ¨¡å¼ï¼é¿å é»å¡ UIï¼æ¿æ¢ `Thread.Abort` ä¸ºåæ¶æ è®°å¯æåç¨³å®æ§ã - å»ºè®®å»ºç«æå·¥æµè¯æ¸ åï¼ç»å½ãèåå è½½ãæ ¸å¿ä¸å¡æµç¨ãç§°éä¸ä¼ ãæ¥è¡¨æå°çã - ææåæ®åç¯å¢ IP åºè¿ç§»è³å®å ¨é ç½®æç¯å¢åéï¼æäº¤åæ³¨æè±æã | æ§ä»¶ç±»å | ç¤ºä¾ | 说æ | |----------|------|------| | **å·¥å ·æ ** | `UcToolBarMenu.cs` | æ åCRUDæä½æ | | **å页** | `UcPageBar.cs` | å页æ§ä»¶ | | **éæ©å¨** | `UcDictionarySelect.cs` | æ°æ®åå ¸ä¸ææ¡ | | **æ¥æ¾æ§ä»¶** | `UcLookCustomer.cs`<br>`UcLookItems.cs`<br>`UcLookWarehouse.cs` | 60+ æ°æ®æ¥æ¾å¯¹è¯æ¡<br>(客æ·/ç©æ/ä»åºç) | | **éç¥** | `Toast.cs` | è½»é级æç¤ºæ¡ | --- å¦éè¿ä¸æ¥æ©å±æå¹è®ï¼å¯åºäºæ¬æåå¿«éå®ä½æ¨¡åå ¥å£ãæ ¸å¿é 置以åæå»ºæµç¨ãæ¬¢è¿æ ¹æ®å®é ä¸å¡æç»è¡¥å ã*** ## 3. æ ¸å¿ææ¯æ ### 3.1 主è¦ä¾èµ | ææ¯/åº | çæ¬ | ç¨é | |---------|------|------| | **.NET Framework** | 4.8 | åºç¨åºç¡æ¡æ¶ | | **DevExpress** | v22.2.3 | UI ç»ä»¶åº (FluentDesign, XtraGrid, XtraTab, XtraBars) | | **CefSharp** | 109.1.110 | åµå ¥å¼ Chromium æµè§å¨ | | **AutoUpdater.NET** | 1.9.2 | èªå¨è½¯ä»¶æ´æ° | | **NModbus** | 3.0.81 | å·¥ä¸è®¾å¤éä¿¡ (Modbus TCP/RTU) | | **Newtonsoft.Json** | 13.0.3 | JSON åºåå | | **System.Text.Json** | 8.0.4 | ç°ä»£ JSON æ¯æ | | **Oracle.ManagedDataAccess** | ææ° | Oracle æ°æ®åºè®¿é® | | **System.Data.SqlClient** | ææ° | SQL Server æ°æ®åºè®¿é® | ### 3.2 DevExpress æ ¸å¿ç»ä»¶ ```csharp // FluentDesign 主çé¢ DevExpress.XtraBars.FluentDesignSystem.FluentDesignForm // æ°æ®è¡¨æ ¼ DevExpress.XtraGrid.GridControl DevExpress.XtraGrid.Views.Grid.GridView // æ ç¾é¡µ DevExpress.XtraTab.XtraTabControl // 导èªèå DevExpress.XtraNavBar.NavBarControl // çå¾ å¯¹è¯æ¡ DevExpress.XtraWaitForm.WaitDialogForm ``` --- ## 4. å¼åç¯å¢é ç½® ### 4.1 åç½®è¦æ± - â Windows 10/11 æ Windows Server 2016+ - â Visual Studio 2022 (æ¨è) æ Visual Studio 2019 - â .NET Framework 4.8 SDK - â DevExpress v22.2+ 许å¯è¯ (éé ç½® NuGet æº) - â Git (çæ¬æ§å¶) ### 4.2 å éä¸è¿å ```bash # å é代ç åº cd E:\LanBMes git clone <repository_url> LB_MesClient # è¿å ¥è§£å³æ¹æ¡ç®å½ cd LB_MesClient\DevApp # è¿å NuGet å nuget restore GsDevSolution.sln # æå¨ Visual Studio ä¸: # å³é®è§£å³æ¹æ¡ â è¿å NuGet ç¨åºå ``` ### 4.3 é ç½® DevExpress ç¡®ä¿å·²å®è£ DevExpress v22.2 å¹¶é ç½® NuGet æº: ``` å·¥å · â NuGet å 管çå¨ â ç¨åºå 管çå¨è®¾ç½® â ç¨åºå æº æ·»å æº: https://nuget.devexpress.com/<your_feed_key>/api ``` ### 4.4 é ç½®å端 API ç¼è¾ `Gs.DevApp\App.config`: ```xml <add key="WebApiUrl" value="http://192.168.0.51:8081/" /> ``` ä¿®æ¹ä¸ºå®é çå端 API å°åã --- ## 5. æå»ºä¸è¿è¡ ### 5.1 å½ä»¤è¡æå»º ```bash # Debug æå»º (æ¨èå¼å使ç¨) cd E:\LanBMes\LB_MesClient\DevApp msbuild GsDevSolution.sln /p:Configuration=Debug /p:Platform="Any CPU" # Release æå»º (ç¨äºåå¸) msbuild GsDevSolution.sln /p:Configuration=Release /p:Platform="Any CPU" # ä» æå»ºä¸»é¡¹ç® msbuild Gs.DevApp\Gs.DevApp.csproj /t:Rebuild /p:Configuration=Debug ``` ### 5.2 Visual Studio è¿è¡ 1. **æå¼è§£å³æ¹æ¡**: åå» `GsDevSolution.sln` 2. **设置å¯å¨é¡¹ç®**: å³é® `Gs.DevApp` â 设为å¯å¨é¡¹ç® 3. **è¿è¡**: æ `F5` æç¹å» "å¼å§è°è¯" ### 5.3 ç´æ¥è¿è¡ ```bash # Debug çæ¬ Gs.DevApp\bin\Debug\Gs.DevApp.exe # Release çæ¬ Gs.DevApp\bin\Release\Gs.DevApp.exe ``` ### 5.4 è°è¯æå·§ **ç¦ç¨åå®ä¾éå¶** (å è®¸åæ¶è¿è¡å¤ä¸ªå®ä¾ç¨äºæµè¯): å¨ `Program.cs` 䏿³¨é以ä¸ä»£ç : ```csharp // Process[] MyProcesses = Process.GetProcessesByName("Gs.DevApp"); // if (MyProcesses.Length > 1) // { // MyProcesses[0].Kill(); // } ``` --- ## 6. DevFrm åè½æ¨¡å详解 ### 6.1 ç»å½ä¸ä¸»æ¡æ¶ #### Program.cs - åºç¨ç¨åºå ¥å£ ```csharp [STAThread] static void Main() { // 1. åå®ä¾æ£æ¥ (鲿¢éå¤è¿è¡) Process[] MyProcesses = Process.GetProcessesByName("Gs.DevApp"); if (MyProcesses.Length > 1) { MyProcesses[0].Kill(); } // 2. å¯ç¨è§è§æ ·å¼ Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // 3. å¯å¨ç»å½æµç¨ _startLogin(); } ``` #### FrmLogin.cs - ç»å½çªä½ **æ ¸å¿åè½**: - èªå¨æ´æ°æ£æ¥ (AutoUpdater.NET) - ç¨æ·èº«ä»½éªè¯ (è°ç¨ `User/UserLogin` API) - è®°ä½ç¨æ·å/å¯ç - åä½è®¾ç½®æä¹ å (注å表) **å ³é®ä»£ç **: ```csharp // ç»å½éªè¯ string result = UtilityHelper.HttpPost("User/UserLogin", "UserLogin", jsonParam); dynamic dy = UtilityHelper.ReturnToDynamic(result); if (dy.code == 200) { LoginInfoModel.CurrentUser = JsonConvert.DeserializeObject<LoginInfoModel>(dy.data.ToString()); this.DialogResult = DialogResult.OK; } ``` #### FrmMain.cs - 主çªä½ **æ ¸å¿èè´£**: 1. å è½½ç¨æ·èåç»æ (`User/GetUserLoginInfo`) 2. æå»º AccordionControl 导èªèå 3. 卿å è½½çªä½ (éè¿åå°) 4. 管ç TabPage çå½å¨æ 5. ç»ç»åæ¢ 6. å ¨å±äºä»¶å¤ç **卿çªä½å è½½**: ```csharp // éè¿å½å空é´å¨æå建çªä½å®ä¾ Form newForm = (Form)Assembly.GetExecutingAssembly() .CreateInstance("Gs.DevApp.DevFrm.BasicData.Frm_Customer"); // åµå ¥å° TabPage newForm.FormBorderStyle = FormBorderStyle.None; newForm.TopLevel = false; newForm.Dock = DockStyle.Fill; xtraTabPage.Controls.Add(newForm); newForm.Show(); ``` **TabPage ç¼å** (鲿¢é夿å¼): ```csharp if (tabPageDict.ContainsKey(formName)) { xtraTabControl.SelectedTabPage = tabPageDict[formName]; return; } ``` --- ### 6.2 åºç¡æ°æ®å (BasicData/) #### 客æ·ç®¡ç - Frm_Customer.cs - 客æ·ä¸»æ°æ®ç»´æ¤ - æ¯æå页æ¥è¯¢ - ä½¿ç¨ `UcToolBarMenu` å®ç°å¢å æ¹æ¥ - ä½¿ç¨ `UcPageBar` å®ç°å页 #### ä¾åºå管ç - `Frm_Supplier.cs` - ä¾åºååºç¡ä¿¡æ¯ - `Frm_SupplierSrm.cs` - SRM ä¾åºåå ³ç³»ç®¡ç #### ç©æç®¡ç - `Frm_MesItems.cs` - ç©æä¸»æ°æ®ç»´æ¤ - `Frm_MesItemsShow.cs` - ç©æä¿¡æ¯å±ç¤º #### 产线管ç - Frm_MesWorkshopLine.cs - 车é´äº§çº¿é ç½® - å·¥ä½ä¸å¿å®ä¹ #### å ¶ä»ä¸»æ°æ® - `Frm_Staff.cs` - åå·¥ä¿¡æ¯ - `Frm_Department.cs` - é¨é¨ç»ç» --- ### 6.3 ä»å¨ç®¡çå #### åºåºç®¡ç (Ck/) | çªä½ | åè½ | |------|------| | `Frm_MesInvItemOut_SCLL.cs` | çäº§é¢æåºåº | | `Frm_MesItemBl.cs` | è¡¥æåºåº | | `Frm_MesCgthSq.cs` | éè´éè´§ç³è¯· | | `Frm_MesItemQtck.cs` | å ¶ä»åºåº | #### å ¥åºç®¡ç (Rk/) | çªä½ | åè½ | |------|------| | `Frm_MesInvItemArn.cs` | å°è´§å ¥åº | | `Frm_MesItemTbl.cs` | ææå ¥åºå°è´¦ | | `Frm_MesItemQtrk.cs` | å ¶ä»å ¥åº | #### ä»åºæä½ (Warehouse/) | çªä½ | åè½ | |------|------| | `Frm_MesDbck.cs` | è°æ¨åºåº | | `Frm_MesRohIn.cs` | åæå ¥åº | | `Frm_ArrivalBarcode.cs` | å°è´§æ¡ç çæ | | `Frm_InitialBarcode.cs` | åå§æ¡ç ç»´æ¤ | #### ææç»ç«¯ (PDA/) æä¾ç®åçæ«ç ä½ä¸çé¢,ç¨äº: - å¿«éçè´§ - åºåçç¹ - æ¡ç æ«æ - ç§»å¨ä½ä¸ --- ### 6.4 è´¨é管çå #### QC/ - è´¨ééç¨æ¨¡å - 缺é·ä»£ç ç»´æ¤ (`DefectCode*.cs`) - æ£éªé¡¹ç®è®¾ç½® (`Frm_MesQaItemsDetect01.cs`) - AQL æ½æ ·æ¹æ¡ (`Frm_MesQmAql1.cs`) - è´¨éæ åå®ä¹ #### IPQC/ - å¶ç¨æ£éª | çªä½ | åè½ | |------|------| | `Frm_ShouJian.cs` | é¦ä»¶æ£éª | | `Frm_XunJian.cs` | å·¡æ£ä½ä¸ | | H5 æ£éªçé¢ | ç§»å¨ç«¯æ£éª | #### FQC/ - æåç»æ£ | çªä½ | åè½ | |------|------| | `Frm_Fqc.cs` | æåæ£éªä¸»çé¢ | | `Frm_FqcDetect01.cs` | æ£éªæ°æ®å½å ¥ | | `MesFqcExceptional.cs` | å¼å¸¸å¤ç | #### RkQC/ - æ¥æè´¨æ£ | çªä½ | åè½ | |------|------| | `Frm_Cqfa.cs` | æ½æ£æ¹æ¡ | | `Frm_CqfaItems.cs` | æ£éªé¡¹é ç½® | | `Frm_QtrkDetect01.cs` | æ¥ææ£éª | | `Frm_WwrkDetect01.cs` | å§å¤æ¥ææ£éª | --- ### 6.5 å¶é æ§è¡å (Work/) #### å·¥åºä½ä¸ | çªä½ | åè½ | |------|------| | `Frm_WorkStart.cs` | å·¥åºå¼å·¥ | | `Frm_WorkProcesses.cs` | æµç¨å¡ç®¡ç | | `Frm_Work01.cs` ~ `Frm_Work09.cs` | åå·¥ç«æ°æ®éé | | `Frm_Repair.cs` | è¿å·¥ç»´ä¿® | #### ç¹æ®åè½ - **Modbus 设å¤éä¿¡**: æ¯æå®æ¶è¯»åå·¥ä¸è®¾å¤æ°æ® - **SQL Server ç´è¿**: é¨åå·¥ç«ç´æ¥ä¸ SQL Server äº¤äº - **宿¶çæ§**: å·¥ç«ç¶æå®æ¶å±ç¤º --- ### 6.6 å·¥å管çå (WOM/) - ç产任å¡ä¸è¾¾ - å·¥åæäº§è°æ´ - å·¥åè¿åº¦è¿½è¸ª - å·¥åç¶æç®¡ç --- ### 6.7 éå®ç®¡çå (Sales/) - éå®è®¢å管ç - åè´§åå¤ç - é货管ç - 客æ·å¯¹è´¦ --- ### 6.8 å§å¤ç®¡çå (WW/) - å§å¤è®¢å管ç - å§å¤æ¥ææ£éª - å§å¤è´¨éå¼å¸¸å¤ç - å¤åæµç¨éç¯ --- ### 6.9 æ¥è¡¨å (Rpt/) | çªä½ | åè½ | |------|------| | `EasyRptDesign.cs` | æ¥è¡¨è®¾è®¡å¨ | | `EasyRptEdt.cs` | æ¥è¡¨ç¼è¾ | | `SysHelp.cs` | æ¥è¡¨å¸®å© | **æ¯æææ¯**: - FastReport - DevExpress Reports - èªå®ä¹æ¥è¡¨å¼æ --- ### 6.10 ç³»ç»ç®¡çå (Sys/) | çªä½ | åè½ | |------|------| | `SysMenu.cs` | èåç»æç»´æ¤ | | `Organization.cs` | ç»ç»æ¶æç®¡ç | | `DocNoRule.cs` | åå·è§åé ç½® | | `SysLog.cs` | ç³»ç»æ¥å¿æ¥è¯¢ | | `Frm_Config.cs` | ç³»ç»é ç½® | --- ### 6.11 ç¨æ·ä¸æéå (User/) | çªä½ | åè½ | |------|------| | `User.cs` | ç¨æ·ç®¡ç | | `Role.cs` | è§è²ç®¡ç | | `RoleSelectAction.cs` | è§è²ææ | | `UserSetPwd.cs` | å¯ç åæ´ | **æé模å**: ``` ç¨æ· â è§è² â èåæé + æä½æé ``` --- ### 6.12 å¤¹å ·å·¥è£ å (JJGZ/) - å¤¹å ·å·¥è£ å°è´¦ - 计é设å¤ç®¡ç - ç¹æ£ä»»å¡ä¸è®°å½ - 设å¤ç»´æ¤è®¡å --- ### 6.13 æ¡ç 管çå (BarCode/) | çªä½ | åè½ | |------|------| | `Frm_BarcodePrint.cs` | æ¡ç æ¹éæå° | | `Frm_BarcodeTemplate.cs` | æå°æ¨¡æ¿è®¾ç½® | --- ## 7. æ¶æä¸è®¾è®¡æ¨¡å¼ ### 7.1 å¤å±æ¶æ ``` âââââââââââââââââââââââââââââââââââââââââââ â UI Layer (WinForms) â â DevExpress FluentDesign + 150+ æ§ä»¶ â âââââââââââââââââââ¬ââââââââââââââââââââââââ â HTTP/JSON REST API âââââââââââââââââââ¼ââââââââââââââââââââââââ â Business Logic Layer (Client) â â çªä½é»è¾ + ToolBox å·¥å ·ç±» + 卿å è½½ â âââââââââââââââââââ¬ââââââââââââââââââââââââ â âââââââââââââââââââ¼ââââââââââââââââââââââââ â Backend REST API (å«å¤é¡¹ç®) â â 身份éªè¯ + èå + ä¸å¡é»è¾ + æ°æ®è®¿é® â âââââââââââââââââââ¬ââââââââââââââââââââââââ â âââââââââââââââââââ¼ââââââââââââââââââââââââ â Data Layer â â Oracle / SQL Server â âââââââââââââââââââââââââââââââââââââââââââ ``` ### 7.2 æ ¸å¿è®¾è®¡æ¨¡å¼ #### æ¨¡å¼ 1: HTTP 请æ±éä¸å **ææ API è°ç¨ç»ä¸ä½¿ç¨ `UtilityHelper.HttpPost()`**: ```csharp public static string HttpPost(string url, string method, string param, bool isLoading = true) { // 1. æ¼æ¥å®æ´ URL (WebApiUrl + url) // 2. æ·»å Bearer Token 认è¯å¤´ // 3. æ¾ç¤º Loading å¯¹è¯æ¡ (å¯é) // 4. åé POST è¯·æ± // 5. è¿å JSON å符串 // 6. è¶ æ¶æ¶é´: 150 ç§ } ``` **使ç¨ç¤ºä¾**: ```csharp string jsonParam = JsonConvert.SerializeObject(new { pageIndex = 1, pageSize = 50 }); string result = UtilityHelper.HttpPost( "BasicData/Customer/GetListPage", // ç¸å¯¹è·¯å¾ "GetListPage", // æ¹æ³å jsonParam, // JSON åæ° true // æ¾ç¤ºå è½½æ¡ ); dynamic dy = UtilityHelper.ReturnToDynamic(result); if (dy.code == 200) { // å¤çæ°æ® } ``` #### æ¨¡å¼ 2: 卿çªä½å è½½ (åå°) ```csharp // å¨ FrmMain.cs ä¸ private void LoadForm(string namespacePath) { // éè¿å½å空é´è·¯å¾å建çªä½å®ä¾ string fullName = $"Gs.DevApp.DevFrm.{namespacePath}"; Form form = (Form)Assembly.GetExecutingAssembly().CreateInstance(fullName); if (form != null) { // é 置为åçªä½ form.FormBorderStyle = FormBorderStyle.None; form.TopLevel = false; form.Dock = DockStyle.Fill; // æ·»å å° TabPage XtraTabPage tabPage = new XtraTabPage(); tabPage.Text = form.Text; tabPage.Controls.Add(form); xtraTabControl.TabPages.Add(tabPage); xtraTabControl.SelectedTabPage = tabPage; form.Show(); } } ``` **好å¤**: - èåç»æå®å ¨ç±å端æ§å¶ - æ éä¿®æ¹ä»£ç å³å¯è°æ´èå - æ¯æå¨ææéæ§å¶ #### æ¨¡å¼ 3: TabPage ç¼åæºå¶ ```csharp // 鲿¢é夿å¼åä¸çªä½ private Dictionary<string, XtraTabPage> tabPageDict = new Dictionary<string, XtraTabPage>(); private void OpenForm(string formName) { if (tabPageDict.ContainsKey(formName)) { // å·²åå¨,æ¿æ´»ç°æ Tab xtraTabControl.SelectedTabPage = tabPageDict[formName]; } else { // æ°å»º Tab XtraTabPage newPage = CreateNewTabPage(formName); tabPageDict[formName] = newPage; } } ``` #### æ¨¡å¼ 4: ç¶åçªä½äºä»¶éä¿¡ **åçªä½è§¦åç¶çªä½å·æ°**: ```csharp // å¨åçªä½ä¸ UpdateParentEventArgs args = new UpdateParentEventArgs(this, "Refresh"); // 触åäºä»¶,éç¥ç¶çªä½ // å¨ç¶çªä½ä¸ private void ChildForm_UpdateParent(object sender, UpdateParentEventArgs e) { if (e.Action == "Refresh") { LoadData(); // å·æ°æ°æ® } } ``` #### æ¨¡å¼ 5: æ å CRUD çªä½æ¨¡æ¿ **å ¸åçªä½ç»æ**: ```csharp public partial class Frm_Customer : DevExpress.XtraEditors.XtraForm { private UcToolBarMenu ucToolBar; // å·¥å ·æ (å¢å æ¹æ¥) private UcPageBar ucPageBar; // å页æ§ä»¶ private GridControl gridControl; // æ°æ®è¡¨æ ¼ private void InitializeForm() { // 1. åå§åå·¥å ·æ ucToolBar.AddClick += BtnAdd_Click; ucToolBar.EditClick += BtnEdit_Click; ucToolBar.DeleteClick += BtnDelete_Click; ucToolBar.RefreshClick += BtnRefresh_Click; // 2. åå§åå页 ucPageBar.PageChanged += LoadData; // 3. å è½½æ°æ® LoadData(); } private void LoadData() { string jsonParam = JsonConvert.SerializeObject(new { pageIndex = ucPageBar.CurrentPage, pageSize = ucPageBar.PageSize }); string result = UtilityHelper.HttpPost( "BasicData/Customer/GetListPage", "GetListPage", jsonParam ); dynamic dy = UtilityHelper.ReturnToDynamic(result); if (dy.code == 200) { gridControl.DataSource = dy.data; ucPageBar.TotalRecords = dy.totalCount; } } } ``` --- ## 8. å·¥å ·ç±»ä¸å ¬å ±ç»ä»¶ ### 8.1 UtilityHelper.cs - æ ¸å¿å·¥å ·ç±» #### HTTP è¯·æ± ```csharp // æ å POST è¯·æ± string result = UtilityHelper.HttpPost( "User/UserLogin", // ç¸å¯¹è·¯å¾ "UserLogin", // æ¹æ³å jsonParam, // JSON åæ° true // æ¾ç¤ºå è½½æ¡ ); ``` #### JSON è§£æ ```csharp // è§£æä¸º dynamic 对象 dynamic dy = UtilityHelper.ReturnToDynamic(result); // è§£æä¸ºåé¡µæ°æ®è¡¨ DataTable dt = UtilityHelper.ReturnToTablePage(result); ``` #### Grid åå§å ```csharp // åå§åè¡¨æ ¼æ§ä»¶ UtilityHelper.InitGridControl( gridControl, gridView, columns, // åå®ä¹ dataSource, // æ°æ®æº allowEdit: false, allowDelete: false ); ``` ### 8.2 LogHelper.cs - æ¥å¿å·¥å · ```csharp // è®°å½ä¿¡æ¯æ¥å¿ LogHelper.WriteLog("ç¨æ·ç»å½æå", LogHelper.LogType.Info); // è®°å½é误æ¥å¿ LogHelper.WriteLog($"API è°ç¨å¤±è´¥: {ex.Message}", LogHelper.LogType.Error); // è®°å½è¦å LogHelper.WriteLog("æ°æ®å¼å¸¸,使ç¨é»è®¤å¼", LogHelper.LogType.Warning); ``` **æ¥å¿æä»¶ä½ç½®**: `logs/{yyyy-MM-dd}.log` ### 8.3 MsgHelper.cs - æ¶æ¯æç¤º ```csharp // æåæç¤º MsgHelper.ShowSuccess("æä½æå!"); // é误æç¤º MsgHelper.ShowError("æä½å¤±è´¥,请éè¯!"); // è¦åæç¤º MsgHelper.ShowWarning("æ°æ®ä¸å®æ´!"); // ç¡®è®¤å¯¹è¯æ¡ if (MsgHelper.ShowConfirm("ç¡®å®è¦å é¤å?") == DialogResult.Yes) { // æ§è¡å é¤ } ``` ### 8.4 Toast.cs - è½»éæç¤º ```csharp // æ¾ç¤º 3 ç§æç¤º Toast.Show("ä¿åæå", 3); // æ¾ç¤ºèªå®ä¹æ¶é¿ Toast.Show("æ°æ®å·²æ´æ°", 5); // 5 ç§ ``` ### 8.5 å¯å¤ç¨æ§ä»¶ #### UcToolBarMenu - å·¥å ·æ æ§ä»¶ ```csharp UcToolBarMenu toolBar = new UcToolBarMenu(); toolBar.AddClick += (s, e) => { /* æ°å¢ */ }; toolBar.EditClick += (s, e) => { /* ç¼è¾ */ }; toolBar.DeleteClick += (s, e) => { /* å é¤ */ }; toolBar.RefreshClick += (s, e) => { /* å·æ° */ }; toolBar.ExportClick += (s, e) => { /* å¯¼åº */ }; ``` #### UcPageBar - å页æ§ä»¶ ```csharp UcPageBar pageBar = new UcPageBar(); pageBar.PageSize = 50; pageBar.TotalRecords = 1000; pageBar.PageChanged += (s, e) => { LoadData(pageBar.CurrentPage, pageBar.PageSize); }; ``` #### UcDictionarySelect - æ°æ®åå ¸ä¸æ ```csharp UcDictionarySelect cmbStatus = new UcDictionarySelect(); cmbStatus.DictionaryType = "OrderStatus"; // åå ¸ç±»å cmbStatus.LoadData(); ``` #### UcLook* - æ°æ®æ¥æ¾æ§ä»¶ **60+ æ¥æ¾æ§ä»¶,è¦çææä¸»æ°æ®**: ```csharp // å®¢æ·æ¥æ¾ UcLookCustomer lookCustomer = new UcLookCustomer(); lookCustomer.ShowDialog(); string customerId = lookCustomer.SelectedId; string customerName = lookCustomer.SelectedName; // ç©ææ¥æ¾ UcLookItems lookItems = new UcLookItems(); lookItems.ShowDialog(); string itemId = lookItems.SelectedId; // ä»åºæ¥æ¾ UcLookWarehouse lookWarehouse = new UcLookWarehouse(); lookWarehouse.ShowDialog(); ``` --- ## 9. é 置说æ ### 9.1 App.config å ³é®é ç½® **ä½ç½®**: `Gs.DevApp\App.config` (è¿è¡æ¶ä¸º `Gs.DevApp.exe.config`) #### æ ¸å¿é 置项 ```xml <appSettings> <!-- å端 API å°å (å¿ é¡»é ç½®) --> <add key="WebApiUrl" value="http://192.168.0.51:8081/" /> <!-- 产ååç§° --> <add key="ProductName" value="G-MES V2.0" /> <!-- çæ¬å· --> <add key="Version" value="0.1" /> <!-- æ¥å¿ç®å½ (ç¸å¯¹è·¯å¾æç»å¯¹è·¯å¾) --> <add key="LogPath" value="logs" /> <!-- åé¡µå¤§å° --> <add key="PageSize" value="50" /> <!-- å¯ç¨èªå¨æ´æ° (0=ç¦ç¨, 1=å¯ç¨) --> <add key="IsAutoUpdater" value="0" /> <!-- èªå¨æ´æ°é ç½®æä»¶ URL --> <add key="AutoUpdaterXml" value="http://192.168.0.51:8086/AutoUpdater/AutoUpdater.xml" /> <!-- Toast æç¤ºæ¡æ¾ç¤ºæ¶é¿ (ç§) --> <add key="ToastSeconds" value="5" /> <!-- æ°´æ£è¶ æ¶æ¶é´ (ç§) --> <add key="AsyncSeconds" value="2" /> <!-- æ¯å¦å¯ç¨æ°´æ£åå·¥ä½ç åè½ (0=ç¦ç¨, 1=å¯ç¨) --> <add key="IsWater" value="0" /> <!-- IQC ç§°é读åè¶ æ¶ (毫ç§) --> <add key="IqcGetWeight" value="3000" /> <!-- 宿¶é®ä»¶åéé´é (毫ç§) --> <add key="TimingMailInterval" value="10000" /> </appSettings> ``` ### 9.2 ç¨æ·è®¾ç½® (èªå¨ä¿å) ```xml <userSettings> <Gs.DevApp.Properties.Settings> <!-- ç¨æ·å (è®°ä½å¯ç åè½) --> <setting name="userName" serializeAs="String"> <value /> </setting> <!-- å¯ç (å å¯åå¨) --> <setting name="userPwd" serializeAs="String"> <value /> </setting> <!-- è®°ä½å¯ç --> <setting name="remember" serializeAs="String"> <value>False</value> </setting> <!-- åä½è®¾ç½® --> <setting name="fontSizeName" serializeAs="String"> <value>å®ä½,10</value> </setting> <!-- æ¯å¦å¯ç¨ç§°éåè½ --> <setting name="isWeight" serializeAs="String"> <value>False</value> </setting> </Gs.DevApp.Properties.Settings> </userSettings> ``` ### 9.3 é¨ç½²åå¿ æ¹é ç½® **å¼åç¯å¢ â ç产ç¯å¢**: | é 置项 | å¼åç¯å¢ | ç产ç¯å¢ | |--------|----------|----------| | `WebApiUrl` | `http://192.168.0.51:8081/` | `http://your-server:port/` | | `IsAutoUpdater` | `0` (ç¦ç¨) | `1` (å¯ç¨) | | `AutoUpdaterXml` | å ç½å°å | ç产ç¯å¢ URL | | `LogPath` | `logs` | 建议使ç¨å ¬å ±ç®å½ | --- ## 10. é¨ç½²æå ### 10.1 æå»º Release çæ¬ ```bash # æ¸ çå¹¶éæ°æå»º msbuild Gs.DevApp\Gs.DevApp.csproj /t:Clean msbuild Gs.DevApp\Gs.DevApp.csproj /t:Rebuild /p:Configuration=Release /p:Platform="Any CPU" ``` ### 10.2 åå¸ç®å½ç»æ ``` Gs.DevApp.exe # 主ç¨åº Gs.DevApp.exe.config # é ç½®æä»¶ (å¿ é¡»ä¿®æ¹) DevExpress.*.dll # DevExpress ç»ä»¶ CefSharp.*.dll # CefSharp ç»ä»¶ AutoUpdater.NET.dll # èªå¨æ´æ°ç»ä»¶ Newtonsoft.Json.dll # JSON åº Oracle.ManagedDataAccess.dll # Oracle é©±å¨ x86/ # CefSharp x86 æ¬å°åº (å¿ é¡») x64/ # CefSharp x64 æ¬å°åº (å¿ é¡») locales/ # CefSharp è¯è¨å logs/ # æ¥å¿ç®å½ (è¿è¡æ¶å建) ``` ### 10.3 使ç¨å®è£ ç¨åº 1. æå¼ `Gs.Setup\Gs.Setup.vdproj` 2. é ç½®å®è£ ç¨åºå±æ§: - **ProductName**: G-MES V2.0 - **Manufacturer**: èå® - **Version**: ä¸ App.config ä¿æä¸è´ 3. å³é®é¡¹ç® â çæ 4. è¾åº: `Gs.Setup\Release\Gs.Setup.msi` ### 10.4 èªå¨æ´æ°é ç½® #### AutoUpdater.xml ç¤ºä¾ ```xml <?xml version="1.0" encoding="utf-8"?> <update> <version>0.2.0.0</version> <url>http://your-server/updates/Gs.DevApp_v0.2.0.0.zip</url> <changelog> <![CDATA[ <h3>çæ¬ 0.2.0.0 æ´æ°å 容</h3> <ul> <li>æ°å¢ï¼æ¡ç æ¹éæå°åè½</li> <li>ä¼åï¼ä»åºåºå ¥åºæµç¨</li> <li>ä¿®å¤ï¼è´¨æ£æ°æ®ä¿å失败é®é¢</li> </ul> ]]> </changelog> <mandatory>false</mandatory> </update> ``` #### å¯ç¨èªå¨æ´æ° å¨ `App.config` ä¸: ```xml <add key="IsAutoUpdater" value="1" /> <add key="AutoUpdaterXml" value="http://your-server/updates/AutoUpdater.xml" /> ``` ### 10.5 é¨ç½²æ£æ¥æ¸ å - [ ] ä¿®æ¹ `WebApiUrl` 为ç产ç¯å¢å°å - [ ] æ£æ¥ `IsAutoUpdater` é ç½® - [ ] ç¡®ä¿ `x86/` å `x64/` ç®å½å®æ´ - [ ] æµè¯æ°æ®åºè¿æ¥ - [ ] éªè¯æ¥å¿ç®å½åæé - [ ] æµè¯èªå¨æ´æ°åè½ - [ ] æ£æ¥ DevExpress 许å¯è¯ - [ ] å¤ä»½é ç½®æä»¶ --- ## 11. å¼åè§è䏿佳å®è·µ ### 11.1 代ç ç»ç»è§è #### æ°å¢æ¨¡å ``` DevFrm/ âââ YourModule/ # æ°æ¨¡åç®å½ âââ Frm_Main.cs # 主çªä½ âââ Frm_Edit.cs # ç¼è¾çªä½ âââ Dlg_Select.cs # éæ©å¯¹è¯æ¡ âââ Models/ # æ¬å°æ¨¡å (å¯é) ``` #### å½åè§è | ç±»å | å½åè§å | ç¤ºä¾ | |------|----------|------| | 主çªä½ | `Frm_{ä¸å¡å}` | `Frm_Customer.cs` | | ç¼è¾çªä½ | `Frm_{ä¸å¡å}Edit` | `Frm_CustomerEdit.cs` | | å¯¹è¯æ¡ | `Dlg_{ä¸å¡å}` | `Dlg_SelectCustomer.cs` | | ç¨æ·æ§ä»¶ | `Uc{åè½å}` | `UcToolBarMenu.cs` | ### 11.2 API è°ç¨è§è #### â æ£ç¡®åæ³ ```csharp // ä½¿ç¨ UtilityHelper.HttpPost string jsonParam = JsonConvert.SerializeObject(new { id = customerId }); string result = UtilityHelper.HttpPost( "BasicData/Customer/GetById", "GetById", jsonParam ); dynamic dy = UtilityHelper.ReturnToDynamic(result); if (dy.code == 200) { // å¤çæ°æ® } else { MsgHelper.ShowError(dy.msg.ToString()); LogHelper.WriteLog($"API Error: {dy.msg}", LogHelper.LogType.Error); } ``` #### â éè¯¯åæ³ ```csharp // ä¸è¦ç´æ¥ä½¿ç¨ HttpClientãWebRequest ç // ä¸è¦è·³è¿é误å¤ç // ä¸è¦å¿½ç¥æ¥å¿è®°å½ ``` ### 11.3 å¼å¸¸å¤çè§è ```csharp try { // ä¸å¡é»è¾ string result = UtilityHelper.HttpPost(...); dynamic dy = UtilityHelper.ReturnToDynamic(result); if (dy.code == 200) { // æåå¤ç } else { // API è¿åé误 MsgHelper.ShowError(dy.msg.ToString()); LogHelper.WriteLog($"API Error: {dy.msg}", LogHelper.LogType.Error); } } catch (Exception ex) { // æè·å¼å¸¸ MsgHelper.ShowError($"æä½å¤±è´¥: {ex.Message}"); LogHelper.WriteLog($"Exception in {MethodName}: {ex}", LogHelper.LogType.Error); } ``` ### 11.4 UI æ´æ°è§è #### é¿æ¶é´æä½ä½¿ç¨åå°çº¿ç¨ ```csharp // ä½¿ç¨ BackgroundWorker BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += (s, e) => { // èæ¶æä½ e.Result = PerformLongOperation(); }; worker.RunWorkerCompleted += (s, e) => { // UI æ´æ° UpdateUI(e.Result); }; worker.RunWorkerAsync(); ``` #### é¿å UI é»å¡ ```csharp // â é»å¡ UI çº¿ç¨ Thread.Sleep(5000); // â 使ç¨å®æ¶å¨æå¼æ¥ Timer timer = new Timer(); timer.Interval = 5000; timer.Tick += (s, e) => { timer.Stop(); // æ§è¡æä½ }; timer.Start(); ``` ### 11.5 æ§ä»¶å¤ç¨è§è #### ä¼å 使ç¨ç°ææ§ä»¶ ```csharp // â ä½¿ç¨ UcLookCustomer UcLookCustomer lookCustomer = new UcLookCustomer(); if (lookCustomer.ShowDialog() == DialogResult.OK) { txtCustomerId.Text = lookCustomer.SelectedId; txtCustomerName.Text = lookCustomer.SelectedName; } // â ä¸è¦èªå·±åéæ©å¯¹è¯æ¡ // å·²æ 60+ UcLook* æ§ä»¶å¯ç¨ ``` ### 11.6 æ¥å¿è®°å½è§è ```csharp // å ³é®æä½ååè®°å½æ¥å¿ LogHelper.WriteLog($"å¼å§ä¿åå®¢æ·æ°æ®: {customerId}", LogHelper.LogType.Info); try { string result = UtilityHelper.HttpPost(...); LogHelper.WriteLog($"ä¿åæå: {customerId}", LogHelper.LogType.Info); } catch (Exception ex) { LogHelper.WriteLog($"ä¿å失败: {ex.Message}", LogHelper.LogType.Error); } ``` ### 11.7 é 置管çè§è ```csharp // â ä»é ç½®æä»¶è¯»å string apiUrl = ConfigurationManager.AppSettings["WebApiUrl"]; int pageSize = int.Parse(ConfigurationManager.AppSettings["PageSize"]); // â ä¸è¦ç¡¬ç¼ç // string apiUrl = "http://192.168.0.51:8081/"; ``` --- ## 12. 常è§é®é¢ä¸æ éææ¥ ### 12.1 æå»ºå¤±è´¥ #### é®é¢: DevExpress ç»ä»¶æ¾ä¸å° **åå **: DevExpress æªå®è£ æ NuGet æºæªé ç½® **è§£å³æ¹æ¡**: 1. å®è£ DevExpress v22.2 2. é ç½® NuGet æº: ``` å·¥å · â NuGet å 管çå¨ â ç¨åºå 管çå¨è®¾ç½® â ç¨åºå æº æ·»å : https://nuget.devexpress.com/<your_feed_key>/api ``` 3. è¿å NuGet å : ```bash nuget restore GsDevSolution.sln ``` #### é®é¢: CefSharp æ¬å°åºå 载失败 **åå **: `x86/` æ `x64/` ç®å½ç¼ºå¤± **è§£å³æ¹æ¡**: ç¡®ä¿è¾åºç®å½å å«: ``` x86/ libcef.dll chrome_elf.dll ... x64/ libcef.dll chrome_elf.dll ... ``` ### 12.2 è¿è¡æ¶é误 #### é®é¢: "æ æ³è¿æ¥å° API æå¡å¨" **ææ¥æ¥éª¤**: 1. æ£æ¥ `App.config` ä¸ç `WebApiUrl` 2. ä½¿ç¨æµè§å¨è®¿é® API å°å 3. æ£æ¥ç½ç»è¿æ¥ 4. æ¥çæ¥å¿æä»¶ `logs/{yyyy-MM-dd}.log` #### é®é¢: "ç»å½å¤±è´¥" **ææ¥æ¥éª¤**: 1. æ£æ¥ç¨æ·åå¯ç æ¯å¦æ£ç¡® 2. æ£æ¥å端 API æ¯å¦æ£å¸¸ 3. æ¥çæ¥å¿æä»¶ä¸çéè¯¯ä¿¡æ¯ 4. æ£æ¥æ°æ®åºè¿æ¥ #### é®é¢: "çªä½å 载失败" **åå **: åå°å建çªä½å¤±è´¥ **ææ¥æ¥éª¤**: 1. æ£æ¥å½åç©ºé´æ¯å¦æ£ç¡® 2. æ£æ¥çªä½ç±»æ¯å¦ä¸º public 3. æ£æ¥çªä½æ¯å¦ææ åæé 彿° 4. æ¥çæ¥å¿ä¸çå¼å¸¸å æ ### 12.3 æ§è½é®é¢ #### é®é¢: Grid å è½½æ ¢ **ä¼åæ¹æ¡**: 1. å¯ç¨å页 (ä½¿ç¨ `UcPageBar`) 2. åå°åæ° 3. ç¦ç¨ä¸å¿ è¦ç Grid ç¹æ§ 4. 使ç¨èææ¨¡å¼ (å¤§æ°æ®éæ¶) ```csharp gridView.OptionsView.ColumnAutoWidth = false; gridView.BestFitColumns(); ``` #### é®é¢: API 请æ±è¶ æ¶ **è§£å³æ¹æ¡**: 1. æ£æ¥ç½ç»ç¶åµ 2. ä¼åå端æ¥è¯¢ 3. å¢å è¶ æ¶æ¶é´ (ä¿®æ¹ `UtilityHelper.cs` ä¸çè¶ æ¶è®¾ç½®) ### 12.4 æ¥å¿ç¸å ³ #### æ¥çæ¥å¿ **ä½ç½®**: `logs/{yyyy-MM-dd}.log` **æ¥å¿çº§å«**: - `[Info]` - ä¿¡æ¯ - `[Warning]` - è¦å - `[Error]` - é误 #### æ¥å¿åå ¥å¤±è´¥ **åå **: æ åæé **è§£å³æ¹æ¡**: 1. 以管çå身份è¿è¡ 2. ä¿®æ¹ `LogPath` ä¸ºå ¬å ±ç®å½ 3. èµäºåºç¨ç®å½åæé ### 12.5 æ°æ®åºè¿æ¥é®é¢ #### Oracle è¿æ¥å¤±è´¥ **æ£æ¥**: - Oracle.ManagedDataAccess.dll æ¯å¦åå¨ - è¿æ¥å符串æ¯å¦æ£ç¡® - ç½ç»æ¯å¦å¯è¾¾ #### SQL Server è¿æ¥å¤±è´¥ **æ£æ¥**: - SQL Server æ¯å¦å¯ç¨ TCP/IP - ç«¯å£æ¯å¦å¼æ¾ (é»è®¤ 1433) - é²ç«å¢è§å ### 12.6 èªå¨æ´æ°é®é¢ #### æ´æ°æ£æ¥å¤±è´¥ **ææ¥**: 1. æ£æ¥ `AutoUpdaterXml` URL æ¯å¦å¯è®¿é® 2. æ£æ¥ XML æ ¼å¼æ¯å¦æ£ç¡® 3. æ£æ¥ç½ç»è¿æ¥ 4. æ¥çæ¥å¿æä»¶ #### æ´æ°ä¸è½½å¤±è´¥ **ææ¥**: 1. æ£æ¥æ´æ°å URL æ¯å¦ææ 2. æ£æ¥ç£çç©ºé´ 3. æ£æ¥åæé --- ## éå½ A: å端 API ç«¯ç¹ ### 认è¯ä¸ç¨æ· | ç«¯ç¹ | 说æ | |------|------| | `User/UserLogin` | ç¨æ·ç»å½ | | `User/GetUserLoginInfo` | è·åç¨æ·ä¿¡æ¯åèå | | `User/SetUserOrg` | 忢ç»ç» | ### ç»ç»ä¸èå | ç«¯ç¹ | 说æ | |------|------| | `Organization/GetListPage` | è·åç»ç»å表 | | `MenuAction/GetModelByNameSpace` | æ ¹æ®å½å空é´è·åçªä½ä¿¡æ¯ | ### éç¨å表æ¥è¯¢ **模å¼**: `{Module}/{Entity}/GetListPage` 示ä¾: - `BasicData/Customer/GetListPage` - 客æ·å表 - `BasicData/Items/GetListPage` - ç©æå表 - `Warehouse/Inventory/GetListPage` - åºåå表 --- ## éå½ B: å¿«éåè ### 常ç¨å½ä»¤ ```bash # è¿å NuGet å nuget restore GsDevSolution.sln # Debug æå»º msbuild GsDevSolution.sln /p:Configuration=Debug # Release æå»º msbuild GsDevSolution.sln /p:Configuration=Release # è¿è¡ç¨åº Gs.DevApp\bin\Debug\Gs.DevApp.exe ``` ### 常ç¨ä»£ç çæ®µ ```csharp // API è°ç¨ string result = UtilityHelper.HttpPost("Module/Action", "Action", jsonParam); dynamic dy = UtilityHelper.ReturnToDynamic(result); // æ¶æ¯æç¤º MsgHelper.ShowSuccess("æä½æå"); MsgHelper.ShowError("æä½å¤±è´¥"); // æ¥å¿è®°å½ LogHelper.WriteLog("æ¶æ¯å 容", LogHelper.LogType.Info); // Toast æç¤º Toast.Show("æç¤ºå 容", 3); ``` --- ## éå½ C: ç¸å ³ææ¡£ - **CLAUDE.md** - Claude Code AI è¾ å©å¼åæå - **DEVFRM_GUIDE.md** - DevFrm 模åè¯¦ç»æå - **ANALYSIS_REPORT.md** - æ¶æåææ¥å - **DevFrm详ç»åæ.md** - 模ååæ (䏿) --- ## èç³»ä¸æ¯æ å¦éææ¯æ¯æææ¥åé®é¢,请èç³»å¼åå¢éã **æåæ´æ°**: 2025-10-16 --- *æ¬ææ¡£éé¡¹ç®æç»æ´æ°,å»ºè®®å®ææ¥çææ°çæ¬ã* README.md
@@ -1,4 +1,508 @@ ## LB_MesClient # LanBMes MES Client (G-MES V2.0) èå®PCå端 <div align="center"> **èå®å¶é æ§è¡ç³»ç» (MES) Windows 客æ·ç«¯** [](https://dotnet.microsoft.com/download/dotnet-framework/net48) [](https://www.devexpress.com/) []() *为å¶é è½¦é´æä¾å ¨é¢çç产æ§è¡ãä»å¨ç®¡çãè´¨éæ§å¶åæ¥è¡¨åæè½å* [åè½ç¹æ§](#åè½ç¹æ§) ⢠[å¿«éå¼å§](#å¿«éå¼å§) ⢠[项ç®ç»æ](#项ç®ç»æ) ⢠[ææ¡£](#ææ¡£) ⢠[ææ¯æ ](#ææ¯æ ) </div> --- ## ð ç®å½ - [项ç®ç®ä»](#项ç®ç®ä») - [åè½ç¹æ§](#åè½ç¹æ§) - [å¿«éå¼å§](#å¿«éå¼å§) - [项ç®ç»æ](#项ç®ç»æ) - [æ ¸å¿æ¨¡å](#æ ¸å¿æ¨¡å) - [ææ¯æ ](#ææ¯æ ) - [å¼åæå](#å¼åæå) - [é¨ç½²è¯´æ](#é¨ç½²è¯´æ) - [ææ¡£](#ææ¡£) - [常è§é®é¢](#常è§é®é¢) --- ## ð¯ 项ç®ç®ä» **LanBMes MES Client** æ¯ä¸æ¬¾åºäº .NET Framework 4.8 å DevExpress WinForms æå»ºçä¼ä¸çº§å¶é æ§è¡ç³»ç»(MES)æ¡é¢åºç¨ç¨åºã该系ç»ä¸ºå¶é è½¦é´æä¾å®æ´çæ°ååè§£å³æ¹æ¡,æ¶µçç产计åãå·¥å管çãç产æ§è¡ãè´¨éæ§å¶ãä»å¨ç©æµçæ ¸å¿ä¸å¡æµç¨ã ### æ ¸å¿ä¼å¿ - ð¨ **ç°ä»£åçé¢** - åºäº DevExpress FluentDesign çç´è§ç¨æ·ä½éª - â¡ **é«åº¦éæ** - ä¸å端 REST API æ ç¼å¯¹æ¥,æ¯æ Oracle/SQL Server åæ°æ®åº - ð§ **çµæ´»æ©å±** - 150+ å¯å¤ç¨ä¸å¡æ§ä»¶,å¿«éæå»ºæ°åè½ - ð **æé管ç** - åºäºè§è²çç»ç²åº¦æéæ§å¶ - ð± **å¤ç»ç«¯æ¯æ** - PC æ¡é¢ç«¯ + ææ PDA 端ååä½ä¸ - ð **å·¥ä¸éæ** - æ¯æ Modbus TCP/RTU 设å¤éä¿¡ ### éç¨åºæ¯ - â 离æ£å¶é ä¸ (çµåãæºæ¢°ãæ±½è½¦é¶é¨ä»¶ç) - â éè¦ç²¾ç»å车é´ç®¡ççå¶é ä¼ä¸ - â å¤å·¥åºæµç¨ç®¡çä¸è´¨é追溯 - â ä»å¨ç©æµä¸æ¡ç 管ç - â çäº§æ°æ®ééä¸å®æ¶çæ§ --- ## ⨠åè½ç¹æ§ ### ð ç产管ç - **å·¥å管ç** - ç产任å¡ä¸è¾¾ãæäº§è°æ´ãè¿åº¦è¿½è¸ª - **ç产æ§è¡** - å·¥åºå¼å·¥ãæ°æ®ééãæµç¨å¡ç®¡ç - **è¿å·¥ç»´ä¿®** - ä¸è¯åè¿å·¥æµç¨ä¸ç»´ä¿®è®°å½ ### ð¦ ä»å¨ç©æµ - **åºåºç®¡ç** - çäº§é¢æãè¡¥æãéè´§ãå ¶ä»åºåº - **å ¥åºç®¡ç** - å°è´§å ¥åºãéåºãæé¡¹å ¥åº - **åºåæä½** - è°æ¨ãçç¹ãæ¡ç çæä¸æå° - **PDA ä½ä¸** - ææç»ç«¯æ«ç çè´§ä¸ç§»å¨ä½ä¸ ### â è´¨é管ç - **IPQC å¶ç¨æ£éª** - é¦ä»¶æ£éªãå·¡æ£ä½ä¸ - **FQC æåç»æ£** - æåè´¨éæ£éªä¸å¼å¸¸å¤ç - **IQC æ¥æè´¨æ£** - æ¥ææ½æ£ãAQL æ½æ ·æ¹æ¡ - **缺é·è¿½è¸ª** - 缺é·ä»£ç ãæ£éªé¡¹ç®ãè´¨éæ åç»´æ¤ ### ð åºç¡æ°æ® - **ä¸»æ°æ®ç®¡ç** - 客æ·ãä¾åºåãç©æã产线ãåå·¥ãé¨é¨ - **å·¥è£ è®¾å¤** - å¤¹å ·å·¥è£ å°è´¦ã计é设å¤ãç¹æ£ä»»å¡ - **æ¡ç 管ç** - æ¡ç æ¹éçæãæå°æ¨¡æ¿è®¾ç½® ### ð æ¥è¡¨åæ - **æ¥è¡¨è®¾è®¡** - FastReport/DevExpress å¯è§åæ¥è¡¨è®¾è®¡å¨ - **èªå®ä¹æ¥è¡¨** - çµæ´»çæ°æ®æºé ç½®ä¸æ¥è¡¨å¼æ ### âï¸ ç³»ç»ç®¡ç - **ç¨æ·æé** - ç¨æ·ãè§è²ãèåæéãæä½æé - **ç³»ç»é ç½®** - èåç»æãç»ç»æ¶æãåå·è§åãç³»ç»æ¥å¿ --- ## ð å¿«éå¼å§ ### åç½®è¦æ± ç¡®ä¿æ¨çå¼åç¯å¢æ»¡è¶³ä»¥ä¸è¦æ±: - â **æä½ç³»ç»**: Windows 10/11 æ Windows Server 2016+ - â **å¼åå·¥å ·**: Visual Studio 2022 (æ¨è) æ Visual Studio 2019 - â **.NET Framework**: 4.8 SDK - â **DevExpress**: v22.2+ 许å¯è¯ - â **çæ¬æ§å¶**: Git ### å éä»åº ```bash git clone <repository_url> cd LB_MesClient/DevApp ``` ### è¿åä¾èµ ```bash # ä½¿ç¨ NuGet è¿åå nuget restore GsDevSolution.sln # æå¨ Visual Studio ä¸: # å³é®è§£å³æ¹æ¡ â è¿å NuGet ç¨åºå ``` ### é ç½®å端 API ç¼è¾ `Gs.DevApp\App.config`,ä¿®æ¹å端 API å°å: ```xml <add key="WebApiUrl" value="http://your-api-server:port/" /> ``` ### æå»ºä¸è¿è¡ ```bash # å½ä»¤è¡æå»º msbuild GsDevSolution.sln /p:Configuration=Debug /p:Platform="Any CPU" # è¿è¡ç¨åº Gs.DevApp\bin\Debug\Gs.DevApp.exe ``` **æè å¨ Visual Studio ä¸**: 1. æå¼ `GsDevSolution.sln` 2. 设置 `Gs.DevApp` 为å¯å¨é¡¹ç® 3. æ `F5` å¼å§è°è¯ --- ## ð 项ç®ç»æ ``` GsDevSolution/ â âââ Gs.DevApp/ # 主客æ·ç«¯åºç¨ç¨åº â âââ DevFrm/ # ä¸å¡çªä½ (18个é¢å模å) â â âââ BasicData/ # åºç¡æ°æ® (客æ·/ä¾åºå/ç©æ/产线) â â âââ Work/ # ç产æ§è¡ (å¼å·¥/æ°æ®éé/è¿å·¥) â â âââ WOM/ # å·¥å管ç (ä»»å¡ä¸è¾¾/æäº§) â â âââ QC/ # è´¨é管çéç¨æ¨¡å â â âââ IPQC/ # å¶ç¨æ£éª (é¦ä»¶/å·¡æ£) â â âââ FQC/ # æåç»æ£ â â âââ RkQC/ # æ¥æè´¨æ£ â â âââ Ck/ # åºåºç®¡ç â â âââ Rk/ # å ¥åºç®¡ç â â âââ Warehouse/ # ä»åºæä½ â â âââ Sales/ # éå®è®¢å â â âââ WW/ # å§å¤ç®¡ç â â âââ Rpt/ # æ¥è¡¨è®¾è®¡ â â âââ Sys/ # ç³»ç»è®¾ç½® â â âââ User/ # ç¨æ·æé â â âââ JJGZ/ # å¤¹å ·å·¥è£ â â âââ BarCode/ # æ¡ç 管ç â â âââ PDA/ # ææç»ç«¯ â âââ Entity/ # æ°æ®ä¼ è¾å¯¹è±¡ (DTO) â âââ ToolBox/ # å ¬å ±å·¥å ·ç±»åº â â âââ UtilityHelper.cs # HTTP请æ±ãJSONè§£æãGridåå§å â â âââ LogHelper.cs # æ¥å¿è®°å½ â â âââ MsgHelper.cs # æ¶æ¯æç¤º â â âââ ModbusHelper.cs # Modbuséä¿¡ â âââ UserControl/ # å¯å¤ç¨æ§ä»¶åº (150+) â â âââ UcToolBarMenu.cs # CRUDå·¥å ·æ â â âââ UcPageBar.cs # å页æ§ä»¶ â â âââ UcLook*.cs # 60+ æ°æ®æ¥æ¾æ§ä»¶ â â âââ Toast.cs # Toastæç¤º â âââ Resources/ # èµæºæä»¶ â âââ App.config # åºç¨é ç½® â âââ Program.cs # åºç¨å ¥å£ â âââ Gs.WeightIqc/ # IQC æ¥æç§°é客æ·ç«¯ âââ Gs.WeightLine/ # 产线称é客æ·ç«¯ âââ Gs.Setup/ # å®è£ ç¨åºé¡¹ç® (.vdproj) âââ packages/ # NuGet å ç¼å æ»è®¡: - 150+ ä¸å¡çªä½ - 150+ å¯å¤ç¨æ§ä»¶ - 18 个ä¸å¡é¢å模å ``` --- ## ð§© æ ¸å¿æ¨¡å ### 1ï¸â£ åºç¡æ°æ®ç®¡ç (BasicData) ç»´æ¤ç³»ç»è¿è¡æéçä¸»æ°æ®,å æ¬å®¢æ·ãä¾åºåãç©æã产线ãåå·¥ãé¨é¨çæ ¸å¿åºç¡æ°æ®ã **å ³é®çªä½**: `Frm_Customer`, `Frm_Supplier`, `Frm_MesItems`, `Frm_MesWorkshopLine` ### 2ï¸â£ ç产æ§è¡ (Work) æ¯æå·¥åºå¼å·¥ãæ°æ®ééãæµç¨å¡ç®¡çãè¿å·¥ç»´ä¿®çç产ç°åºä½ä¸ãæ¯æ Modbus 设å¤å®æ¶æ°æ®ééã **å ³é®çªä½**: `Frm_WorkStart`, `Frm_WorkProcesses`, `Frm_Work01~09`, `Frm_Repair` ### 3ï¸â£ è´¨é管ç (QC/IPQC/FQC/RkQC) æä¾å¤çº§è´¨éæ£éªä½ç³»,å æ¬å¶ç¨æ£éª (IPQC)ãæåç»æ£ (FQC)ãæ¥æè´¨æ£ (IQC/RkQC),æ¯æ AQL æ½æ ·æ¹æ¡ä¸ç¼ºé·è¿½è¸ªã **å ³é®çªä½**: `Frm_ShouJian`, `Frm_XunJian`, `Frm_Fqc`, `Frm_Cqfa` ### 4ï¸â£ ä»å¨ç®¡ç (Ck/Rk/Warehouse) è¦çåºå ¥åºå ¨æµç¨,æ¯æçäº§é¢æãè¡¥æãå°è´§å ¥åºãéåºãè°æ¨ãçç¹çæä½,éææ¡ç 管çã **å ³é®çªä½**: `Frm_MesInvItemOut_SCLL`, `Frm_MesInvItemArn`, `Frm_MesDbck`, `Frm_ArrivalBarcode` ### 5ï¸â£ å·¥å管ç (WOM) ç产任å¡ä¸è¾¾ãå·¥åæäº§ãè¿åº¦è¿½è¸ªãå·¥åç¶æç®¡çã ### 6ï¸â£ æ¥è¡¨ä¸å¿ (Rpt) æ¯æ FastReport å DevExpress æ¥è¡¨,æä¾å¯è§åæ¥è¡¨è®¾è®¡å¨ä¸èªå®ä¹æ¥è¡¨å¼æã **å ³é®çªä½**: `EasyRptDesign`, `EasyRptEdt` --- ## ð§ ææ¯æ ### æ ¸å¿æ¡æ¶ä¸åº | ææ¯ | çæ¬ | ç¨é | |------|------|------| | **.NET Framework** | 4.8 | åºç¨åºç¡æ¡æ¶ | | **C# WinForms** | - | æ¡é¢åºç¨å¼å | | **DevExpress** | v22.2.3 | UIç»ä»¶åº (FluentDesign, XtraGrid, XtraTab, XtraBars) | ### ç¬¬ä¸æ¹ç»ä»¶ | ç»ä»¶ | çæ¬ | ç¨é | |------|------|------| | **CefSharp** | 109.1.110 | åµå ¥å¼ Chromium æµè§å¨ | | **AutoUpdater.NET** | 1.9.2 | èªå¨è½¯ä»¶æ´æ° | | **NModbus** | 3.0.81 | å·¥ä¸è®¾å¤éä¿¡ (Modbus TCP/RTU) | | **Newtonsoft.Json** | 13.0.3 | JSON åºåå | | **System.Text.Json** | 8.0.4 | ç°ä»£ JSON æ¯æ | | **Oracle.ManagedDataAccess** | ææ° | Oracle æ°æ®åºè®¿é® | | **System.Data.SqlClient** | ææ° | SQL Server æ°æ®åºè®¿é® | ### æ¶ææ¨¡å¼ ``` âââââââââââââââââââââââââââââââââââââââ â UI Layer (DevExpress WinForms) â â ç¨æ·äº¤äºå± ââââââââââââââââââââââââââââââââââââââ⤠â Business Logic (ToolBox + Forms) â â ä¸å¡é»è¾å± ââââââââââââââââââââââââââââââââââââââ⤠â REST API (HTTP/JSON) â â éä¿¡å± ââââââââââââââââââââââââââââââââââââââ⤠â Backend API Server â â æå¡ç«¯ (å«å¤é¡¹ç®) ââââââââââââââââââââââââââââââââââââââ⤠â Data Layer (Oracle/SQL Server) â â æ°æ®æä¹ åå± âââââââââââââââââââââââââââââââââââââââ ``` --- ## ð å¼åæå ### æ ¸å¿è®¾è®¡æ¨¡å¼ #### 1. HTTP 请æ±éä¸å ææ API è°ç¨ç»ä¸ä½¿ç¨ `UtilityHelper.HttpPost()`: ```csharp string result = UtilityHelper.HttpPost( "BasicData/Customer/GetListPage", // APIè·¯å¾ "GetListPage", // æ¹æ³å jsonParam, // JSONåæ° true // æ¾ç¤ºå è½½æ¡ ); dynamic dy = UtilityHelper.ReturnToDynamic(result); if (dy.code == 200) { // å¤çæ°æ® } ``` #### 2. 卿çªä½å è½½ (åå°) éè¿åå°å®ç°èå驱å¨ççªä½å¨æå è½½: ```csharp Form form = (Form)Assembly.GetExecutingAssembly() .CreateInstance("Gs.DevApp.DevFrm.BasicData.Frm_Customer"); ``` **ä¼å¿**: èåç»æå®å ¨ç±å端æ§å¶,æ éä¿®æ¹ä»£ç å³å¯è°æ´èåã #### 3. å¯å¤ç¨æ§ä»¶ä¼å é¡¹ç®æä¾ 150+ å¯å¤ç¨æ§ä»¶,æ°åè½å¼ååºä¼å 使ç¨: ```csharp // ä½¿ç¨æ å CRUD å·¥å ·æ UcToolBarMenu toolBar = new UcToolBarMenu(); toolBar.AddClick += BtnAdd_Click; // 使ç¨å页æ§ä»¶ UcPageBar pageBar = new UcPageBar(); pageBar.PageChanged += LoadData; // ä½¿ç¨æ°æ®æ¥æ¾æ§ä»¶ UcLookCustomer lookCustomer = new UcLookCustomer(); lookCustomer.ShowDialog(); ``` ### å¼åè§è #### å½åè§è | ç±»å | è§å | ç¤ºä¾ | |------|------|------| | 主çªä½ | `Frm_{ä¸å¡å}` | `Frm_Customer.cs` | | ç¼è¾çªä½ | `Frm_{ä¸å¡å}Edit` | `Frm_CustomerEdit.cs` | | å¯¹è¯æ¡ | `Dlg_{ä¸å¡å}` | `Dlg_SelectCustomer.cs` | | ç¨æ·æ§ä»¶ | `Uc{åè½å}` | `UcToolBarMenu.cs` | #### å¼å¸¸å¤çè§è ```csharp try { string result = UtilityHelper.HttpPost(...); dynamic dy = UtilityHelper.ReturnToDynamic(result); if (dy.code == 200) { // æåå¤ç } else { MsgHelper.ShowError(dy.msg.ToString()); LogHelper.WriteLog($"API Error: {dy.msg}", LogHelper.LogType.Error); } } catch (Exception ex) { MsgHelper.ShowError($"æä½å¤±è´¥: {ex.Message}"); LogHelper.WriteLog($"Exception: {ex}", LogHelper.LogType.Error); } ``` #### æ¥å¿è®°å½è§è ```csharp // å ³é®æä½ååè®°å½æ¥å¿ LogHelper.WriteLog($"å¼å§ä¿åå®¢æ·æ°æ®: {customerId}", LogHelper.LogType.Info); // æ¥å¿ä½ç½®: logs/{yyyy-MM-dd}.log ``` ### æ·»å æ°æ¨¡å 1. å¨ `DevFrm/` ä¸å建æ°ç®å½ 2. å建主çªä½ (ç»§æ¿ `XtraForm`) 3. ä½¿ç¨ `UtilityHelper.HttpPost()` è°ç¨ API 4. å¤ç¨ `UserControl/` ä¸çæ§ä»¶ 5. å¨å端添å 对åºèå项 --- ## ð¢ é¨ç½²è¯´æ ### æå»º Release çæ¬ ```bash # æ¸ çå¹¶éæ°æå»º msbuild Gs.DevApp\Gs.DevApp.csproj /t:Clean msbuild Gs.DevApp\Gs.DevApp.csproj /t:Rebuild /p:Configuration=Release /p:Platform="Any CPU" ``` ### é ç½®æ¸ å é¨ç½²åéä¿®æ¹ `Gs.DevApp.exe.config`: - â ä¿®æ¹ `WebApiUrl` 为ç产ç¯å¢ API å°å - â é ç½® `IsAutoUpdater` å `AutoUpdaterXml` - â ç¡®ä¿ `x86/` å `x64/` ç®å½å®æ´ (CefSharp ä¾èµ) ### 使ç¨å®è£ ç¨åº 1. æå¼ `Gs.Setup\Gs.Setup.vdproj` 2. é ç½®çæ¬å·å产åä¿¡æ¯ 3. çæ MSI å®è£ å 4. è¾åº: `Gs.Setup\Release\Gs.Setup.msi` ### èªå¨æ´æ° ç¼è¾ `AutoUpdater.xml`: ```xml <?xml version="1.0" encoding="utf-8"?> <update> <version>0.2.0.0</version> <url>http://your-server/updates/Gs.DevApp_v0.2.0.0.zip</url> <changelog><![CDATA[<h3>æ´æ°å 容</h3>...]]></changelog> <mandatory>false</mandatory> </update> ``` --- ## ð ææ¡£ ### 宿´ææ¡£ - ð **[HELP.md](HELP.md)** - 宿´ç项ç®å¸®å©æå (䏿,1400+ è¡) - ð **[CLAUDE.md](CLAUDE.md)** - Claude Code AI è¾ å©å¼åæå - ð **[DEVFRM_GUIDE.md](DEVFRM_GUIDE.md)** - DevFrm 模åè¯¦ç»æå (å¦åå¨) - ð **[ANALYSIS_REPORT.md](ANALYSIS_REPORT.md)** - æ¶æåææ¥å (å¦åå¨) ### å¿«é龿¥ - [é¡¹ç®æ¦è§](HELP.md#1-é¡¹ç®æ¦è§) - [æå»ºä¸è¿è¡](HELP.md#5-æå»ºä¸è¿è¡) - [åè½æ¨¡å详解](HELP.md#6-devfrm-åè½æ¨¡å详解) - [æ¶æä¸è®¾è®¡æ¨¡å¼](HELP.md#7-æ¶æä¸è®¾è®¡æ¨¡å¼) - [é 置说æ](HELP.md#9-é 置说æ) - [å¼åè§è](HELP.md#11-å¼åè§è䏿佳å®è·µ) - [常è§é®é¢](HELP.md#12-常è§é®é¢ä¸æ éææ¥) --- ## â 常è§é®é¢ ### Q: DevExpress ç»ä»¶æ¾ä¸å°? **A**: ç¡®ä¿å·²å®è£ DevExpress v22.2 å¹¶é ç½® NuGet æº: ``` å·¥å · â NuGet å 管çå¨ â ç¨åºå 管çå¨è®¾ç½® â ç¨åºå æº æ·»å : https://nuget.devexpress.com/<your_feed_key>/api ``` ### Q: CefSharp å 载失败? **A**: ç¡®ä¿è¾åºç®å½å å« `x86/` å `x64/` åç®å½åå ¶å 容ã ### Q: æ æ³è¿æ¥å° API æå¡å¨? **A**: æ£æ¥ `App.config` ä¸ç `WebApiUrl` é ç½®,ç¡®ä¿å端 API æå¡æ£å¸¸è¿è¡ã ### Q: å¦ä½è°è¯å¤ä¸ªå®ä¾? **A**: å¨ `Program.cs` 䏿³¨éåå®ä¾æ£æ¥ä»£ç : ```csharp // Process[] MyProcesses = Process.GetProcessesByName("Gs.DevApp"); // if (MyProcesses.Length > 1) { MyProcesses[0].Kill(); } ``` ### Q: æ¥å¿æä»¶å¨åªé? **A**: æ¥å¿ä½ç½®: `logs/{yyyy-MM-dd}.log` (åºç¨ç¨åºç®å½ä¸) --- ## ð 许å¯è¯ æ¬é¡¹ç®ä¸ºä¸æè½¯ä»¶,æªç»ææä¸å¾å¤å¶ãååæä¿®æ¹ã --- ## ð¤ è´¡ç®ä¸æ¯æ å¦éææ¯æ¯æææ¥åé®é¢,请èç³»å¼åå¢éã --- ## ð 项ç®ç»è®¡ - **æ»ä»£ç è¡æ°**: 约 100,000+ è¡ - **ä¸å¡çªä½**: 150+ 个 - **å¯å¤ç¨æ§ä»¶**: 150+ 个 - **ä¸å¡é¢å**: 18 个模å - **æ¯ææ°æ®åº**: Oracle + SQL Server - **å¼å卿**: æç»è¿ä»£ä¸ --- <div align="center"> **G-MES V2.0** - æºè½å¶é ,æ°åæªæ¥ *æåæ´æ°: 2025-10-16* </div>