优化套餐新建版本的逻辑

This commit is contained in:
wuweihua
2026-10-28 22:09:30 +08:00
parent 786feec859
commit 56340d0ea0
7 changed files with 177 additions and 47 deletions
@@ -58,6 +58,7 @@
<div class="build-card__desc">按产品库基础价生成套餐产品列表,可再导入 Excel 修改价格</div>
</button>
<button
v-if="showImportInherit"
type="button"
class="build-card build-card--import"
:class="{ selected: isImportBuildMode(priceBuildMode) }"
@@ -247,7 +248,12 @@ const props = defineProps({
/** True when build mode changed locally and not saved yet */
buildModeDirty: { type: Boolean, default: false },
/** False while parent still loading package data — avoid first click being wiped by applySetData */
buildModeReady: { type: Boolean, default: true }
buildModeReady: { type: Boolean, default: true },
/**
* Show「按上一版 Excel 建价」(IMPORT). Hidden for brand-new package create
* (no prior version); keep for newVersion / copy / edit.
*/
showImportInherit: { type: Boolean, default: true }
})
const emit = defineEmits(['update:psvId', 'update:priceBuildMode', 'update:pefId'])
@@ -173,7 +173,8 @@ const noneSc = '无'
const isFixed = computed(() => isFixedType(props.setType))
const title = computed(() => {
const v = props.version || {}
return (v.versionNo || '-') + ' · 版本明细'
const eff = v.effectiveTime || '未设置生效时间'
return eff + ' · 版本明细'
})
const detailTitleText = computed(() => {
const p = activeProduct.value || {}
@@ -19,13 +19,10 @@
</el-tabs>
<el-table :data="filteredVersions" border empty-text="暂无版本">
<el-table-column :label="colNo" width="100">
<template #default="{ row }">
<el-button link type="primary" @click="openDetails(row)">{{ row.versionNo || '-' }}</el-button>
</template>
</el-table-column>
<el-table-column :label="colEff" min-width="170">
<template #default="{ row }">{{ row.effectiveTime || '-' }}</template>
<template #default="{ row }">
<el-button link type="primary" @click="openDetails(row)">{{ row.effectiveTime || '未设置' }}</el-button>
</template>
</el-table-column>
<el-table-column :label="colExp" min-width="170">
<template #default="{ row }">{{ row.expireTime || '-' }}</template>
@@ -90,7 +87,6 @@ const props = defineProps({
const emit = defineEmits(['update:modelValue', 'create-version', 'open-details', 'view-import-attach', 'activate', 'reschedule', 'edit', 'remove'])
const title = '套餐版本'
const colNo = '版本号'
const colEff = '生效时间'
const colExp = '失效时间'
const colStatus = '状态'
@@ -121,10 +117,33 @@ function tabLabel(key) {
const hasDraft = computed(() => (props.versions || []).some(v => isDraftVersion(v)))
function toEffMs(v) {
if (!v || !v.effectiveTime) return NaN
const t = new Date(String(v.effectiveTime).replace(/-/g, '/')).getTime()
return Number.isNaN(t) ? NaN : t
}
/** Sort by effective time descending; drafts without time last. */
function sortByEffectiveTime(list) {
return (list || []).slice().sort((a, b) => {
const ta = toEffMs(a)
const tb = toEffMs(b)
const aNull = Number.isNaN(ta)
const bNull = Number.isNaN(tb)
if (aNull && bNull) return (Number(b.versionSeq) || 0) - (Number(a.versionSeq) || 0)
if (aNull) return 1
if (bNull) return -1
if (tb !== ta) return tb - ta
return (Number(b.versionSeq) || 0) - (Number(a.versionSeq) || 0)
})
}
const filteredVersions = computed(() => {
const list = props.versions || []
if (statusTab.value === 'all') return list
return list.filter(v => String(v.status) === statusTab.value)
const filtered = statusTab.value === 'all'
? list
: list.filter(v => String(v.status) === statusTab.value)
return sortByEffectiveTime(filtered)
})
function detailCount(row) {