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

154 lines
7.8 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.
# 工作进度-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 开始计算")回填到表单,再保存
- 计划明细勾选「选茧完成」保存时会直接把计划置为已完成并回写盈亏,之后不可再改
- **每轮对话结尾记得生成本工作进度文档**