Files
MES/yawei-mes/.tasks/2026-03-03_v2.0.003_报工单升级优化.md
2026-04-02 10:39:03 +08:00

551 lines
32 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.

# 报工单升级优化分析文档
**版本:** v2.0.003 **日期:** 2026-03-03 **负责人:** 周启威
---
## 一、现有 API 数据摸底
```json
{
"workOrderId": 3555, "workOrderNumber": "20260308054",
"workOrderEntryId": 3923, "workOrderName": "普罗酪蛋白酸钠",
"materialId": 28, "materialName": "普罗酪蛋白酸钠",
"batchNumber": "XS20260308009", "quantity": 189.000,
"planFinishDate": "2026-03-08",
"processName": "碘酸", "processId": 6,
"routeName": "酪蛋白酸钠工序路线",
"workshopId": 1, "workshopName": "酪蛋白酸钠车间",
"stationId": 1, "stationName": "配料工位",
"customerName": null
}
```
**重要发现:**
- `processName`/`processId` 虽在 `Report.java` 标注 `@TableField(exist=false)`,但 Mapper XML 已 JOIN 返回真实值
- `customerName` 字段已有 JOIN 逻辑;当前示例返回为 null说明在某些数据下仍可能为空。按业务约束“无销售订单就无工单”时该字段应有值若线上仍出现 null需后端在查询时补齐或明确业务允许为空
- `materialName``batchNumber``quantity` 均已返回,可在新增时直接回显
**与你本次确认的补充:**
- 工单表 `pro_workorder` 已存在字段 `process_start_time`(实体字段 `processStartTime`),本次 `plan_start_time` 以此字段作为来源,避免自创字段名
- 工序时长来源为工单工序明细 `pro_workorder_entry.duration`(实体字段 `WorkOrderEntry.duration`,单位:秒)
---
## 二、字段说明(含冗余字段处理)
### 2.1 已移除字段(见 SQL 注释)
| 字段 | 原说明 | 现阶段处理 |
|------|--------|-----------|
| `report_count` | 报工数 | 与 `report_quantity` 语义完全相同,**已从 SQL 中移除**,直接用 `report_quantity` |
| `quality_check_status` | 质检合格(合格/不合格) | 与现有 `quality_status`B=待检验/C=已通过/D=有异常)重叠,**已从 SQL 中移除** |
### 2.2 字段修改(现有字段调整)
| 字段 | 原说明 | 现阶段调整 |
|------|--------|-----------|
| `is_settle` | 是否结算工资(只读) | **改为可编辑**,前端去掉 `:disabled="true"` |
| `wages` | 结算工资(只读) | **改为可编辑**,前端去掉 `:disabled="true"` |
---
## 三、新增字段完整说明
### 3.1 新增时自动回显字段(进入页面即自动填充,用户可见)
> 区别于"保存时赋值"——这些字段在打开新增报工单表单时就已经显示出来,用户无需输入。
| 新增字段 | 数据来源 | 来源字段已在API响应中 |
|----------|---------|------------------------|
| `customer_name` / `customer_id` | 工单关联销售订单客户 | `customerName`(当前示例可能为 null`customer_id` 需要后端同步返回(或在保存时从工单关联关系写入) |
| `workpiece` | 工件/成品名称 | = `materialName` |
| `product_batch` | 产品批次 | = `batchNumber` |
| `process_name` / `process_id` | 工序 | = `processName` / `processId`(已 JOIN |
| `plan_start_time` | 计划开始时间 | = 工单 `process_start_time`(实体字段 `processStartTime` |
| `plan_end_time` | 计划完工时间 | = `process_start_time` + 工单工序明细 `duration``WorkOrderEntry.duration`,单位秒)(**注意:不是 planFinishDate** |
| `plan_count` | 计划数 | = 工单排产数量 `quantity` |
### 3.2 默认值字段(手动填写,但有明确默认值)
| 新增字段 | 默认值 | 说明 |
|----------|--------|------|
| `report_type` | `NORMAL`(正常报工) | 字典 `production_report_type`,用户可修改 |
| `actual_start_time` | = `plan_start_time` | 用户可修改为实际时间 |
| `actual_end_time` | = `plan_end_time` | 用户可修改为实际时间 |
| `performance_wages` | `0` | 手动填写 |
| `energy_consumption` | `0` | 手动填写 |
| `material_consumption` | `0` | 手动填写 |
| `other_costs` | `0` | 手动填写 |
| `value_added` | `0` | 手动填写 |
| `downtime_minutes` | `0` | 已有字段默认0 |
| `yield_rate` | 自动计算 = `qualifiedQuantity / reportQuantity × 100` | 前端实时更新 |
| `station_oee` | 自动计算(公式待完善,暂可手动编辑) | 前端计算 |
| `current_benefit` | 自动计算 = `value_added - energy_consumption - material_consumption - other_costs` | 前端计算 |
### 3.3 纯手动填写字段无默认值SQL 新增列)
| 新增字段 | 说明 |
|----------|------|
| `execution_standard` | 执行标准,手动输入,默认空 |
| `team_name` / `team_id` | 班组,字典 `production_team` 下拉选择,默认空 |
| `theoretical_cycle_time` | 理论节拍(分钟/件),用于 OEE 参考,默认空 |
| `station_exception` | 工位异常情况,文本域,默认空 |
| `rectification_suggestion` | 整改建议,文本域,默认空 |
### 3.4 已有字段——本次仅扩展 UI 支持(**不在 SQL 中重复 ADD**
> 以下字段在 `2025-11-11_02_周启威_连续制造业改进.sql` 中已添加到 `pro_report`
> 且 `Report.java` 中无 `@TableField(exist=false)` 标注(已持久化),
> **本次 SQL 不得重复添加,否则报错。仅需前端 UI 向离散制造也开放该字段。**
| 字段 | DB 现状 | 本次动作 |
|------|---------|---------|
| `shift_name`(班次) | 已存在,已持久化 | 离散制造前端新增选择控件 |
| `downtime_reason`(停机原因) | 已存在,已持久化 | 离散制造前端新增输入控件 |
| `downtime_minutes`(停机时间) | 已存在,已持久化,默认 0 | 离散制造前端新增输入控件 |
### 3.5 后端自动写入字段(不暴露到前端)
| 字段 | 写入时机 | 值 |
|------|---------|-----|
| `report_submit_time` | 保存时 | `new Date()` |
---
## 四、字段适用范围(离散 vs 连续制造)
> 原来部分字段仅限"连续制造",现统一:**离散和连续制造均需支持以下字段**。
| 字段 | 离散制造formA.vue | 连续制造form.vue |
|------|---------------------|-------------------|
| 班次 `shift_name` | ✅ 需要 | ✅ 需要 |
| 班组 `team_name` | ✅ 需要 | ✅ 需要 |
| 实际开始时间 `actual_start_time` | ✅ 需要(默认=计划开始时间) | ✅ 需要(默认=reportPeriodStart |
| 实际完工时间 `actual_end_time` | ✅ 需要(默认=计划完工时间) | ✅ 需要(默认=reportPeriodEnd |
| 停机时间 `downtime_minutes` | ✅ 需要默认0 | ✅ 需要已有默认0 |
| 停机原因 `downtime_reason` | ✅ 需要 | ✅ 需要(已有) |
---
## 五、前端计算字段说明
### 5.1 良品率(`yield_rate`
```
良品率 = qualifiedQuantity / reportQuantity × 100%
触发时机reportQuantity 或 qualifiedQuantity 任意变化时实时重算
颜色规则:>= 95% → 绿色90%-95% → 橙色;< 90% → 红色
```
### 5.2 本次效益(`current_benefit`
```
本次效益 = value_added - (energy_consumption + material_consumption + other_costs)
触发时机:相关数字字段变化时实时重算
颜色规则:正值 → 绿色;负值 → 红色0 → 灰色
```
### 5.3 工位OEE`station_oee`
```
现阶段字段可编辑用户可手动填写百分比值0-100
后续待定:当有完整数据后补充自动计算逻辑(可能需要 theoretical_cycle_time
```
---
## 六、快捷字典编辑按钮需求
### 6.1 需求说明
报工单表单中,凡是字典下拉字段,旁边增加 ⚙️ 小按钮。
点击后在新 Tab 打开该字典的数据维护页,无需导航系统菜单。
### 6.2 涉及字典字段
| 字段 | 字典类型 | 分组 | 需要按钮 |
|------|----------|------|---------|
| 报工类型 | `production_report_type` | A-基础信息 | ✅ |
| 班次 | `sys_shift_type` | A-基础信息 | ✅ |
| 班组 | `production_team` | A-基础信息 | ✅ |
| 是否结算工资 | `sys_yes_no` | D-成本效益 | ❌ 系统字典不建议编辑 |
### 6.3 技术方案
```js
// 引入
import { listType } from '@/api/system/dict/type'
// 方法
openDictEdit(dictType, dictName) {
listType({ dictType, pageSize: 10 }).then(response => {
if (response.rows && response.rows.length > 0) {
const dictId = response.rows[0].dictId
this.$tab.openPage('字典数据-' + dictName, `/system/dict/data/${dictId}`)
} else {
this.$modal.msgWarning('未找到字典:' + dictName)
}
})
}
```
```html
<!-- 按钮布局 -->
<div style="display:flex;align-items:center;gap:4px">
<el-select v-model="..." style="flex:1">...</el-select>
<el-tooltip content="快速编辑字典" placement="top">
<el-button type="text" icon="el-icon-setting"
@click.stop="openDictEdit('production_report_type','报工类型')"
v-hasPermi="['system:dict:edit']" />
</el-tooltip>
</div>
```
---
## 七、页面布局优化方案
### 7.1 整体布局结构
```
[工单信息只读区 - el-descriptions]
[+ 添加记录] [- 删除] [保存]
[报工记录 #1 - el-collapse 卡片]
▶ A. 基础信息(默认展开)
▶ B. 数量信息(默认展开)
▶ C. 时间节拍(默认折叠)
▶ D. 成本效益(默认折叠)
▶ E. 异常记录(默认折叠,有内容时标题标红)
[报工记录 #2 ...]
```
### 7.2 工单信息只读区(扩展现有 el-descriptions
现有字段保持,新增第三行:
| 客户名称 | 工件/成品名称 | 产品批次 | 执行标准(只读占位) | 工序路线 |
### 7.3 A. 基础信息(默认展开)
| 字段 | 控件 | 默认值 | 必填 | 字典按钮 |
|------|------|--------|------|---------|
| 报工人 | el-select | 当前登录用户 | 是 | — |
| 报工时间 | el-date-picker datetime | 当前时间 | 是 | — |
| 报工类型 | el-select`production_report_type` | NORMAL | 是 | ✅ |
| 班次 | el-select`sys_shift_type` | 空 | 否 | ✅ |
| 班组 | el-select`production_team` | 空 | 否 | ✅ |
| 执行标准 | el-input | 空 | 否 | — |
| 车间 | el-select | 用户工位绑定 | 是 | — |
| 工位 | el-select | 用户工位绑定 | 是 | — |
### 7.4 B. 数量信息(默认展开)
| 字段 | 控件 | 默认值 | 说明 |
|------|------|--------|------|
| 计划数(只读) | 文本展示 | = workOrder.quantity | 自动回显 |
| 报工数量 | el-input-number | — | 必填 |
| 合格数量 | el-input-number | = 报工数量 | 质检后修改 |
| 不合格数量 | el-input-number | 0 | 自动 = 报工数 - 合格数 |
| 良品率(只读) | 百分比 + 颜色 | 自动计算 | >=95%绿/90-95%橙/<90% |
### 7.5 C. 时间节拍(默认折叠)
| 字段 | 控件 | 默认值 | 说明 |
|------|------|--------|------|
| 计划开始时间只读 | 文本展示 | = processStartTime工单 `process_start_time` | 自动回显 |
| 计划完工时间只读 | 文本展示 | = processStartTime + duration工单工序明细 `WorkOrderEntry.duration` | 自动回显 |
| 实际开始时间 | el-date-picker datetime | = plan_start_time | 离散/连续均有 |
| 实际完工时间 | el-date-picker datetime | = plan_end_time | 离散/连续均有 |
| 理论节拍分钟/ | el-input-number | | 手动OEE参考 |
| 停机时间分钟 | el-input-number | 0 | 离散/连续均有 |
| 停机原因 | el-input | | 停机时间>0时高亮提示填写 |
### 7.6 D. 成本效益(默认折叠)
| 字段 | 控件 | 默认值 | 说明 |
|------|------|--------|------|
| 绩效工资 | el-input-number | 0 | 手动 |
| 能耗 | el-input-number | 0 | 手动 |
| 工耗 | el-input-number | 0 | 手动 |
| 其他成本 | el-input-number | 0 | 手动 |
| 增值 | el-input-number | 0 | 手动 |
| 工位OEE | el-input-number暂可编辑 | 空 | 前端计算,公式待完善 |
| 本次效益(自动) | 数字展示 + 颜色 | 自动计算 | = 增值-能耗-工耗-其他 |
| 是否结算工资 | el-select`sys_yes_no` | N | **可编辑**(原只读改为可编辑) |
| 结算工资 | el-input-number | 0 | **可编辑**(原只读改为可编辑) |
### 7.7 E. 异常记录(默认折叠,有内容标题变红)
| 字段 | 控件 | 默认值 |
|------|------|--------|
| 工位异常情况 | el-input textarea | 空 |
| 整改建议 | el-input textarea | 空 |
| 备注 | el-input textarea | 空(已有字段移至此处) |
---
## 八、移动端适配要求(重要)
> 移动端适配为本次升级的重点之一,与 PC 端同等优先级。
### 8.1 折叠面板
- 移动端(`isMobile === true`)所有分组**默认全部展开**
- 折叠/展开控制隐藏(移动端无折叠手势)
### 8.2 布局
- 所有字段单列排布(`el-col :xs="24"`
- PC 端双列(`el-col :sm="12"`
### 8.3 控件适配
- `el-date-picker` 使用 `type="datetime"`,移动端保持原生表现
- `el-input-number` 设置 `controls-position="right"` 避免移动端误触
- 字典编辑按钮在移动端隐藏(`v-if="!isMobile"`),按你确认项 #4 执行
### 8.4 工单信息只读区
- 移动端改为竖向列表(`el-descriptions direction="vertical"`
- 每项占满整行
### 8.5 按钮区
- 底部操作按钮固定(`position: sticky; bottom: 0`
- 保存按钮宽度 100%
---
## 九、SQL 变更清单
见文件 `.sql/2026-03-03_v2.0.003_周启威_报工单升级优化.sql`
| 操作 | 说明 |
|------|------|
| ALTER TABLE pro_report ADD COLUMN... | 新增 **27 个字段**shift_name/downtime_minutes/downtime_reason 已有,**不在本 SQL 中** |
| 移除 report_count | 与 report_quantity 重复,已从 SQL 删除,附注释说明 |
| 移除 quality_check_status | 与 quality_status 重复,已从 SQL 删除,附注释说明 |
| is_settle / wages 改为可编辑 | 数据库字段不变,仅前端去掉 disabledSQL 注释说明 |
| 新增字典 production_report_type | 4个枚举值 |
| 新增字典 production_team | 甲/乙/丙班(字典管理中可维护) |
| 新增索引 idx_customer_id 等 | 4个索引 |
**必填项核对(以你项目现状为准,不做“强行 NOT NULL 创新”):**
- `pro_report` 现有核心字段为强制必填(数据库 `NOT NULL`
- `work_order_entry_id``report_user_id``report_user_name``report_channel``status``create_by``create_time``report_time``report_quantity``is_settle``wages`
- 本次新增字段在 SQL 中均为 `DEFAULT NULL` 或有默认值(如成本类默认 0、`report_type` 默认 NORMAL。原因
- 兼容历史数据/已存在报工单记录
- 避免上线时因存量数据缺字段导致迁移失败
- 业务必填更多应由前端校验/后端保存校验保证
**⚠️ SQL 执行后后端必须同步Report.java 三处 `@TableField(exist=false)` 需删除**
```java
// 删除以下三行注解,让 MyBatis-Plus 把新列作为正常 DB 字段写入
// processName
@TableField(exist = false) // ← 删除此行
private String processName;
// processId
@TableField(exist = false) // ← 删除此行
private Long processId;
// customerName
@TableField(exist = false) // ← 删除此行
private String customerName;
```
**⚠️ 前端 form.vue dicts 数组需补充两个新字典类型**
```js
// 现有line 233
dicts: ['currency','production_status','report_channel','sys_yes_no','qc_type','sys_shift_type']
// 修改后(新增 production_report_type 和 production_team
dicts: ['currency','production_status','report_channel','sys_yes_no','qc_type','sys_shift_type','production_report_type','production_team']
```
**⚠️ processStartTime 为空时的 fallback 策略**
`pro_workorder.process_start_time` 在未排产/未开工时可能为 null。
前端回显逻辑(优先级依次降低):
1. 优先使用 `form.processStartTime`
2. 若为空fallback 用 `form.beginProDate`(工单开始生产日期)
3. 若仍为空,`plan_start_time` 显示为空,用户手动填写
---
## 十、工作量评估
> 图例:**XS** <2h**S** 半天|**M** 1天**L** 2天
| 模块 | 内容 | 工作量 |
|------|------|--------|
| SQL 执行 | 已写好,执行即可 | XS |
| 后端实体 | Report.java 新增 27 字段;删除 processName/processId/customerName 的 `@TableField(exist=false)` | S |
| 后端 Mapper | XML 增删字段映射INSERT/SELECT | S |
| 后端 Service | insertReport 时将已有字段赋值到新列(直接复制,无额外查询) | S |
| 前端工单信息区 | el-descriptions 扩展新只读字段 | XS |
| 前端字典按钮 | openDictEdit 方法 + 3处按钮 | XS |
| 前端表单重构PC | form.vue + formA.vue 折叠分组布局 | L |
| 前端表单重构(移动端) | 响应式布局、全展开、按钮固定 | M |
| 前端计算逻辑 | 良品率/本次效益实时计算OEE 暂编辑框 | S |
| 联调测试 | 自动回显验证、计算验证、移动端真机测试 | S |
| **合计** | | **约 4 个工作日** |
---
## 十一、实施顺序建议
| 顺序 | 任务 | 依赖 |
|------|------|------|
| 1 | 执行 SQL 脚本 | 无 |
| 2 | 后端实体 + Mapper + Service | SQL 完成后 |
| 3 | 前端工单信息区扩展(快速见效) | 后端完成后 |
| 4 | 前端折叠表单重构PC | — |
| 5 | 前端移动端适配 | 步骤4基础上 |
| 6 | 字典编辑按钮 | — |
| 7 | 联调测试 + 修复 | 全部完成后 |
---
## 十二、待确认事项(你确认后再进入代码实现)
| 序号 | 待确认点 | 当前文档建议 | 影响范围 |
|------|----------|-------------|----------|
| 1 | `customer_name/customer_id` 是否必须存在 | 按业务应必有;若线上仍出现 null需明确是否允许为空并决定 `customer_id` 获取方式(查询返回 or 保存时回填) | 后端查询/保存逻辑、前端只读展示 |
| 2 | `plan_start_time` 的准确来源字段 | **已按你确认:使用工单 `process_start_time``processStartTime`** | 后端赋值、前端只读展示 |
| 3 | `plan_end_time` 的工序时长 `duration` 来源 | **已按你确认:使用工单工序明细 `WorkOrderEntry.duration`** | 后端赋值、前端只读展示 |
| 4 | 移动端是否需要“字典快捷按钮” | **已按你确认:移动端隐藏** | 前端交互设计 |
---
## 十三、项目内可复用点(能复用就不创新)
### 13.1 字段与表结构复用(避免新造字段名)
| 目标 | 复用项 | 位置 |
|------|--------|------|
| 计划开始时间来源 | `pro_workorder.process_start_time` / `WorkOrder.processStartTime` | `WorkOrder.java` + `WorkOrderMapper.xml` 已映射 |
| 工序时长来源 | `pro_workorder_entry.duration` / `WorkOrderEntry.duration`(秒) | `WorkOrderEntry.java` 已存在 |
| 工单-工序明细联动 | 工单查询已 `left join pro_workorder_entry` 并返回 `workOrderEntryList` | `WorkOrderMapper.xml``selectWorkOrderVo` |
### 13.2 时间计算逻辑复用(不自写新公式)
项目内已有工具类:`cn.sourceplan.production.util.RouteTimeCalculator`
- 连续制造:使用等待开始时间 `waitStartTime` + `duration`
- 离散制造:顺序推进 + 转运时间 `transferTime` + `duration`
本次仅需“单工序的 plan_start_time/plan_end_time”时优先直接用
- `plan_start_time = workOrder.processStartTime`
- `plan_end_time = plan_start_time + workOrderEntry.duration`
若后续需要“整条路线的各工序时间”再复用 `RouteTimeCalculator.calculateProcessTimes(...)`,不在本次强行扩展。
### 13.3 前端打开字典维护页复用
项目内已有页签能力:`this.$tab.openPage(title, path)`(见 `mes-ui/src/plugins/tab.js`
本次字典快捷按钮仅在 PC 显示:
- 复用 `@/api/system/dict/type``listType` 查询 `dictId`
- 再用 `$tab.openPage` 打开 `/system/dict/data/{dictId}`
### 13.4 报工现有字段复用(不新增重复字段)
报工表 `pro_report` 现有已具备(尤其连续制造已在使用):
- `shift_name``report_period_start``report_period_end`
- `downtime_minutes``downtime_reason`
本次升级仅做“离散/连续统一支持 + UI 分组优化 + 新增成本/效益字段持久化”,不重复造相同语义字段。
---
## 十四、字段来源全景说明(项目模块 + 行业参考)
> 本节结合本系统实际模块关系,以及 SAP PP / Oracle MES / 用友U9C / 金蝶云星空等行业主流 MES 系统的报工单设计,说明每个字段在实际生产场景中的来源和意义。
### 14.1 A 区 — 基础信息字段
| 字段 | 本系统来源模块 | 本系统来源表/字段 | 行业做法参考 |
|------|-------------|----------------|-------------|
| `report_user_id` / `report_user_name` | **系统用户模块** | `sys_user.user_id / nick_name`,前端当前登录用户 | SAP PP`Operator ID`,由 HR 工号绑定Oracle`Resource Person` 来自员工主数据 |
| `report_time` | **前端自动** | 当前时间 `new Date()`,用户可修改(补报场景) | 通用做法默认系统时间允许补报修改SAP PP 称 `Confirmation Date` |
| `report_type` | **字典模块** | `sys_dict_data`(字典类型 `production_report_type`,本次新增) | SAP PP`Confirmation Type`(正式/取消/返工用友U9C报工类型正常/返工/补报);金蝶:报工性质 |
| `shift_name` | **字典模块** | `sys_dict_data`(字典类型 `sys_shift_type`,原有字典) | 全行业标配SAP PP 称 `Shift`从工厂日历继承Oracle MES 称 `Shift Code` |
| `team_name` / `team_id` | **字典模块** | `sys_dict_data`(字典类型 `production_team`,本次新增);`team_id` 存字典 `remark` 字段 | SAP PP`Work Center Group`金蝶云星空生产班组独立主数据用友U9C班组来自 HR 班组台账 |
| `execution_standard` | **手动录入** | 无系统来源,用户自填(如 GB/T 标准号) | ISO 9001 要求SAP PP`Control Key` 间接关联作业标准;食品/化工行业强制要求 |
| `workshop_id` / `workshop_name` | **车间工位模块** | `pro_workshop.id / name`[getWorkshops()](cci:1://file:///e:/Yavii_P3/MES/mes-ui/src/views/mes/production/report/formA.vue:874:4-880:5) API 加载 | 全行业标配SAP PPPlant + Work Center 两级;本系统:车间→工位两级结构 |
| `station_id` / `station_name` | **车间工位模块** | `pro_station.id / name`,级联车间下拉 | SAP PP`Work Center`Oracle MES`Resource / Machine`;金蝶:工作中心 |
### 14.2 B 区 — 数量信息字段
| 字段 | 本系统来源模块 | 本系统来源表/字段 | 行业做法参考 |
|------|-------------|----------------|-------------|
| `plan_count` | **生产工单模块** | `pro_workorder.quantity`(工单排产总数),[insertReport](cci:1://file:///e:/Yavii_P3/MES/yjh-mes/src/main/java/cn/sourceplan/production/service/impl/ReportServiceImpl.java:495:4-718:5) 时自动填入 | SAP PP`Order Quantity`Oracle MES`Job Quantity`;全行业报工必带,用于进度对比 |
| `report_quantity` | **手动录入(必填)** | 用户输入本次完成数量 | SAP PP`Yield Quantity`Oracle`Transaction Quantity`;金蝶:完工数量 |
| `qualified_quantity` | **手动录入 / 质检回填** | 用户输入或质检单确认后回填;触发良品率实时计算 | SAP PP`Confirmed Yield`用友U9C合格数量来自质检单金蝶合格入库数量 |
| `unqualified_quantity` | **前端计算** | = `report_quantity - qualified_quantity`,前端实时计算后保存持久化 | SAP PP`Scrap Quantity`Oracle`Rejected Quantity`;全行业通常自动推算 |
| `yield_rate` | **前端计算** | = `qualified_quantity / report_quantity × 100`,前端实时计算 | SAP PP由 QM 模块统计Oracle MES`Yield %`;化工/食品行业生产 KPI 核心指标 |
### 14.3 C 区 — 时间节拍字段
| 字段 | 本系统来源模块 | 本系统来源表/字段 | 行业做法参考 |
|------|-------------|----------------|-------------|
| `plan_start_time` | **生产工单模块** | `pro_workorder.process_start_time`[insertReport](cci:1://file:///e:/Yavii_P3/MES/yjh-mes/src/main/java/cn/sourceplan/production/service/impl/ReportServiceImpl.java:495:4-718:5) 时自动填入 | SAP PP`Scheduled Start Date`,来自 MRP/APS 排程结果;本系统暂由工单手工维护 |
| `plan_end_time` | **工单模块 + 工序明细** | = `process_start_time + pro_workorder_entry.duration`(秒);前端 [fillDefaultPlanEndTime](cci:1://file:///e:/Yavii_P3/MES/mes-ui/src/views/mes/production/report/formA.vue:837:4-850:5) 计算默认值,可手动修改 | SAP PP`Scheduled Finish Date`,由 Work Center 标准工时自动推算Oracle`Scheduled End Date` |
| `actual_start_time` | **手动录入(默认=计划开始)** | 默认 = `plan_start_time`,用户调整为实际打卡/扫码时间 | SAP PP`Actual Start Date`Oracle MES`Actual Start`,常由 WIP 事务自动记录;金蝶:实际开工时间 |
| `actual_end_time` | **手动录入(默认=计划完工)** | 默认 = `plan_end_time`,用户调整为实际完成时间 | SAP PP`Actual Finish Date`;是工时统计和效率分析的核心数据 |
| `theoretical_cycle_time` | **手动录入** | 来自 IE 工业工程部门的标准工时,单位:分钟/件,系统无自动来源 | SAP PP`Standard Work`(每件标准工时)来自 Routing 工艺路线主数据;本系统暂无 IE 模块,手工录入 |
| `downtime_minutes` | **手动录入(已有字段)** | `pro_report.downtime_minutes`,原连续制造已用,本次离散开放 | SAP PM`Breakdown Duration`Oracle MES`Downtime` 来自 EAM 设备维护模块;金蝶:停机时长 |
| `downtime_reason` | **手动录入(已有字段)** | `pro_report.downtime_reason`,原连续制造已用 | SAP PM`Notification Type`;行业做法建议结合停机原因字典;本系统暂为自由文本 |
| `report_submit_time` | **后端自动写入** | `new Date()` 于 [insertReport](cci:1://file:///e:/Yavii_P3/MES/yjh-mes/src/main/java/cn/sourceplan/production/service/impl/ReportServiceImpl.java:495:4-718:5) 保存时写入,不暴露前端 | 全行业通用审计时间戳SAP 称 `Posting Date`;用于识别补报行为 |
### 14.4 D 区 — 成本效益字段
| 字段 | 本系统来源模块 | 本系统来源表/字段 | 行业做法参考 |
|------|-------------|----------------|-------------|
| `performance_wages` | **手动录入 / 薪资模块(待接)** | 用户填写;未来可由薪资结算模块推送计件工资 | SAP HR`Labor Cost`,工时×工资率由 CO 成本中心自动计算;本系统暂无薪资模块 |
| `energy_consumption` | **手动录入 / 设备模块(待接)** | 用户填写能耗数值(如 kWh未来可对接设备能耗传感器自动采集 | 行业称 `Utility Cost`SAP PP 通过活动类型 `Activity Type=Power` 自动计算;化工/食品行业必填 |
| `material_consumption` | **手动录入 / 领料模块(待接)** | 用户填写工耗;系统已有领料单 `pro_pick`,暂未自动关联金额 | SAP PP`Goods Movement 261` 领料冲减BOM 消耗量自动计算;本系统有领料流程但报工暂不自动带入 |
| `other_costs` | **手动录入** | 用户填写其他杂项成本 | SAP CO`Overhead Cost`(制造费用分摊);本系统暂无分摊机制 |
| `value_added` | **手动录入** | 用户填写本道工序产生的增值(如加工费、工序增值) | SAP PP+CO`Value Added = Confirmed Activity × Price`;金蝶云星空:工序增值来自 BOM 标准成本;本系统暂手工 |
| `station_oee` | **手动录入(暂)/ 设备模块(待接)** | 用户手填百分比0-100OEE = 可用率 × 性能率 × 质量率 | 全行业 KPI 标配SAP MII / Oracle MES 由设备数据自动计算;本系统已有 `pro_equipment`,后续可自动化 |
| `current_benefit` | **前端计算** | = `value_added - energy_consumption - material_consumption - other_costs`,前端实时计算 | SAP CO`Contribution Margin`(贡献毛利);金蝶:毛利;精益生产看板核心指标 |
| `is_settle` | **薪资结算模块** | `pro_report.is_settle`Y/N本次改为可编辑薪资结算完成后更新 | SAP HR工资确认标志金蝶 HR计件结算状态报工→薪资结算两步确认标准流程 |
| `wages` | **薪资结算模块** | `pro_report.wages`,实际结算工资金额,本次改为可编辑 | SAP HR`Piece Rate Pay`计件工资用友U9C报工工资由薪资引擎批量计算后写回 |
### 14.5 E 区 — 异常记录字段
| 字段 | 本系统来源模块 | 本系统来源表/字段 | 行业做法参考 |
|------|-------------|----------------|-------------|
| `station_exception` | **手动录入** | `pro_report.station_exception`,用户描述工位发生的异常 | SAP QM`Quality Notification`质量通知单Oracle MESNCRNon-Conformance Report金蝶生产异常记录行业通常为独立异常模块本系统暂为报工附属字段 |
| `rectification_suggestion` | **手动录入** | `pro_report.rectification_suggestion`,班长/用户填写整改建议 | 来自精益生产 PDCA 循环的 Act 环节SAP QM`Corrective Action`ISO 9001 纠正措施记录 |
| `remark` | **手动录入(已有字段)** | `BaseEntity.remark`,通用备注 | 全行业通用自由文本字段 |
### 14.6 自动回显字段来源追溯
| 字段 | 来源路径(从销售到报工单) | 行业做法参考 |
|------|----------------------|-------------|
| `customer_name` / `customer_id` | `sal_order`(销售模块)→ `pro_workorder.customer_name`(工单 JOIN 查询)→ `pro_report.customer_name`(报工时自动填入) | SAP PP客户信息通过 Sales Order → Production Order 链路从 SD 模块传递;食品行业定制生产必须追溯到客户 |
| `workpiece` | `pro_workorder.material_name`(工单模块)→ `pro_report.workpiece`(报工时自动填入) | SAP PP`Material Description`Oracle MES`Item Description`;直观展示生产对象名称 |
| `product_batch` | `pro_workorder.batch_number`(工单/批次管理模块)→ `pro_report.product_batch` | SAP`Batch Number`,食品/制药全程追溯Oracle MES`Lot Number`;本系统工单创建时手工维护批次 |
| `process_name` / `process_id` | `pro_route_process`(工艺路线模块)→ `pro_workorder_entry`(工单工序明细)→ `pro_report.process_name / process_id` | SAP PP`Operation`(工序)来自 `Routing`工艺路线主数据Oracle MES`Operation Code` |
| `plan_start_time` | `pro_workorder.process_start_time`(工单排程时间)→ `pro_report.plan_start_time` | SAP PP来自 MRP/APS 排程;本系统暂工单手工维护 |
| `plan_end_time` | `pro_workorder.process_start_time` + `pro_workorder_entry.duration`(秒)→ 前端计算 → `pro_report.plan_end_time` | SAP PP由 Work Center 标准工时自动推算;本系统用 `RouteTimeCalculator` 可扩展 |
| `plan_count` | `pro_workorder.quantity`(工单排产数量)→ `pro_report.plan_count` | SAP PP`Order Quantity` 直接传递 |
### 14.7 系统能力评估(与行业对标)
| 维度 | 本系统升级后 | SAP PP 标准 | 差距与后续规划 |
|------|------------|------------|--------------|
| **基础信息** | 报工人、时间、类型、班次、班组、工位 ✅ | 同等,另有 HR 工号强绑定 | 班组可升级为独立主数据模块 |
| **数量追踪** | 计划数、报工数、合格数、不合格数、良品率 ✅ | 同等,另有废品原因代码字段 | 可增加废品原因字典字段 |
| **时间管理** | 计划/实际开始完工、节拍、停机时间 ✅ | 同等,另有 `Setup Time`(换线准备时间) | 可增加 `setup_time` 字段 |
| **成本核算** | 绩效工资、能耗、工耗、其他成本、增值、效益 ✅(手工录入) | SAP CO 基于 BOM + 活动类型自动计算 | 后续对接领料单/能耗传感器实现自动化 |
| **质量管理** | 良品率、工位异常、整改建议 ✅(基础) | 独立 QM 质量通知单,流程完整 | 本系统已有质检单模块,异常字段为补充 |
| **设备效率** | OEE 暂手工、理论节拍 ⚠️ | SAP MII 自动采集设备数据计算 OEE | 本系统已有 `pro_equipment`,后续可自动计算 |
| **追溯链路** | 客户→工单→工序→报工单 ✅ | 销售订单→生产订单→工序→确认单,完整 | 本系统已完整,通过 `sourceInfo` JSON 关联销售订单 |