# 工作进度-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. **批量维护**:目前单日单班次维护,若需要跨日期批量复制(如整月排班),可在 `录入(指定日期)` 基础上扩展多选日期。