# MES 新增需求技术开发详细方案

生成日期：2026-05-27  
依据文档：

- `今后开发计划与新增需求分析记录_2026-05-27.docx`
- `今后开发计划_2026-05-27.md`
- `新增需求分析与开发记录_2026-05-23.md`
- `新增需求界面原型设计_2026-05-25.md`
- `隐性需求综合分析_2026-05-25.md`
- `MES_功能列表_页面_存储过程映射.md`
- `项目功能技术路线数据库分析报告_2026-05-22.md`
- `script.sql`

## 1. 项目技术现状

### 1.1 前端技术栈

主系统目录：`MES_Manage_View_V20`

技术栈：

- Vue 2.7.16
- Vue Router 3.6.5
- Vuex 3.6.2
- Element UI 2.15.14
- Webpack 5
- Axios 0.21.4
- xlsx / xlsx-style 用于导出
- vue-print-nb 用于打印
- pdfjs-dist 用于图纸预览
- mqtt 用于设备或网关通信

主业务页面位置：

- `src/views/PlanManagement`：计划、排产、订单关闭。
- `src/views/ProductionManagement`：生产中心、装配中心、工时、外协、异常、班次。
- `src/views/QualityManagement`：质检中心、质检任务、质检明细、不合格品。
- `src/views/ProcessManagement`：标准工艺、生产工艺、工序、图纸。
- `src/views/DeviceManagement`：设备台账、设备实时数据、设备历史数据。
- `src/views/SystemMaintenance`：工位、人员、权限等基础维护。
- `src/views/AnomalousManagement/PunctualWork`：及时开工报表。

### 1.2 后端调用方式

系统现有模式不是 REST API，而是前端统一传存储过程名给 `.ashx` 网关执行。

调用方式：

```text
Vue 页面
  -> this.CreateData(type, procedureName, params, pageSize, pageCurrent)
  -> this.ExecDatabase(data)
  -> MESCommonBase.ashx
  -> SQL Server 存储过程
```

常用 type：

| type | 用途 | 说明 |
|---|---|---|
| `11` | 查询 | 返回列表或分页数据 |
| `12` | 新增、修改、删除 | 返回执行结果 |
| `7` | JSON 批量 | 用于批量排产等 |
| `2001` | 导出 | 现有导出相关逻辑使用 |

参数格式：

```js
const param = []
param.push(['订单号', this.query.订单号])
param.push(['合同号', this.query.合同号])
const data = this.CreateData('11', '存储过程名', param, this.pageSize, this.pageCurrent)
this.ExecDatabase(data).then(res => { ... })
```

### 1.3 核心数据库对象

本轮开发必须优先复用以下核心表和视图。

#### 生产计划主表

表：`MES_接口_生产计划`

关键字段：

| 字段 | 类型 | 说明 |
|---|---|---|
| `订单编号` | int | 生产订单号，主键 |
| `合同号` | nvarchar(50) | 合同维度 |
| `订单状态` | nvarchar(50) | SAP/MES 订单状态 |
| `物料编号` | nvarchar(500) | 主物料编码 |
| `物料描述` | nvarchar(500) | 主物料名称 |
| `计划数量` | decimal(16,2) | 订单计划数量 |
| `计划开始` | datetime | 订单计划开始 |
| `计划完成` | datetime | 订单计划完成 |
| `同步时间` | datetime | SAP/MES 同步时间 |
| `任务状态` | int | 订单任务状态 |
| `齐套` | float | 齐套状态或齐套比例 |
| `预计齐套时间` | datetime | 现有预计齐套时间 |
| `齐套时间` | datetime | 现有齐套时间 |
| `发料状态` | nvarchar(50) | 发料状态 |
| `拣配状态` | nvarchar(50) | 拣配状态 |
| `发货状态` | nvarchar(50) | 发货状态 |
| `要求发货日期` | datetime | 发货要求日期 |
| `入库数量` | decimal(19,6) | 入库数量 |
| `确认状态` | nvarchar(50) | 现有确认状态 |

#### 生产任务表

表：`MES_接口_生产计划_生产任务`

关键字段：

| 字段 | 类型 | 说明 |
|---|---|---|
| `AID` | bigint | TaskAID，任务主键 |
| `订单编号` | int | 生产订单号 |
| `订单行号` | int | SAP/MES 行号 |
| `订单拆分内码` | int | 拆分内码 |
| `物料编码` | nvarchar(500) | 任务物料编码 |
| `物料名称` | nvarchar(500) | 任务物料名称 |
| `工序名称` | nvarchar(50) | 工序 |
| `顺序编号` | int | 工序顺序 |
| `总工时` | decimal(16,2) | 任务总工时，现有字段 |
| `指派对象编号` | nvarchar(50) | 指派对象编号 |
| `指派对象` | nvarchar(50) | 设备/工位/外协/装配等 |
| `指派数量` | decimal(16,2) | 指派数量 |
| `计划开始时间` | datetime | 任务计划开始 |
| `计划完成时间` | datetime | 任务计划完成 |
| `派工时间` | datetime | 现有派工时间 |
| `任务状态` | int | 任务状态 |
| `开工时间` | datetime | 开工时间 |
| `完工时间` | datetime | 完工时间 |
| `完成数量` | int | 完成数 |
| `合格数量` | int | 合格数 |
| `不合格数量` | int | 不合格数 |
| `让步放行数量` | int | 让步放行数 |
| `报废数量` | int | 报废数 |
| `外协通知` | int | 外协通知状态 |
| `外协备注` | nvarchar(500) | 外协备注 |
| `外协分组` | nvarchar(50) | 外协分组 |

#### 生产订单视图

视图：`View_生产订单_MES`

说明：目前多数计划、排产、生产任务查询均基于该视图。新增报表优先从该视图读取生产订单和任务基础信息。

#### 生产操作记录

表：`YL_加工中心_操作记录表`

用途：

- 现场开工、暂停、报工、辅助开始/结束、异常等操作记录。
- 及时检验起算时间。
- 历史工时查询。
- 班次产量表。
- 当前对应人员和当前对应内容。

现有字段从视图和过程可见：

| 字段 | 说明 |
|---|---|
| `TaskAID` | 关联生产任务 |
| `操作类别` | 开始加工、报工、辅助结束、异常等 |
| `操作人` | 人员 |
| `工位编号` / `工位名称` | 工位/设备 |
| `开始时间` / `结束时间` | 操作时间段 |
| `工时` | 秒或分钟，现有过程按 `工时 > 0` 汇总 |
| `操作数值` | 数量或工时数值 |
| `操作内容` | 工作内容 |
| `操作描述` / `异常说明` | 说明 |

#### 质检记录

表：`YL_质量检验_质检记录`

用途：

- 及时检验报表。
- 生产日报-送检。
- 让步接收记录。
- 外协任务检验字段补充。
- 产品合格率。

关键字段：

| 字段 | 说明 |
|---|---|
| `QT_AID` | 质检主键 |
| `TaskAID` | 关联生产任务 |
| `计划号` | 生产订单 |
| `零件编码` / `零件名称` | 物料 |
| `工序名称` | 工序 |
| `质检类型` / `检测类型编号` | 首检、巡检、序检、收检、终检等 |
| `检验数量` | 检验数 |
| `合格数` | 合格数 |
| `不合格数` | 不合格数 |
| `检测人` | 检验人 |
| `检测时间` | 检验时间 |
| `检测说明` | 说明 |

#### 设备采集相关表

| 表 | 说明 |
|---|---|
| `CaChe_Var` | 设备变量当前缓存 |
| `历史_设备数据_定时` | 设备历史采集点位数据 |
| `历史_工位设备状态每分钟记录` | 工位状态每分钟快照 |
| `YL_设备管理_设备台账` | 设备台账 |
| `YL_设备管理_工时记录` | 设备循环时间采集记录 |

## 2. 总体开发原则

### 2.1 页面开发原则

1. 保持现有 Element UI 风格：顶部筛选区、中间按钮区、下方表格、弹窗明细。
2. 报表页面只做查询、导出、打印、钻取，不承担基础主数据维护。
3. 待办类页面可以做状态确认，例如手续确认。
4. 能扩展现有页面的，不新建孤立维护页面。
5. 所有新增页面必须同步菜单、按钮权限、路由组件、操作日志。
6. 所有新增表格都要支持分页，避免一次性查全量。
7. 时间筛选全部统一为闭区间：开始日 `00:00:00` 到结束日 `23:59:59`。
8. 导出字段必须与页面字段一致。

### 2.2 数据库开发原则

1. 优先复用现有表和视图。
2. 新增字段优先加在业务主表或扩展表，不能只存在报表 SQL 中。
3. 人工维护字段必须有维护人、维护时间、原值、新值或日志。
4. SAP 来源字段必须有同步时间和同步状态。
5. 设备采集数据必须先落原始数据，再做汇总，不直接覆盖业务结果。
6. 报表公共口径优先做视图或公共存储过程，不允许每个报表各写一套算法。
7. 看板类过程必须可传统计日期；实时看板默认 `GETDATE()`。
8. 写操作过程必须返回 `result`、`message`，批量操作要返回每行结果。

### 2.3 命名规范

新增表建议命名：

```text
业务域_模块_对象
例：生产管理_装配已排产需求_维护字段
例：生产管理_设计任务
例：生产管理_编程任务
```

新增存储过程建议命名：

```text
业务域_页面_动作
例：生产管理_装配已排产需求_查询
例：生产管理_装配已排产需求_维护字段保存
例：质量管理_及时检验报表_查询
```

如复用原有 MES 前缀，也可以使用：

```text
MES_AssemblyPlannedDemand_Query
MES_AssemblyPlannedDemand_SaveManualFields
```

本项目已有大量中文过程名，建议新增需求优先用中文业务名，便于现场维护。

## 3. 通用新增基础表

以下表建议作为多需求共用基础能力，避免每个需求重复建字段。

### 3.1 SAP 调用日志表

表名：`系统集成_SAP调用日志`

用途：

- 批量关闭 SAP 订单。
- 外协采购收货单号追踪。
- 发货通知、缺件明细、派工时间、合同交货期同步。
- 后续 SAP 失败重试和对账。

建议 SQL：

```sql
CREATE TABLE dbo.系统集成_SAP调用日志 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    业务类型 nvarchar(50) NOT NULL,
    业务主键 nvarchar(100) NULL,
    生产订单 int NULL,
    TaskAID bigint NULL,
    SAP对象类型 nvarchar(50) NULL,
    SAP单据号 nvarchar(100) NULL,
    请求地址 nvarchar(500) NULL,
    请求方法 nvarchar(20) NULL,
    请求内容 nvarchar(max) NULL,
    返回内容 nvarchar(max) NULL,
    执行结果 nvarchar(20) NOT NULL,
    失败原因 nvarchar(max) NULL,
    请求人 nvarchar(50) NULL,
    请求时间 datetime NOT NULL DEFAULT GETDATE(),
    完成时间 datetime NULL,
    是否可重试 bit NOT NULL DEFAULT 0,
    重试次数 int NOT NULL DEFAULT 0
);
```

索引：

```sql
CREATE INDEX IX_系统集成_SAP调用日志_生产订单 ON dbo.系统集成_SAP调用日志(生产订单);
CREATE INDEX IX_系统集成_SAP调用日志_业务类型_时间 ON dbo.系统集成_SAP调用日志(业务类型, 请求时间);
```

### 3.2 业务字段维护日志表

表名：`系统管理_业务字段维护日志`

用途：

- 装配完成时间人工修改。
- 钣金预达、钣金到达、泵预达、泵到达维护。
- 预计总工时维护。
- 预计可执行时间维护。
- 手续确认等人工确认字段。

建议 SQL：

```sql
CREATE TABLE dbo.系统管理_业务字段维护日志 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    业务模块 nvarchar(100) NOT NULL,
    业务表名 nvarchar(100) NULL,
    业务主键 nvarchar(100) NOT NULL,
    字段名 nvarchar(100) NOT NULL,
    原值 nvarchar(max) NULL,
    新值 nvarchar(max) NULL,
    维护说明 nvarchar(500) NULL,
    维护人 nvarchar(50) NOT NULL,
    维护时间 datetime NOT NULL DEFAULT GETDATE()
);
```

索引：

```sql
CREATE INDEX IX_系统管理_业务字段维护日志_业务 ON dbo.系统管理_业务字段维护日志(业务模块, 业务主键);
```

### 3.3 统一异常关联表

现有已有异常管控页面和异常工时逻辑，但本轮要求所有报工页面选中任务直接报异常，且审批人多选。建议在不推翻现有异常管控的前提下增加关联表。

表名：`生产管理_异常管控_任务异常`

