style(borrow): 借还记录表格响应式改造,消除横向滚动与操作列不可达

背景
----
主表共 11 列,原先除 2 列外用 width 硬编码,最小总宽约 1528px;
1440 笔记本可用宽度只有约 1240px(屏幕 - 180 侧边栏 - 20 内边距),
必然撑出横向滚动条,操作按钮被推出屏幕,用户得拖滚动条才能点转交。

一、固定操作列
----
主表操作列原本已有 fixed="right";**明细表的操作列没有**,本次补上。
子表嵌在主表展开区内,容器更窄(两侧各留 40px),不固定更容易被挤出屏幕。
操作列宽度 250 -> 230(实际按钮最多 3 个并存,230 足够)。

二、弹性列宽
----
按「内容长度是否确定」划界:
  用 min-width(可伸缩)—— 单号 150 / 借用人 90 / 当前持有人 120 /
                            归还人 90 / 归还时间·预计 200
  用 width(定长)    —— 借出时间 160 / 借出物品 80 / 状态 110 /
                            电子签名 100(原 140,两个小标签用不了那么宽)
  展开列本身约 48px,不可控
明细表同步:SKU 120 -> min-width 110;当前持有人 130 -> min-width 120。

主表最小总宽由约 1528px 降到 1378px。

三、长文本省略
----
物料名称、SKU、单号均已带 show-overflow-tooltip —— 超长物料名自动省略号,
悬浮显示全称,不会因单条数据撑爆整表。

★ 如实说明:11 列的表格在 1600px 以上屏幕可完整铺开;1440/1366 笔记本上
  仍会保留一条横向滚动条(最小 1378px vs 可用约 1240px),这是列数决定的,
  不删列就无法根除。但操作列两级都已吸附最右侧,**用户不再需要滚动即可操作** ——
  这正是本次要解决的核心痛点。若要做到零滚动条,需另议「窄屏隐藏次要列
  (电子签名/借出物品)」或侧边栏可折叠。
This commit is contained in:
yueli
2026-09-17 10:35:11 +08:00
parent 2c732a9a3a
commit c566d1b728

View File

