kyy
2025-10-17 4e447fa71b63a1da161904b335a166031d1cc853
Merge branch 'master' of http://43.142.96.171:8080/r/~kyy/LB_MesClient
已修改5个文件
2653 ■■■■■ 文件已修改
DevApp/DevFrm详细分析.md 445 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DevApp/Gs.DevApp/DevFrm/FrmLogin.resx 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DevApp/Gs.DevApp/DevFrm/QC/MesQcExceptional.cs 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DevApp/HELP.md 1545 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README.md 508 ●●●●● 补丁 | 查看 | 原始文档 | 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 å®¢æˆ·ç«¯**
[![.NET Framework](https://img.shields.io/badge/.NET%20Framework-4.8-blue.svg)](https://dotnet.microsoft.com/download/dotnet-framework/net48)
[![DevExpress](https://img.shields.io/badge/DevExpress-v22.2-orange.svg)](https://www.devexpress.com/)
[![License](https://img.shields.io/badge/license-Proprietary-red.svg)]()
*为制造车间提供全面的生产执行、仓储管理、质量控制和报表分析能力*
[功能特性](#功能特性) â€¢ [快速开始](#快速开始) â€¢ [项目结构](#项目结构) â€¢ [文档](#文档) â€¢ [技术栈](#技术栈)
</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>