```sql
CREATE TABLE dbo.生产管理_异常管控_任务异常 (
    异常AID bigint IDENTITY(1,1) PRIMARY KEY,
    异常编号 nvarchar(50) NOT NULL,
    来源模块 nvarchar(50) NOT NULL,
    生产订单 int NULL,
    TaskAID bigint NULL,
    工序名称 nvarchar(50) NULL,
    指派对象 nvarchar(50) NULL,
    异常类型 nvarchar(50) NULL,
    异常说明 nvarchar(1000) NULL,
    附件ID nvarchar(500) NULL,
    状态 nvarchar(20) NOT NULL DEFAULT N'待处理',
    发起人 nvarchar(50) NOT NULL,
    发起时间 datetime NOT NULL DEFAULT GETDATE(),
    实际处理人 nvarchar(50) NULL,
    处理时间 datetime NULL,
    处理意见 nvarchar(1000) NULL,
    是否关闭 bit NOT NULL DEFAULT 0
);

CREATE TABLE dbo.生产管理_异常管控_审批人 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    异常AID bigint NOT NULL,
    审批人编号 int NULL,
    审批人姓名 nvarchar(50) NOT NULL,
    是否已处理 bit NOT NULL DEFAULT 0,
    处理时间 datetime NULL
);
```

索引：

```sql
CREATE INDEX IX_生产管理_异常管控_任务异常_TaskAID ON dbo.生产管理_异常管控_任务异常(TaskAID, 是否关闭);
CREATE INDEX IX_生产管理_异常管控_审批人_人员 ON dbo.生产管理_异常管控_审批人(审批人姓名, 是否已处理);
```

## 4. 需求 1：及时开工报表

### 4.1 现有页面

页面：`src/views/AnomalousManagement/PunctualWork/index.vue`

现状：

- 当前按指派对象过滤偏向反选逻辑。
- 需求要求增加正选页面或正选模式。
- 真实目标不是重做及时开工算法，只改筛选方式。

### 4.2 页面方案

在查询区新增：

| 控件 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| 指派对象 | `el-select multiple` | 全部 | 复用现有设备/工位下拉 |
| 查询模式 | `el-radio-group` 或 `el-select` | 排除 | 包含、排除 |

页面展示：

```text
指派对象：[多选]   查询模式：[包含/排除]   [查询] [重置] [导出]
```

交互规则：

- 查询模式=包含：只查选中指派对象。
- 查询模式=排除：排除选中指派对象。
- 未选择指派对象：不增加指派对象条件。
- 默认保留原逻辑，避免影响现场使用习惯。

### 4.3 存储过程

建议扩展现有及时开工过程，增加参数：

```sql
@指派对象 nvarchar(max) = N'',
@指派对象查询模式 nvarchar(10) = N'排除'
```

过滤逻辑：

```sql
IF ISNULL(@指派对象, '') <> ''
BEGIN
    IF @指派对象查询模式 = N'包含'
        SET @where = @where + N' AND 指派对象 IN (SELECT value FROM STRING_SPLIT(@指派对象, '',''))'
    ELSE
        SET @where = @where + N' AND 指派对象 NOT IN (SELECT value FROM STRING_SPLIT(@指派对象, '',''))'
END
```

注意：

- 现有很多过程使用字符串拼接动态 SQL，后续应尽量用 `sp_executesql` 参数化，降低注入风险。
- 如果 `.ashx` 传参不支持 `nvarchar(max)`，可用 `nvarchar(4000)`。

### 4.4 不需要新增表

该需求只改页面和存储过程参数，不新增表。

## 5. 需求 2：机加件排产-表单

包含两件事：

1. 已排产页面日期筛选优化。
2. 新增历史工时查询，总工时列和明细弹窗。

### 5.1 现有页面

页面：`src/views/PlanManagement/SelfMakePlandone/index.vue`

现有查询过程：`MES_OrderPlanned_Query`

现有过程参数：

```sql
@计划开始1 nvarchar(50)='',
@计划开始2 nvarchar(50)='',
@计划完成1 nvarchar(50)='',
@计划完成2 nvarchar(50)=''
```

### 5.2 页面日期筛选

改造前：

- 计划开始时间为时间段。
- 计划完成时间为时间段。

改造后：

| 字段 | 控件 | 参数传递 |
|---|---|---|
| 计划开始日期 | `el-date-picker type="date"` | 传 `计划开始日期` |
| 计划完成日期 | `el-date-picker type="date"` | 传 `计划完成日期` |

前端传参方式：

```js
if (this.query.计划开始日期) {
  param.push(['计划开始日期', this.query.计划开始日期])
}
if (this.query.计划完成日期) {
  param.push(['计划完成日期', this.query.计划完成日期])
}
```

兼容方案：

- 为减少影响，可以继续传旧参数：
  - `计划开始1 = yyyy-MM-dd 00:00:00`
  - `计划开始2 = yyyy-MM-dd 23:59:59`
  - `计划完成1 = yyyy-MM-dd 00:00:00`
  - `计划完成2 = yyyy-MM-dd 23:59:59`
- 存储过程也可新增单日期参数，旧参数保留。

### 5.3 存储过程改造

建议扩展 `MES_OrderPlanned_Query`：

```sql
ALTER PROCEDURE dbo.MES_OrderPlanned_Query
    @订单号 int = 0,
    ...
    @计划开始日期 nvarchar(50) = '',
    @计划完成日期 nvarchar(50) = '',
    @指派对象查询模式 nvarchar(10) = N'包含'
AS
BEGIN
    ...
    IF (@计划开始日期 <> '')
        SET @selectStrWhere = @selectStrWhere + 
            ' AND [计划开始时间] >= ''' + @计划开始日期 + ' 00:00:00'' 
              AND [计划开始时间] < DATEADD(DAY, 1, ''' + @计划开始日期 + ''')'

    IF (@计划完成日期 <> '')
        SET @selectStrWhere = @selectStrWhere + 
            ' AND [计划完成时间] >= ''' + @计划完成日期 + ' 00:00:00'' 
              AND [计划完成时间] < DATEADD(DAY, 1, ''' + @计划完成日期 + ''')'
END
```

更稳妥写法是把日期转成 `date` 类型后参数化。

### 5.4 总工时列

表格新增列：

| 列名 | 字段 | 交互 |
|---|---|---|
| 总工时 | `历史总工时` | 蓝色可点击，点击打开明细 |

总工时口径：

- 数据来源：`YL_加工中心_操作记录表`
- 过滤：`TaskAID = 当前任务 TaskAID`，`工时 > 0`
- 默认包含：报工、辅助结束、加班等正向工时。
- 默认排除：异常负工时、未结束记录。
- 单位：建议统一显示小时，保留 2 位小数。

### 5.5 新增存储过程

#### 5.5.1 总工时汇总

过程名：`生产管理_机加已排产_历史工时汇总`

参数：

| 参数 | 类型 | 说明 |
|---|---|---|
| `@TaskAID` | bigint | 可选，单任务 |
| `@订单号` | int | 可选，订单 |
| `@开始日期` | date | 可选 |
| `@结束日期` | date | 可选 |

返回字段：

| 字段 | 说明 |
|---|---|
| `TaskAID` | 任务 |
| `订单编号` | 订单 |
| `工序名称` | 工序 |
| `总工时分钟` | 分钟 |
| `总工时小时` | 小时 |

SQL 示例：

```sql
CREATE PROCEDURE dbo.生产管理_机加已排产_历史工时汇总
    @TaskAID bigint = NULL,
    @订单号 int = NULL,
    @开始日期 date = NULL,
    @结束日期 date = NULL
AS
BEGIN
    SET NOCOUNT ON;

    SELECT
        o.TaskAID,
        MAX(t.订单编号) AS 订单编号,
        MAX(o.工序名称) AS 工序名称,
        SUM(ISNULL(o.工时, 0)) AS 总工时分钟,
        CAST(SUM(ISNULL(o.工时, 0)) / 60.0 AS decimal(18,2)) AS 总工时小时
    FROM dbo.YL_加工中心_操作记录表 o
    LEFT JOIN dbo.MES_接口_生产计划_生产任务 t ON o.TaskAID = t.AID
    WHERE ISNULL(o.工时, 0) > 0
      AND (@TaskAID IS NULL OR o.TaskAID = @TaskAID)
      AND (@订单号 IS NULL OR t.订单编号 = @订单号)
      AND (@开始日期 IS NULL OR o.开始时间 >= @开始日期)
      AND (@结束日期 IS NULL OR o.开始时间 < DATEADD(DAY, 1, @结束日期))
    GROUP BY o.TaskAID;
END
```

#### 5.5.2 历史工时明细

过程名：`生产管理_机加已排产_历史工时明细`

参数：

| 参数 | 类型 | 说明 |
|---|---|---|
| `@TaskAID` | bigint | 必填 |

返回字段：

| 字段 | 说明 |
|---|---|
| `设备名称` | 工位名称 |
| `日期` | 开始时间日期 |
| `生产订单` | 订单编号 |
| `物料编码` | 物料编码 |
| `物料名称` | 物料名称 |
| `工序名称` | 工序 |
| `操作人` | 操作人 |
| `开始时间` | 开始 |
| `结束时间` | 结束 |
| `工时分钟` | 分钟 |
| `工时小时` | 小时 |
| `设备日期小计小时` | 前端可展示分组合计 |

SQL 示例：

```sql
CREATE PROCEDURE dbo.生产管理_机加已排产_历史工时明细
    @TaskAID bigint
AS
BEGIN
    SET NOCOUNT ON;

    SELECT
        o.工位名称 AS 设备名称,
        CONVERT(date, o.开始时间) AS 日期,
        t.订单编号 AS 生产订单,
        t.物料编码,
        t.物料名称,
        o.工序名称,
        o.操作人,
        o.开始时间,
        o.结束时间,
        ISNULL(o.工时, 0) AS 工时分钟,
        CAST(ISNULL(o.工时, 0) / 60.0 AS decimal(18,2)) AS 工时小时,
        CAST(SUM(ISNULL(o.工时, 0)) OVER (PARTITION BY o.工位名称, CONVERT(date, o.开始时间)) / 60.0 AS decimal(18,2)) AS 设备日期小计小时
    FROM dbo.YL_加工中心_操作记录表 o
    LEFT JOIN dbo.MES_接口_生产计划_生产任务 t ON o.TaskAID = t.AID
    WHERE o.TaskAID = @TaskAID
      AND ISNULL(o.工时, 0) > 0
    ORDER BY o.工位名称, CONVERT(date, o.开始时间), o.开始时间;
END
```

### 5.6 前端弹窗

弹窗名：历史工时明细

结构：

```text
设备：CNC-01    小计：12.50小时
  日期：2026-05-28    小计：8.00小时
    任务明细表
  日期：2026-05-29    小计：4.50小时
    任务明细表
```

Element UI 实现建议：

- 用 `el-dialog`。
- 明细用 `el-table` 展示，按设备、日期排序。
- 如需要折叠效果，使用前端 computed 分组。
- 总工时列点击时调用 `生产管理_机加已排产_历史工时明细`。

### 5.7 不建议新增表

本需求只需要新增两个查询过程，不需要新增表。

## 6. 需求 3：装配已排产需求

### 6.1 定位

这是本轮最大的独立子项目，不是简单报表。

页面目标：

- 基于装配已排产数据。
- 整合 SAP 字段、MES 报工、工时、异常、齐套时间、装配完成时间、日计划。
- 支持部分人工维护字段。

建议页面路径：

```text
src/views/ProductionManagement/AssemblyPlannedDemand/index.vue
```

菜单建议：

```text
生产管理 -> 装配管理 -> 装配已排产需求
```

### 6.2 页面布局

页面结构：

```text
查询区：
系统分类[全部/系统/非系统] 合同号 生产订单 物料编码/名称
发料齐套时间[起止] 装配完成时间[起止] 状态[全部]
[查询] [重置] [导出] [日计划] [打印]

主表：
生产订单 合同号 物料编码 物料名称 系统/非系统 派工时间 合同交货期
发料齐套时间 装配完成时间 当前对应人员 当前对应内容
生产订单累计工时 合同工时汇总 合同进度参考 预计总工时 预计剩余工时
钣金预达 钣金到达 泵 生产异常 历史工序说明 操作

操作列：
[维护] [工时明细] [异常明细] [历史工序] [日计划]
```

### 6.3 字段口径

