日期: 2026-07-28
状态: 已确认
范围: web-admin(前端为主,复用现有储物格列表接口)
关联模块: 生产任务产出(细胞产品)、细胞产品管理
生产任务「任务执行」→「产出(细胞产品)」新增弹窗中,入库明细按「入库份数」生成多行。业务侧常出现:
现有能力:每行独立远程下拉选格;表单内不可重复;已占用格置灰;支持「造血干一键填充」(与本需求无关)。
在新增入库明细区域提供两类快捷操作:
| 能力 | 说明 |
|---|---|
| 复制首行属性 | 将第 1 行的规格、预计细胞数量、活率复制到其余行 |
| 储物格起止批量填充 | 选择同盒起始格与结束格,填充当前仍为空的储物格行;支持多次执行以跨盒 |
编辑单条产出时不展示入库明细表,故不提供上述按钮。
| 维度 | 决策 |
|---|---|
| 储物格填充交互 | 起始 + 结束 |
| 份数与区间数量 | 区间可用格数 ≥ 空行数 N 时取前 N 格;不足则失败提示 |
| 区间内占用格 | 不允许;区间内任一占用则整段失败 |
| 跨盒 | 单次必须同盒;跨盒通过多次填充(每次只填空行) |
| 已选储物格的行 | 不覆盖;只填 storageSlotId 为空的行 |
| 复制字段 | 仅 specName、expectedCellCount、viability |
| 不复制 | 产品编码、代次、储物格 |
| 落地页面 | ① TaskOutputProductDialog.vue ② cell-product/index.vue 新增弹窗 |
「入库明细」标题行右侧(product-lines-head),新增两个描边按钮(带图标,符合按钮图标规范):
仅 !isEdit 且存在入库明细表时显示。
小型 el-dialog(或内嵌确认区),字段:
el-select(可检索编号)底栏:取消 / 确定(Close / Check 图标)。
遮罩无背景模糊;label-position="top"。
specName、expectedCellCount、viability,写入第 2…n 行允许首行三字段为空(仍复制空值,便于统一清空)。
N = 明细中 storageSlotId 为空的行数
若 N = 0 → 提示「没有可填充的空行」并结束
用户选择 startId、endId
若未选齐 → 校验提示
通过 facilityNodeId 判断 start、end 是否同盒
若不同盒 → 提示「起始与结束须在同一盒子内」
请求 fetchStorageSlotList({ facilityNodeId }) 获取同盒全部格子
按现有盒内排序(order_num / 行列,与 storage-slot-options 一致)排序
在有序列表中定位 start、end 下标
若找不到 → 提示格不存在
若 startIndex > endIndex → 交换或按「从起始到结束」失败提示(推荐:自动按较小下标到较大下标取闭区间,避免用户选反)
range = slots[from..to](闭区间)
若 range 中任一格不可用(非空 / occupied)→ 提示「区间内存在已占用储物格,请调整起止范围」
fromFormUsed = 本表单所有行已选的 storageSlotId(含非空行)
availableInRange = range 中 id 不在 fromFormUsed 的格
(注:因只填空行,fromFormUsed 主要排除其他行已选;区间本身已要求全部空闲)
若 availableInRange.length < N → 提示「区间内可用储物格不足(需要 N 个,实际 M 个)」
将 availableInRange 前 N 个依次赋给空行(按明细行从上到下)
将选中格 ensure 进各行下拉 options,保证回显
成功提示:已为 N 行填充储物格
用户可再次点击「批量填储物格」,对新的同盒起止重复 5.2。
每次 N 只统计当前仍为空的行,直至全部填完或用户停止。
提交前仍走:
validateUniqueStorageSlotIds)批量填充赋值后不应触发「误清空」:一次写入互不重复的 id。
前端计算区间(复用 GET /web/admin/storage-facility-slots?facilityNodeId=),不新增区间专用 API。
理由:单次限制同盒,盒内格数量通常有限;规则变更成本低。
| 项 | 路径 |
|---|---|
| 生产任务产出弹窗 | web-admin/src/views/production/production-work-order/TaskOutputProductDialog.vue |
| 细胞产品新增 | web-admin/src/views/production/cell-product/index.vue |
| 可选抽取 | web-admin/src/utils/storage-slot-range-fill.ts(排序、切区间、校验、取前 N) |
两页 UI 与逻辑保持一致;优先抽公共函数避免分叉。
采用:自动规范化闭区间(from = min(iStart,iEnd), to = max(...))。
用户先选编号较大的格再选较小的格也能工作,减少操作摩擦。
远程下拉选项当前可能只有 id/name。实现时需保证能得到 facilityNodeId:
ensure/fetch 补全;或扩展 select-options 返回 facilityNodeId(若响应已有则直接用,见 CRUD _slot_to_dict / select-options 已含该字段时可透出到前端 option 类型)。