DevApp/HELP.md
@@ -1,390 +1,1474 @@
# 蓝宝MES系统代码结构详细说明
# 蓝宝 MES 客户端帮助指南 (G-MES V2.0)
## 项目概述
> **LanBMes MES Client** 是基于 .NET Framework 4.8 和 DevExpress WinForms 构建的企业级制造执行系统(MES)桌面应用程序,为制造车间提供全面的生产执行、仓储管理、质量控制和报表分析能力。
蓝宝PC前端 (LanBao PC Frontend) 是一个基于 .NET Framework 4.8 的制造执行系统 (MES) 客户端应用程序,采用 Windows Forms 技术栈和 DevExpress UI 组件库,提供完整的制造业务管理功能。
## 目录
## 技术栈
- [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-常见问题与故障排查)
- **.NET Framework 4.8** - 核心应用框架
- **DevExpress v22.2/v129.0** - 主要UI组件库
- **C# Windows Forms** - 桌面应用程序框架,MDI接口设计
- **Oracle Database** - 数据持久化 (Oracle.ManagedDataAccess 23.6.0)
- **CefSharp 109.1.110/129.0** - 嵌入式Web浏览器
- **WebView2** - 现代Web视图集成
- **Newtonsoft.Json 13.0.3** - JSON序列化
- **AutoUpdater.NET** - 自动应用程序更新
- **NModbus 3.0.81** - 工业通信协议
- **FastReport** - 报表生成系统
---
## 项目架构结构
## 1. 项目概览
### 顶级目录结构
### 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 业务覆盖范围
```
DevApp/
├── Gs.DevApp/                    # 主应用程序项目
│   ├── DevFrm/                  # 业务功能模块窗体
│   ├── Entity/                  # 数据实体类
│   ├── ToolBox/                 # 工具类和辅助函数
│   ├── UserControl/             # 自定义用户控件
│   ├── Properties/              # 项目属性
│   ├── Resources/               # 资源文件
│   ├── bin/                     # 编译输出目录
│   └── obj/                     # 编译临时文件
├── Gs.WeightIqc/                # IQC称重检测模块
├── Gs.WeightLine/               # 生产线称重模块
├── Gs.Setup/                    # 安装程序项目
└── packages/                    # NuGet包管理目录
基础数据管理 → 生产计划 → 工单管理 → 生产执行 → 质量检验 → 仓储物流 → 报表分析
     ↓            ↓          ↓          ↓          ↓          ↓          ↓
  客户/供应商   排产调整   任务下达   工序开工   多级质检   出入库管理   FastReport
  物料主数据   产线分配   流程卡     数据采集   缺陷追踪   库存调拨   统计分析
  工装设备     资源协调   进度追踪   返工维修   AQL抽样   条码管理   自定义报表
```
### 应用程序入口点
---
- **Program.cs** - 应用程序主入口,单实例管理,CefSharp初始化
- **DevFrm/FrmLogin.cs** - 登录窗体,自动更新器集成
- **DevFrm/FrmMain.cs** - 主MDI窗体,DevExpress FluentDesign界面
## 2. 解决方案结构
## 核心业务模块详解 (DevFrm/)
### 2.1 项目组成
### 1. 基础数据管理 (BasicData/)
**功能:** 系统基础主数据维护和管理
```
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 包目录】
```
**主要模块:**
- `Frm_Customer.cs` - 客户信息管理
- `Frm_Supplier.cs` - 供应商信息管理
- `Frm_SupplierSrm.cs` - SRM供应商关系管理
- `Frm_MesItems.cs` - 物料主数据管理
### 2.2 核心目录详解
#### DevFrm/ - 业务窗体
所有业务窗体按领域划分,每个子目录包含该领域的所有表单和对话框。
**命名规范**: `Frm_{业务名称}.cs` 或 `Frm_{业务名称}_{子类型}.cs`
#### Entity/ - 数据模型
| 文件 | 说明 |
|------|------|
| `LoginInfoModel.cs` | 登录用户信息模型 |
| `PageQueryModel.cs` | 分页查询通用模型 |
| `ReturnModel.cs` | API 返回结果封装 |
#### ToolBox/ - 工具类库
| 文件 | 说明 |
|------|------|
| `UtilityHelper.cs` | **核心工具类**: HTTP请求、JSON解析、Grid初始化等 |
| `LogHelper.cs` | 日志记录工具 (写入 `logs/{yyyy-MM-dd}.log`) |
| `MsgHelper.cs` | 统一消息提示封装 (基于 DevExpress) |
| `UpdateParentEventArgs.cs` | 窗体间事件通信机制 |
| `ModbusHelper.cs` | Modbus 设备通信封装 |
#### UserControl/ - 可复用控件
| 控件类型 | 示例 | 说明 |
|----------|------|------|
| **工具栏** | `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_MesItemType.cs` - 物料分类管理
- `Frm_MesUnit.cs` - 计量单位管理
- `Frm_MesDepot.cs` - 仓库信息管理
- `Frm_MesWorkshopLine.cs` - 车间生产线配置
- `Frm_Staff.cs` - 员工信息管理
- `Frm_Department.cs` - 部门信息管理
### 2. 仓库出库模块 (Ck/)
**功能:** 仓库出库业务流程管理,包含各种出库类型
#### 产线管理 - Frm_MesWorkshopLine.cs
**主要模块:**
- `Frm_MesItemCl.cs` / `Frm_MesItemClDj.cs` - 材料出库申请/单据
- `Frm_MesItemBl.cs` / `Frm_MesItemBlDJ.cs` - 补料出库申请/单据
- `Frm_MesItemQt.cs` / `Frm_MesItemQtDj.cs` - 其他出库申请/单据
- `Frm_MesCgthSq.cs` / `Frm_MesCgthSqDj.cs` - 采购退货申请/单据
- `Frm_MesSctkSq.cs` / `Frm_MesSctkSqDj.cs` - 生产退库申请/单据
- `Frm_MesInvItemOut_SCLL.cs` - 生产领料出库
- `Frm_MesYanTui.cs` - 验收退货管理
- 车间产线配置
- 工作中心定义
### 3. 仓库入库模块 (Rk/)
**功能:** 仓库入库业务流程管理
#### 其他主数据
**主要模块:**
- `Frm_MesItemTbl.cs` - 材料入库台账
- `Frm_MesItemTbl_RK.cs` - 入库单据处理
- `Frm_MesItemTblShow.cs` - 入库信息展示
- `Frm_MesItemQtrk.cs` / `Frm_MesItemQtrkDj.cs` - 其他入库申请/单据
- `Frm_MesInvItemArn.cs` - 到货入库管理
- `Frm_MesInvItemIns.cs` - 检验入库管理
- `Frm_Staff.cs` - 员工信息
- `Frm_Department.cs` - 部门组织
### 4. 质量控制模块
---
#### 4.1 FQC (Final Quality Control) - 最终质量控制
**功能:** 成品出货前最终质量检验
- `Frm_Fqc.cs` - FQC检验主界面
- `Frm_FqcDetect01.cs` - FQC检测流程
- `Frm_FQCItem.cs` - FQC检验项目管理
### 6.3 仓储管理域
#### 4.2 IPQC (In-Process Quality Control) - 过程质量控制
**功能:** 生产过程中的质量检验和监控
- `Frm_ShouJian.cs` - 首件检验
- `Frm_ShouJianDetect01.cs` - 首件检测流程
- `Frm_ShouJianDetect01H5.cs` - 首件检测H5版本
- `Frm_XunJian.cs` - 巡检管理
- `Frm_XunJianDetect01.cs` - 巡检检测流程
- `Frm_XunJianDetect01Show.cs` - 巡检结果展示
#### 出库管理 (Ck/)
#### 4.3 RkQC (Receiving Quality Control) - 来料质量控制
**功能:** 来料和入库物料质量检验
- `Frm_RkDetect01.cs` - 来料检验
- `Frm_CqDetect01.cs` - 抽检检验
- `Frm_QtrkDetect01.cs` - 其他入库检验
- `Frm_WwrkDetect01.cs` - 完工入库检验
- `Frm_ShouTuoDetect01.cs` - 委托加工检验
- `Frm_Cqfa.cs` - 抽检方案管理
- `Frm_CqfaItems.cs` - 抽检项目配置
- `Frm_Cqsq.cs` - 抽检申请
| 窗体 | 功能 |
|------|------|
| `Frm_MesInvItemOut_SCLL.cs` | 生产领料出库 |
| `Frm_MesItemBl.cs` | 补料出库 |
| `Frm_MesCgthSq.cs` | 采购退货申请 |
| `Frm_MesItemQtck.cs` | 其他出库 |
#### 4.4 QC - 质量控制通用模块
**功能:** 质量管理通用功能和配置
- `Frm_MesQaMj.cs` - 质量检验模板
- `Frm_MesQaItemsDetect01.cs` - 检验项目检测
- `Frm_MesQaItemsDetect01Input.cs` - 检验数据录入
- `Frm_MesQmCheckitemDt.cs` - 检验项目明细
- `Frm_MesQmAql1.cs` - AQL抽样标准
- `Frm_MesDefectCodeShow.cs` - 缺陷代码展示
- `Frm_IQCLookups.cs` - IQC查询界面
- `Frm_MesSysLookups.cs` - 系统查询配置
#### 入库管理 (Rk/)
### 5. 工单管理模块 (WOM/)
**功能:** 生产工单全生命周期管理
| 窗体 | 功能 |
|------|------|
| `Frm_MesInvItemArn.cs` | 到货入库 |
| `Frm_MesItemTbl.cs` | 材料入库台账 |
| `Frm_MesItemQtrk.cs` | 其他入库 |
**主要模块:**
- `Frm_MesWorkProd.cs` - 生产工单管理
- `Frm_MesProcGx.cs` - 工艺流程管理
- `Frm_MesProcGx0.cs` - 工艺流程基础版
- `Frm_MesProcGxShow.cs` - 工艺流程展示
- `Frm_Womdaa.cs` - 工单档案管理
- `Frm_Womdaahb.cs` - 工单档案汇总
- `Frm_WomdaaNbz.cs` - 工单档案内部转移
- `Frm_Womcaa.cs` - 工单成本分析
- `Frm_Wompba.cs` - 工单派工管理
- `Frm_WompbaGx.cs` - 工单派工工序
- `Frm_WomFanGong.cs` - 返工单管理
- `Frm_MesScrkDj.cs` - 生产入库单据
- `Frm_MesScrksqDj.cs` - 生产入库申请单据
- `FrmAutoRk.cs` - 自动入库
- `FrmBackFlash.cs` - 反冲处理
#### 仓库操作 (Warehouse/)
### 6. 生产作业模块 (Work/)
**功能:** 车间生产作业执行和管理
| 窗体 | 功能 |
|------|------|
| `Frm_MesDbck.cs` | 调拨出库 |
| `Frm_MesRohIn.cs` | 原材入库 |
| `Frm_ArrivalBarcode.cs` | 到货条码生成 |
| `Frm_InitialBarcode.cs` | 初始条码维护 |
**主要模块:**
- `Frm_WorkStart.cs` - 生产开工
- `Frm_Work01.cs` - 生产作业主界面
- `Frm_Work09.cs` - 生产作业流程9
- `Frm_WorkProcesses.cs` - 工序作业管理
- `Frm_WorkTechnique.cs` - 工艺技术管理
- `Frm_WorkTechniqueShow.cs` - 工艺技术展示
- `Frm_Repair.cs` - 返修作业管理
#### 手持终端 (PDA/)
### 7. 车间管理模块 (WW/)
**功能:** 车间现场作业和生产调度
提供简化的扫码作业界面,用于:
- 快速理货
- 库存盘点
- 条码扫描
- 移动作业
**主要模块:**
- `Frm_WwBl.cs` / `Frm_WwBlDj.cs` - 车间补料申请/单据
- `Frm_WwCl.cs` / `Frm_WwClDj.cs` - 车间领料申请/单据
- `Frm_WwTbl.cs` / `Frm_WwTblDj.cs` - 车间台账/单据
- `Frm_WwLlDj.cs` - 车间领料单据
- `Frm_WwPc.cs` - 车间排产管理
- `Frm_WwGd.cs` - 车间工单管理
- `Frm_ProductionOrder.cs` - 生产订单管理
---
### 8. 仓库管理模块 (Warehouse/)
**功能:** 仓库综合管理功能
### 6.4 质量管理域
**主要模块:**
- `Frm_InitialBarcode.cs` - 初始条码管理
- `Frm_ArrivalBarcode.cs` - 到货条码管理
- `Frm_MesShouTuo.cs` / `Frm_MesShouTuoDj.cs` - 委托加工申请/单据
- `Frm_MesShouTui.cs` / `Frm_MesShouTuiDj.cs` - 委托退货申请/单据
- `Frm_MesDbck.cs` / `Frm_MesDbckDj.cs` - 调拨出库申请/单据
- `Frm_MesRohIn.cs` - 原材料入库
#### QC/ - 质量通用模块
### 9. 销售管理模块 (Sales/)
**功能:** 销售订单和发货管理
- 缺陷代码维护 (`DefectCode*.cs`)
- 检验项目设置 (`Frm_MesQaItemsDetect01.cs`)
- AQL 抽样方案 (`Frm_MesQmAql1.cs`)
- 质量标准定义
**主要模块:**
- `Frm_SalesOrder.cs` - 销售订单管理
- `Frm_SalesDeliver.cs` / `Frm_SalesDeliverDj.cs` - 销售发货申请/单据
- `Frm_SalesDeliverSelect.cs` - 发货单选择
- `Frm_SalesReturnNotice.cs` / `Frm_SalesReturnNoticeDj.cs` - 销售退货通知申请/单据
- `Frm_SalesReturnNoticeSelect.cs` - 退货通知选择
- `Frm_SalesReturnNoticeSelect2.cs` - 退货通知选择2
- `Frm_SalesReturnNoticeSelectLink.cs` - 退货通知关联选择
#### IPQC/ - 制程检验
### 10. 条码管理模块 (BarCode/)
**功能:** 条码生成、打印和管理
| 窗体 | 功能 |
|------|------|
| `Frm_ShouJian.cs` | 首件检验 |
| `Frm_XunJian.cs` | 巡检作业 |
| H5 检验界面 | 移动端检验 |
**主要模块:**
- `Frm_BoxCode.cs` - 箱码管理
- `SelectBoxDaa.cs` - 选择箱档案
- `SelectBoxItem.cs` - 选择箱项目
#### FQC/ - 成品终检
### 11. PDA移动设备模块 (PDA/)
**功能:** 移动设备集成和用户绑定
| 窗体 | 功能 |
|------|------|
| `Frm_Fqc.cs` | 成品检验主界面 |
| `Frm_FqcDetect01.cs` | 检验数据录入 |
| `MesFqcExceptional.cs` | 异常处理 |
**主要模块:**
- `Frm_UserBind.cs` - 用户绑定
- `Frm_UserBindLst.cs` - 用户绑定列表
- `Frm_AreaBind.cs` - 区域绑定
#### RkQC/ - 来料质检
### 12. 计件工资模块 (JJGZ/)
**功能:** 员工计件工资计算和管理
| 窗体 | 功能 |
|------|------|
| `Frm_Cqfa.cs` | 抽检方案 |
| `Frm_CqfaItems.cs` | 检验项配置 |
| `Frm_QtrkDetect01.cs` | 来料检验 |
| `Frm_WwrkDetect01.cs` | 委外来料检验 |
**主要模块:**
- `Frm_MesJJSalary.cs` - 计件工资管理
- `Frm_MesJSSalary.cs` - 计时工资管理
- `Frm_MesJjgzSchedule.cs` - 工资排班管理
- `Frm_MesTimeType.cs` - 时间类型管理
- `Frm_MesAttanCon.cs` - 考勤统计
- `Frm_MesDeToLine.cs` - 员工分线管理
- `Frm_MESJJERRORJS.cs` - 计件错误校正
---
### 13. 报表模块 (Rpt/)
**功能:** 报表查询和生成
### 6.5 制造执行域 (Work/)
**主要模块:**
- `Frm_MesQL.cs` - MES查询报表
#### 工序作业
### 14. 系统管理模块 (Sys/)
**功能:** 系统配置和管理功能
| 窗体 | 功能 |
|------|------|
| `Frm_WorkStart.cs` | 工序开工 |
| `Frm_WorkProcesses.cs` | 流程卡管理 |
| `Frm_Work01.cs` ~ `Frm_Work09.cs` | 各工站数据采集 |
| `Frm_Repair.cs` | 返工维修 |
**主要模块:**
- `Frm_Config.cs` - 系统配置
- `Frm_MesSysPageview.cs` - 系统页面视图
- `Frm_PrintInfo.cs` - 打印信息管理
- `Frm_PrintUser.cs` - 打印用户管理
#### 特殊功能
### 15. 用户管理模块 (User/)
**功能:** 用户权限和角色管理
- 包含用户认证、授权、角色管理等功能
- **Modbus 设备通信**: 支持实时读取工业设备数据
- **SQL Server 直连**: 部分工站直接与 SQL Server 交互
- **实时监控**: 工站状态实时展示
## 支撑模块详解
---
### Entity/ - 数据实体层
**功能:** 定义数据传输对象和业务实体
### 6.6 工单管理域 (WOM/)
**核心类:**
- `LoginInfoModel.cs` - 登录用户信息管理,单例模式实现
- `ReturnModel.cs` - API返回结果统一封装
- `PageQueryModel.cs` - 分页查询模型
- `XlsOutModel.cs` - Excel导出模型
- 生产任务下达
- 工单排产调整
- 工单进度追踪
- 工单状态管理
### ToolBox/ - 工具类库
**功能:** 提供通用工具函数和帮助类
---
**核心类:**
- `UtilityHelper.cs` - 通用工具类,包含UI操作、HTTP通信、数据处理等
- `LogHelper.cs` - 日志记录工具,支持调试和错误日志
- `MsgHelper.cs` - 消息提示工具,标准化用户交互
- `UpdateParentEventArgs.cs` - 父窗体更新事件参数
### 6.7 销售管理域 (Sales/)
### UserControl/ - 自定义控件库
**功能:** 可复用的用户界面控件
- 销售订单管理
- 发货单处理
- 退货管理
- 客户对账
**主要控件分类:**
---
#### 查找控件系列 (UcLook*.cs)
- `UcLookCustomer.cs` - 客户查找控件
- `UcLookSupplier.cs` - 供应商查找控件
- `UcLookItems.cs` - 物料查找控件
- `UcLookStaff.cs` - 员工查找控件
- `UcLookDepartment.cs` - 部门查找控件
- `UcLookOrg.cs` - 组织查找控件
- `UcLookUnit.cs` - 单位查找控件
- `UcLookUser.cs` - 用户查找控件
- `UcLookWorkshop.cs` - 车间查找控件
- `UcLookWorkline.cs` - 生产线查找控件
- `UcLookGx.cs` - 工序查找控件
- `UcLookKw.cs` - 库位查找控件
- `UcLookCk.cs` - 仓库查找控件
- `UcLookWwgd.cs` - 车间工单查找控件
- `UcLookDaa.cs` - 档案查找控件
- `UcLookHuoZhu.cs` - 货主查找控件
- `UcLookSales.cs` - 销售查找控件
- `UcLookPrint.cs` - 打印查找控件
### 6.8 委外管理域 (WW/)
#### 选择控件系列 (Select*.cs)
- `SelectCw.cs` - 仓位选择控件
- `SelectFont.cs` - 字体选择控件
- `SelectHz.cs` - 货主选择控件
- `SelectOrg.cs` - 组织选择控件
- `SelectKw.cs` - 库位选择控件
- `SelectCk.cs` - 仓库选择控件
- `SelectDaa.cs` - 档案选择控件
- `SelectCgMx.cs` - 采购明细选择控件
- `SelectMesCgthSq.cs` - 采购退货申请选择控件
- `SelectMesCgthSqLink.cs` - 采购退货申请关联选择控件
- `SelectSrm.cs` - SRM选择控件
- `SelectDeleteBar.cs` - 删除条码选择控件
- 委外订单管理
- 委外来料检验
- 委外质量异常处理
- 外协流程闭环
#### 通用功能控件
- `UcPageBar.cs` - 分页导航控件
- `UcDictionary.cs` - 数据字典控件
- `UcDictionaryComBox.cs` - 数据字典下拉控件
- `UcDictionarySelect.cs` - 数据字典选择控件
- `UcCheckFlow.cs` - 审核流程控件
- `UcToolBarMenu.cs` - 工具栏菜单控件
---
#### 文件和打印控件
- `UCUpFile.cs` - 文件上传控件
- `UCUpFileList.cs` - 文件上传列表控件
- `ShowFile.cs` - 文件展示控件
- `UcBtnPrint.cs` - 打印按钮控件
- `UcBtnPrintOne.cs` - 单次打印按钮控件
### 6.9 报表域 (Rpt/)
#### 展示和布局控件
- `ShowLogcs.cs` - 日志展示控件
- `ShowFilter.cs` - 过滤器展示控件
- `ShowRptWizard.cs` - 报表向导展示控件
- `ShowUp.cs` - 上传展示控件
- `showLayOut.cs` - 布局展示控件
- `Toast.cs` - 消息提示控件
- `CopyXls.cs` - Excel复制控件
| 窗体 | 功能 |
|------|------|
| `EasyRptDesign.cs` | 报表设计器 |
| `EasyRptEdt.cs` | 报表编辑 |
| `SysHelp.cs` | 报表帮助 |
## 辅助项目
**支持技术**:
- FastReport
- DevExpress Reports
- 自定义报表引擎
### Gs.WeightIqc/ - IQC称重检测
**功能:** IQC质量检验中的称重功能模块
- 专门用于来料检验过程中的重量检测
- 支持电子秤设备集成
---
### Gs.WeightLine/ - 生产线称重
**功能:** 生产线实时称重监控
- 生产过程中的重量监控
- 支持多种称重设备协议
### 6.10 系统管理域 (Sys/)
### Gs.Setup/ - 安装程序
**功能:** 应用程序安装包制作
- ClickOnce部署支持
- 自动更新配置
| 窗体 | 功能 |
|------|------|
| `SysMenu.cs` | 菜单结构维护 |
| `Organization.cs` | 组织架构管理 |
| `DocNoRule.cs` | 单号规则配置 |
| `SysLog.cs` | 系统日志查询 |
| `Frm_Config.cs` | 系统配置 |
## 数据访问和通信
---
### 数据库连接
- 使用Oracle.ManagedDataAccess 23.6.0连接Oracle数据库
- 通过WebAPI后端服务进行数据访问
- 支持连接字符串动态配置
### 6.11 用户与权限域 (User/)
### HTTP通信
- 基于UtilityHelper类实现HTTP客户端功能
- 使用Newtonsoft.Json进行数据序列化
- 支持RESTful API调用
| 窗体 | 功能 |
|------|------|
| `User.cs` | 用户管理 |
| `Role.cs` | 角色管理 |
| `RoleSelectAction.cs` | 角色授权 |
| `UserSetPwd.cs` | 密码变更 |
### 工业通信
- 集成NModbus 3.0.81支持工业设备通信
- 支持Modbus协议的PLC设备集成
**权限模型**:
```
用户 → 角色 → 菜单权限 + 操作权限
```
## 界面和用户体验
---
### DevExpress集成
- 使用DevExpress LookAndFeel实现统一主题
- FluentDesign现代化界面风格
- 丰富的网格控件和数据展示组件
### 6.12 夹具工装域 (JJGZ/)
### Web集成
- CefSharp嵌入式浏览器支持
- WebView2现代Web视图
- 支持H5页面集成(如检测界面)
- 夹具工装台账
- 计量设备管理
- 点检任务与记录
- 设备维护计划
## 部署和更新
---
### 自动更新
- 集成AutoUpdater.NET实现自动更新
- 支持版本检测和增量更新
- 配置化更新服务器地址
### 6.13 条码管理域 (BarCode/)
### 配置管理
- App.config配置文件管理
- 支持WebAPI地址、日志路径等关键配置
- 生产和测试环境隔离
| 窗体 | 功能 |
|------|------|
| `Frm_BarcodePrint.cs` | 条码批量打印 |
| `Frm_BarcodeTemplate.cs` | 打印模板设置 |
## 开发规范建议
---
1. **模块化开发**:遵循现有的按业务功能划分的目录结构
2. **代码复用**:充分利用UserControl中的自定义控件
3. **统一规范**:使用UtilityHelper、LogHelper等工具类保持代码一致性
4. **界面风格**:遵循DevExpress设计规范,保持界面一致性
5. **错误处理**:统一使用LogHelper记录日志,MsgHelper显示用户消息
6. **数据访问**:通过WebAPI进行数据操作,避免直接数据库访问
## 7. 架构与设计模式
这个MES系统提供了完整的制造执行管理功能,从基础数据管理到生产执行,从质量控制到仓库管理,形成了完整的制造业务闭环。系统架构清晰,模块职责明确,为制造企业提供了强大的信息化支撑平台。
### 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
---
*本文档随项目持续更新,建议定期查看最新版本。*