feat(KYC身份审核页): 对接接口

This commit is contained in:
hzj 2025-11-13 17:24:52 +08:00
parent 3099255681
commit 90db4287d1
2 changed files with 289 additions and 118 deletions

View File

@ -604,11 +604,12 @@ export function getUserIdentity(userId) {
// 用户认证身份信息 // 用户认证身份信息
export function getUserBankIdentityInfo(params) { export function getUserBankIdentityInfo(params) {
return request({ return request({
url: "/user/bank-identity-info/page", url: "/user/withdraw-info/page",
method: "get", method: "get",
params params
}); });
} }
// 用户认证身份信息审核 // 用户认证身份信息审核
export function auditUserBankIdentityInfo(data) { export function auditUserBankIdentityInfo(data) {
return request({ return request({
@ -618,6 +619,24 @@ export function auditUserBankIdentityInfo(data) {
}); });
} }
// 用户认证身份信息审核(通过)
export function withdrawInfoPass(data) {
return request({
url: "/user/withdraw-info/pass",
method: "post",
data
});
}
// 用户认证身份信息审核(驳回)
export function withdrawInfoNotPass(data) {
return request({
url: "/user/withdraw-info/not-pass",
method: "post",
data
});
}
// 用户认证身份信息-导出 // 用户认证身份信息-导出
export function exportUserBankIdentityInfo(params, excelName) { export function exportUserBankIdentityInfo(params, excelName) {
return httpGetExport("/user/bank-identity-info/export", params, excelName); return httpGetExport("/user/bank-identity-info/export", params, excelName);
@ -640,3 +659,12 @@ export function pageUserDiamondBalance(params) {
params params
}); });
} }
// 更新货运代理账户信息(支持的国家和联系方式)
export function updateInfoCP(data) {
return request({
url: "/freight/update-info",
method: "post",
data
});
}

View File

