Files
yanpeng200212 69c4052a64 新增生产-前缫看台记录,并导入车头工/挡车工看台记录历史数据
功能:
- 后端新增 KtjlCtgs / KtjlDcgs 两张表、KtjlService 与 api/prod/ktjl 接口
  (按日期+车间+班次查询、整组先删后建保存、整组删除、按看台排班带出默认记录、工种下拉)
- 挡车数按 F9 口径自动重算(与他人接壤的边界车位各扣 0.5),机组由车位反查机组车台
- 前端新增 /prod/qianxian/ktjl 看台记录页:挡车工/车头工双页签、删除、录入(新增)、录入(指定日期)
- 录入弹窗校验对齐 F9:个人时长不超标准、挡车数/看台时长匹配、车头工每机组≥2 人且时长为标准时长整数倍
- 生产-前缫菜单新增「看台记录」,权限 prod:ktjl:list

数据导入:
- 新增内嵌资源 biz_prod_qs_ktjl_ctg.csv / biz_prod_qs_ktjl_dcg.csv(约 5 万行,采用紧凑 CSV)
- 剔除软删除行、日期异常行、部门无法映射与职工不存在的行;日期由 Excel 序列号转换
- 车头工 12693 行、挡车工 38048 行入库,日期范围 2025-12-16 ~ 2026-09-11
- 表内已有数据则整体跳过,分批 1000 行插入

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

