This commit is contained in:
luojiaquan
2026-09-23 11:55:29 +08:00
parent 2c5081897a
commit b02af14179
9 changed files with 86 additions and 255 deletions
@@ -62,12 +62,6 @@
<div class="balance-sub" :style="tempCreditPeriodExpired ? 'color: var(--el-color-danger);' : ''">{{ tempCreditPeriodText }}</div>
</el-card>
</el-col>
<el-col :xs="12" :sm="8" :md="4">
<el-card shadow="hover" class="balance-card">
<div class="balance-label">已用额度</div>
<div class="balance-value danger">{{ formatMoney(currentAccount.usedCredit) }}</div>
</el-card>
</el-col>
<el-col :xs="12" :sm="8" :md="4">
<el-card shadow="hover" class="balance-card">
<div class="balance-label">可用额度</div>
@@ -796,7 +790,7 @@
>
<el-alert type="info" :closable="false" class="credit-tip">
<div>当前{{ creditDialog.form.creditType === 'TEMP' ? '临时额度' : '信用额度' }}:
<b>{{ formatMoney(creditBefore) }}</b>,已用额度:<b>{{ formatMoney(currentAccount.usedCredit) }}</b></div>
<b>{{ formatMoney(creditBefore) }}</b>,账户余额:<b>{{ formatMoney(currentAccount.balance) }}</b>,可用额度:<b>{{ availableCredit }}</b></div>
</el-alert>
<el-form ref="creditFormRef" :model="creditDialog.form" :rules="creditRules" label-width="100px">
<el-row>
@@ -853,7 +847,7 @@
<div class="rate-tip">
{{ creditDialog.form.creditType === 'TEMP'
? '失效日当天仍有效,次日访问账户时自动清零并记到期流水'
: '信用额度失效日期必填;失效日当天仍有效,次日自动清零,已用额度未回款时将形成超额欠费(可继续计费,请及时催收)' }}
: '信用额度失效日期必填;失效日当天仍有效,次日自动清零;额度失效后可用额度相应减少,若账户余额为负将形成欠费(可继续计费,请及时催收回款)' }}
</div>
</el-form-item>
</el-col>
@@ -877,17 +871,12 @@
<b :class="creditAfter < 0 ? 'money-out' : 'money-in'">{{ formatMoney(creditAfter) }}</b>
</div>
<div>调整后授信总额:<b>{{ formatMoney(totalCreditAfter) }}</b>
(可用 = 授信总额 - 已用 {{ formatMoney(currentAccount.usedCredit) }})</div>
(可用 = 账户余额 {{ formatMoney(currentAccount.balance) }} + 授信总额 + 额外额度)</div>
<el-alert
v-if="creditAfter < 0"
type="error" :closable="false"
title="调整后额度不能为负数" class="credit-alert"
/>
<el-alert
v-else-if="totalCreditAfter < (Number(currentAccount.usedCredit) || 0)"
type="error" :closable="false"
title="授信总额不能小于已用额度" class="credit-alert"
/>
</div>
<template #footer>
@@ -960,9 +949,9 @@
placeholder="选填,最多255字" />
</el-form-item>
</el-form>
<el-alert type="warning" :closable="false">
<el-alert type="info" :closable="false">
<template title>
核销后账户余额变为 CNY {{ woAfterBalance }},同步释放等额已用额度;余额不足时无法提交。
核销仅更新账单已核销/未核销金额与状态,不再扣减账户余额;资金变动由收款/计费入口产生。
</template>
</el-alert>
<template #footer>
@@ -975,8 +964,8 @@
<el-dialog title="反核销(取消余额核销)" v-model="cancelWoDialog.visible" width="480px" append-to-body>
<el-alert type="warning" :closable="false" class="credit-tip">
<span v-if="cancelWoDialog.row">
反核销后,核销金额 CNY {{ formatMoney(cancelWoDialog.row.writeoffAmount) }} 将退回客户账户余额,
账单「{{ cancelWoDialog.row.billNo }}」恢复为未核销,已用额度同步加回。
反核销后,账单「{{ cancelWoDialog.row.billNo }}」恢复为未核销状态(核销金额 CNY {{ formatMoney(cancelWoDialog.row.writeoffAmount) }});
口径变更后不再回补账户余额、不再变动已用额度。
</span>
</el-alert>
<el-form label-width="100px" class="wo-form">
@@ -1090,8 +1079,9 @@ function creditChangeTag(v) {
return { INIT: '', ADJUST: 'primary', EXPIRE: 'danger', OCCUPY: 'warning', RELEASE: 'success' }[v] || 'info'
}
/**
* 是否为授信占用/释放流水。
* 占用/释放流水的 变动前/变动额/变动后 记的是【已用额度】维度;
* 是否为授信占用/释放流水(历史数据)。
* 口径变更(2026-09-23)后计费不再产生 OCCUPY/RELEASE 流水,改为写余额流水;
* 历史占用/释放流水的 变动前/变动额/变动后 记的是【已用额度】维度,
* INIT/ADJUST/EXPIRE 流水这三列记的是【授信额度】(信用/临时额度)维度。
*/
function isCreditUsageFlow(changeType) {
@@ -1127,17 +1117,17 @@ const currentAccount = computed(() => {
return accountList.value.find(a => a.currency === 'CNY') || {}
})
/** 可用额度数值 = 总额度 + 临时额度 - 已用额度(可能为负,表示临时额度到期/占用超授信总额) */
/** 可用额度数值 = 账户余额 + 信用额度 + 额外额度(可能为负,表示欠费;口径变更后不再扣减已用额度) */
const availableCreditValue = computed(() => {
const a = currentAccount.value
const balance = Number(a.balance) || 0
const total = Number(a.totalCredit) || 0
const extra = Number(a.extraCredit) || 0
const used = Number(a.usedCredit) || 0
return total + extra - used
return balance + total + extra
})
/** 可用额度展示文本 */
const availableCredit = computed(() => formatMoney(availableCreditValue.value))
/** 是否处于超额状态(已用额度超过授信总额,可用为负;不拦截计费,后续做超额提醒) */
/** 是否处于欠费状态(可用额度为负;不拦截计费,允许负余额继续计费) */
const availableOverLimit = computed(() => availableCreditValue.value < 0)
/** 临时额度有效期文案 */
@@ -1274,11 +1264,6 @@ function submitAdjustCredit() {
proxy.$modal.msgError('调整后额度不能为负数')
return
}
const used = Number(currentAccount.value.usedCredit) || 0
if (totalCreditAfter.value < used) {
proxy.$modal.msgError('调整后授信总额不能小于已用额度 ' + formatMoney(used))
return
}
if (creditAfter.value === creditBefore.value) {
proxy.$modal.msgError('额度未发生变化,无需调整')
return
@@ -1852,12 +1837,6 @@ function loadBillWriteoffData() {
const woSubmitLoading = ref(false)
const woDialog = reactive({ visible: false, bill: null, form: {}, accountLoading: false })
let writeoffAccountRequestSerial = 0
/** 核销后余额预览(不为负则可提交) */
const woAfterBalance = computed(() => {
const balance = Number(currentAccount.value.balance) || 0
const amount = Number(woDialog.form.writeoffAmount) || 0
return formatMoney(balance - amount)
})
async function openWriteoffDialog(row) {
const customerId = Number(route.query.customerId)
@@ -1868,28 +1847,25 @@ async function openWriteoffDialog(row) {
woDialog.bill = row
const unwritten = Number(row.unwrittenAmount) || 0
// 口径变更后核销不再扣减余额,默认核销金额取账单未核销金额
woDialog.form = {
arBillId: row.arBillId,
customerId,
// 余额接口返回前先显示 0,避免使用旧余额或在余额为 0 时错误带出整笔未核销金额。
writeoffAmount: 0,
writeoffAmount: unwritten,
writeoffDate: proxy.parseTime(new Date(), '{y}-{m}-{d}'),
remark: ''
}
woDialog.visible = true
// 必须等待余额刷新完成后再计算默认金额,避免异步请求尚未返回就读取旧余额。
// 仍刷新账户余额供展示,但不再限制核销金额
const requestSerial = ++writeoffAccountRequestSerial
woDialog.accountLoading = true
try {
const res = await listAccount(customerId)
if (requestSerial !== writeoffAccountRequestSerial) return
accountList.value = res.data || []
const balance = Math.max(0, Number(currentAccount.value.balance) || 0)
woDialog.form.writeoffAmount = Math.min(unwritten, balance)
} catch (e) {
if (requestSerial !== writeoffAccountRequestSerial) return
woDialog.form.writeoffAmount = 0
proxy.$modal.msgError('账户余额刷新失败,请稍后重试')
} finally {
if (requestSerial === writeoffAccountRequestSerial) woDialog.accountLoading = false
@@ -1915,11 +1891,6 @@ function submitWriteoff() {
proxy.$modal.msgError('核销金额不能超过账单未核销金额 ' + formatMoney(unwritten))
return
}
const balance = Number(currentAccount.value.balance) || 0
if (amount > balance) {
proxy.$modal.msgError('账户余额不足,当前余额 CNY ' + formatMoney(balance) + ',请先登记收款并审核')
return
}
woSubmitLoading.value = true
balanceWriteoff(woDialog.form).then(() => {
proxy.$modal.msgSuccess('核销成功:账单已核销 CNY ' + formatMoney(amount))
@@ -1949,7 +1920,7 @@ function submitCancelWriteoff() {
}
cancelWoLoading.value = true
cancelBalanceWriteoff(cancelWoDialog.row.writeoffId, remark).then(() => {
proxy.$modal.msgSuccess('反核销成功,余额已退回')
proxy.$modal.msgSuccess('反核销成功,账单已恢复未核销')
cancelWoDialog.visible = false
loadBillWriteoffData()
getFlowList()
@@ -161,7 +161,7 @@
<el-table-column v-if="isColVisible('creditEd')" label="信用额度" align="center" prop="creditEd">
<template #default="scope">
<span v-if="Number(scope.row.creditEd) < 0" style="color: var(--el-color-danger); font-weight: 600;"
title="已用额度超过授信总额(如临时额度已到期),客户回款核销后恢复">
title="信用额度异常(如临时额度到期失效),请核查客户额度">
{{ scope.row.creditEd }}
</span>
<span v-else>{{ scope.row.creditEd }}</span>