6 changed files with 5837 additions and 1 deletions
-
2config/index.js
-
2src/api/ecss/ecss.js
-
3261src/views/modules/ecss/codelnotifyTX.vue
-
639src/views/modules/ecss/components/PackingDetailTabPallet.vue
-
10src/views/modules/ecss/createDeclaration.vue
-
1924src/views/modules/ecss/del_upload_excel_tx.vue
3261
src/views/modules/ecss/codelnotifyTX.vue
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,639 @@ |
|||||
|
<template> |
||||
|
<div class="packing-detail-tab"> |
||||
|
<!-- 批量操作按钮 --> |
||||
|
<div class="batch-edit-toolbar" v-if="showActions"> |
||||
|
<el-button type="warning" size="small" icon="el-icon-s-operation" @click="openAdjustWeightDialog"> |
||||
|
调整总毛重 |
||||
|
</el-button> |
||||
|
</div> |
||||
|
|
||||
|
<!-- 行合并表格 - 托盘和明细一目了然 --> |
||||
|
<div style="height: 350px"> |
||||
|
<el-table |
||||
|
:data="flattenedTableData" |
||||
|
:max-height="350" |
||||
|
border |
||||
|
v-loading="dataListLoading" |
||||
|
:element-loading-text="loadingText" |
||||
|
element-loading-spinner="el-icon-loading" |
||||
|
element-loading-background="rgba(0, 0, 0, 0.6)" |
||||
|
style="width: 100%;" |
||||
|
:span-method="mainTableSpanMethod" |
||||
|
:row-class-name="rowClassName" |
||||
|
:header-cell-class-name="getHeaderClassName" |
||||
|
:cell-class-name="getCellClassName" |
||||
|
show-summary |
||||
|
@cell-mouse-enter="handleCellMouseEnter" |
||||
|
@cell-mouse-leave="handleCellMouseLeave" |
||||
|
:summary-method="getSummaries" |
||||
|
:header-cell-style="{background:'#f5f7fa', color:'#606266', fontWeight:'600'}"> |
||||
|
|
||||
|
<!-- 托盘信息列(会合并) --> |
||||
|
<el-table-column label="托号" prop="pallet_no" width="120" align="center"> |
||||
|
<template slot-scope="scope"> |
||||
|
<span class="box-info-text">{{ scope.row.pallet_no || '-' }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="托数" prop="pallet_qty" width="120" align="center"> |
||||
|
<template slot-scope="scope"> |
||||
|
<span class="box-info-text">{{ scope.row.pallet_qty || '-' }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="总体积" prop="volume" width="120" align="center"> |
||||
|
<template slot-scope="scope"> |
||||
|
<span class="box-info-text">{{ scope.row.volume !== null && scope.row.volume !== undefined ? Number(scope.row.volume).toFixed(2) : '-' }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
|
||||
|
<!-- 箱信息列(会合并) --> |
||||
|
<el-table-column label="毛重" prop="gross_weight" width="120" align="center"> |
||||
|
<template slot-scope="scope"> |
||||
|
<span class="box-weight-text">{{ scope.row.gross_weight || '-' }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="净重" prop="net_weight" width="120" align="center"> |
||||
|
<template slot-scope="scope"> |
||||
|
<span class="box-weight-text">{{ scope.row.net_weight || '-' }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
|
||||
|
<!-- 明细信息列(不合并) --> |
||||
|
<el-table-column label="PN" prop="pn" min-width="120" align="left"> |
||||
|
<template slot-scope="scope"> |
||||
|
<span class="detail-text">{{ scope.row.pn || '-' }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="数量" prop="qty" min-width="100" align="center"> |
||||
|
<template slot-scope="scope"> |
||||
|
<span class="detail-text">{{ formatDetailValue(scope.row.qty, 'qty') }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="数量/箱" prop="qty_per_box" min-width="100" align="center"> |
||||
|
<template slot-scope="scope"> |
||||
|
<span class="detail-text">{{ scope.row.qty_per_box || '-' }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="箱数" prop="box_qty" min-width="100" align="center"> |
||||
|
<template slot-scope="scope"> |
||||
|
<span class="detail-text">{{ scope.row.box_qty || '-' }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { searchEcssCoDelPalletDetailData, searchEcssCoDelPalletHeaderData, selectBoxList, adjustTotalGrossWeight, updateTotalVolume } from "@/api/ecss/ecss.js" |
||||
|
|
||||
|
export default { |
||||
|
name: "PackingDetailTabPallet", |
||||
|
props: { |
||||
|
currentRow: { |
||||
|
type: Object, |
||||
|
default: () => ({}) |
||||
|
}, |
||||
|
height: { |
||||
|
type: Number, |
||||
|
default: 200 |
||||
|
}, |
||||
|
showActions: { |
||||
|
type: Boolean, |
||||
|
default: true |
||||
|
} |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
flattenedTableData: [], // 扁平化的表格数据 |
||||
|
dataListLoading: false, |
||||
|
loadingText: '加载中...', |
||||
|
selectedBoxes: [], |
||||
|
currentLoadingId: null, |
||||
|
|
||||
|
palletWeight: 0, |
||||
|
totalGrossWeight: 0, |
||||
|
totalVolume: null, |
||||
|
|
||||
|
// 调整总毛重弹窗相关 |
||||
|
adjustWeightDialogVisible: false, |
||||
|
adjustWeightSaving: false, |
||||
|
adjustWeightForm: { |
||||
|
actualGrossWeight: '' |
||||
|
}, |
||||
|
|
||||
|
hoveredPalletKey: null, |
||||
|
hoveredBoxKey: null |
||||
|
} |
||||
|
}, |
||||
|
computed: { |
||||
|
currentTotalGrossWeight() { |
||||
|
return this.totalGrossWeight; |
||||
|
} |
||||
|
}, |
||||
|
watch: { |
||||
|
currentRow: { |
||||
|
handler(newVal, oldVal) { |
||||
|
if (oldVal && newVal && oldVal.delNo !== newVal.delNo) { |
||||
|
this.flattenedTableData = []; |
||||
|
this.selectedBoxes = []; |
||||
|
} |
||||
|
if (newVal && newVal.site) { |
||||
|
this.loadBoxList(); |
||||
|
} |
||||
|
}, |
||||
|
deep: true, |
||||
|
immediate: true |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
async loadBoxList() { |
||||
|
if (!this.currentRow || !this.currentRow.site) { |
||||
|
this.flattenedTableData = []; |
||||
|
this.palletWeight = 0; |
||||
|
this.totalGrossWeight = 0; |
||||
|
this.totalVolume = null; |
||||
|
this.selectedBoxes = []; |
||||
|
this.currentLoadingId = null; |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
const loadingId = Date.now() + '_' + Math.random(); |
||||
|
this.currentLoadingId = loadingId; |
||||
|
this.flattenedTableData = []; |
||||
|
this.selectedBoxes = []; |
||||
|
this.dataListLoading = true; |
||||
|
|
||||
|
try { |
||||
|
const queryParams = { |
||||
|
site: this.currentRow.site, |
||||
|
buNo: this.currentRow.buNo, |
||||
|
delNo: this.currentRow.delNo |
||||
|
}; |
||||
|
|
||||
|
const [palletResponse, boxResponse, detailResponse] = await Promise.all([ |
||||
|
searchEcssCoDelPalletHeaderData(queryParams), |
||||
|
selectBoxList(queryParams), |
||||
|
searchEcssCoDelPalletDetailData(queryParams) |
||||
|
]); |
||||
|
|
||||
|
if (this.currentLoadingId !== loadingId) return; |
||||
|
|
||||
|
const pallets = palletResponse.data && palletResponse.data.code === 0 ? palletResponse.data.rows || [] : []; |
||||
|
const boxes = boxResponse.data && boxResponse.data.code === 0 ? boxResponse.data.rows || boxResponse.data.data || [] : []; |
||||
|
const details = detailResponse.data && detailResponse.data.code === 0 ? detailResponse.data.rows || [] : []; |
||||
|
|
||||
|
this.palletWeight = pallets |
||||
|
.filter(item => item.palletQty > 0) |
||||
|
.reduce((sum, item) => sum + (Number(item.weight) || 0), 0); |
||||
|
|
||||
|
// Group boxes by pallet's seq_no |
||||
|
const boxesMap = new Map(); |
||||
|
boxes.forEach(box => { |
||||
|
const palletSeqNo = String(box.seq_no || box.seqNo); |
||||
|
if (!boxesMap.has(palletSeqNo)) { |
||||
|
boxesMap.set(palletSeqNo, []); |
||||
|
} |
||||
|
boxesMap.get(palletSeqNo).push(box); |
||||
|
}); |
||||
|
|
||||
|
// Group details by box's item_no (which is detail.seqNo) |
||||
|
const detailsMap = new Map(); |
||||
|
details.forEach(detail => { |
||||
|
const boxItemNo = String(detail.seqNo || detail.seq_no); |
||||
|
if (!detailsMap.has(boxItemNo)) { |
||||
|
detailsMap.set(boxItemNo, []); |
||||
|
} |
||||
|
detailsMap.get(boxItemNo).push(detail); |
||||
|
}); |
||||
|
|
||||
|
const flattenedData = []; |
||||
|
|
||||
|
pallets.forEach(pallet => { |
||||
|
const palletSeqNo = String(pallet.seqNo); |
||||
|
const palletBoxes = boxesMap.get(palletSeqNo) || []; |
||||
|
|
||||
|
let palletRowSpan = 0; |
||||
|
const palletRows = []; |
||||
|
|
||||
|
if (palletBoxes.length > 0) { |
||||
|
palletBoxes.forEach((box, boxIdx) => { |
||||
|
const boxItemNo = String(box.item_no || box.itemNo); |
||||
|
const boxDetails = detailsMap.get(boxItemNo) || []; |
||||
|
|
||||
|
if (boxDetails.length > 0) { |
||||
|
boxDetails.forEach((detail, detailIdx) => { |
||||
|
palletRowSpan++; |
||||
|
palletRows.push({ |
||||
|
_palletKey: palletSeqNo, |
||||
|
_boxKey: boxItemNo, |
||||
|
_isFirstRowOfPallet: boxIdx === 0 && detailIdx === 0, |
||||
|
_isFirstRowOfBox: detailIdx === 0, |
||||
|
_boxRowSpan: detailIdx === 0 ? boxDetails.length : 0, |
||||
|
pallet_no: pallet.palletNo, |
||||
|
pallet_qty: pallet.palletQty, |
||||
|
volume: pallet.volume, |
||||
|
gross_weight: box.gross_weight || box.grossWeight, |
||||
|
net_weight: box.net_weight || box.netWeight, |
||||
|
_hasDetail: true, |
||||
|
seqNo: detail.seqNo, |
||||
|
itemNo: detail.itemNo, |
||||
|
notifyDetailItemNo: detail.notifyDetailItemNo, |
||||
|
pn: detail.pn, |
||||
|
qty: detail.qty, |
||||
|
box_qty: detail.boxQty, |
||||
|
qty_per_box: detail.boxQty && detail.boxQty > 0 ? (detail.qty / detail.boxQty).toFixed(2) : '-' |
||||
|
}); |
||||
|
}); |
||||
|
} else { |
||||
|
palletRowSpan++; |
||||
|
palletRows.push({ |
||||
|
_palletKey: palletSeqNo, |
||||
|
_boxKey: boxItemNo, |
||||
|
_isFirstRowOfPallet: boxIdx === 0, |
||||
|
_isFirstRowOfBox: true, |
||||
|
_boxRowSpan: 1, |
||||
|
pallet_no: pallet.palletNo, |
||||
|
pallet_qty: pallet.palletQty, |
||||
|
volume: pallet.volume, |
||||
|
gross_weight: box.gross_weight || box.grossWeight, |
||||
|
net_weight: box.net_weight || box.netWeight, |
||||
|
_hasDetail: false, |
||||
|
pn: '', |
||||
|
qty: '', |
||||
|
box_qty: box.box_qty || box.boxQty || '', |
||||
|
qty_per_box: '' |
||||
|
}); |
||||
|
} |
||||
|
}); |
||||
|
} else { |
||||
|
// Pallet has no boxes |
||||
|
palletRowSpan++; |
||||
|
palletRows.push({ |
||||
|
_palletKey: palletSeqNo, |
||||
|
_boxKey: 'empty_box_' + palletSeqNo, |
||||
|
_isFirstRowOfPallet: true, |
||||
|
_isFirstRowOfBox: true, |
||||
|
_boxRowSpan: 1, |
||||
|
pallet_no: pallet.palletNo, |
||||
|
pallet_qty: pallet.palletQty, |
||||
|
volume: pallet.volume, |
||||
|
gross_weight: '', |
||||
|
net_weight: '', |
||||
|
_hasDetail: false, |
||||
|
pn: '', |
||||
|
qty: '', |
||||
|
box_qty: '', |
||||
|
qty_per_box: '' |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
if (palletRows.length > 0) { |
||||
|
palletRows[0]._palletRowSpan = palletRowSpan; |
||||
|
flattenedData.push(...palletRows); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
this.flattenedTableData = flattenedData; |
||||
|
|
||||
|
const palletGrossWeight = pallets.reduce((sum, item) => sum + (Number(item.grossWeight) || 0), 0); |
||||
|
this.totalGrossWeight = palletGrossWeight + this.palletWeight; |
||||
|
|
||||
|
this.totalVolume = this.currentRow.totalVolume !== undefined && this.currentRow.totalVolume !== null |
||||
|
? this.currentRow.totalVolume |
||||
|
: null; |
||||
|
|
||||
|
} catch (error) { |
||||
|
console.error(`[${loadingId}] 加载数据失败:`, error); |
||||
|
if (this.currentLoadingId === loadingId) { |
||||
|
this.flattenedTableData = []; |
||||
|
this.palletWeight = 0; |
||||
|
this.totalGrossWeight = 0; |
||||
|
} |
||||
|
} finally { |
||||
|
if (this.currentLoadingId === loadingId) { |
||||
|
this.dataListLoading = false; |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
mainTableSpanMethod({ row, column, rowIndex, columnIndex }) { |
||||
|
if (!row._palletKey) { |
||||
|
return { rowspan: 1, colspan: 1 }; |
||||
|
} |
||||
|
|
||||
|
// 托盘级别合并(托号、托数、总体积) |
||||
|
if (columnIndex >= 0 && columnIndex <= 2) { |
||||
|
if (row._isFirstRowOfPallet) { |
||||
|
return { rowspan: row._palletRowSpan, colspan: 1 }; |
||||
|
} else { |
||||
|
return { rowspan: 0, colspan: 0 }; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 箱级别合并(毛重、净重) |
||||
|
if (columnIndex >= 3 && columnIndex <= 4) { |
||||
|
if (row._isFirstRowOfBox) { |
||||
|
return { rowspan: row._boxRowSpan, colspan: 1 }; |
||||
|
} else { |
||||
|
return { rowspan: 0, colspan: 0 }; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return { rowspan: 1, colspan: 1 }; |
||||
|
}, |
||||
|
|
||||
|
rowClassName({ row, rowIndex }) { |
||||
|
let classes = []; |
||||
|
// 给每个托盘的最后一行加一个下边框加粗的类,用于区分不同的托盘 |
||||
|
if (row._isLastRowOfPallet) { |
||||
|
classes.push('pallet-bottom-border'); |
||||
|
} |
||||
|
|
||||
|
// 动态添加悬浮高亮类 |
||||
|
if (this.hoveredPalletKey && row._palletKey === this.hoveredPalletKey) { |
||||
|
classes.push('hover-pallet-group'); |
||||
|
} else if (this.hoveredBoxKey && row._boxKey === this.hoveredBoxKey) { |
||||
|
classes.push('hover-box-group'); |
||||
|
} |
||||
|
|
||||
|
return classes.join(' '); |
||||
|
}, |
||||
|
|
||||
|
handleCellMouseEnter(row, column, cell, event) { |
||||
|
if (column.property === 'pallet_no' || column.property === 'pallet_qty' || column.property === 'volume') { |
||||
|
this.hoveredPalletKey = row._palletKey; |
||||
|
this.hoveredBoxKey = null; |
||||
|
} else if (column.property === 'gross_weight' || column.property === 'net_weight') { |
||||
|
this.hoveredBoxKey = row._boxKey; |
||||
|
this.hoveredPalletKey = null; |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
handleCellMouseLeave(row, column, cell, event) { |
||||
|
this.hoveredPalletKey = null; |
||||
|
this.hoveredBoxKey = null; |
||||
|
}, |
||||
|
|
||||
|
getHeaderClassName({ column, columnIndex }) { |
||||
|
if (columnIndex >= 0 && columnIndex <= 2) { |
||||
|
return 'pallet-header'; |
||||
|
} else if (columnIndex >= 3 && columnIndex <= 4) { |
||||
|
return 'box-header'; |
||||
|
} else if (columnIndex >= 5 && columnIndex <= 8) { |
||||
|
return 'detail-header'; |
||||
|
} |
||||
|
return ''; |
||||
|
}, |
||||
|
|
||||
|
getCellClassName({ row, column, rowIndex, columnIndex }) { |
||||
|
if (columnIndex >= 0 && columnIndex <= 2) { |
||||
|
return 'pallet-cell'; |
||||
|
} else if (columnIndex >= 3 && columnIndex <= 4) { |
||||
|
return 'box-cell'; |
||||
|
} else if (columnIndex >= 5 && columnIndex <= 8) { |
||||
|
return 'detail-cell'; |
||||
|
} |
||||
|
return ''; |
||||
|
}, |
||||
|
|
||||
|
formatDetailValue(value, columnProp) { |
||||
|
if (value === null || value === undefined || value === '') { |
||||
|
return '-'; |
||||
|
} |
||||
|
if (columnProp === 'qty' ) { |
||||
|
return value.toLocaleString(); |
||||
|
} |
||||
|
return value; |
||||
|
}, |
||||
|
|
||||
|
refresh() { |
||||
|
this.loadBoxList(); |
||||
|
}, |
||||
|
|
||||
|
getSummaries(param) { |
||||
|
const { columns, data } = param; |
||||
|
const sums = []; |
||||
|
|
||||
|
columns.forEach((column, index) => { |
||||
|
if (index === 0) { |
||||
|
sums[index] = '合计'; |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
if (column.property === 'pallet_qty') { |
||||
|
const palletFirstRows = data.filter(item => item._isFirstRowOfPallet); |
||||
|
const sum = palletFirstRows.reduce((prev, curr) => { |
||||
|
const value = Number(curr.pallet_qty); |
||||
|
return !isNaN(value) ? prev + value : prev; |
||||
|
}, 0); |
||||
|
sums[index] = sum; |
||||
|
} else if (column.property === 'volume') { |
||||
|
const palletFirstRows = data.filter(item => item._isFirstRowOfPallet); |
||||
|
const sum = palletFirstRows.reduce((prev, curr) => { |
||||
|
const value = Number(curr.volume); |
||||
|
return !isNaN(value) ? prev + value : prev; |
||||
|
}, 0); |
||||
|
sums[index] = sum.toFixed(2); |
||||
|
} else if (column.property === 'gross_weight') { |
||||
|
const boxFirstRows = data.filter(item => item._isFirstRowOfBox); |
||||
|
const sum = boxFirstRows.reduce((prev, curr) => { |
||||
|
const value = Number(curr.gross_weight); |
||||
|
return !isNaN(value) ? prev + value : prev; |
||||
|
}, 0); |
||||
|
sums[index] = sum.toFixed(2); |
||||
|
} else if (column.property === 'net_weight') { |
||||
|
const boxFirstRows = data.filter(item => item._isFirstRowOfBox); |
||||
|
const sum = boxFirstRows.reduce((prev, curr) => { |
||||
|
const value = Number(curr.net_weight); |
||||
|
return !isNaN(value) ? prev + value : prev; |
||||
|
}, 0); |
||||
|
sums[index] = sum.toFixed(2); |
||||
|
} else if (column.property === 'qty') { |
||||
|
const sum = data.filter(item => item._hasDetail).reduce((prev, curr) => { |
||||
|
const value = Number(curr.qty); |
||||
|
return !isNaN(value) ? prev + value : prev; |
||||
|
}, 0); |
||||
|
sums[index] = sum > 0 ? sum.toLocaleString() : ''; |
||||
|
} else if (column.property === 'box_qty') { |
||||
|
// 箱数需要根据明细累加,如果没有明细,则根据箱级别累加 |
||||
|
let sum = 0; |
||||
|
const boxFirstRows = data.filter(item => item._isFirstRowOfBox); |
||||
|
boxFirstRows.forEach(boxRow => { |
||||
|
// Find all details for this box |
||||
|
const boxDetails = data.filter(item => item._boxKey === boxRow._boxKey && item._hasDetail); |
||||
|
if (boxDetails.length > 0) { |
||||
|
// Sum box_qty from details |
||||
|
boxDetails.forEach(detail => { |
||||
|
const value = Number(detail.box_qty); |
||||
|
if (!isNaN(value)) sum += value; |
||||
|
}); |
||||
|
} else { |
||||
|
// Use box_qty from box level if no details |
||||
|
const value = Number(boxRow.box_qty); |
||||
|
if (!isNaN(value)) sum += value; |
||||
|
} |
||||
|
}); |
||||
|
sums[index] = sum; |
||||
|
} else { |
||||
|
sums[index] = ''; |
||||
|
} |
||||
|
}); |
||||
|
return sums; |
||||
|
}, |
||||
|
|
||||
|
openAdjustWeightDialog() { |
||||
|
this.adjustWeightForm.actualGrossWeight = ''; |
||||
|
this.adjustWeightDialogVisible = true; |
||||
|
}, |
||||
|
|
||||
|
async submitAdjustWeight() { |
||||
|
const actualGrossWeight = parseFloat(this.adjustWeightForm.actualGrossWeight); |
||||
|
if (isNaN(actualGrossWeight) || actualGrossWeight <= 0) { |
||||
|
this.$message.warning('请输入有效的实际总毛重'); |
||||
|
return; |
||||
|
} |
||||
|
this.adjustWeightSaving = true; |
||||
|
try { |
||||
|
const adjustParams = { |
||||
|
site: this.currentRow.site, |
||||
|
buNo: this.currentRow.buNo, |
||||
|
delNo: this.currentRow.delNo, |
||||
|
actualGrossWeight: actualGrossWeight, |
||||
|
updateBy: this.$store.state.user.name |
||||
|
}; |
||||
|
const response = await adjustTotalGrossWeight(adjustParams); |
||||
|
if (response.data && response.data.code === 0) { |
||||
|
this.$message.success('总毛重调整成功'); |
||||
|
this.adjustWeightDialogVisible = false; |
||||
|
this.loadBoxList(); |
||||
|
this.$emit('refresh'); |
||||
|
} else { |
||||
|
this.$alert(response.data.msg || '调整失败', '错误', { confirmButtonText: '确定' }); |
||||
|
} |
||||
|
} catch (error) { |
||||
|
this.$message.error('调整失败'); |
||||
|
} finally { |
||||
|
this.adjustWeightSaving = false; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.packing-detail-tab { |
||||
|
width: 100%; |
||||
|
} |
||||
|
.batch-edit-toolbar { |
||||
|
margin-bottom: 10px; |
||||
|
display: flex; |
||||
|
justify-content: flex-start; |
||||
|
gap: 10px; |
||||
|
} |
||||
|
.box-info-text { |
||||
|
font-weight: 600; |
||||
|
color: #303133; |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
.box-weight-text { |
||||
|
font-weight: 600; |
||||
|
color: #606266; |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
.detail-text { |
||||
|
color: #606266; |
||||
|
font-size: 13px; |
||||
|
} |
||||
|
/deep/ .el-table { |
||||
|
font-size: 13px; |
||||
|
} |
||||
|
/deep/ .el-table th { |
||||
|
background-color: #f5f7fa !important; |
||||
|
color: #606266 !important; |
||||
|
padding: 5px 0; |
||||
|
} |
||||
|
/deep/ .el-table td { |
||||
|
padding: 8px 0; |
||||
|
} |
||||
|
/deep/ .el-table__body td[rowspan] .cell { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
min-height: 40px; |
||||
|
} |
||||
|
|
||||
|
/* 托盘级别颜色 */ |
||||
|
/deep/ .el-table .pallet-header { |
||||
|
background-color: #e8effa !important; |
||||
|
} |
||||
|
/deep/ .el-table .pallet-cell { |
||||
|
background-color: #ffffff !important; |
||||
|
} |
||||
|
/* 托盘悬浮颜色 */ |
||||
|
/deep/ .el-table--enable-row-hover .el-table__body tr.hover-row > td.pallet-cell, |
||||
|
/deep/ .el-table__body tr.hover-row td.pallet-cell[rowspan] { |
||||
|
background-color: #f5f7fa !important; |
||||
|
} |
||||
|
|
||||
|
/* 箱级别颜色 */ |
||||
|
/deep/ .el-table .box-header { |
||||
|
background-color: #f8f4eb !important; |
||||
|
} |
||||
|
/deep/ .el-table .box-cell { |
||||
|
background-color: #ffffff !important; |
||||
|
} |
||||
|
/* 箱悬浮颜色 */ |
||||
|
/deep/ .el-table--enable-row-hover .el-table__body tr.hover-row > td.box-cell, |
||||
|
/deep/ .el-table__body tr.hover-row td.box-cell[rowspan] { |
||||
|
background-color: #f5f7fa !important; |
||||
|
} |
||||
|
|
||||
|
/* 明细级别颜色 (纯白) */ |
||||
|
/deep/ .el-table .detail-header { |
||||
|
background-color: #f5f7fa !important; |
||||
|
} |
||||
|
/deep/ .el-table .detail-cell { |
||||
|
background-color: #ffffff !important; |
||||
|
} |
||||
|
/* 明细悬浮颜色 */ |
||||
|
/deep/ .el-table--enable-row-hover .el-table__body tr.hover-row > td.detail-cell { |
||||
|
background-color: #f5f7fa !important; |
||||
|
} |
||||
|
|
||||
|
/* 整个托盘组悬浮高亮效果 */ |
||||
|
/deep/ .el-table .hover-pallet-group td.pallet-cell { |
||||
|
background-color: #f5f7fa !important; |
||||
|
} |
||||
|
/deep/ .el-table .hover-pallet-group td.box-cell { |
||||
|
background-color: #f5f7fa !important; |
||||
|
} |
||||
|
/deep/ .el-table .hover-pallet-group td.detail-cell { |
||||
|
background-color: #f5f7fa !important; |
||||
|
} |
||||
|
|
||||
|
/* 整个箱组悬浮高亮效果 */ |
||||
|
/deep/ .el-table .hover-box-group td.box-cell { |
||||
|
background-color: #f5f7fa !important; |
||||
|
} |
||||
|
/deep/ .el-table .hover-box-group td.detail-cell { |
||||
|
background-color: #f5f7fa !important; |
||||
|
} |
||||
|
|
||||
|
/* 增加行之间的边框,让层级更明显 */ |
||||
|
/deep/ .el-table td, /deep/ .el-table th.is-leaf { |
||||
|
border-bottom: 1px solid #ebeef5; |
||||
|
} |
||||
|
/deep/ .el-table--border td, /deep/ .el-table--border th, /deep/ .el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed { |
||||
|
border-right: 1px solid #ebeef5; |
||||
|
} |
||||
|
|
||||
|
/* 托盘之间的分隔线 */ |
||||
|
/deep/ .el-table .pallet-bottom-border td { |
||||
|
border-bottom: 1px solid #ebeef5 !important; |
||||
|
} |
||||
|
|
||||
|
/* 移除明细最后一行的默认底边框,避免冲突 */ |
||||
|
/deep/ .el-table::before { |
||||
|
height: 0px; |
||||
|
} |
||||
|
</style> |
||||
1924
src/views/modules/ecss/del_upload_excel_tx.vue
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Write
Preview
Loading…
Cancel
Save
Reference in new issue