# CNC机床数据采集分析系统 - 详细功能设计文档

## 1. 系统概述

### 1.1 项目背景
CNC机床多品牌统一化分布式数据采集分析系统旨在解决制造业中设备数据采集分散、统计困难、监控不及时的问题。通过统一的数据采集平台，实现设备状态实时监控、零件产量自动统计、加工过程分析、人员与设备绑定管理，并通过BI大屏直观展示生产数据。

### 1.2 系统目标
- 统一多品牌CNC设备数据采集标准
- 实时监控设备状态和运行情况
- 自动统计零件产量，提高统计准确性
- 分析加工过程，优化生产效率
- 实现人员与设备绑定，便于绩效考核
- 通过BI大屏实时展示生产数据

### 1.3 技术架构
- **后端框架**: .NET Framework 4.0 WebForm
- **前端框架**: Vue.js (管理后台 + BI大屏)
- **数据库**: MariaDB 10.6+ (双库分离)
- **部署环境**: Windows Server + IIS

## 2. 系统架构设计

### 2.1 整体架构
```
┌─────────────────────────────────────────────────────────────┐
│                     前端展示层                              │
├─────────────────┬─────────────────────────────────────────┤
│   Vue.js管理后台   │        Vue.js BI大屏                     │
└─────────────────┴─────────────────────────────────────────┘
                              │
┌─────────────────────────────────────────────────────────────┐
│                     API接口层                              │
│  ┌─────────────────────────────────────────────────────┐  │
│  │              .NET Framework 4.0 WebForm             │  │
│  └─────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────┘
                              │
┌─────────────────────────────────────────────────────────────┐
│                     业务逻辑层                              │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────┐  │
│  │  设备管理模块    │  │  数据采集模块    │  │ 产量统计模块 │  │
│  └─────────────────┘  └─────────────────┘  └─────────────┘  │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────┐  │
│  │  模板管理模块    │  │  用户管理模块    │  │  告警管理模块 │  │
│  └─────────────────┘  └─────────────────┘  └─────────────┘  │
└─────────────────────────────────────────────────────────────┘
                              │
┌─────────────────────────────────────────────────────────────┐
│                     数据访问层                              │
│  ┌─────────────────────────────────────────────────────┐  │
│  │              ADO.NET 数据访问组件                   │  │
│  └─────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────┘
                              │
┌─────────────────────────────────────────────────────────────┐
│                     数据存储层                              │
│  ┌─────────────────┐  ┌─────────────────────────────────┐  │
│  │   cnc_business  │        cnc_log (日志库)            │  │
│  │   (业务库)      │                                    │  │
│  └─────────────────┘  └─────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────┘
```

### 2.2 项目目录结构
```
src/
├── backend/                    # .NET Framework 4.0 WebForm 后端
│   ├── Api/                    # API接口层
│   │   ├── Controllers/        # 控制器
│   │   ├── Models/            # API模型
│   │   └── Filters/           # 过滤器
│   ├── Core/                   # 核心业务逻辑
│   │   ├── Services/          # 业务服务
│   │   ├── Helpers/           # 辅助类
│   │   ├── Cache/             # 缓存管理
│   │   └── Schedule/          # 任务调度
│   ├── Data/                   # 数据访问层
│   │   ├── Repositories/      # 数据仓库
│   │   ├── Entities/          # 实体类
│   │   └── Mappers/           # 数据映射
│   ├── Models/                 # 数据模型
│   │   ├── Device/            # 设备相关
│   │   ├── Template/          # 模板相关
│   │   ├── Production/        # 生产相关
│   │   ├── User/              # 用户相关
│   │   └── System/            # 系统相关
│   ├── Config/                 # 配置文件
│   ├── App_Data/              # 应用数据
│   │   ├── Logs/              # 日志文件
│   │   └Temp/                # 临时文件
│   └── Web.config             # Web配置
├── frontend/
│   ├── admin/                  # Vue.js 管理后台
│   │   ├── src/
│   │   │   ├── components/    # 组件
│   │   │   ├── views/         # 页面
│   │   │   ├── store/         # Vuex状态管理
│   │   │   ├── router/        # 路由配置
│   │   │   ├── api/           # API调用
│   │   │   ├── utils/         # 工具函数
│   │   │   └── assets/        # 静态资源
│   │   ├── public/            # 公共资源
│   │   └── package.json       # 依赖配置
│   └── dashboard/              # Vue.js BI大屏
│       ├── src/
│       │   ├── components/    # 组件
│       │   ├── views/         # 页面
│       │   ├── store/         # Vuex状态管理
│       │   ├── router/        # 路由配置
│       │   ├── api/           # API调用
│       │   ├── utils/         # 工具函数
│       │   └── assets/        # 静态资源
│       ├── public/            # 公共资源
│       └── package.json       # 依赖配置
├── database/
│   ├── cnc_business.sql        # 业务库建表脚本
│   └── cnc_log.sql             # 日志库建表脚本
├── docs/                       # 文档
└── test/                       # 测试文件
```

