Files
yl/MES_Manage_View_V20/需求分析_自制件与工位汇总表.md
2026-05-23 14:07:11 +08:00

255 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 需求分析:自制件汇总表 & 工位汇总表
> **日期**: 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数据验证后进入开发