Administrator
2026-07-01 6a55e75b8530197d1f561f710f9e53b7e40be171
refactor(mall): 重构会员优惠券绑定逻辑

- 修改会员优惠券绑定方式为全量替换模式
- 先删除旧绑定记录再插入新绑定记录
- 简化优惠券绑定循环逻辑
- 更新SQL查询以支持多优惠券名称显示
- 添加GROUP BY子句确保数据正确聚合
- 移除重复绑定检查逻辑
2 files modified
22 ■■■■■ changed files
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java 19 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMemberMapper.xml 3 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java
@@ -391,25 +391,20 @@
        if(ObjectUtil.isEmpty(member)){
            throw new FebsException("请刷新页面");
        }
        List<Long> couponIds = mallmember.getCouponIds();
        if(CollUtil.isEmpty(couponIds)){
            return new FebsResponse().fail().message("请选择优惠券");
        }
        // 先删除旧绑定,再插入新绑定(全量替换)
        QueryWrapper<SalemanCoupon> deleteWrapper = new QueryWrapper<>();
        deleteWrapper.eq("member_id", member.getId());
        salemanCouponMapper.delete(deleteWrapper);
        List<Long> couponIds = mallmember.getCouponIds();
        if(CollUtil.isNotEmpty(couponIds)){
        for(Long couponId : couponIds){
            // 检查是否已绑定,已绑定则跳过
            QueryWrapper<SalemanCoupon> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("member_id", member.getId());
            queryWrapper.eq("coupon_id", couponId);
            SalemanCoupon exist = salemanCouponMapper.selectOne(queryWrapper);
            if(ObjectUtil.isNotEmpty(exist)){
                continue;
            }
            SalemanCoupon salemanCoupon = new SalemanCoupon();
            salemanCoupon.setMemberId(member.getId());
            salemanCoupon.setCouponId(couponId);
            salemanCouponMapper.insert(salemanCoupon);
        }
        }
        return new FebsResponse().success().message("操作成功");
    }
src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -413,7 +413,7 @@
    <select id="getsalemanRuleList" resultType="cc.mrbird.febs.mall.entity.MallMember">
        SELECT m.*,
               b.name couponName
               GROUP_CONCAT(b.name SEPARATOR ', ') couponName
        FROM mall_member m
        LEFT Join saleman_coupon a on m.id = a.member_id
        LEFT Join mall_goods_coupon b on b.id = a.coupon_id and b.state = 2
@@ -430,6 +430,7 @@
                </if>
            </if>
        </where>
        GROUP BY m.id
        order by m.CREATED_TIME desc
    </select>