| 字段 | 来源 | 维护方式 | 说明 |
|---|---|---|---|
| 生产订单 | `MES_接口_生产计划.订单编号` | 只读 | 主键 |
| 合同号 | `MES_接口_生产计划.合同号` | 只读 | 合同维度 |
| 物料编码 | `MES_接口_生产计划.物料编号` | 只读 | 主物料 |
| 物料名称 | `MES_接口_生产计划.物料描述` | 只读 | 主物料名称 |
| 系统/非系统 | 规则计算 | 只读 | 高压冷却为系统，阀类非高压冷却为非系统 |
| 派工时间 | SAP 或任务表 `派工时间` | 只读 | 以 SAP 提供为准；现任务表已有派工时间 |
| 合同交货期 | SAP | 只读 | 需同步字段 |
| 发料齐套时间 | SAP/MES 齐套字段 | 可必要维护 | 优先使用 `齐套时间` 或后续 SAP 字段 |
| 装配完成时间 | 发料齐套时间 + 3 天 | 可维护 | 人工修改需记录日志 |
| 钣金预达 | 人工维护 | 可维护 | 过程字段 |
| 钣金到达 | 人工维护 | 可维护 | 过程字段 |
| 泵 | 人工维护 | 可维护 | 建议拆成泵预达/泵到达或说明 |
| 当前对应人员 | 操作记录 | 只读 | 开始未结束的人，多个合并 |
| 当前对应内容 | 操作记录/新增字段 | 只读/维护 | 装配开始时输入的工作内容 |
| 生产订单累计工时 | 工时汇总 | 只读 | 按生产订单分类汇总装配、质量、设计 |
| 历史工序说明 | 报工结束说明 | 只读 | 多条合并或明细弹窗 |
| 预计总工时 | 人工维护 | 可维护 | 订单级 |
| 合同工时汇总 | 工时汇总 | 只读 | 合同下所有订单 |
| 合同进度参考 | 计算 | 只读 | 累计工时 / 预计总工时 |
| 预计剩余工时 | 计算 | 只读 | 预计总工时 - 累计工时 |
| 生产异常 | 异常表 | 只读 | 未关闭异常数和明细 |

### 6.4 建议新增字段

优先不要直接无限扩展主表。建议建订单扩展表。

表名：`生产管理_装配已排产需求_扩展`

```sql
CREATE TABLE dbo.生产管理_装配已排产需求_扩展 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    订单编号 int NOT NULL,
    发料齐套时间 datetime NULL,
    发料齐套时间来源 nvarchar(50) NULL,
    装配完成时间 datetime NULL,
    装配完成时间是否人工修改 bit NOT NULL DEFAULT 0,
    SAP派工时间 datetime NULL,
    合同交货期 datetime NULL,
    钣金预达 datetime NULL,
    钣金到达 datetime NULL,
    泵预达 datetime NULL,
    泵到达 datetime NULL,
    泵说明 nvarchar(500) NULL,
    预计总工时 decimal(18,2) NULL,
    备注 nvarchar(1000) NULL,
    最后维护人 nvarchar(50) NULL,
    最后维护时间 datetime NULL,
    创建时间 datetime NOT NULL DEFAULT GETDATE()
);

CREATE UNIQUE INDEX UX_生产管理_装配已排产需求_扩展_订单编号
ON dbo.生产管理_装配已排产需求_扩展(订单编号);
```

### 6.5 当前对应内容

当前系统 `MES_人员工时记录_开始` 和装配中心已有人员工时逻辑。需求要求“装配开始时输入工作内容”。如果现有开始记录没有工作内容字段，应补字段到对应记录表。由于实际装配人员工时表名需从存储过程确认，建议先通过 `MES_人员工时记录_开始` 的落表对象确认。

建议新增字段：

```sql
ALTER TABLE dbo.YL_加工中心_操作记录表 ADD 当前工作内容 nvarchar(1000) NULL;
```

如果装配人员工时独立表存在，应加在装配人员工时表，而不是操作记录表。

前端改造：

- `AssemblyCenter` 开始装配弹窗增加 `工作内容`。
- 调用 `MES_人员工时记录_开始` 时增加参数 `@工作内容`。
- 未结束记录的人员和工作内容在装配已排产需求页展示。

### 6.6 工时汇总视图

建议新增统一工时视图，供装配已排产需求、合同工时、工时报表复用。

视图名：`View_统一工时明细`

字段：

| 字段 | 说明 |
|---|---|
| `来源模块` | 机加、装配、质量、设计、编程、设备 |
| `工时类型` | 装配、质量、设计等 |
| `生产订单` | 订单 |
| `合同号` | 合同 |
| `TaskAID` | 任务，可空 |
| `工序名称` | 工序 |
| `操作人` | 人员 |
| `开始时间` | 开始 |
| `结束时间` | 结束 |
| `工时分钟` | 分钟 |
| `工时小时` | 小时 |

第一阶段可只接入：

- 装配：`MES_人员工时记录_*` 对应表或 `YL_加工中心_操作记录表`
- 质量：质检中心人员工时记录或操作记录
- 设计：设计任务报工表，等设计模块完成后接入

### 6.7 查询存储过程

过程名：`生产管理_装配已排产需求_查询`

参数：

| 参数 | 类型 |
|---|---|
| `@系统分类` | nvarchar(20)，全部/系统/非系统 |
| `@合同号` | nvarchar(50) |
| `@订单编号` | int |
| `@物料` | nvarchar(100) |
| `@发料齐套开始` | date |
| `@发料齐套结束` | date |
| `@装配完成开始` | date |
| `@装配完成结束` | date |
| `@状态` | nvarchar(50) |

核心 SQL 口径：

```sql
SELECT
    p.订单编号,
    p.合同号,
    p.物料编号,
    p.物料描述,
    CASE 
        WHEN p.物料描述 LIKE N'%高压冷却%' THEN N'系统'
        ELSE N'非系统'
    END AS 系统分类,
    ISNULL(e.SAP派工时间, MAX(t.派工时间)) AS 派工时间,
    e.合同交货期,
    COALESCE(e.发料齐套时间, p.齐套时间, p.预计齐套时间) AS 发料齐套时间,
    COALESCE(e.装配完成时间, DATEADD(DAY, 3, COALESCE(e.发料齐套时间, p.齐套时间, p.预计齐套时间))) AS 装配完成时间,
    e.钣金预达,
    e.钣金到达,
    e.泵预达,
    e.泵到达,
    e.泵说明,
    e.预计总工时,
    wh.生产订单累计工时,
    chw.合同工时汇总,
    CASE WHEN ISNULL(e.预计总工时,0) = 0 THEN NULL
         ELSE CAST(wh.生产订单累计工时 / e.预计总工时 AS decimal(18,4))
    END AS 合同进度参考,
    ISNULL(e.预计总工时,0) - ISNULL(wh.生产订单累计工时,0) AS 预计剩余工时,
    cur.当前对应人员,
    cur.当前对应内容,
    abn.未关闭异常数
FROM dbo.MES_接口_生产计划 p
LEFT JOIN dbo.MES_接口_生产计划_生产任务 t ON p.订单编号 = t.订单编号
LEFT JOIN dbo.生产管理_装配已排产需求_扩展 e ON p.订单编号 = e.订单编号
LEFT JOIN (...) wh ON p.订单编号 = wh.生产订单
LEFT JOIN (...) chw ON p.合同号 = chw.合同号
LEFT JOIN (...) cur ON p.订单编号 = cur.生产订单
LEFT JOIN (...) abn ON p.订单编号 = abn.生产订单
WHERE p.自制件属性 LIKE N'%装配%'
GROUP BY ...
```

### 6.8 保存维护字段过程

过程名：`生产管理_装配已排产需求_维护字段保存`

参数：

- `@订单编号 int`
- `@发料齐套时间 datetime = NULL`
- `@装配完成时间 datetime = NULL`
- `@钣金预达 datetime = NULL`
- `@钣金到达 datetime = NULL`
- `@泵预达 datetime = NULL`
- `@泵到达 datetime = NULL`
- `@泵说明 nvarchar(500) = NULL`
- `@预计总工时 decimal(18,2) = NULL`
- `@备注 nvarchar(1000) = NULL`
- `@维护人 nvarchar(50)`

逻辑：

1. 如果扩展表不存在订单记录，插入。
2. 如果存在，更新。
3. 对每个字段写 `系统管理_业务字段维护日志`。
4. 返回 `result=1`。

### 6.9 工时明细过程

过程名：`生产管理_装配已排产需求_工时明细`

参数：

- `@订单编号 int`
- `@合同号 nvarchar(50)`
- `@工时类型 nvarchar(50)`，全部/装配/质量/设计

返回：

- 来源模块
- 工时类型
- 生产订单
- 合同号
- TaskAID
- 工序名称
- 操作人
- 开始时间
- 结束时间
- 工时小时
- 工作内容
- 结束说明

### 6.10 异常明细过程

过程名：`生产管理_装配已排产需求_异常明细`

数据来源：

- 优先：`生产管理_异常管控_任务异常`
- 兼容：现有异常管控表或 `YL_加工中心_操作记录表` 中 `操作类别='异常'`

返回：

- 异常编号
- 异常类型
- 异常说明
- 发起人
- 发起时间
- 状态
- 处理人
- 处理时间

### 6.11 日计划

页面按钮：`日计划`

规则：

- 按装配完成时间分组。
- 未完成、未入库、未关闭的任务进入计划。
- 支持导出、打印。

过程名：`生产管理_装配已排产需求_日计划`

参数：

- `@计划日期 date`
- `@系统分类 nvarchar(20)`

返回字段：

- 计划日期
- 生产订单
- 合同号
- 物料编码
- 物料名称
- 装配完成时间
- 当前对应人员
- 当前对应内容
- 异常状态
- 备注

打印：

- 使用 `vue-print-nb`。
- 打印区域为日计划表格。
- 标题：`装配日计划 YYYY-MM-DD`。

## 7. 需求 4：生产日报-送检

### 7.1 页面定位

建议新增页面：

```text
src/views/ReportManagement/InspectionDaily/index.vue
```

如果项目没有 `ReportManagement`，可放在：

```text
src/views/ProductionManagement/InspectionDaily/index.vue
```

菜单建议：

```text
报表中心 -> 生产日报 -> 生产日报-送检
```

页面采用两个页签：

- 机加送检日报
- 装配送检日报

### 7.2 页面布局

```text
页签：[机加送检日报] [装配送检日报]

查询区：
日期[单日/日期范围] 部门[全部] 生产订单 物料 工序 状态
[查询] [重置] [导出]

汇总区：
送检数量 已检数量 合格数量 不合格数量 未检数量 及时率

表格：
日期 部门 生产订单 物料编码 物料名称 工序名称 送检数量
已检数量 合格数量 不合格数量 未检数量 送检时间 检验时间 状态
```

### 7.3 需要确认的数据

| 数据 | 需要确认 |
|---|---|
| 送检记录来源 | 装配送检是否来自 `MES_ProductTask_SendInspection` 写入的记录，机加送检是否来自质检任务或操作记录 |
| 部门归属 | 按操作人部门、工位部门、任务部门还是物料/订单类型 |
| 送检数量 | 取操作记录 `操作数值`，还是质检记录 `检验数量` |
| 已检数量 | 质检记录合计 |
| 状态 | 未检、部分检验、已检、超期 |

### 7.4 建议视图

视图名：`View_生产日报_送检明细`

字段：

| 字段 | 来源 |
|---|---|
| 日期 | 送检时间日期 |
| 送检类型 | 机加/装配 |
| 部门 | 人员部门或工位部门 |
| 生产订单 | 任务订单 |
| TaskAID | 任务 |
| 物料编码 | 任务物料 |
| 物料名称 | 任务物料 |
| 工序名称 | 任务工序 |
| 指派对象 | 任务指派对象 |
| 送检数量 | 送检记录 |
| 已检数量 | 质检记录 |
| 合格数量 | 质检记录 |
| 不合格数量 | 质检记录 |
| 未检数量 | 送检数量 - 已检数量 |
| 送检时间 | 送检记录时间 |
| 检验时间 | 最后检验时间 |
| 状态 | 计算 |

### 7.5 存储过程

过程名：`生产日报_送检_查询`

参数：

| 参数 | 类型 |
|---|---|
| `@送检类型` | nvarchar(20)，机加/装配 |
| `@开始日期` | date |
| `@结束日期` | date |
| `@部门` | nvarchar(50) |
| `@生产订单` | int |
| `@物料` | nvarchar(100) |
| `@状态` | nvarchar(20) |

核心逻辑：

```sql
SELECT
    日期,
    部门,
    生产订单,
    物料编码,
    物料名称,
    工序名称,
    SUM(送检数量) AS 送检数量,
    SUM(已检数量) AS 已检数量,
    SUM(合格数量) AS 合格数量,
    SUM(不合格数量) AS 不合格数量,
    SUM(未检数量) AS 未检数量,
    MIN(送检时间) AS 最早送检时间,
    MAX(检验时间) AS 最后检验时间,
    CASE
        WHEN SUM(已检数量) = 0 THEN N'未检'
        WHEN SUM(未检数量) > 0 THEN N'部分检验'
        ELSE N'已检'
    END AS 状态
FROM dbo.View_生产日报_送检明细
WHERE 日期 >= @开始日期
  AND 日期 < DATEADD(DAY, 1, @结束日期)
  AND (@送检类型 = N'全部' OR 送检类型 = @送检类型)
GROUP BY 日期, 部门, 生产订单, 物料编码, 物料名称, 工序名称
ORDER BY 日期, 部门, 生产订单;
```

