From 126921cbc42a1ab37f3065328c76e40634080667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A3=B7=E5=8F=B6?= <14103883+leaf-phos@user.noreply.gitee.com> Date: Mon, 25 Nov 2024 18:02:16 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A3=8E=E6=8E=A7=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/ss/riskInfo.js | 44 +++ src/utils/constants.js | 1 + src/views/mobile/liveness/index.vue | 3 +- src/views/ss/risk/index.vue | 13 +- src/views/ss/riskInfo/index.vue | 411 ++++++++++++++++++++++++++++ 5 files changed, 467 insertions(+), 5 deletions(-) create mode 100644 src/api/ss/riskInfo.js create mode 100644 src/views/ss/riskInfo/index.vue diff --git a/src/api/ss/riskInfo.js b/src/api/ss/riskInfo.js new file mode 100644 index 0000000..ad3a8aa --- /dev/null +++ b/src/api/ss/riskInfo.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询风控材料列表 +export function listRiskInfo(query) { + return request({ + url: '/ss/riskInfo/list', + method: 'get', + params: query + }) +} + +// 查询风控材料详细 +export function getRiskInfo(infoId) { + return request({ + url: '/ss/riskInfo/' + infoId, + method: 'get' + }) +} + +// 新增风控材料 +export function addRiskInfo(data) { + return request({ + url: '/ss/riskInfo', + method: 'post', + data: data + }) +} + +// 修改风控材料 +export function updateRiskInfo(data) { + return request({ + url: '/ss/riskInfo', + method: 'put', + data: data + }) +} + +// 删除风控材料 +export function delRiskInfo(infoId) { + return request({ + url: '/ss/riskInfo/' + infoId, + method: 'delete' + }) +} diff --git a/src/utils/constants.js b/src/utils/constants.js index 30bdea6..9ac1506 100644 --- a/src/utils/constants.js +++ b/src/utils/constants.js @@ -247,4 +247,5 @@ export const RiskSubmitType = { ID_CARD_HAND: "3", // 手持身份证照片 VIDEO: "4", // 使用场景视频 BUSINESS_LICENCE: "5", // 营业执照 + DUTY_VIDEO: "6", // 责任视频 } diff --git a/src/views/mobile/liveness/index.vue b/src/views/mobile/liveness/index.vue index edbfc57..c19f901 100644 --- a/src/views/mobile/liveness/index.vue +++ b/src/views/mobile/liveness/index.vue @@ -13,6 +13,7 @@ <script> import wx from 'weixin-js-sdk' +import { tansParams } from '@/utils/ruoyi' export default { name: 'Liveness', @@ -51,7 +52,7 @@ export default { // alert('success:' + this.success) if (this.success) { wx.miniProgram.redirectTo({ - url: '/pages/shuaxin', + url: `/pages/shuaxin?${tansParams(this.$route.query)}` }) } else { wx.miniProgram.navigateBack({ diff --git a/src/views/ss/risk/index.vue b/src/views/ss/risk/index.vue index 369a927..cf00cfd 100644 --- a/src/views/ss/risk/index.vue +++ b/src/views/ss/risk/index.vue @@ -106,6 +106,9 @@ <template v-else-if="column.key === 'userId'"> <user-link :id="d.row.userId" :name="d.row.userName" /> </template> + <template v-else-if="column.key === 'verifyStatus'"> + <dict-tag :value="d.row.verifyStatus" :options="dict.type.risk_info_status"/> + </template> <template v-else-if="column.key === 'isFinished'"> <boolean-tag :value="d.row.isFinished" true-text="已解封" false-text="风控中"/> </template> @@ -175,8 +178,8 @@ <el-checkbox v-for="dict of dict.type.risk_submit_type" :key="dict.value" :label="dict.value">{{dict.label}}</el-checkbox> </el-checkbox-group> </el-form-item> - <el-form-item label="场景提示" prop="videoWords" v-if="!isEmpty(form.submitType) && form.submitType.includes(RiskSubmitType.VIDEO)"> - <el-input v-model="form.videoWords" type="textarea" :maxlength="200" show-word-limit placeholder="请输入使用场景视频文本提示"/> + <el-form-item label="视频引导" prop="videoWords" v-if="!isEmpty(form.submitType) && form.submitType.includes(RiskSubmitType.DUTY_VIDEO)"> + <el-input v-model="form.videoWords" type="textarea" :maxlength="200" show-word-limit placeholder="请输入录制视频的文本引导" autosize/> </el-form-item> <el-form-item label="提交后自动解封" prop="unsealSelf" label-width="9em" v-if="!isEmpty(form.submitType)"> <el-switch v-model="form.unsealSelf" active-text="开启" inactive-text="不开启"/> @@ -213,7 +216,7 @@ export default { } }, mixins: [$showColumns, $view], - dicts: ['risk_type', 'risk_submit_type'], + dicts: ['risk_type', 'risk_submit_type', 'risk_info_status'], components: { BooleanTag, UserInput, UserLink }, props: { query: { @@ -236,6 +239,7 @@ export default { {key: 'unsealSelf', visible: true, label: '提交后自动解封', minWidth: null, sortable: true, overflow: false, align: 'center', width: null}, {key: 'createTime', visible: true, label: '创建时间', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"}, {key: 'realNameId', visible: false, label: '实名认证ID', minWidth: null, sortable: true, overflow: false, align: 'center', width: null}, + {key: 'verifyStatus', visible: true, label: '审核状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: null}, ], // 排序方式 orderSorts: ['ascending', 'descending', null], @@ -334,7 +338,8 @@ export default { createTime: null, realNameId: null, unsealSelf: false, - submitType: [] + submitType: [], + videoWords: `请录制视频,并按要求念出以下内容:\n【本人:XXX,身份证:XXX,正常使用共享开关用于XXX共享使用,本人保证合法合规使用,如果不正常使用本人愿意承担所有法律责任。】` }; this.resetForm("form"); }, diff --git a/src/views/ss/riskInfo/index.vue b/src/views/ss/riskInfo/index.vue new file mode 100644 index 0000000..8919f41 --- /dev/null +++ b/src/views/ss/riskInfo/index.vue @@ -0,0 +1,411 @@ +<template> + <div class="app-container"> + <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> + <el-form-item label="状态" prop="status"> + <el-select v-model="queryParams.status" placeholder="请选择状态" clearable @change="handleQuery"> + <el-option + v-for="dict in dict.type.risk_info_status" + :key="dict.value" + :label="dict.label" + :value="dict.value" + /> + </el-select> + </el-form-item> + <el-form-item label="审核意见" prop="verifyRemark"> + <el-input + v-model="queryParams.verifyRemark" + placeholder="请输入审核意见" + clearable + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item> + <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> + </el-form-item> + </el-form> + + <el-row :gutter="10" class="mb8"> +<!-- <el-col :span="1.5">--> +<!-- <el-button--> +<!-- type="primary"--> +<!-- plain--> +<!-- icon="el-icon-plus"--> +<!-- size="mini"--> +<!-- @click="handleAdd"--> +<!-- v-hasPermi="['ss:riskInfo:add']"--> +<!-- >新增</el-button>--> +<!-- </el-col>--> +<!-- <el-col :span="1.5">--> +<!-- <el-button--> +<!-- type="success"--> +<!-- plain--> +<!-- icon="el-icon-edit"--> +<!-- size="mini"--> +<!-- :disabled="single"--> +<!-- @click="handleUpdate"--> +<!-- v-hasPermi="['ss:riskInfo:edit']"--> +<!-- >修改</el-button>--> +<!-- </el-col>--> + <el-col :span="1.5"> + <el-button + type="danger" + plain + icon="el-icon-delete" + size="mini" + :disabled="multiple" + @click="handleDelete" + v-hasPermi="['ss:riskInfo:remove']" + >删除</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="warning" + plain + icon="el-icon-download" + size="mini" + @click="handleExport" + v-hasPermi="['ss:riskInfo:export']" + >导出</el-button> + </el-col> + <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar> + </el-row> + + <el-table v-loading="loading" :data="riskInfoList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="onSortChange"> + <el-table-column type="selection" width="55" align="center" /> + <template v-for="column of showColumns"> + <el-table-column + :key="column.key" + :label="column.label" + :prop="column.key" + :align="column.align" + :min-width="column.minWidth" + :sort-orders="orderSorts" + :sortable="column.sortable" + :show-overflow-tooltip="column.overflow" + :width="column.width" + > + <template slot-scope="d"> + <template v-if="column.key === 'infoId'"> + {{d.row[column.key]}} + </template> + <template v-else-if="column.key === 'status'"> + <dict-tag :options="dict.type.risk_info_status" :value="d.row[column.key]"/> + </template> + <template v-else> + {{d.row[column.key]}} + </template> + </template> + </el-table-column> + </template> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> + <template slot-scope="scope"> + <el-button + size="mini" + type="text" + icon="el-icon-check" + @click="handleVerify(scope.row)" + v-hasPermi="['ss:riskInfo:verify']" + >审核</el-button> + <el-button + size="mini" + type="text" + icon="el-icon-delete" + @click="handleDelete(scope.row)" + v-hasPermi="['ss:riskInfo:remove']" + >删除</el-button> + </template> + </el-table-column> + </el-table> + + <pagination + v-show="total>0" + :total="total" + :page.sync="queryParams.pageNum" + :limit.sync="queryParams.pageSize" + @pagination="getList" + /> + + <!-- 添加或修改风控材料对话框 --> + <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> + <el-form ref="form" :model="form" :rules="rules" label-width="80px"> + <el-form-item label="风控ID" prop="riskId"> + <el-input v-model="form.riskId" placeholder="请输入风控ID" /> + </el-form-item> + <el-form-item label="状态" prop="status"> + <el-radio-group v-model="form.status"> + <el-radio + v-for="dict in dict.type.risk_info_status" + :key="dict.value" + :label="dict.value" + >{{dict.label}}</el-radio> + </el-radio-group> + </el-form-item> + <el-form-item label="实名认证ID" prop="realNameId"> + <el-input v-model="form.realNameId" placeholder="请输入实名认证ID" /> + </el-form-item> + <el-form-item label="身份证正面" prop="idCardFront"> + <el-input v-model="form.idCardFront" placeholder="请输入身份证正面" /> + </el-form-item> + <el-form-item label="身份证反面" prop="idCardBack"> + <el-input v-model="form.idCardBack" placeholder="请输入身份证反面" /> + </el-form-item> + <el-form-item label="手持身份证照片" prop="idCardHand"> + <el-input v-model="form.idCardHand" placeholder="请输入手持身份证照片" /> + </el-form-item> + <el-form-item label="使用场景视频" prop="video"> + <el-input v-model="form.video" placeholder="请输入使用场景视频" /> + </el-form-item> + <el-form-item label="责任视频" prop="dutyVideo"> + <el-input v-model="form.dutyVideo" placeholder="请输入责任视频" /> + </el-form-item> + <el-form-item label="营业执照" prop="businessLicence"> + <el-input v-model="form.businessLicence" placeholder="请输入营业执照" /> + </el-form-item> + <el-form-item label="审核人ID" prop="verifyId"> + <el-input v-model="form.verifyId" placeholder="请输入审核人ID" /> + </el-form-item> + <el-form-item label="审核人名称" prop="verifyBy"> + <el-input v-model="form.verifyBy" placeholder="请输入审核人名称" /> + </el-form-item> + <el-form-item label="审核意见" prop="verifyRemark"> + <el-input v-model="form.verifyRemark" placeholder="请输入审核意见" /> + </el-form-item> + <el-form-item label="审核时间" prop="verifyTime"> + <el-date-picker clearable + v-model="form.verifyTime" + type="date" + value-format="yyyy-MM-dd" + placeholder="请选择审核时间"> + </el-date-picker> + </el-form-item> + <el-form-item label="提交时间" prop="submitTime"> + <el-date-picker clearable + v-model="form.submitTime" + type="date" + value-format="yyyy-MM-dd" + placeholder="请选择提交时间"> + </el-date-picker> + </el-form-item> + </el-form> + <div slot="footer" class="dialog-footer"> + <el-button type="primary" @click="submitForm">确 定</el-button> + <el-button @click="cancel">取 消</el-button> + </div> + </el-dialog> + </div> +</template> + +<script> +import { listRiskInfo, getRiskInfo, delRiskInfo, addRiskInfo, updateRiskInfo } from "@/api/ss/riskInfo"; +import { $showColumns } from '@/utils/mixins'; + +// 默认排序字段 +const defaultSort = { + prop: "createTime", + order: "descending" +} + +export default { + name: "RiskInfo", + mixins: [$showColumns], + dicts: ['risk_info_status'], + data() { + return { + // 字段列表 + columns: [ + {key: 'infoId', visible: false, label: 'ID', minWidth: null, sortable: true, overflow: false, align: 'center', width: null}, + {key: 'riskId', visible: false, label: '风控ID', minWidth: null, sortable: true, overflow: false, align: 'center', width: null}, + {key: 'submitTime', visible: true, label: '提交时间', minWidth: null, sortable: false, overflow: false, align: 'center', width: null}, + {key: 'status', visible: true, label: '状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: null}, + {key: 'realNameId', visible: false, label: '实名认证ID', minWidth: null, sortable: true, overflow: false, align: 'center', width: null}, + {key: 'idCardFront', visible: true, label: '身份证正面', minWidth: null, sortable: true, overflow: false, align: 'center', width: null}, + {key: 'idCardBack', visible: true, label: '身份证反面', minWidth: null, sortable: true, overflow: false, align: 'center', width: null}, + {key: 'idCardHand', visible: true, label: '手持身份证', minWidth: null, sortable: true, overflow: false, align: 'center', width: null}, + {key: 'video', visible: true, label: '使用场景', minWidth: null, sortable: true, overflow: false, align: 'center', width: null}, + {key: 'dutyVideo', visible: true, label: '责任视频', minWidth: null, sortable: true, overflow: false, align: 'center', width: null}, + {key: 'businessLicence', visible: true, label: '营业执照', minWidth: null, sortable: true, overflow: false, align: 'center', width: null}, + {key: 'verifyBy', visible: true, label: '审核人', minWidth: null, sortable: true, overflow: false, align: 'center', width: null}, + {key: 'verifyRemark', visible: true, label: '审核意见', minWidth: null, sortable: true, overflow: false, align: 'center', width: null}, + {key: 'verifyTime', visible: true, label: '审核时间', minWidth: null, sortable: false, overflow: false, align: 'center', width: null}, + ], + // 排序方式 + orderSorts: ['ascending', 'descending', null], + // 遮罩层 + loading: true, + // 选中数组 + ids: [], + // 非单个禁用 + single: true, + // 非多个禁用 + multiple: true, + // 显示搜索条件 + showSearch: true, + // 总条数 + total: 0, + // 风控材料表格数据 + riskInfoList: [], + // 弹出层标题 + title: "", + // 是否显示弹出层 + open: false, + defaultSort, + // 查询参数 + queryParams: { + pageNum: 1, + pageSize: 20, + orderByColumn: defaultSort.prop, + isAsc: defaultSort.order, + infoId: null, + riskId: null, + status: null, + realNameId: null, + verifyId: null, + verifyBy: null, + verifyRemark: null, + }, + // 表单参数 + form: {}, + // 表单校验 + rules: { + riskId: [ + { required: true, message: "风控ID不能为空", trigger: "blur" } + ], + status: [ + { required: true, message: "状态不能为空", trigger: "change" } + ], + } + }; + }, + created() { + this.getList(); + }, + methods: { + /** 当排序按钮被点击时触发 **/ + onSortChange(column) { + if (column.order == null) { + this.queryParams.orderByColumn = defaultSort.prop; + this.queryParams.isAsc = defaultSort.order; + } else { + this.queryParams.orderByColumn = column.prop; + this.queryParams.isAsc = column.order; + } + this.getList(); + }, + /** 查询风控材料列表 */ + getList() { + this.loading = true; + listRiskInfo(this.queryParams).then(response => { + this.riskInfoList = response.rows; + this.total = response.total; + this.loading = false; + }); + }, + // 取消按钮 + cancel() { + this.open = false; + this.reset(); + }, + // 表单重置 + reset() { + this.form = { + infoId: null, + riskId: null, + status: null, + realNameId: null, + idCardFront: null, + idCardBack: null, + idCardHand: null, + video: null, + dutyVideo: null, + businessLicence: null, + verifyId: null, + verifyBy: null, + verifyRemark: null, + verifyTime: null, + createTime: null, + submitTime: null + }; + this.resetForm("form"); + }, + /** 搜索按钮操作 */ + handleQuery() { + this.queryParams.pageNum = 1; + this.getList(); + }, + /** 重置按钮操作 */ + resetQuery() { + this.resetForm("queryForm"); + this.handleQuery(); + }, + // 多选框选中数据 + handleSelectionChange(selection) { + this.ids = selection.map(item => item.infoId) + this.single = selection.length!==1 + this.multiple = !selection.length + }, + /** 新增按钮操作 */ + handleAdd() { + this.reset(); + this.open = true; + this.title = "添加风控材料"; + }, + /** 修改按钮操作 */ + handleUpdate(row) { + this.reset(); + const infoId = row.infoId || this.ids + getRiskInfo(infoId).then(response => { + this.form = response.data; + this.open = true; + this.title = "修改风控材料"; + }); + }, + /** 修改按钮操作 */ + handleVerify(row) { + this.reset(); + const infoId = row.infoId || this.ids + getRiskInfo(infoId).then(response => { + this.form = response.data; + this.open = true; + this.title = "修改风控材料"; + }); + }, + /** 提交按钮 */ + submitForm() { + this.$refs["form"].validate(valid => { + if (valid) { + if (this.form.infoId != null) { + updateRiskInfo(this.form).then(response => { + this.$modal.msgSuccess("修改成功"); + this.open = false; + this.getList(); + }); + } else { + addRiskInfo(this.form).then(response => { + this.$modal.msgSuccess("新增成功"); + this.open = false; + this.getList(); + }); + } + } + }); + }, + /** 删除按钮操作 */ + handleDelete(row) { + const infoIds = row.infoId || this.ids; + this.$modal.confirm('是否确认删除风控材料编号为"' + infoIds + '"的数据项?').then(function() { + return delRiskInfo(infoIds); + }).then(() => { + this.getList(); + this.$modal.msgSuccess("删除成功"); + }).catch(() => {}); + }, + /** 导出按钮操作 */ + handleExport() { + this.download('ss/riskInfo/export', { + ...this.queryParams + }, `riskInfo_${new Date().getTime()}.xlsx`) + } + } +}; +</script>