From 9696e659c1ec3f080708536ef98c91775005247b Mon Sep 17 00:00:00 2001 From: Administrator <15274802129@163.com> Date: Thu, 08 May 2025 14:24:33 +0800 Subject: [PATCH] feat(mall): 增加会员等级和分销等级设置功能 - 新增会员等级和分销等级设置页面 - 实现会员等级和分销等级的更新逻辑 - 优化会员列表页面,增加相关筛选条件 - 调整数据库查询以支持新的筛选条件 --- src/main/java/cc/mrbird/febs/mall/controller/member/AdminMallMemberController.java | 13 ++ src/main/resources/templates/febs/views/modules/mallMember/vip-level-setting.html | 14 +- src/main/resources/mapper/modules/MallMemberMapper.xml | 31 +++--- src/main/java/cc/mrbird/febs/mall/controller/member/ViewMallMemberController.java | 15 ++ src/main/resources/templates/febs/views/modules/mallMember/sale-level-setting.html | 92 ++++++++++++++++++ src/main/java/cc/mrbird/febs/mall/service/impl/AdminMemberLevelServiceImpl.java | 4 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java | 3 src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html | 112 ++++++++++++++++++---- 8 files changed, 237 insertions(+), 47 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/mall/controller/member/AdminMallMemberController.java b/src/main/java/cc/mrbird/febs/mall/controller/member/AdminMallMemberController.java index 800f122..19bd9af 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/member/AdminMallMemberController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/member/AdminMallMemberController.java @@ -631,8 +631,17 @@ @PostMapping("vipLevelSetUpdate") public FebsResponse vipLevelSetUpdate(MallMember member) { - member.setVipLevelTime(new Date()); - mallMemberService.updateById(member); + MallMember mallMember = mallMemberService.getBaseMapper().selectById(member.getId()); + mallMember.setDirector(member.getDirector()); + mallMemberService.updateById(mallMember); + return new FebsResponse().success().message("操作成功"); + } + + @PostMapping("saleLevelSetUpdate") + public FebsResponse saleLevelSetUpdate(MallMember member) { + MallMember mallMember = mallMemberService.getBaseMapper().selectById(member.getId()); + mallMember.setStoreMaster(member.getStoreMaster()); + mallMemberService.updateById(mallMember); return new FebsResponse().success().message("操作成功"); } diff --git a/src/main/java/cc/mrbird/febs/mall/controller/member/ViewMallMemberController.java b/src/main/java/cc/mrbird/febs/mall/controller/member/ViewMallMemberController.java index 9d9aa36..0057351 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/member/ViewMallMemberController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/member/ViewMallMemberController.java @@ -403,16 +403,29 @@ } @GetMapping("vipLevelSetting/{id}") + @RequiresPermissions("updateMemberLevel:update") public String vipLevelSetting(@PathVariable(value = "id") String id, Model model) { MallMember mallMember = mallMemberMapper.selectById(id); Map<String, Object> data = new HashMap<>(); data.put("id", mallMember.getId()); - data.put("level", mallMember.getLevel()); + data.put("director", mallMember.getDirector()); model.addAttribute("vipLevelSet", data); return FebsUtil.view("modules/mallMember/vip-level-setting"); } + @GetMapping("saleLevelSetting/{id}") + @RequiresPermissions("updateSaleLevel:update") + public String updateSaleLevel(@PathVariable(value = "id") String id, Model model) { + MallMember mallMember = mallMemberMapper.selectById(id); + + Map<String, Object> data = new HashMap<>(); + data.put("id", mallMember.getId()); + data.put("storeMaster", mallMember.getStoreMaster()); + model.addAttribute("saleLevelSet", data); + return FebsUtil.view("modules/mallMember/sale-level-setting"); + } + @GetMapping("addCoupon/{id}") public String addCoupon(@PathVariable long id, Model model) { // AdminAgentLevelSetInfoVo data = mallMemberService.getAgentLevelSetInfoByMemberId(id); diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMemberLevelServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMemberLevelServiceImpl.java index f0f1362..3022675 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMemberLevelServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMemberLevelServiceImpl.java @@ -64,7 +64,7 @@ public FebsResponse levelAll() { List<HappyMemberLevel> happyMemberLevels = happyMemberLevelMapper.selectList( new LambdaQueryWrapper<HappyMemberLevel>() - .select(HappyMemberLevel::getId, HappyMemberLevel::getName) + .select(HappyMemberLevel::getCode, HappyMemberLevel::getName) .orderByAsc(HappyMemberLevel::getId) ); return new FebsResponse().success().data(happyMemberLevels); @@ -102,7 +102,7 @@ public FebsResponse saleLevelAll() { List<HappySaleLevel> happySaleLevels = happySaleLevelMapper.selectList( new LambdaQueryWrapper<HappySaleLevel>() - .select(HappySaleLevel::getId, HappySaleLevel::getName) + .select(HappySaleLevel::getCode, HappySaleLevel::getName) .orderByAsc(HappySaleLevel::getId) ); return new FebsResponse().success().data(happySaleLevels); diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java index 3a4c4ab..d661368 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java @@ -678,6 +678,9 @@ wallet.setMemberId(mallMember.getId()); mallMemberWalletMapper.insert(wallet); } else { + if (MallMember.ACCOUNT_STATUS_DISABLED.equals(mallMember.getAccountStatus())) { + throw new FebsException("账号已停用"); + } mallMember.setSessionKey(sessionKey); this.baseMapper.updateById(mallMember); } diff --git a/src/main/resources/mapper/modules/MallMemberMapper.xml b/src/main/resources/mapper/modules/MallMemberMapper.xml index 7cf3420..307315a 100644 --- a/src/main/resources/mapper/modules/MallMemberMapper.xml +++ b/src/main/resources/mapper/modules/MallMemberMapper.xml @@ -53,34 +53,35 @@ <where> <if test="record != null" > <if test="record.birthdayQuery!=null"> - and date_format(m.birthday, '%m-%d') = date_format(#{record.birthdayQuery}, '%m-%d') + and date_format(a.birthday, '%m-%d') = date_format(#{record.birthdayQuery}, '%m-%d') </if> <if test="record.name!=null and record.name!=''"> - and m.name like concat('%', #{record.name},'%') + and a.name like concat('%', #{record.name},'%') </if> - <if test="record.account!=null and record.account!=''"> - and ( - m.phone like concat('%', #{record.account},'%') - or m.email like concat('%', #{record.account},'%') - or m.bind_phone like concat('%', #{record.account},'%') - or m.invite_id like concat('%', #{record.account},'%') - ) + <if test="record.phone!=null and record.phone!=''"> + and a.phone like concat('%', #{record.phone},'%') </if> <if test="record.accountStatus!=null"> - and m.account_status = #{record.accountStatus} + and a.account_status = #{record.accountStatus} + </if> + <if test="record.director!=null"> + and a.director = #{record.director} + </if> + <if test="record.storeMaster!=null"> + and a.store_master = #{record.storeMaster} </if> <if test="record.accountType != null" > - and m.account_type = #{record.accountType} + and a.account_type = #{record.accountType} </if> <if test="record.level!=null and record.level!=''"> - and m.level=#{record.level} + and a.level=#{record.level} </if> - <if test="record.isSale!=null and record.isSale!=''"> - and m.is_sale=#{record.isSale} + <if test="record.checkOrder!=null"> + and a.check_order=#{record.checkOrder} </if> </if> </where> - GROUP BY m.id order by m.CREATED_TIME desc + GROUP BY a.id order by a.CREATED_TIME desc </select> <select id="getMallMemberInfoById" resultType="cc.mrbird.febs.mall.vo.MallMemberVo"> diff --git a/src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html b/src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html index 1197007..4890e74 100644 --- a/src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html +++ b/src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html @@ -8,15 +8,43 @@ <div class="layui-col-md10"> <div class="layui-form-item"> <div class="layui-inline"> - <label class="layui-form-label layui-form-label-sm">用户昵称</label> + <label class="layui-form-label layui-form-label-sm">用户名</label> <div class="layui-input-inline"> - <input type="text" placeholder="用户昵称" name="name" autocomplete="off" class="layui-input"> + <input type="text" placeholder="用户名" name="name" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-inline"> - <label class="layui-form-label layui-form-label-sm">手机号码</label> + <label class="layui-form-label layui-form-label-sm">联系方式</label> <div class="layui-input-inline"> - <input type="text" placeholder="手机号码" name="phone" autocomplete="off" class="layui-input"> + <input type="text" placeholder="联系方式" name="phone" autocomplete="off" class="layui-input"> + </div> + </div> + + <div class="layui-inline"> + <label class="layui-form-label layui-form-label-sm">会员等级</label> + <div class="layui-input-inline"> + <select name="director" class="director-type"> + <option value="">请选择</option> + </select> + </div> + </div> + + <div class="layui-inline"> + <label class="layui-form-label layui-form-label-sm">分销等级</label> + <div class="layui-input-inline"> + <select name="storeMaster" class="storeMaster-type"> + <option value="">请选择</option> + </select> + </div> + </div> + <div class="layui-inline"> + <label class="layui-form-label layui-form-label-sm">状态</label> + <div class="layui-input-inline"> + <select name="accountStatus"> + <option value="">请选择</option> + <option value="1">启用</option> + <option value="2">停用</option> + </select> </div> </div> <div class="layui-inline"> @@ -61,11 +89,11 @@ <a lay-event="edit" shiro:hasPermission="user:update"><i class="layui-icon febs-edit-area febs-blue"></i></a> </script> -<script type="text/html" id="switchStatus"> +<script type="text/html" id="accountStatusSwitch"> {{# if(d.accountStatus === 1) { }} - <input type="checkbox" value={{d.id}} lay-text="正常|禁用" checked lay-skin="switch" lay-filter="switchStatus"> + <input type="checkbox" value={{d.id}} lay-text="启用|停用" checked lay-skin="switch" lay-filter="accountStatusSwitch"> {{# } else { }} - <input type="checkbox" value={{d.id}} lay-text="正常|禁用" lay-skin="switch" lay-filter="switchStatus"> + <input type="checkbox" value={{d.id}} lay-text="启用|停用" lay-skin="switch" lay-filter="accountStatusSwitch"> {{# } }} </script> <script type="text/html" id="switchStoreMaster"> @@ -111,10 +139,11 @@ background-color: #5FB878 !important; } </style> -<script type="text/html" id="toolbar"> +<script type="text/html" id="memberToolbar"> <div class="layui-btn-container"> <!-- <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="updateReferer">修改推荐人</button>--> -<!-- <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="updateVipLevel">修改会员等级</button>--> + <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="updateMemberLevel:update" lay-event="updateMemberLevel">修改会员等级</button> + <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="updateSaleLevel:update" lay-event="updateSaleLevel">修改分销等级</button> <!-- <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="addCoupon">优惠券派送</button>--> </div> </script> @@ -144,9 +173,33 @@ elem: '#febs-member-benefits-list-birthday-start', format:'MM-dd' }); + //(下拉框) + $.get(ctx + 'admin/level/levelAll', function (res) { + var data = res.data; + for (let k in data) + { + $(".director-type").append("<option value='" + data[k].code + "'>" + data[k].name + "</option>"); + } + layui.use('form', function () { + var form = layui.form; + form.render(); + }); + }); + //(下拉框) + $.get(ctx + 'admin/level/saleLevelAll', function (res) { + var data = res.data; + for (let k in data) + { + $(".storeMaster-type").append("<option value='" + data[k].code + "'>" + data[k].name + "</option>"); + } + layui.use('form', function () { + var form = layui.form; + form.render(); + }); + }); // 表格初始化 - initTable(); + initMemberListTable(); // 初始化表格操作栏各个按钮功能 table.on('tool(userTable)', function (obj) { @@ -223,13 +276,13 @@ } function closeAccount(id) { febs.get(ctx + 'admin/mallMember/closeAccount/' + id, null, function () { - febs.alert.success('禁用成功'); + febs.alert.success('操作成功'); $query.click(); }); } function openAccount(id) { febs.get(ctx + 'admin/mallMember/openAccount/' + id, null, function () { - febs.alert.success('开启成功'); + febs.alert.success('操作成功'); $query.click(); }); } @@ -318,12 +371,12 @@ tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject}); }); - function initTable() { + function initMemberListTable() { tableIns = febs.table.init({ elem: $view.find('table'), id: 'userTable', url: ctx + 'admin/mallMember/getMallMemberList', - toolbar:"#toolbar", + toolbar:"#memberToolbar", defaultToolbar:[], cols: [[ {type: 'checkbox'}, @@ -332,7 +385,10 @@ {field: 'name', title: '用户名', minWidth: 100,align:'left'}, {field: 'realName', title: '真实姓名', minWidth: 100,align:'left'}, {field: 'phone', title: '联系方式', minWidth: 150,align:'left'}, + {field: 'directorName', title: '会员等级', minWidth: 150,align:'left'}, + {field: 'storeMasterName', title: '分销等级', minWidth: 150,align:'left'}, {field: 'inviteId', title: '邀请码', minWidth: 100,align:'left'}, + {field: 'checkOrder', title: '状态', templet: '#accountStatusSwitch', minWidth: 100,align:'center'}, {field: 'checkOrder', title: '核销员', templet: '#checkOrderSwitch', minWidth: 100,align:'center'}, {field: 'createdTime', title: '注册时间', minWidth: 180,align:'center'}, ]] @@ -379,16 +435,29 @@ }); } - if (layEvent === 'updateVipLevel') { + if (layEvent === 'updateSaleLevel') { var checkData = table.checkStatus('userTable').data; if (checkData.length > 1) { febs.alert.warn('每次只能修改一个用户'); return; } - // var idList = []; - // for (var i = 0; i < checkData.length; i++) { - // idList.push(checkData[i].id); - // } + febs.modal.open('设置分销等级', 'modules/mallMember/saleLevelSetting/' + checkData[0].id, { + btn: ['确认', '取消'], + yes: function (index, layero) { + $('#sale-level-set').find('#submit').trigger('click'); + }, + btn2: function () { + layer.closeAll(); + } + }); + } + + if (layEvent === 'updateMemberLevel') { + var checkData = table.checkStatus('userTable').data; + if (checkData.length > 1) { + febs.alert.warn('每次只能修改一个用户'); + return; + } febs.modal.open('设置会员等级', 'modules/mallMember/vipLevelSetting/' + checkData[0].id, { btn: ['确认', '取消'], yes: function (index, layero) { @@ -485,10 +554,13 @@ name: $searchForm.find('input[name="name"]').val().trim(), phone: $searchForm.find('input[name="phone"]').val().trim(), checkOrder: $searchForm.find("select[name='checkOrder']").val(), + accountStatus: $searchForm.find("select[name='accountStatus']").val(), + director: $searchForm.find("select[name='director']").val(), + storeMaster: $searchForm.find("select[name='storeMaster']").val(), }; } - form.on('switch(switchStatus)', function (data) { + form.on('switch(accountStatusSwitch)', function (data) { if (data.elem.checked) { openAccount(data.value); } else { diff --git a/src/main/resources/templates/febs/views/modules/mallMember/sale-level-setting.html b/src/main/resources/templates/febs/views/modules/mallMember/sale-level-setting.html new file mode 100644 index 0000000..c82254c --- /dev/null +++ b/src/main/resources/templates/febs/views/modules/mallMember/sale-level-setting.html @@ -0,0 +1,92 @@ +<style> + #sale-level-set { + padding: 20px 25px 25px 0; + } + + #sale-level-set .layui-treeSelect .ztree li a, .ztree li span { + margin: 0 0 2px 3px !important; + } + #sale-level-set #data-permission-tree-block { + border: 1px solid #eee; + border-radius: 2px; + padding: 3px 0; + } + #sale-level-set .layui-treeSelect .ztree li span.button.switch { + top: 1px; + left: 3px; + } + +</style> +<div class="layui-fluid" id="sale-level-set"> + <form class="layui-form" action="" lay-filter="sale-level-set-form"> + <div class="layui-form-item febs-hide"> + <label class="layui-form-label febs-form-item-require">id:</label> + <div class="layui-input-block"> + <input type="text" name="id"> + </div> + </div> + <div class="layui-form-item"> + <div class="layui-inline"> + <label class="layui-form-label">分销等级:</label> + <div class="layui-input-inline"> + <select lay-verify="required" name="storeMaster" class="sale-level-set-level" id="saleLevelSet"> + <option value="">请选择</option> + </select> + </div> + </div> + </div> + <div class="layui-form-item febs-hide"> + <button class="layui-btn" lay-submit="" lay-filter="sale-level-set-form-submit" id="submit"></button> + </div> + </form> +</div> + +<script data-th-inline="javascript"> + layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree'], function () { + var $ = layui.jquery, + febs = layui.febs, + layer = layui.layer, + formSelects = layui.formSelects, + treeSelect = layui.treeSelect, + form = layui.form, + eleTree = layui.eleTree, + saleLevelSet = [[${saleLevelSet}]], + $view = $('#sale-level-set'), + validate = layui.validate, + _deptTree; + + form.render(); + + initMemberLevel(); + + function initMemberLevel() { + form.val("sale-level-set-form", { + "id": saleLevelSet.id, + "storeMaster": saleLevelSet.storeMaster + }); + } + + //(下拉框) + $.get(ctx + 'admin/level/saleLevelAll', function (res) { + var data = res.data; + for (var k in data) + { + $(".sale-level-set-level").append("<option value='" + data[k].code + "'>" + data[k].name + "</option>"); + } + layui.use('form', function () { + var form = layui.form; + $("#saleLevelSet").val(saleLevelSet.storeMaster) + form.render(); + }); + }); + + form.on('submit(sale-level-set-form-submit)', function (data) { + febs.post(ctx + 'admin/mallMember/saleLevelSetUpdate', data.field, function () { + layer.closeAll(); + febs.alert.success('操作成功'); + $('#febs-member-list').find('#query').click(); + }); + return false; + }); + }); +</script> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/mallMember/vip-level-setting.html b/src/main/resources/templates/febs/views/modules/mallMember/vip-level-setting.html index 434c406..22b5a96 100644 --- a/src/main/resources/templates/febs/views/modules/mallMember/vip-level-setting.html +++ b/src/main/resources/templates/febs/views/modules/mallMember/vip-level-setting.html @@ -29,7 +29,7 @@ <div class="layui-inline"> <label class="layui-form-label">会员等级:</label> <div class="layui-input-inline"> - <select lay-verify="required" name="level" class="vip-level-set-level" id="levelSet"> + <select lay-verify="required" name="director" class="vip-level-set-level" id="levelSet"> <option value="">请选择</option> </select> </div> @@ -57,17 +57,17 @@ form.render(); - initUserValue(); + initMemberLevel(); - function initUserValue() { + function initMemberLevel() { form.val("vip-level-set-form", { "id": vipLevelSet.id, - "level": vipLevelSet.level + "director": vipLevelSet.director }); } //(下拉框) - $.get(ctx + 'admin/vip/config/allList', function (res) { + $.get(ctx + 'admin/level/levelAll', function (res) { var data = res.data; for (var k in data) { @@ -75,7 +75,7 @@ } layui.use('form', function () { var form = layui.form; - $("#levelSet").val(vipLevelSet.level) + $("#levelSet").val(vipLevelSet.director) form.render(); }); }); @@ -84,7 +84,7 @@ febs.post(ctx + 'admin/mallMember/vipLevelSetUpdate', data.field, function () { layer.closeAll(); febs.alert.success('操作成功'); - $('#febs-member-list').find('#reset').click(); + $('#febs-member-list').find('#query').click(); }); return false; }); -- Gitblit v1.9.1