@ -14,12 +14,18 @@
:label="item.label" :label="item.label"
:value="item.value" :value="item.value"
> >
<span style="float: left;"> <sys-origin-icon :icon="item.value" :desc="item.value" /></span> <span style="float: left;">
<sys-origin-icon :icon="item.value" :desc="item.value"
/></span>
<span style="float: left;margin-left:10px">{{ item.label }}</span> <span style="float: left;margin-left:10px">{{ item.label }}</span>
</el-option> </el-option>
</el-select> </el-select>
<div class="filter-item"> <div class="filter-item">
<account-input v-model="listQuery.userId" :sys-origin="listQuery.sysOrigin" placeholder="用户ID" /> <account-input
v-model="listQuery.userId"
:sys-origin="listQuery.sysOrigin"
placeholder="用户ID"
/>
</div> </div>
<el-select <el-select
v-model="listQuery.status" v-model="listQuery.status"
@ -62,24 +68,46 @@
> >
<el-table-column prop="sysOrigin" label="系统" align="center" width="100"> <el-table-column prop="sysOrigin" label="系统" align="center" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<sys-origin-icon :icon="scope.row.sysOrigin" :desc="scope.row.sysOrigin" /> <sys-origin-icon
</template> :icon="scope.row.sysOrigin"
</el-table-column> :desc="scope.row.sysOrigin"
<el-table-column label="用户" align="center" min-width="100">
<template slot-scope="scope">
<user-table-exhibit :user-profile="scope.row.userProfile" :query-details="true" />
</template>
</el-table-column>
<el-table-column label="身份图片" align="center">
<template slot-scope="scope">
<el-image
style="width: 50px; height: 50px"
:src="scope.row.identityCover"
:preview-src-list="[scope.row.identityCover]"
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="contact" label="手机号" align="center" min-width="100" /> <el-table-column label="用户" align="center" min-width="150">
<template slot-scope="scope">
<user-table-exhibit
:user-profile="scope.row.userProfile"
:query-details="true"
/>
</template>
</el-table-column>
<el-table-column label="身份图片" align="center" min-width="190">
<template slot-scope="scope">
<div v-if="Array.isArray(scope.row.passportFrontUrl)">
<el-image
v-for="(url, index) in scope.row.passportFrontUrl"
:key="index"
style="width: 50px; height: 50px; margin-right: 5px;"
:src="url"
:preview-src-list="scope.row.passportFrontUrl"
:initial-index="index"
/>
</div>
<el-image
v-else
style="width: 50px; height: 50px"
:src="scope.row.passportFrontUrl"
:preview-src-list="[scope.row.passportFrontUrl]"
/>
</template>
</el-table-column>
<el-table-column
prop="contactNumber"
label="手机号"
align="center"
min-width="100"
/>
<el-table-column label="状态" align="center"> <el-table-column label="状态" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<div> <div>
@ -90,17 +118,65 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="description" label="描述" align="center" min-width="200" /> <el-table-column
<el-table-column prop="auditDescription" label="审核描述" align="center" min-width="200" /> prop="otherDescription"
<el-table-column prop="createTime" label="创建时间" align="center" width="160"> label="描述"
align="center"
min-width="200"
/>
<!-- <el-table-column
prop="auditDescription"
label="审核描述"
align="center"
min-width="200"
/> -->
<el-table-column
prop="createTime"
label="创建时间"
align="center"
width="160"
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.createTime | dateFormat }} {{ scope.row.createTime | dateFormat }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="updateTime" label="修改时间" align="center" width="160" /> <el-table-column
prop="updateTime"
label="修改时间"
align="center"
width="160"
>
<template slot-scope="scope">
{{ scope.row.updateTime | dateFormat }}
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="100"> <el-table-column fixed="right" label="操作" align="center" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="text" :disabled="scope.row.status !== 'NONE' && scope.row.status !== 'PENDING'" @click="auditStatus(scope.row, false)">审核</el-button> <!-- <el-button
type="text"
:disabled="
scope.row.status !== 'NONE' && scope.row.status !== 'PENDING'
"
@click="auditStatus(scope.row, false)"
>审核</el-button
> -->
<el-button
type="text"
:disabled="
scope.row.status !== 'NONE' && scope.row.status !== 'PENDING'
"
@click="auditHandle(scope.row.id, 'PASS')"
>通过</el-button
>
<el-button
type="text"
style="color: red;"
:disabled="
scope.row.status !== 'NONE' && scope.row.status !== 'PENDING'
"
@click="auditHandle(scope.row.id, 'NOT_PASS')"
>驳回</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -113,11 +189,7 @@
/> />
<div class="gold-input-box"> <div class="gold-input-box">
<el-dialog <el-dialog :title="'审核'" :visible="inputBoxVisible" width="400px">
:title="'审核'"
:visible="inputBoxVisible"
width="400px"
>
<el-form <el-form
ref="form" ref="form"
:rules="formRules" :rules="formRules"
@ -146,7 +218,6 @@
:rows="3" :rows="3"
/> />
</el-form-item> </el-form-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button @click="hideInputBox()"> <el-button @click="hideInputBox()">
@ -182,7 +253,6 @@
label-position="left" label-position="left"
label-width="70px" label-width="70px"
> >
<el-form-item label="系统" prop="sysOrigin"> <el-form-item label="系统" prop="sysOrigin">
<el-select <el-select
v-model="exportQuery.sysOrigin" v-model="exportQuery.sysOrigin"
@ -197,8 +267,12 @@
:label="item.label" :label="item.label"
:value="item.value" :value="item.value"
> >
<span style="float: left;"> <sys-origin-icon :icon="item.value" :desc="item.value" /></span> <span style="float: left;">
<span style="float: left;margin-left:10px">{{ item.label }}</span> <sys-origin-icon :icon="item.value" :desc="item.value"
/></span>
<span style="float: left;margin-left:10px">{{
item.label
}}</span>
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -228,32 +302,42 @@
end-placeholder="结束日期" end-placeholder="结束日期"
/> />
</div> </div>
</el-form> </el-form>
</div> </div>
<div class="drawer-footer"> <div class="drawer-footer">
<el-button @click="exportConditionClose()">关闭</el-button> <el-button @click="exportConditionClose()">关闭</el-button>
<el-button type="primary" :disabled="exportLoading" :loading="exportLoading" @click="exportConditionSubmit()">导出</el-button> <el-button
type="primary"
:disabled="exportLoading"
:loading="exportLoading"
@click="exportConditionSubmit()"
>导出</el-button
>
</div> </div>
</div> </div>
</el-drawer> </el-drawer>
</div> </div>
</template> </template>
<script> <script>
import { getUserBankIdentityInfo, auditUserBankIdentityInfo, exportUserBankIdentityInfo } from '@/api/app-user' import {
import Pagination from '@/components/Pagination' getUserBankIdentityInfo,
import { pickerOptions } from '@/constant/el-const' auditUserBankIdentityInfo,
import { mapGetters } from 'vuex' withdrawInfoPass, //
withdrawInfoNotPass, //
exportUserBankIdentityInfo
} from "@/api/app-user";
import Pagination from "@/components/Pagination";
import { pickerOptions } from "@/constant/el-const";
import { mapGetters } from "vuex";
export default { export default {
name: 'UserPropsTable', name: "UserPropsTable",
components: { Pagination }, components: { Pagination },
data() { data() {
const commonRules = [ const commonRules = [
{ required: true, message: '必填字段', trigger: 'blur' } { required: true, message: "必填字段", trigger: "blur" }
] ];
return { return {
runningWaterVisible: false, runningWaterVisible: false,
@ -263,16 +347,16 @@ export default {
searchDisabled: false, searchDisabled: false,
inputBoxVisible: false, inputBoxVisible: false,
exportConditionVisible: false, exportConditionVisible: false,
thatSelectedUserId: '', thatSelectedUserId: "",
list: [], list: [],
total: 0, total: 0,
exportLoading: false, exportLoading: false,
pickerOptions, pickerOptions,
exportQuery: { exportQuery: {
startCreateDate: '', startCreateDate: "",
endCreateDate: '', endCreateDate: "",
status, status,
sysOrigin: '' sysOrigin: ""
}, },
exportQueryRules: { exportQueryRules: {
startCreateDate: commonRules, startCreateDate: commonRules,
@ -282,24 +366,24 @@ export default {
listQuery: { listQuery: {
cursor: 1, cursor: 1,
limit: 20, limit: 20,
userId: '', userId: "",
status: '', status: "PENDING",
sysOrigin: 'HALAR' sysOrigin: "LIKEI"
}, },
formData: { formData: {
id: '', id: "",
status: '', status: "",
auditDescription: '' auditDescription: ""
}, },
formRules: { formRules: {
status: commonRules status: commonRules
}, },
listLoading: true, listLoading: true,
formEditVisable: false formEditVisable: false
} };
}, },
computed: { computed: {
...mapGetters(['permissionsSysOriginPlatforms']) ...mapGetters(["permissionsSysOriginPlatforms"])
}, },
watch: { watch: {
rangeDate: { rangeDate: {
@ -307,110 +391,169 @@ export default {
deep: true, deep: true,
handler(newVal) { handler(newVal) {
if (newVal && newVal.length > 0) { if (newVal && newVal.length > 0) {
this.exportQuery.startCreateDate = newVal[0] this.exportQuery.startCreateDate = newVal[0];
this.exportQuery.endCreateDate = newVal[1] this.exportQuery.endCreateDate = newVal[1];
return return;
} }
this.exportQuery.startCreateDate = '' this.exportQuery.startCreateDate = "";
this.exportQuery.endCreateDate = '' this.exportQuery.endCreateDate = "";
} }
} }
}, },
created() { created() {
const that = this const that = this;
const querySystem = this.permissionsSysOriginPlatforms[0] const querySystem = this.permissionsSysOriginPlatforms[0];
if (!querySystem) { if (!querySystem) {
return return;
} }
that.listQuery.sysOrigin = querySystem.value that.listQuery.sysOrigin = querySystem.value;
that.renderData() that.renderData();
}, },
methods: { methods: {
renderData(isReset) { renderData(isReset) {
const that = this const that = this;
if (isReset === true) { if (isReset === true) {
that.listQuery.cursor = 1 that.listQuery.cursor = 1;
} }
that.listLoading = true that.listLoading = true;
getUserBankIdentityInfo(that.listQuery).then(res => { getUserBankIdentityInfo(that.listQuery)
const { body } = res .then(res => {
that.total = body.total || 0 const { body } = res;
that.list = body.records that.total = body.total || 0;
that.listLoading = false
}).catch(er => { that.list = body.records.map(record => {
that.listLoading = false try {
}) // passportFrontUrl JSON
return {
...record,
passportFrontUrl: record.passportFrontUrl
? JSON.parse(record.passportFrontUrl)
: null
};
} catch (error) {
//
console.warn(
"Failed to parse passportFrontUrl for record:",
record
);
return record;
}
});
that.listLoading = false;
})
.catch(er => {
that.listLoading = false;
});
}, },
handleSearch() { handleSearch() {
this.renderData(true) this.renderData(true);
}, },
handleMouseEnter(row) { handleMouseEnter(row) {
this.thatRow = row this.thatRow = row;
}, },
formEditSuccess() { formEditSuccess() {
this.formEditVisable = false this.formEditVisable = false;
this.renderData() this.renderData();
}, },
auditStatus(row, type) { auditStatus(row, type) {
const that = this const that = this;
that.formData = { that.formData = {
id: row.id, id: row.id,
auditDescription: '' auditDescription: ""
} };
that.inputBoxVisible = true that.inputBoxVisible = true;
}, },
hideInputBox() { hideInputBox() {
const that = this const that = this;
that.inputBoxVisible = false that.inputBoxVisible = false;
}, },
auditSubmit() { auditSubmit() {
const that = this const that = this;
that.$refs.form.validate(valid => { that.$refs.form.validate(valid => {
if (!valid) { if (!valid) {
console.error('error submit!!') console.error("error submit!!");
return return;
} }
that.listLoading = true that.listLoading = true;
auditUserBankIdentityInfo(that.formData).then(res => { auditUserBankIdentityInfo(that.formData)
that.$message.success('操作成功') .then(res => {
that.inputBoxVisible = false that.$message.success("操作成功");
that.listLoading = false that.inputBoxVisible = false;
that.renderData() that.listLoading = false;
}).catch(er => { that.renderData();
that.listLoading = false })
that.$message.error('操作失败') .catch(er => {
console.error(er) that.listLoading = false;
}) that.$message.error("操作失败");
}) console.error(er);
});
});
},
//
auditHandle(id, status) {
const that = this;
let data = [id];
that.listLoading = true;
if (status == "PASS") {
withdrawInfoPass(data)
.then(res => {
that.$message.success("操作成功");
that.listLoading = false;
that.renderData();
})
.catch(er => {
that.listLoading = false;
that.$message.error("操作失败");
console.error(er);
});
} else if (status == "NOT_PASS") {
withdrawInfoNotPass(data)
.then(res => {
that.$message.success("操作成功");
that.listLoading = false;
that.renderData();
})
.catch(er => {
that.listLoading = false;
that.$message.error("操作失败");
console.error(er);
});
}
}, },
exportConditionClose() { exportConditionClose() {
if (this.exportLoading) { if (this.exportLoading) {
this.$message.warning('正在执行导出, 请稍等~') this.$message.warning("正在执行导出, 请稍等~");
return return;
} }
this.exportConditionVisible = false this.exportConditionVisible = false;
}, },
exprotUserBankIdentityInfo() { exprotUserBankIdentityInfo() {
this.exportQuery.sysOrigin = this.listQuery.sysOrigin this.exportQuery.sysOrigin = this.listQuery.sysOrigin;
this.exportConditionVisible = true this.exportConditionVisible = true;
}, },
exportConditionSubmit() { exportConditionSubmit() {
const that = this const that = this;
that.$refs.exportQuery.validate(valid => { that.$refs.exportQuery.validate(valid => {
if (!valid) { if (!valid) {
console.error('error submit!!') console.error("error submit!!");
return false return false;
} }
that.exportLoading = true that.exportLoading = true;
exportUserBankIdentityInfo(that.exportQuery, 'Export UserBankIdentityInfo').then(res => { exportUserBankIdentityInfo(
that.exportLoading = false that.exportQuery,
that.exportConditionVisible = false "Export UserBankIdentityInfo"
}).catch(er => { )
that.exportLoading = false .then(res => {
this.$message.error('下载失败!') that.exportLoading = false;
}) that.exportConditionVisible = false;
}) })
.catch(er => {
that.exportLoading = false;
this.$message.error("下载失败!");
});
});
} }
} }
} };
</script> </script>