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

234 lines
12 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.
# 工作进度-17:仓储模块(WMS)五模块移植
## 一、任务目标
把 `D:\AntaiProject - 副本\trunk\WinClient\F9.Business.WMS` 下的五个子模块**按原业务逻辑一模一样**移植到本系统,UI 做适度美化:
| 模块 | 原 F9 目录 | 本系统菜单 |
| --- | --- | --- |
| 原料 | `F9.Business.WMS\Yuanliao` | 仓储 / 原料 |
| 副产品 | `F9.Business.WMS\Fuchanpin` | 仓储 / 副产品 |
| 中间品 | `F9.Business.WMS\ZJP` | 仓储 / 中间品 |
| 生丝 | `F9.Business.WMS\SS` | 仓储 / 生丝 |
| 物资 | `F9.Business.WMS\WJ` | 仓储 / 物资 |
## 二、建模方案(统一模型 + 模块/口径区分)
五个模块的单据结构高度一致,因此没有建 5 套重复表,而是一套表 + 两个维度:
- `Wms_Module_Enum`:原料=1 / 副产品=2 / 中间品=3 / 生丝=4 / 物资=5
- `Kind`:0=库存台账,1=笼筒架台账(中间品专用)
### 新增实体(Domain/Entities/Wms/Wms.cs)
| 实体 | 表 | 说明 |
| --- | --- | --- |
| `WmsRuku` / `WmsRukuDetail` / `WmsBangmadan` | `WmsRukus` / `WmsRukuDetails` / `WmsBangmadans` | 入库单、入库明细、磅码单 |
| `WmsChuku` / `WmsChukuDetail` | `WmsChukus` / `WmsChukuDetails` | 出库单、出库明细 |
| `WmsKcTzDate` / `WmsKcTzItem` | `WmsKcTzDates` / `WmsKcTzItems` | 库存台账(日期 + 明细) |
| `WmsPici` / `WmsPiciBaojian` | `WmsPicis` / `WmsPiciBaojians` | 生丝批次、包件 |
| `WmsKucun` | `WmsKucuns` | 物资库存(按物资目录) |
| `WmsCaigou` | `WmsCaigous` | 原料采购 |
| `WmsFbplan` / `WmsFbjl` | `WmsFbplans` / `WmsFbjls` | 原料翻包计划 / 翻包记录 |
| `WmsCgplan` / `WmsCgplanItem` | `WmsCgplans` / `WmsCgplanItems` | 物资采购计划 / 明细 |
### 台账项目口径(与 F9 一致)
- 原料:按**原料庄口**;中间品笼筒架台账:按**工艺庄口**(且只统计「联统茧」物资)
- 其余:按**物资目录**;生丝额外按 `SubKey`(基地 / 外购)分组
### 两列数值口径
- 原料 / 副产品 / 中间品 / 生丝:**件数 / 净重**(生丝件数列取「批数」)
- 物资:**数量 / 金额**
## 三、对齐 F9 的业务规则
### 1. 单据类型枚举(完整照搬 F9)
| 模块 | 入库类型 | 出库类型 |
| --- | --- | --- |
| 原料 | 采购1 / 调拨2 / 其他3 | 领料1 / 销售2 / 样茧3 / 其他4 |
| 副产品 | 生产1 / 试缫2 / 其他5 | 销售1 / 调拨2 / 其他3 |
| 中间品 | 选茧0 / 试缫2 / 退料3 / 其他5 | 领料0 / 销售1 / 其他2 |
| 生丝 | 生产0 / 退货1 / 其他2 | 销售1 / 其他5 |
| 物资 | 采购1 / 冲账2 / 盘盈3 / 其他4 | 领料1 / 销售2 / 调拨3 / 报废4 / 其他5 |
### 2. 重量 / 金额计算
- 磅码单:净重 = 毛重 − 皮重;明细件数 / 毛重 / 皮重 / 净重由磅码单汇总
- 明细净重 = 毛重 − 皮重 − 包装重量 − 运损(未使用的项为 0)
- 物资:金额 = 数量 × 单价;库存单价 = 库存金额 ÷ 库存数量(4 位小数)
- 物资出库金额(`WJ_Chuku_Detail.CalJine`):
- 出库数量 = 库存数量 → 金额 = 库存金额,单价 = 金额 ÷ 数量
- 否则 → 单价 = 库存单价,金额 = 数量 × 单价
- 物资出入库实时更新库存(加权平均单价);删除 / 修改单据时回滚,保证严格对称
### 3. 库存台账生成(`YL_Kucun_Taizhang_Edit.GenerateTaizhang / CalTdayJiecun`)
- 上日结存:取上一台账中「件数或净重不为 0」的行
- 汇总区间:`LastDate + 1天` ~ `TzDate`(笼筒架台账为 `LastDate` ~ `TzDate`,与 F9 的 Yesterday~Date 一致)
- 无上一台账时 `LastDate = 1970-01-01`(与 F9 `Page_YL_Kucun_Taizhang.cs` 一致,首份台账汇总全部历史)
- 今日结存件数 = 上日 + 入库 − 出库
- 今日结存重量 = Round(上日 + 入库 − 出库 + 盈亏, 2, AwayFromZero)
- 全部出库 = 上日结存 ≠ 0 且今日结存 = 0;勾选后把结存转入盈亏(取消则转回)
- 只能生成**晚于**最新台账日期的台账
### 4. 台账保存校验(与 F9 一致)
- 结存重量恒等式:`上日 + 入库 − 出库 + 盈亏 = 今日结存`
- 结存重量不能小于 0
- 原料:全部出库时样茧件数必须为 0
### 5. 生丝批次包件
- 净重 = 毛重 − 皮重;公量 = 净重 × (1 + 11%) ÷ (1 + 实测回潮率%)
- 批次库存状态:待入库1 / 已入库2 / 部分出库3 / 已出库4;生丝出库后按批次号更新为「已出库」
### 6. 物资扩展
- 采购计划(草稿 / 已确认 / 已完成)+ 计划明细
- 采购报销:入库单 `BxStatus` 无0 / 待报销1 / 已报销2,支持批量报销
- 库存查询、出入库流水(入库为正、出库为负)
## 四、后端实现
| 文件 | 说明 |
| --- | --- |
| `Domain/Entities/Wms/Wms.cs` | 全部 WMS 实体与 `Wms_Module_Enum` |
| `Application/Dtos/Wms/WmsDtos.cs` | 出入库 / 明细 / 磅码单 / 台账 / 批次 / 采购 DTO |
| `Application/Services/Wms/WmsService.cs` | 统一服务:五模块出入库、台账、库存、流水、批次、采购 |
| `Api/Controllers/Wms/WmsController.cs` | `api/wms/*` 接口 |
| `Application/DependencyInjection.cs` | 注册 `IWmsService` |
| `Infrastructure/Data/DbSeeder.cs` | 一级菜单「仓储」+ 5 个子菜单;清理软删残留 |
### 接口清单(`/api/wms`)
```
GET /options?module= 类型 / 物资 / 原料庄口 / 工艺庄口 / 部门 / 往来单位
GET /ruku?module=&start=&end=&type=&like=
GET /ruku/{id} POST /ruku DELETE /ruku/{id}
POST /ruku/baoxiao 采购报销(物资)
GET /chuku?... GET /chuku/{id} POST /chuku DELETE /chuku/{id}
GET /taizhang/dates?module=&kind=
GET /taizhang?module=&kind=&date=&regenerate=
POST /taizhang DELETE /taizhang/{id}
GET /kucun?module= GET /crk?module=&start=&end=&wzmlId=
GET /pici GET /pici/{id} POST /pici DELETE /pici/{id}
GET /caigou POST /caigou DELETE /caigou/{id}
GET /fbplan POST /fbplan DELETE /fbplan/{id}
GET /cgplan GET /cgplan/{id} POST /cgplan DELETE /cgplan/{id}
```
### 设计要点
- 单据编号(模块 + 日期 + 单号)唯一,重复时返回友好提示
- 出入库单、批次采用**物理删除**:避免软删残留撞唯一索引而无法重建同号单据
- 启动时清理历史软删残留(`WmsRukus` / `WmsChukus` / `WmsPicis`)
## 五、前端实现
| 文件 | 说明 |
| --- | --- |
| `views/wms/moduleConfig.js` | 五模块差异化配置(项目口径、字段显示、数值口径、枚举选项) |
| `views/wms/components/RukuPanel.vue` | 通用入库(含磅码单弹窗、明细合计) |
| `views/wms/components/ChukuPanel.vue` | 通用出库(物资显示库存数、自动算金额) |
| `views/wms/components/TaizhangPanel.vue` | 通用台账(生成 / 编辑 / 盈亏 / 全部出库 / 保存 / 删除) |
| `views/wms/components/WjKucun.vue` | 物资库存 |
| `views/wms/components/WjCrk.vue` | 物资出入库流水 |
| `views/wms/components/WjCgplan.vue` | 物资采购计划 |
| `views/wms/components/WjCgbx.vue` | 物资采购报销 |
| `views/wms/components/SsPici.vue` | 生丝批次 + 包件(公量自动计算) |
| `views/wms/components/YlCaigou.vue` | 原料采购 |
| `views/wms/components/YlFbplan.vue` | 原料翻包计划 + 翻包记录 |
| `views/wms/{yuanliao,fuchanpin,zjp,ss,wj}/index.vue` | 五个模块页面(Tab 组织) |
| `router/index.js` | 注册 5 个页面组件 |
### UI 优化点
- 统一卡片式布局 + Tab 分区,顶部带模块说明
- 查询栏(日期区间 / 类型 / 关键字)与操作按钮分离,右侧对齐
- 单据编辑弹窗:表头 4 列栅格表单,明细用可编辑表格(下拉 + 数字框),底部实时合计
- 磅码单独立弹窗,自动算净重并汇总
- 台账:结存列加粗高亮,盈亏 / 全部出库可交互,底部合计条
- 状态用 `el-tag` 着色(库存状态、报销状态、翻包状态、采购计划状态)
## 六、菜单
一级菜单「仓储」(`/wms`,排序 9,位于「薪资」之后),五个子菜单:
| 名称 | 路径 | 组件 |
| --- | --- | --- |
| 原料 | `/wms/yuanliao` | `wms/yuanliao/index`(入库 / 出库 / 库存台账 / 原料采购 / 翻包计划) |
| 副产品 | `/wms/fuchanpin` | `wms/fuchanpin/index`(入库 / 出库 / 库存台账) |
| 中间品 | `/wms/zjp` | `wms/zjp/index`(入库 / 出库 / 库存台账 / 笼筒架台账) |
| 生丝 | `/wms/ss` | `wms/ss/index`(入库 / 出库 / 库存台账 / 批次包件) |
| 物资 | `/wms/wj` | `wms/wj/index`(入库 / 出库 / 库存台账 / 库存 / 出入库流水 / 采购计划 / 采购报销) |
## 七、验证结果(全流程脚本自动执行,已清理测试数据)
```
[1] 登录 OK
[2] 菜单:仓储 children=5(原料 / 副产品 / 中间品 / 生丝 / 物资)
[3] 选项:原料模块 入库类型3 / 出库类型4 / 原料庄口347 / 物资1000
[4] 原料入库:件数10 净重945(1000−50−5)✓
[5] 原料出库:件数4 净重380 ✓
[6] 台账生成:上日0 + 入库10/945 − 出库4/380 = 结存6/565 ✓
[7] 台账保存 ✓
[8] 次日台账:上日结存6/565 正确结转 ✓
[9] 物资入库:库存 100 / 1000 / 单价10 ✓
[10] 物资出库40:库存 60 / 600 / 单价10(CalJine 规则)✓
[11] 生丝批次:净重120 公量119.46(59 + 60.46)✓
[12] 原料采购 ✓ [13] 翻包计划 ✓ [14] 采购计划 ✓ [15] 批量报销 count=1 ✓
[16] 清理完成,物资库存归零 ✓
```
第二批(副产品 / 中间品 / 生丝 + 笼筒架台账):
```
[2 副产品] 入库6/570 出库2/190 结存4/380 ✓
[3 中间品] 入库6/570 出库2/190 结存4/380 ✓
[4 生丝] 入库2批/570 出库1批/190 结存1批/380(按基地分组)✓
[3 笼筒架台账] 按工艺庄口统计 结存4/380 ✓
```
- 后端 `dotnet build`:0 错误
- 前端 `npm run build`:构建成功
- 服务运行中:后端 `http://localhost:3000`、前端 `http://localhost:5173`
## 八、后续修正(2026-10-26)
1. **「在制品」更名为「中间品」**
- 枚举 `Wms_Module_Enum.在制品` → `中间品`(数据库存值仍为 3,不影响历史数据)
- 菜单「仓储 / 中间品」、页面标题、模块配置同步更名
2. **按仓储区分物资分组**
- 物资分组 `WuziGroup.BusinessType`:原料1 / 中间品2 / 生丝3 / 副产品4 / 五金5
- `/api/wms/options?module=` 只返回本模块所属分组的物资:
| 仓储模块 | 分组业务类型 | 物资数(现有数据) | 示例 |
| --- | --- | --- | --- |
| 原料 | 原料(1) | 2 | 0101 优茧、0102 普茧 |
| 副产品 | 副产品(4) | 39 | 040101 好五级茧 … |
| 中间品 | 中间品(2) | 1 | 0301 联统 |
| 生丝 | 生丝(3) | 6 | 070101 正品丝20/22 … |
| 物资 | 五金(5) | 952 | 02010063 轴承盒 … |
- 笼筒架台账的物资过滤同步改为匹配名称含「联统」的物资(原为「联统茧」)
3. **修复「新增页面点击确认保存报错」**
- 原因:下拉框清空后前端提交 `null`,而后端 DTO 的 `long/int/decimal` 不接受 `null`,
`System.Text.Json` 直接返回 400(`The JSON value could not be converted to System.Int64`)
- 修复:新增 `cleanPayload()`(`views/wms/moduleConfig.js`),提交前把 `null/undefined` 统一转成 `0`
(`scDate`、`guobangShijian`、`ckTime` 等日期型保持 `null`),所有 WMS 保存接口统一走该函数
- 验证:中间品入库(件数3 净重285=300−15)、物资入库(10×5=50)均保存成功,测试数据已清理
## 九、说明与后续可选项
- 笼筒架台账只统计名称含「联统茧」的物资(与 F9 一致;未配置该物资时不过滤)
- 生丝公量按 11% 公定回潮率计算(F9 标准值)
- 已对齐 F9 的五个模块核心逻辑;如后续需要,可再补充:
- 生丝混装(`SS_Pici_Hunzhuang`)
- 物资调拨单、报废单的独立审批流
- 各模块台账的报表打印模板