## 3. 功能模块详细设计

### 3.1 CNC品牌模板配置模块

#### 3.1.1 功能描述
支持多品牌CNC设备的统一接入，通过JSON字段映射模板将不同品牌的原始数据映射为系统标准字段。

#### 3.1.2 数据模型
```csharp
public class CNCBrandTemplate
{
    public int Id { get; set; }
    public string BrandName { get; set; }         // 品牌名称
    public string Description { get; set; }        // 模板描述
    public bool IsEnabled { get; set; }           // 是否启用
    public TemplateFieldMapping[] FieldMappings { get; set; } // 字段映射
    public DateTime CreatedAt { get; set; }
    public DateTime UpdatedAt { get; set; }
}

public class TemplateFieldMapping
{
    public string SourceFieldPath { get; set; }    // 源字段路径
    public string StandardFieldId { get; set; }    // 标准字段ID
    public string StandardFieldDesc { get; set; }   // 标准字段描述
    public string DataType { get; set; }          // 数据类型
    public ConversionRule ConversionRule { get; set; } // 转换规则
}
```

#### 3.1.3 业务逻辑
- 模板管理：增删改查、启用/禁用
- 字段映射配置：支持JSON路径配置、数据类型转换、自定义转换规则
- 模板验证：确保映射配置的完整性和正确性
- 实时生效：模板修改后立即生效，无需重启服务

### 3.2 分布式设备采集模块

#### 3.2.1 功能描述
实现分布式CNC设备的数据采集，支持每台设备的独立配置和定时轮询采集。

#### 3.2.2 数据模型
```csharp
public class CNCDevice
{
    public int Id { get; set; }
    public string DeviceCode { get; set; }         // 设备编号
    public string DeviceName { get; set; }         // 设备名称
    public string IPAddress { get; set; }          // IP地址
    public string HttpUrl { get; set; }            // 采集地址
    public int CollectionInterval { get; set; }    // 采集间隔(秒)
    public int TemplateId { get; set; }            // 绑定模板ID
    public bool IsAvailable { get; set; }         // 是否可用
    public bool IsOnline { get; set; }            // 在线状态
    public DateTime LastCollectionTime { get; set; } // 最后采集时间
    public DateTime CreatedAt { get; set; }
    public DateTime UpdatedAt { get; set; }
}

public class DeviceStatus
{
    public int DeviceId { get; set; }
    public string Status { get; set; }            // 设备状态
    public bool IsRunning { get; set; }           // 运行状态
    public string NCProgram { get; set; }         // NC程序名
    public int CumulativeCount { get; set; }      // 累计数量
    public string OperatingMode { get; set; }      // 操作模式
    public DateTime RecordTime { get; set; }      // 记录时间
}
```

#### 3.2.3 采集逻辑
1. **设备状态检查**：
   - Ping检测设备网络连通性
   - 判断设备是否可用状态
   - 只有在线且可用的设备才会执行采集

2. **数据采集流程**：
   ```mermaid
   graph TD
   A[开始采集] --> B[Ping检查]
   B --> C{在线?}
   C -->|否| D[标记离线]
   C -->|是| E[HTTP请求采集]
   E --> F{请求成功?}
   F -->|否| G[重试3次]
   G --> H{成功?}
   H -->|否| I[记录异常日志]
   H -->|是| J[解析数据]
   F -->|是| J[解析数据]
   J --> K[存入日志库]
   K --> L[解析标准数据]
   L --> M[存入业务库]
   M --> N[更新状态]
   ```

3. **异常处理**：
   - 网络异常：重试3次，间隔30秒
   - 连续5次失败记录异常日志
   - 网络恢复后自动恢复采集
   - 不改变在线状态（只由Ping判断）

### 3.3 零件产量统计模块

#### 3.3.1 功能描述
基于CNC设备采集的实时数据，通过差分计算自动统计零件产量，支持程序切换和跨天处理。

#### 3.3.2 数据模型
```csharp
public class ProductionRecord
{
    public int Id { get; set; }
    public int DeviceId { get; set; }
    public string NCProgram { get; set; }         // NC程序名
    public DateTime ProductionDate { get; set; }  // 生产日期
    public int Quantity { get; set; }             // 产量
    public decimal QualityRate { get; set; }       // 合格率
    public DateTime StartTime { get; set; }        // 开始时间
    public DateTime EndTime { get; set; }         // 结束时间
    public int OperatorId { get; set; }          // 操作员ID
    public DateTime CreatedAt { get; set; }
}

public class ProgramProductionSummary
{
    public int DeviceId { get; set; }
    public string NCProgram { get; set; }
    public DateTime ProductionDate { get; set; }
    public int TotalQuantity { get; set; }        // 总产量
    public int ValidQuantity { get; set; }       // 有效产量
    public int InvalidQuantity { get; set; }     // 无效数量
    public decimal QualityRate { get; set; }      // 合格率
}
```