### 7.6 是否新增表

第一阶段不新增表，使用视图 + 存储过程。

如果客户要求日报定版，需要新增快照表：

```sql
CREATE TABLE dbo.生产日报_送检_日报快照 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    统计日期 date NOT NULL,
    送检类型 nvarchar(20) NOT NULL,
    部门 nvarchar(50) NULL,
    生产订单 int NULL,
    TaskAID bigint NULL,
    物料编码 nvarchar(100) NULL,
    物料名称 nvarchar(500) NULL,
    工序名称 nvarchar(100) NULL,
    送检数量 decimal(18,2) NULL,
    已检数量 decimal(18,2) NULL,
    合格数量 decimal(18,2) NULL,
    不合格数量 decimal(18,2) NULL,
    未检数量 decimal(18,2) NULL,
    状态 nvarchar(20) NULL,
    生成时间 datetime NOT NULL DEFAULT GETDATE(),
    生成人 nvarchar(50) NULL
);
```

## 8. 需求 5：及时齐套跟踪结果报表

### 8.1 页面定位

新增页面：

```text
src/views/ProductionManagement/KitTrackingResult/index.vue
```

菜单建议：

```text
报表中心 -> 齐套报表 -> 及时齐套跟踪结果报表
```

### 8.2 页面布局

```text
查询区：
主生产订单 合同号 物料 齐套状态 预计可执行时间 SAP同步时间
[查询] [重置] [导出]

主表：
主生产订单 合同号 物料编码 物料名称 计划数量 齐套状态
缺件数 当前进度 预计可执行时间 SAP同步时间 操作

展开明细：
缺料生产订单 缺料物料编码 缺料物料名称 缺件数量 属性
对应单据号 当前进度 全序展示 单条预计完成时间 预计可执行时间 操作
```

### 8.3 数据来源

| 数据 | 来源 | 方式 |
|---|---|---|
| 主表订单 | `MES_接口_生产计划` / `View_生产订单_MES` | MES 查询 |
| 齐套状态 | `齐套`、`齐套时间`、`发料状态`、`拣配状态` | MES 字段 |
| 缺件明细 | SAP 实时接口 | 点击展开时查 |
| 主子订单关系 | SAP 或 MES 人工维护 | 建议落 MES 表 |
| 预计可执行时间 | 人工维护 | 报表内维护，写日志 |

### 8.4 建议新增表

#### 8.4.1 主子订单关系表

表名：`生产管理_齐套跟踪_主子订单关系`

```sql
CREATE TABLE dbo.生产管理_齐套跟踪_主子订单关系 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    主生产订单 int NOT NULL,
    缺料生产订单 int NOT NULL,
    缺料物料编码 nvarchar(100) NULL,
    缺料物料名称 nvarchar(500) NULL,
    关系来源 nvarchar(50) NOT NULL DEFAULT N'人工维护',
    是否有效 bit NOT NULL DEFAULT 1,
    创建人 nvarchar(50) NULL,
    创建时间 datetime NOT NULL DEFAULT GETDATE(),
    最后维护人 nvarchar(50) NULL,
    最后维护时间 datetime NULL
);

CREATE INDEX IX_生产管理_齐套跟踪_主子订单关系_主单
ON dbo.生产管理_齐套跟踪_主子订单关系(主生产订单, 是否有效);
```

#### 8.4.2 缺件预计信息表

表名：`生产管理_齐套跟踪_缺件预计信息`

```sql
CREATE TABLE dbo.生产管理_齐套跟踪_缺件预计信息 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    主生产订单 int NOT NULL,
    缺料生产订单 int NULL,
    缺料物料编码 nvarchar(100) NOT NULL,
    对应单据号 nvarchar(100) NULL,
    预计可执行时间 datetime NULL,
    预计可执行说明 nvarchar(500) NULL,
    维护人 nvarchar(50) NULL,
    维护时间 datetime NOT NULL DEFAULT GETDATE()
);

CREATE INDEX IX_生产管理_齐套跟踪_缺件预计信息_主单
ON dbo.生产管理_齐套跟踪_缺件预计信息(主生产订单);
```

#### 8.4.3 SAP 缺件缓存表

如果 SAP 实时查询压力大，新增缓存表：

```sql
CREATE TABLE dbo.系统集成_SAP缺件明细缓存 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    主生产订单 int NOT NULL,
    查询时间 datetime NOT NULL DEFAULT GETDATE(),
    缺料生产订单 int NULL,
    物料编码 nvarchar(100) NULL,
    物料名称 nvarchar(500) NULL,
    缺件数量 decimal(18,2) NULL,
    属性 nvarchar(20) NULL,
    对应单据号 nvarchar(100) NULL,
    当前进度 nvarchar(500) NULL,
    全序展示 nvarchar(max) NULL,
    单条预计完成时间 datetime NULL,
    原始JSON nvarchar(max) NULL
);
```

### 8.5 存储过程

主表查询：

```text
生产管理_齐套跟踪结果_主表查询
```

参数：

- `@主生产订单 int`
- `@合同号 nvarchar(50)`
- `@物料 nvarchar(100)`
- `@齐套状态 nvarchar(50)`
- `@预计开始 date`
- `@预计结束 date`

展开明细：

```text
生产管理_齐套跟踪结果_缺件明细查询
```

说明：

- 第一优先：点击展开时前端调用 SAP 接口，再把结果展示并可缓存。
- 如果后端 `.ashx` 只能执行 SQL，SAP 查询需要前端现有 SAP/B1 接口或后端新增封装接口。
- 如果不能实时查 SAP，先读取 `系统集成_SAP缺件明细缓存`。

预计可执行时间保存：

```text
生产管理_齐套跟踪结果_预计时间保存
```

参数：

- 主生产订单
- 缺料生产订单
- 缺料物料编码
- 对应单据号
- 预计可执行时间
- 预计可执行说明
- 维护人

同时写 `系统管理_业务字段维护日志`。

## 9. 需求 6：生产计划跟踪

### 9.1 现有页面

页面：

```text
src/views/ProductionManagement/ProductionPlanTrack/index.vue
```

现有调用：

```text
生产管理_生产计划跟踪
```

页面现状已经有外协状态处理、工序子表、颜色等基础逻辑。

### 9.2 页面改造

新增/调整：

| 内容 | 实现 |
|---|---|
| 当前序显示完整工艺路线 | 主表列改为路线组件 |
| 工序文字按状态变色 | 前端根据状态 class |
| 进度文案 | `打磨中`、`打磨毕待淬火` |
| 标准工时 | 表格列 |
| 订单状态 | 表格列 |

工艺路线显示：

```text
打磨（张三） -> 淬火（外协） -> 精磨（李四）
```

颜色规则：

| 状态 | 样式 |
|---|---|
| 正在加工 | 蓝色或绿色高亮 |
| 已完成 | 灰色 |
| 等待加工 | 默认 |
| 异常 | 红色 |

### 9.3 后端返回字段

过程 `生产管理_生产计划跟踪` 需要返回每道工序：

| 字段 | 说明 |
|---|---|
| 生产订单 |
| 合同号 |
| 订单状态 |
| 物料编码 |
| 物料名称 |
| TaskAID |
| 工序名称 |
| 顺序编号 |
| 指派对象 |
| 任务状态 |
| 加工状态 |
| 开工时间 |
| 完工时间 |
| 标准工时 |
| 外协结束时间 |

### 9.4 SQL 逻辑

标准工时来源：

- 优先 `车间生产管理工艺_零件生产工艺_工艺库.标准工时`
- 通过 `订单编号 + 工艺顺序/订单行号` 关联

订单状态来源：

- `MES_接口_生产计划.订单状态`
- 如果 SAP 同步了单据状态，也可增加 `单据状态`

过程示例逻辑：

```sql
SELECT
    p.订单编号,
    p.合同号,
    p.订单状态,
    t.AID AS TaskAID,
    t.工序名称,
    t.顺序编号,
    t.指派对象,
    t.任务状态,
    t.加工状态,
    t.开工时间,
    t.完工时间,
    ISNULL(g.标准工时, 0) AS 标准工时
FROM dbo.MES_接口_生产计划 p
JOIN dbo.MES_接口_生产计划_生产任务 t ON p.订单编号 = t.订单编号
LEFT JOIN dbo.车间生产管理工艺_零件生产工艺_工艺库 g
  ON t.订单编号 = g.订单编号
 AND t.订单行号 = g.工艺顺序
WHERE ...
ORDER BY p.订单编号, t.顺序编号;
```

### 9.5 前端算法

将后端明细按订单分组：

```js
const groups = {}
rows.forEach(row => {
  if (!groups[row.订单编号]) groups[row.订单编号] = []
  groups[row.订单编号].push(row)
})
```

每个工序状态：

```js
function getStepStatus(step) {
  if (step.任务状态 === 4 || step.完工时间) return 'done'
  if (step.加工状态 === 2 || step.开工时间) return 'doing'
  return 'waiting'
}
```

进度文案：

```js
function getProgressText(steps) {
  const doing = steps.find(x => getStepStatus(x) === 'doing')
  if (doing) return `${doing.工序名称}中`
  const lastDoneIndex = findLastDoneIndex(steps)
  if (lastDoneIndex >= 0 && steps[lastDoneIndex + 1]) {
    return `${steps[lastDoneIndex].工序名称}毕待${steps[lastDoneIndex + 1].工序名称}`
  }
  if (lastDoneIndex === steps.length - 1) return '已完成'
  return '待开工'
}
```

## 10. 需求 7：外协任务检验

### 10.1 现有页面

相关页面：

```text
src/views/QualityManagement/CheckTask/processReceive.vue
src/views/ProductionManagement/OutsourceMange/index.vue
src/views/ProductionManagement/OutsourceSheet/index.vue
```

现有视图：

- `View_质量检验_质检记录_外协收检`
- `View_外协质检`
- `View_外协报表视图`

### 10.2 需求字段

| 字段 | 来源 |
|---|---|
| 指派对象 | 任务表 `MES_接口_生产计划_生产任务.指派对象` |
| 供应商 | SAP 采购/外协单据，或外协任务维护 |
| SAP采购收货单号 | SAP 采购收货成功后返回 |

### 10.3 建议新增字段

优先加在质检记录扩展表，避免直接改大表影响历史。

表名：`质量管理_外协收检_扩展`

```sql
CREATE TABLE dbo.质量管理_外协收检_扩展 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    QT_AID bigint NOT NULL,
    TaskAID bigint NULL,
    指派对象 nvarchar(50) NULL,
    供应商编码 nvarchar(100) NULL,
    供应商名称 nvarchar(200) NULL,
    SAP采购收货单号 nvarchar(100) NULL,
    SAP采购收货行号 nvarchar(50) NULL,
    SAP同步状态 nvarchar(20) NULL,
    SAP返回信息 nvarchar(max) NULL,
    创建时间 datetime NOT NULL DEFAULT GETDATE(),
    最后维护时间 datetime NULL
);

CREATE UNIQUE INDEX UX_质量管理_外协收检_扩展_QT
ON dbo.质量管理_外协收检_扩展(QT_AID);
```

如果客户明确要在质检主记录中查询导出，也可直接加字段到 `YL_质量检验_质检记录`：

```sql
ALTER TABLE dbo.YL_质量检验_质检记录 ADD
    指派对象 nvarchar(50) NULL,
    供应商编码 nvarchar(100) NULL,
    供应商名称 nvarchar(200) NULL,
    SAP采购收货单号 nvarchar(100) NULL;
```

推荐扩展表，查询视图再拼接。

### 10.4 页面改造

序检收检页面：

- 收检表格增加：指派对象、供应商、SAP采购收货单号。
- 收检详情弹窗增加只读展示。
- 外协收检成功后，保存 SAP 返回的采购收货单号。

外协报表：

- 增加供应商、SAP采购收货单号列。
- 后续供应商合格率按供应商分组。

### 10.5 存储过程

新增或扩展：

| 过程 | 说明 |
|---|---|
| `质量管理_外协收检_扩展保存` | 收检完成后保存供应商和 SAP 单号 |
| `质量管理_外协收检_查询` | 查询外协收检扩展字段 |
| `生产管理_外协任务报表_查询` | 扩展供应商、SAP采购收货单号、采购到货期说明 |

## 11. 需求 8：异常管控

### 11.1 现有页面

异常页面：

```text
src/views/ProductionManagement/AbnormalControl/index.vue
```

