551 lines
32 KiB
Markdown
551 lines
32 KiB
Markdown
|
|
# 报工单升级优化分析文档
|
|||
|
|
|
|||
|
|
**版本:** 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 改为可编辑 | 数据库字段不变,仅前端去掉 disabled,SQL 注释说明 |
|
|||
|
|
| 新增字典 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 PP:Plant + 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-100);OEE = 可用率 × 性能率 × 质量率 | 全行业 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 MES:NCR(Non-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 关联销售订单 |
|