|
|
@@ -56,6 +56,21 @@
|
|
|
当前已使用:{{ seedUsedCount }} / {{ configValues['pricing.practitioner.seed_limit'] }}
|
|
|
</div>
|
|
|
</div>
|
|
|
+ <div class="field-item">
|
|
|
+ <div class="field-main">
|
|
|
+ <span class="field-label">种子价有效期</span>
|
|
|
+ <el-date-picker
|
|
|
+ v-model="configValues['pricing.practitioner.seed_period_end']"
|
|
|
+ type="datetime"
|
|
|
+ format="YYYY-MM-DD HH:mm:ss"
|
|
|
+ value-format="YYYY-MM-DD HH:mm:ss"
|
|
|
+ placeholder="选择种子价有效期"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="field-hint">
|
|
|
+ {{ seedPeriodHint }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
<div class="field-item">
|
|
|
<div class="field-main">
|
|
|
<span class="field-label">C端年费</span>
|
|
|
@@ -266,10 +281,11 @@ import request from '@/utils/request'
|
|
|
|
|
|
/* ──────────── Constants ──────────── */
|
|
|
|
|
|
-const VALUE_TYPES: Record<string, 'price' | 'percent' | 'plain'> = {
|
|
|
+const VALUE_TYPES: Record<string, 'price' | 'percent' | 'plain' | 'string'> = {
|
|
|
'pricing.practitioner.seed': 'price',
|
|
|
'pricing.practitioner.standard': 'price',
|
|
|
'pricing.practitioner.seed_limit': 'plain',
|
|
|
+ 'pricing.practitioner.seed_period_end': 'string',
|
|
|
'pricing.annual': 'price',
|
|
|
'commission.practitioner.l1': 'price',
|
|
|
'commission.practitioner.l1_cend': 'price',
|
|
|
@@ -288,6 +304,7 @@ const ALL_CONFIG_KEYS: string[] = [
|
|
|
'pricing.practitioner.seed',
|
|
|
'pricing.practitioner.standard',
|
|
|
'pricing.practitioner.seed_limit',
|
|
|
+ 'pricing.practitioner.seed_period_end',
|
|
|
'pricing.annual',
|
|
|
'commission.practitioner.l1',
|
|
|
'commission.practitioner.l1_cend',
|
|
|
@@ -311,6 +328,7 @@ const SEED_DEFAULTS: Record<string, string> = {
|
|
|
'pricing.practitioner.seed': '131400',
|
|
|
'pricing.practitioner.standard': '198600',
|
|
|
'pricing.practitioner.seed_limit': '300',
|
|
|
+ 'pricing.practitioner.seed_period_end': '2027-12-31T23:59:59',
|
|
|
'pricing.annual': '13100',
|
|
|
'commission.practitioner.l1': '50000',
|
|
|
'commission.practitioner.l1_cend': '20000',
|
|
|
@@ -329,7 +347,7 @@ const SEED_DEFAULTS: Record<string, string> = {
|
|
|
|
|
|
/* ──────────── Card key groups ──────────── */
|
|
|
|
|
|
-const pricingKeys = ['pricing.practitioner.seed', 'pricing.practitioner.standard', 'pricing.practitioner.seed_limit', 'pricing.annual']
|
|
|
+const pricingKeys = ['pricing.practitioner.seed', 'pricing.practitioner.standard', 'pricing.practitioner.seed_limit', 'pricing.practitioner.seed_period_end', 'pricing.annual']
|
|
|
const bCommissionKeys = ['commission.practitioner.l1', 'commission.practitioner.l1_cend', 'commission.practitioner.l2']
|
|
|
const cCommissionKeys = ['commission.annual.direct_rate', 'commission.annual.upstream_rate']
|
|
|
const planKeys = ['commerce.category.practitioner_plan.commission_rate', 'commission.practitioner_plan.referral_rate', 'commission.practitioner_plan.upstream_rate', 'plan_request.min_price', 'plan_request.max_price', 'plan_request.max_negotiation_rounds']
|
|
|
@@ -340,6 +358,7 @@ const FIELD_LABELS: Record<string, string> = {
|
|
|
'pricing.practitioner.seed': '能量师种子价',
|
|
|
'pricing.practitioner.standard': '能量师标准价',
|
|
|
'pricing.practitioner.seed_limit': '种子价名额上限',
|
|
|
+ 'pricing.practitioner.seed_period_end': '种子价有效期',
|
|
|
'pricing.annual': 'C端年费',
|
|
|
'commission.practitioner.l1': 'L1 佣金—能量师推荐',
|
|
|
'commission.practitioner.l1_cend': 'L1 佣金—C端推荐',
|
|
|
@@ -364,7 +383,7 @@ const seedUsedCount = ref(0)
|
|
|
const storageValues = reactive<Record<string, string>>({})
|
|
|
|
|
|
/** Stores current display-unit editable values */
|
|
|
-const configValues = reactive<Record<string, number>>({})
|
|
|
+const configValues = reactive<Record<string, number | string>>({})
|
|
|
|
|
|
/** Initialise with seed defaults */
|
|
|
Object.entries(SEED_DEFAULTS).forEach(([key, value]) => {
|
|
|
@@ -375,17 +394,20 @@ Object.entries(SEED_DEFAULTS).forEach(([key, value]) => {
|
|
|
|
|
|
/* ──────────── Unit conversion ──────────── */
|
|
|
|
|
|
-function storageToDisplay(key: string, raw: string): number {
|
|
|
+function storageToDisplay(key: string, raw: string): number | string {
|
|
|
const vt = VALUE_TYPES[key]
|
|
|
+ if (vt === 'string') return raw
|
|
|
const num = Number(raw)
|
|
|
if (vt === 'price' || vt === 'percent') return num / 100
|
|
|
return num
|
|
|
}
|
|
|
|
|
|
-function displayToStorage(key: string, display: number): number {
|
|
|
+function displayToStorage(key: string, display: number | string): number | string {
|
|
|
const vt = VALUE_TYPES[key]
|
|
|
- if (vt === 'price' || vt === 'percent') return Math.round(display * 100)
|
|
|
- return Math.round(display)
|
|
|
+ if (vt === 'string') return display
|
|
|
+ const num = display as number
|
|
|
+ if (vt === 'price' || vt === 'percent') return Math.round(num * 100)
|
|
|
+ return Math.round(num)
|
|
|
}
|
|
|
|
|
|
/* ──────────── Formatting helpers ──────────── */
|
|
|
@@ -418,6 +440,18 @@ function resetTooltipContent(keys: string[]): string {
|
|
|
const seedPrice = computed(() => configValues['pricing.practitioner.seed'] || 0)
|
|
|
const standardPrice = computed(() => configValues['pricing.practitioner.standard'] || 0)
|
|
|
|
|
|
+/** 种子价有效期剩余天数 */
|
|
|
+const seedPeriodHint = computed(() => {
|
|
|
+ const val = configValues['pricing.practitioner.seed_period_end']
|
|
|
+ if (!val) return '未设置有效期'
|
|
|
+ const end = new Date(val).getTime()
|
|
|
+ const now = Date.now()
|
|
|
+ const diff = end - now
|
|
|
+ if (diff <= 0) return '🔴 已过期'
|
|
|
+ const days = Math.ceil(diff / (1000 * 60 * 60 * 24))
|
|
|
+ return '🟢 有效期剩余 ' + days + ' 天'
|
|
|
+})
|
|
|
+
|
|
|
/** Card 2 — B端佣金实时百分比 */
|
|
|
const l1SeedPercent = computed(() => {
|
|
|
const s = seedPrice.value
|