This commit is contained in:
2026-07-27 17:19:36 +08:00
parent e50d1b8fda
commit 1c7532e0de
132 changed files with 7066 additions and 1241 deletions

View File

@@ -17,14 +17,14 @@
@on-load="onLoad"
>
<template #menu-left>
<el-button
type="primary"
icon="el-icon-plus"
plain
v-if="hasPermission('credit_score_quantification_add')"
@click="openConfig()"
>新增
</el-button>
<el-button
type="primary"
icon="el-icon-plus"
plain
v-if="hasPermission('credit_score_quantification_add')"
@click="openConfig()"
>新增
</el-button>
<el-button
type="primary"
icon="el-icon-upload"
@@ -49,9 +49,9 @@
@click="handleExport"
>批量导出
</el-button>
<el-button
type="danger"
icon="el-icon-delete"
<el-button
type="danger"
icon="el-icon-delete"
plain
v-if="hasPermission('credit_score_quantification_delete')"
@click="handleDelete"
@@ -109,7 +109,7 @@
</avue-crud>
<el-dialog title="评分量化表数据导入" append-to-body v-model="excelBox" width="555px">
<avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter">
<avue-form :option="excelOption" v-model="excelForm">
<template #excelTemplate>
<el-button type="primary" @click="handleTemplate">
点击下载<i class="el-icon-download el-icon--right"></i>
@@ -127,8 +127,14 @@
@closed="resetConfig"
>
<div class="score-config">
<div class="section-title">评分量化表</div>
<el-form :model="configForm" label-width="110px" class="base-form" :disabled="readonly">
<div class="section-title dialog-section-title">评分量化表</div>
<el-form
:model="configForm"
label-position="right"
label-width="auto"
class="base-form"
:disabled="readonly"
>
<el-form-item label="评定表名称" required>
<el-input v-model="configForm.name" maxlength="30" show-word-limit />
</el-form-item>
@@ -138,7 +144,7 @@
</el-form>
<div class="section-head">
<div class="section-title">评分表</div>
<div class="section-title dialog-section-title">评分表</div>
</div>
<el-table :data="configForm.categories" border class="config-table">
<el-table-column label="序号" type="index" width="70" align="center" />
@@ -154,13 +160,8 @@
</el-table>
<div class="section-head standard-head">
<div class="section-title">评估标准</div>
<el-button
type="primary"
icon="el-icon-plus"
v-if="!readonly"
@click="openStandard()"
>
<div class="section-title dialog-section-title">评估标准</div>
<el-button type="primary" icon="el-icon-plus" v-if="!readonly" @click="openStandard()">
添加
</el-button>
</div>
@@ -168,7 +169,9 @@
<el-table-column label="序号" type="index" width="70" align="center" />
<el-table-column label="信用等级" prop="creditLevel" width="120" align="center" />
<el-table-column label="得分率" width="160" align="center">
<template #default="{ row }">{{ row.scoreRateLower }}% - {{ row.scoreRateUpper }}%</template>
<template #default="{ row }"
>{{ row.scoreRateLower }}% - {{ row.scoreRateUpper }}%</template
>
</el-table-column>
<el-table-column label="最大资金使用额度(万元)" width="210" align="center">
<template #default="{ row }">
@@ -179,7 +182,9 @@
<el-table-column label="操作" width="160" align="center">
<template #default="{ row, $index }">
<el-button type="primary" text @click="openStandard(row, $index)">编辑</el-button>
<el-button type="danger" text v-if="!readonly" @click="removeStandard($index)">删除</el-button>
<el-button type="danger" text v-if="!readonly" @click="removeStandard($index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
@@ -215,7 +220,9 @@
<el-table-column label="操作" width="160" align="center">
<template #default="{ row, $index }">
<el-button type="primary" text @click="openItem(row, $index)">编辑</el-button>
<el-button type="danger" text v-if="!readonly" @click="removeItem($index)">删除</el-button>
<el-button type="danger" text v-if="!readonly" @click="removeItem($index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
@@ -226,7 +233,7 @@
</el-dialog>
<el-dialog title="评分项目详情" append-to-body v-model="itemBox" width="76%">
<el-form :model="itemForm" label-width="100px" :disabled="readonly">
<el-form :model="itemForm" label-position="right" label-width="auto" :disabled="readonly">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="评分项目" required>
@@ -248,7 +255,12 @@
<el-input v-model="option.optionName" maxlength="100" placeholder="选项描述" />
<el-input-number v-model="option.score" :min="0" :precision="2" placeholder="分值" />
<span class="score-unit"></span>
<el-button type="danger" text v-if="!readonly && itemForm.options.length > 1" @click="removeOption(index)">
<el-button
type="danger"
text
v-if="!readonly && itemForm.options.length > 1"
@click="removeOption(index)"
>
删除
</el-button>
</div>
@@ -263,19 +275,36 @@
</el-dialog>
<el-dialog title="评估标准设置" append-to-body v-model="standardBox" width="76%">
<el-form :model="standardForm" label-width="170px" :disabled="readonly">
<el-form :model="standardForm" label-position="right" label-width="auto" :disabled="readonly">
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="信用等级" required>
<el-input v-model="standardForm.creditLevel" maxlength="30" />
<el-select v-model="standardForm.creditLevel" placeholder="请选择信用等级" clearable>
<el-option
v-for="item in creditLevelOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="得分率(%)" required>
<div class="range-input">
<el-input-number v-model="standardForm.scoreRateLower" :min="0" :max="100" :precision="0" />
<el-input-number
v-model="standardForm.scoreRateLower"
:min="0"
:max="100"
:precision="0"
/>
<span></span>
<el-input-number v-model="standardForm.scoreRateUpper" :min="0" :max="100" :precision="0" />
<el-input-number
v-model="standardForm.scoreRateUpper"
:min="0"
:max="100"
:precision="0"
/>
</div>
</el-form-item>
</el-col>
@@ -303,7 +332,12 @@
</el-col>
</el-row>
<el-form-item label="标准说明">
<el-input v-model="standardForm.standardDescription" type="textarea" maxlength="500" show-word-limit />
<el-input
v-model="standardForm.standardDescription"
type="textarea"
maxlength="500"
show-word-limit
/>
</el-form-item>
</el-form>
<template #footer>
@@ -325,6 +359,7 @@ import {
} from '@/api/vehicle/credit-score-quantification';
import { exportBlob } from '@/api/common';
import { downloadXls } from '@/utils/util';
import { openImportDialog } from '@/utils/import-excel';
import { getToken } from '@/utils/auth';
import { mapGetters } from 'vuex';
import NProgress from 'nprogress';
@@ -361,13 +396,21 @@ export default {
2: { label: '停用', type: 'info' },
3: { label: '草稿', type: 'warning' },
},
creditLevelOptions: ['A', 'B', 'C', 'D', 'E', 'F'].map(item => ({
label: item,
value: item,
})),
option: {
height: 'auto',
calcHeight: 32,
dialogWidth: 760,
labelPosition: 'right',
tip: false,
searchShow: true,
searchMenuSpan: 6,
searchMenuSpan: 24,
searchIcon: true,
searchIndex: 8,
searchMenuPosition: 'right',
border: true,
index: true,
indexLabel: '序号',
@@ -421,7 +464,6 @@ export default {
type: 'date',
format: 'YYYY-MM-DD 00:00:00',
valueFormat: 'YYYY-MM-DD 00:00:00',
search: true,
hide: true,
display: false,
},
@@ -431,13 +473,13 @@ export default {
type: 'date',
format: 'YYYY-MM-DD 23:59:59',
valueFormat: 'YYYY-MM-DD 23:59:59',
search: true,
hide: true,
display: false,
},
],
},
excelOption: {
labelPosition: 'right',
submitBtn: false,
emptyBtn: false,
column: [
@@ -452,7 +494,8 @@ export default {
res: 'data',
},
tip: '请上传 .xls,.xlsx 标准格式文件',
action: '/blade-transport/credit-score-quantification/import-credit-score-quantification',
action:
'/blade-transport/credit-score-quantification/import-credit-score-quantification',
},
{
label: '模板下载',
@@ -532,7 +575,8 @@ export default {
...category,
items: (category.items || []).map(item => ({
...item,
options: item.options && item.options.length ? item.options : [{ optionName: '', score: 0 }],
options:
item.options && item.options.length ? item.options : [{ optionName: '', score: 0 }],
})),
};
});
@@ -601,9 +645,26 @@ export default {
this.standardForm = row ? JSON.parse(JSON.stringify(row)) : this.emptyStandard();
this.standardBox = true;
},
hasDuplicateCreditLevel(creditLevel, currentIndex = -1) {
const level = String(creditLevel || '').trim();
return this.configForm.standards.some(
(item, index) => index !== currentIndex && String(item.creditLevel || '').trim() === level
);
},
isValidCreditLevel(creditLevel) {
return this.creditLevelOptions.some(item => item.value === String(creditLevel || '').trim());
},
saveStandard() {
if (!this.standardForm.creditLevel || !this.standardForm.creditLevel.trim()) {
this.$message.warning('请输入信用等级');
if (!this.standardForm.creditLevel) {
this.$message.warning('请选择信用等级');
return;
}
if (!this.isValidCreditLevel(this.standardForm.creditLevel)) {
this.$message.warning('信用等级只能选择A/B/C/D/E/F');
return;
}
if (this.hasDuplicateCreditLevel(this.standardForm.creditLevel, this.currentStandardIndex)) {
this.$message.warning('信用等级不能重复');
return;
}
if (
@@ -624,6 +685,7 @@ export default {
return;
}
const standard = JSON.parse(JSON.stringify(this.standardForm));
standard.creditLevel = String(standard.creditLevel || '').trim();
if (this.currentStandardIndex >= 0) {
this.configForm.standards.splice(this.currentStandardIndex, 1, standard);
} else {
@@ -652,6 +714,17 @@ export default {
}
}
}
const creditLevels = this.configForm.standards
.map(item => String(item.creditLevel || '').trim())
.filter(Boolean);
if (creditLevels.some(level => !this.isValidCreditLevel(level))) {
this.$message.warning('评估标准中的信用等级只能选择A/B/C/D/E/F');
return false;
}
if (new Set(creditLevels).size !== creditLevels.length) {
this.$message.warning('评估标准中的信用等级不能重复');
return false;
}
return true;
},
saveConfig() {
@@ -749,12 +822,7 @@ export default {
});
},
handleImport() {
this.excelBox = true;
},
uploadAfter(res, done) {
this.excelBox = false;
this.onLoad(this.page);
done();
openImportDialog(this, '评分量化表');
},
handleExport() {
this.$confirm('是否导出评分量化表数据?', '提示', {
@@ -784,7 +852,9 @@ export default {
},
handleTemplate() {
exportBlob(
`/blade-transport/credit-score-quantification/export-template?${this.website.tokenHeader}=${getToken()}`
`/blade-transport/credit-score-quantification/export-template?${
this.website.tokenHeader
}=${getToken()}`
).then(res => {
downloadXls(res.data, '评分量化表模板.xlsx');
});
@@ -808,12 +878,17 @@ export default {
align-items: center;
justify-content: space-between;
margin: 24px 0 12px;
.section-title {
margin: 0;
}
}
.section-title {
margin: 18px 0 12px;
font-size: 20px;
font-weight: 700;
line-height: 20px;
color: #303133;
}