# 需求分析：自制件汇总表 & 工位汇总表

> **日期**: 2026-05-21
> **状态**: 🔍 需求讨论阶段（不动代码）
> **目标**: 理清数据来源、字段映射、缺口和实现方案，产出后续工作计划

---

## 一、需求确认清单

| # | 需求项 | 确认结果 |
|:--:|------|------|
| 1 | **自制件汇总表** — 汇总维度 | 按 **订单+工序** 汇总工时 |
| 2 | **自制件汇总表** — 时间范围 | **自定义起止日期**（用户选择） |
| 3 | **工位汇总表** — 汇总维度 | 按 **工位+日期** 汇总 |
| 4 | **工位汇总表** — 展示字段 | **产量统计** + **工时统计** |
| 5 | **使用场景** | **生产日报/周报**（报表导出） |

---

## 二、自制件汇总表（按订单+工序汇总工时）

### 2.1 需求理解

> 每行 = 一个订单的一道自制件工序，展示该工序的 **计划工时 vs 实际工时** 及差异。

### 2.2 数据源分析

```
┌─────────────────────────────────────────────────────────┐
│  自制件汇总表 数据流向                                    │
│                                                        │
│  MES_接口_生产计划 (订单主表)                              │
│  ├── 订单编号, 合同号, 物料编号, 物料描述, 自制件属性      │
│  │   过滤: 自制件属性 = '机加件', 单据状态 IS NULL         │
│  │                                                      │
│  └──→ MES_接口_生产计划_生产任务 (工序明细)               │
│       ├── 订单行号, 工序名称, 顺序编号                    │
│       ├── 指派对象(工位), 指派数量, 完成数量               │
│       │                                                  │
│       ├──→ 车间生产管理工艺_零件生产工艺_工艺库 (标准工时)  │
│       │   └── 标准工时, 准备工时, 工时合计                  │
│       │   JOIN: 工艺库.订单编号 = 生产任务.订单编号        │
│       │         AND 工艺库.工艺顺序 = 生产任务.订单行号     │
│       │                                                  │
│       └──→ YL_加工中心_操作记录表 (实际工时)               │
│           └── SUM(实际工时) WHERE 操作类别='报工'          │
│              GROUP BY TaskAID                             │
└─────────────────────────────────────────────────────────┘
```

### 2.3 目标字段清单

| 序号 | 字段名 | 数据来源 | 说明 |
|:--:|------|------|------|
| 1 | 订单号 | `MES_接口_生产计划.订单编号` | |
| 2 | 合同号 | `MES_接口_生产计划.合同号` | |
| 3 | 物料编号 | `MES_接口_生产计划.物料编号` | |
| 4 | 物料描述 | `MES_接口_生产计划.物料描述` | |
| 5 | 订单行号 | `MES_接口_生产计划_生产任务.订单行号` | 工序序号 |
| 6 | 工序名称 | `MES_接口_生产计划_生产任务.工序名称` | |
| 7 | 指派工位 | `MES_接口_生产计划_生产任务.指派对象` | |
| 8 | **计划工时** | `车间生产管理工艺_零件生产工艺_工艺库.标准工时` | 分钟单位 |
| 9 | **准备工时** | `车间生产管理工艺_零件生产工艺_工艺库.准备工时` | 分钟单位 |
| 10 | **工时合计(计划)** | `工艺库.工时合计` = 标准工时 + 准备工时 | |
| 11 | **实际工时** | `SUM(YL_加工中心_操作记录表.实际工时)` | 秒→分钟转换 |
| 12 | **总时长** | `SUM(YL_加工中心_操作记录表.总时长)` | 含暂停的总耗时 |
| 13 | **工时差异** | 实际工时 − 计划工时合计 | 正=超时，负=提前 |
| 14 | 操作人 | STRING_AGG 或取主要操作人 | 多操作人用逗号分隔 |
| 15 | 报工日期 | MAX(报工日期) | 取最后报工日期 |

### 2.4 现有可复用的数据

| 来源 | 可用字段 | 缺口 |
|------|------|------|
| `View_生产工时视图` | 加工工时, 总时长, 报工日期, 订单号, 工序名称 | ✅ 基本够用 |
| `View_生产订单_MES` | 订单号, 合同号, 物料, 工序, 指派对象 | ✅ |
| `车间生产管理工艺_零件生产工艺_工艺库` | 标准工时, 准备工时, 工时合计 | ⚠️ 需确认有哪些订单已录入 |

### 2.5 待确认问题

