Files
f9-web-ai-test/工作进度/工作进度-12.md
T
yanpeng200212 a30d1cdcce 新增生产-前缫看台排班,并导入机组车台与看台排班数据
功能:
- 后端新增 KtpbCtgs / KtpbDcgs / KtpbZbzs 三张表、KtpbService 与 api/prod/ktpb 接口
  (车头工、挡车工、值班长分页查询与维护,挡车工按车间+班次+机组整组替换保存)
- 挡车数按 F9 口径自动重算:接壤车台各计 0.5,保存时服务端重新计算并校验车台范围
- 前端新增 /prod/qianxian/ktpb 看台排班页(三页签 + 车间/班次/机组过滤 + 批量编辑弹窗)
- 新增通用职工选择弹窗 EmployeeSelect(单选/多选,按部门过滤)
- 生产-前缫菜单下新增「看台排班」,权限 prod:ktpb:list

数据导入:
- 重新生成 biz_prod_qs_jzct.json,新增 ktpb_ctg / ktpb_dcg / ktpb_zbz 三个内嵌资源
- F9 部门 Id 经 DeptData 映射到本系统部门;职工按原始雪花 Id 关联
- 剔除软删除/脏数据:机组车台 24 条、车头工 33 条、挡车工 202 条(34 组)、值班长 7 条
- 导入幂等:机组车台按车间+机组 upsert,排班按业务唯一键去重,已维护的组不覆盖

其他:同步工作进度-12 文档与开发数据库快照
2026-10-22 10:49:13 +08:00