需要加入口的页面：

- `ProductionManagement/MachiningCenter/index.vue`
- `ProductionManagement/AssemblyCenter/index.vue`
- `QualityManagement/QualityCenter/index.vue`
- `QualityManagement/CheckTask/processReceive.vue`
- 后续设计任务报工页面
- 后续编程任务清单页面

### 11.2 页面交互

在任务操作区增加按钮：

```text
[报异常]
```

点击前校验：

- 必须选中任务。
- 必须有 TaskAID 或生产订单。
- 已关闭/已入库任务不允许新报异常，除非角色有权限。

异常弹窗字段：

| 字段 | 控件 |
|---|---|
| 生产订单 | 只读 |
| TaskAID | 隐藏 |
| 工序名称 | 只读 |
| 指派对象 | 只读 |
| 异常类型 | 下拉 |
| 异常说明 | 多行文本 |
| 附件 | 上传 |
| 审批人 | 人员多选 |

### 11.3 数据表

使用第 3.3 节建议表：

- `生产管理_异常管控_任务异常`
- `生产管理_异常管控_审批人`

### 11.4 存储过程

#### 11.4.1 异常提交

过程名：`生产管理_异常管控_任务异常提交`

参数：

- 来源模块
- 生产订单
- TaskAID
- 工序名称
- 指派对象
- 异常类型
- 异常说明
- 附件ID
- 审批人JSON
- 发起人

逻辑：

1. 生成异常编号，例如 `YC202605280001`。
2. 插入 `生产管理_异常管控_任务异常`。
3. 解析审批人 JSON，插入 `生产管理_异常管控_审批人`。
4. 返回异常编号。

#### 11.4.2 待办查询

过程名：`生产管理_异常管控_待办查询`

参数：

- `@审批人姓名`
- `@状态`

逻辑：

- 审批人被选中即可看到任务。
- 任一审批人处理后，异常进入下一状态或关闭。

#### 11.4.3 异常处理

过程名：`生产管理_异常管控_任务异常处理`

参数：

- 异常AID
- 处理人
- 处理意见
- 处理结果

逻辑：

1. 更新异常主表实际处理人、处理时间、状态。
2. 当前审批人记录标记已处理。
3. 同一异常其他审批人不再待办。

## 12. 需求 9：机加班次产量表

### 12.1 页面定位

新增页面：

```text
src/views/ProductionManagement/MachiningShiftOutput/index.vue
```

菜单：

```text
报表中心 -> 生产报表 -> 机加班次产量表
```

### 12.2 页面布局

```text
查询区：
日期范围 班次 设备 操作人 生产订单 物料
[查询] [重置] [导出]

汇总卡：
总数量 总工时 设备数 班次数

分组表：
设备 -> 日期 -> 班次 -> 任务明细
```

### 12.3 数据来源

| 数据 | 来源 |
|---|---|
| 报工数量 | `YL_加工中心_操作记录表.操作数值` |
| 工时 | `YL_加工中心_操作记录表.工时` |
| 设备 | `工位名称` 或任务 `指派对象` |
| 生产订单/物料 | `MES_接口_生产计划_生产任务` |
| 班次 | `班次表` + 时间匹配 |

现有函数：

```text
dbo.计算班次重叠秒数
```

可用于跨天班次工时计算。

### 12.4 存储过程

过程名：`生产报表_机加班次产量表_查询`

参数：

- 开始日期
- 结束日期
- 班次
- 设备
- 操作人
- 生产订单
- 物料

返回：

- 设备名称
- 日期
- 班次
- 生产订单
- 物料编码
- 物料名称
- 工序名称
- 开始时间
- 结束时间
- 工时小时
- 数量
- 操作人
- 设备日期班次小计数量
- 设备日期班次小计工时

SQL 逻辑：

1. 取 `操作类别='报工'` 且 `操作数值 > 0` 的记录。
2. 按 `开始时间` 匹配班次。
3. 关联任务表补订单、物料、工序。
4. 按设备、日期、班次排序。

### 12.5 是否新增表

第一阶段不新增表。

如果班次规则不足，需要扩展 `班次表`：

```sql
ALTER TABLE dbo.班次表 ADD
    是否跨天 bit NULL,
    是否启用 bit NULL,
    班次日期归属 nvarchar(20) NULL; -- 开始日/结束日
```

## 13. 需求 10：发货通知列表

### 13.1 页面定位

新增页面：

```text
src/views/ProductionManagement/ShippingNoticeList/index.vue
```

菜单：

```text
报表中心 -> 交付报表 -> 发货通知列表
```

### 13.2 数据来源

客户说明：SAP 已提供数据，大屏已显示。

需要先查新分析：

1. 大屏当前发货通知读取哪个过程。
2. `装配中心任务看板_发货状态查询` 是否已经包含发货通知字段。
3. `MES_接口_生产计划` 中 `发货状态`、`要求发货日期` 是否够用。
4. 是否有 SAP 发货通知同步落地表。

### 13.3 建议新增表

若当前没有发货通知落地表，建议建：

```sql
CREATE TABLE dbo.系统集成_SAP发货通知 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    发货通知号 nvarchar(100) NOT NULL,
    合同号 nvarchar(50) NULL,
    客户编码 nvarchar(100) NULL,
    客户名称 nvarchar(200) NULL,
    生产订单 int NULL,
    物料编码 nvarchar(100) NULL,
    物料名称 nvarchar(500) NULL,
    数量 decimal(18,2) NULL,
    要求发货日期 datetime NULL,
    发货状态 nvarchar(50) NULL,
    SAP同步时间 datetime NULL,
    原始JSON nvarchar(max) NULL,
    创建时间 datetime NOT NULL DEFAULT GETDATE()
);

CREATE INDEX IX_系统集成_SAP发货通知_合同号 ON dbo.系统集成_SAP发货通知(合同号);
CREATE INDEX IX_系统集成_SAP发货通知_生产订单 ON dbo.系统集成_SAP发货通知(生产订单);
```

如果已有大屏同步表，则不建新表，直接复用。

### 13.4 存储过程

过程名：`报表_发货通知列表_查询`

参数：

- 发货通知号
- 合同号
- 客户
- 状态
- 要求发货开始
- 要求发货结束

返回：

- 发货通知号
- 合同号
- 客户
- 生产订单
- 物料编码
- 物料名称
- 数量
- 要求发货日期
- 发货状态
- SAP同步时间

## 14. 需求 11：质检任务早知道

### 14.1 依赖

强依赖：

- `生产管理_装配已排产需求_查询`
- 装配完成时间字段可用

### 14.2 页面定位

新增页面：

```text
src/views/QualityManagement/QualityTaskPreview/index.vue
```

菜单：

```text
质量管理 -> 质量报表 -> 质检任务早知道
```

### 14.3 查询规则

过滤：

- 装配完成时间在查询范围内。
- 排除已完成质检。
- 排除订单关闭、取消、整单已入库。
- 按装配完成时间分组。

### 14.4 存储过程

过程名：`质量管理_质检任务早知道_查询`

参数：

- 装配完成开始
- 装配完成结束
- 合同号
- 生产订单
- 物料

返回：

- 预计质检日期
- 生产订单
- 合同号
- 物料编码
- 物料名称
- 装配完成时间
- 当前对应人员
- 当前对应内容
- 累计工时
- 异常状态
- 质检状态

SQL 逻辑：

```sql
-- 基于装配已排产需求结果，再排除已检/关闭/取消/入库
```

### 14.5 不新增表

本需求不新增表，只新增查询过程和页面。

## 15. 需求 12：生产工艺自动带出标准工艺

### 15.1 现有页面

相关页面：

```text
src/views/ProcessManagement/ProcessProduct/index.vue
src/views/ProcessManagement/ProcessesDevelop/index.vue
```

### 15.2 页面交互

点击编辑生产工艺：

1. 查询是否已有生产工艺。
2. 如果有，正常打开。
3. 如果没有，提示：

```text
当前订单未找到生产工艺，是否按物料标准工艺带出草稿？
[带出标准工艺] [取消]
```

4. 带出后只在页面显示，不直接落库。
5. 用户点击保存后，写入生产工艺。

### 15.3 存储过程

新增：

| 过程 | 用途 |
|---|---|
| `工艺管理_生产工艺_是否存在` | 按订单号查询是否已有生产工艺 |
| `工艺管理_生产工艺_标准工艺草稿查询` | 按物料编码查标准工艺并映射成生产工艺字段 |

保存仍复用现有生产工艺保存过程。

### 15.4 字段映射

需要查新分析：

- 标准工艺表：`车间生产管理工艺_零件工序_工艺库`
- 生产工艺表：`车间生产管理工艺_零件生产工艺_工艺库`
- 两者字段差异。

至少映射：

| 标准工艺 | 生产工艺 |
|---|---|
| 物料编号 | 物料编号 |
| 工序名称 | 工序名称 |
| 工艺顺序 | 工艺顺序 |
| 标准工时 | 标准工时 |
| 工序说明 | 工序说明 |
| 指派对象默认值 | 指派对象 |

### 15.5 不建议新增表

该需求只改页面和过程，不新增表。

## 16. 需求 13：工时报表 + 备注类小改

### 16.1 工时报表新增指派对象

现有页面：

```text
src/views/ProductionManagement/Timesheet/index.vue
```

现有过程：

```text
工时统计_作业者工时_查询
工时统计_作业者工时_查询_导出
```

改造：

- 查询区增加指派对象筛选。
- 表格增加指派对象列。
- 导出增加指派对象列。

SQL 来源：

- `YL_加工中心_操作记录表.工位名称`
- 或关联任务表取 `MES_接口_生产计划_生产任务.指派对象`

推荐使用任务表指派对象，工位名称作为实际操作工位，两者都可展示：

| 字段 | 说明 |
|---|---|
| 指派对象 | 任务被派给谁 |
| 实际工位 | 操作记录发生在哪个工位 |

### 16.2 机加领料备注

需求：

- 生产领料（机加）增加备注字段。

需要先定位现有领料表。如果无独立表，可能通过 SAP 或操作记录保存。

建议：

```sql
ALTER TABLE dbo.MES_接口_生产计划_生产任务 ADD 机加领料备注 nvarchar(500) NULL;
```

如领料已有专表，应加在领料单表。

过程：

- `生产管理_机加领料_备注保存`
- `生产管理_机加领料_查询` 返回备注

### 16.3 机加退库备注、装配退库备注

建议如果退库已有业务表，在退库表增加：

```sql
备注 nvarchar(500) NULL,
最后维护人 nvarchar(50) NULL,
最后维护时间 datetime NULL
```

如果没有退库表，先不要加到任务表，建议建退库单扩展表：

```sql
CREATE TABLE dbo.生产管理_退库单_扩展 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    退库单号 nvarchar(100) NOT NULL,
    退库类型 nvarchar(20) NOT NULL, -- 机加/装配
    生产订单 int NULL,
    TaskAID bigint NULL,
    备注 nvarchar(500) NULL,
    最后维护人 nvarchar(50) NULL,
    最后维护时间 datetime NULL
);
```

### 16.4 外协任务报表采购到货期说明

现有页面：

```text
src/views/ProductionManagement/OutsourceSheet/index.vue
src/views/ProductionManagement/OutsourceMange/index.vue
```

建议字段：

```sql
ALTER TABLE dbo.MES_接口_生产计划_生产任务 ADD 采购到货期说明 nvarchar(500) NULL;
```

如果采购到货期说明来自 SAP，则不允许手工覆盖，改为扩展表：

```sql
CREATE TABLE dbo.生产管理_外协任务_采购扩展 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    TaskAID bigint NOT NULL,
    采购到货期说明 nvarchar(500) NULL,
    SAP采购订单号 nvarchar(100) NULL,
    SAP采购收货单号 nvarchar(100) NULL,
    供应商编码 nvarchar(100) NULL,
    供应商名称 nvarchar(200) NULL,
    最后维护人 nvarchar(50) NULL,
    最后维护时间 datetime NULL
);
```

### 16.5 制定标准工艺保存提示

页面：

```text
src/views/ProcessManagement/ProcessesDevelop/index.vue
```

改造：

- 保存成功显示“标准工艺保存成功”。
- 保存失败显示后端 message。
- 如果字段缺失，提示具体字段。

不涉及数据库。

## 17. 需求 14：生产订单关闭批量更新 SAP 状态

### 17.1 现有页面

页面：

```text
src/views/PlanManagement/PlannOrderClose/index.vue
```

### 17.2 页面改造

表格增加多选列：

```html
<el-table-column type="selection" width="55" />
```

新增按钮：

```text
[批量关闭 SAP 订单]
```

点击后：

1. 校验已选择订单。
2. 弹出二次确认：

