新增生产-前缫看台排班,并导入机组车台与看台排班数据
功能: - 后端新增 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 文档与开发数据库快照
This commit is contained in:
+135
@@ -0,0 +1,135 @@
|
||||
# 工作进度-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 组合键。
|
||||
Reference in New Issue
Block a user