| # | 问题 | 建议 |
|:--:|------|------|
| Q1 | 工艺库中标准工时数据覆盖率？很多订单可能没有录入标准工时 | 需 DBA 查一下 `SELECT COUNT(*) FROM 工艺库 WHERE 标准工时 > 0` |
| Q2 | 同一工序多次报工，取 SUM 还是最后一次？ | 建议 **SUM**（累计工时） |
| Q3 | 工时单位展示用分钟还是小时？ | 建议 **分钟**（与工艺库标准工时单位一致） |
| Q4 | 是否区分已校验/未校验工时？ | 建议加一列：`已校验工时` vs `未校验工时` |
| Q5 | 是否只查"已完成"的？还是包含进行中？ | 建议默认查 **全部**，加筛选条件 |

---

## 三、工位汇总表（按工位+日期汇总）

### 3.1 需求理解

> 每行 = 一个工位在某一天的生产汇总。展示两个维度：**产量统计** + **工时统计**。

### 3.2 数据源分析

```
┌─────────────────────────────────────────────────────────┐
│  工位汇总表 数据流向                                      │
│                                                        │
│  MES_资源主数据 (工位基础数据)                             │
│  ├── VisCode(工位编号), Name(工位名称), Type              │
│  │   过滤: Type='rtMachine', Active='tYES'               │
│  │                                                      │
│  ├──→ 当日产量统计                                       │
│  │   ├── 计划数量: SUM(生产任务.指派数量)                  │
│  │   │   WHERE 指派对象编号=X AND 计划开始时间=@日期      │
│  │   ├── 完成数量: SUM(操作记录.操作数值)                  │
│  │   │   WHERE 工位编号=X AND 操作类别='报工'            │
│  │   │         AND CAST(开始时间 AS DATE)=@日期          │
│  │   ├── 合格数: SUM(质检记录.合格数)                     │
│  │   │   WHERE 工位关联 AND CAST(检测时间 AS DATE)=@日期  │
│  │   └── 不合格数: SUM(质检记录.不合格数)                 │
│  │                                                      │
│  └──→ 当日工时统计                                       │
│      ├── 设备运行工时: SUM(操作记录.实际工时)              │
│      ├── 人员工时: SUM(操作记录.总时长) 或 SUM(报工.工时)  │
│      └── 闲置时间: 24h - 运行时间(分钟)                   │
│          数据源: 历史_工位设备状态每分钟记录               │
│          WHERE 工位号=X AND CAST(创建时间 AS DATE)=@日期  │
│          SUM(CASE WHEN 设备状态 IN(-1,0,3) THEN 1 END)   │
│          → 每分钟一条，直接计数即为分钟数                  │
└─────────────────────────────────────────────────────────┘
```

### 3.3 目标字段清单

| 序号 | 字段名 | 数据来源 | 说明 |
|:--:|------|------|------|
| 1 | 工位编号 | `MES_资源主数据.VisCode` | |
| 2 | 工位名称 | `MES_资源主数据.Name` | |
| 3 | 统计日期 | 用户选择的日期 | DATE 类型 |
| 4 | **计划数量** | SUM(生产任务.指派数量) | 当天计划开工的任务指派数 |
| 5 | **完成数量** | SUM(操作记录.操作数值) | 当天报工的完成数 |
| 6 | **合格数** | SUM(质检记录.合格数) | 当天收检的合格数 |
| 7 | **不合格数** | SUM(质检记录.不合格数) | 当天收检的不合格数 |
| 8 | **设备运行工时** | SUM(操作记录.实际工时) / 60 | 转换为分钟 |
| 9 | **人员工时** | SUM(操作记录.总时长) / 60 | 含暂停的总耗时 |
| 10 | **闲置时间** | COUNT(状态记录 WHERE 状态 IN(-1,0,3)) | 每分钟一条=分钟数 |
| 11 | **设备利用率** | 运行工时 / (运行+闲置) × 100% | 可选指标 |

### 3.4 现有可复用的数据

| 来源 | 可用字段 | 缺口 |
|------|------|------|
| `View_生产工时视图` | 工位编号, 工位名称, 开始时间, 加工工时, 总时长 | ✅ |
| `View_生产订单_MES` | 指派对象编号, 指派数量 | ✅ |
| `历史_工位设备状态每分钟记录` | 工位号, 设备状态, 创建时间 | ⚠️ 需确认数据采集是否覆盖所有工位 |

### 3.5 待确认问题