```text
即将批量关闭 N 个 SAP 生产订单。该操作会写入 SAP，可能部分成功部分失败，是否继续？
```

3. 调用批量关闭逻辑。
4. 展示结果弹窗。

结果弹窗字段：

- 生产订单
- SAP 单据号
- 执行结果
- 失败原因
- 是否可重试

### 17.3 后端建议

由于当前前端很多 SAP 操作是直接调用 SAP/B1 接口或通过现有工具实现，批量关闭建议封装为前端逐单执行 + MES 记录结果，或后端新增 API。若 `.ashx` 仅支持 SQL，不适合在 SQL 里直接调 SAP。

建议流程：

```text
前端选中订单
  -> 查询订单 SAP DocEntry
  -> 逐单 PATCH SAP ProductionOrders
  -> 每单结果写入 系统集成_SAP调用日志
  -> 更新 MES 订单状态或 SAP关闭状态扩展字段
```

### 17.4 建议新增字段

表：`MES_接口_生产计划`

```sql
ALTER TABLE dbo.MES_接口_生产计划 ADD
    SAP关闭状态 nvarchar(20) NULL,
    SAP关闭时间 datetime NULL,
    SAP关闭失败原因 nvarchar(1000) NULL,
    SAP关闭操作人 nvarchar(50) NULL;
```

如果不想改主表，新增扩展表：

```sql
CREATE TABLE dbo.生产管理_订单关闭_SAP状态 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    订单编号 int NOT NULL,
    SAP单据号 nvarchar(100) NULL,
    关闭状态 nvarchar(20) NOT NULL,
    失败原因 nvarchar(1000) NULL,
    操作人 nvarchar(50) NULL,
    操作时间 datetime NOT NULL DEFAULT GETDATE(),
    是否可重试 bit NOT NULL DEFAULT 0
);
```

### 17.5 存储过程

| 过程 | 用途 |
|---|---|
| `生产管理_订单关闭_SAP结果保存` | 保存每单关闭结果 |
| `生产管理_订单关闭_SAP结果查询` | 查询批量关闭结果 |
| `生产管理_订单关闭_可关闭校验` | 批量操作前校验订单是否可关 |

## 18. 需求 15：及时检验报表

### 18.1 页面定位

新增页面：

```text
src/views/QualityManagement/TimelyInspectionReport/index.vue
```

菜单：

```text
质量管理 -> 质量报表 -> 及时检验报表
```

### 18.2 查询口径

进入报表条件：

1. `YL_加工中心_操作记录表` 中存在报工记录。
2. `操作类别 = '报工'`。
3. `操作数值 > 0`。
4. `结束时间 < DATEADD(DAY, -2, GETDATE())`。
5. 对应质检记录不存在，或检验数量不足。

### 18.3 页面字段

| 字段 |
|---|
| 生产订单 |
| TaskAID |
| 物料编码 |
| 物料名称 |
| 工序名称 |
| 指派对象 |
| 报工数量 |
| 已检数量 |
| 未检数量 |
| 报工结束时间 |
| 超期天数 |
| 操作人 |

### 18.4 存储过程

过程名：`质量管理_及时检验报表_查询`

参数：

- 生产订单
- 物料
- 工序
- 指派对象
- 报工结束开始
- 报工结束结束
- 超期天数，默认 2

SQL 示例：

```sql
CREATE PROCEDURE dbo.质量管理_及时检验报表_查询
    @生产订单 int = NULL,
    @物料 nvarchar(100) = '',
    @工序 nvarchar(100) = '',
    @指派对象 nvarchar(100) = '',
    @报工结束开始 date = NULL,
    @报工结束结束 date = NULL,
    @超期天数 int = 2
AS
BEGIN
    SET NOCOUNT ON;

    WITH rpt AS (
        SELECT
            o.TaskAID,
            SUM(ISNULL(o.操作数值,0)) AS 报工数量,
            MAX(o.结束时间) AS 报工结束时间,
            MAX(o.操作人) AS 操作人
        FROM dbo.YL_加工中心_操作记录表 o
        WHERE o.操作类别 = N'报工'
          AND ISNULL(o.操作数值,0) > 0
          AND o.结束时间 < DATEADD(DAY, -@超期天数, GETDATE())
        GROUP BY o.TaskAID
    ),
    qc AS (
        SELECT
            TaskAID,
            SUM(ISNULL(检验数量,0)) AS 已检数量
        FROM dbo.YL_质量检验_质检记录
        GROUP BY TaskAID
    )
    SELECT
        t.订单编号 AS 生产订单,
        t.AID AS TaskAID,
        t.物料编码,
        t.物料名称,
        t.工序名称,
        t.指派对象,
        rpt.报工数量,
        ISNULL(qc.已检数量,0) AS 已检数量,
        rpt.报工数量 - ISNULL(qc.已检数量,0) AS 未检数量,
        rpt.报工结束时间,
        DATEDIFF(DAY, rpt.报工结束时间, GETDATE()) AS 超期天数,
        rpt.操作人
    FROM rpt
    JOIN dbo.MES_接口_生产计划_生产任务 t ON rpt.TaskAID = t.AID
    LEFT JOIN qc ON rpt.TaskAID = qc.TaskAID
    WHERE rpt.报工数量 > ISNULL(qc.已检数量,0)
      AND (@生产订单 IS NULL OR t.订单编号 = @生产订单)
      AND (@物料 = '' OR t.物料编码 LIKE '%' + @物料 + '%' OR t.物料名称 LIKE '%' + @物料 + '%')
      AND (@工序 = '' OR t.工序名称 = @工序)
      AND (@指派对象 = '' OR t.指派对象 = @指派对象)
      AND (@报工结束开始 IS NULL OR rpt.报工结束时间 >= @报工结束开始)
      AND (@报工结束结束 IS NULL OR rpt.报工结束时间 < DATEADD(DAY, 1, @报工结束结束))
    ORDER BY 超期天数 DESC, rpt.报工结束时间;
END
```

### 18.5 不新增表

第一阶段不新增表。若要催办闭环，再新增催办记录表。

## 19. 需求 16：工序流转卡增加原料编码

### 19.1 需要查新分析

先定位工序流转卡打印页面和模板：

- 搜索页面中 `流转卡`、`print`、`打印`。
- 确认当前流转卡数据来源过程。
- 确认原料编码来自 BOM、SAP 工艺路线，还是物料字段。

### 19.2 数据来源建议

优先顺序：

1. `BOM数据` 中父件对应子件，取原料类子件编码。
2. SAP BOM/物料清单同步表。
3. 生产任务行文本备注或行物料字段。

### 19.3 存储过程

扩展流转卡查询过程，增加字段：

| 字段 | 说明 |
|---|---|
| 原料编码 | BOM 子件编码 |
| 原料名称 | BOM 子件名称，可选 |
| 原料规格 | 可选 |

SQL 示例：

```sql
LEFT JOIN dbo.BOM数据 bom
  ON bom.父件编码 = t.物料编码
```

### 19.4 页面/打印

打印模板增加：

```text
原料编码：XXXXXXXX
```

如果一个成品对应多个原料编码：

- 用逗号合并。
- 或打印明细区。

## 20. 需求 17-19：现场大屏

包括：

- 一楼质检大屏幕
- 机加现场大屏幕
- 装配现场大屏幕

看板项目目录：

| 大屏 | 项目目录 |
|---|---|
| 质检任务看板 | `质检任务看板` |
| 机加现场大屏 | `机加设备生产运营看板`、`机加设备生产运营看板二` |
| 装配现场大屏 | `装配任务看板` |

### 20.1 通用大屏开发原则

1. 大屏只展示，不作为字段维护入口。
2. 关键工序、缺勤、送检状态必须先有业务数据来源。
3. 所有大屏过程必须支持 `@统计日期`，默认当天。
4. 大屏刷新频率建议 30 秒以上，除设备状态外不建议 5 秒刷新复杂 SQL。
5. 指标必须能下钻明细。

### 20.2 一楼质检大屏

#### 20.2.1 新增指标

| 指标 | 口径 |
|---|---|
| 质检及时率 | 及时检验任务数 / 应检任务数 |
| 超 2 天未检任务 | 最后生产完成时间超过 2 天且未检足 |
| 关键工序应检数 | 任务快照中 `是否关键工序=1` |
| 关键工序未检数 | 应检但未检足 |
| 关键工序已检数 | 已检足 |

#### 20.2.2 需要新增字段

关键工序不要放在看板维护，应加在工艺和任务快照。

建议字段：

```sql
ALTER TABLE dbo.车间生产管理工艺_零件工序_工艺库 ADD 是否关键工序 bit NULL DEFAULT 0;
ALTER TABLE dbo.车间生产管理工艺_零件生产工艺_工艺库 ADD 是否关键工序 bit NULL DEFAULT 0;
ALTER TABLE dbo.MES_接口_生产计划_生产任务 ADD 是否关键工序 bit NULL DEFAULT 0;
```

任务下发时把生产工艺中的 `是否关键工序` 快照到任务表。

#### 20.2.3 存储过程

扩展或新增：

| 过程 | 用途 |
|---|---|
| `质量任务看板_未完成统计` | 增加超期天数、关键工序统计 |
| `质量任务看板_未完成明细查询` | 增加最后生产完成时间、是否关键工序 |
| `质量任务看板_及时率统计` | 新增及时率 |

### 20.3 机加现场大屏

#### 20.3.1 新增指标

| 指标 | 口径 |
|---|---|
| 缺勤人员 | 应到人员 - 实到人员 |
| 关键工序任务汇总 | 已排产未完成且是否关键工序=1 |
| 关键工序任务明细 | 订单、物料、工序、设备、指派对象、计划开始、完成数 |

#### 20.3.2 缺勤数据

不能从“没有报工”反推缺勤。

需要数据：

| 数据 | 来源 |
|---|---|
| 应到人员 | 班次人员绑定表、排班表、岗位工位绑定 |
| 实到人员 | 考勤、上岗绑定、登录、报工记录 |

建议新增排班表：

```sql
CREATE TABLE dbo.人员排班表 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    排班日期 date NOT NULL,
    班次编号 int NULL,
    班次名称 nvarchar(50) NULL,
    人员编号 int NOT NULL,
    人员姓名 nvarchar(50) NOT NULL,
    岗位 nvarchar(50) NULL,
    工位号 nvarchar(50) NULL,
    是否应到 bit NOT NULL DEFAULT 1,
    创建人 nvarchar(50) NULL,
    创建时间 datetime NOT NULL DEFAULT GETDATE()
);

CREATE INDEX IX_人员排班表_日期班次 ON dbo.人员排班表(排班日期, 班次名称);
```

如果已有 `班次人员绑定表` 能满足，则不新建，只扩展字段。

#### 20.3.3 存储过程

| 过程 | 用途 |
|---|---|
| `机加现场大屏_缺勤人员查询` | 返回岗位、工位、姓名 |
| `机加现场大屏_关键工序统计` | 汇总关键工序任务 |
| `机加现场大屏_关键工序明细` | 明细下钻 |

### 20.4 装配现场大屏

#### 20.4.1 新增指标

| 指标 | 口径 |
|---|---|
| 缺勤人员 | 同机加 |
| 及时送检任务 | 发料齐套后超过 2 天未送检 |
| 排序 | 加急优先，其次及时送检超期，再按计划开始或齐套时间 |

#### 20.4.2 存储过程

| 过程 | 用途 |
|---|---|
| `装配现场大屏_缺勤人员查询` | 岗位、工位、姓名 |
| `装配现场大屏_及时送检任务查询` | 发料齐套后 2 天未送检 |
| `装配中心任务看板_装配任务查询` | 增加发料齐套时间、是否已送检、送检时间、超期天数 |

#### 20.4.3 字段来源

| 字段 | 来源 |
|---|---|
| 发料齐套时间 | `MES_接口_生产计划.齐套时间` 或装配扩展表 |
| 是否已送检 | 送检记录/质检任务/质检记录 |
| 送检时间 | 送检记录 |
| 超期天数 | `DATEDIFF(DAY, 发料齐套时间, GETDATE())` |

## 21. 需求 20：编程任务清单 / 编程报工

### 21.1 页面定位

新增页面：

```text
src/views/ProductionManagement/ProgrammingTask/index.vue
```

菜单：

```text
生产管理 -> 报工管理 -> 编程任务清单
```

### 21.2 页面布局

```text
查询区：
设备 工位 程序员 状态 生产订单 物料 日期
[查询] [重置] [新增编程任务] [导出]

表格：
任务编号 生产订单 物料编码 物料名称 工序 设备/工位 程序号
编程人员 状态 开始时间 结束时间 工时 操作

操作：
[开始编程] [结束编程] [编辑程序号] [工时记录] [报异常]
```

### 21.3 新增表

#### 21.3.1 编程任务表