#### 3.3.3 产量统计核心逻辑
```csharp
public class ProductionCalculator
{
    public static int CalculateProduction(DeviceCurrentStatus current, DeviceCurrentStatus last)
    {
        // 同一程序连续加工
        if (current.NCProgram == last.NCProgram)
        {
            int diff = current.CumulativeCount - last.CumulativeCount;
            return Math.Max(0, diff); // 异常值保护，避免负数
        }
        
        // 程序切换逻辑
        return CalculateProgramSwitchProduction(current, last);
    }
    
    private static int CalculateProgramSwitchProduction(DeviceCurrentStatus current, DeviceCurrentStatus last)
    {
        // 检查是否切换到新程序
        if (IsNewProgram(current.NCProgram, last.NCProgram))
        {
            // 新程序以当前累计数为起点
            return current.CumulativeCount;
        }
        else
        {
            // 切回历史程序，视为重新开始
            return 0;
        }
    }
    
    public static bool IsNewProgram(string currentProgram, string lastProgram)
    {
        // 实现程序切换判断逻辑
        return currentProgram != lastProgram;
    }
    
    public static void CrossDayReset(DeviceCurrentStatus current, DeviceCurrentStatus last)
    {
        // 跨天处理：0点自动重置
        if (current.ProductionDate != last.ProductionDate)
        {
            // 新日期以首次采集累计值为起点
            current.ResetCumulativeCount = current.CumulativeCount;
        }
    }
}
```

#### 3.3.4 异常值保护机制
- **跳变检测**：产量变化超过阈值时跳过
- **负数保护**：产量为负数时归零
- **突变检测**：产量变化超过正常范围时告警
- **数据验证**：验证采集数据的合理性

### 3.4 统计规则动态配置模块

#### 3.4.1 功能描述
支持自定义统计指标、计算公式和分组维度，配置实时生效。

#### 3.4.2 数据模型
```csharp
public class StatisticRule
{
    public int Id { get; set; }
    public string RuleName { get; set; }          // 规则名称
    public string Description { get; set; }        // 规则描述
    public string MetricFormula { get; set; }      // 指标计算公式
    public string[] GroupByDimensions { get; set; } // 分组维度
    public bool IsEnabled { get; set; }           // 是否启用
    public DateTime CreatedAt { get; set; }
    public DateTime UpdatedAt { get; set; }
}

public class StatisticResult
{
    public int RuleId { get; set; }
    public DateTime StatisticTime { get; set; }   // 统计时间
    public Dictionary<string, object> GroupValues { get; set; } // 分组值
    public decimal MetricValue { get; set; }       // 指标值
    public DateTime CreatedAt { get; set; }
}
```

#### 3.4.3 支持的统计维度
- 设备维度：按设备分组
- 人员维度：按操作员分组
- 时间维度：按小时/天/月分组
- 程序维度：按NC程序分组
- 车间维度：按车间分组

#### 3.4.4 支持的统计指标
- 产量统计：总产量、有效产量、无效产量
- 时间统计：运行时间、停机时间、效率
- 质量统计：合格率、不良品数量
- 效率统计：设备利用率、生产效率

### 3.5 设备状态监控模块

#### 3.5.1 功能描述
实时监控设备状态，包括在线/离线状态、运行状态、可用状态等。

#### 3.5.2 状态分类
- **在线状态**：基于Ping检测结果
  - 在线：Ping通
  - 离线：Ping不通
- **可用状态**：人工配置
  - 可用：允许采集数据
  - 不可用：停止数据采集
- **运行状态**：基于采集数据
  - 运行中：设备正在加工
  - 停止：设备停止运行
  - 故障：设备发生故障
  - 待机：设备处于待机状态