| # | 问题 | 建议 |
|:--:|------|------|
| Q1 | "日期"以哪个时间为准？报工日期还是操作日期？ | 建议用 **报工日期** (CAST(操作记录.开始时间 AS DATE)) |
| Q2 | 闲置时间——所有工位都有设备状态记录吗？ | 需DBA确认 `历史_工位设备状态每分钟记录` 的覆盖率 |
| Q3 | 如果没有状态记录表数据，闲置时间怎么算？ | 备选方案：`24×60 − SUM(实际工时÷60)` 粗略估算 |
| Q4 | 跨天任务怎么算？比如夜班从22:00做到次日02:00 | 建议按 **开始时间归属日期**（22:00→当天） |
| Q5 | 是否需要展示班次维度（白班/夜班分开）？ | 当前需求未要求，可后期迭代 |

---

## 四、实现方案对比

| 方案 | 方式 | 优点 | 缺点 |
|------|------|------|------|
| **A. 新建视图** | 创建 `View_自制件工时汇总` 和 `View_工位日汇总` 两个VIEW | 性能好、前端直接查 | 不够灵活 |
| **B. 新建存储过程** | 创建带参数的 SP 如 `报表_自制件工时汇总(@开始日期,@结束日期)` | 灵活、支持参数筛选和分页 | 需前后端联调 |
| **C. 改造已有SP** | 在 `View_生产工时视图` 基础上增加聚合查询 SP | 复用现有逻辑 | 可能影响现有功能 |
| ✅ **推荐方案** | **方案B**：新建2个存储过程 + 前端新建2个报表页面 | 最佳实践 | — |

---

## 五、后续工作计划

### 第一阶段：数据验证（1天）

| 步骤 | 内容 | 执行人 |
|:---:|------|:---:|
| 1 | 查询工艺库标准工时覆盖率 | DBA |
| 2 | 查询设备状态每分钟记录覆盖率(按工位) | DBA |
| 3 | 抽样验证：取1个订单，手动计算工时，对比 SP 结果 | DBA |
| 4 | 确认工时单位统一（秒→分钟 or 小时） | 全体 |

### 第二阶段：存储过程开发（2天）

| 步骤 | 内容 | 执行人 |
|:---:|------|:---:|
| 1 | 创建 `报表_自制件工时汇总` SP | DBA |
| 2 | 创建 `报表_工位日汇总` SP | DBA |
| 3 | 编写测试SQL验证结果准确性 | DBA |
| 4 | Review 两个 SP | 技术负责人 |

### 第三阶段：前端报表页面（2天）

| 步骤 | 内容 | 执行人 |
|:---:|------|:---:|
| 1 | 新建"自制件工时汇总"页面（搜索条件+表格+导出） | 前端 |
| 2 | 新建"工位日汇总"页面（搜索条件+表格+导出） | 前端 |
| 3 | 在菜单表中配置页面路由 | 前端/DBA |
| 4 | 联调测试 | 全体 |

### 第四阶段：上线验证（0.5天）

| 步骤 | 内容 | 执行人 |
|:---:|------|:---:|
| 1 | 用真实数据跑一次日报 | 用户 |
| 2 | 与人工统计对比验证 | 用户 |
| 3 | 修复问题、调整格式 | 开发 |

---

## 六、需要DBA协助验证的SQL

```sql
-- 1. 工艺库标准工时覆盖率
SELECT 
    COUNT(*) AS 总工艺记录数,
    SUM(CASE WHEN ISNULL(标准工时,0) > 0 THEN 1 ELSE 0 END) AS 有标准工时,
    SUM(CASE WHEN ISNULL(标准工时,0) = 0 THEN 1 ELSE 0 END) AS 无标准工时
FROM 车间生产管理工艺_零件生产工艺_工艺库
WHERE 启用 = 1

-- 2. 设备状态记录覆盖率（最近7天，按工位）
SELECT 
    工位号,
    COUNT(*) AS 记录数,
    MIN(创建时间) AS 最早,
    MAX(创建时间) AS 最晚
FROM 历史_工位设备状态每分钟记录
WHERE 创建时间 >= DATEADD(DAY, -7, GETDATE())
GROUP BY 工位号
ORDER BY 记录数 DESC

-- 3. 抽查一个订单的实际工时
SELECT 
    TaskAID,
    工序名称,
    操作类别,
    SUM(ISNULL(实际工时,0)) AS 实际工时合计_秒,
    SUM(ISNULL(总时长,0)) AS 总时长合计_秒,
    COUNT(*) AS 报工次数
FROM YL_加工中心_操作记录表
WHERE 订单编号 = '10001'  -- 替换为实际订单号
  AND 操作类别 = '报工'
GROUP BY TaskAID, 工序名称, 操作类别
```

---

> 📅 文档日期: 2026-05-21
> 🔍 状态: 需求讨论阶段（待DBA数据验证后进入开发）