```sql
CREATE TABLE dbo.生产管理_编程任务 (
    编程任务ID bigint IDENTITY(1,1) PRIMARY KEY,
    编程任务编号 nvarchar(50) NOT NULL,
    生产订单 int NULL,
    TaskAID bigint NULL,
    物料编码 nvarchar(100) NULL,
    物料名称 nvarchar(500) NULL,
    工序名称 nvarchar(100) NULL,
    设备编号 nvarchar(50) NULL,
    设备名称 nvarchar(100) NULL,
    工位编号 nvarchar(50) NULL,
    工位名称 nvarchar(100) NULL,
    程序号 nvarchar(100) NULL,
    任务来源 nvarchar(50) NULL, -- 人工创建/订单生成/设备任务派生
    状态 nvarchar(20) NOT NULL DEFAULT N'未开始',
    任务说明 nvarchar(1000) NULL,
    创建人 nvarchar(50) NULL,
    创建时间 datetime NOT NULL DEFAULT GETDATE(),
    最后维护人 nvarchar(50) NULL,
    最后维护时间 datetime NULL
);
```

#### 21.3.2 编程工时记录表

```sql
CREATE TABLE dbo.生产管理_编程任务_工时记录 (
    记录ID bigint IDENTITY(1,1) PRIMARY KEY,
    编程任务ID bigint NOT NULL,
    操作类别 nvarchar(20) NOT NULL, -- 开始/结束
    操作人编号 int NULL,
    操作人 nvarchar(50) NOT NULL,
    开始时间 datetime NULL,
    结束时间 datetime NULL,
    工时分钟 int NULL,
    工作内容 nvarchar(1000) NULL,
    结束说明 nvarchar(1000) NULL,
    创建时间 datetime NOT NULL DEFAULT GETDATE()
);

CREATE INDEX IX_生产管理_编程任务_工时记录_任务
ON dbo.生产管理_编程任务_工时记录(编程任务ID);
```

### 21.4 存储过程

| 过程 | 用途 |
|---|---|
| `生产管理_编程任务_查询` | 列表查询 |
| `生产管理_编程任务_新增` | 新增任务 |
| `生产管理_编程任务_开始` | 开始编程 |
| `生产管理_编程任务_结束` | 结束编程并计算工时 |
| `生产管理_编程任务_工时明细` | 工时明细 |
| `生产管理_编程任务_程序号保存` | 维护程序号 |

### 21.5 工时接入

`View_统一工时明细` 增加：

```text
来源模块 = 编程
工时类型 = 编程
```

这样后续合同工时、工时报表可选择是否包含编程工时。

## 22. 需求 21-24：设备档案、设备数据采集、OEE、工时查询联动

### 22.1 设备档案管理

现有页面：

```text
src/views/DeviceManagement/DeviceInformation/index.vue
```

现有表：

```text
YL_设备管理_设备台账
MES_资源主数据
```

建议新增字段：

```sql
ALTER TABLE dbo.YL_设备管理_设备台账 ADD
    是否主要设备 bit NULL DEFAULT 0,
    是否参与OEE bit NULL DEFAULT 0,
    设备标准工时 decimal(18,2) NULL,
    标准工时单位 nvarchar(20) NULL,
    采集设备编码 nvarchar(100) NULL,
    采集点位配置 nvarchar(max) NULL;
```

注意：

- 设备标准工时不能替代工艺标准工时。
- OEE 的标准单件工时优先来自工艺或设备+工序能力表。

建议新增设备工序能力表：

```sql
CREATE TABLE dbo.设备管理_设备工序能力 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    设备编号 nvarchar(50) NOT NULL,
    设备名称 nvarchar(100) NULL,
    工序名称 nvarchar(100) NOT NULL,
    物料编码 nvarchar(100) NULL,
    标准单件工时 decimal(18,4) NULL,
    单位 nvarchar(20) NULL DEFAULT N'分钟',
    是否启用 bit NOT NULL DEFAULT 1,
    创建人 nvarchar(50) NULL,
    创建时间 datetime NOT NULL DEFAULT GETDATE(),
    最后维护人 nvarchar(50) NULL,
    最后维护时间 datetime NULL
);
```

### 22.2 设备数据采集

现有表：

- `CaChe_Var`
- `历史_设备数据_定时`
- `历史_工位设备状态每分钟记录`
- `YL_设备管理_工时记录`

新增建议：

#### 22.2.1 采集原始数据表

如果现有 `历史_设备数据_定时` 字段足够，可不新建。否则新增：

```sql
CREATE TABLE dbo.设备采集_原始数据 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    采集时间 datetime NOT NULL,
    设备编号 nvarchar(50) NULL,
    设备名称 nvarchar(100) NULL,
    工位号 nvarchar(50) NULL,
    变量名称 nvarchar(100) NULL,
    变量值 nvarchar(200) NULL,
    原始值 nvarchar(200) NULL,
    单位 nvarchar(20) NULL,
    TagID nvarchar(100) NULL,
    DeviceCode nvarchar(100) NULL,
    在线状态 nvarchar(20) NULL,
    采集质量 nvarchar(20) NULL,
    创建时间 datetime NOT NULL DEFAULT GETDATE()
);
```

#### 22.2.2 设备状态汇总表

```sql
CREATE TABLE dbo.设备采集_设备状态分钟汇总 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    统计时间 datetime NOT NULL,
    统计日期 date NOT NULL,
    班次名称 nvarchar(50) NULL,
    设备编号 nvarchar(50) NULL,
    设备名称 nvarchar(100) NULL,
    工位号 nvarchar(50) NULL,
    状态代码 int NULL,
    状态名称 nvarchar(50) NULL,
    持续秒数 int NOT NULL DEFAULT 60,
    是否有效加工 bit NULL,
    创建时间 datetime NOT NULL DEFAULT GETDATE()
);
```

#### 22.2.3 设备任务绑定表

设备采集必须绑定 MES 任务，否则无法算任务级程序工时。

```sql
CREATE TABLE dbo.设备采集_任务绑定 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    设备编号 nvarchar(50) NOT NULL,
    设备名称 nvarchar(100) NULL,
    工位号 nvarchar(50) NULL,
    TaskAID bigint NOT NULL,
    生产订单 int NOT NULL,
    程序号 nvarchar(100) NULL,
    绑定开始时间 datetime NOT NULL,
    绑定结束时间 datetime NULL,
    绑定来源 nvarchar(50) NULL, -- 人工/条码/程序号/时间推断
    绑定人 nvarchar(50) NULL,
    创建时间 datetime NOT NULL DEFAULT GETDATE()
);
```

### 22.3 OEE 指标

建议新增指标明细表：

```sql
CREATE TABLE dbo.设备指标_班次明细 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    统计日期 date NOT NULL,
    班次名称 nvarchar(50) NULL,
    设备编号 nvarchar(50) NOT NULL,
    设备名称 nvarchar(100) NULL,
    工位号 nvarchar(50) NULL,
    TaskAID bigint NULL,
    生产订单 int NULL,
    物料编码 nvarchar(100) NULL,
    物料名称 nvarchar(500) NULL,
    工序名称 nvarchar(100) NULL,
    计划产量 decimal(18,2) NULL,
    实际产量 decimal(18,2) NULL,
    良品数 decimal(18,2) NULL,
    不良品数 decimal(18,2) NULL,
    标准单件工时 decimal(18,4) NULL,
    实际单件工时 decimal(18,4) NULL,
    设备运行工时分钟 decimal(18,2) NULL,
    标准可用工时分钟 decimal(18,2) NULL,
    产能利用率 decimal(18,4) NULL,
    设备利用率 decimal(18,4) NULL,
    性能开动率 decimal(18,4) NULL,
    产品合格率 decimal(18,4) NULL,
    OEE decimal(18,4) NULL,
    计算时间 datetime NOT NULL DEFAULT GETDATE(),
    计算说明 nvarchar(1000) NULL
);
```

计算过程：

| 过程 | 用途 |
|---|---|
| `设备指标_班次明细_生成` | 按日期班次生成指标 |
| `设备指标_OEE_查询` | 页面/看板查询 |
| `设备指标_OEE_明细` | 下钻查看三项组成 |

### 22.4 工时查询联动

现有页面：

```text
src/views/ProductionManagement/Workhours/index.vue
src/views/ProductionManagement/Timesheet/index.vue
src/views/ProductionManagement/WorkHoursCheck/index.vue
```

新增字段：

- 程序工时
- 设备运行工时
- 实际单件工时
- 标准单件工时
- 设备采集状态
- 采集质量

建议过程：

```text
工时查询_设备采集工时_查询
```

按 TaskAID、设备、时间段关联 `设备采集_任务绑定` 和设备状态汇总。

## 23. 需求 25：手续确认报表

### 23.1 页面定位

新增页面：

```text
src/views/ProductionManagement/FormalityConfirmReport/index.vue
```

菜单：

```text
报表中心 -> 装配报表 -> 手续确认报表
```

### 23.2 页面布局

```text
查询区：
生产订单 合同号 物料 指派对象 发料齐套日期 手续确认状态
[查询] [重置] [导出] [批量确认完成]

表格：
选择 生产订单 合同号 物料编码 物料名称 指派对象 发料齐套时间
装配完成时间 当前状态 手续确认 确认人 确认时间 操作

操作：
[确认完成] [查看装配明细] [查看异常]
```

### 23.3 新增表

表名：`生产管理_手续确认`

```sql
CREATE TABLE dbo.生产管理_手续确认 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    订单编号 int NOT NULL,
    确认状态 nvarchar(20) NOT NULL DEFAULT N'未完成',
    确认人 nvarchar(50) NULL,
    确认时间 datetime NULL,
    确认备注 nvarchar(500) NULL,
    创建时间 datetime NOT NULL DEFAULT GETDATE(),
    最后维护人 nvarchar(50) NULL,
    最后维护时间 datetime NULL
);

CREATE UNIQUE INDEX UX_生产管理_手续确认_订单编号
ON dbo.生产管理_手续确认(订单编号);
```

### 23.4 消失条件

报表只显示待确认数据：

```sql
WHERE ISNULL(fc.确认状态, N'未完成') <> N'已完成'
  AND ISNULL(p.订单状态, '') NOT IN (N'取消', N'关闭')
  AND ISNULL(p.单据状态, '') NOT IN (N'取消', N'关闭')
  AND ISNULL(p.入库数量, 0) < ISNULL(p.计划数量, 0)
```

### 23.5 存储过程

| 过程 | 用途 |
|---|---|
| `生产管理_手续确认报表_查询` | 待确认列表 |
| `生产管理_手续确认报表_确认完成` | 单条确认 |
| `生产管理_手续确认报表_批量确认完成` | 批量确认 |

确认过程同时写 `系统管理_业务字段维护日志`。

## 24. 需求 26：产品合格率（工位）

### 24.1 页面定位

新增或扩展质量报表页面：

```text
src/views/QualityManagement/StationPassRate/index.vue
```

### 24.2 口径

公式：

```text
产品合格率 = 良品数 / 总产量
```

需要先确认：

- 总产量取报工完成数量还是质检检验数量。
- 良品数取质检合格数还是报工合格数。
- 统计维度按工位、设备、指派对象还是实际操作工位。

建议第一版：

- 总产量：质检记录 `检验数量`
- 良品数：质检记录 `合格数`
- 工位：关联任务表 `指派对象`，同时展示质检记录来源工位。

### 24.3 存储过程

过程名：`质量管理_产品合格率_工位查询`

参数：

- 开始日期
- 结束日期
- 工位
- 工序
- 物料

返回：

- 工位
- 检验数量
- 合格数量
- 不合格数量
- 合格率
- 明细数

### 24.4 不新增表

第一阶段不新增表。如果要日快照，写入 `质量管理_工位合格率_日快照`。

## 25. 需求 27：让步接收记录

### 25.1 页面定位

新增页面：

```text
src/views/QualityManagement/ConcessionRecord/index.vue
```

菜单：

```text
质量管理 -> 质量报表 -> 让步接收记录
```

### 25.2 数据来源

现有字段：

- `MES_接口_生产计划_生产任务.让步放行数量`
- `YL_质量检验_不合格品处理.申请让步放行`
- `YL_质量检验_不合格品处理_处理节点.让步放行数量`

需求说“新增让步记录查询页面”，建议从不合格品处理和质检记录综合查询。

### 25.3 存储过程

过程名：`质量管理_让步接收记录_查询`

参数：

- 生产订单
- 物料
- 检验人
- 检验开始
- 检验结束
- 让步状态

返回：

- 生产订单
- TaskAID
- 物料编码
- 物料名称
- 工序名称
- 检验数量
- 不合格数量
- 让步放行数量
- 申请让步放行
- 检验人
- 检验时间
- 处理意见

### 25.4 不新增表