#### 3.5.3 状态监控逻辑
```csharp
public class DeviceStatusMonitor
{
    public void UpdateDeviceStatus(DeviceStatus status)
    {
        // 更新在线状态
        status.IsOnline = CheckPingStatus(status.IPAddress);
        
        // 更新运行状态
        if (status.IsOnline && status.IsAvailable)
        {
            status.RunningStatus = DetermineRunningStatus(status);
        }
        else
        {
            status.RunningStatus = "离线";
        }
        
        // 触发状态变更事件
        OnStatusChanged?.Invoke(this, new DeviceStatusChangedEventArgs(status));
    }
    
    private bool CheckPingStatus(string ipAddress)
    {
        // 实现Ping检测逻辑
        return PingHelper.Ping(ipAddress);
    }
    
    private string DetermineRunningStatus(DeviceStatus status)
    {
        // 根据采集数据判断运行状态
        if (status.Tags != null)
        {
            var ioStatus = status.Tags.FirstOrDefault(t => t.Id == "_io_status");
            var tag9 = status.Tags.FirstOrDefault(t => t.Id == "Tag9");
            var tag26 = status.Tags.FirstOrDefault(t => t.Id == "Tag26");
            
            if (ioStatus?.Value == "1" || tag9?.Value == "1" || tag26?.Value == "1")
            {
                return "运行中";
            }
        }
        return "停止";
    }
}
```

### 3.6 用户管理模块

#### 3.6.1 功能描述
管理用户账户、角色权限、员工信息以及人员与设备的绑定关系。

#### 3.6.2 数据模型
```csharp
public class User
{
    public int Id { get; set; }
    public string Username { get; set; }          // 用户名
    public string PasswordHash { get; set; }      // 密码哈希
    public string RealName { get; set; }           // 真实姓名
    public string Email { get; set; }             // 邮箱
    public string Phone { get; set; }             // 电话
    public int RoleId { get; set; }               // 角色ID
    public bool IsActive { get; set; }            // 是否激活
    public DateTime LastLoginTime { get; set; }   // 最后登录时间
    public DateTime CreatedAt { get; set; }
    public DateTime UpdatedAt { get; set; }
}

public class Role
{
    public int Id { get; set; }
    public string RoleName { get; set; }          // 角色名称
    public string Description { get; set; }       // 角色描述
    public string[] Permissions { get; set; }     // 权限列表
}

public class Employee
{
    public int Id { get; set; }
    public string EmployeeCode { get; set; }       // 员工编号
    public string Name { get; set; }              // 员工姓名
    public string Department { get; set; }        // 部门
    public string Position { get; set; }          // 职位
    public int[] AssignedDevices { get; set; }    // 分配的设备ID列表
    public DateTime CreatedAt { get; set; }
}

public class DeviceAssignment
{
    public int Id { get; set; }
    public int DeviceId { get; set; }            // 设备ID
    public int EmployeeId { get; set; }           // 员工ID
    public DateTime AssignmentDate { get; set; }  // 分配日期
    public DateTime? EndDate { get; set; }        // 结束日期
}
```

#### 3.6.3 权限管理
- **管理员**：所有功能权限
- **班组长**：查看本班组设备状态和产量
- **操作员**：查看个人操作设备和产量
- **访客**：只读权限

### 3.7 告警管理模块

#### 3.7.1 功能描述
监控系统运行状态，及时发现和处理异常情况，记录告警信息。

#### 3.7.2 告警类型
- 设备离线告警
- 采集失败告警
- 数据异常告警
- 设备故障告警
- 系统异常告警

#### 3.7.3 数据模型
```csharp
public class Alarm
{
    public int Id { get; set; }
    public string AlarmType { get; set; }        // 告警类型
    public string AlarmLevel { get; set; }        // 告警级别
    public string AlarmContent { get; set; }      // 告警内容
    public int? DeviceId { get; set; }           // 关联设备ID
    public string DeviceName { get; set; }       // 设备名称
    public bool IsResolved { get; set; }          // 是否已解决
    public DateTime OccurrenceTime { get; set; }   // 发生时间
    public DateTime? ResolutionTime { get; set; } // 解决时间
    public string ResolutionNote { get; set; }    // 解决备注
    public DateTime CreatedAt { get; set; }
}

public class AlarmRule
{
    public int Id { get; set; }
    public string RuleName { get; set; }          // 规则名称
    public string Condition { get; set; }         // 触发条件
    public string AlarmType { get; set; }         // 告警类型
    public string AlarmLevel { get; set; }       // 告警级别
    public bool IsEnabled { get; set; }          // 是否启用
    public int? DeviceId { get; set; }           // 设备ID(为空则全局)
}
```

#### 3.7.4 告警处理流程
1. **告警触发**：系统检测到异常条件
2. **告警生成**：创建告警记录
3. **告警通知**：通过邮件、短信等方式通知相关人员
4. **告警确认**：相关人员确认收到告警
5. **告警处理**：技术人员处理问题
6. **告警解决**：问题解决后标记为已解决
7. **告警归档**：定期归档历史告警记录

### 3.8 后台管理模块

#### 3.8.1 功能描述
提供完整的后台管理功能，包括设备管理、模板管理、统计配置、数据查询等。

