fix: 功能优化完善,分期待还相关。

This commit is contained in:
tianyongbao
2026-02-12 19:38:58 +08:00
parent 76d1e328ab
commit 7715c53924
3 changed files with 179 additions and 11 deletions

View File

@@ -148,17 +148,26 @@
<div class="content-con">
<div v-show="radioVal === '柱状图'" class="chart" id="chartBar"></div>
<div v-show="radioVal === '折线图'" class="chart" id="chartLine"></div>
<el-table v-show="radioVal === '表格'" v-loading="loading" :data="historyObj.tableHistoryDetailList">
<el-table v-show="radioVal === '表格'" v-loading="loading" :data="reversedTableData">
<el-table-column label="序号" width="50" type="index" align="center">
<template #default="scope">
<span>{{ scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column label="还款日期" align="center" prop="time" />
<el-table-column label="还款日期" align="center" prop="time" width="200" />
<el-table-column label="待还款金额" align="center" prop="value" />
<el-table-column prop="detail" label="待还款明细" width="700" v-if="queryParams.type === 1">
<el-table-column prop="detail" label="待还款明细" width="900" v-if="queryParams.type === 1">
<template #default="scope">
<span v-html="formatMultiLineData(scope.row.detail)"></span>
<div v-if="scope.row.detailList && scope.row.detailList.length > 0">
<div
v-for="(item, index) in scope.row.detailList"
:key="index"
style="padding: 6px 8px; margin-bottom: 4px; background: #f5f7fa; border-radius: 4px"
>
{{ item.bankCardLendName }}(本金:{{ item.principal }},利息:{{ item.interest }},合计:{{ item.currentAmount }})
</div>
</div>
<span v-else v-html="formatMultiLineData(scope.row.detail)"></span>
</template>
</el-table-column>
</el-table>
@@ -293,7 +302,8 @@ const historyObj = ref({
dueDetail: '',
repaidDetail: '',
leftDetail: '',
historyDetailList: []
historyDetailList: [],
tableHistoryDetailList: []
})
const chartData = ref({
@@ -301,6 +311,14 @@ const chartData = ref({
value1: []
})
// 计算属性:倒序后的表格数据
const reversedTableData = computed(() => {
if (historyObj.value.tableHistoryDetailList && historyObj.value.tableHistoryDetailList.length > 0) {
return [...historyObj.value.tableHistoryDetailList].reverse()
}
return []
})
function getList() {
loading.value = true
chartData.value = { name: [], value1: [] }

View File

@@ -148,22 +148,86 @@
<div class="content-con">
<div v-show="radioVal === '柱状图'" class="chart" id="chartBar"></div>
<div v-show="radioVal === '折线图'" class="chart" id="chartLine"></div>
<el-table v-show="radioVal === '表格'" v-loading="loading" :data="historyObj.tableHistoryDetailList">
<el-table v-show="radioVal === '表格'" v-loading="loading" :data="reversedTableData">
<el-table-column label="序号" width="50" type="index" align="center">
<template #default="scope">
<span>{{ scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column label="还款日期" align="center" prop="time" />
<el-table-column label="还款日期" align="center" prop="time" width="200" />
<el-table-column label="待还款金额" align="center" prop="value" />
<el-table-column prop="detail" label="待还款明细" width="700" v-if="queryParams.type === 1">
<el-table-column prop="detail" label="待还款明细" width="900" v-if="queryParams.type === 1">
<template #default="scope">
<span v-html="formatMultiLineData(scope.row.detail)"></span>
<div v-if="scope.row.detailList && scope.row.detailList.length > 0">
<div
v-for="(item, index) in scope.row.detailList"
:key="index"
style="
display: flex;
align-items: center;
justify-content: space-between;
padding: 6px 8px;
margin-bottom: 4px;
background: #f5f7fa;
border-radius: 4px;
"
>
<span style="flex: 1"
>{{ item.bankCardLendName }}(本金:{{ item.principal }},利息:{{ item.interest }},合计:{{ item.currentAmount }})</span
>
<el-button size="small" type="primary" icon="Coin" @click="handleRepayment(item)">还款</el-button>
</div>
</div>
<span v-else v-html="formatMultiLineData(scope.row.detail)"></span>
</template>
</el-table-column>
</el-table>
</div>
</div>
<!-- 还款对话框 -->
<el-dialog title="贷款还款" v-model="repaymentOpen" width="500px" append-to-body>
<el-form ref="repaymentFormRef" :model="repaymentForm" :rules="repaymentRules" label-width="120px">
<el-form-item label="贷款机构">
<el-input v-model="repaymentForm.bankCardLendName" disabled />
</el-form-item>
<el-form-item label="还款日期" prop="repaymentDate">
<el-date-picker
clearable
v-model="repaymentForm.repaymentDate"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择还款日期"
style="width: 100%"
>
</el-date-picker>
</el-form-item>
<el-form-item label="应还本金" prop="principal">
<el-input v-model="repaymentForm.principal" type="number" @input="calculateTotalAmount" placeholder="请输入应还本金" />
</el-form-item>
<el-form-item label="应还利息" prop="interest">
<el-input v-model="repaymentForm.interest" type="number" @input="calculateTotalAmount" placeholder="请输入应还利息" />
</el-form-item>
<el-form-item label="合计金额">
<el-input v-model="repaymentForm.currentAmount" disabled />
</el-form-item>
<el-form-item label="还款状态" prop="postingState">
<el-select v-model="repaymentForm.postingState" placeholder="请选择还款状态" style="width: 100%">
<el-option label="已还款" value="1"></el-option>
<el-option label="未还款" value="0"></el-option>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="repaymentForm.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitRepayment"> </el-button>
<el-button @click="repaymentOpen = false"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
@@ -196,6 +260,7 @@ const dates = [
const loading = ref(true)
const total = ref(0)
const radioVal = ref('柱状图')
const repaymentOpen = ref(false)
const creditCardList = ref([])
const dateValidate = (rules, value, callback) => {
@@ -231,10 +296,26 @@ const data = reactive({
},
rules: {
time: [{ validator: dateValidate, dateType: 'months', num: 35, dateRange: '月', message: '时间跨度不能大于36个月默认选择开始日期的36个月' }]
},
repaymentForm: {
id: null,
bankCardLendName: '',
repaymentDate: '',
principal: 0,
interest: 0,
currentAmount: 0,
postingState: '1',
remark: ''
},
repaymentRules: {
repaymentDate: [{ required: true, message: '还款日期不能为空', trigger: 'blur' }],
principal: [{ required: true, message: '应还本金不能为空', trigger: 'blur' }],
interest: [{ required: true, message: '应还利息不能为空', trigger: 'blur' }],
postingState: [{ required: true, message: '还款状态不能为空', trigger: 'change' }]
}
})
const { queryParams, queryCreditCardParams, rules } = toRefs(data)
const { queryParams, queryCreditCardParams, rules, repaymentForm, repaymentRules } = toRefs(data)
const handleCreditChange = (id) => {
queryParams.value.id = id
getList()
@@ -294,7 +375,8 @@ const historyObj = ref({
dueDetail: '',
repaidDetail: '',
leftDetail: '',
historyDetailList: []
historyDetailList: [],
tableHistoryDetailList: []
})
const chartData = ref({
@@ -302,6 +384,14 @@ const chartData = ref({
value1: []
})
// 计算属性:倒序后的表格数据
const reversedTableData = computed(() => {
if (historyObj.value.tableHistoryDetailList && historyObj.value.tableHistoryDetailList.length > 0) {
return [...historyObj.value.tableHistoryDetailList].reverse()
}
return []
})
function getList() {
loading.value = true
chartData.value = { name: [], value1: [] }
@@ -537,6 +627,47 @@ const handleRadioChange = (type) => {
break
}
}
/** 还款按钮操作 */
function handleRepayment(item) {
repaymentForm.value = {
id: item.id,
bankCardLendName: item.bankCardLendName,
repaymentDate: dayjs(new Date().getTime()).format('YYYY-MM-DD'),
principal: item.principal,
interest: item.interest,
currentAmount: item.currentAmount,
postingState: '1',
remark: ''
}
repaymentOpen.value = true
}
/** 计算合计金额 */
function calculateTotalAmount() {
const principal = parseFloat(repaymentForm.value.principal) || 0
const interest = parseFloat(repaymentForm.value.interest) || 0
repaymentForm.value.currentAmount = (principal + interest).toFixed(2)
}
/** 提交还款 */
function submitRepayment() {
proxy.$refs.repaymentFormRef.validate((valid) => {
if (valid) {
proxy.$modal
.confirm('是否确认已还款?')
.then(function () {
// TODO: 这里需要调用后端接口更新还款状态
// 示例: return updateInstallmentDetail(repaymentForm.value)
proxy.$modal.msgSuccess('还款成功')
repaymentOpen.value = false
getList() // 刷新列表
})
.catch(() => {})
}
})
}
getCreditCardList()
getList()
</script>

View File

@@ -227,6 +227,9 @@
</el-tooltip>
</template>
<template v-else>
<el-tooltip class="item" effect="dark" content="还款" placement="top">
<el-button icon="Coin" v-hasPermi="['invest:installmentHistory:edit']" circle @click="handleRepayment(scope.row)"></el-button>
</el-tooltip>
<el-tooltip v-for="item in operateDetailList" :key="item.id" class="item" effect="dark" :content="item.title" placement="top">
<el-button :icon="item.icon" v-hasPermi="item.hasPermi" circle @click="handleDetailOperate(item.id, scope.row)"></el-button>
</el-tooltip>
@@ -594,6 +597,22 @@ function handleUpdateDetail(row) {
})
}
/** 还款按钮操作 */
function handleRepayment(row) {
resetDetail()
getInstallmentDetail(row.id).then((response) => {
formDetail.value = response.data
// 默认设置还款状态为已还款
formDetail.value.postingState = '1'
// 设置还款日期为当前日期
if (!formDetail.value.repaymentDate) {
formDetail.value.repaymentDate = dayjs(new Date().getTime()).format('YYYY-MM-DD')
}
openDetail.value = true
titleDetail.value = '贷款还款'
})
}
/** 提交按钮 */
function submitForm() {
proxy.$refs.installmentHistoryRef.validate((valid) => {