136 lines
7.3 KiB
Markdown
Raw 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.
# 工作进度-12:生产-前缫「看台排班」+ 机组车台/看台排班数据导入
> 时间:2026-10-22(承接工作进度-11)
> 需求:仿照 `D:\AntaiProject - 副本` 生产-前缫的「机组车台 / 看台排班」,在本系统落地看台排班功能,并导入随附的 4 张表数据:
> `biz_prod_qs_jzct`(机组车台)、`biz_prod_qs_ktpb_ctg`(车头工)、`biz_prod_qs_ktpb_dcg`(挡车工)、`biz_prod_qs_ktpb_zbz`(值班长)。
> 参考实现:`WinClient\F9.Business.Prod\QS\KTPB\`(Page_KTPB、Page_KTPBCTG_Edit、Page_KTPBDCG_Edit、Page_KTPBZBZ_Edit)、`Application\CQRS\Business\PROD\QS\KTPB\`、`Domain\Entities\Business\PROD\QS\KTPB\`。
---
## 一、功能设计
```
生产-前缫
├── 落丝记录
├── 车间班次
└── 看台排班(新增) /prod/qianxian/ktpb
顶部:车间(职责类型=前缫)+ 班次(甲/乙)+ 机组 + 关键字
页签:挡车工 / 车头工 / 值班长
├── 挡车工:按「车间+班次+机组」整组维护
│ 弹窗内可批量添加挡车工(多选职工),逐行填起止车台,
│ 挡车数自动计算(接壤车台各计 0.5),实时显示「已分配 x / y 台」
├── 车头工:一个「车间+班次+机组」一条记录,含车头工1 / 车头工2
└── 值班长:一个「车间+班次」可有多名值班长
```
与 F9 的对应关系:
| F9 | 本系统 |
|---|---|
| `Page_KTPB`(三个页签 + 车间/班次/机组过滤) | `views/prod/ktpb/index.vue` |
| `Page_KTPBDCG_Edit`(整组批量编辑 + 挡车数计算) | 挡车工弹窗 + `POST /dcg/batch` |
| `Page_KTPBCTG_Edit` / `Page_KTPBZBZ_Edit` | 车头工 / 值班长弹窗 |
| `BatchReplaceKtpbdcgCommand` | `KtpbService.SaveDcgBatchAsync`(先删后建) |
**挡车数算法**(移植 `CalculateSingleDangcheshu`):每台车权重默认 1;若某车台被多条记录覆盖,且同时是某记录的起点与另一记录的终点(接壤),该车台权重取 0.5,最后四舍五入保留两位。前后端实现完全一致。
---
## 二、后端
### 2.1 实体(`Domain/Entities/PROD/Ktpb.cs`)
| 类 | 表 | 主要字段 |
|---|---|---|
| `KtpbCtg` | `KtpbCtgs` | DeptId、Banci、Jizu、Ygid1、Ygid2 |
| `KtpbDcg` | `KtpbDcgs` | DeptId、Banci、Jizu、ChetaiStart、ChetaiEnd、YgId、Dangcheshu |
| `KtpbZbz` | `KtpbZbzs` | DeptId、Banci、YgId |
### 2.2 服务与接口(`KtpbService` / `KtpbController`,路由 `api/prod/ktpb`)
```
GET qianxian-deps 车间下拉(DutyType=前缫)
GET jizu-options?depId= 机组下拉(含车台范围,取机组车台)
GET ctg?depId=&banci=&jizu=&like= 车头工分页
POST ctg | PUT ctg/{id} | DELETE ctg/{id}
GET dcg?depId=&banci=&jizu=&like= 挡车工分页
GET dcg/group?depId=&banci=&jizu= 某机组整组排班
POST dcg/batch 整组替换(空集合=清空)
DELETE dcg/{id}
GET zbz?depId=&banci=&like= 值班长分页
POST zbz | PUT zbz/{id} | DELETE zbz/{id}
```
校验规则:
- 车头工:同「车间+班次+机组」唯一,车头工1 必填。
- 挡车工:起始车台>0、结束≥起始、必须落在该机组车台范围内;保存时服务端重算挡车数。
- 值班长:同「车间+班次+值班长」不重复。
### 2.3 数据导入(`ProdSeedData`,幂等)
新增 3 个内嵌资源 `SeedData/biz_prod_qs_ktpb_ctg.json`、`_dcg.json`、`_zbz.json`,并把 `biz_prod_qs_jzct.json` 按本次导出数据重新生成。
映射规则:
- **部门**:xlsx 中的 `dep_id` 是 F9 部门 Id,经 `BusinessSeedData.DeptData`(F9 Id → 部门名)映射到本系统 `Departments.Id`;
- **职工**:F9 职工导出时保留了原始雪花 Id,本系统 `Employees.Id` 与之一致,直接按 Id 关联(不存在的职工行跳过);
- **清洗**:剔除 `deleted_at` 非空的软删除行(4 张表中大量为测试/删除数据)、部门无法映射或不在前缫四车间的行、机组/车台号非法行;
- **去重**:机组车台按「车间+机组」保留规范行(优先 `起始号 = (机组-1)*20+1`);车头工按「车间+班次+机组」;值班长按「车间+班次+值班长」;挡车工按整行;
- **幂等**:机组车台按「车间+机组」upsert;车头工按「车间+班次+机组」upsert;挡车工按「车间+班次+机组」整组已存在则跳过;值班长按唯一键跳过。
导入结果(本次启动日志):
```
[ProdSeed] 机组车台:来源 24 条,新增 0,更新 0(此前已导入)
[ProdSeed] 车头工看台排班:来源 33 条,新增 33 条
[ProdSeed] 挡车工看台排班:来源 202 条,新增 202 条(34 组)
[ProdSeed] 值班长看台排班:来源 7 条,新增 7 条
```
> 原始 xlsx 行数:机组车台 35、车头工 75、挡车工 4543、值班长 13;其中挡车工 4341 行是 F9 里已软删除的历史/测试数据,故有效数据仅 202 行。
### 2.4 菜单
`DbSeeder.SeedProdMenus` 在生产-前缫下新增第 3 个子菜单「看台排班」,权限标识 `prod:ktpb:list`,admin 自动授权。
---
## 三、前端
| 文件 | 说明 |
|---|---|
| `views/prod/ktpb/index.vue` | 看台排班主页面(三页签 + 过滤 + 分页 + 三个弹窗) |
| `components/select/EmployeeSelect.vue` | 职工选择弹窗(单选/多选,支持按部门过滤与姓名/工号搜索) |
| `router/index.js` | 注册 `prod/ktpb/index` 路由组件 |
前端交互要点:
- 挡车工维护必须先在顶部选定「车间 + 机组」,弹窗内展示该机组车台范围;
- 弹窗顶部实时显示「已分配 x / y 台」,未满额时标签变黄,避免漏排;
- 起止车台用 `el-input-number` 限制在机组范围内,改动即刷新挡车数;
- 车头工/值班长新建时默认带出当前过滤的车间与班次。
---
## 四、验证记录
| 项 | 结果 |
|---|---|
| `dotnet build` | ✅ 0 错误 |
| `vite build` | ✅ 通过(仅既有体积/SignalR 注释警告) |
| 菜单 | ✅ 生产-前缫 → 落丝记录 / 车间班次 / 看台排班 |
| 车间下拉 | ✅ 前缫车间、前缫一~四车间 |
| 机组下拉(前缫一车间) | ✅ 机组1-6,车台 1-20 / 21-40 / … / 101-120 |
| 挡车工列表 | ✅ 202 条,姓名/车台/挡车数正确(3.5、3、3.5…) |
| 车头工列表 | ✅ 33 条 |
| 值班长列表 | ✅ 7 条 |
| 整组保存 + 挡车数重算 | ✅ 行1 1-10、行2 10-20 → 9.5 / 10.5(接壤车台各 0.5) |
| 超范围校验 | ✅ 车台 1-99 于机组1(1-20)返回 400「超出该机组车台范围 1-20」 |
| 测试数据清理 | ✅ 临时数据删除后组内 0 行 |
---
## 五、说明与后续
1. 职工姓名沿用 F9 档案原文(部分带「宁兴」等后缀,如「谢群生宁兴」),属于基础数据层面的既有情况,本次未改动。
2. 「机组车台」维护页面仍在 基础数据 下(`/base/jizuchetai`);F9 是放在生产-前缫组内。如需完全对齐,可把该菜单整体平移到生产-前缫(数据接口不变)。
3. 挡车工排班目前按「整组替换」保存,没有保留历史版本;若需要留痕,可增加排班生效日期 + 版本表。
4. 后续若要支持「按班组/按日期」排班(F9 另有班组维度),可在现有三张表上扩展 BanCi 组合键。