提单费用调整

This commit is contained in:
liuminghui
2026-11-10 15:21:03 +08:00
parent e6a9fcf0a2
commit da9efc422e
16 changed files with 911 additions and 170 deletions
@@ -1,11 +1,6 @@
<template>
<el-dialog v-model="visible" title="导入应付价卡" width="1080px" append-to-body destroy-on-close @closed="reset">
<el-form label-width="88px" class="import-form">
<el-form-item label="支付类型" required>
<el-select v-model="productType" filterable placeholder="请选择支付类型" style="width: 420px">
<el-option v-for="item in bms_pay_type" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="产品">
<el-select v-model="dictValue" clearable filterable placeholder="不选则按工作表名称匹配全部字典产品" style="width: 420px">
<el-option v-for="item in payment_product_type" :key="item.value" :label="item.label" :value="item.value" />
@@ -115,14 +110,13 @@ import PayConfigDetail from './PayConfigDetail.vue'
const emit = defineEmits(['saved'])
const { proxy } = getCurrentInstance()
const { payment_product_type, bms_pay_type } = useDict('payment_product_type', 'bms_pay_type')
const { payment_product_type } = useDict('payment_product_type')
const visible = ref(false)
const recognizing = ref(false)
const saving = ref(false)
const overwrite = ref(false)
const dictValue = ref('')
const productType = ref('AP')
const preview = ref(null)
const selected = ref([])
const tableRef = ref()
@@ -150,7 +144,6 @@ function reset() {
selected.value = []
overwrite.value = false
dictValue.value = ''
productType.value = 'AP'
activeKey.value = ''
recognizing.value = false
saving.value = false
@@ -265,10 +258,6 @@ function onSelect(rows) {
}
async function save() {
if (!productType.value) {
proxy.$modal.msgError('请选择支付类型')
return
}
if (!selected.value.length) {
proxy.$modal.msgError('请勾选要保存的产品')
return
@@ -284,8 +273,7 @@ async function save() {
}
saving.value = true
try {
const products = selected.value.map(row => ({ ...row, productType: productType.value }))
const res = await savePay({ overwrite: overwrite.value, products })
const res = await savePay({ overwrite: overwrite.value, products: selected.value })
const message = res.msg || '保存成功'
reset()
visible.value = false
+118 -18
View File
@@ -61,12 +61,12 @@
<pay-import-dialog ref="importRef" @saved="tableRef.refresh()" />
<el-drawer v-model="historyVisible" :title="historyTitle" size="980px" destroy-on-close>
<el-drawer v-model="historyVisible" :title="historyTitle" size="980px" append-to-body destroy-on-close>
<div class="history-bar">
<el-button type="primary" plain :disabled="historyPicked.length !== 2" @click="openCompare">比对所选版本</el-button>
<span>勾选两个版本后比对。历史订单按生效时间取价,不看当前开关。</span>
</div>
<el-table v-loading="historyLoading" :data="historyRows" border size="small" empty-text="还没有价格版本" @selection-change="onHistoryPick">
<el-table v-loading="historyLoading" :data="historyRows" row-key="termId" border size="small" empty-text="还没有价格版本" @selection-change="onHistoryPick">
<el-table-column type="selection" width="42" align="center" />
<el-table-column prop="versionNo" label="版本" width="70" align="center" />
<el-table-column label="来源文件" min-width="160" show-overflow-tooltip>
@@ -123,15 +123,42 @@
</template>
</el-dialog>
<el-drawer v-model="compareVisible" :title="compareTitle" size="88%" append-to-body destroy-on-close>
<el-table v-loading="compareLoading" :data="compareRows" border size="small" max-height="640" empty-text="没有差异">
<el-table-column prop="kind" label="类型" width="90" align="center" />
<el-table-column prop="change" label="变化" width="80" align="center" />
<el-table-column prop="name" label="项目" min-width="160" show-overflow-tooltip />
<el-table-column prop="zoneName" label="地区" min-width="140" show-overflow-tooltip />
<el-table-column prop="oldValue" label="旧版" min-width="160" show-overflow-tooltip />
<el-table-column prop="newValue" label="新版" min-width="160" show-overflow-tooltip />
</el-table>
<el-drawer v-model="compareVisible" :title="compareTitle" size="88%" append-to-body :z-index="4000" destroy-on-close>
<div class="compare-panel">
<div v-if="compareReady && !compareLoading" class="history-bar">
<el-tag type="primary" effect="plain">变更 {{ compareStat.changed }}</el-tag>
<el-tag type="success" effect="plain">新增 {{ compareStat.added }}</el-tag>
<el-tag type="danger" effect="plain">删除 {{ compareStat.removed }}</el-tag>
<el-tag type="info" effect="plain">相同 {{ compareStat.same }}</el-tag>
</div>
<el-alert
v-if="compareReady && !compareLoading && !compareRows.length"
title="这两版的有效期、重量段和附加费一致"
type="success"
:closable="false"
show-icon
/>
<el-table v-show="compareLoading || compareRows.length" v-loading="compareLoading" :data="compareRows" :row-class-name="compareRowClass" border size="small" max-height="640" empty-text="没有差异">
<el-table-column prop="kind" label="类型" width="100" align="center" />
<el-table-column label="变化" width="90" align="center">
<template #default="{ row }">
<el-tag :type="changeTagType(row.change)" effect="light">{{ row.change }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="name" label="项目" min-width="180" show-overflow-tooltip />
<el-table-column prop="zoneName" label="地区" min-width="140" show-overflow-tooltip />
<el-table-column label="旧版" min-width="200" show-overflow-tooltip>
<template #default="{ row }">
<span :class="changeTextClass(row.change, 'old')">{{ row.oldValue || '-' }}</span>
</template>
</el-table-column>
<el-table-column label="新版" min-width="200" show-overflow-tooltip>
<template #default="{ row }">
<span :class="changeTextClass(row.change, 'new')">{{ row.newValue || '-' }}</span>
</template>
</el-table-column>
</el-table>
</div>
</el-drawer>
<el-drawer
@@ -187,6 +214,12 @@ const compareVisible = ref(false)
const compareLoading = ref(false)
const compareTitle = ref('版本比对')
const compareRows = ref([])
const compareAll = ref([])
const compareReady = ref(false)
const compareStat = computed(() => {
const count = (name) => compareAll.value.filter(row => row.change === name).length
return { changed: count('变更'), added: count('新增'), removed: count('删除'), same: count('相同') }
})
const detailTitle = computed(() => {
if (!detail.value) return '应付配置'
const no = detail.value.versionNo ? `第 ${detail.value.versionNo} 版` : ''
@@ -356,23 +389,60 @@ function onHistoryPick(rows) {
function openCompare() {
if (historyPicked.value.length !== 2) return
const [first, second] = historyPicked.value
const [first, second] = [...historyPicked.value].sort((a, b) => (Number(a.versionNo) || 0) - (Number(b.versionNo) || 0))
if (!first.productId || !second.productId) {
proxy.$modal.msgError('选中的版本没有价格数据')
return
}
compareTitle.value = `第 ${first.versionNo || '-'} 版 对比 第 ${second.versionNo || '-'} 版`
compareVisible.value = true
compareLoading.value = true
compareRows.value = []
compareAll.value = []
compareReady.value = false
comparePay(first.productId, second.productId).then(res => {
const data = res.data || {}
const older = data.older?.versionNo || '-'
const newer = data.newer?.versionNo || '-'
compareTitle.value = `第 ${older} 版 对比 第 ${newer} 版`
const weights = (data.weightDiffs || []).map(row => ({ ...row, kind: '重量段' }))
const fees = (data.surchargeDiffs || []).map(row => ({ ...row, kind: '附加费' }))
compareRows.value = weights.concat(fees).filter(row => row.change !== '相同')
const older = data.older?.versionNo
const newer = data.newer?.versionNo
if (older && newer) compareTitle.value = `第 ${older} 版 对比 第 ${newer} 版`
const rows = []
.concat(markKind(data.versionDiffs, '版本'))
.concat(markKind(data.weightDiffs, '重量段'))
.concat(markKind(data.surchargeDiffs, '附加费'))
.concat(markKind(data.extraDiffs, '其他配置'))
compareAll.value = rows
compareRows.value = rows.filter(row => row.change !== '相同')
compareReady.value = true
}).finally(() => {
compareLoading.value = false
})
}
function markKind(rows, kind) {
return (rows || []).map(row => ({ ...row, kind: row.kind || kind }))
}
function changeTagType(change) {
if (change === '变更') return 'primary'
if (change === '新增') return 'success'
if (change === '删除') return 'danger'
return 'info'
}
function compareRowClass({ row }) {
if (row.change === '变更') return 'compare-changed'
if (row.change === '新增') return 'compare-added'
if (row.change === '删除') return 'compare-removed'
return ''
}
function changeTextClass(change, side) {
if (change === '变更') return 'compare-text-changed'
if (change === '删除' && side === 'old') return 'compare-text-removed'
if (change === '新增' && side === 'new') return 'compare-text-added'
return ''
}
function loadHistory() {
if (!historyProductId.value) return
historyLoading.value = true
@@ -446,4 +516,34 @@ function statusType(status) {
margin-bottom: 12px;
color: var(--el-text-color-secondary);
}
.compare-text-changed {
color: var(--el-color-primary);
font-weight: 600;
}
.compare-text-added {
color: var(--el-color-success);
font-weight: 600;
}
.compare-text-removed {
color: var(--el-color-danger);
font-weight: 600;
}
.compare-panel :deep(tr.compare-changed > td.el-table__cell) {
background: var(--el-color-primary-light-9);
}
.compare-panel :deep(tr.compare-added > td.el-table__cell) {
background: var(--el-color-success-light-9);
}
.compare-panel :deep(tr.compare-removed > td.el-table__cell) {
background: var(--el-color-danger-light-9);
}
.compare-panel :deep(tr.compare-changed:hover > td.el-table__cell) {
background: var(--el-color-primary-light-8);
}
.compare-panel :deep(tr.compare-added:hover > td.el-table__cell) {
background: var(--el-color-success-light-8);
}
.compare-panel :deep(tr.compare-removed:hover > td.el-table__cell) {
background: var(--el-color-danger-light-8);
}
</style>