#### 3.8.2 主要页面
- **仪表板**：系统概览、实时数据
- **设备管理**：设备列表、设备状态、设备配置
- **模板管理**：品牌模板、字段映射
- **用户管理**：用户列表、角色权限、员工管理
- **统计配置**：统计规则、维度管理
- **数据查询**：生产数据、设备状态、告警记录
- **系统设置**：全局配置、系统维护

### 3.9 BI数据大屏模块

#### 3.9.1 功能描述
通过可视化大屏展示实时生产数据，支持多种图表类型和筛选功能。

#### 3.9.2 主要功能
- **实时数据展示**：设备状态、产量统计、生产效率
- **多维度分析**：按车间、班组、设备、时间等维度
- **图表支持**：折线图、柱状图、饼图、仪表盘
- **全屏显示**：支持全屏模式展示
- **数据刷新**：可配置刷新频率
- **筛选功能**：支持多条件筛选

#### 3.9.3 页面布局
- **顶部标题栏**：系统名称、时间、刷新控制
- **左侧设备状态**：设备在线状态、运行状态
- **中间产量统计**：总产量、实时产量、趋势图
- **右侧效率分析**：设备利用率、生产效率
- **底部详细信息**：设备详情、告警信息

## 4. 数据库设计

### 4.1 数据库架构
使用双库分离架构：
- **业务库 (cnc_business)**：存储业务数据
- **日志库 (cnc_log)**：存储原始采集数据和系统日志

### 4.2 业务库表结构

