This commit is contained in:
磷叶 2024-10-21 14:18:55 +08:00
parent 25b5c3dc2d
commit 1c0faca9d6
4 changed files with 160 additions and 103 deletions

View File

@ -1,7 +1,7 @@
<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="userName">
<el-form-item label="用户" prop="userName" v-if="notHasView(views.user)">
<el-input
v-model="queryParams.userName"
placeholder="请输入用户名称"
@ -9,8 +9,8 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="类型" prop="type">
<el-select v-model="queryParams.type" placeholder="请选择类型" clearable @change="handleQuery">
<el-form-item label="类型" prop="containsType">
<el-select v-model="queryParams.containsType" placeholder="请选择类型" clearable @change="handleQuery">
<el-option
v-for="dict in dict.type.risk_type"
:key="dict.value"
@ -27,6 +27,13 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="风控状态" prop="isFinished">
<el-radio-group v-model="queryParams.isFinished" @change="handleQuery">
<el-radio :label="null">全部</el-radio>
<el-radio :label="true">已解封</el-radio>
<el-radio :label="false">风控中</el-radio>
</el-radio-group>
</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>
@ -34,6 +41,16 @@
</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:risk:create']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
@ -79,6 +96,12 @@
<template v-else-if="column.key === 'type'">
<dict-tag :options="dict.type.risk_type" :value="d.row[column.key]"/>
</template>
<template v-else-if="column.key === 'userId'">
<user-link :id="d.row.userId" :name="d.row.userName" />
</template>
<template v-else-if="column.key === 'isFinished'">
<boolean-tag :value="d.row.isFinished" true-text="已解封" false-text="风控中"/>
</template>
<template v-else>
{{d.row[column.key]}}
</template>
@ -116,33 +139,35 @@
<!-- 添加或修改风控对话框 -->
<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="userId">
<el-input v-model="form.userId" placeholder="请输入用户ID" />
<el-form-item label="用户" prop="userId">
<user-input v-model="form.userId" :disabled="hasView(views.user)"/>
</el-form-item>
<el-form-item label="类型" prop="type">
<el-select v-model="form.type" placeholder="请选择类型">
<el-option
v-for="dict in dict.type.risk_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
<!-- <el-select v-model="form.type" placeholder="请选择类型">-->
<!-- <el-option-->
<!-- v-for="dict in dict.type.risk_type"-->
<!-- :key="dict.value"-->
<!-- :label="dict.label"-->
<!-- :value="dict.value"-->
<!-- ></el-option>-->
<!-- </el-select>-->
<el-checkbox-group v-model="form.type">
<el-checkbox v-for="dict in dict.type.risk_type" :key="dict.value" :label="dict.value">{{dict.label}}</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="风控原因" prop="reason">
<el-input v-model="form.reason" placeholder="请输入风控原因" />
<el-input v-model="form.reason" placeholder="请输入风控原因" type="textarea" maxlength="200" show-word-limit/>
</el-form-item>
<el-form-item label="结束时间" prop="endTime">
<el-date-picker clearable
<el-form-item label="解封时间" prop="endTime">
<el-date-picker
:clearable="form.riskId === null"
style="width: 100%"
v-model="form.endTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择结束时间">
placeholder="请选择解封时间">
</el-date-picker>
</el-form-item>
<el-form-item label="实名认证ID" prop="realNameId">
<el-input v-model="form.realNameId" placeholder="请输入实名认证ID" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
@ -154,7 +179,10 @@
<script>
import { listRisk, getRisk, delRisk, addRisk, updateRisk } from "@/api/ss/risk";
import { $showColumns } from '@/utils/mixins';
import { $showColumns, $view } from '@/utils/mixins'
import UserLink from '@/components/Business/SmUser/UserLink.vue'
import UserInput from '@/components/Business/SmUser/UserInput.vue'
import BooleanTag from '@/components/BooleanTag/index.vue'
//
const defaultSort = {
@ -164,18 +192,29 @@ const defaultSort = {
export default {
name: "Risk",
mixins: [$showColumns],
mixins: [$showColumns, $view],
dicts: ['risk_type'],
components: { BooleanTag, UserInput, UserLink },
props: {
query: {
type: Object,
default: () => {
return {}
}
}
},
data() {
return {
//
columns: [
{key: 'riskId', visible: true, label: '风控ID', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'userId', visible: true, 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: 'userId', visible: true, label: '用户', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'type', visible: true, label: '类型', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'reason', visible: true, label: '风控原因', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'endTime', visible: true, label: '结束时间', minWidth: "120", sortable: false, overflow: false, align: 'center', width: null},
{key: 'realNameId', visible: true, label: '实名认证ID', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'isFinished', visible: true, label: '风控状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'reason', visible: true, label: '风控原因', minWidth: null, sortable: true, overflow: true, align: 'center', width: null},
{key: 'endTime', 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: null},
{key: 'realNameId', visible: false, label: '实名认证ID', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
],
//
orderSorts: ['ascending', 'descending', null],
@ -215,7 +254,7 @@ export default {
//
rules: {
userId: [
{ required: true, message: "用户ID不能为空", trigger: "blur" }
{ required: true, message: "用户不能为空", trigger: "change" }
],
type: [
{ required: true, message: "类型不能为空", trigger: "change" }
@ -224,6 +263,11 @@ export default {
};
},
created() {
this.queryParams = {
...this.queryParams,
...this.query
}
this.getList();
},
methods: {
@ -256,8 +300,8 @@ export default {
reset() {
this.form = {
riskId: null,
userId: null,
type: null,
userId: this.query.userId,
type: [],
reason: null,
endTime: null,
createTime: null,

View File

@ -26,32 +26,32 @@
</el-input>
</form-col>
</el-row>
<el-row>
<form-col :span="10" label="限制提现" prop="limitWithdraw">
<el-switch v-model="form.limitWithdraw" active-text="限制" inactive-text="不限制"/>
</form-col>
<template v-if="form.limitWithdraw">
<form-col :span="14" label="限制提现至" prop="limitWithdrawTime" label-width="6em">
<el-date-picker type="datetime" v-model="form.limitWithdrawTime" placeholder="请选择限制提现时间(为空则为永久)" value-format="yyyy-MM-dd HH:mm:ss" :clearable="false" style="width: 100%"/>
</form-col>
<form-col :span="24" label="限制原因" prop="limitWithdraw" label-width="5em">
<el-input v-model="form.limitWithdrawReason" type="textarea" placeholder="请输入限制提现的原因(展示给用户查看)" show-word-limit maxlength="200"/>
</form-col>
</template>
</el-row>
<el-row>
<form-col :span="10" label="限制退款" prop="limitRefund" label-width="5em">
<el-switch v-model="form.limitRefund" active-text="限制" inactive-text="不限制"/>
</form-col>
<template v-if="form.limitRefund">
<form-col :span="14" label="限制退款至" prop="limitRefundTime" label-width="6em">
<el-date-picker type="datetime" v-model="form.limitRefundTime" placeholder="请选择限制退款时间(为空则为永久)" value-format="yyyy-MM-dd HH:mm:ss" :clearable="false" style="width: 100%"/>
</form-col>
<form-col :span="24" label="限制原因" prop="limitRefundReason">
<el-input v-model="form.limitRefundReason" type="textarea" placeholder="请输入限制退款的原因(展示给用户查看)" show-word-limit maxlength="200"/>
</form-col>
</template>
</el-row>
<!-- <el-row>-->
<!-- <form-col :span="10" label="限制提现" prop="limitWithdraw">-->
<!-- <el-switch v-model="form.limitWithdraw" active-text="限制" inactive-text="不限制"/>-->
<!-- </form-col>-->
<!-- <template v-if="form.limitWithdraw">-->
<!-- <form-col :span="14" label="限制提现至" prop="limitWithdrawTime" label-width="6em">-->
<!-- <el-date-picker type="datetime" v-model="form.limitWithdrawTime" placeholder="请选择限制提现时间(为空则为永久)" value-format="yyyy-MM-dd HH:mm:ss" :clearable="false" style="width: 100%"/>-->
<!-- </form-col>-->
<!-- <form-col :span="24" label="限制原因" prop="limitWithdraw" label-width="5em">-->
<!-- <el-input v-model="form.limitWithdrawReason" type="textarea" placeholder="请输入限制提现的原因(展示给用户查看)" show-word-limit maxlength="200"/>-->
<!-- </form-col>-->
<!-- </template>-->
<!-- </el-row>-->
<!-- <el-row>-->
<!-- <form-col :span="10" label="限制退款" prop="limitRefund" label-width="5em">-->
<!-- <el-switch v-model="form.limitRefund" active-text="限制" inactive-text="不限制"/>-->
<!-- </form-col>-->
<!-- <template v-if="form.limitRefund">-->
<!-- <form-col :span="14" label="限制退款至" prop="limitRefundTime" label-width="6em">-->
<!-- <el-date-picker type="datetime" v-model="form.limitRefundTime" placeholder="请选择限制退款时间(为空则为永久)" value-format="yyyy-MM-dd HH:mm:ss" :clearable="false" style="width: 100%"/>-->
<!-- </form-col>-->
<!-- <form-col :span="24" label="限制原因" prop="limitRefundReason">-->
<!-- <el-input v-model="form.limitRefundReason" type="textarea" placeholder="请输入限制退款的原因(展示给用户查看)" show-word-limit maxlength="200"/>-->
<!-- </form-col>-->
<!-- </template>-->
<!-- </el-row>-->
<el-row v-if="form.type === SmUserType.AGENT">
<group-title title="代理商配置"/>

View File

@ -7,7 +7,7 @@
</el-tab-pane>
</el-tabs>
</el-row>
<single-line-chart v-loading="loading" :labels="labels" :chart-data="chartData" name="收入(元)" height="288px"/>
<single-line-chart v-loading="loading" :labels="labels" :chart-data="chartData" name="收入(元)" height="268px"/>
</div>
</template>

View File

@ -1,6 +1,6 @@
<template>
<div class="app-container" v-loading="loading">
<template v-if="userData != null">
<template v-if="detail != null">
<el-row :gutter="12">
<el-col :lg="10" :md="12" :xs="24">
<el-card class="box-card">
@ -15,54 +15,63 @@
<div class="user-detail">
<div class="user-header">
<el-avatar :size="64" :src="userData.avatar"></el-avatar>
<el-avatar :size="64" :src="detail.avatar"></el-avatar>
<el-row type="flex" class="name-box">
<span class="user-name">{{userData.nickName}}</span>
<dict-tag :value="userData.type" :options="dict.type.sm_user_type"/>
<span class="user-name">{{detail.nickName}}</span>
<dict-tag :value="detail.type" :options="dict.type.sm_user_type"/>
</el-row>
<div class="phone-number">{{userData.phonenumber}}</div>
<div class="phone-number">{{detail.phonenumber}}</div>
</div>
<el-row type="flex" style="margin-top: 16px;">
<el-statistic title="店铺数" :value="userData.storeCount" :precision="0" suffix="家"/>
<el-statistic title="设备数" :value="userData.deviceCount" :precision="0" suffix="台"/>
<el-statistic title="账户余额" :value="userData.balance" :precision="2" suffix="元"/>
<el-statistic title="总收入" :value="userData.totalIncome" :precision="2" suffix="元"/>
<el-statistic title="总提现" :value="userData.withDrawlAmount" :precision="2" suffix="元"/>
<el-statistic title="总消费" :value="userData.rechargeAmount" :precision="2" suffix="元"/>
<el-statistic title="店铺数" :value="detail.storeCount" :precision="0" suffix="家"/>
<el-statistic title="设备数" :value="detail.deviceCount" :precision="0" suffix="台"/>
<el-statistic title="账户余额" :value="detail.balance" :precision="2" suffix="元"/>
<el-statistic title="总收入" :value="detail.totalIncome" :precision="2" suffix="元"/>
<el-statistic title="总提现" :value="detail.withDrawlAmount" :precision="2" suffix="元"/>
<el-statistic title="总消费" :value="detail.rechargeAmount" :precision="2" suffix="元"/>
</el-row>
<div class="user-description">
<el-descriptions :column="3">
<el-descriptions-item label="充值服务费">
{{userData.realServiceRate | money | defaultValue}} %
{{detail.realServiceRate | money | defaultValue}} %
</el-descriptions-item>
<el-descriptions-item label="代理服务费">
{{userData.agentServiceRate | money | defaultValue}} %
{{detail.agentServiceRate | money | defaultValue}} %
</el-descriptions-item>
<el-descriptions-item label="提现服务费">
<template v-if="userData.withdrawServiceRate == null || userData.withdrawServiceType == null">跟随渠道</template>
<template v-if="detail.withdrawServiceRate == null || detail.withdrawServiceType == null">跟随渠道</template>
<template v-else>
<dict-tag :options="dict.type.withdraw_service_type" :value="userData.withdrawServiceType" size="mini"/>
{{userData.withdrawServiceRate}} {{serviceUnit(userData.withdrawServiceType)}}
<dict-tag :options="dict.type.withdraw_service_type" :value="detail.withdrawServiceType" size="mini"/>
{{detail.withdrawServiceRate}} {{serviceUnit(detail.withdrawServiceType)}}
</template>
</el-descriptions-item>
<el-descriptions-item label="限制提现">
<boolean-tag :value="userData.limitWithdraw" size="small" true-type="danger" false-type="success"/>
</el-descriptions-item>
<el-descriptions-item label="限制提现原因" :span="2">
{{userData.limitWithdrawReason | defaultValue}}
</el-descriptions-item>
<el-descriptions-item label="限制退款">
<boolean-tag :value="userData.limitRefund" size="small" true-type="danger" false-type="success"/>
</el-descriptions-item>
<el-descriptions-item label="限制退款原因" :span="2">
{{userData.limitRefundReason | defaultValue}}
</el-descriptions-item>
<!-- <el-descriptions-item label="限制提现">-->
<!-- <boolean-tag :value="detail.limitWithdraw" size="small" true-type="danger" false-type="success"/>-->
<!-- </el-descriptions-item>-->
<!-- <el-descriptions-item label="限制提现原因" :span="2">-->
<!-- {{detail.limitWithdrawReason | defaultValue}}-->
<!-- </el-descriptions-item>-->
<!-- <el-descriptions-item label="限制退款">-->
<!-- <boolean-tag :value="detail.limitRefund" size="small" true-type="danger" false-type="success"/>-->
<!-- </el-descriptions-item>-->
<!-- <el-descriptions-item label="限制退款原因" :span="2">-->
<!-- {{detail.limitRefundReason | defaultValue}}-->
<!-- </el-descriptions-item>-->
<el-descriptions-item label="实名认证">
<boolean-tag :value="userData.isReal" size="small"/>
<boolean-tag :value="detail.isReal" size="small"/>
</el-descriptions-item>
<el-descriptions-item label="备注" :span="2">{{userData.remark | defaultValue}}</el-descriptions-item>
<el-descriptions-item label="姓名">
{{detail.realName | defaultValue}}
</el-descriptions-item>
<el-descriptions-item label="身份证">
{{detail.realIdCard | defaultValue}}
</el-descriptions-item>
<el-descriptions-item label="实名手机">
{{detail.realPhone | defaultValue}}
</el-descriptions-item>
<el-descriptions-item label="备注" :span="2">{{detail.remark | defaultValue}}</el-descriptions-item>
</el-descriptions>
</div>
</div>
@ -70,7 +79,7 @@
</el-col>
<el-col :lg="14" :md="12" :xs="24">
<el-card class="box-card">
<user-recharge-report :mch-id="userData.userId"/>
<user-recharge-report :mch-id="detail.userId"/>
</el-card>
</el-col>
</el-row>
@ -78,37 +87,40 @@
<el-card class="box-card">
<el-tabs>
<el-tab-pane label="设备列表" lazy>
<device v-if="userData.userId != null" :query="{userId: userData.userId}" :view="views.user"/>
<device v-if="detail.userId != null" :query="{userId: detail.userId}" :view="views.user"/>
</el-tab-pane>
<el-tab-pane label="店铺列表" lazy>
<store :query="{userId: userData.userId}" :view="views.user"/>
<store :query="{userId: detail.userId}" :view="views.user"/>
</el-tab-pane>
<el-tab-pane label="套餐列表" lazy>
<suit :query="{userId: userData.userId}" :view="views.user"/>
<suit :query="{userId: detail.userId}" :view="views.user"/>
</el-tab-pane>
<el-tab-pane label="充值订单" lazy>
<recharge :query="{userId: userData.userId}" :view="views.user"/>
<recharge :query="{userId: detail.userId}" :view="views.user"/>
</el-tab-pane>
<el-tab-pane label="收入订单" lazy>
<recharge :query="{mchId: userData.userId}" :view="views.mch"/>
<recharge :query="{mchId: detail.userId}" :view="views.mch"/>
</el-tab-pane>
<el-tab-pane label="提现列表" lazy>
<withdraw :query="{userId: userData.userId}" :view="views.user"/>
<withdraw :query="{userId: detail.userId}" :view="views.user"/>
</el-tab-pane>
<el-tab-pane label="应收账" lazy>
<receive-bill :query="{userId: userData.userId}" :view="views.user"/>
<receive-bill :query="{userId: detail.userId}" :view="views.user"/>
</el-tab-pane>
<el-tab-pane label="账变记录" lazy>
<record-balance :query="{userId: userData.userId}" :view="views.user"/>
<record-balance :query="{userId: detail.userId}" :view="views.user"/>
</el-tab-pane>
<el-tab-pane label="风控记录" lazy>
<risk :query="{userId: detail.userId}" :view="views.user"/>
</el-tab-pane>
<el-tab-pane label="实名认证记录" lazy>
<real-name :query="{userId: userData.userId}" :view="views.user"/>
<real-name :query="{userId: detail.userId}" :view="views.user"/>
</el-tab-pane>
<el-tab-pane label="收款账户" lazy>
<account :query="{userId: userData.userId}" :view="views.user"/>
<account :query="{userId: detail.userId}" :view="views.user"/>
</el-tab-pane>
<el-tab-pane label="用户秘钥" lazy>
<access :query="{userId: userData.userId}" :view="views.user"/>
<access :query="{userId: detail.userId}" :view="views.user"/>
</el-tab-pane>
</el-tabs>
</el-card>
@ -116,7 +128,7 @@
<el-empty v-else description="用户不存在"/>
<!--用户设置-->
<user-config-dialog :show.sync="showConfigDialog" :user-id="userData.userId" @success="getDetail"/>
<user-config-dialog :show.sync="showConfigDialog" :user-id="detail.userId" @success="getDetail"/>
</div>
</template>
@ -141,11 +153,12 @@ import RealName from '@/views/ss/realName/index.vue'
import UserConfigDialog from '@/views/system/smUser/components/UserConfigDialog.vue'
import { SmUserType } from '@/utils/constants'
import ReceiveBill from '@/views/ss/receiveBill/index.vue'
import Risk from '@/views/ss/risk/index.vue'
export default {
name: 'User/:userId',
mixins: [$view, $serviceType],
components: { ReceiveBill, UserConfigDialog, RealName, Withdraw, BooleanTag, Recharge, Device, Suit, Account, RecordBalance, Store, Access, UserRechargeReport, UserAccount, UserDevice, LineChart},
components: { Risk, ReceiveBill, UserConfigDialog, RealName, Withdraw, BooleanTag, Recharge, Device, Suit, Account, RecordBalance, Store, Access, UserRechargeReport, UserAccount, UserDevice, LineChart},
dicts: ['sm_user_type', 'service_type', 'withdraw_service_type'],
computed: {
SmUserType() {
@ -159,7 +172,7 @@ export default {
},
data() {
return {
userData: {},
detail: {},
loading: false,
showConfigDialog: false,
}
@ -171,7 +184,7 @@ export default {
getDetail() {
this.loading = true;
getSmUser(this.$route.params.userId).then(response => {
this.userData = response.data;
this.detail = response.data;
}).finally(()=> {
this.loading = false;
})