@ -101,7 +101,7 @@
<h4 style="margin: 0 0 10px; font-size: 14px; color: #606266;">借出明细</h4>
<el-table :data="props.row.children" border size="small">
<el-table-column prop="material_name" label="物料名称" min-width="140" show-overflow-tooltip />
<el-table-column prop="sku" label="SKU" width="120" show-overflow-tooltip />
<el-table-column prop="sku" label="SKU" min-width="110" show-overflow-tooltip />
<el-table-column label="借出数量" width="80" align="center">
<template #default="{row}">
<el-tag type="info">{{ row.quantity }}</el-tag>
@ -132,7 +132,7 @@
</el-table-column>
<!-- 明细级持有人部分转交后主行只能显示多人持有
到底哪件在谁手里必须在这一层看清楚 -->
<el-table-column label="当前持有人" width="130">
<el-table-column label="当前持有人" min-width="120">
<template #default="{row: c}">
<span
v-if="c.current_holder_name"
@ -145,8 +145,10 @@
</el-tag>
</template>
</el-table-column>
<!-- 明细级操作转交粒度已下沉到明细行这里才是精准入口 -->
<el-table-column label="操作" width="170" align="center">
<!-- 明细级操作转交粒度已下沉到明细行这里才是精准入口
fixed="right" 同样吸附最右侧 子表嵌在主表内层
容器更窄不固定的话按钮更容易被挤到屏幕外 -->
<el-table-column label="操作" width="170" align="center" fixed="right">
<template #default="{row: c}">
<template v-if="c.pending_transfer && c.pending_transfer.is_mine">
<el-button type="success" link size="small" @click="acceptOne(c)">接收</el-button>
@ -169,8 +171,12 @@
</template>
</el-table-column>
<el-table-column v-if="hasColumnPermission('borrow_no')" prop="borrow_no" label="单号" width="180" show-overflow-tooltip />
<el-table-column v-if="hasColumnPermission('borrower_name')" label="借用人" width="100">
<!-- 弹性列宽内容长度可变的列一律用 min-width Element Plus 按屏幕
剩余空间自动伸缩只有日期 / 数量 / 标签这类长度确定的列才用
width 硬编码原先除两列外全用 width合计约 1528px 1440 笔记本
可用宽度只有约 1240px必然撑出横向滚动条 -->
<el-table-column v-if="hasColumnPermission('borrow_no')" prop="borrow_no" label="单号" min-width="150" show-overflow-tooltip />
<el-table-column v-if="hasColumnPermission('borrower_name')" label="借用人" min-width="90">
<template #default="{row}">
<span class="name-fixed">{{ formatName(row.borrower_name) || '—' }}</span>
</template>
@ -179,7 +185,7 @@
也可能各不相同故去重后逐个展示
表达上做了降噪未转交=普通文本转过交=主题色加粗原先一律用橙色
标签一屏几十个色块会把真正需要关注的已转交淹没 -->
<el-table-column label="当前持有人" width="140">
<el-table-column label="当前持有人" min-width="120">
<template #default="{row}">
<!-- 单内多个持有人 = 部分转交 2 件只转了 1 **正常业务形态**
不是异常主行无法一一列清谁拿哪件故用灰标签提示
@ -198,14 +204,14 @@
10 反而打乱后端按单号聚合的逾期优先排序让列表看起来没规律
若将来确实需要按其他字段排序应改为 sortable="custom" 并由后端接管 -->
<el-table-column v-if="hasColumnPermission('borrow_time')" prop="borrow_time" label="借出时间" width="160" />
<el-table-column label="借出物品" width="90" align="center">
<el-table-column label="借出物品" width="80" align="center">
<template #default="{row}">
<el-tag type="info">{{ row.children ? row.children.length : 0 }} </el-tag>
</template>
</el-table-column>
<!-- 归还人改为整单汇总主行原取首条明细的归还人多明细分批归还时
会只显示其中一位令人误以为其他人没还过 -->
<el-table-column v-if="hasColumnPermission('return_operator')" label="归还人" width="110">
<el-table-column v-if="hasColumnPermission('return_operator')" label="归还人" min-width="90">
<template #default="{row}">
<template v-if="row.return_operators && row.return_operators.length">
<span v-for="op in row.return_operators" :key="op" class="name-fixed">{{ formatName(op) }}</span>
@ -252,7 +258,7 @@
</template>
</el-table-column>
<el-table-column v-if="hasColumnPermission('borrow_signature') || hasColumnPermission('return_signature')" label="电子签名" width="140" align="center">
<el-table-column v-if="hasColumnPermission('borrow_signature') || hasColumnPermission('return_signature')" label="电子签名" width="100" align="center">
<template #default="{row}">
<div style="display:flex; justify-content: center; gap:10px">
<el-popover trigger="hover" placement="top" v-if="row.borrow_signature && hasColumnPermission('borrow_signature')" width="220">
@ -269,9 +275,12 @@
</el-table-column>
<!-- 操作列
· 申请报废 / 转交 仅未归还记录且分别受各自权限约束
· 流转记录 无特殊权限要求凡能看到本列表者皆可查看 -->
<el-table-column label="操作" width="250" align="center" fixed="right">
· 接收转交 / 拒绝 待我接收时出现最高优先级
· 申请报废 / 转交 仅未归还记录各自受权限约束
· 流转记录 无特殊权限要求
fixed="right"无论前面多少列屏幕多窄操作按钮永远吸附在最右侧
用户不必为了点按钮去拖动横向滚动条 -->
<el-table-column label="操作" width="230" align="center" fixed="right">
<template #default="{row}">
<!-- 待我接收的转交最高优先级接收人必须一眼看到并处理
东西还在对方手上责任尚未转移 见后端双向握手设计