#### 4.2.1 设备管理表
```sql
-- 设备信息表
CREATE TABLE `devices` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `device_code` varchar(50) NOT NULL COMMENT '设备编号',
  `device_name` varchar(100) NOT NULL COMMENT '设备名称',
  `ip_address` varchar(15) NOT NULL COMMENT 'IP地址',
  `http_url` varchar(255) NOT NULL COMMENT '采集地址',
  `collection_interval` int(11) NOT NULL DEFAULT '60' COMMENT '采集间隔(秒)',
  `template_id` int(11) NOT NULL COMMENT '模板ID',
  `is_available` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否可用',
  `is_online` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否在线',
  `last_collection_time` datetime DEFAULT NULL COMMENT '最后采集时间',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_device_code` (`device_code`),
  KEY `idx_ip_address` (`ip_address`),
  KEY `idx_template_id` (`template_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备信息表';

-- 设备状态表
CREATE TABLE `device_status` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `device_id` int(11) NOT NULL COMMENT '设备ID',
  `status` varchar(20) NOT NULL COMMENT '设备状态',
  `is_running` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否运行',
  `nc_program` varchar(100) DEFAULT NULL COMMENT 'NC程序名',
  `cumulative_count` int(11) NOT NULL DEFAULT '0' COMMENT '累计数量',
  `operating_mode` varchar(20) DEFAULT NULL COMMENT '操作模式',
  `record_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间',
  PRIMARY KEY (`id`),
  KEY `idx_device_id` (`device_id`),
  KEY `idx_record_time` (`record_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备状态表';
```

#### 4.2.2 模板管理表
```sql
-- 品牌模板表
CREATE TABLE `cnc_templates` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `brand_name` varchar(50) NOT NULL COMMENT '品牌名称',
  `description` varchar(255) DEFAULT NULL COMMENT '描述',
  `is_enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用',
  `field_mappings` json NOT NULL COMMENT '字段映射配置',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_brand_name` (`brand_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='CNC品牌模板表';

-- 字段映射表
CREATE TABLE `template_field_mappings` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `template_id` int(11) NOT NULL COMMENT '模板ID',
  `source_field_path` varchar(255) NOT NULL COMMENT '源字段路径',
  `standard_field_id` varchar(50) NOT NULL COMMENT '标准字段ID',
  `standard_field_desc` varchar(100) NOT NULL COMMENT '标准字段描述',
  `data_type` varchar(20) NOT NULL COMMENT '数据类型',
  `conversion_rule` json DEFAULT NULL COMMENT '转换规则',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_template_id` (`template_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='模板字段映射表';
```

#### 4.2.3 生产数据表
```sql
-- 生产记录表
CREATE TABLE `production_records` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `device_id` int(11) NOT NULL COMMENT '设备ID',
  `nc_program` varchar(100) NOT NULL COMMENT 'NC程序名',
  `production_date` date NOT NULL COMMENT '生产日期',
  `quantity` int(11) NOT NULL DEFAULT '0' COMMENT '产量',
  `quality_rate` decimal(5,2) DEFAULT '100.00' COMMENT '合格率',
  `start_time` datetime DEFAULT NULL COMMENT '开始时间',
  `end_time` datetime DEFAULT NULL COMMENT '结束时间',
  `operator_id` int(11) DEFAULT NULL COMMENT '操作员ID',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_device_id` (`device_id`),
  KEY `idx_nc_program` (`nc_program`),
  KEY `idx_production_date` (`production_date`),
  KEY `idx_operator_id` (`operator_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产记录表';

-- 程序产量统计表
CREATE TABLE `program_production_summary` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `device_id` int(11) NOT NULL COMMENT '设备ID',
  `nc_program` varchar(100) NOT NULL COMMENT 'NC程序名',
  `production_date` date NOT NULL COMMENT '生产日期',
  `total_quantity` int(11) NOT NULL DEFAULT '0' COMMENT '总产量',
  `valid_quantity` int(11) NOT NULL DEFAULT '0' COMMENT '有效产量',
  `invalid_quantity` int(11) NOT NULL DEFAULT '0' COMMENT '无效数量',
  `quality_rate` decimal(5,2) DEFAULT '100.00' COMMENT '合格率',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_device_program_date` (`device_id`,`nc_program`,`production_date`),
  KEY `idx_production_date` (`production_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='程序产量统计表';
```

#### 4.2.4 用户管理表
```sql
-- 用户表
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `password_hash` varchar(255) NOT NULL COMMENT '密码哈希',
  `real_name` varchar(50) NOT NULL COMMENT '真实姓名',
  `email` varchar(100) DEFAULT NULL COMMENT '邮箱',
  `phone` varchar(20) DEFAULT NULL COMMENT '电话',
  `role_id` int(11) NOT NULL COMMENT '角色ID',
  `is_active` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否激活',
  `last_login_time` datetime DEFAULT NULL COMMENT '最后登录时间',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_username` (`username`),
  KEY `idx_role_id` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

-- 角色表
CREATE TABLE `roles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `role_name` varchar(50) NOT NULL COMMENT '角色名称',
  `description` varchar(255) DEFAULT NULL COMMENT '角色描述',
  `permissions` json NOT NULL COMMENT '权限列表',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_role_name` (`role_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';

-- 员工表
CREATE TABLE `employees` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `employee_code` varchar(50) NOT NULL COMMENT '员工编号',
  `name` varchar(50) NOT NULL COMMENT '员工姓名',
  `department` varchar(50) DEFAULT NULL COMMENT '部门',
  `position` varchar(50) DEFAULT NULL COMMENT '职位',
  `assigned_devices` json DEFAULT NULL COMMENT '分配的设备ID列表',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_employee_code` (`employee_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工表';

-- 设备分配表
CREATE TABLE `device_assignments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `device_id` int(11) NOT NULL COMMENT '设备ID',
  `employee_id` int(11) NOT NULL COMMENT '员工ID',
  `assignment_date` date NOT NULL COMMENT '分配日期',
  `end_date` date DEFAULT NULL COMMENT '结束日期',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_device_id` (`device_id`),
  KEY `idx_employee_id` (`employee_id`),
  KEY `idx_assignment_date` (`assignment_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备分配表';
```

#### 4.2.5 系统管理表
```sql
-- 统计规则表
CREATE TABLE `statistic_rules` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `rule_name` varchar(100) NOT NULL COMMENT '规则名称',
  `description` varchar(255) DEFAULT NULL COMMENT '描述',
  `metric_formula` text NOT NULL COMMENT '指标计算公式',
  `group_by_dimensions` json NOT NULL COMMENT '分组维度',
  `is_enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='统计规则表';

-- 告警表
CREATE TABLE `alarms` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `alarm_type` varchar(50) NOT NULL COMMENT '告警类型',
  `alarm_level` varchar(20) NOT NULL COMMENT '告警级别',
  `alarm_content` text NOT NULL COMMENT '告警内容',
  `device_id` int(11) DEFAULT NULL COMMENT '关联设备ID',
  `device_name` varchar(100) DEFAULT NULL COMMENT '设备名称',
  `is_resolved` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已解决',
  `occurrence_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '发生时间',
  `resolution_time` datetime DEFAULT NULL COMMENT '解决时间',
  `resolution_note` text DEFAULT NULL COMMENT '解决备注',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_alarm_type` (`alarm_type`),
  KEY `idx_alarm_level` (`alarm_level`),
  KEY `idx_device_id` (`device_id`),
  KEY `idx_occurrence_time` (`occurrence_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='告警表';

-- 系统配置表
CREATE TABLE `system_config` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `config_key` varchar(100) NOT NULL COMMENT '配置键',
  `config_value` text NOT NULL COMMENT '配置值',
  `description` varchar(255) DEFAULT NULL COMMENT '描述',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_config_key` (`config_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置表';
```

### 4.3 日志库表结构

#### 4.3.1 原始采集数据表
```sql
-- 原始采集数据表
CREATE TABLE `raw_collection_data` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `device_id` int(11) NOT NULL COMMENT '设备ID',
  `collection_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '采集时间',
  `raw_json` json NOT NULL COMMENT '原始JSON数据',
  `is_success` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否成功',
  `error_message` text DEFAULT NULL COMMENT '错误信息',
  `retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '重试次数',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_device_id` (`device_id`),
  KEY `idx_collection_time` (`collection_time`),
  KEY `idx_is_success` (`is_success`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='原始采集数据表';
```

#### 4.3.2 系统日志表
```sql
-- 系统日志表
CREATE TABLE `system_logs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `log_level` varchar(20) NOT NULL COMMENT '日志级别',
  `log_category` varchar(50) NOT NULL COMMENT '日志类别',
  `log_message` text NOT NULL COMMENT '日志消息',
  `log_data` json DEFAULT NULL COMMENT '日志数据',
  `source_method` varchar(255) DEFAULT NULL COMMENT '来源方法',
  `source_file` varchar(255) DEFAULT NULL COMMENT '来源文件',
  `log_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '日志时间',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_log_level` (`log_level`),
  KEY `idx_log_category` (`log_category`),
  KEY `idx_log_time` (`log_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统日志表';
```

## 5. API接口设计

### 5.1 API设计规范
- **统一响应格式**：`{ success, data, message, timestamp }`
- **API版本前缀**：`/api/v1/`
- **认证方式**：JWT Token
- **请求方法**：GET, POST, PUT, DELETE
- **数据格式**：JSON

### 5.2 主要API接口

#### 5.2.1 设备管理接口
```csharp
// 获取设备列表
GET /api/v1/devices
{
  "success": true,
  "data": [
    {
      "id": 1,
      "deviceCode": "CNC001",
      "deviceName": "CNC机床001",
      "ipAddress": "192.168.1.100",
      "isOnline": true,
      "isAvailable": true,
      "lastCollectionTime": "2024-01-01T10:00:00"
    }
  ],
  "message": "获取成功",
  "timestamp": "2024-01-01T10:00:00"
}

// 获取设备详情
GET /api/v1/devices/{id}

// 更新设备状态
PUT /api/v1/devices/{id}/status
{
  "isAvailable": true
}

// 删除设备
DELETE /api/v1/devices/{id}
```

#### 5.2.2 数据采集接口
```csharp
// 获取设备实时状态
GET /api/v1/devices/{id}/status

// 手动触发采集
POST /api/v1/devices/{id}/collect

// 获取采集历史
GET /api/v1/devices/{id}/collection-history?page=1&size=10
```

#### 5.2.3 生产统计接口
```csharp
// 获取产量统计
GET /api/v1/production/statistics?deviceId=1&date=2024-01-01&program=CNC001

// 获取程序产量汇总
GET /api/v1/production/program-summary?deviceId=1&date=2024-01-01

// 获取实时产量
GET /api/v1/production/realtime?deviceId=1
```

#### 5.2.4 模板管理接口
```csharp
// 获取模板列表
GET /api/v1/templates

// 获取模板详情
GET /api/v1/templates/{id}

// 创建模板
POST /api/v1/templates

// 更新模板
PUT /api/v1/templates/{id}

// 启用/禁用模板
PUT /api/v1/templates/{id}/toggle
```

#### 5.2.5 用户管理接口
```csharp
// 用户登录
POST /api/v1/auth/login
{
  "username": "admin",
  "password": "password123"
}

// 获取用户信息
GET /api/v1/users/me

// 获取用户列表
GET /api/v1/users?page=1&size=10

// 创建用户
POST /api/v1/users

// 更新用户
PUT /api/v1/users/{id}

// 删除用户
DELETE /api/v1/users/{id}
```

#### 5.2.6 告警管理接口
```csharp
// 获取告警列表
GET /api/v1/alarms?level=high&resolved=false&page=1&size=10

// 获取告警详情
GET /api/v1/alarms/{id}

// 解决告警
PUT /api/v1/alarms/{id}/resolve
{
  "resolutionNote": "已解决设备故障"
}

// 获取告警统计
GET /api/v1/alarms/statistics
```

#### 5.2.7 系统配置接口
```csharp
// 获取系统配置
GET /api/v1/config

// 更新系统配置
PUT /api/v1/config
{
  "key": "collection_interval",
  "value": "60"
}

// 获取系统状态
GET /api/v1/system/status
```

### 5.3 WebSocket接口（实时数据）
```csharp
// 设备状态实时推送
/ws/devices/status

// 产量数据实时推送
/ws/production/realtime

// 告警实时推送
/ws/alarms/realtime
```

## 6. 部署架构

### 6.1 服务器要求
- **操作系统**：Windows Server 2016 或更高版本
- **内存**：≥ 8GB
- **CPU**：≥ 4核心
- **硬盘**：≥ 100GB可用空间
- **网络**：千兆网卡
- **数据库**：MariaDB 10.6+

### 6.2 IIS配置
- **应用程序池**：.NET Framework 4.0 Integrated Pipeline
- **ASP.NET版本**：4.0.30319
- **托管管道模式**：集成
- **标识**：ApplicationPoolIdentity

### 6.3 应用程序配置
- **Web.config**：数据库连接、应用程序设置、认证配置
- **日志配置**：文件日志级别、日志保留策略
- **缓存配置**：内存缓存大小、过期策略

### 6.4 网络配置
- **端口**：80 (HTTP), 443 (HTTPS)
- **防火墙**：开放必要端口，限制访问
- **负载均衡**：多服务器部署时配置负载均衡

### 6.5 数据库配置
- **主从复制**：配置数据库主从复制
- **备份策略**：每日全量备份，实时增量备份
- **监控**：数据库性能监控、告警

## 7. 性能要求

### 7.1 性能指标
- **并发支持**：≥ 100台CNC同时采集
- **采集延迟**：< 3秒
- **API响应**：< 500ms
- **系统可用性**：99.9%
- **数据处理能力**：≥ 1000条/秒

### 7.2 性能优化措施
- **缓存策略**：内存缓存热点数据
- **数据库优化**：索引优化、查询优化、分表策略
- **异步处理**：数据采集异步处理
- **连接池**：数据库连接池优化
- **负载均衡**：多节点部署

### 7.3 监控指标
- **CPU使用率**：< 80%
- **内存使用率**：< 80%
- **磁盘I/O**：< 80%
- **网络带宽**：< 80%
- **响应时间**：< 500ms

## 8. 安全考虑

### 8.1 数据安全
- **加密存储**：敏感数据加密存储
- **数据备份**：定期备份，异地存储
- **数据传输**：HTTPS加密传输
- **访问控制**：基于角色的访问控制

### 8.2 系统安全
- **身份认证**：JWT Token认证
- **权限管理**：最小权限原则
- **日志审计**：操作日志记录
- **安全扫描**：定期安全漏洞扫描

### 8.3 网络安全
- **防火墙**：配置网络防火墙
- **入侵检测**：IDS/IDS部署
- **访问限制**：IP白名单、访问频率限制
- **DDOS防护**：流量清洗

## 9. 测试策略

### 9.1 单元测试
- 覆盖核心业务逻辑
- 测试用例覆盖率 ≥ 80%
- 自动化测试执行

### 9.2 集成测试
- API接口测试
- 数据库操作测试
- 模块间交互测试

### 9.3 性能测试
- 负载测试：模拟100台设备并发采集
- 压力测试：系统极限性能测试
- 稳定性测试：长时间运行测试

### 9.4 用户验收测试
- 功能测试：验证所有功能需求
- 易用性测试：用户体验测试
- 兼容性测试：不同浏览器兼容性

## 10. 项目实施计划

### 10.1 开发阶段
1. **需求分析**（1周）
2. **系统设计**（2周）
3. **数据库设计**（1周）
4. **核心功能开发**（4周）
5. **前端开发**（3周）
6. **系统集成**（1周）

### 10.2 测试阶段
1. **单元测试**（1周）
2. **集成测试**（1周）
3. **性能测试**（1周）
4. **用户测试**（1周）

### 10.3 部署阶段
1. **环境准备**（1周）
2. **数据迁移**（1周）
3. **系统部署**（1周）
4. **用户培训**（1周）

### 10.4 维护阶段
1. **定期维护**（每周）
2. **性能监控**（实时）
3. **问题响应**（24小时）
4. **系统升级**（每季度）

## 11. 总结

本设计文档详细描述了CNC机床数据采集分析系统的完整架构和功能实现方案。系统采用.NET Framework 4.0 WebForm作为后端框架，Vue.js作为前端框架，MariaDB作为数据库，实现了设备状态监控、零件产量统计、加工过程分析等功能。

系统的核心优势包括：
1. **多品牌统一接入**：支持多种CNC品牌的统一数据采集
2. **实时数据监控**：设备状态和产量数据的实时监控
3. **智能产量统计**：基于差分计算的产量统计，准确度高
4. **可视化展示**：BI大屏直观展示生产数据
5. **灵活配置**：模板配置、统计规则等可动态配置
6. **高可用性**：支持100台设备并发采集，系统稳定性高

通过本系统的实施，可以显著提升制造业的生产管理水平和效率，为企业的数字化转型提供有力支撑。