- 新增 PayRoll(工资)、Wms(仓储)、Prod(车速/缫丝/考勤/丝片检测/丝片台账/纤检日报/质量日报) 模块 - 新增对应 Domain 实体、Application DTO/Service、Api Controller 与前端页面 - 移除旧 Attendance 考勤模块(Controller/Service/Entity/DTO 及 5 个前端页面),由 Prod/Kaoqin 取代 - 调整路由、仪表盘、Lsjl 流丝记录实体与服务 - 更新业务种子数据与 DbSeeder - 补充工作进度文档 14-27
144 lines
9.6 KiB
Markdown
144 lines
9.6 KiB
Markdown
# 工作进度-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` 直接做数据源。
|