Files
yanpeng200212 1f1b184411 新增工资/仓储/生产日报等模块,移除旧考勤模块
- 新增 PayRoll(工资)、Wms(仓储)、Prod(车速/缫丝/考勤/丝片检测/丝片台账/纤检日报/质量日报) 模块
- 新增对应 Domain 实体、Application DTO/Service、Api Controller 与前端页面
- 移除旧 Attendance 考勤模块(Controller/Service/Entity/DTO 及 5 个前端页面),由 Prod/Kaoqin 取代
- 调整路由、仪表盘、Lsjl 流丝记录实体与服务
- 更新业务种子数据与 DbSeeder
- 补充工作进度文档 14-27
2026-10-27 09:09:57 +08:00

144 lines
9.6 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.
# 工作进度-14:生产-前缫「煮茧日报」落地
> 时间:2026-10-22(承接工作进度-13)
> 需求:把 `D:\AntaiProject - 副本` 生产-前缫的「煮茧日报(ZJRB)」移植进本系统。
> 参考实现:`WinClient\F9.Business.Prod\QS\ZJRB\`(Page_Zjrb、Page_Zjrb_EditV2)、
> `Application\CQRS\Business\PROD\QS\ZJRB\`(Zjrb_SaveCommand / Zjrb_DelCommand / CalculateJizuSaosiHoursCommand)、
> `Domain\Entities\Business\PROD\QS\`(Zjrb / ZjrbJizu / Zjrb_Banci / ZjrbJizuBanci)。
---
## 一、功能设计
```
生产-前缫
├── 机组车台
├── 落丝记录
├── 车间班次
├── 看台排班
├── 看台记录
└── 煮茧日报(本次新增) /prod/qianxian/zjrb
过滤:账期(月份)+ 车间(前缫)+ 庄口/规格关键字
主表:日期、上日、车间、庄口、规格;上存/领入/今缫/退回/今存(包数 + 重量,多级表头)
选中行 → 下方联动展示该日报的「机组」桶数明细(含合计行)
按钮:删除、新增、修改、计算缫丝时长
```
| F9 行为 | 本系统实现 |
|---|---|
| 列表按「账期(月份)+ 车间 + 关键字」查询,无分页 | 同口径,另加后端分页(`pageIndex/pageSize`) |
| 上表主表 + 下表机组联动(点击行刷新机组) | 同左(主表 `row-click` → `GET /{id}/jizus`) |
| `删除`:四张表级联删除 | `DELETE /api/prod/zjrb/{id}`(主表 + 班次 + 机组 + 机组班次物理删除) |
| `新增`:按上一日结存带出上存、每桶茧量、工艺落丝桶数 | `GET /defaults?date=&depId=&gyzkId=&guige=` |
| `修改`:回填主表 + 班次 + 机组 + 机组班次 | `GET /{id}` |
| `保存`:主表 + 三层明细一起提交 | `POST /save`(主表 upsert + 三层明细先删后建) |
| `计算缫丝时长`:按「日期 + 车间」整日重算 | `POST /calculate-saosi-hours?date=&depId=` |
**计算口径**(移植 `Page_Zjrb_EditV2` 的 `CalItem` / `Cal_Zhibiao` / `Cal_Zhibiao_Main`,前后端同口径、服务端保存时重算):
```
机组.今缫桶数 = 甲班今缫 + 乙班今缫
机组.今存桶数 = 上存 + 今缫 − 今落
(今落为 0 且余量 ≥ 工艺落丝桶数时,自动把今落置为工艺落丝桶数再扣减)
班次.今缫重量 = 该班次机组今缫桶数 × 每桶茧量 ÷ 1000 (每桶茧量单位 g,重量 kg)
班次.领入/退回重量 = 包数 × 联统茧标重
班次.今缫包数 = 今缫重量 ÷ 联统茧标重(四舍五入取整)
班次.今存 = 上存 + 领入 − 今缫 − 退回
主表 = 甲班 + 乙班(包数/重量各 5 项)
```
**校验**(对齐 F9 `AddValidRules`,前端拦截 + 服务端兜底):每桶茧量 > 0、工艺落丝桶数 > 0、上存包数 > 0 时上存重量必须 > 0、机组今缫桶数 > 0 时缫丝时长必须 > 0、机组缫丝时长 ≤ 20、同「日期 + 车间 + 庄口 + 规格」唯一。
---
## 二、后端
### 2.1 实体(`Domain/Entities/Prod/Zjrb.cs`)
| 类 | 表 | 主要字段 |
|---|---|---|
| `ZjrbRecord` | `ZjrbRecords` | Date、DeptId、GyzkId、Guige、LastDate、StandardLuositongshu、MeitongJianliang + 包数/重量各 5 项 |
| `ZjrbJizu` | `ZjrbJizus` | ZjrbId、Jizu、JizuSaosiHours、TongshuShangcun/Jinsao/Jinluo/Jincun |
| `ZjrbBanci` | `ZjrbBancis` | ZjrbId、Banci(甲/乙)、包数/重量各 5 项 |
| `ZjrbJizuBanci` | `ZjrbJizuBancis` | ZjrbId、ZjrbJizuId、Jizu、Banci、TongshuJinsao |
> 均继承 `BaseEntity`(自增主键 + 软删除),表结构由启动时 `CodeFirst.SyncStructure` 自动创建,无需迁移。
> F9 的 `Zjrb_Banci.BanciId`(指向车间班次)在本系统直接落 `Prod_Banci_Enum`(甲=1/乙=2),与看台排班/看台记录一致。
### 2.2 服务与接口(`ZjrbService` / `ZjrbController`,路由 `api/prod/zjrb`)
```
GET /api/prod/zjrb/list?dateFrom=&dateTo=&depId=&like=&pageIndex=&pageSize=
GET /api/prod/zjrb/{id} 修改回填(主表 + 班次 + 机组)
GET /api/prod/zjrb/{id}/jizus 机组明细(列表页下半表)
GET /api/prod/zjrb/defaults?date=&depId=&gyzkId=&guige= 新增默认值
POST /api/prod/zjrb/save 整条保存
DELETE /api/prod/zjrb/{id} 级联删除
POST /api/prod/zjrb/calculate-saosi-hours?date=&depId= 计算缫丝时长
```
- 新增默认值来源:同「车间 + 庄口(+ 规格)」下 `Date < 目标日期` 的最近一条日报
→ 上存包数/重量 = 上一日今存;每桶茧量、工艺落丝桶数、`LastDate` 一并继承;
班次行按「车间班次」配置(未配置则甲乙两班)生成,机组行按「机组车台」生成;
- 联统茧标重取参数配置 `生产\前缫\煮茧 → 联统茧标重`(本库已配置为 18),随默认值/回填一并下发,弹窗内可临时调整;
- `CalculateJizuSaosiHours` 算法(对齐 F9):机组「今缫桶数 > 0」的班次数为 2 → 18 小时,否则 9 小时;
按「庄口 + 规格 + 机组」分组,以 `Σ(每桶茧量 × 机组今缫桶数)` 为权重把机组总时长按比例分配到各条日报的机组行。
### 2.3 菜单
`DbSeeder.SeedProdMenus` 生产-前缫子菜单新增第 6 项,并做排序归一:
| 顺序 | 菜单 | 路径 | 组件 | 权限标识 |
|---|---|---|---|---|
| 6 | 煮茧日报 | /prod/qianxian/zjrb | prod/zjrb/index | prod:zjrb:list |
启动日志:`[DbSeeder] 生产模块菜单已就绪(生产-前缫 / 生产-后缫)`,`/auth/menus` 已返回 6 个子菜单。
---
## 三、前端
| 文件 | 说明 |
|---|---|
| `views/prod/zjrb/index.vue` | 日报列表(账期月份 + 车间 + 关键字)、主表多级表头、选中行联动机组明细、合计行、删除/新增/修改/计算缫丝时长 |
| `views/prod/zjrb/ZjrbEditDialog.vue` | 录入弹窗:基础信息 + 班次网格(甲乙班 5 组包数重量)+ 机组网格(时长/上存/甲乙班今缫/今落),改动即时重算 |
| `router/index.js` | `componentMap` 注册 `prod/zjrb/index` |
交互要点:
- 新增时选「工艺庄口 / 规格」后自动带出上一日结存与机组行,并用 `ElMessage` 提示「未维护机组车台」等异常;
- 弹窗内今缫重量/今缫包数/今存/今缫桶数/今存桶数均为只读派生值,避免与口径冲突;
- 删除与计算缫丝时长均二次确认(计算会覆盖该日该车间全部机组时长)。
---
## 四、验证记录
| 项 | 结果 |
|---|---|
| `dotnet build`(Domain/Application/Infrastructure) | ✅ 0 错误 |
| `dotnet build`(Api,临时输出目录,规避运行中进程文件锁) | ✅ 0 错误 |
| `vite build` | ✅ 通过(仅既有体积/SignalR 注释警告) |
| 菜单 | ✅ 生产-前缫 6 个子菜单,煮茧日报排第 6 |
| 保存(甲乙班 + 2 机组,每桶茧量 600g、标重 18) | ✅ 主表今缫 = round(54/18) = 3 包 / 54 kg;主表五组值 = 甲乙相加 |
| 机组今存自动补落丝 | ✅ 机组 上存 50 + 今缫 60 = 110 < 170(工艺落丝桶数)→ 今落 0、今存 110 |
| 计算缫丝时长 | ✅ 机组1(单班)9 h、机组2(甲乙班均有今缫)18 h,提示「已更新 1 条机组缫丝时长」 |
| 新增默认值 | ✅ 次日带出:上日 2026-10-22、上存 28 包 / 1686 kg、机组上存 110 / 110、每桶茧量 600、落丝桶数 170、标重 18 |
| 唯一性 | ✅ 同「日期 + 车间 + 庄口 + 规格」再存返回 400「已存在相同的煮茧日报!」 |
| 修改 | ✅ 甲班领入 20 → 30 包后:今存 36 + 14 = 50 包 / 1068 + 456 = 1524 kg |
| 删除 | ✅ 删除后列表为该日 0 条、回读返回「煮茧日报不存在或已删除」 |
| 删除后重建无残留 | ✅ 机组桶数 90 / 130 / 0 / 220 未翻倍(三层明细先删后建生效) |
| 测试数据清理 | ✅ 验证用日报已全部删除,未在库中留下业务数据 |
> 验证方式:用 `-p:BaseOutputPath=obj\verify\` 另编一份 Api,在 3001 端口以真实库启动(`ConnectionStrings__Default` + `Kestrel__Endpoints__Http__Url` 覆盖),验证完已停止该实例。
> 3000 端口的后端进程已重启(旧进程无 `api/prod/zjrb` 控制器,首次进入菜单会 404 并提示「请求失败,请稍后重试」);重启后 `GET /api/prod/zjrb/list` 返回 200,`/auth/menus` 生产-前缫为 6 项。
---
## 五、说明与后续
1. **未导入历史数据**:本次没有随附煮茧日报的导出数据(xlsx/csv),故未做 `ProdSeedData` 扩展;如需把 F9 的 `biz_prod_qs_zjrb*` 四张表导入,可按工作进度-13 的 CSV 内嵌 + 幂等策略追加(主表按「日期+车间+庄口+规格」、机组按「日期+机组」、班次按「日期+班次」)。
2. **保存语义更严格**:F9 的 `Zjrb_SaveCommand` 是逐行 upsert(前端删行不会落库),本系统为「整条替换」(三层明细先删后建),行被移除时会真正删除。
3. **机组行不再过滤全 0 行**:与 F9 现用保存命令一致(旧 `CreateZjrbCommand` 会过滤三桶数全 0 的机组行)。
4. **联统茧标重**:读取参数配置 `生产\前缫\煮茧 → 联统茧标重`(当前 18);未配置时重量换算按录入值保留,不会清零。
5. **待接入**:① 计件工资(F9 `CalcLdcct` 用「机组班次今缫桶数 × 每桶茧量」)已具备数据基础,可在薪酬模块直接取用;② 落丝记录联动(F9 用煮茧的每桶茧量/机组落丝桶数回填落丝记录)——本系统落丝记录暂无桶数/每桶茧量字段,需先扩展;③ 报表「煮茧日报月报 / 机组缫丝时长 / 联统茧盈亏」可基于 `ZjrbRecords + ZjrbJizus` 直接做数据源。