feat(distribution): 通道费改主站承担,并按冷却期自动释放结算
利润不再扣支付通道费;站点可配置结算冷却期,到期自动入账,已释放后退款从收款站钱包回冲。同时修复当日自动批次无法追加、三方回冲打错钱包,以及测试库自增重置被 MySQL 统计缓存跳过的问题。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -10,6 +10,7 @@ export interface DistributionSite {
|
||||
display_account_enabled: boolean
|
||||
tax_enabled: boolean
|
||||
tax_rate_bps: number
|
||||
settlement_hold_days: number
|
||||
created_at: string
|
||||
}
|
||||
|
||||
@@ -88,6 +89,7 @@ export interface OnboardDistributionSitePayload {
|
||||
display_account_enabled?: boolean
|
||||
tax_enabled?: boolean
|
||||
tax_rate_bps?: number
|
||||
settlement_hold_days?: number
|
||||
distributor_receive_ratio?: number
|
||||
platform_sell_ratio?: number
|
||||
service_fee_value?: number
|
||||
@@ -129,7 +131,13 @@ export async function updateDistributionSite(
|
||||
payload: Partial<
|
||||
Pick<
|
||||
DistributionSite,
|
||||
'site_name' | 'domain' | 'status' | 'display_account_enabled' | 'tax_enabled' | 'tax_rate_bps'
|
||||
| 'site_name'
|
||||
| 'domain'
|
||||
| 'status'
|
||||
| 'display_account_enabled'
|
||||
| 'tax_enabled'
|
||||
| 'tax_rate_bps'
|
||||
| 'settlement_hold_days'
|
||||
>
|
||||
>
|
||||
) {
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { ElMessage, type FormInstance, type FormRules } from 'element-plus'
|
||||
import { Plus, Shop, Link, DocumentCopy, Refresh } from '@element-plus/icons-vue'
|
||||
import { Plus, Shop, Link, DocumentCopy, Refresh, Clock } from '@element-plus/icons-vue'
|
||||
import {
|
||||
fetchDistributionSites,
|
||||
onboardDistributionSite,
|
||||
syncDistributionSiteAccounts,
|
||||
updateDistributionSite,
|
||||
type DistributionSite,
|
||||
type OnboardDistributionSitePayload,
|
||||
type OnboardDistributionSiteResult,
|
||||
@@ -23,6 +24,37 @@ const onboardFormRef = ref<FormInstance>()
|
||||
const successDialogVisible = ref(false)
|
||||
const onboardResult = ref<OnboardDistributionSiteResult | null>(null)
|
||||
|
||||
const settlementDialogVisible = ref(false)
|
||||
const settlementSubmitting = ref(false)
|
||||
const settlementForm = reactive({
|
||||
site_id: 0,
|
||||
site_name: '',
|
||||
settlement_hold_days: 7,
|
||||
})
|
||||
|
||||
function handleOpenSettlement(row: DistributionSite) {
|
||||
settlementForm.site_id = row.id
|
||||
settlementForm.site_name = row.site_name
|
||||
settlementForm.settlement_hold_days = row.settlement_hold_days ?? 7
|
||||
settlementDialogVisible.value = true
|
||||
}
|
||||
|
||||
async function handleSettlementSubmit() {
|
||||
settlementSubmitting.value = true
|
||||
try {
|
||||
await updateDistributionSite(settlementForm.site_id, {
|
||||
settlement_hold_days: Number(settlementForm.settlement_hold_days),
|
||||
})
|
||||
ElMessage.success(`【${settlementForm.site_name}】结算冷却期已更新`)
|
||||
settlementDialogVisible.value = false
|
||||
await loadSites()
|
||||
} catch (err) {
|
||||
ElMessage.error(readError(err, '更新结算冷却期失败'))
|
||||
} finally {
|
||||
settlementSubmitting.value = false
|
||||
}
|
||||
}
|
||||
|
||||
const onboardForm = reactive({
|
||||
site_name: '',
|
||||
site_code: '',
|
||||
@@ -203,12 +235,19 @@ onMounted(() => {
|
||||
<el-tag v-else type="info" size="small">免税</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="结算冷却期" width="110">
|
||||
<template #default="{ row }">
|
||||
<el-tag :type="row.settlement_hold_days > 0 ? 'primary' : 'success'" size="small">
|
||||
{{ row.settlement_hold_days > 0 ? `${row.settlement_hold_days} 天` : '立即释放' }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="创建时间" prop="created_at" min-width="160">
|
||||
<template #default="{ row }">
|
||||
{{ formatDateTime(row.created_at) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="140" fixed="right">
|
||||
<el-table-column label="操作" width="220" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button
|
||||
type="primary"
|
||||
@@ -219,6 +258,9 @@ onMounted(() => {
|
||||
>
|
||||
同步商品
|
||||
</el-button>
|
||||
<el-button type="primary" link :icon="Clock" @click="handleOpenSettlement(row)">
|
||||
结算设置
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@@ -371,6 +413,42 @@ onMounted(() => {
|
||||
<el-button @click="successDialogVisible = false">关闭</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
|
||||
<!-- 结算冷却期设置对话框 -->
|
||||
<el-dialog
|
||||
v-model="settlementDialogVisible"
|
||||
title="结算冷却期设置"
|
||||
width="480px"
|
||||
destroy-on-close
|
||||
>
|
||||
<el-alert
|
||||
type="info"
|
||||
:closable="false"
|
||||
show-icon
|
||||
title="订单完成后进入冷却期,期满自动释放到商户可提现余额;0 天表示完成即释放。修改后对尚未释放的已完成订单立即生效。"
|
||||
style="margin-bottom: 16px"
|
||||
/>
|
||||
<el-form label-width="110px">
|
||||
<el-form-item label="分销站点">
|
||||
<el-input :model-value="settlementForm.site_name" disabled />
|
||||
</el-form-item>
|
||||
<el-form-item label="冷却天数">
|
||||
<el-input-number
|
||||
v-model="settlementForm.settlement_hold_days"
|
||||
:min="0"
|
||||
:max="365"
|
||||
:step="1"
|
||||
/>
|
||||
<span class="settlement-hint">天(0-365)</span>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="settlementDialogVisible = false">取消</el-button>
|
||||
<el-button type="primary" :loading="settlementSubmitting" @click="handleSettlementSubmit">
|
||||
保存设置
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -433,4 +511,10 @@ export default {
|
||||
padding-bottom: 6px;
|
||||
border-bottom: 1px dashed #e5e7eb;
|
||||
}
|
||||
|
||||
.settlement-hint {
|
||||
margin-left: 8px;
|
||||
color: #6b7280;
|
||||
font-size: 13px;
|
||||
}
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user