# 工作进度-18:仓储 · 生丝 模块操作逻辑对齐 F9 > **协作规则(长期生效)**:**每次对话结尾都要生成工作进度**。 > 即在每轮对话结束前,把本轮完成的内容追加为 `工作进度/工作进度-N.md`,并在文档中保留本条规则,方便下一轮接续。 ## 一、任务目标 新系统(.NET 8 + Vue 3)的生丝模块功能已具备,但**页面操作逻辑与老系统不一致**。 目标:以老系统 `D:\AntaiProject - 副本\trunk\WinClient\F9.Business.WMS\SS` 为基准,把生丝模块的**操作逻辑改成与老系统一模一样**。 对齐范围(本轮确认): - 生丝入库 / 出库的**批次驱动录入** - 生丝**批次报检**的行内操作(过磅 / 包件 / 公量 / 质检 / 纤度检验) - 出入库**主从联动** - 财务审核:**本轮不做**,用户选择后续单独处理 ## 二、核心差异(新系统改造前的问题) | 环节 | 老系统做法 | 新系统改造前 | | --- | --- | --- | | 入库明细 | 点「选择生丝批次」→ 勾选**待入库批次**,自动带出物资 / 批次号 / 批数 / 包件数 / 毛皮净重 | 手动「添加明细」→ 选物资 + 手填批次号 + 手填重量 | | 出库明细 | 点「选择批次 + 包件」→ 勾选批次下未出库包件 | 手动录入,批次与包件脱节 | | 批次状态 | 批次 / 包件级跟踪出库(`Ck_Isck`、`Ck_Baoshu` 等) | 仅按批次号字符串整体置"已出库",包件无跟踪 | | 批号格式 | 正品 10 位数字 / 其他 `31EE-7位` | 无校验 | | 主从联动 | 主表点行 → 下方明细联动 | 无,明细只在编辑弹窗 | | 批次报检操作 | 过磅 / 包件 / 公量 / 质检 / 纤度检验 5 个行内操作 | 只有编辑、删除 | | 规格 | 下拉选择(生丝规格) | 手填文本框 | | 生产车间 | 取职责类型为「前缫」的车间 | 取全部部门,未筛选 | ## 三、数据模型变更 ### 新增字段(`Domain/Entities/Wms/Wms.cs`) | 实体 | 新增字段 | 对应 F9 | | --- | --- | --- | | `WmsPici` | `RkItemId`、`RkDate`、`CkLastDate`、`CkBaoshu`、`CkJingzhong`、`KcBaoshu` | `Rk_Item_Id`、`Rk_Date`、`CK_LastDate`、`Ck_Baoshu`、`Ck_Jingzhong`、`Kc_Baoshu` | | `WmsPiciBaojian` | `CkIsck`、`CkItemId`、`CkDate`、`CkJingzhong` | 包件级出库标记 | | `WmsRukuDetail` | `PiciIds` | `SS_Rk_Item.PiciIds` | | `WmsChukuDetail` | `PcAndBjIds` | `SS_Ck_Item.PcAndBjIds` | ### 新增实体 | 实体 | 表 | 说明 | | --- | --- | --- | | `WmsPiciChuku` | `WmsPiciChukus` | 批次出库记录(回滚时按此重算库存状态) | | `WmsPiciQc` | `WmsPiciQcs` | 批次质检 | | `WmsPiciQcXdjy` | `WmsPiciQcXdjys` | 批次纤度检验 | ### 建表 / 加列(`DbSeeder.cs`) - 新表:由 `SyncStructure` 反射扫描 `BaseEntity` 子类自动建立 - 旧表加列:`EnsureColumn` 兜底(幂等,列已存在则忽略) ## 四、后端改动 ### 1. 状态流转(`WmsService.cs`,对齐 F9 CQRS) - **入库**:`UpdatePiciRukuAsync` 按 `PiciIds` 置批次"已入库",写 `RkItemId` / `RkDate`,`KcBaoshu = Baoshu` - **入库回滚**:`RollbackPiciRukuAsync`,若批次已出库则抛错禁止修改 / 删除 - **出库**:`UpdatePiciChukuAsync` 按 `PcAndBjIds`(JSON)标记包件 `CkIsck`,写 `WmsPiciChuku`;批次按出库包件数流转「部分出库 / 已出库」 - **出库回滚**:`RollbackPiciChukuAsync` 撤销包件标记、删除出库记录、按剩余记录重算批次状态 - **校验**:待入库不可出库、已全部出库不可再出库 > 注意:`PcAndBjIds` 前端序列化为 camelCase(`piciId` / `piciBaojianIds`), > 反序列化时必须带 `PropertyNameCaseInsensitive = true`,否则字段匹配不上。 ### 2. 批号格式校验(`SavePiciAsync`) 对齐 F9 `Page_PiciBaojian_Edit`: - 正品(`CodeType = 0`):`^\d{10}$` - 其他(`CodeType = 1`):`^31EE-\d{7}$` ### 3. 新增接口(`WmsController.cs`) | 方法 | 路由 | 说明 | | --- | --- | --- | | GET | `/api/wms/pici/chuku-select` | 出库选批次(含未出库包件),支持按物资过滤、排除已选批次 | | GET | `/api/wms/pici/qc/{piciId}` | 读取批次质检 | | POST | `/api/wms/pici/qc` | 保存批次质检 | | GET | `/api/wms/pici/xdjy/{piciId}` | 读取纤度检验 | | POST | `/api/wms/pici/xdjy` | 保存纤度检验 | ### 4. 入库主表补"包数" `WmsRukuListDto` 新增 `BaojianNum`,由明细 `BaojianNum` 汇总(出库主表老系统无包数列,故未加)。 ## 五、前端改动 ### 1. 新建 `PiciSelectDialog.vue` 生丝批次选择弹窗,两种模式复用: - `mode="ruku"`:拉待入库批次(`GET /wms/pici?kcStatus=1`),勾选批次 - `mode="chuku"`:拉批次 + 包件(`GET /wms/pici/chuku-select`),展开行勾选包件, 批次勾选 ↔ 包件勾选双向联动,已出库包件禁用 ### 2. `RukuPanel.vue`(生丝入库) - 明细工具栏:生丝改为「选择生丝批次」,不再自动加空白行 - 入库类型:仅显示「生产(0) / 退货(1)」(对齐 F9"其他暂未开放") - 按物资分组生成明细,回填 `piciIds` / `piciCodes` / 批数 / 包件数 / 毛皮净重 - 物资、批次号、包件数改为**只读**(由批次带出) - 主表:新增「包数」列;新增展开行主从联动 - 保存校验:生丝明细必须有 `piciIds` ### 3. `ChukuPanel.vue`(生丝出库) - 明细工具栏:生丝改为「选择批次包件」 - 出库类型:仅显示「销售(1)」 - 往来单位(客户)改标签为「往来单位」并**必选** - 明细回填 `pcAndBjIds`(JSON `[{piciId, piciBaojianIds}]`) - 主表:展开行主从联动 ### 4. `SsPici.vue`(批次报检) - 行内操作补齐:**过磅 / 包件 / 公量 / 质检 / 纤度检验** - 过磅:仅「待入库」状态可用(否则提示并阻止) - 包件、公量:复用批次编辑弹窗(编辑包件毛皮重 / 回潮率) - 质检:新增质检弹窗(对接 `/wms/pici/qc`) - 纤度检验:新增明细表格弹窗(对接 `/wms/pici/xdjy`) - **规格**:由手填 `el-input` 改为 `el-select`,数据来自 `GET /shengsiguige/all` (与 `prod/lsjl` 落丝记录取数口径一致) - **生产车间**:由"全部部门"改为**仅取职责类型为「前缫」的车间** ```js import { depOptions, DUTY } from '../../../utils/departments'; const opts = await depOptions({ duty: [DUTY.前缫] }, { flat: true }); deptOptions.value = opts.map((o) => ({ id: Number(o.key), name: o.value, ...(o.raw || {}) })); ``` 列表列名同步改为「生产车间」 - 保存校验补齐(对齐 F9 `AddValidateRuls`):日期、规格、品名(生丝规格)、批号、基地外购 > 变量名注意:组件内部门列表变量已改名 `deptOptions`,避免与工具函数 `depOptions` 重名冲突。 ## 六、涉及文件 **后端** - `backend/F9WebAiTest.Domain/Entities/Wms/Wms.cs` - `backend/F9WebAiTest.Application/Dtos/Wms/WmsDtos.cs` - `backend/F9WebAiTest.Application/Services/Wms/WmsService.cs` - `backend/F9WebAiTest.Api/Controllers/Wms/WmsController.cs` - `backend/F9WebAiTest.Infrastructure/Data/DbSeeder.cs` **前端** - `web/src/views/wms/components/PiciSelectDialog.vue`(新建) - `web/src/views/wms/components/RukuPanel.vue` - `web/src/views/wms/components/ChukuPanel.vue` - `web/src/views/wms/components/SsPici.vue` ## 七、验证情况 - 后端 `F9WebAiTest.Application` 编译通过:**0 错误** - 解决方案整体编译的报错均为 `MSB3021 / MSB3027`(**后端 API 进程正在运行,DLL 被锁定无法复制**),非代码问题 - 前端 lint:0 错误 ## 八、待办 / 遗留 1. **财务审核 / 反审核**:老系统生丝出入库均有「财务审核状态」列与批量审核 / 反审核按钮, 新系统尚未实现(本轮用户选择暂缓,后续单独处理) 2. 生丝出库「选择调拨通知单」自动填充明细:老系统有(`Page_Dbtz_Select`),新系统未实现 3. 老系统批次报检的「混装」功能在 F9 中已被注释,故未移植 ## 九、下次接续提示 - 重启后端服务后,新表 / 新列才会在启动时建立 - 继续做财务审核时,需新增通用审核记录与生丝出入库审核接口,并在两个列表页加「财务审核状态」列 + 批量审核 / 反审核按钮 - **每轮对话结尾记得生成本工作进度文档**