会员管理

This commit is contained in:
cun-nan 2023-10-18 18:31:46 +08:00
parent b8398df156
commit c828a46a79
14 changed files with 740 additions and 193 deletions

View File

@ -39,6 +39,7 @@
"@amap/amap-jsapi-loader": "^1.0.1",
"@riophae/vue-treeselect": "0.4.0",
"axios": "0.24.0",
"bignumber.js": "^9.1.2",
"clipboard": "2.0.8",
"core-js": "3.25.3",
"echarts": "4.9.0",

View File

@ -8,6 +8,14 @@ export function ljStoreInfo() {
})
}
// 查询店铺详细
export function ljStoreList() {
return request({
url: '/business/storeInformation/store/list',
method: 'get'
})
}
// 修改店铺信息
export function updateStore(data) {
return request({

View File

@ -10,10 +10,11 @@ export function listUser(query) {
}
// 查询会员列表
export function listStatistic() {
export function listStatistic(query) {
return request({
url: '/business/userManager/user/statistic',
method: 'get',
params: query
})
}

View File

@ -2,6 +2,11 @@
<div class="app-container">
<el-card >
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="来源油站" prop="storeIds">
<el-select v-model="storeIds" filterable clearable placeholder="来源油站" style="width: 100%;">
<el-option v-for="item in storeList" :key="item.id+''" :label="item.name" :value="item.id+''"/>
</el-select>
</el-form-item>
<el-form-item label="会员号" prop="userNo">
<el-input
v-model="queryParams.userNo"
@ -29,69 +34,61 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="会员等级" prop="gradeId">
<el-form-item label="会员等级" prop="name">
<el-select
v-model="queryParams.gradeId"
clearable
placeholder="会员等级"
placeholder="全部"
>
<el-option v-for="grade in userGradeList" :key="grade.id+''" :label="grade.name" :value="grade.id+''"/>
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-form-item label="" prop="gradeId">
<el-select
v-model="queryParams.status"
placeholder="状态"
v-model="ifBalance"
clearable
placeholder="全部"
>
<el-option label="有储值余额" value="haveBalance"/>
<el-option label="无储值余额" value="noHaveBalance"/>
</el-select>
</el-form-item>
<el-form-item label="" prop="status">
<el-select
v-model="queryParams.official"
placeholder="全部"
clearable
style="width: 240px"
>
<el-option key="A" label="启用" value="A"/>
<el-option key="N" label="禁用" value="N"/>
<el-option
v-for="dict in dict.type.official"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="注册时间">
<el-date-picker
v-model="queryParams.startTime"
value-format="yyyy-MM-dd HH:mm:ss"
type="datetime"
style="width:200px"
placeholder="开始时间"
></el-date-picker>
<span class="sp"> ~ </span>
<el-date-picker
v-model="queryParams.endTime"
value-format="yyyy-MM-dd HH:mm:ss"
type="datetime"
style="width:200px"
placeholder="结束时间"
v-model="dateRange"
style="width: 240px"
size="medium"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
</el-form-item>
<el-form-item label="所属店铺" prop="storeIds">
<el-select v-model="storeIds" multiple filterable clearable placeholder="请选择店铺" style="width: 100%;">
<el-option
v-for="item in storeList"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</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-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['member:add']"
>新增</el-button>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card>
<el-card style="margin-top: 20px">
<div>统计</div>
<template>
<div>
@ -100,7 +97,6 @@
<div class="sta">
<el-statistic
group-separator=","
:precision="2"
:value="total"
title="会员总数"
></el-statistic>
@ -108,12 +104,11 @@
</el-col>
<el-col :span="4">
<div class="sta">
<el-statistic
group-separator=","
:precision="2"
:value="addNum"
title="今日新增/昨日新增"
></el-statistic>
<el-statistic title="今日新增/昨日新增">
<template slot="formatter">
{{ addNum }}/{{ yesterdayAddNum }}
</template>
</el-statistic>
</div>
</el-col>
<el-col :span="4">
@ -140,7 +135,6 @@
<div class="sta">
<el-statistic
group-separator=","
:precision="2"
:value="point"
title="积分总余额"
></el-statistic>
@ -162,6 +156,12 @@
</el-card>
<el-card style="margin-top: 20px">
<el-button
type="primary"
icon="el-icon-plus"
@click="handleAdd"
v-hasPermi="['member:add']"
>新增</el-button>
<el-table ref="tables" v-loading="loading" :data="list" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="handleSortChange">
<el-table-column label="会员ID" prop="id" align="center" width="60"/>
<el-table-column label="头像" align="center" width="70">
@ -204,7 +204,7 @@
</el-table-column>
<el-table-column label="升数卡" align="center" prop="balance">
<template slot-scope="scope">
<div>{{ scope.row.literCard ? scope.row.literCard.toFixed(2) : '0.00' }}</div>
<div>{{ scope.row.literCard ? scope.row.literCard.toFixed(2) : '0.00' }}L</div>
<!-- <el-button-->
<!-- class="mini-btn"-->
<!-- type="primary"-->
@ -242,13 +242,16 @@
</template>
</el-table-column>
<el-table-column label="状态" align="center" prop="status">
<!-- <template slot-scope="scope">-->
<!-- <el-switch-->
<!-- v-model="scope.row.status"-->
<!-- active-value="A"-->
<!-- inactive-value="N"-->
<!-- @change="handleStatusChange(scope.row)"-->
<!-- ></el-switch>-->
<!-- </template>-->
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
active-value="A"
inactive-value="N"
@change="handleStatusChange(scope.row)"
></el-switch>
<dict-tag :options="dict.type.zhzt" :value="scope.row.status"/>
</template>
</el-table-column>
<el-table-column label="公众号" align="center" prop="official">
@ -286,7 +289,7 @@
</el-card>
<!-- 添加或修改对话框 -->
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
<el-dialog :close-on-click-modal="false" :title="title" :visible.sync="open" width="800px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row>
<el-col :span="24">
@ -295,6 +298,13 @@
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="手机号" prop="mobile">
<el-input v-model="form.mobile" placeholder="请输入手机号" maxlength="30"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="会员等级" prop="gradeId">
@ -308,25 +318,7 @@
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="有效期限">
<el-date-picker
v-model="form.startTime"
value-format="yyyy-MM-dd HH:mm:ss"
type="datetime"
placeholder="开始时间"
></el-date-picker>
<span class="sp"> </span>
<el-date-picker
v-model="form.endTime"
value-format="yyyy-MM-dd HH:mm:ss"
type="datetime"
placeholder="结束时间"
></el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="会员号" prop="userNo">
@ -334,23 +326,6 @@
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="手机号" prop="mobile">
<el-input v-model="form.mobile" placeholder="请输入手机号" maxlength="30"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="性别" prop="sex">
<el-radio-group v-model="form.sex">
<el-radio :key="1" :label="1" :value="1"></el-radio>
<el-radio :key="0" :label="0" :value="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="身份证号" prop="idcard">
@ -360,15 +335,39 @@
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="生日" prop="birthday">
<el-input v-model="form.birthday" placeholder="请输入生日格式如1990-01-01" maxlength="30"/>
<el-form-item label="会员初始积分" prop="point">
<el-input v-model="form.point" placeholder="0" maxlength="30"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="通讯地址" prop="address">
<el-input v-model="form.address" placeholder="请输入通讯地址" maxlength="100"/>
<el-form-item label="初始加油金" prop="refuelMoney">
<el-input v-model="form.refuelMoney" placeholder="0" maxlength="30"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="储值通用余额" prop="balance">
<el-input v-model="form.balance" placeholder="0" maxlength="30"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="升数卡余额" prop="literCard">
<el-input v-model="form.literCard" placeholder="0" maxlength="30"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="是否关注公众号">
<el-radio-group v-model="form.official">
<el-radio label="ygz" value="ygz">已关注</el-radio>
<el-radio label="wgz" value="wgz">未关注</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
@ -376,35 +375,15 @@
<el-col :span="24">
<el-form-item label="会员状态">
<el-radio-group v-model="form.status">
<el-radio key="A" label="A" value="A">正常</el-radio>
<el-radio key="N" label="N" value="N">禁用</el-radio>
<el-radio label="qy" value="qy">启用</el-radio>
<el-radio label="jy" value="jy">禁用</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="form.id">
<el-col :span="24">
<el-form-item label="注册来源">
<el-radio-group v-model="form.source">
<el-radio label="" v-if="!form.source">未知</el-radio>
<el-radio label="wechat_login" v-if="form.source == 'wechat_login'">微信小程序</el-radio>
<el-radio label="wechat_mp" v-if="form.source == 'wechat_mp'">微信公众号</el-radio>
<el-radio label="backend_add" v-if="form.source == 'backend_add'">后台添加</el-radio>
<el-radio label="register_by_account" v-if="form.source == 'register_by_account'">H5注册</el-radio>
<el-radio label="mobile_login" v-if="form.source == 'mobile_login'">手机号登录注册</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="备注信息">
<el-input v-model="form.description" type="textarea" placeholder="请输入内容"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
@ -424,11 +403,13 @@
import { getMemberList, updateMemberStatus, getMemberInfo, saveMember, deleteMember } from "@/api/member";
import balanceRecharge from "./balanceRecharge";
import pointRecharge from "./pointRecharge";
import {listStatistic, listUser} from "@/api/staff/user/user";
import {addUser, delUser, getUser, listStatistic, listUser, updateUser} from "@/api/staff/user/user";
import {listUserGrade} from "@/api/staff/user/usergrade";
import {ljStoreList} from "@/api/staff/store";
export default {
name: "MemberIndex",
components: { balanceRecharge, pointRecharge },
dicts: ['official'],
dicts: ['official','zhzt'],
data() {
return {
//
@ -441,6 +422,8 @@ export default {
refuelMoney:'',
//
addNum:'',
//
yesterdayAddNum:'',
//
loading: true,
//
@ -473,7 +456,8 @@ export default {
//
defaultSort: {prop: 'updateTime', order: 'descending'},
//
form: { id: '', name: '', gradeId: '', mobile: '', userNo: '', startTime: '', endTime: '', sex: 1, idcard: '', birthday: '', address: '', status: "A", description: '' },
form: { id: '', name: '', gradeId: '', mobile: '', userNo: '',point:'0', startTime: '', endTime: '', refuelMoney:'0',official:'wgz',
balance:'0', literCard:'0', sex: 1, idcard: '', birthday: '', address: '', status: "qy", description: '' },
//
queryParams: {
page: 1,
@ -484,15 +468,19 @@ export default {
name: '',
gradeId: '',
status: '',
storeIds: ''
storeIds: '',
official:'',
balance:'',
},
ifBalance:'',
//
rules: {
name: [
{ required: true, message: "会员名称不能为空", trigger: "blur" },
{ min: 2, max: 200, message: '会员名称长度必须介于2 和 100 之间', trigger: 'blur' }
],
gradeId: [{ required: true, message: "请选择会员等级", trigger: "blur" }]
gradeId: [{ required: true, message: "请选择会员等级", trigger: "blur" }],
mobile: [{ required: true, message: "请输入手机号", trigger: "blur" }],
}
};
},
@ -503,18 +491,17 @@ export default {
methods: {
//
goDedi(id){
console.log('id:',id)
this.$router.push({
path:"/member/userInfo",
// query:{
// id:id
// }
query:{
id:id
}
})
},
//
getList() {
this.loading = true;
listUser().then( response => {
listUser(this.addDateRange(this.queryParams, this.dateRange)).then( response => {
this.list = response.data.records;
this.total = response.data.total;
this.loading = false;
@ -531,18 +518,34 @@ export default {
// }
// );
},
//
getStatistic(){
listStatistic().then( response => {
listStatistic(this.addDateRange(this.queryParams, this.dateRange)).then( response => {
this.addNum = response.data.addNum;
this.yesterdayAddNum = response.data.yesterdayAddNum;
this.balance = response.data.balance;
this.point = response.data.point;
this.literCard = response.data.literCard;
this.refuelMoney = response.data.refuelMoney;
});
listUserGrade().then( response => {
this.userGradeList = response.data.records
});
ljStoreList().then( response => {
this.storeList = response.data
});
},
//
handleQuery() {
this.queryParams.page = 1;
if (this.ifBalance=='haveBalance'){
this.queryParams.balance = 1;
}else {
this.queryParams.balance = 2;
}
if (this.ifBalance==''){
this.queryParams.balance = ''
}
this.getList();
},
//
@ -588,7 +591,6 @@ export default {
},
//
closeDialog(dialog) {
console.log('closeDialog');
if (dialog == 'balance') {
this.openBalance = false;
}
@ -607,14 +609,10 @@ export default {
//
reset() {
this.resetForm("form");
this.form.id = '';
this.form.description = '';
this.form.name = '';
this.form.startTime = '';
this.form.endTime = '';
this.form.gradeId = '';
this.form.userNo = '';
this.form.mobile = '';
this.form= { id: '', name: '', gradeId: '', mobile: '', userNo: '',point:'0', startTime: '', endTime: '',
refuelMoney:'0',official:'wgz',balance:'0', literCard:'0', sex: 1, idcard: '', birthday: '', address: '',
status: "qy", description: ''
}
},
//
cancel() {
@ -626,17 +624,17 @@ export default {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id) {
saveMember(this.form).then(response => {
this.$modal.msgSuccess("修改会员成功");
this.open = false;
this.getList();
});
updateUser(this.form).then(response => {
this.$modal.msgSuccess("修改会员成功");
this.open = false;
this.getList();
});
} else {
saveMember(this.form).then(response => {
this.$modal.msgSuccess("新增会员成功");
this.open = false;
this.getList();
});
addUser(this.form).then(response => {
this.$modal.msgSuccess("新增会员成功");
this.open = false;
this.getList();
});
}
}
});
@ -645,8 +643,8 @@ export default {
handleUpdate(row) {
this.reset();
const id = row.id || this.ids;
getMemberInfo(id).then(response => {
this.form = response.data.memberInfo;
getUser(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "编辑会员";
});
@ -655,7 +653,8 @@ export default {
handleDelete(row) {
const name = row.name
this.$modal.confirm('确定删除"' + name + '"的会员信息?').then(function() {
return deleteMember(row.id);
// return deleteMember(row.id);
return delUser(row.id);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
@ -668,7 +667,7 @@ export default {
<style scoped>
.app-container{
width: 100%;
height: 100vh;
height: 100%;
background: #f6f8f9;
}
.sta{

View File

@ -1,15 +1,453 @@
<template>
<div>
会员详情页
<div class="app-container">
<el-card>
<div slot="header" class="clearfix" style="display: flex;justify-content: space-between">
<el-page-header @back="goBack" content="详情页面">
</el-page-header>
<div>
<el-button type="primary" plain round>子卡管理<i class="el-icon-bank-card el-icon--right"></i></el-button>
<el-button type="primary" plain round>会员码</el-button>
</div>
</div>
<div>基础资料</div>
<div style="display: flex;margin-top: 20px">
<div class="left">
<div>
<img v-if="form.avatar" :src="form.avatar" style="width: 80px;height: 80px">
<img v-else src="@/assets/images/avatar.png" style="width: 80px;height: 80px">
</div>
<el-button type="warning" plain round size="mini" style="margin: 10px">绑定实体卡</el-button><br>
<el-button type="primary" icon="el-icon-bank-card" round style="margin: 10px;width: 50%;height: 40px">会员充值</el-button>
</div>
<div class="right">
<el-descriptions>
<el-descriptions-item label="手机号">{{form.mobile}}
<el-tag size="mini" @click="replaceMobile">更换</el-tag>
</el-descriptions-item>
<el-descriptions-item label="会员昵称">{{form.name}}</el-descriptions-item>
<el-descriptions-item label="实体卡号">{{form.idcard}}</el-descriptions-item>
<el-descriptions-item label="绑定信息"></el-descriptions-item>
<el-descriptions-item label="会员状态">
<dict-tag :options="dict.type.zhzt" :value="form.status"/>
</el-descriptions-item>
<el-descriptions-item label="加油次数">{{form.consumeNum}}</el-descriptions-item>
<el-descriptions-item label="加油总金额">{{form.refuelMoney}}</el-descriptions-item>
<el-descriptions-item label="所属油站">{{ store.name }}</el-descriptions-item>
<el-descriptions-item label="注册时间">{{form.createTime}}</el-descriptions-item>
<el-descriptions-item label="关联副卡">{{form.secondCard}}</el-descriptions-item>
<el-descriptions-item label="会员等级">{{ grade.name }}</el-descriptions-item>
<el-descriptions-item label="储值优惠"></el-descriptions-item>
<el-descriptions-item label="每日笔数"></el-descriptions-item>
<el-descriptions-item label="固定等级"></el-descriptions-item>
<el-descriptions-item label="备注信息">{{ form.description }}</el-descriptions-item>
</el-descriptions>
</div>
</div>
</el-card>
<el-card style="margin: 20px 0">
<div>会员资产</div>
<div>
<template>
<div>
<el-row :gutter="20">
<el-col :span="4">
<div class="sta">
<el-statistic
group-separator=","
:value="form.point"
title="累计积分"
></el-statistic>
</div>
</el-col>
<el-col :span="4">
<div class="sta">
<el-statistic
group-separator=","
:value="form.refuelMoney"
title="加油金">
</el-statistic>
</div>
</el-col>
<el-col :span="4">
<div class="sta">
<el-statistic
group-separator=","
:precision="2"
:value="form.balance"
title="账户余额"
></el-statistic>
</div>
</el-col>
<el-col :span="4">
<div class="sta">
<el-statistic
group-separator=","
:precision="2"
:value="form.literCard"
title="升数卡余额"
></el-statistic>
</div>
</el-col>
</el-row>
</div>
</template>
</div>
</el-card>
<el-card>
<template>
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="加油订单" name="refuelOrder">
<el-table ref="tables" v-loading="loading" :data="list">
<el-table-column label="所属油站" prop="id" align="center"/>
<el-table-column label="订单时间" align="center"/>
<el-table-column label="交易终端" align="center" prop="userNo"/>
<el-table-column label="油品/油枪" align="center" prop="name" />
<el-table-column label="订单金额" align="center" prop="mobile"/>
<el-table-column label="优惠金额" align="center" prop="gradeId"/>
<el-table-column label="实付金额" align="center" prop="balance"/>
<el-table-column label="付款类型" align="center" prop="balance"/>
<el-table-column label="订单号" align="center" prop="balance"/>
<el-table-column label="订单类型" align="center" prop="point"/>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.page"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</el-tab-pane>
<el-tab-pane label="商品订单" name="shopOrder">
<el-table ref="tables" v-loading="loading" :data="list">
<el-table-column label="所属油站" prop="id" align="center"/>
<el-table-column label="订单时间" align="center"/>
<el-table-column label="订单金额" align="center" prop="userNo"/>
<el-table-column label="商品数量" align="center" prop="name" />
<el-table-column label="储值卡" align="center" prop="mobile"/>
<el-table-column label="实付金额" align="center" prop="balance"/>
<el-table-column label="付款类型" align="center" prop="balance"/>
<el-table-column label="订单号" align="center" prop="balance"/>
<el-table-column label="订单类型" align="center" prop="point"/>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.page"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</el-tab-pane>
<el-tab-pane label="余额记录" name="balanceRecord">
<!-- <el-tabs v-model="balanceRecord" type="card" @tab-click="handleClick">-->
<!-- <el-tab-pane label="储值卡记录" name="first">储值卡记录</el-tab-pane>-->
<!-- <el-tab-pane label="升数卡记录" name="second">升数卡记录</el-tab-pane>-->
<!-- </el-tabs>-->
<el-radio-group v-model="tabPosition" size="mini" style="margin-bottom: 30px;">
<el-radio-button label="giftCard">储值卡记录</el-radio-button>
<el-radio-button label="literCard">升数卡记录</el-radio-button>
</el-radio-group>
<div v-if="tabPosition=='giftCard'">
<el-table ref="tables" v-loading="loading" :data="list">
<el-table-column prop="date" label="所属油站"/>
<el-table-column prop="date" label="变动账户"/>
<el-table-column prop="date" label="类型"/>
<el-table-column label="详细信息">
<el-table-column prop="name" label="变动金额"/>
<el-table-column prop="address" label="变动前余额"/>
<el-table-column prop="address" label="变动后余额"/>
</el-table-column>
<el-table-column prop="date" label="订单号"/>
<el-table-column prop="date" label="描述"/>
<el-table-column prop="date" label="变动时间"/>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.page"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</div>
<div v-else>
<el-table ref="tables" v-loading="loading" :data="list">
<el-table-column label="所属油站" prop="id" align="center"/>
<el-table-column label="变动账户" align="center"/>
<el-table-column label="类型" align="center" prop="userNo"/>
<el-table-column label="变动升数" align="center" prop="name" />
<el-table-column label="订单号" align="center" prop="balance"/>
<el-table-column label="描述" align="center" prop="balance"/>
<el-table-column label="变动时间" align="center" prop="point"/>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.page"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</div>
</el-tab-pane>
<el-tab-pane label="积分记录" name="pointRecord">
<el-table ref="tables" v-loading="loading" :data="list">
<el-table-column label="所属油站" prop="id" align="center"/>
<el-table-column label="变动时间" align="center"/>
<el-table-column label="类型" align="center" prop="userNo"/>
<el-table-column label="变动积分" align="center" prop="name" />
<el-table-column label="描述" align="center" prop="balance"/>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.page"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</el-tab-pane>
<el-tab-pane label="卡券列表" name="cardList">
<el-radio-group v-model="cardList" size="mini" style="margin-bottom: 30px;">
<el-radio-button label="notUse">未使用</el-radio-button>
<el-radio-button label="used">已使用</el-radio-button>
<el-radio-button label="expired">已过期</el-radio-button>
<el-radio-button label="whole">全部</el-radio-button>
</el-radio-group>
<div>
<el-table ref="tables" v-loading="loading" :data="list">
<el-table-column prop="date" label="所属油站"/>
<el-table-column prop="date" label="优惠券名称"/>
<el-table-column prop="date" label="卡券类型"/>
<el-table-column prop="date" label="满减金额"/>
<el-table-column prop="date" label="券面额"/>
<el-table-column prop="date" label="适用油品"/>
<el-table-column prop="date" label="状态"/>
<el-table-column label="卡券可用规则">
<el-table-column prop="name" label="有效期"/>
<el-table-column prop="address" label="周期与时段"/>
</el-table-column>
<el-table-column prop="date" label="领取时间"/>
<el-table-column prop="date" label="描述"/>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.page"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</div>
</el-tab-pane>
<el-tab-pane label="成长值记录" name="growthValue">
<el-radio-group v-model="growthValue" size="mini" style="margin-bottom: 30px;">
<el-radio-button label="whole">全部</el-radio-button>
<el-radio-button label="gasoline">汽油成长值</el-radio-button>
<el-radio-button label="diesel">柴油成长值</el-radio-button>
<el-radio-button label="naturalGas">天然气成长值</el-radio-button>
</el-radio-group>
<div>
<el-table ref="tables" v-loading="loading" :data="list">
<el-table-column label="所属油站" prop="id" align="center"/>
<el-table-column label="变动时间" align="center"/>
<el-table-column label="类型" align="center" prop="userNo"/>
<el-table-column label="变动成长值" align="center" prop="name" />
<el-table-column label="描述" align="center" prop="balance"/>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.page"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</div>
</el-tab-pane>
<el-tab-pane label="加油金记录" name="refuelMoney">
<el-table ref="tables" v-loading="loading" :data="list">
<el-table-column label="所属油站" prop="id" align="center"/>
<el-table-column label="变动时间" align="center"/>
<el-table-column label="类型" align="center" prop="userNo"/>
<el-table-column label="变动数据" align="center" prop="name" />
<el-table-column label="记录单号" align="center" prop="name" />
<el-table-column label="变动描述" align="center" prop="balance"/>
<el-table-column label="场景来源" align="center" prop="balance"/>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.page"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</el-tab-pane>
</el-tabs>
</template>
</el-card>
<!-- 更换手机号对话框-->
<el-dialog :close-on-click-modal="false" :title="title" :visible.sync="openMobile" style="margin-top: 200px" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row>
<el-col :span="24">
<el-form-item label="新手机号" prop="mobile" style="width: 420px">
<el-input v-model="form.mobile" placeholder="请输入新手机号" maxlength="30" />
<span style="font-size: 12px;color: grey">
手机号更换后,旧手机号将无法使用,更换后实时生效
</span>
</el-form-item>
</el-col>
</el-row>
</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>
export default {
import {getUser, updateUser} from "@/api/staff/user/user";
import {ljStoreInfo} from "@/api/staff/store";
import {getUserGrade} from "@/api/staff/user/usergrade";
export default {
dicts: ['official','zhzt'],
data(){
return{
title:'',
//
openMobile: false,
growthValue:'whole',
cardList:'notUse',
tabPosition: 'giftCard',
balanceRecord: 'first',
//
loading: false,
id:'',
//
form:{},
//
store:'',
//
grade:'',
activeName: 'refuelOrder',
tableData:[],
total:'',
queryParams: {
page: 1,
pageSize: 10,
mobile: '',
id: '',
name: '',
status: '',
},
list: [],
//
rules: {
mobile: [{ required: true, message: "请输入手机号", trigger: "blur" }],
}
}
},
created() {
this.id = this.$route.query.id;
this.getUserInfo();
},
methods: {
//
replaceMobile(){
this.openMobile = true;
this.title = '更换手机号'
},
getList(){
},
//
getUserInfo(){
let _this = this;
//
getUser(this.id).then(response => {
this.form = response.data;
this.getGrade(response.data.gradeId);
});
//
ljStoreInfo().then(response => {
this.store = response.data;
});
},
getGrade(id){
getUserGrade(id).then(response => {
this.grade = response.data;
});
},
//
submitForm: function() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id) {
updateUser(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.openMobile = false;
this.getUserInfo();
});
} else {
// addUser(this.form).then(response => {
// this.$modal.msgSuccess("");
// this.open = false;
// this.getList();
// });
}
}
});
},
//
reset() {
this.resetForm("form");
this.form= {}
},
//
cancel() {
this.openMobile = false;
},
handleClick(tab, event) {
console.log(tab, event);
},
//
goBack() {
this.$router.back(-1);
}
}
}
</script>
<style lang="scss" scoped>
.app-container{
width: 100%;
height: 100%;
background: #f6f8f9;
}
.left{
width: 20%;
display: table-cell;
/*垂直居中 */
vertical-align: middle;
/*水平居中*/
text-align: center;
}
.right{
flex: 1;
}
.sta{
height: 100px;
margin-top: 10px;
padding-top: 30px;
}
</style>

View File

@ -836,7 +836,7 @@ export default {
<style scoped>
.app-container{
width: 100%;
height: 100vh;
height: 100%;
background: #f6f8f9;
}
.pagin-box{

View File

@ -191,6 +191,8 @@ export default {
<style lang="scss" scoped>
.app-container{
width: 100%;
height: 100%;
background: #f6f8f9;
}
.card{

View File

@ -277,19 +277,37 @@
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="所需成长值">
<el-input v-model="form.gasoline" placeholder="1" style="width: 240px">
<template slot="prepend">汽油</template>
<template slot="append">成长值</template>
</el-input>
<el-input v-model="form.dieselOil" placeholder="1" style="width: 240px">
<template slot="prepend">柴油</template>
<template slot="append">成长值</template>
</el-input>
<el-input v-model="form.naturalGas" placeholder="1" style="width: 240px">
<template slot="prepend">天然气</template>
<template slot="append">成长值</template>
</el-input>
<el-form-item label="所需成长值" prop="gasoline">
<e-row>
<el-col :span="8">
<el-form-item prop="gasoline">
<el-input v-model="form.gasoline" placeholder="1" style="width: 240px">
<template slot="prepend">汽油</template>
<template slot="append">成长值</template>
</el-input>
</el-form-item>
</el-col>
</e-row>
<e-row>
<el-col :span="8">
<el-form-item prop="dieselOil">
<el-input v-model="form.dieselOil" placeholder="1" style="width: 240px">
<template slot="prepend">柴油</template>
<template slot="append">成长值</template>
</el-input>
</el-form-item>
</el-col>
</e-row>
<e-row>
<el-col :span="8">
<el-form-item prop="naturalGas">
<el-input v-model="form.naturalGas" placeholder="1" style="width: 240px">
<template slot="prepend">天然气</template>
<template slot="append">成长值</template>
</el-input>
</el-form-item>
</el-col>
</e-row>
</el-form-item>
</el-col>
</el-row>
@ -302,7 +320,7 @@
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="优惠类型">
<el-form-item label="优惠类型" prop="preferential">
<el-radio-group v-model="form.preferential">
<el-radio
v-for="dict in dict.type.yhlx"
@ -325,7 +343,7 @@
<div v-if="form.preferential=='自定义优惠'">
<el-row>
<el-col :span="24">
<el-form-item label="汽油优惠">
<el-form-item label="汽油优惠" prop="preferential">
<el-radio-group v-model="form.gasolineDiscount">
<el-radio label="无优惠">无优惠</el-radio>
<el-radio label="满减优惠">满减优惠</el-radio>
@ -354,7 +372,7 @@
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="柴油优惠">
<el-form-item label="柴油优惠" prop="preferential">
<el-radio-group v-model="form.dieselDiscount">
<el-radio label="无优惠">无优惠</el-radio>
<el-radio label="满减优惠">满减优惠</el-radio>
@ -383,7 +401,7 @@
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="天然气优惠">
<el-form-item label="天然气优惠" prop="preferential">
<el-radio-group v-model="form.naturalGasDiscount">
<el-radio label="无优惠">无优惠</el-radio>
<el-radio label="满减优惠">满减优惠</el-radio>
@ -414,7 +432,7 @@
<div v-else>
<el-row>
<el-col :span="24">
<el-form-item label="关联优惠组">
<el-form-item label="关联优惠组" prop="preferential">
<el-select v-model="form.promotionGroup">
<el-option
v-for="dict in dict.type.yhhdz"
@ -438,7 +456,7 @@
<el-row>
<el-col :span="24">
<el-form-item label="状态">
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio label="qy">启用</el-radio>
<el-radio label="jy">禁用</el-radio>
@ -601,14 +619,20 @@ export default {
{ required: true, message: "等级名称不能为空", trigger: "blur" },
{ min: 2, max: 100, message: '等级名称长度必须介于2 和 100 之间', trigger: 'blur' }
],
catchType: [
{ required: true, message: "请选择升级方式", trigger: "blur" },
gasoline: [
{ required: true, message: "请填写汽油成长值", trigger: "blur" },
],
catchValue: [
{ required: true, message: "请输入升级条件值", trigger: "blur" },
dieselOil: [
{ required: true, message: "请填写柴油成长值", trigger: "blur" },
],
validDay: [
{ required: true, message: "请输入有效期天数0表述永久有效", trigger: "blur" },
naturalGas: [
{ required: true, message: "请填写天然气成长值", trigger: "blur" },
],
preferential: [
{ required: true, message: "请选择优惠类型", trigger: "blur" },
],
status: [
{ required: true, message: "请选择会员等级状态", trigger: "blur" },
],
discount: [
{ required: true, message: "请输入支付折扣", trigger: "blur" },
@ -863,8 +887,8 @@ export default {
<style scoped>
.app-container{
//width: 100%;
//height: 100vh;
width: 100%;
height: 100%;
background: #f6f8f9;
}
.card{

View File

@ -9,6 +9,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/business/storeInformation/store")
public class LJStoreController extends BaseController {
@ -25,6 +27,16 @@ public class LJStoreController extends BaseController {
return getSuccessResult(store);
}
/**
* 根据id查询门店信息
* @return
*/
@GetMapping("/list")
public ResponseObject list(){
List<LJStore> list = storeService.selectStoreList();
return getSuccessResult(list);
}
/**
* 修改门店信息
* @param store

View File

@ -3,6 +3,8 @@ package com.fuint.business.storeInformation.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fuint.business.storeInformation.entity.LJStore;
import java.util.List;
/**
* 店铺信息 业务层
*/
@ -13,6 +15,12 @@ public interface ILJStoreService extends IService<LJStore> {
*/
public LJStore selectStoreById();
/**
* 查询店铺信息
* @return
*/
public List<LJStore> selectStoreList();
/**
* 修改店铺信息
* @param store 店铺信息

View File

@ -8,6 +8,8 @@ import com.fuint.common.dto.AccountInfo;
import com.fuint.common.util.TokenUtil;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 店铺信息 业务层
*/
@ -25,6 +27,15 @@ public class LJStoreServiceImpl extends ServiceImpl<LJStoreMapper, LJStore> impl
return store;
}
/**
* 查询店铺信息
* @return
*/
@Override
public List<LJStore> selectStoreList() {
return baseMapper.selectList(null);
}
/**
* 修改店铺信息
* @param store 店铺信息

View File

@ -1,5 +1,6 @@
package com.fuint.business.userManager.entity;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fuint.framework.entity.BaseEntity;
@ -11,6 +12,7 @@ import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 会员个人信息
@ -114,4 +116,7 @@ public class LJUser extends BaseEntity implements Serializable {
@ApiModelProperty("加油次数")
private BigDecimal consumeNum;
@ApiModelProperty("副卡信息")
private String secondCard;
}

View File

@ -30,6 +30,7 @@
<result property="literCard" column="liter_card" />
<result property="refuelMoney" column="refuel_money" />
<result property="consumeNum" column="consume_num" />
<result property="secondCard" column="second_card" />
<result property="createTime" column="create_time" />
<result property="updateTime" column="update_time" />
<result property="createBy" column="create_by" />
@ -39,7 +40,7 @@
<sql id="selectUser">
select id, mobile, user_no, avatar, name, open_id, idcard, grade_id, start_time, end_time, balance, point,
sex, birthday, car_no, source, password, salt, address, merchant_id, store_id, create_time, update_time,
status, description, operator,official,liter_card,refuel_money,consume_num from mt_user
status, description, operator,official,liter_card,refuel_money,consume_num,second_card from mt_user
</sql>
<select id="selectUserList" resultMap="UserResult">
@ -58,9 +59,27 @@
<if test="user.gradeId != null and user.gradeId != ''">
and grade_id = #{user.gradeId}
</if>
<if test="user.storeId != null and user.storeId != ''">
and store_id = #{user.storeId}
</if>
<if test="user.official != null and user.official != ''">
and official = #{user.official}
</if>
<if test="user.balance != null and user.balance != '' and user.balance == 2">
and balance = 0
</if>
<if test="user.balance != null and user.balance != '' and user.balance == 1">
and balance != 0
</if>
<if test="user.params.beginTime != null and user.params.beginTime != ''"><!-- 开始时间检索 -->
and date_format(create_time,'%y%m%d') &gt;= date_format(#{user.params.beginTime},'%y%m%d')
</if>
<if test="user.params.endTime != null and user.params.endTime != ''"><!-- 结束时间检索 -->
and date_format(create_time,'%y%m%d') &lt;= date_format(#{user.params.endTime},'%y%m%d')
</if>
</where>
</select>
<select id="selectSumByStore" resultType="java.lang.Double" parameterType="int">
select sum(${sumValue}) from mt_user where store_id = #{storeId};
select sum(${sumValue}) from mt_user where store_id = #{storeId}
</select>
</mapper>

View File

@ -1,5 +1,6 @@
package com.fuint.business.userManager.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -11,8 +12,13 @@ import com.fuint.common.dto.AccountInfo;
import com.fuint.common.util.TokenUtil;
import org.springframework.stereotype.Service;
import javax.xml.crypto.Data;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* 会员信息 业务层
@ -30,7 +36,8 @@ public class LJUserServiceImpl extends ServiceImpl<LJUserMapper, LJUser> impleme
AccountInfo nowAccountInfo = TokenUtil.getNowAccountInfo();
Integer storeId = nowAccountInfo.getStoreId();
user.setStoreId(storeId);
return baseMapper.selectUserList(page,user);
IPage<LJUser> ljUserIPage = baseMapper.selectUserList(page, user);
return ljUserIPage;
}
/**
@ -48,14 +55,20 @@ public class LJUserServiceImpl extends ServiceImpl<LJUserMapper, LJUser> impleme
Double refuelMoney = baseMapper.selectSumByStore(storeId, "refuel_money");
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("TO_DAYS(create_time)","TO_DAYS(NOW())");
queryWrapper.apply(true, "TO_DAYS(NOW())-TO_DAYS(create_time) = 0");
Integer addNum = baseMapper.selectCount(queryWrapper);
QueryWrapper queryWrapper1 = new QueryWrapper<>();
queryWrapper1.apply(true, "TO_DAYS(NOW())-TO_DAYS(create_time) = 1");
Integer yesterdayAddNum = baseMapper.selectCount(queryWrapper1);
map.put("balance",balance);
map.put("point",point);
map.put("literCard",literCard);
map.put("refuelMoney",refuelMoney);
map.put("addNum",addNum);
map.put("yesterdayAddNum",yesterdayAddNum);
return map;
}
@ -88,6 +101,12 @@ public class LJUserServiceImpl extends ServiceImpl<LJUserMapper, LJUser> impleme
AccountInfo nowAccountInfo = TokenUtil.getNowAccountInfo();
Integer storeId = nowAccountInfo.getStoreId();
user.setStoreId(storeId);
if (user.getUserNo()==null || user.getUserNo().equals("")){
// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
// String timestamp = dateFormat.format(new Date());
String randomString = UUID.randomUUID().toString().replace("-","").substring(0,6);
user.setUserNo(randomString);
}
int row = baseMapper.insert(user);
return row;
}