功能: - 后端新增 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 文档与开发数据库快照
131 lines
7.2 KiB
Markdown
131 lines
7.2 KiB
Markdown
# 工作进度-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. **批量维护**:目前单日单班次维护,若需要跨日期批量复制(如整月排班),可在 `录入(指定日期)` 基础上扩展多选日期。
|