# 物料库位功能调整设计方案 ## 一、背景 当前系统在新建、编辑物料时会维护物料的默认库位,并在数据库中写入物料与货位的初始关系。该机制会导致物料主档承担库存库位职责,也会在无真实库存的情况下生成 `货位存量 = 0` 的物料货位记录。 本次需求由仓库主管提出。现场正在进行库存盘点,盘点人员需要依据系统库存数据到对应库位核对物料实物数量、批次和状态。但当前系统内的库存库位设置并非由仓库人员在实际入库、上架或盘点业务中选择确认,而是在物料基础资料维护阶段预先设置,导致系统记录的库位与现场实际存放库位不匹配。该问题会直接影响盘点人员按系统数据查找物料,容易出现找不到物料、盘点库位错误、盘点差异无法快速定位等情况,进而影响库存准确性和仓库现场作业效率。 因此,本次功能调整的核心诉求不是单纯修改一个库位字段,而是将“物料标准库位”从物料主档维护中剥离,把库位确认权回归到仓库实际业务动作中,由仓库人员在入库、上架、调拨、盘点等场景按现场真实情况选择和确认库位,确保系统库存库位能够反映实际库存位置,为当前及后续库存盘点提供可靠的数据依据。
本次调整目标是: 1. 物料主档不再强制维护真实库存库位。 2. 物料标准维护组件不再编辑物料库位。 3. 入库时根据真实库存情况选择库位。 4. 有现有库存库位时优先显示已有库存库位;没有库存库位时显示全库位。 5. 盘点人员后续依据系统库存查询结果进行盘点时,系统库位应尽可能来源于仓库真实业务记录,减少基础资料预设库位造成的现场偏差。 6. 库存盘点组件增加物料存货功能修改,增加物料是可以选择库位 7. 库存查询组件主列表“库位”列显示该物料当前有库存且库存数最多的库位;点击该库位可查看该物料所有有库存的库位及对应库存数。 ## 二、现状核对 ### 2.1 前端现状 物料维护入口: - `src/views/TechnologyCenter/MaterialMaintain/index.vue` - `src/views/TechnologyCenter/MaterialQuery/index.vue` 原逻辑: - 新增/编辑物料弹窗中存在“库位”下拉。 - 新增物料默认设置 `form.库位 = 2514`。 - 表单规则要求库位必填。 - 新增/编辑提交时传递 `货位流水号`。 物料库位维护入口: - `src/views/WarehouseManagement/MaterialLocation/index.vue` 原逻辑: - 页面查询物料主档库位。 - 行内可编辑 `货位流水号`。 - 点击确定后调用 `仓储管理_物料库位_编辑数据`。 入库入口: - `src/views/WarehouseManagement/PurchasePartsStorage/index.vue` 原逻辑: - 采购入库、自制件入库行内可选择库位。 - 已有 `getInventoryLocateName(row)` 方法,可按物料查询库存库位。 - 但无库存库位时没有完整 fallback 到全库位的闭环。 ### 2.2 数据库现状 已核对相关存储过程: - `物料管理_增加` - `物料管理_增加新` - `物料管理_编辑` - `仓储管理_物料库位_编辑数据` - `仓储管理_库存盘点_查询` - `仓储管理_库位_查询` 当前数据库行为: - `物料管理_增加`、`物料管理_增加新` 会把 `@货位流水号` 写入 `库存管理_物料主文件_基本.货位流水号`。 - 新增物料后会向 `库存管理_物料与货位对照表` 插入一条 `货位存量 = 0` 的记录。 - `物料管理_编辑` 会更新 `库存管理_物料主文件_基本.货位流水号`,并同步更新 `库存管理_物料与货位对照表.货位流水号`。 - `仓储管理_物料库位_编辑数据` 会同时更新物料主文件和物料货位对照表。 ## 三、设计原则 1. 物料主档可记录“存放库位/建议库位”,但维护入口不放在物料新建页面,且该库位不等同于真实库存库位。 2. 真实库存库位只由入库、调拨、盘点等库存业务动作产生或调整。 3. 入库库位选择以真实库存记录优先;没有真实库存库位时,可参考物料存放库位或全库位选择。 4. 保留旧接口参数兼容,降低前后端发布顺序风险。 5. 不删除历史库位数据,避免影响历史库存、出入库记录和查询报表。 6. 仓库库位数据应以仓库人员实际作业确认结果为准,避免由技术、基础资料维护环节提前指定库位。 7. 当前库存盘点期间,优先保障盘点人员能够通过系统库存数据定位真实库位;对历史不准确库位数据不做批量自动修正,防止误改真实库存,需要结合盘点结果逐步校正。 8. 库存查询主列表以“库存数最多的库位”作为默认展示库位,降低一物多库位时主表信息分散和误判风险。
## 四、前端改造方案 ### 4.1 物料维护页面 涉及文件: - `src/views/TechnologyCenter/MaterialMaintain/index.vue` - `src/views/TechnologyCenter/MaterialQuery/index.vue` 改造内容: - 新增物料弹窗不显示库位或存放库位字段。 - 编辑物料弹窗不显示库位或存放库位字段。 - 删除 `form.库位` 字段。 - 删除 `库位` 必填校验。 - 删除 `inventoryLocation` 数据源。 - 删除 `getInventoryLocation()` 方法及页面初始化调用。 - 删除新增时默认 `form.库位 = 2514`,避免未选择时自动落到固定库位。 - 新增/编辑提交时传递 `货位流水号 = null`,不在物料建档流程中写入存放库位或真实库存库位。 说明: 物料新建和编辑只维护物料基础属性,不维护库位。这样可以避免技术或基础资料人员在建档阶段提前指定库位,把库位维护职责交还给仓储相关组件。 存放库位仍然允许维护,但入口应放在仓储侧的独立组件或现有物料库位组件中,业务含义是“建议存放位置”,不是库存现存量位置。
### 4.2 新增存放库位功能 承载方案: - 方案 :修改 `src/views/WarehouseManagement/InventoryCheck/index.vue` 库存盘点页面。 改造内容: - 增加物料存货按钮功能修改,在添加时可以选择库位并且库存数可以为0 - 操作列添加删除按钮,将原先编辑按钮库存数是0的库位删除功能调整到删除按钮上,库存数为0时不删除库位 说明: 用于仓库存放物料时原库位放不下时可以给该物料新建一个库位存放物料,当物料不打算放在该库位时确认库存为0便可删除物料与库位的关联,同时库位还打算存放该物料不会应为库存为0删除库位。
### 4.3 入库库位选择 涉及文件: - `src/views/WarehouseManagement/PurchasePartsStorage/index.vue` 改造内容: - 页面创建时加载全库位列表。 - `getLocateName()` 返回 Promise,并统一生成 `{ label, name, value }` 结构。 - `getInventoryLocateName(row)` 按当前物料名称、图号或型号查询 `仓储管理_库存盘点_查询`。 - 查询结果中只保留库存大于 0 的库位。 - 如果存在库存库位: - 当前行 `locateName` 使用库存库位列表。 - 下拉显示格式为 `货位名称(库存:数量)`。 - 设置 `locateSource = 'inventory'`。 - 如果不存在库存库位: - 若物料主档存在存放库位,可优先把该库位排在下拉列表首位,并标记为建议库位。 - 当前行 `locateName` 使用全库位列表。 - 设置 `locateSource = 'all'`。 - 入库提交逻辑保持不变,继续校验并提交 `货位流水号组`。 业务要求: - 仓库人员办理采购入库、自制件入库时,必须根据现场实际上架库位选择系统库位。 - 系统存在该物料真实库存库位时,优先引导仓库人员选择已有库存库位,便于同物料集中存放和后续盘点。 - 系统不存在该物料真实库存库位时,可以参考物料新建时维护的存放库位;仓库人员仍可从全库位中选择本次实际上架库位,形成后续库存查询和盘点依据。 - 盘点发现实物库位与系统库位不一致时,应通过盘点调整、移库或后续明确的库存业务流程修正,不再通过物料基础资料维护直接改库位。
### 4.4 库存查询库位展示与明细查看 涉及文件: - `src/views/WarehouseManagement/InventoryQuery/index.vue` 当前现状: - 主表已有“库位”列,当前展示 `scope.row.货位名称`。 - 主表已有“库存”列,展示该行 `scope.row.库存`。 - 主表已有 `@cell-click="handleEdit"`,当前只处理点击“物料编码”展开出入库记录。 - 页面查询调用 `仓储管理_库存查询_查询`。 改造目标: - 库存查询主列表每个物料只展示一个主库位。 - 主库位取该物料所有有库存库位中库存数最多的库位。 - 用户点击主库位后,弹出或展开该物料所有有库存库位明细。 前端改造内容: - 将“库位”列展示改为可点击文本。 - 库位列显示字段建议为 `最大库存库位名称`,如后端暂不改字段名,也可继续使用 `货位名称`,但后端需保证该字段已经是最大库存库位。 - 点击库位列时调用 `handleLocationClick(row)`。 - 新增库位明细弹窗或 `el-popover`: - 表格列包含 `货位名称`、`货位存量`、`批次编号`、`供应商`、`最后入库日期` 等字段。 - 明细只显示 `货位存量 > 0` 的库位。 - 默认按 `货位存量 DESC` 排序。 - 如果物料只有一个有库存库位,点击仍可显示明细,方便盘点人员查看库存数来源。 后端改造建议: - 新增或调整库存查询明细过程,例如: - `仓储管理_库存查询_物料库位明细_查询` - 入参: - `物料流水号` - 返回: - `物料流水号` - `物料编码` - `物料名称` - `图号或型号` - `货位流水号` - `货位名称` - `货位存量` - `批次编号` - `供应商` - 主查询 `仓储管理_库存查询_查询` 调整为: - 按物料聚合库存。 - 对每个物料取 `货位存量` 最大的库位作为主表 `货位名称`。 - 若多个库位库存数相同,按 `货位流水号` 或 `货位名称` 稳定排序取第一条。 示例 SQL 思路: ```sql WITH LocationRank AS ( SELECT 物料流水号, 货位流水号, 货位名称, 货位存量, ROW_NUMBER() OVER ( PARTITION BY 物料流水号 ORDER BY ISNULL(货位存量, 0) DESC, 货位流水号 ASC ) AS rn FROM 库存管理_物料与货位对照表 LEFT JOIN 库存管理_货位主文件 ON 库存管理_物料与货位对照表.货位流水号 = 库存管理_货位主文件.货位流水号 WHERE ISNULL(货位存量, 0) > 0 ) SELECT * FROM LocationRank WHERE rn = 1; ``` 业务说明: - 主表库位用于快速定位优先盘点库位。 - 明细库位用于处理一物多库位、一物多批次的盘点场景。 - 主表库存仍应为该物料总库存,不能只显示最大库位库存。 ## 五、后端改造方案 新增 SQL 脚本: - `sql/移除物料标准库位维护.sql` 脚本调整对象: - `物料管理_增加` - `物料管理_增加新` - `物料管理_编辑` 调整内容: - 保留 `@货位流水号` 参数,兼容旧调用。 - 新增物料时允许写入 `库存管理_物料主文件_基本.货位流水号`,作为物料“存放库位/建议库位”。 - 新增物料时不再向 `库存管理_物料与货位对照表` 插入 `货位存量 = 0` 的初始记录。 - 编辑物料时默认不更新 `库存管理_物料主文件_基本.货位流水号`,除非后续明确增加“修改存放库位”的独立权限入口。 - 编辑物料时不再更新 `库存管理_物料与货位对照表.货位流水号`。 - 库存查询主过程需按物料聚合真实库存,并返回库存数最多的库位作为主表展示库位。 - 新增库存查询库位明细过程,用于点击主表库位时查看该物料所有有库存库位。 不调整内容: - 入库过程仍继续接收 `货位流水号组`。 - 历史物料主档中的 `货位流水号` 暂不清理,后续作为存放库位参考。 - 历史 `库存管理_物料与货位对照表` 中的 0 库存记录暂不清理。 后端调整边界: - 本次不批量重算历史库存库位,避免在盘点期间引入新的数据扰动。 - 对已产生实际库存的物料库位关系,以库存业务单据和库存现存量记录为准;物料主档存放库位只作为建议或参考。 - 后续若仓库主管确认需要清理历史 `货位存量 = 0` 的无效库位记录,应另行制定数据清理脚本,并在盘点结束或盘点数据确认后执行。
## 六、入库库位选择流程 ```mermaid flowchart TD A["用户点击入库行的库位按钮"] --> B["按物料名称和图号查询库存盘点"] B --> C{"是否存在库存大于 0 的库位"} C -->|是| D["显示已有库存库位"] C -->|否| E{"物料是否维护存放库位"} E -->|是| E1["全库位列表中优先展示存放库位"] E -->|否| E2["显示全库位"] D --> F["用户选择库位"] E1 --> F E2 --> F F --> G["写回行数据: 货位流水号、货位名称"] G --> H["入库提交"] H --> I["提交货位流水号组"] ``` ## 七、库存查询库位展示流程 ```mermaid flowchart TD A["库存查询加载主列表"] --> B["按物料汇总所有有库存库位"] B --> C["按货位存量倒序排序"] C --> D["取库存数最多的库位作为主表库位"] D --> E["用户点击主表库位"] E --> F["查询该物料所有货位存量大于 0 的库位"] F --> G["弹窗展示库位、库存数、批次等明细"] ``` ## 八、影响范围 ### 8.1 受影响页面 - 技术中心物料维护 - 技术中心物料查询 - 仓储管理物料库位 - 仓储管理采购入库 - 仓储管理自制件入库 - 仓储管理库存查询 - 库存盘点人员使用的库存查询和盘点核对结果会间接受益于本次调整,后续新增库存的系统库位将更贴近现场真实库位。
### 8.2 受影响数据库对象 - `库存管理_物料主文件_基本` - `库存管理_物料与货位对照表` - `库存管理_外购件累计库存` - `物料管理_增加` - `物料管理_增加新` - `物料管理_编辑` - `仓储管理_库存查询_查询` - 新增 `仓储管理_库存查询_物料库位明细_查询` ### 8.3 不受影响业务 - 已有入库记录查询。 - 已有出库、领料、调拨中基于真实库存记录的库位逻辑。 - 库位基础资料维护页面 `LocationManagement`。 - 当前历史库存数量不因本次调整自动变化。 - 当前盘点差异数据不因本次调整自动生成或自动消除。
## 九、发布步骤 1. 发布前端代码。 2. 执行 `sql/移除物料标准库位维护.sql`。 3. 清浏览器缓存后进入系统验证。 4. 验证物料新增可选择存放库位,编辑物料不修改真实库存库位。 5. 验证物料库位维护页不可编辑。 6. 验证采购入库和自制件入库的库位选择逻辑。 7. 验证库存查询主表库位显示库存数最多的库位。 8. 验证点击库存查询主表库位可查看该物料所有有库存库位。 9. 由仓库主管或指定仓库人员抽取正在盘点的物料进行核对,确认系统库存库位、入库选择库位和现场实际库位的对应关系。 10. 对盘点期间发现的历史库位不一致数据,记录物料名称、图号、系统库位、实际库位和差异原因,作为后续数据清理或库存调整依据。
推荐前后端同时发布。若不能同时发布,先发布后端脚本更稳妥。 ## 十、验证清单 ### 9.1 物料新增 - 新增弹窗显示“存放库位”。 - 存放库位非必填。 - 新增物料可正常保存。 - 新增时选择存放库位后,`库存管理_物料主文件_基本.货位流水号` 写入该建议库位。 - 新增时不选择存放库位后,`库存管理_物料主文件_基本.货位流水号` 为空。 - 新增后不生成 `货位存量 = 0` 的物料货位对照记录。 ### 9.2 物料编辑 - 编辑弹窗不显示库位。 - 修改名称、图号、单位、材料、类型、物料库等字段可正常保存。 - 编辑时不改变物料已有真实库存库位。 - 编辑时不覆盖物料主档存放库位。 ### 9.3 物料库位查询 - 页面可正常按物料名称、图号、库位查询。 - 页面不显示编辑按钮。 - 双击行不进入编辑状态。 - 不再调用 `仓储管理_物料库位_编辑数据`。 ### 9.4 入库库位选择 - 物料已有库存库位时,下拉只显示已有库存库位。 - 下拉显示库存数量。 - 物料没有库存库位时,下拉显示全库位。 - 未选择库位时不允许入库。 - 选择库位后采购入库可正常提交。 - 选择库位后自制件入库可正常提交。 ### 9.5 盘点业务核对 - 盘点人员按系统库存查询结果查看物料库位时,可以明确区分历史库位数据和后续真实入库库位数据。 - 仓库人员新办理入库后,库存查询或盘点查询中的库位应与入库时选择的实际库位一致。 - 对无真实库存的物料,不应因为物料新增自动生成 `货位存量 = 0` 的库位记录干扰盘点查询。 - 对现场已发现系统库位与实际库位不一致的物料,应形成差异记录,不通过物料主档编辑直接修正。 ### 9.6 库存查询库位展示 - 一物一库位时,主表库位显示该库位。 - 一物多库位时,主表库位显示 `货位存量` 最大的库位。 - 多个库位库存数相同,主表库位按稳定排序规则显示固定结果。 - 主表“库存”列显示物料总库存,不显示单个库位库存。 - 点击主表库位,弹出该物料所有 `货位存量 > 0` 的库位明细。 - 库位明细按库存数倒序显示。 - 库位明细中不显示 0 库存库位。
## 十一、风险与回退 ### 11.1 风险 - 若后端脚本未执行,物料新增时仍可能向物料货位对照表写入 `货位存量 = 0` 的记录。 - 历史 0 库存物料货位记录仍存在,若库存盘点视图没有过滤库存数量,可能仍被查询出来。 - 部分报表如依赖物料主档默认库位,需要明确该字段现在是“存放库位/建议库位”,不代表真实库存库位。 - 当前盘点期间已经暴露的历史库位不匹配问题,不会因本次功能调整自动修复,需要仓库结合盘点结果进行后续校正。 - 若仓库人员入库时未按实际上架位置选择库位,仍可能继续产生新的系统库位与实际库位不一致问题,因此需要同步明确仓库操作要求。 - 库存查询主表改为显示最大库存库位后,用户可能误以为物料只在该库位,需要通过点击明细和文案提示说明“一物可能多库位”。
### 11.2 回退方式 - 前端回退相关 Vue 文件。 - 数据库可用脚本备份中的原存储过程定义恢复。 - 回退后重新构建并发布前端。