Browse Source

2025-12-10

pda物料清单优化
master
fengyuan_yang 6 months ago
parent
commit
2a2bd03e40
  1. 99
      src/views/modules/other-inout/otherInboundDetail.vue
  2. 97
      src/views/modules/other-inout/otherOutboundDetail.vue
  3. 120
      src/views/modules/production-pick/productionPickingDetail.vue
  4. 99
      src/views/modules/production/productionInboundStorage.vue
  5. 99
      src/views/modules/production/productionReturnStorage.vue
  6. 121
      src/views/modules/purchase-inbound/inboundStorage.vue
  7. 108
      src/views/modules/purchase-return/purchaseReturnDetail.vue
  8. 99
      src/views/modules/sales-return/salesReturnStorage.vue
  9. 97
      src/views/modules/sales/salesOutboundDetail.vue

99
src/views/modules/other-inout/otherInboundDetail.vue

@ -229,6 +229,7 @@
<div class="table-header">
<div class="col-no">NO.</div>
<div class="col-material-code">物料编码</div>
<div class="col-part-name">物料名称</div>
<div class="col-required-qty">需求数量</div>
<div class="col-available-qty">可用数量</div>
<div class="col-scans-qty">扫描数量</div>
@ -241,7 +242,10 @@
class="table-row"
>
<div class="col-no">{{ index + 1 }}</div>
<div class="col-material-code clickable-part" @click="showStockDialogFn(item)">{{ item.materialCode }}</div>
<div class="col-material-code clickable-part" @click="showStockDialogFn(item)">{{ item.materialCode || item.partNo }}</div>
<div class="col-part-name">
<span class="part-name-text" @click.stop="showPartNameTip(item.materialName, $event)">{{ item.materialName || '-' }}</span>
</div>
<div class="col-required-qty">{{ item.requiredQty || 0 }}</div>
<div class="col-available-qty">{{ item.pickedQty || 0 }}</div>
<div class="col-scans-qty">{{ item.scansQty || 0 }}</div>
@ -260,6 +264,11 @@
<button class="btn-close" @click="closeMaterialDialog">关闭</button>
</div>
</div>
<!-- 物料名称提示框 -->
<div v-if="showPartNameTooltip" class="part-name-tooltip" :style="tooltipStyle" @click.stop>
<div class="tooltip-content">{{ currentPartName }}</div>
</div>
</div>
<!-- 可用库存弹窗 -->
@ -327,7 +336,11 @@ export default {
//
touchStartX: 0,
touchStartY: 0,
deleteButtonWidth: 80 //
deleteButtonWidth: 80, //
//
showPartNameTooltip: false,
currentPartName: '',
tooltipStyle: { top: '0px', left: '0px' }
};
},
methods: {
@ -647,6 +660,24 @@ export default {
//
closeMaterialDialog() {
this.showMaterialDialog = false;
this.hidePartNameTip();
},
//
showPartNameTip(partName, event) {
if (!partName || partName === '-') return;
const rect = event.target.getBoundingClientRect();
this.tooltipStyle = { top: (rect.top - 5) + 'px', left: rect.left + 'px' };
this.currentPartName = partName;
this.showPartNameTooltip = true;
setTimeout(() => { document.addEventListener('click', this.hidePartNameTip); }, 0);
},
//
hidePartNameTip() {
this.showPartNameTooltip = false;
this.currentPartName = '';
document.removeEventListener('click', this.hidePartNameTip);
},
showStockDialogFn(item) {
@ -1344,7 +1375,8 @@ export default {
}
.material-table {
width: 100%;
min-width: 500px;
width: max-content;
}
.table-header {
@ -1361,8 +1393,7 @@ export default {
}
.table-body {
max-height: 400px;
overflow-y: auto;
/* 垂直滚动由modal-body处理 */
}
.table-row {
@ -1440,6 +1471,64 @@ export default {
font-size: 12px;
}
/* 物料名称列样式 */
.material-table .col-part-name {
flex: 1.2;
text-align: left;
min-width: 80px;
font-size: 12px;
overflow: hidden;
}
.material-table .col-part-name .part-name-text {
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
color: #17B3A3;
cursor: pointer;
}
.material-table .col-part-name .part-name-text:active {
color: #0d8f7f;
}
/* 物料名称提示框样式 */
.part-name-tooltip {
position: fixed;
z-index: 10001;
transform: translateY(-100%);
max-width: 200px;
animation: tooltipFadeIn 0.2s ease;
}
@keyframes tooltipFadeIn {
from { opacity: 0; transform: translateY(-100%) translateY(5px); }
to { opacity: 1; transform: translateY(-100%) translateY(0); }
}
.part-name-tooltip .tooltip-content {
background: #303133;
color: #fff;
padding: 8px 12px;
border-radius: 4px;
font-size: 12px;
line-height: 1.4;
word-break: break-all;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
}
.part-name-tooltip::after {
content: '';
position: absolute;
bottom: -6px;
left: 15px;
border-width: 6px 6px 0 6px;
border-style: solid;
border-color: #303133 transparent transparent transparent;
}
.material-modal .modal-footer {
padding: 15px 20px;
display: flex;

97
src/views/modules/other-inout/otherOutboundDetail.vue

@ -130,6 +130,7 @@
<div class="table-header">
<div class="col-no">NO.</div>
<div class="col-material-code">物料编码</div>
<div class="col-part-name">物料名称</div>
<div class="col-required-qty">需求数量</div>
<div class="col-available-qty">出库数量</div>
<div class="col-scans-qty">扫描数量</div>
@ -143,6 +144,9 @@
>
<div class="col-no">{{ index + 1 }}</div>
<div class="col-material-code clickable-part" @click="showStockDialogFn(item)">{{ item.materialCode || item.partNo }}</div>
<div class="col-part-name">
<span class="part-name-text" @click.stop="showPartNameTip(item.materialName, $event)">{{ item.materialName || '-' }}</span>
</div>
<div class="col-required-qty">{{ item.requiredQty || 0 }}</div>
<div class="col-available-qty">{{ item.pickedQty || 0 }}</div>
<div class="col-scans-qty">{{ item.scansQty || 0 }}</div>
@ -161,6 +165,11 @@
<button class="btn-close" @click="closeMaterialDialog">关闭</button>
</div>
</div>
<!-- 物料名称提示框 -->
<div v-if="showPartNameTooltip" class="part-name-tooltip" :style="tooltipStyle" @click.stop>
<div class="tooltip-content">{{ currentPartName }}</div>
</div>
</div>
<!-- 可用库存弹窗 -->
@ -218,7 +227,11 @@ export default {
showStockDialog: false,
stockList: [],
stockLoading: false,
currentPartNo: ''
currentPartNo: '',
//
showPartNameTooltip: false,
currentPartName: '',
tooltipStyle: { top: '0px', left: '0px' }
};
},
methods: {
@ -386,6 +399,24 @@ export default {
//
closeMaterialDialog() {
this.showMaterialDialog = false;
this.hidePartNameTip();
},
//
showPartNameTip(partName, event) {
if (!partName || partName === '-') return;
const rect = event.target.getBoundingClientRect();
this.tooltipStyle = { top: (rect.top - 5) + 'px', left: rect.left + 'px' };
this.currentPartName = partName;
this.showPartNameTooltip = true;
setTimeout(() => { document.addEventListener('click', this.hidePartNameTip); }, 0);
},
//
hidePartNameTip() {
this.showPartNameTooltip = false;
this.currentPartName = '';
document.removeEventListener('click', this.hidePartNameTip);
},
showStockDialogFn(item) {
@ -901,7 +932,8 @@ export default {
}
.material-table {
width: 100%;
min-width: 500px;
width: max-content;
}
.table-header {
@ -918,8 +950,7 @@ export default {
}
.table-body {
max-height: 400px;
overflow-y: auto;
/* 垂直滚动由modal-body处理 */
}
.table-row {
@ -997,6 +1028,64 @@ export default {
font-size: 12px;
}
/* 物料名称列样式 */
.material-table .col-part-name {
flex: 1.2;
text-align: left;
min-width: 80px;
font-size: 12px;
overflow: hidden;
}
.material-table .col-part-name .part-name-text {
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
color: #17B3A3;
cursor: pointer;
}
.material-table .col-part-name .part-name-text:active {
color: #0d8f7f;
}
/* 物料名称提示框样式 */
.part-name-tooltip {
position: fixed;
z-index: 10001;
transform: translateY(-100%);
max-width: 200px;
animation: tooltipFadeIn 0.2s ease;
}
@keyframes tooltipFadeIn {
from { opacity: 0; transform: translateY(-100%) translateY(5px); }
to { opacity: 1; transform: translateY(-100%) translateY(0); }
}
.part-name-tooltip .tooltip-content {
background: #303133;
color: #fff;
padding: 8px 12px;
border-radius: 4px;
font-size: 12px;
line-height: 1.4;
word-break: break-all;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
}
.part-name-tooltip::after {
content: '';
position: absolute;
bottom: -6px;
left: 15px;
border-width: 6px 6px 0 6px;
border-style: solid;
border-color: #303133 transparent transparent transparent;
}
.material-modal .modal-footer {
padding: 15px 20px;
display: flex;

120
src/views/modules/production-pick/productionPickingDetail.vue

@ -133,6 +133,7 @@
<div class="table-header">
<div class="col-no">NO.</div>
<div class="col-material-code">物料编码</div>
<div class="col-part-name">物料名称</div>
<div class="col-required-qty">需求数量</div>
<div class="col-picked-qty">已领数量</div>
<div class="col-picked-qty">扫描数量</div>
@ -146,6 +147,9 @@
>
<div class="col-no">{{ index + 1 }}</div>
<div class="col-material-code clickable-part" @click="showStockDialogFn(item)">{{ item.materialCode || item.partNo }}</div>
<div class="col-part-name">
<span class="part-name-text" @click.stop="showPartNameTip(item.materialName, $event)">{{ item.materialName || '-' }}</span>
</div>
<div class="col-required-qty">{{ item.requiredQty || 0 }}</div>
<div class="col-picked-qty">{{ item.pickedQty || 0 }}</div>
<div class="col-picked-qty">{{ item.scansQty || 0 }}</div>
@ -156,6 +160,7 @@
<!-- 空数据状态 -->
<div v-else class="empty-material">
<i class="el-icon-document"></i>
<p>暂无物料数据</p>
</div>
</div>
@ -164,6 +169,11 @@
<button class="btn-close" @click="closeMaterialDialog">关闭</button>
</div>
</div>
<!-- 物料名称提示框 -->
<div v-if="showPartNameTooltip" class="part-name-tooltip" :style="tooltipStyle" @click.stop>
<div class="tooltip-content">{{ currentPartName }}</div>
</div>
</div>
<!-- 可用库存弹窗 -->
@ -223,7 +233,14 @@ export default {
showStockDialog: false,
stockList: [],
stockLoading: false,
currentPartNo: ''
currentPartNo: '',
//
showPartNameTooltip: false,
currentPartName: '',
tooltipStyle: {
top: '0px',
left: '0px'
}
};
},
methods: {
@ -389,6 +406,36 @@ export default {
//
closeMaterialDialog() {
this.showMaterialDialog = false;
this.hidePartNameTip();
},
//
showPartNameTip(partName, event) {
if (!partName || partName === '-') return;
// 使
const rect = event.target.getBoundingClientRect();
// fixed
this.tooltipStyle = {
top: (rect.top - 5) + 'px',
left: rect.left + 'px'
};
this.currentPartName = partName;
this.showPartNameTooltip = true;
//
setTimeout(() => {
document.addEventListener('click', this.hidePartNameTip);
}, 0);
},
//
hidePartNameTip() {
this.showPartNameTooltip = false;
this.currentPartName = '';
document.removeEventListener('click', this.hidePartNameTip);
},
showStockDialogFn(item) {
@ -932,7 +979,8 @@ export default {
}
.material-table {
width: 100%;
min-width: 500px;
width: max-content;
}
.table-header {
@ -949,8 +997,7 @@ export default {
}
.table-body {
max-height: 400px;
overflow-y: auto;
/* 垂直滚动由modal-body处理 */
}
.table-row {
@ -1021,6 +1068,71 @@ export default {
font-size: 12px;
}
/* 物料名称列样式 */
.material-table .col-part-name {
flex: 1.2;
text-align: left;
min-width: 80px;
font-size: 12px;
overflow: hidden;
}
.material-table .col-part-name .part-name-text {
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
color: #17B3A3;
cursor: pointer;
}
.material-table .col-part-name .part-name-text:active {
color: #0d8f7f;
}
/* 物料名称提示框样式 */
.part-name-tooltip {
position: fixed;
z-index: 10001;
transform: translateY(-100%);
max-width: 200px;
animation: tooltipFadeIn 0.2s ease;
}
@keyframes tooltipFadeIn {
from {
opacity: 0;
transform: translateY(-100%) translateY(5px);
}
to {
opacity: 1;
transform: translateY(-100%) translateY(0);
}
}
.part-name-tooltip .tooltip-content {
background: #303133;
color: #fff;
padding: 8px 12px;
border-radius: 4px;
font-size: 12px;
line-height: 1.4;
word-break: break-all;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
}
/* 提示框箭头(向下) */
.part-name-tooltip::after {
content: '';
position: absolute;
bottom: -6px;
left: 15px;
border-width: 6px 6px 0 6px;
border-style: solid;
border-color: #303133 transparent transparent transparent;
}
.material-modal .modal-footer {
padding: 15px 20px;
display: flex;

99
src/views/modules/production/productionInboundStorage.vue

@ -174,6 +174,7 @@
<div class="col-no">NO.</div>
<!-- <div class="col-label-code">标签条码</div>-->
<div class="col-material-code">物料编码</div>
<div class="col-part-name">物料名称</div>
<div class="col-required-qty">需求数量</div>
<div class="col-inbound-qty">已入库数</div>
<div class="col-scans-qty">扫描数量</div>
@ -188,7 +189,10 @@
<div class="col-no">{{ index + 1 }}</div>
<!-- <div class="col-label-code">{{ item.labelCode || item.rollNo }}</div>-->
<div class="col-material-code clickable-part" @click="showStockDialogFn(item)">{{ item.materialCode || item.partNo }}</div>
<div class="col-required-qty">{{ item.labelCount || 0 }}</div>
<div class="col-part-name">
<span class="part-name-text" @click.stop="showPartNameTip(item.materialName, $event)">{{ item.materialName || '-' }}</span>
</div>
<div class="col-required-qty">{{ item.requiredQty || 0 }}</div>
<div class="col-inbound-qty">{{ item.pickedQty || 0 }}</div>
<div class="col-scans-qty">{{ item.scansQty || 0 }}</div>
</div>
@ -206,6 +210,11 @@
<button class="btn-close" @click="closeMaterialDialog">关闭</button>
</div>
</div>
<!-- 物料名称提示框 -->
<div v-if="showPartNameTooltip" class="part-name-tooltip" :style="tooltipStyle" @click.stop>
<div class="tooltip-content">{{ currentPartName }}</div>
</div>
</div>
<!-- 可用库存弹窗 -->
@ -281,7 +290,11 @@ export default {
showStockDialog: false,
stockList: [],
stockLoading: false,
currentPartNo: ''
currentPartNo: '',
//
showPartNameTooltip: false,
currentPartName: '',
tooltipStyle: { top: '0px', left: '0px' }
};
},
methods: {
@ -499,6 +512,24 @@ export default {
//
closeMaterialDialog() {
this.showMaterialDialog = false;
this.hidePartNameTip();
},
//
showPartNameTip(partName, event) {
if (!partName || partName === '-') return;
const rect = event.target.getBoundingClientRect();
this.tooltipStyle = { top: (rect.top - 5) + 'px', left: rect.left + 'px' };
this.currentPartName = partName;
this.showPartNameTooltip = true;
setTimeout(() => { document.addEventListener('click', this.hidePartNameTip); }, 0);
},
//
hidePartNameTip() {
this.showPartNameTooltip = false;
this.currentPartName = '';
document.removeEventListener('click', this.hidePartNameTip);
},
//
@ -1278,7 +1309,8 @@ export default {
}
.material-table {
width: 100%;
min-width: 500px;
width: max-content;
}
.table-header {
@ -1295,8 +1327,7 @@ export default {
}
.table-body {
max-height: 400px;
overflow-y: auto;
/* 垂直滚动由modal-body处理 */
}
.table-row {
@ -1522,6 +1553,64 @@ export default {
font-size: 12px;
}
/* 物料名称列样式 */
.material-table .col-part-name {
flex: 1.2;
text-align: left;
min-width: 80px;
font-size: 12px;
overflow: hidden;
}
.material-table .col-part-name .part-name-text {
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
color: #17B3A3;
cursor: pointer;
}
.material-table .col-part-name .part-name-text:active {
color: #0d8f7f;
}
/* 物料名称提示框样式 */
.part-name-tooltip {
position: fixed;
z-index: 10001;
transform: translateY(-100%);
max-width: 200px;
animation: tooltipFadeIn 0.2s ease;
}
@keyframes tooltipFadeIn {
from { opacity: 0; transform: translateY(-100%) translateY(5px); }
to { opacity: 1; transform: translateY(-100%) translateY(0); }
}
.part-name-tooltip .tooltip-content {
background: #303133;
color: #fff;
padding: 8px 12px;
border-radius: 4px;
font-size: 12px;
line-height: 1.4;
word-break: break-all;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
}
.part-name-tooltip::after {
content: '';
position: absolute;
bottom: -6px;
left: 15px;
border-width: 6px 6px 0 6px;
border-style: solid;
border-color: #303133 transparent transparent transparent;
}
.material-modal .modal-footer {
padding: 15px 20px;
display: flex;

99
src/views/modules/production/productionReturnStorage.vue

@ -166,6 +166,7 @@
<div class="col-no">NO.</div>
<!-- <div class="col-label-code">标签条码</div>-->
<div class="col-material-code">物料编码</div>
<div class="col-part-name">物料名称</div>
<div class="col-required-qty">需求数量</div>
<div class="col-inbound-qty">已入库数</div>
<div class="col-scans-qty">扫描数量</div>
@ -180,7 +181,10 @@
<div class="col-no">{{ index + 1 }}</div>
<!-- <div class="col-label-code">{{ item.labelCode || item.rollNo }}</div>-->
<div class="col-material-code">{{ item.materialCode || item.partNo }}</div>
<div class="col-required-qty">{{ item.labelCount || 0 }}</div>
<div class="col-part-name">
<span class="part-name-text" @click.stop="showPartNameTip(item.materialName, $event)">{{ item.materialName || '-' }}</span>
</div>
<div class="col-required-qty">{{ item.requiredQty || 0 }}</div>
<div class="col-inbound-qty">{{ item.pickedQty || 0 }}</div>
<div class="col-scans-qty">{{ item.scansQty || 0 }}</div>
</div>
@ -198,6 +202,11 @@
<button class="btn-close" @click="closeMaterialDialog">关闭</button>
</div>
</div>
<!-- 物料名称提示框 -->
<div v-if="showPartNameTooltip" class="part-name-tooltip" :style="tooltipStyle" @click.stop>
<div class="tooltip-content">{{ currentPartName }}</div>
</div>
</div>
</div>
</template>
@ -225,7 +234,11 @@ export default {
showMaterialDialog: false,
materialList: [],
materialListLoading: false,
isRemoveMode: false //
isRemoveMode: false, //
//
showPartNameTooltip: false,
currentPartName: '',
tooltipStyle: { top: '0px', left: '0px' }
};
},
methods: {
@ -412,6 +425,24 @@ export default {
//
closeMaterialDialog() {
this.showMaterialDialog = false;
this.hidePartNameTip();
},
//
showPartNameTip(partName, event) {
if (!partName || partName === '-') return;
const rect = event.target.getBoundingClientRect();
this.tooltipStyle = { top: (rect.top - 5) + 'px', left: rect.left + 'px' };
this.currentPartName = partName;
this.showPartNameTooltip = true;
setTimeout(() => { document.addEventListener('click', this.hidePartNameTip); }, 0);
},
//
hidePartNameTip() {
this.showPartNameTooltip = false;
this.currentPartName = '';
document.removeEventListener('click', this.hidePartNameTip);
},
//
@ -1152,7 +1183,8 @@ export default {
}
.material-table {
width: 100%;
min-width: 500px;
width: max-content;
}
.table-header {
@ -1169,8 +1201,7 @@ export default {
}
.table-body {
max-height: 400px;
overflow-y: auto;
/* 垂直滚动由modal-body处理 */
}
.table-row {
@ -1234,6 +1265,64 @@ export default {
font-size: 12px;
}
/* 物料名称列样式 */
.material-table .col-part-name {
flex: 1.2;
text-align: left;
min-width: 80px;
font-size: 12px;
overflow: hidden;
}
.material-table .col-part-name .part-name-text {
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
color: #17B3A3;
cursor: pointer;
}
.material-table .col-part-name .part-name-text:active {
color: #0d8f7f;
}
/* 物料名称提示框样式 */
.part-name-tooltip {
position: fixed;
z-index: 10001;
transform: translateY(-100%);
max-width: 200px;
animation: tooltipFadeIn 0.2s ease;
}
@keyframes tooltipFadeIn {
from { opacity: 0; transform: translateY(-100%) translateY(5px); }
to { opacity: 1; transform: translateY(-100%) translateY(0); }
}
.part-name-tooltip .tooltip-content {
background: #303133;
color: #fff;
padding: 8px 12px;
border-radius: 4px;
font-size: 12px;
line-height: 1.4;
word-break: break-all;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
}
.part-name-tooltip::after {
content: '';
position: absolute;
bottom: -6px;
left: 15px;
border-width: 6px 6px 0 6px;
border-style: solid;
border-color: #303133 transparent transparent transparent;
}
.material-modal .modal-footer {
padding: 15px 20px;
display: flex;

121
src/views/modules/purchase-inbound/inboundStorage.vue

@ -169,6 +169,7 @@
<div class="col-no">NO.</div>
<!-- <div class="col-label-code">标签条码</div>-->
<div class="col-material-code">物料编码</div>
<div class="col-part-name">物料名称</div>
<div class="col-required-qty">需求数量</div>
<div class="col-inbound-qty">已入库数</div>
<div class="col-scans-qty">扫描数量</div>
@ -183,7 +184,10 @@
<div class="col-no">{{ index + 1 }}</div>
<!-- <div class="col-label-code">{{ item.labelCode || item.rollNo }}</div>-->
<div class="col-material-code clickable-part" @click="showStockDialogFn(item)">{{item.partNo }}</div>
<div class="col-required-qty">{{ item.labelCount || 0 }}</div>
<div class="col-part-name">
<span class="part-name-text" @click.stop="showPartNameTip(item.materialName, $event)">{{ item.materialName || '-' }}</span>
</div>
<div class="col-required-qty">{{ item.requiredQty || 0 }}</div>
<div class="col-inbound-qty">{{ item.pickedQty || 0 }}</div>
<div class="col-scans-qty">{{ item.scansQty || 0 }}</div>
</div>
@ -201,6 +205,11 @@
<button class="btn-close" @click="closeMaterialDialog">关闭</button>
</div>
</div>
<!-- 物料名称提示框 -->
<div v-if="showPartNameTooltip" class="part-name-tooltip" :style="tooltipStyle" @click.stop>
<div class="tooltip-content">{{ currentPartName }}</div>
</div>
</div>
<!-- 可用库存弹窗 -->
@ -280,7 +289,14 @@ export default {
showStockDialog: false,
stockList: [],
stockLoading: false,
currentPartNo: ''
currentPartNo: '',
//
showPartNameTooltip: false,
currentPartName: '',
tooltipStyle: {
top: '0px',
left: '0px'
}
};
},
methods: {
@ -470,6 +486,36 @@ export default {
//
closeMaterialDialog() {
this.showMaterialDialog = false;
this.hidePartNameTip();
},
//
showPartNameTip(partName, event) {
if (!partName || partName === '-') return;
// 使
const rect = event.target.getBoundingClientRect();
// fixed
this.tooltipStyle = {
top: (rect.top - 5) + 'px',
left: rect.left + 'px'
};
this.currentPartName = partName;
this.showPartNameTooltip = true;
//
setTimeout(() => {
document.addEventListener('click', this.hidePartNameTip);
}, 0);
},
//
hidePartNameTip() {
this.showPartNameTooltip = false;
this.currentPartName = '';
document.removeEventListener('click', this.hidePartNameTip);
},
//
@ -1257,7 +1303,8 @@ export default {
}
.material-table {
width: 100%;
min-width: 500px;
width: max-content;
}
.table-header {
@ -1274,8 +1321,7 @@ export default {
}
.table-body {
max-height: 400px;
overflow-y: auto;
/* 垂直滚动由modal-body处理 */
}
.table-row {
@ -1355,6 +1401,71 @@ export default {
font-size: 12px;
}
/* 物料名称列样式 */
.material-table .col-part-name {
flex: 1.2;
text-align: left;
min-width: 80px;
font-size: 12px;
overflow: hidden;
}
.material-table .col-part-name .part-name-text {
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
color: #17B3A3;
cursor: pointer;
}
.material-table .col-part-name .part-name-text:active {
color: #0d8f7f;
}
/* 物料名称提示框样式 */
.part-name-tooltip {
position: fixed;
z-index: 10001;
transform: translateY(-100%);
max-width: 200px;
animation: tooltipFadeIn 0.2s ease;
}
@keyframes tooltipFadeIn {
from {
opacity: 0;
transform: translateY(-100%) translateY(5px);
}
to {
opacity: 1;
transform: translateY(-100%) translateY(0);
}
}
.part-name-tooltip .tooltip-content {
background: #303133;
color: #fff;
padding: 8px 12px;
border-radius: 4px;
font-size: 12px;
line-height: 1.4;
word-break: break-all;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
}
/* 提示框箭头(向下) */
.part-name-tooltip::after {
content: '';
position: absolute;
bottom: -6px;
left: 15px;
border-width: 6px 6px 0 6px;
border-style: solid;
border-color: #303133 transparent transparent transparent;
}
.material-modal .modal-footer {
padding: 15px 20px;
display: flex;

108
src/views/modules/purchase-return/purchaseReturnDetail.vue

@ -129,6 +129,7 @@
<div class="table-header">
<div class="col-no">NO.</div>
<div class="col-material-code">物料编码</div>
<div class="col-part-name">物料名称</div>
<div class="col-required-qty">需求数量</div>
<div class="col-available-qty">出库数量</div>
<div class="col-scans-qty">扫描数量</div>
@ -142,6 +143,9 @@
>
<div class="col-no">{{ index + 1 }}</div>
<div class="col-material-code clickable-part" @click="showStockDialogFn(item)">{{ item.materialCode || item.partNo }}</div>
<div class="col-part-name">
<span class="part-name-text" @click.stop="showPartNameTip(item.materialName, $event)">{{ item.materialName || '-' }}</span>
</div>
<div class="col-required-qty">{{ item.requiredQty || 0 }}</div>
<div class="col-available-qty">{{ item.pickedQty || 0 }}</div>
<div class="col-scans-qty">{{ item.scansQty || 0 }}</div>
@ -160,6 +164,11 @@
<button class="btn-close" @click="closeMaterialDialog">关闭</button>
</div>
</div>
<!-- 物料名称提示框 -->
<div v-if="showPartNameTooltip" class="part-name-tooltip" :style="tooltipStyle" @click.stop>
<div class="tooltip-content">{{ currentPartName }}</div>
</div>
</div>
<!-- 可用库存弹窗 -->
@ -221,7 +230,14 @@ export default {
showStockDialog: false,
stockList: [],
stockLoading: false,
currentPartNo: ''
currentPartNo: '',
//
showPartNameTooltip: false,
currentPartName: '',
tooltipStyle: {
top: '0px',
left: '0px'
}
};
},
methods: {
@ -389,6 +405,32 @@ export default {
//
closeMaterialDialog() {
this.showMaterialDialog = false;
this.hidePartNameTip();
},
//
showPartNameTip(partName, event) {
if (!partName || partName === '-') return;
const rect = event.target.getBoundingClientRect();
this.tooltipStyle = {
top: (rect.top - 5) + 'px',
left: rect.left + 'px'
};
this.currentPartName = partName;
this.showPartNameTooltip = true;
setTimeout(() => {
document.addEventListener('click', this.hidePartNameTip);
}, 0);
},
//
hidePartNameTip() {
this.showPartNameTooltip = false;
this.currentPartName = '';
document.removeEventListener('click', this.hidePartNameTip);
},
showStockDialogFn(item) {
@ -945,7 +987,8 @@ export default {
}
.material-table {
width: 100%;
min-width: 500px;
width: max-content;
}
.table-header {
@ -962,8 +1005,7 @@ export default {
}
.table-body {
max-height: 400px;
overflow-y: auto;
/* 垂直滚动由modal-body处理 */
}
.table-row {
@ -1041,6 +1083,64 @@ export default {
font-size: 12px;
}
/* 物料名称列样式 */
.material-table .col-part-name {
flex: 1.2;
text-align: left;
min-width: 80px;
font-size: 12px;
overflow: hidden;
}
.material-table .col-part-name .part-name-text {
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
color: #17B3A3;
cursor: pointer;
}
.material-table .col-part-name .part-name-text:active {
color: #0d8f7f;
}
/* 物料名称提示框样式 */
.part-name-tooltip {
position: fixed;
z-index: 10001;
transform: translateY(-100%);
max-width: 200px;
animation: tooltipFadeIn 0.2s ease;
}
@keyframes tooltipFadeIn {
from { opacity: 0; transform: translateY(-100%) translateY(5px); }
to { opacity: 1; transform: translateY(-100%) translateY(0); }
}
.part-name-tooltip .tooltip-content {
background: #303133;
color: #fff;
padding: 8px 12px;
border-radius: 4px;
font-size: 12px;
line-height: 1.4;
word-break: break-all;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
}
.part-name-tooltip::after {
content: '';
position: absolute;
bottom: -6px;
left: 15px;
border-width: 6px 6px 0 6px;
border-style: solid;
border-color: #303133 transparent transparent transparent;
}
.material-modal .modal-footer {
padding: 15px 20px;
display: flex;

99
src/views/modules/sales-return/salesReturnStorage.vue

@ -164,6 +164,7 @@
<div class="table-header">
<div class="col-no">NO.</div>
<div class="col-material-code">物料编码</div>
<div class="col-part-name">物料名称</div>
<div class="col-required-qty">需求数量</div>
<div class="col-inbound-qty">已退货数</div>
<div class="col-scans-qty">扫描数量</div>
@ -177,7 +178,10 @@
>
<div class="col-no">{{ index + 1 }}</div>
<div class="col-material-code clickable-part" @click="showStockDialogFn(item)">{{ item.materialCode || item.partNo }}</div>
<div class="col-required-qty">{{ item.labelCount || 0 }}</div>
<div class="col-part-name">
<span class="part-name-text" @click.stop="showPartNameTip(item.materialName, $event)">{{ item.materialName || '-' }}</span>
</div>
<div class="col-required-qty">{{ item.requiredQty || 0 }}</div>
<div class="col-inbound-qty">{{ item.pickedQty || 0 }}</div>
<div class="col-scans-qty">{{ item.scansQty || 0 }}</div>
</div>
@ -195,6 +199,11 @@
<button class="btn-close" @click="closeMaterialDialog">关闭</button>
</div>
</div>
<!-- 物料名称提示框 -->
<div v-if="showPartNameTooltip" class="part-name-tooltip" :style="tooltipStyle" @click.stop>
<div class="tooltip-content">{{ currentPartName }}</div>
</div>
</div>
<!-- 可用库存弹窗 -->
@ -268,7 +277,11 @@ export default {
showStockDialog: false,
stockList: [],
stockLoading: false,
currentPartNo: ''
currentPartNo: '',
//
showPartNameTooltip: false,
currentPartName: '',
tooltipStyle: { top: '0px', left: '0px' }
};
},
methods: {
@ -480,6 +493,24 @@ export default {
//
closeMaterialDialog() {
this.showMaterialDialog = false;
this.hidePartNameTip();
},
//
showPartNameTip(partName, event) {
if (!partName || partName === '-') return;
const rect = event.target.getBoundingClientRect();
this.tooltipStyle = { top: (rect.top - 5) + 'px', left: rect.left + 'px' };
this.currentPartName = partName;
this.showPartNameTooltip = true;
setTimeout(() => { document.addEventListener('click', this.hidePartNameTip); }, 0);
},
//
hidePartNameTip() {
this.showPartNameTooltip = false;
this.currentPartName = '';
document.removeEventListener('click', this.hidePartNameTip);
},
//
@ -1229,7 +1260,8 @@ export default {
}
.material-table {
width: 100%;
min-width: 500px;
width: max-content;
}
.table-header {
@ -1246,8 +1278,7 @@ export default {
}
.table-body {
max-height: 400px;
overflow-y: auto;
/* 垂直滚动由modal-body处理 */
}
.table-row {
@ -1336,6 +1367,64 @@ export default {
font-size: 12px;
}
/* 物料名称列样式 */
.material-table .col-part-name {
flex: 1.2;
text-align: left;
min-width: 80px;
font-size: 12px;
overflow: hidden;
}
.material-table .col-part-name .part-name-text {
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
color: #17B3A3;
cursor: pointer;
}
.material-table .col-part-name .part-name-text:active {
color: #0d8f7f;
}
/* 物料名称提示框样式 */
.part-name-tooltip {
position: fixed;
z-index: 10001;
transform: translateY(-100%);
max-width: 200px;
animation: tooltipFadeIn 0.2s ease;
}
@keyframes tooltipFadeIn {
from { opacity: 0; transform: translateY(-100%) translateY(5px); }
to { opacity: 1; transform: translateY(-100%) translateY(0); }
}
.part-name-tooltip .tooltip-content {
background: #303133;
color: #fff;
padding: 8px 12px;
border-radius: 4px;
font-size: 12px;
line-height: 1.4;
word-break: break-all;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
}
.part-name-tooltip::after {
content: '';
position: absolute;
bottom: -6px;
left: 15px;
border-width: 6px 6px 0 6px;
border-style: solid;
border-color: #303133 transparent transparent transparent;
}
.material-modal .modal-footer {
padding: 15px 20px;
display: flex;

97
src/views/modules/sales/salesOutboundDetail.vue

@ -150,6 +150,7 @@
<div class="table-header">
<div class="col-no">NO.</div>
<div class="col-material-code">物料编码</div>
<div class="col-part-name">物料名称</div>
<div class="col-required-qty">需求数量</div>
<div class="col-available-qty">出库数量</div>
<div class="col-scans-qty">扫描数量</div>
@ -163,6 +164,9 @@
>
<div class="col-no">{{ index + 1 }}</div>
<div class="col-material-code clickable-part" @click="showStockDialogFn(item)">{{ item.materialCode || item.partNo }}</div>
<div class="col-part-name">
<span class="part-name-text" @click.stop="showPartNameTip(item.materialName, $event)">{{ item.materialName || '-' }}</span>
</div>
<div class="col-required-qty">{{ item.requiredQty || 0 }}</div>
<div class="col-available-qty">{{ item.pickedQty || 0 }}</div>
<div class="col-scans-qty">{{ item.scansQty || 0 }}</div>
@ -181,6 +185,11 @@
<button class="btn-close" @click="closeMaterialDialog">关闭</button>
</div>
</div>
<!-- 物料名称提示框 -->
<div v-if="showPartNameTooltip" class="part-name-tooltip" :style="tooltipStyle" @click.stop>
<div class="tooltip-content">{{ currentPartName }}</div>
</div>
</div>
<!-- 可用库存弹窗 -->
@ -240,7 +249,11 @@ export default {
showStockDialog: false,
stockList: [],
stockLoading: false,
currentPartNo: ''
currentPartNo: '',
//
showPartNameTooltip: false,
currentPartName: '',
tooltipStyle: { top: '0px', left: '0px' }
};
},
methods: {
@ -414,6 +427,24 @@ export default {
//
closeMaterialDialog() {
this.showMaterialDialog = false;
this.hidePartNameTip();
},
//
showPartNameTip(partName, event) {
if (!partName || partName === '-') return;
const rect = event.target.getBoundingClientRect();
this.tooltipStyle = { top: (rect.top - 5) + 'px', left: rect.left + 'px' };
this.currentPartName = partName;
this.showPartNameTooltip = true;
setTimeout(() => { document.addEventListener('click', this.hidePartNameTip); }, 0);
},
//
hidePartNameTip() {
this.showPartNameTooltip = false;
this.currentPartName = '';
document.removeEventListener('click', this.hidePartNameTip);
},
showStockDialogFn(item) {
@ -1019,7 +1050,8 @@ export default {
}
.material-table {
width: 100%;
min-width: 500px;
width: max-content;
}
.table-header {
@ -1036,8 +1068,7 @@ export default {
}
.table-body {
max-height: 400px;
overflow-y: auto;
/* 垂直滚动由modal-body处理 */
}
.table-row {
@ -1115,6 +1146,64 @@ export default {
font-size: 12px;
}
/* 物料名称列样式 */
.material-table .col-part-name {
flex: 1.2;
text-align: left;
min-width: 80px;
font-size: 12px;
overflow: hidden;
}
.material-table .col-part-name .part-name-text {
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
color: #17B3A3;
cursor: pointer;
}
.material-table .col-part-name .part-name-text:active {
color: #0d8f7f;
}
/* 物料名称提示框样式 */
.part-name-tooltip {
position: fixed;
z-index: 10001;
transform: translateY(-100%);
max-width: 200px;
animation: tooltipFadeIn 0.2s ease;
}
@keyframes tooltipFadeIn {
from { opacity: 0; transform: translateY(-100%) translateY(5px); }
to { opacity: 1; transform: translateY(-100%) translateY(0); }
}
.part-name-tooltip .tooltip-content {
background: #303133;
color: #fff;
padding: 8px 12px;
border-radius: 4px;
font-size: 12px;
line-height: 1.4;
word-break: break-all;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
}
.part-name-tooltip::after {
content: '';
position: absolute;
bottom: -6px;
left: 15px;
border-width: 6px 6px 0 6px;
border-style: solid;
border-color: #303133 transparent transparent transparent;
}
.material-modal .modal-footer {
padding: 15px 20px;
display: flex;

Loading…
Cancel
Save