新增工资/仓储/生产日报等模块,移除旧考勤模块

- 新增 PayRoll(工资)、Wms(仓储)、Prod(车速/缫丝/考勤/丝片检测/丝片台账/纤检日报/质量日报) 模块
- 新增对应 Domain 实体、Application DTO/Service、Api Controller 与前端页面
- 移除旧 Attendance 考勤模块(Controller/Service/Entity/DTO 及 5 个前端页面),由 Prod/Kaoqin 取代
- 调整路由、仪表盘、Lsjl 流丝记录实体与服务
- 更新业务种子数据与 DbSeeder
- 补充工作进度文档 14-27
This commit is contained in:
yanpeng200212
2026-10-27 09:09:57 +08:00
parent 69c4052a64
commit 1f1b184411
119 changed files with 21576 additions and 1668 deletions
+153
View File
@@ -0,0 +1,153 @@
# 工作进度-19:生产 · 选剥茧 模块移植(后端完成)
> **协作规则(长期生效)**:**每次对话结尾都要生成工作进度**。
> 即在每轮对话结束前,把本轮完成的内容追加为 `工作进度/工作进度-N.md`,并在文档中保留本条规则,方便下一轮接续。
## 一、任务目标
将老系统「生产 - 选剥茧」模块移植到新系统。老系统位置:`D:\AntaiProject - 副本\trunk\WinClient\F9.Business.Prod\XBJ`。
模块构成(老系统两个子功能 + 三张表):
| 老系统 | 说明 |
| --- | --- |
| `XBJ\XJRB\Page_Xjrb.cs` | **选茧日报**:某日某工艺庄口一条,记录干茧领入与 8 类茧 |
| `XBJ\XJRB\Page_XjrbPlan.cs` | **选茧计划**:按领料单(原料出库单)下达,含计划盈亏与完成标记 |
| `XBJ\XJRB\Page_XjrbItem_Edit.cs` | **计划明细**:挂在计划下的每日选茧进度行 |
| `XBJ\XJBZ\Page_xjpbbanzu.cs` | **选茧班组**:班次(甲/乙)+ 选茧组,含班组职工 |
新系统此前**没有**该模块(`prod/zjrb` 是煮茧日报,不是选茧日报),需从零建。
## 二、核心业务规则(移植关键,务必照此实现)
### 1. 选茧日报字段(8 类茧 + 退回)
干茧领入(包数/重量)、联统茧、好五级茧、六级茧、绵茧、双宫茧、下脚茧、茧衣、茧花(各包数/重量)、
退回(包数/重量)、合计重量、联统率、盈亏。
合计重量 = 上述 8 类重量之和(**不含退回、不含领入**)。
### 2. 盈亏 / 联统率计算(对齐 F9 `GetXjrbCountYingkuiQuery` + `GetXjrbLingruStartDateQuery`)
```
步骤 1 起始日期(GetLingruStartDate):
history = 同庄口 且 Date < 当前日期 的日报,按日期降序(排除自身)
startDate = 当前日期
for item in history(由新到旧):
if item.LiantongRate != 0: break // 遇第一条已结算记录停止
startDate = item.Date // 否则继续往前推
步骤 2 累计区间 = [startDate, 当前日期] 闭区间(排除自身)
步骤 3 累加(初值 = 当前表单输入值):
ltj = 当前联统茧重量 + Σ item.LtjZhongliang
yllr = 当前干茧领入重量 + Σ item.Yl_lr_zhongliang
all = 当前 8 类重量之和 + Σ item 同样 8 类重量之和
步骤 4 公式:
联统率 = yllr != 0 ? (ltj / yllr) * 100 : 0
盈亏 = all - yllr
```
**要点**:起始日期不是简单取"上月结存日",而是**往回跳过所有 `LiantongRate == 0`(未结算)的记录**,
遇到第一条已结算记录才停 —— 这是最容易实现错的地方。
### 3. 计划维度盈亏(口径与日报**不同**)
```
联统率 = 联统茧包数 ÷ (联统+好五级+五级+双宫+下脚+茧衣+茧花 包数之和) × 100 ← 按「包数」
盈亏 = 累计选出总重量 − 计划原料领入重量(YlZhongliang)
```
> 老系统仓储里 `wjjBaoshu` / `wjjZhongliang` 的源字段**交叉写反**(疑似 bug),
> 本移植**已按正确字段聚合**(`SUM(WjjBaoshu)`→包数、`SUM(WjjZhongliang)`→重量),
> 若业务上必须与老系统完全一致(含 bug),可改回。
### 4. 标包重(老系统在客户端计算,尚未移植)
老系统从注册表 `生产\选剥茧` 读取各品类标包重,**重量 = 包数 × 标包重**:
| 注册表键 | 说明 |
| --- | --- |
| 联统茧标包重 | |
| 好五级茧标包重 | |
| 六级茧标包重 | |
| 棉茧标包重 | |
| 双宫茧标包重 | |
| 下脚茧标包重 | |
| 茧衣标包重 | |
茧花、退回**无**标包重,手工录入。
前端实现时需提供该配置入口(新系统暂无等价的注册表服务,待定:可做成常量配置或新增配置表)。
### 5. 选茧班组
- 班组 = 班次(甲/乙)+ 选茧组;班组职工来自「选剥茧车间」下工种为「选茧工」的在职职工
- **没有独立新增入口**:由「编辑录入」勾选职工 + 填组别后整体保存(按班次覆盖:先清该班次旧职工与班组,再重建)
- 计划完成(`IsFinish`)后禁止修改/删除明细
## 三、本次完成(后端)
### 新建文件
| 文件 | 内容 |
| --- | --- |
| `Domain/Entities/Prod/Xjrb.cs` | `XjrbRecord` / `XjrbPlan` / `XjrbItem` 三个实体(表 `XjrbRecords`、`XjrbPlans`、`XjrbItems`) |
| `Domain/Entities/Prod/XjpbBanzu.cs` | `XjpbBanzu` / `XjpbBanzuZhigong`(表 `XjpbBanzus`、`XjpbBanzuZhigongs`) |
| `Application/Dtos/Prod/XjrbDtos.cs` | 日报 / 计划 / 明细 / 班组 的列表与保存 DTO,含 `XjrbYingkuiDto` |
| `Application/Services/Prod/XjrbService.cs` | `IXjrbService` + 实现(盈亏、计划、班组全部逻辑) |
| `Api/Controllers/Prod/XjrbController.cs` | 路由前缀 `api/prod/xjrb` |
### 修改文件
- `Application/DependencyInjection.cs`:新增 `services.AddScoped<IXjrbService, XjrbService>();`
(新系统 DI 是**手动注册**,不是反射扫描,新增 Service 必须补这一行)
### 接口清单(`api/prod/xjrb`)
| 方法 | 路由 | 说明 |
| --- | --- | --- |
| GET | `` | 日报分页(start / end / like 庄口关键字) |
| GET | `{id}` | 日报详情 |
| POST | `` | 保存日报 |
| DELETE | `{id}` | 删除日报 |
| POST | `count-yingkui` | 计算盈亏 / 联统率(保存前调用回填表单) |
| GET | `plan` | 计划分页 |
| GET | `plan/{id}` | 计划详情 |
| POST | `plan` | 保存计划 |
| DELETE | `plan/{id}` | 删除计划(已完成则拒绝) |
| GET | `plan/{planId}/items` | 计划明细列表 |
| POST | `plan/item` | 保存明细(勾选完成后回写计划盈亏) |
| DELETE | `plan/item/{id}` | 删除明细 |
| POST | `plan/count-yingkui` | 计划维度盈亏 |
| GET | `banzu` | 班组分页 |
| GET | `banzu/{id}/zhigong` | 班组职工 |
| POST | `banzu/zhigong` | 班组「编辑录入」批量保存 |
## 四、踩坑记录
1. **`BaseEntity` 的命名空间**:在 `F9WebAiTest.Domain.Common`,实体文件必须
`using F9WebAiTest.Domain.Common;`,光有 `FreeSql.DataAnnotations` 不够(会报 CS0246)。
2. **DI 手动注册**:新增 Service 必须在 `DependencyInjection.cs` 里 `AddScoped`,否则运行时报未注册。
3. **编译 Api 会被运行中的进程锁死 DLL**(MSB3021 / MSB3027)。
验证代码是否编译通过的正确做法:筛选 `error CS`(忽略 MSB),或单独编译 Application 项目。
## 五、验证情况
- `F9WebAiTest.Application` 编译:**已成功生成**
- `F9WebAiTest.Api` 编译:无 `error CS`(Controller 通过)
- 新表由 `DbSeeder.SyncStructure` 反射扫描 `BaseEntity` 子类**自动建表**,无需手写迁移
## 六、待办(下一轮)
1. **前端页面**(`web/src/views/prod/xuanjian/`):
- 选茧日报列表 + 编辑弹窗(含「计算盈亏」按钮,调用 `count-yingkui` 回填)
- 选茧计划列表 + 计划明细(主从联动)
- 选茧班组(班组列表 + 职工联动 + 「编辑录入」弹窗)
2. **标包重配置**:确定新系统的存放方式(建议做成系统配置或常量),前端按 `重量 = 包数 × 标包重` 自动算
3. **路由 + 菜单**:`web/src/router/index.js` 加路由,菜单种子数据加「生产 - 选剥茧」
4. 「编辑录入」取职工:需要「选剥茧车间 + 选茧工工种」筛选员工的接口(需确认新系统员工/工种接口)
5. 重启后端服务后新表才会建立
## 七、下次接续提示
- 前端实现时,选茧日报的**「计算盈亏」按钮是核心交互**:填完包数/重量后点它,把返回的
`liantongRate` / `yingkui` / `startDate`(提示"从 xxx 开始计算")回填到表单,再保存
- 计划明细勾选「选茧完成」保存时会直接把计划置为已完成并回写盈亏,之后不可再改
- **每轮对话结尾记得生成本工作进度文档**