131 lines
7.2 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.
# 工作进度-13:生产-前缫「看台记录」+ 历史数据导入
> 时间:2026-10-22(承接工作进度-12)
> 需求:仿照 `D:\AntaiProject - 副本` 生产-前缫的「看台记录」,在本系统落地并与「看台排班」联动,同时导入两张表数据:
> `biz_prod_qs_ktjl_ctg`(车头工看台记录)、`biz_prod_qs_ktjl_dcg`(挡车工看台记录)。
> 参考实现:`WinClient\F9.Business.Prod\QS\KTJL\`(Page_Ktjl、Page_Ktjl_Dcg_Edit、Page_Ktjl_Ctg_Edit)、
> `Application\CQRS\Business\PROD\QS\KTJL\`(Save/Del/Query)、`Domain\Entities\Business\PROD\QS\KTJL\`。
---
## 一、功能设计
```
生产-前缫
├── 机组车台
├── 落丝记录
├── 车间班次
├── 看台排班
└── 看台记录(本次新增) /prod/qianxian/ktjl
过滤:日期 + 车间(职责类型=前缫)+ 班次(甲/乙)+ 关键字
页签:挡车工 / 车头工
按钮:删除(按 日期+车间+班次 整批)、录入(新增)、录入(指定日期)
```
| F9 行为 | 本系统实现 |
|---|---|
| 列表按 日期+车间+班次 查询,无分页 | 同左(单日数据量小,一次展示) |
| `删除`:按 日期+车间+班次 整批软删 | `DELETE /api/prod/ktjl/{type}?date=&depId=&banci=` |
| `录入(新增)`:库中无记录时,按**看台排班**带出该车间该班次的车头工/挡车工 | `GET .../{type}/defaults`,行默认时长 9 小时、未转正职工默认「不计产量」 |
| `录入(指定日期)`:把某日记录复制到当前日期再编辑 | 前端选来源日期 → 读取 → 重映射日期 → 弹窗编辑 |
| `保存`:GroupBy(date, dep, banci) 先删后建 | 同左(服务端事务内先删后建) |
| 挡车数:`结束-开始+1`,与他人接壤的边界车位各扣 0.5 | 前后端同一算法(服务端保存时重算) |
| 机组:由车位范围反查机组车台 | 同左(服务端保存时校正) |
录入弹窗校验(对齐 F9 ValidCustom):
- 车头工:不能有空职工;每机组人数 ≥ 2;每机组时长合计为「标准时长」的整数倍且 ≥ 2 倍标准。
- 挡车工:不能有空职工;个人时长合计不超过标准时长;挡车数与多人看台接壤关系需匹配(挡车数不能为 0);每台车位的看台时长合计需等于标准时长(多人看台按上下游分别校验)。
- 校验不通过分「拦截」和「提示后询问是否继续保存」两级,与 F9 一致。
---
## 二、后端
### 2.1 实体(`Domain/Entities/Prod/Ktjl.cs`)
| 类 | 表 | 字段 |
|---|---|---|
| `KtjlCtg` | `KtjlCtgs` | Date、DeptId、Banci、Jizu、Hours、EmployeeId、EmployeeDepId、WorktypeId、WorktypeName、NoChanliang |
| `KtjlDcg` | `KtjlDcgs` | 同上 + ChetaiStart、ChetaiEnd、DangcheNum |
> `WorktypeName` 为历史快照(F9 是查询时联表),避免工种改名后历史记录显示漂移。
### 2.2 服务与接口(`KtjlService` / `KtjlController`,路由 `api/prod/ktjl`)
```
GET /api/prod/ktjl/dcg?date=&depId=&banci=&like=
GET /api/prod/ktjl/ctg?date=&depId=&banci=&like=
GET /api/prod/ktjl/dcg/defaults?date=&depId=&banci= 按看台排班带出默认记录
GET /api/prod/ktjl/ctg/defaults?date=&depId=&banci=
POST /api/prod/ktjl/dcg/batch 整组保存(先删后建)
POST /api/prod/ktjl/ctg/batch
DELETE /api/prod/ktjl/dcg?date=&depId=&banci=
DELETE /api/prod/ktjl/ctg?date=&depId=&banci=
GET /api/prod/ktjl/worktypes 工种下拉
```
### 2.3 数据导入(`ProdSeedData` 扩展)
- 新增两个内嵌资源:`Data/SeedData/biz_prod_qs_ktjl_ctg.csv`、`biz_prod_qs_ktjl_dcg.csv`
(共 5 万行,JSON 体积过大,改用紧凑的 `|` 分隔 CSV;csproj 增加 `*.csv` 内嵌规则);
- 清洗规则:剔除 `deleted_at` 非空的软删除行、日期序列号异常行(如 25569=1970-01-01)、部门无法映射行、职工不存在的行;
- 部门:xlsx 的 `dep_id` 是 F9 部门 Id,经 `BusinessSeedData.DeptData`(F9 Id → 部门名)映射;
职工:F9 职工导出保留了原始雪花 Id,与本系统 `Employees.Id` 一致,直接关联;
工种:本系统工种保留 F9 雪花 Id,直接对应,并冗余 `WorktypeName`;
- 日期:Excel 序列号(如 46007)转 `yyyy-MM-dd`;
- 幂等:表内已有数据则整体跳过(历史流水快照,不重复导入),分批 1000 行插入。
导入结果(本次启动日志):
```
[ProdSeed] 车头工看台记录:来源 12693 行,导入 12693 行,跳过 0 行
[ProdSeed] 挡车工看台记录:来源 38048 行,导入 38048 行,跳过 0 行
```
原始数据:车头工 16727 行(已删 4034)、挡车工 59744 行(已删 21692、日期异常 1、职工缺失 3);日期范围 **2025-12-16 ~ 2026-09-11**,覆盖前缫一~四车间、甲/乙班、机组 1~6。
### 2.4 菜单
`DbSeeder.SeedProdMenus` 在生产-前缫下新增第 5 个子菜单「看台记录」(`/prod/qianxian/ktjl`,权限 `prod:ktjl:list`),并做排序归一。
---
## 三、前端
| 文件 | 说明 |
|---|---|
| `views/prod/ktjl/index.vue` | 看台记录列表(双页签 + 日期/车间/班次过滤 + 删除/录入/复制日期) |
| `views/prod/ktjl/KtjlEditDialog.vue` | 录入弹窗(可编辑机组/车位/挡车数/时长/不计产量,含 F9 同口径校验) |
| `router/index.js` | 注册 `prod/ktjl/index` 路由组件 |
交互要点:
- 车位改动即时重算挡车数与机组;
- 支持勾选行「批量修改时长」、「删除选中」,可追加职工(多选职工弹窗,按车间过滤);
- 校验提示以对话框列出(如「1组5台,看台时长有误」),可「继续保存」或「返回修改」;
- 列表为空时提示可点「录入(新增)」按排班带出。
---
## 四、验证记录
| 项 | 结果 |
|---|---|
| `dotnet build` | ✅ 0 错误 |
| `vite build` | ✅ 通过 |
| 菜单 | ✅ 生产-前缫 5 个子菜单,看台记录排第 5 |
| 历史数据 | ✅ 车头工 12693 行、挡车工 38048 行入库(日期 2025-12-16 ~ 2026-09-11) |
| 查询 | ✅ 任意日期+车间+班次 返回正确行数与姓名/工种/机组/车位/挡车数/时长 |
| 录入(新增) 默认带出 | ✅ 前缫一车间甲班:挡车工 42 行、车头工 12 行(来自看台排班,时长默认 9) |
| 整组保存 | ✅ 保存 6 条后回读,挡车数 3.5/3.5/3/3.5… 与排班一致 |
| 整组删除 | ✅ 删除后该日该班次 0 行 |
| 车头工保存/回读 | ✅ 4 条,时长 4.5 正常写入 |
---
## 五、后续可做
1. **按职工汇总**:F9 另有 `Ktjl_*_GetAllGroupbyEmployee`(按职工汇总挡车数/时长),可用于工资计件;如需要可加 `GET /api/prod/ktjl/summary?dateFrom=&dateTo=&depId=`。
2. **代班**:F9 录入页支持「他人代班 / 车间内代班」(拆分时长),本版通过「添加职工 + 修改时长 + 调整车位」可等价实现,未做专门按钮。
3. **与落丝记录/工资联动**:看台记录是计件工资的输入之一,后续接入薪酬模块时可直接复用 `KtjlDcgs` 的 `DangcheNum × Hours`。
4. **批量维护**:目前单日单班次维护,若需要跨日期批量复制(如整月排班),可在 `录入(指定日期)` 基础上扩展多选日期。