页面只查询，不维护。

## 26. 需求 28：设计任务报工模块 / 报工-技术-MES

### 26.1 页面定位

新增页面：

```text
src/views/ProductionManagement/DesignTaskWork/index.vue
```

菜单：

```text
生产管理 -> 报工管理 -> 设计任务报工
```

### 26.2 页面布局

```text
查询区：
任务名称 设计人员 状态 日期
[查询] [重置] [新增设计任务] [导出]

表格：
任务编号 任务名称 设计人员 状态 计划开始 计划完成
开始时间 结束时间 工时 工作内容 结束说明 创建人 操作

操作：
[开始报工] [结束报工] [工时记录] [编辑] [取消]
```

### 26.3 新增表

#### 26.3.1 设计任务表

```sql
CREATE TABLE dbo.生产管理_设计任务 (
    设计任务ID bigint IDENTITY(1,1) PRIMARY KEY,
    设计任务编号 nvarchar(50) NOT NULL,
    任务名称 nvarchar(200) NOT NULL,
    设计人员编号 int NULL,
    设计人员 nvarchar(50) NULL,
    状态 nvarchar(20) NOT NULL DEFAULT N'未开始',
    计划开始时间 datetime NULL,
    计划完成时间 datetime NULL,
    任务说明 nvarchar(1000) NULL,
    创建人 nvarchar(50) NULL,
    创建时间 datetime NOT NULL DEFAULT GETDATE(),
    最后维护人 nvarchar(50) NULL,
    最后维护时间 datetime NULL
);
```

#### 26.3.2 设计工时记录表

```sql
CREATE TABLE dbo.生产管理_设计任务_工时记录 (
    记录ID bigint IDENTITY(1,1) PRIMARY KEY,
    设计任务ID bigint NOT NULL,
    操作人编号 int NULL,
    操作人 nvarchar(50) NOT NULL,
    开始时间 datetime NOT NULL,
    结束时间 datetime NULL,
    工时分钟 int NULL,
    工作内容 nvarchar(1000) NULL,
    结束说明 nvarchar(1000) NULL,
    创建时间 datetime NOT NULL DEFAULT GETDATE()
);
```

### 26.4 存储过程

| 过程 | 用途 |
|---|---|
| `生产管理_设计任务_查询` | 任务列表 |
| `生产管理_设计任务_新增` | 新建任务 |
| `生产管理_设计任务_编辑` | 编辑任务 |
| `生产管理_设计任务_取消` | 取消 |
| `生产管理_设计任务_开始` | 开始报工 |
| `生产管理_设计任务_结束` | 结束报工 |
| `生产管理_设计任务_工时明细` | 工时明细 |

### 26.5 工时接入

`View_统一工时明细` 增加：

```text
来源模块 = 设计
工时类型 = 设计
```

注意：

- 设计任务当前不上传 SAP。
- 设计任务不产生质量、装配、机加工时。
- 后续装配已排产需求的合同工时汇总可选择纳入设计工时。

## 27. 需求 29：工时异常报表

### 27.1 页面定位

新增页面：

```text
src/views/ProductionManagement/WorkTimeAbnormalReport/index.vue
```

### 27.2 异常口径

```text
实际单件工时 > 标准单件工时
```

字段来源：

| 字段 | 来源 |
|---|---|
| 实际单件工时 | 设备采集，或人工报工工时 / 完成数量 |
| 标准单件工时 | 生产工艺或设备工序能力表 |
| 设备/工位 | 任务指派对象、设备绑定 |
| 程序号 | 编程任务或设备采集 |

### 27.3 建议新增表

如需要异常确认闭环：

```sql
CREATE TABLE dbo.生产管理_工时异常确认 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    统计日期 date NULL,
    TaskAID bigint NULL,
    生产订单 int NULL,
    设备编号 nvarchar(50) NULL,
    设备名称 nvarchar(100) NULL,
    标准单件工时 decimal(18,4) NULL,
    实际单件工时 decimal(18,4) NULL,
    超出时长 decimal(18,4) NULL,
    超出比例 decimal(18,4) NULL,
    异常原因 nvarchar(500) NULL,
    责任部门 nvarchar(100) NULL,
    处理说明 nvarchar(1000) NULL,
    确认状态 nvarchar(20) NOT NULL DEFAULT N'未确认',
    确认人 nvarchar(50) NULL,
    确认时间 datetime NULL
);
```

### 27.4 存储过程

| 过程 | 用途 |
|---|---|
| `生产管理_工时异常报表_查询` | 查询异常 |
| `生产管理_工时异常报表_明细` | 查看来源明细 |
| `生产管理_工时异常报表_确认` | 异常确认 |

### 27.5 页面字段

- 设备/工位
- 生产订单
- 物料编码
- 物料名称
- 工序名称
- 指派对象
- 操作人
- 程序号
- 标准单件工时
- 实际单件工时
- 超出时长
- 超出比例
- 开始时间
- 结束时间
- 班次
- 异常原因
- 确认状态

## 28. 需求 30：正在加工状态

### 28.1 目标

“正在加工状态：机加正在进行中”。

### 28.2 数据来源

优先复用：

- `MES_ProductCenter_DoingTask`
- `v_CurrentProductionStatus`
- `YL_加工中心_操作记录表` 中开始未结束记录

### 28.3 页面/看板展示

可以在以下页面增加状态：

- 加工中心任务列表
- 生产计划跟踪
- 机加现场大屏

展示规则：

| 条件 | 状态 |
|---|---|
| 有开始记录且未报工结束 | 正在加工 |
| 任务状态已完成 | 已完成 |
| 有暂停记录未恢复 | 暂停中 |
| 无开始记录 | 未开工 |

### 28.4 存储过程

过程名：`生产管理_正在加工状态_查询`

返回：

- TaskAID
- 生产订单
- 工序名称
- 指派对象
- 操作人
- 开始时间
- 当前持续分钟
- 状态

## 29. 暂不排期项的技术前置

### 29.1 及时拣配（机加/装配）

必须先确认：

1. 条码代表物料、箱号、批次、生产订单还是拣配单。
2. SAP 库存和 MES 拣配状态谁是主口径。
3. 扫码后是否写回 `拣配状态`、`齐套`、`发料状态`。
4. 机加和装配是否共用拣配表。

建议表：

```sql
CREATE TABLE dbo.生产管理_条码拣配记录 (
    AID bigint IDENTITY(1,1) PRIMARY KEY,
    拣配类型 nvarchar(20) NOT NULL, -- 机加/装配
    条码 nvarchar(200) NOT NULL,
    生产订单 int NULL,
    TaskAID bigint NULL,
    物料编码 nvarchar(100) NULL,
    物料名称 nvarchar(500) NULL,
    批次号 nvarchar(100) NULL,
    数量 decimal(18,2) NULL,
    拣配状态 nvarchar(20) NULL,
    SAP校验状态 nvarchar(20) NULL,
    异常说明 nvarchar(500) NULL,
    拣配人 nvarchar(50) NULL,
    拣配时间 datetime NOT NULL DEFAULT GETDATE()
);
```

### 29.2 标牌打印操作

需求未定，不建表不开发。需确认：

- 打印对象：物料、订单、设备、工位、产品？
- 条码内容。
- 模板样式。
- 是否需要打印记录。

### 29.3 首检、巡检

现有质检中心已有首检、巡检相关逻辑。空需求暂不开发。若后续提出，应先确认是新增报表、页面优化还是流程改造。

## 30. 菜单和权限

所有新增页面都需要写入 `登录基础数据_二级菜单`，并按角色分配。

建议新增菜单：

| 页面 | 菜单 |
|---|---|
| 装配已排产需求 | 生产管理/装配管理 |
| 生产日报-送检 | 报表中心/生产日报 |
| 及时齐套跟踪结果报表 | 报表中心/齐套报表 |
| 机加班次产量表 | 报表中心/生产报表 |
| 发货通知列表 | 报表中心/交付报表 |
| 质检任务早知道 | 质量管理/质量报表 |
| 及时检验报表 | 质量管理/质量报表 |
| 手续确认报表 | 报表中心/装配报表 |
| 让步接收记录 | 质量管理/质量报表 |
| 设计任务报工 | 生产管理/报工管理 |
| 编程任务清单 | 生产管理/报工管理 |
| 工时异常报表 | 报表中心/工时报表 |

菜单字段要参考现有 `登录基础数据_二级菜单`：

- `path`
- `componet`
- `name`
- `title`
- `icon`
- `账号代码`

## 31. 开发实施顺序

### 31.1 第一阶段：高优先级低风险

1. 及时开工报表正选/反选。
2. 机加已排产日期筛选。
3. 机加已排产历史工时弹窗。
4. 生产工艺自动带出标准工艺。
5. 工时报表指派对象。
6. 小字段：备注、提示、流转卡原料编码。

交付标准：

- 页面可查询。
- 数据字段正确。
- 导出同步。
- 不影响现有流程。

### 31.2 第二阶段：装配已排产专项

1. 建装配扩展表。
2. 做主查询页面。
3. 加系统/非系统筛选。
4. 接派工时间、合同交货期、发料齐套时间。
5. 做装配完成时间和人工维护。
6. 做当前人员、当前内容、历史说明。
7. 接工时汇总和明细。
8. 接异常明细。
9. 做日计划导出打印。
10. 派生质检任务早知道。

交付标准：

- 主表字段完整。
- 人工维护有日志。
- 工时可钻取。
- 日计划可导出/打印。

### 31.3 第三阶段：质量和齐套报表

1. 及时检验报表。
2. 生产日报-送检。
3. 及时齐套跟踪结果报表。
4. 让步接收记录。
5. 外协任务检验字段补充。
6. 产品合格率。

交付标准：

- 每个报表有明确口径。
- 可导出。
- 可钻明细。
- SAP 来源显示同步时间。

### 31.4 第四阶段：流程增强

1. 异常管控统一入口。
2. 生产订单批量关闭 SAP。
3. 手续确认报表。
4. 编程任务报工。
5. 设计任务报工。

交付标准：

- 写操作有确认。
- 批量结果逐条返回。
- 异常审批人多选可见，一人处理。
- 工时进入统一工时视图。

### 31.5 第五阶段：设备采集和大屏

1. 设备档案字段。
2. 设备采集原始数据和任务绑定。
3. OEE 指标明细。
4. 工时异常报表。
5. 质检、机加、装配现场大屏。

交付标准：

- 设备采集有原始数据和汇总数据。
- OEE 可下钻。
- 大屏指标无占位数据。
- 缺勤有排班/实到来源。

## 32. 测试清单

### 32.1 页面测试

每个页面至少测试：

- 查询为空。
- 单条件查询。
- 多条件组合查询。
- 日期边界。
- 分页。
- 导出。
- 弹窗打开关闭。
- 保存成功。
- 保存失败。
- 无权限访问。

### 32.2 数据测试

重点验证：

- 工时汇总和明细一致。
- 日期筛选包含当天 00:00:00 到 23:59:59。
- 已关闭/已入库/已完成任务是否正确排除。
- SAP 字段为空时页面不报错。
- 多人员当前任务合并显示正确。
- 班次跨天统计正确。

### 32.3 性能测试

重点过程：

- 装配已排产需求主查询。
- 及时齐套跟踪主表。
- 机加班次产量表。
- 及时检验报表。
- 大屏过程。

要求：

- 普通报表分页查询 3 秒内返回。
- 大屏过程 2 秒内返回。
- 导出可慢，但必须有 loading。

### 32.4 回归测试

必须回归：

- 机加排产。
- 装配排产。
- 加工中心报工。
- 装配中心报工。
- 质检收检。
- 外协收检。
- 工时统计。
- 生产计划跟踪。
- 看板刷新。

## 33. 风险和处理

| 风险 | 处理 |
|---|---|
| SAP 字段未到 | 页面字段先预留，显示空；存储过程字段从扩展表读取 |
| 发料齐套时间口径不稳 | 标记来源字段：SAP/MES/人工 |
| 设计工时依赖设计任务模块 | 装配已排产先显示装配/质量，设计为 0，模块完成后接入 |
| 设备采集不稳定 | OEE 和工时异常先用人工工时降级口径，并标记数据来源 |
| 缺勤无排班来源 | 不做缺勤正式统计，只做排班来源确认或新增排班表 |
| 动态 SQL 注入风险 | 新增过程尽量参数化 |
| 历史数据为空 | 字段允许 NULL，页面显示 `--`，不强行补假数据 |

## 34. 交付物

每个需求完成时至少交付：

1. 前端页面或页面改造。
2. SQL 增量脚本。
3. 新增/修改存储过程。
4. 菜单和权限配置说明。
5. 测试数据和测试结果。
6. 字段口径说明。
7. 如涉及 SAP，提供 SAP 调用日志或同步状态。

