jiangqs
2023-07-03 b3ed26028083bbf66bb47601d11f42cad802b903
商户端会员统计
36个文件已修改
17个文件已添加
1837 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/AppErrorConstant.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/MerTotalDto.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/MerGoodsPriceListVo.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteGoodsFallbackFactory.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteShopFallbackFactory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteGoodsService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteShopService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerGoodsController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/concole/GoodsController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/goods/GoodsMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/goods/GoodsService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/goods/GoodsServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerBirthdayController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerCouponController.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerTotalController.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/MgtCouponController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/dto/MerBirthdayEditDto.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/dto/MerCouponEditDto.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/dto/MerCouponPageDto.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/dto/MgtBirthdayEditDto.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerBirthdayEditInfoVo.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerBirthdayGetVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerCouponGetVo.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerCouponGoodsListVo.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerCouponPageVo.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerMemberFixedTotalVo.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerMemberRecommendTotalVo.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerMemberSourceTotalVo.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerMemberTotalVo.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/coupon/CouponMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/member/MemberMapper.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/birthday/BirthdayCardService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/coupon/CouponService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/birthday/BirthdayCardServiceImpl.java 215 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java 151 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberService.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/resources/mapper/coupon/CouponMapper.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerOrderDistributionTotalVo.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerOrderFromRankVo.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerOrderGoodsRankVo.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerOrderTotalVo.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerOrderTypeTotalVo.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtTotalOrderTotalVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/business/MerShopController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/console/ShopController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/task/MemberTaskServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/task/MemberTaskService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/AppErrorConstant.java
@@ -67,4 +67,7 @@
    String STAFF_MOBILE_DOUBLE = "手机号码已被注册";
    String SHOP_USER_DOUBLE = "账号已经关联其他商户登录";
    String COUPON_AUDIT_EDIT = "只能编辑审核拒绝的优惠券";
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/MerTotalDto.java
New file
@@ -0,0 +1,32 @@
package com.ruoyi.system.api.domain.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @ClassName MerTotalDto
 * @Description TODO
 * @Author jqs
 * @Date 2023/7/3 16:19
 * @Version 1.0
 */
@Data
public class MerTotalDto extends MerBaseDto{
    @ApiModelProperty(value = "开始日期")
    private String startDate;
    @ApiModelProperty(value = "结束日期")
    private String endDate;
    @ApiModelProperty(value = "全部经销商标记0否1是")
    private Integer shopAllFlag;
    @ApiModelProperty(value = "商品类型1周期2服务3体验4单品")
    private Integer goodsType;
    @ApiModelProperty(value = "商户id集合",hidden = true)
    private List<Long> shopIdList;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/MerGoodsPriceListVo.java
New file
@@ -0,0 +1,42 @@
package com.ruoyi.system.api.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @ClassName MerGoodsPriceVo
 * @Description TODO
 * @Author jqs
 * @Date 2023/7/3 9:37
 * @Version 1.0
 */
@Data
public class MerGoodsPriceListVo {
    @ApiModelProperty(value = "商品id")
    private String goodsId;
    @ApiModelProperty(value = "商品名称")
    private String goodsName;
    @ApiModelProperty(value = "商品编码")
    private String goodsNo;
    @ApiModelProperty(value = "商品类型1周期2服务3体验4单品")
    private String goodsType;
    @ApiModelProperty(value = "商品售价")
    private BigDecimal salesPrice;
    @ApiModelProperty(value = "商品建议售价")
    private BigDecimal suggestSalesPrice;;
    @ApiModelProperty(value = "商品简介")
    private String goodsIntroduction;
    @ApiModelProperty(value = "商品调理问题")
    private String goodsNurses;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteGoodsFallbackFactory.java
@@ -5,6 +5,7 @@
import com.ruoyi.system.api.domain.poji.goods.Goods;
import com.ruoyi.system.api.domain.poji.goods.GoodsFile;
import com.ruoyi.system.api.domain.poji.goods.ShopGoods;
import com.ruoyi.system.api.domain.vo.MerGoodsPriceListVo;
import com.ruoyi.system.api.service.RemoteGoodsService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -62,6 +63,11 @@
            public R<List<Goods>> listGoodsByGoodsId(String goodsIds) {
                return R.fail("获取商品列表失败:" + throwable.getMessage());
            }
            @Override
            public R<List<MerGoodsPriceListVo>> listGoodsPriceByGoodsId(String goodsIds) {
                return R.fail("获取商品列表失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteShopFallbackFactory.java
@@ -87,6 +87,11 @@
            public R<MemberTaskSimpleVo> getLastMemberTask(Long userId) {
                return R.fail("获取最近会员任务失败:" + throwable.getMessage());
            }
            @Override
            public R<List<Long>> listShopIdByShopId(Long shopId) {
                return R.fail("获取商户列表失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteGoodsService.java
@@ -6,6 +6,7 @@
import com.ruoyi.system.api.domain.poji.goods.Goods;
import com.ruoyi.system.api.domain.poji.goods.GoodsFile;
import com.ruoyi.system.api.domain.poji.goods.ShopGoods;
import com.ruoyi.system.api.domain.vo.MerGoodsPriceListVo;
import com.ruoyi.system.api.factory.RemoteGoodsFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
@@ -49,4 +50,15 @@
    @PostMapping("/goods/listGoodsByGoodsId")
    public R<List<Goods>> listGoodsByGoodsId(@RequestBody String goodsIds);
    /**
     * @description  通过id获取商品价格列表
     * @author  jqs
     * @date    2023/7/3 10:01
     * @param goodsIds
     * @return  R<List<MerGoodsPriceListVo>>
     */
    @PostMapping("/listGoodsPriceByGoodsId")
    public R<List<MerGoodsPriceListVo>> listGoodsPriceByGoodsId(@RequestBody String goodsIds);
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteShopService.java
@@ -109,4 +109,13 @@
     */
    @PostMapping("/member/getLastMemberTask")
    public R<MemberTaskSimpleVo> getLastMemberTask(@RequestBody Long userId);
    /**
     * @description  获取商户下属代理商
     * @author  jqs
     * @date    2023/7/3 17:26
     * @return  R<List<Long>>
     */
    @PostMapping("/listShopIdByShopId")
    public R<List<Long>> listShopIdByShopId(@RequestBody Long shopId);
}
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/business/MerGoodsController.java
@@ -5,8 +5,10 @@
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.goods.domain.dto.MerGoodsPageDto;
import com.ruoyi.goods.domain.dto.MerShopGoodsEditDto;
import com.ruoyi.goods.domain.dto.MgtSelectGoodsPageDto;
import com.ruoyi.goods.domain.vo.MerGoodsPageVo;
import com.ruoyi.goods.service.goods.GoodsService;
import com.ruoyi.system.api.domain.vo.MgtSelectGoodsPageVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.RequestBody;
@@ -52,4 +54,15 @@
        goodsService.editMerShopGoods(merShopGoodsEditDto);
        return R.ok();
    }
    @RequestMapping(value = "/pageMerSelectGoods", method = RequestMethod.POST)
    @ApiOperation(value = "分页获取商品选择列表")
    public R<Page<MgtSelectGoodsPageVo>> pageMerSelectGoods(@RequestBody MgtSelectGoodsPageDto mgtSelectGoodsPageDto) {
        Page<MgtSelectGoodsPageVo> page = new Page<>();
        page.setSize(mgtSelectGoodsPageDto.getPageSize());
        page.setCurrent(mgtSelectGoodsPageDto.getPageNum());
        page.setOptimizeCountSql(false);
        List<MgtSelectGoodsPageVo> mgtSelectGoodsPageVos = goodsService.pageMgtSelectGoods(page,mgtSelectGoodsPageDto);
        return R.ok(page.setRecords(mgtSelectGoodsPageVos));
    }
}
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/concole/GoodsController.java
@@ -8,6 +8,7 @@
import com.ruoyi.system.api.domain.poji.goods.Goods;
import com.ruoyi.system.api.domain.poji.goods.GoodsFile;
import com.ruoyi.system.api.domain.poji.goods.ShopGoods;
import com.ruoyi.system.api.domain.vo.MerGoodsPriceListVo;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -99,5 +100,17 @@
        return R.ok(goodsList);
    }
    /**
     * @description  通过id获取商品价格列表
     * @author  jqs
     * @date    2023/7/3 10:01
     * @param goodsIds
     * @return  R<List<MerGoodsPriceListVo>>
     */
    @PostMapping("/listGoodsPriceByGoodsId")
    public R<List<MerGoodsPriceListVo>> listGoodsPriceByGoodsId(@RequestBody String goodsIds)
    {
        List<MerGoodsPriceListVo> goodsPriceListVoList = goodsService.listGoodsPriceByGoodsId(goodsIds);
        return R.ok(goodsPriceListVoList);
    }
}
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/goods/GoodsMapper.java
@@ -5,6 +5,7 @@
import com.ruoyi.goods.domain.vo.*;
import com.ruoyi.system.api.domain.poji.goods.Goods;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.system.api.domain.vo.MerGoodsPriceListVo;
import com.ruoyi.system.api.domain.vo.MgtSelectGoodsPageVo;
import org.apache.ibatis.annotations.Param;
@@ -109,4 +110,13 @@
     * @return  List<MgtSelectGoodsPageVo>
     */
    List<MgtSelectGoodsPageVo> pageMgtSelectGoods(Page page, @Param("param")MgtSelectGoodsPageDto mgtSelectGoodsPageDto);
    /**
     * @description  通过id获取商品列表
     * @author  jqs
     * @date    2023/7/3 10:00
     * @param goodsIds
     * @return  List<MerGoodsPriceListVo>
     */
    List<MerGoodsPriceListVo> listGoodsPriceByGoodsId(@Param("goodsIds")String goodsIds);
}
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/goods/GoodsService.java
@@ -5,6 +5,7 @@
import com.ruoyi.goods.domain.vo.*;
import com.ruoyi.system.api.domain.poji.goods.Goods;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.api.domain.vo.MerGoodsPriceListVo;
import com.ruoyi.system.api.domain.vo.MgtSelectGoodsPageVo;
import java.util.List;
@@ -152,4 +153,13 @@
     * @return  List<MgtSelectGoodsPageVo>
     */
    List<MgtSelectGoodsPageVo> pageMgtSelectGoods(Page page,MgtSelectGoodsPageDto mgtSelectGoodsPageDto);
    /**
     * @description  通过id获取商品列表
     * @author  jqs
     * @date    2023/7/3 9:58
     * @param goodsIds
     * @return  List<MerGoodsPriceListVo>
     */
    List<MerGoodsPriceListVo> listGoodsPriceByGoodsId(String goodsIds);
}
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/goods/GoodsServiceImpl.java
@@ -23,6 +23,7 @@
import com.ruoyi.system.api.domain.poji.goods.Goods;
import com.ruoyi.system.api.domain.poji.goods.GoodsFile;
import com.ruoyi.system.api.domain.poji.goods.ShopGoods;
import com.ruoyi.system.api.domain.vo.MerGoodsPriceListVo;
import com.ruoyi.system.api.domain.vo.MgtSelectGoodsPageVo;
import com.ruoyi.system.api.service.RemoteConfigService;
import org.springframework.stereotype.Service;
@@ -466,4 +467,16 @@
    public List<MgtSelectGoodsPageVo> pageMgtSelectGoods(Page page, MgtSelectGoodsPageDto mgtSelectGoodsPageDto){
        return goodsMapper.pageMgtSelectGoods(page, mgtSelectGoodsPageDto);
    }
    /**
     * @description  通过id获取商品列表
     * @author  jqs
     * @date    2023/7/3 9:58
     * @param goodsIds
     * @return  List<MerGoodsPriceListVo>
     */
    @Override
    public List<MerGoodsPriceListVo> listGoodsPriceByGoodsId(String goodsIds){
        return goodsMapper.listGoodsPriceByGoodsId(goodsIds);
    }
}
ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml
@@ -391,13 +391,34 @@
            t_goods
        WHERE del_flag = 0
        <if test="param.goodsType != null and param.goodsType != ''">
            AND tg.goods_type = #{param.goodsType}
            AND goods_type = #{param.goodsType}
        </if>
        <if test="param.goodsName != null and param.goodsName != ''">
            AND tg.goods_name LIKE CONCAT('%',#{param.goodsName},'%')
            AND goods_name LIKE CONCAT('%',#{param.goodsName},'%')
        </if>
        <if test="param.goodsNo != null and param.goodsNo != ''">
            AND tg.goods_no LIKE CONCAT('%',#{param.goodsNo},'%')
            AND goods_no LIKE CONCAT('%',#{param.goodsNo},'%')
        </if>
    </select>
    <select id="listGoodsPriceByGoodsId" resultType="com.ruoyi.system.api.domain.vo.MerGoodsPriceListVo">
        SELECT
        tg.goods_id goodsId,
        tg.goods_name goodsName,
        tg.goods_no goodsNo,
        CASE tg.goods_type
            WHEN 1 THEN "周期"
            WHEN 2 THEN "服务"
            WHEN 3 THEN "体验"
            WHEN 4 THEN "单品"
            END goodsType,
        IFNULL(tsg.sales_price,tg.sales_price) salesPrice,
        tg.sales_price suggestSalesPrice,
        tg.goods_introduction goodsIntroduction,
        tg.goods_nurses goodsNurses
        FROM t_goods tg
        LEFT JOIN t_shop_goods tsg ON tsg.goods_id = tg.goods_id AND tsg.del_flag = 0 AND tsg.shop_id = #{shopId}
        WHERE tg.del_flag = 0 AND FIND_IN_SET(tg.goods_id,#{goodsIds}) &gt; 0
    </select>
</mapper>
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerBirthdayController.java
@@ -2,6 +2,8 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.domain.dto.MerBirthdayEditDto;
import com.ruoyi.member.domain.vo.MerBirthdayEditInfoVo;
import com.ruoyi.member.domain.vo.MerBirthdayGetVo;
import com.ruoyi.member.service.birthday.BirthdayCardService;
import com.ruoyi.system.api.domain.dto.MerBaseDto;
@@ -47,4 +49,31 @@
        MerBirthdayGetVo birthdayGetVo = birthdayCardService.getMerShopBirthdayCard(merBaseDto.getShopId());
        return R.ok(birthdayGetVo);
    }
    @RequestMapping(value = "/getMerShopBCEditInfo", method = RequestMethod.POST)
    @ApiOperation(value = "商户获取生日卡编辑信息")
    public R<MerBirthdayEditInfoVo> getMerShopBCEditInfo(@RequestBody MerBaseDto merBaseDto) {
        Long userId = SecurityUtils.getUserId();
        merBaseDto.setUserId(userId);
        MerBirthdayEditInfoVo shopBCEditInfo = birthdayCardService.getMerShopBCEditInfo(merBaseDto.getShopId());
        return R.ok(shopBCEditInfo);
    }
    @RequestMapping(value = "/editMerBirthdayCard", method = RequestMethod.POST)
    @ApiOperation(value = "商户编辑生日卡")
    public R editMerBirthdayCard(@RequestBody MerBirthdayEditDto merBirthdayEditDto) {
        Long userId = SecurityUtils.getUserId();
        merBirthdayEditDto.setUserId(userId);
        birthdayCardService.editMerBirthdayCard(merBirthdayEditDto);
        return R.ok();
    }
    @RequestMapping(value = "/toggleMerBirthdayCard", method = RequestMethod.POST)
    @ApiOperation(value = "商户开关生日卡")
    public R toggleMerBirthdayCard(@RequestBody MerBirthdayEditDto merBirthdayEditDto) {
        Long userId = SecurityUtils.getUserId();
        merBirthdayEditDto.setUserId(userId);
        birthdayCardService.toggleMerBirthdayCard(merBirthdayEditDto);
        return R.ok();
    }
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerCouponController.java
@@ -3,10 +3,14 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.domain.dto.MerCouponEditDto;
import com.ruoyi.member.domain.dto.MerCouponPageDto;
import com.ruoyi.member.domain.dto.MgtCouponListDto;
import com.ruoyi.member.domain.vo.MerCouponGetVo;
import com.ruoyi.member.domain.vo.MerCouponPageVo;
import com.ruoyi.member.domain.vo.MgtCouponGetVo;
import com.ruoyi.member.domain.vo.MgtCouponSimpleListVo;
import com.ruoyi.member.service.coupon.CouponService;
import com.ruoyi.system.api.domain.dto.MerBaseGetDto;
import com.ruoyi.system.api.domain.dto.MerPageDto;
import com.ruoyi.system.api.domain.dto.MgtBaseGetDto;
import io.swagger.annotations.Api;
@@ -49,7 +53,7 @@
    @RequestMapping(value = "/pageShopMerCoupon", method = RequestMethod.POST)
    @ApiOperation(value = "商户分页获取商户优惠券列表")
    public R<Page<MerCouponPageVo>> pageShopMerCoupon(@RequestBody MerPageDto merPageDto) {
    public R<Page<MerCouponPageVo>> pageShopMerCoupon(@RequestBody MerCouponPageDto merPageDto) {
        Long userId = SecurityUtils.getUserId();
        merPageDto.setUserId(userId);
        Page<MerCouponPageVo> page = new Page<>();
@@ -67,4 +71,29 @@
        MerCouponGetVo couponGetVo = couponService.getMerCouponVo(mgtBaseGetDto.getId());
        return R.ok(couponGetVo);
    }
    @RequestMapping(value = "/editMerCoupon", method = RequestMethod.POST)
    @ApiOperation(value = "商户编辑优惠券")
    public R editMerCoupon(@RequestBody MerCouponEditDto merCouponEditDto) {
        Long userId = SecurityUtils.getUserId();
        merCouponEditDto.setUserId(userId);
        couponService.editMerCoupon(merCouponEditDto);
        return R.ok();
    }
    @RequestMapping(value = "/deleteMerCoupon", method = RequestMethod.POST)
    @ApiOperation(value = "商户删除优惠券")
    public R deleteMerCoupon(@RequestBody MerBaseGetDto merBaseGetDto) {
        Long userId = SecurityUtils.getUserId();
        merBaseGetDto.setUserId(userId);
        couponService.deleteMerCoupon(merBaseGetDto);
        return R.ok();
    }
    @RequestMapping(value = "/listMerCouponSimpleVo", method = RequestMethod.POST)
    @ApiOperation(value = "获取优惠券选择列表")
    public R<List<MgtCouponSimpleListVo>> listMgtCouponSimpleVo(@RequestBody MgtCouponListDto mgtCouponListDto) {
        List<MgtCouponSimpleListVo> mgtCouponSimpleListVoList = couponService.listMgtCouponSimpleVo(mgtCouponListDto);
        return R.ok(mgtCouponSimpleListVoList);
    }
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/business/MerTotalController.java
New file
@@ -0,0 +1,70 @@
package com.ruoyi.member.controller.business;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.domain.vo.MerMemberFixedTotalVo;
import com.ruoyi.member.domain.vo.MerMemberRecommendTotalVo;
import com.ruoyi.member.domain.vo.MerMemberSourceTotalVo;
import com.ruoyi.member.domain.vo.MerMemberTotalVo;
import com.ruoyi.member.service.member.MemberService;
import com.ruoyi.system.api.domain.dto.MerTotalDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
 * @ClassName MerTotalController
 * @Description TODO
 * @Author jqs
 * @Date 2023/7/3 15:58
 * @Version 1.0
 */
@Api(value = "商户端会员统计相关接口", tags = "商户端会员统计相关接口", description = "商户端会员统计相关接口")
@RestController
@RequestMapping("/mer/total")
public class MerTotalController {
    @Resource
    private MemberService memberService;
    @RequestMapping(value = "/getMerMemberTotal", method = RequestMethod.POST)
    @ApiOperation(value = "获取商户会员人数统计")
    public R<MerMemberTotalVo> getMerMemberTotal(@RequestBody MerTotalDto merTotalDto) {
        Long userId = SecurityUtils.getUserId();
        merTotalDto.setUserId(userId);
        MerMemberTotalVo memberTotal = memberService.getMerMemberTotal(merTotalDto);
        return R.ok(memberTotal);
    }
    @RequestMapping(value = "/getMerMemberFixedTotal", method = RequestMethod.POST)
    @ApiOperation(value = "获取商户会员固定统计")
    public R<MerMemberFixedTotalVo> getMerMemberFixedTotal(@RequestBody MerTotalDto merTotalDto) {
        Long userId = SecurityUtils.getUserId();
        merTotalDto.setUserId(userId);
        MerMemberFixedTotalVo merMemberFixedTotal = memberService.getMerMemberFixedTotal(merTotalDto);
        return R.ok(merMemberFixedTotal);
    }
    @RequestMapping(value = "/getMerMemberSourceTotal", method = RequestMethod.POST)
    @ApiOperation(value = "获取商户会员人数统计")
    public R<MerMemberSourceTotalVo> getMerMemberSourceTotal(@RequestBody MerTotalDto merTotalDto) {
        Long userId = SecurityUtils.getUserId();
        merTotalDto.setUserId(userId);
        MerMemberSourceTotalVo memberTotal = memberService.getMerMemberSourceTotal(merTotalDto);
        return R.ok(memberTotal);
    }
    @RequestMapping(value = "/getMerMemberRecommendTotal", method = RequestMethod.POST)
    @ApiOperation(value = "获取商户会员人数统计")
    public R<MerMemberRecommendTotalVo> getMerMemberRecommendTotal(@RequestBody MerTotalDto merTotalDto) {
        Long userId = SecurityUtils.getUserId();
        merTotalDto.setUserId(userId);
        MerMemberRecommendTotalVo memberTotal = memberService.getMerMemberRecommendTotal(merTotalDto);
        return R.ok(memberTotal);
    }
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/MgtCouponController.java
@@ -96,7 +96,7 @@
    }
    @RequestMapping(value = "/getMgtCouponAuditVo", method = RequestMethod.POST)
    @ApiOperation(value = "平台获取优惠券编辑信息")
    @ApiOperation(value = "平台获取优惠券审核信息")
    public R<MgtCouponAuditGetVo> getMgtCouponAuditVo(@RequestBody MgtBaseGetDto mgtBaseGetDto) {
        Long userId = SecurityUtils.getUserId();
        mgtBaseGetDto.setUserId(userId);
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/dto/MerBirthdayEditDto.java
New file
@@ -0,0 +1,27 @@
package com.ruoyi.member.domain.dto;
import com.ruoyi.system.api.domain.dto.MerBaseDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @ClassName MerBirthdayEditDto
 * @Description TODO
 * @Author jqs
 * @Date 2023/7/3 14:03
 * @Version 1.0
 */
@Data
public class MerBirthdayEditDto extends MerBaseDto {
    @ApiModelProperty(value = "生日卡状态1开启2关闭")
    private Integer cardStatus;
    @ApiModelProperty(value = "礼品列表")
    private List<MgtBirthdayGiftDto> mgtBirthdayGiftDtoList;
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/dto/MerCouponEditDto.java
New file
@@ -0,0 +1,75 @@
package com.ruoyi.member.domain.dto;
import com.ruoyi.system.api.domain.dto.MerBaseDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
 * @ClassName MerCouponEditDto
 * @Description TODO
 * @Author jqs
 * @Date 2023/7/3 9:16
 * @Version 1.0
 */
@Data
public class MerCouponEditDto extends MerBaseDto {
    @ApiModelProperty(value = "优惠券id 新增不传")
    private String couponId;
    @ApiModelProperty("优惠券类型1.满减2.折扣3.代金4.商品")
    private Integer couponType;
    @ApiModelProperty("优惠券名称")
    private String couponName;
    @ApiModelProperty(value = "发送类型1.手动领取2.全部用户3.会员用户4非会员用户5自定义")
    private Integer sendType;
    @ApiModelProperty("发送时间类型1立即2定时")
    private Integer sendTimeType;
    @ApiModelProperty("发送时间")
    private Date sendTime;
    @ApiModelProperty(value = "使用范围1.全场2.指定商品")
    private Integer useScope;
    @ApiModelProperty(value = "有效期类型1.时间段2.领取之日起")
    private Integer validTimeType;
    @ApiModelProperty(value = "有效开始时间")
    private Date validStartTime;
    @ApiModelProperty(value = "有效截止时间")
    private Date validEndTime;
    @ApiModelProperty(value = "有效期")
    private Integer validDay;
    @ApiModelProperty(value = "门槛金额")
    private BigDecimal moneyThreshold;
    @ApiModelProperty(value = "折扣金额")
    private BigDecimal discountMoney;
    @ApiModelProperty(value = "折扣百分比")
    private BigDecimal discountPercent;
    @ApiModelProperty(value = "领取限制数量 0为不限")
    private Integer limitNumber;
    @ApiModelProperty(value = "选择商品id集合")
    private List<String> relGoodsIdList;
    @ApiModelProperty(value = "关联用户id集合")
    private List<Long> relUserIdList;
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/dto/MerCouponPageDto.java
New file
@@ -0,0 +1,22 @@
package com.ruoyi.member.domain.dto;
import com.ruoyi.system.api.domain.dto.MerPageDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @ClassName MerCouponPageDto
 * @Description TODO
 * @Author jqs
 * @Date 2023/7/3 14:38
 * @Version 1.0
 */
@Data
public class MerCouponPageDto extends MerPageDto {
    @ApiModelProperty(name = "审核状态1申请中2审核通过3审核拒绝")
    private Integer auditStatus;
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/dto/MgtBirthdayEditDto.java
@@ -16,22 +16,22 @@
@Data
public class MgtBirthdayEditDto extends MgtBaseDto {
    @ApiModelProperty(value = "生日卡id 新增不传")
    private Long cardId;
    @ApiModelProperty(value = "商户id 平台不传")
    private Long shopId;
    @ApiModelProperty(value = "生日卡状态1开启2关闭")
    private Integer cardStatus;
    @ApiModelProperty(value = "适用地区标记1全部2指定")
    @ApiModelProperty(value = "适用地区标记1全部2指定  商户不传")
    private Integer areaFlag;
    @ApiModelProperty(value = "适用地区code集合 多个用,隔开")
    @ApiModelProperty(value = "适用地区code集合 多个用,隔开  商户不传")
    private String designatedArea;
    @ApiModelProperty(value = "适用店铺标记1全部2指定")
    @ApiModelProperty(value = "适用店铺标记1全部2指定  商户不传")
    private Integer shopFlag;
    @ApiModelProperty(value = "适用店铺 多个用,隔开")
    @ApiModelProperty(value = "适用店铺 多个用,隔开  商户不传")
    private String applicableShop;
    @ApiModelProperty(value = "礼品列表")
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerBirthdayEditInfoVo.java
New file
@@ -0,0 +1,31 @@
package com.ruoyi.member.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @ClassName MerBirthdayEditInfoVo
 * @Description TODO
 * @Author jqs
 * @Date 2023/7/3 10:56
 * @Version 1.0
 */
@Data
public class MerBirthdayEditInfoVo {
    @ApiModelProperty(value = "生日卡id")
    private Long cardId;
    @ApiModelProperty(value = "生日卡状态1开启2关闭")
    private Integer cardStatus;
    @ApiModelProperty(value = "礼品列表")
    private List<MgtBirthdayGiftVo> mgtBirthdayGiftVoList;
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerBirthdayGetVo.java
@@ -13,6 +13,9 @@
@Data
public class MerBirthdayGetVo {
    @ApiModelProperty(value = "生日卡状态1开启2关闭")
    private Integer cardStatus;
    @ApiModelProperty(value = "礼品描述")
    private String giftDesc;
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerCouponGetVo.java
@@ -1,6 +1,7 @@
package com.ruoyi.member.domain.vo;
import com.ruoyi.system.api.domain.dto.MerBaseDto;
import com.ruoyi.system.api.domain.vo.MerGoodsPriceListVo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -60,14 +61,12 @@
    @ApiModelProperty(value = "折扣百分比")
    private BigDecimal discountPercent;
    @ApiModelProperty(value = "领取限制数量 0为不限")
    private Integer limitNumber;
    @ApiModelProperty(value = "选择商品集合")
    private List<MgtCouponGoodsListVo> relGoodsList;
    private List<MerGoodsPriceListVo> relGoodsList;
    @ApiModelProperty(value = "关联类型1.用户管理筛选2.活动管理筛选")
    private Integer relationType;
    @ApiModelProperty(value = "关联活动id")
    private String relationActivityId;
    @ApiModelProperty(value = "关联用户集合")
    private List<MgtCouponMemberListVo> relUserList;
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerCouponGoodsListVo.java
New file
@@ -0,0 +1,43 @@
package com.ruoyi.member.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @ClassName MerCouponGoodsListVo
 * @Description TODO
 * @Author jqs
 * @Date 2023/7/3 9:29
 * @Version 1.0
 */
@Data
public class MerCouponGoodsListVo {
    @ApiModelProperty(value = "商品id")
    private String goodsId;
    @ApiModelProperty(value = "商品名称")
    private String goodsName;
    @ApiModelProperty(value = "商品编码")
    private String goodsNo;
    @ApiModelProperty(value = "商品类型1周期2服务3体验4单品")
    private String goodsType;
    @ApiModelProperty(value = "商品售价")
    private BigDecimal salesPrice;
    @ApiModelProperty(value = "商品建议售价")
    private BigDecimal suggestSalesPrice;;
    @ApiModelProperty(value = "商品简介")
    private String goodsIntroduction;
    @ApiModelProperty(value = "商品调理问题")
    private String goodsNurses;
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerCouponPageVo.java
@@ -68,4 +68,6 @@
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    @ApiModelProperty("拒绝理由")
    private String auditReason;
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerMemberFixedTotalVo.java
New file
@@ -0,0 +1,44 @@
package com.ruoyi.member.domain.vo;
import com.ruoyi.system.api.domain.vo.MgtMapIntTotalVo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @ClassName MerMemberFixedTotalVo
 * @Description TODO
 * @Author jqs
 * @Date 2023/7/3 16:31
 * @Version 1.0
 */
@Data
public class MerMemberFixedTotalVo {
    @ApiModelProperty(value = "男人")
    private Integer manTotal;
    @ApiModelProperty(value = "女人")
    private Integer womenTotal;
    @ApiModelProperty(value = "会员年龄key")
    private String[] ageKey;
    @ApiModelProperty(value = "会员年龄value")
    private Integer[] ageValue;
    @ApiModelProperty(value = "会员调理")
    private List<MgtMapIntTotalVo> nurseTotalVos;
    @ApiModelProperty(value = "商品类型")
    private List<MgtMapIntTotalVo> goodsTypeTotalVos;
    @ApiModelProperty(value = "活跃度")
    private List<MgtMapIntTotalVo> activenessList;
    @ApiModelProperty(value = "消费排行")
    private List<MgtMapIntTotalVo> memberPayList;
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerMemberRecommendTotalVo.java
New file
@@ -0,0 +1,23 @@
package com.ruoyi.member.domain.vo;
import com.ruoyi.system.api.domain.vo.MgtMapIntTotalVo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @ClassName MerMemberRecommendTotalVo
 * @Description TODO
 * @Author jqs
 * @Date 2023/7/3 16:36
 * @Version 1.0
 */
@Data
public class MerMemberRecommendTotalVo {
    @ApiModelProperty(value = "推荐榜单")
    private List<MgtMapIntTotalVo> recommendList;
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerMemberSourceTotalVo.java
New file
@@ -0,0 +1,21 @@
package com.ruoyi.member.domain.vo;
import com.ruoyi.system.api.domain.vo.MgtMapIntTotalVo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @ClassName MerMemberSourceTotalVo
 * @Description TODO
 * @Author jqs
 * @Date 2023/7/3 16:34
 * @Version 1.0
 */
@Data
public class MerMemberSourceTotalVo {
    @ApiModelProperty(value = "来源渠道")
    private List<MgtMapIntTotalVo> customerSourceList;
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MerMemberTotalVo.java
New file
@@ -0,0 +1,39 @@
package com.ruoyi.member.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @ClassName MerMemberTotalVo
 * @Description TODO
 * @Author jqs
 * @Date 2023/7/3 16:23
 * @Version 1.0
 */
@Data
public class MerMemberTotalVo {
    @ApiModelProperty(value = "总会员")
    private Integer memberTotal;
    @ApiModelProperty(value = "线上来源")
    private Integer onlineTotal;
    @ApiModelProperty(value = "线下来源")
    private Integer offlineTotal;
    @ApiModelProperty(value = "转介绍")
    private Integer introduceTotal;
    @ApiModelProperty(value = "周期会员")
    private Integer cycleTotal;
    @ApiModelProperty(value = "体验会员")
    private Integer experienceTotal;
    @ApiModelProperty(value = "服务会员")
    private Integer serviceTotal;
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/coupon/CouponMapper.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.member.domain.dto.MerCouponPageDto;
import com.ruoyi.member.domain.dto.MgtCouponAuditPageDto;
import com.ruoyi.member.domain.dto.MgtCouponListDto;
import com.ruoyi.member.domain.dto.MgtCouponPageDto;
@@ -77,12 +78,12 @@
    List<MerCouponPageVo> pagePlatformMerCoupon(Page page, @Param("param")MerPageDto merPageDto);
    /**
     * @description  平台获取优惠券列表
     * @description  获取商户优惠券列表
     * @author  jqs
     * @date    2023/6/30 16:53
     * @param page
     * @param merPageDto
     * @return  List<MerCouponPageVo>
     */
    List<MerCouponPageVo> pageShopMerCoupon(Page page, @Param("param")MerPageDto merPageDto);
    List<MerCouponPageVo> pageShopMerCoupon(Page page, @Param("param") MerCouponPageDto merPageDto);
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/member/MemberMapper.java
@@ -6,10 +6,7 @@
import com.ruoyi.member.domain.dto.MerMemberPageDto;
import com.ruoyi.member.domain.dto.MgtMemberPageDto;
import com.ruoyi.member.domain.vo.*;
import com.ruoyi.system.api.domain.dto.MgtActivityAgeDto;
import com.ruoyi.system.api.domain.dto.MgtBasePlatformDto;
import com.ruoyi.system.api.domain.dto.MgtBaseShopDto;
import com.ruoyi.system.api.domain.dto.MgtUserIdByKeywordDto;
import com.ruoyi.system.api.domain.dto.*;
import com.ruoyi.system.api.domain.poji.member.Member;
import com.ruoyi.system.api.domain.vo.MgtMapIntTotalVo;
import com.ruoyi.system.api.domain.vo.MgtPlTotalMemberTotalVo;
@@ -96,7 +93,7 @@
     * @param sendType
     * @return  List<Long>
     */
    List<Long> listIdBySendType(@Param("sendType")Integer sendType);
    List<Long> listIdBySendType(@Param("sendType")Integer sendType,@Param("shopId")Long shopId);
    /**
     * @description  通过ids获取用户简易返回
@@ -212,6 +209,7 @@
    List<Long> listUserIdByAge(@Param("param")MgtActivityAgeDto mgtActivityAgeDto);
    /**
     * @description  会员人数统计
     * @author  jqs
@@ -294,6 +292,79 @@
     * @return  List<Long>
     */
    List<Long> listUserIdByShopId(@Param("shopIdList")List<Long> shopIdList);
    /**
     * @description
     * @author  jqs
     * @date    2023/7/3 18:29
     * @param merTotalDto
     * @return  MerMemberTotalVo
     */
    MerMemberTotalVo getMerMemberTotal(@Param("param")MerTotalDto merTotalDto);
    /**
     * @description  会员年龄分布统计
     * @author  jqs
     * @date    2023/6/19 15:26
     * @param
     * @return  MgtTotalMemberTotalVo
     */
    MgtAgeTotalVo getMerMemberTotalAge(@Param("param") MerTotalDto merTotalDto);
    /**
     * @description  会员调理问题人数统计
     * @author  jqs
     * @date    2023/6/19 15:26
     * @param
     * @return  MgtTotalMemberTotalVo
     */
    List<MgtMapIntTotalVo> getMerMemberTotalNurse(@Param("param") MerTotalDto merTotalDto);
    /**
     * @description  会员商品类型人数统计
     * @author  jqs
     * @date    2023/6/19 15:26
     * @param
     * @return  MgtTotalMemberTotalVo
     */
    List<MgtMapIntTotalVo> getMerMemberTotalGoodsType(@Param("param") MerTotalDto merTotalDto);
    /**
     * @description 会员活跃度统计
     * @param merTotalDto
     * @return Integer
     * @author jqs34
     * @date 2023/6/19 21:24
     */
    Integer getMerMemberTotalActiveness(@Param("param") MerTotalDto merTotalDto);
    /**
     * @description  会员消费次数排名
     * @author  jqs
     * @date    2023/6/19 15:26
     * @param
     * @return  MgtTotalMemberTotalVo
     */
    List<MgtMapIntTotalVo> getMerMemberPayRank(@Param("param") MerTotalDto merTotalDto);
    /**
     * @description  会员来源排名计
     * @author  jqs
     * @date    2023/6/19 15:26
     * @param
     * @return  MgtTotalMemberTotalVo
     */
    List<MgtMapIntTotalVo> getMerMemberCustomerSourceRank(@Param("param") MerTotalDto merTotalDto);
    /**
     * @description  会员推荐排名
     * @author  jqs
     * @date    2023/7/3 19:16
     * @param merTotalDto
     * @return  List<MgtMapIntTotalVo>
     */
    List<MgtMapIntTotalVo> getMerMemberRecommendRank(@Param("param") MerTotalDto merTotalDto);
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/birthday/BirthdayCardService.java
@@ -1,9 +1,11 @@
package com.ruoyi.member.service.birthday;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.member.domain.dto.MerBirthdayEditDto;
import com.ruoyi.member.domain.dto.MgtBirthdayEditDto;
import com.ruoyi.member.domain.dto.MgtBirthdayGetDto;
import com.ruoyi.member.domain.pojo.birthday.BirthdayCard;
import com.ruoyi.member.domain.vo.MerBirthdayEditInfoVo;
import com.ruoyi.member.domain.vo.MerBirthdayGetVo;
import com.ruoyi.member.domain.vo.MgtBirthdayGetVo;
@@ -52,4 +54,31 @@
     * @return  MerBirthdayGetVo
     */
    MerBirthdayGetVo getMerShopBirthdayCard(Long shopId);
    /**
     * @description  获取商户生日卡详情
     * @author  jqs
     * @date    2023/7/3 10:58
     * @param shopId
     * @return  MerBirthdayGetVo
     */
    MerBirthdayEditInfoVo getMerShopBCEditInfo(Long shopId);
    /**
     * @description  商户编辑生日卡
     * @author  jqs
     * @date    2023/7/3 14:15
     * @param merBirthdayEditDto
     * @return  void
     */
    void editMerBirthdayCard(MerBirthdayEditDto merBirthdayEditDto);
    /**
     * @description  开关生日卡成功
     * @author  jqs
     * @date    2023/7/3 14:27
     * @param merBirthdayEditDto
     * @return  void
     */
    void toggleMerBirthdayCard(MerBirthdayEditDto merBirthdayEditDto);
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/coupon/CouponService.java
@@ -5,6 +5,7 @@
import com.ruoyi.member.domain.pojo.coupon.Coupon;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.member.domain.vo.*;
import com.ruoyi.system.api.domain.dto.MerBaseGetDto;
import com.ruoyi.system.api.domain.dto.MerPageDto;
import com.ruoyi.system.api.domain.dto.MgtBaseGetDto;
@@ -124,12 +125,30 @@
    List<MerCouponPageVo> pagePlatformMerCoupon(Page page, MerPageDto merPageDto);
    /**
     * @description  平台获取优惠券列表
     * @description  获取商户优惠券列表
     * @author  jqs
     * @date    2023/6/30 16:53
     * @param page
     * @param merPageDto
     * @return  List<MerCouponPageVo>
     */
    List<MerCouponPageVo> pageShopMerCoupon(Page page, MerPageDto merPageDto);
    List<MerCouponPageVo> pageShopMerCoupon(Page page, MerCouponPageDto merPageDto);
    /**
     * @description  商户编辑优惠券
     * @author  jqs
     * @date    2023/7/3 9:21
     * @param merCouponEditDto
     * @return  void
     */
    void editMerCoupon(MerCouponEditDto merCouponEditDto);
    /**
     * @description  商户删除优惠券
     * @author  jqs
     * @date    2023/7/3 15:04
     * @param merBaseGetDto
     * @return  void
     */
    void deleteMerCoupon(MerBaseGetDto merBaseGetDto);
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/birthday/BirthdayCardServiceImpl.java
@@ -2,11 +2,13 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.member.domain.dto.MerBirthdayEditDto;
import com.ruoyi.member.domain.dto.MgtBirthdayEditDto;
import com.ruoyi.member.domain.dto.MgtBirthdayGetDto;
import com.ruoyi.member.domain.dto.MgtBirthdayGiftDto;
import com.ruoyi.member.domain.pojo.birthday.BirthdayCard;
import com.ruoyi.member.domain.pojo.birthday.BirthdayGift;
import com.ruoyi.member.domain.vo.MerBirthdayEditInfoVo;
import com.ruoyi.member.domain.vo.MerBirthdayGetVo;
import com.ruoyi.member.domain.vo.MgtBirthdayGetVo;
import com.ruoyi.member.domain.vo.MgtBirthdayGiftVo;
@@ -47,57 +49,83 @@
     */
    @Override
    public void editMgtBirthdayCard(MgtBirthdayEditDto mgtBirthdayEditDto){
        if(mgtBirthdayEditDto.getCardId()!=null){
            BirthdayCard birthdayCardOld = this.getById(mgtBirthdayEditDto.getCardId());
        // 创建查询包装器
        LambdaQueryWrapper<BirthdayCard> queryWrapper = new LambdaQueryWrapper<>();
        // 添加查询条件:删除标志为0
        queryWrapper.eq(BirthdayCard::getDelFlag,0);
        // 如果店铺ID不为空,则添加查询条件:店铺ID
        if(mgtBirthdayEditDto.getShopId()!=null){
            queryWrapper.eq(BirthdayCard::getShopId,mgtBirthdayEditDto.getShopId());
        }else{
            // 否则,添加查询条件:店铺ID为0
            queryWrapper.eq(BirthdayCard::getShopId,0);
        }
        // 获取查询结果
        BirthdayCard birthdayCardOld = this.getOne(queryWrapper,false);
        // 如果查询结果不为空,则进行更新操作
        if (birthdayCardOld!=null) {
            // 设置删除标志为1
            birthdayCardOld.setDelFlag(1);
            // 保存或更新数据
            this.saveOrUpdate(birthdayCardOld);
            // 删除旧的生日卡的礼物
            birthdayGiftService.deleteByCardId(birthdayCardOld.getCardId());
        }
        // 创建新的生日卡
        BirthdayCard birthdayCard = new BirthdayCard();
        birthdayCard.setDelFlag(0);
        birthdayCard.setShopId(0L);
        birthdayCard.setCardStatus(mgtBirthdayEditDto.getCardStatus());
        // 根据卡状态设置开启或关闭时间
        if(mgtBirthdayEditDto.getCardStatus()==1){
            birthdayCard.setOpenTime(new Date());
        }else{
            birthdayCard.setCloseTime(new Date());
        }
        // 设置创建时间
        birthdayCard.setCreateTime(new Date());
        birthdayCard.setAreaFlag(mgtBirthdayEditDto.getAreaFlag());
        if(mgtBirthdayEditDto.getAreaFlag()==2){
            birthdayCard.setDesignatedArea(mgtBirthdayEditDto.getDesignatedArea());
        }else{
            birthdayCard.setDesignatedArea(null);
        // 如果店铺ID不为空,则进行相关设置
        if(mgtBirthdayEditDto.getShopId()!=null){
            birthdayCard.setAreaFlag(mgtBirthdayEditDto.getAreaFlag());
            if(mgtBirthdayEditDto.getAreaFlag()==2){
                birthdayCard.setDesignatedArea(mgtBirthdayEditDto.getDesignatedArea());
            }else{
                birthdayCard.setDesignatedArea(null);
            }
            birthdayCard.setShopFlag(mgtBirthdayEditDto.getShopFlag());
            if(mgtBirthdayEditDto.getShopFlag()==2){
                birthdayCard.setApplicableShop(mgtBirthdayEditDto.getApplicableShop());
            }else{
                birthdayCard.setApplicableShop(null);
            }
        }
        birthdayCard.setShopFlag(mgtBirthdayEditDto.getShopFlag());
        if(mgtBirthdayEditDto.getShopFlag()==2){
            birthdayCard.setApplicableShop(mgtBirthdayEditDto.getApplicableShop());
        }else{
            birthdayCard.setApplicableShop(null);
        }
        // 设置创建用户ID
        birthdayCard.setCreateUserId(mgtBirthdayEditDto.getUserId());
        // 保存或更新数据
        this.saveOrUpdate(birthdayCard);
        // 获取生日礼物列表
        List<MgtBirthdayGiftDto> mgtBirthdayGiftDtoList = mgtBirthdayEditDto.getMgtBirthdayGiftDtoList();
        List<BirthdayGift> birthdayGiftList = new ArrayList<>();
        if(!mgtBirthdayGiftDtoList.isEmpty()){
            mgtBirthdayGiftDtoList.forEach( dto->{
                        BirthdayGift birthdayGift = new BirthdayGift();
                        birthdayGift.setDelFlag(0);
                        birthdayGift.setCardId(birthdayCard.getCardId());
                        birthdayGift.setGiftType(dto.getGiftType());
                        birthdayGift.setCouponId(dto.getCouponId());
                        birthdayGift.setCouponName(dto.getCouponName());
                        birthdayGift.setCouponNumber(dto.getCouponNumber());
                        birthdayGift.setGoodsId(dto.getGoodsId());
                        birthdayGift.setGoodsName(dto.getGoodsName());
                        birthdayGift.setGoodsNumber(dto.getGoodsNumber());
                        birthdayGift.setGiftName(dto.getGiftName());
                        birthdayGift.setGiftNumber(dto.getGiftNumber());
                        birthdayGift.setMoney(dto.getMoney());
                        birthdayGift.setWinningProbability(dto.getWinningProbability());
                        birthdayGiftList.add(birthdayGift);
                    }
            );
        // 如果生日礼物列表不为空,则进行相关设置
        if(!mgtBirthdayGiftDtoList.isEmpty()) {
            mgtBirthdayGiftDtoList.forEach(dto -> {
                BirthdayGift birthdayGift = new BirthdayGift();
                birthdayGift.setDelFlag(0);
                birthdayGift.setCardId(birthdayCard.getCardId());
                birthdayGift.setGiftType(dto.getGiftType());
                birthdayGift.setCouponId(dto.getCouponId());
                birthdayGift.setCouponName(dto.getCouponName());
                birthdayGift.setCouponNumber(dto.getCouponNumber());
                birthdayGift.setGoodsId(dto.getGoodsId());
                birthdayGift.setGoodsName(dto.getGoodsName());
                birthdayGift.setGoodsNumber(dto.getGoodsNumber());
                birthdayGift.setGiftName(dto.getGiftName());
                birthdayGift.setGiftNumber(dto.getGiftNumber());
                birthdayGift.setMoney(dto.getMoney());
                birthdayGift.setWinningProbability(dto.getWinningProbability());
                birthdayGiftList.add(birthdayGift);
            });
            // 批量保存生日礼物
            birthdayGiftService.saveBatch(birthdayGiftList);
        }
    }
@@ -185,13 +213,15 @@
                giftDesc = giftSj.toString();
                birthdayGetVo.setGiftDesc(giftDesc);
            }
        }else{
            birthdayGetVo.setCardStatus(2);
        }
        return birthdayGetVo;
    }
    /**
     * @description  获取平台生日卡
     * @description  获取商户生日卡
     * @author  jqs
     * @date    2023/7/1 15:25
     * @param
@@ -242,7 +272,126 @@
                giftDesc = giftSj.toString();
                birthdayGetVo.setGiftDesc(giftDesc);
            }
            birthdayGetVo.setCardStatus(birthdayCard.getCardStatus());
        }else{
            birthdayGetVo.setCardStatus(2);
        }
        return birthdayGetVo;
    }
    /**
     * @description  获取商户生日卡详情
     * @author  jqs
     * @date    2023/7/3 10:58
     * @param shopId
     * @return  MerBirthdayGetVo
     */
    @Override
    public MerBirthdayEditInfoVo getMerShopBCEditInfo(Long shopId){
        MerBirthdayEditInfoVo merBirthdayEditInfoVo = new MerBirthdayEditInfoVo();
        LambdaQueryWrapper<BirthdayCard> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(BirthdayCard::getDelFlag,0);
        queryWrapper.eq(BirthdayCard::getShopId,shopId);
        BirthdayCard birthdayCard = this.getOne(queryWrapper,false);
        if(birthdayCard!=null){
            merBirthdayEditInfoVo.setCardId(birthdayCard.getCardId());
            merBirthdayEditInfoVo.setCardStatus(birthdayCard.getCardStatus());
            List<MgtBirthdayGiftVo> mgtBirthdayGiftVoList = birthdayGiftService.listGiftVoByCardId(birthdayCard.getCardId());
            merBirthdayEditInfoVo.setMgtBirthdayGiftVoList(mgtBirthdayGiftVoList);
        }
        return merBirthdayEditInfoVo;
    }
    /**
     * @description  商户编辑生日卡
     * @author  jqs
     * @date    2023/7/3 14:15
     * @param merBirthdayEditDto
     * @return  void
     */
    @Override
    public void editMerBirthdayCard(MerBirthdayEditDto merBirthdayEditDto){
        // 创建查询包装器
        LambdaQueryWrapper<BirthdayCard> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(BirthdayCard::getDelFlag,0);
        queryWrapper.eq(BirthdayCard::getShopId,merBirthdayEditDto.getShopId());
        // 获取查询结果
        BirthdayCard birthdayCardOld = this.getOne(queryWrapper,false);
        // 如果查询结果不为空,则进行更新操作
        if (birthdayCardOld!=null) {
            // 设置删除标志为1
            birthdayCardOld.setDelFlag(1);
            // 保存或更新数据
            this.saveOrUpdate(birthdayCardOld);
            // 删除旧的生日卡的礼物
            birthdayGiftService.deleteByCardId(birthdayCardOld.getCardId());
        }
        // 创建新的生日卡
        BirthdayCard birthdayCard = new BirthdayCard();
        birthdayCard.setDelFlag(0);
        birthdayCard.setShopId(0L);
        birthdayCard.setCardStatus(merBirthdayEditDto.getCardStatus());
        // 根据卡状态设置开启或关闭时间
        if(merBirthdayEditDto.getCardStatus()==1){
            birthdayCard.setOpenTime(new Date());
        }else{
            birthdayCard.setCloseTime(new Date());
        }
        // 设置创建时间
        birthdayCard.setCreateTime(new Date());
        // 设置创建用户ID
        birthdayCard.setCreateUserId(merBirthdayEditDto.getUserId());
        // 保存或更新数据
        this.saveOrUpdate(birthdayCard);
        // 获取生日礼物列表
        List<MgtBirthdayGiftDto> mgtBirthdayGiftDtoList = merBirthdayEditDto.getMgtBirthdayGiftDtoList();
        List<BirthdayGift> birthdayGiftList = new ArrayList<>();
        // 如果生日礼物列表不为空,则进行相关设置
        if(!mgtBirthdayGiftDtoList.isEmpty()) {
            mgtBirthdayGiftDtoList.forEach(dto -> {
                BirthdayGift birthdayGift = new BirthdayGift();
                birthdayGift.setDelFlag(0);
                birthdayGift.setCardId(birthdayCard.getCardId());
                birthdayGift.setGiftType(dto.getGiftType());
                birthdayGift.setCouponId(dto.getCouponId());
                birthdayGift.setCouponName(dto.getCouponName());
                birthdayGift.setCouponNumber(dto.getCouponNumber());
                birthdayGift.setGoodsId(dto.getGoodsId());
                birthdayGift.setGoodsName(dto.getGoodsName());
                birthdayGift.setGoodsNumber(dto.getGoodsNumber());
                birthdayGift.setGiftName(dto.getGiftName());
                birthdayGift.setGiftNumber(dto.getGiftNumber());
                birthdayGift.setMoney(dto.getMoney());
                birthdayGift.setWinningProbability(dto.getWinningProbability());
                birthdayGiftList.add(birthdayGift);
            });
            // 批量保存生日礼物
            birthdayGiftService.saveBatch(birthdayGiftList);
        }
    }
    /**
     * @description  开关生日卡成功
     * @author  jqs
     * @date    2023/7/3 14:27
     * @param merBirthdayEditDto
     * @return  void
     */
    @Override
    public void toggleMerBirthdayCard(MerBirthdayEditDto merBirthdayEditDto){
        // 创建查询包装器
        LambdaQueryWrapper<BirthdayCard> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(BirthdayCard::getDelFlag,0);
        queryWrapper.eq(BirthdayCard::getShopId,merBirthdayEditDto.getShopId());
        // 获取查询结果
        BirthdayCard birthdayCard = this.getOne(queryWrapper,false);
        if(birthdayCard==null){
            birthdayCard = new BirthdayCard();
            birthdayCard.setDelFlag(0);
            birthdayCard.setCreateTime(new Date());
            birthdayCard.setCreateUserId(merBirthdayEditDto.getUserId());
        }
        birthdayCard.setCardStatus(merBirthdayEditDto.getCardStatus());
        this.saveOrUpdate(birthdayCard);
    }
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/coupon/CouponServiceImpl.java
@@ -13,6 +13,7 @@
import com.ruoyi.member.domain.pojo.coupon.CouponRelGoods;
import com.ruoyi.member.domain.pojo.coupon.CouponRelUser;
import com.ruoyi.member.domain.pojo.coupon.CouponTotal;
import com.ruoyi.system.api.domain.dto.MerBaseGetDto;
import com.ruoyi.system.api.domain.dto.MerPageDto;
import com.ruoyi.system.api.domain.poji.member.MemberCoupon;
import com.ruoyi.member.domain.vo.*;
@@ -26,6 +27,7 @@
import com.ruoyi.system.api.constant.AppErrorConstant;
import com.ruoyi.system.api.domain.dto.MgtBaseGetDto;
import com.ruoyi.system.api.domain.poji.goods.Goods;
import com.ruoyi.system.api.domain.vo.MerGoodsPriceListVo;
import com.ruoyi.system.api.service.RemoteActivityService;
import com.ruoyi.system.api.service.RemoteGoodsService;
import org.springframework.scheduling.annotation.Async;
@@ -208,37 +210,9 @@
            String relGoodsIds = coupon.getRelGoodsIds();
            if(StringUtils.isNotBlank(relGoodsIds)){
                //获取指定商品列表
                List<Goods> goodsList = remoteGoodsService.listGoodsByGoodsId(relGoodsIds).getData();
                List<MerGoodsPriceListVo> goodsList = remoteGoodsService.listGoodsPriceByGoodsId(relGoodsIds).getData();
                if(!goodsList.isEmpty()){
                    //转换为返回对象
                    List<MgtCouponGoodsListVo> relGoodsList = new ArrayList<>();
                    MgtCouponGoodsListVo mgtCouponGoodsListVo;
                    for(Goods goods : goodsList){
                        mgtCouponGoodsListVo = new MgtCouponGoodsListVo();
                        mgtCouponGoodsListVo.setGoodsId(goods.getGoodsId());
                        mgtCouponGoodsListVo.setGoodsName(goods.getGoodsName());
                        mgtCouponGoodsListVo.setGoodsNo(goods.getGoodsNo());
                        //商品类型1周期2服务3体验4单品
                        switch (goods.getGoodsType()){
                            case 1:
                                mgtCouponGoodsListVo.setGoodsType("周期");
                                break;
                            case 2:
                                mgtCouponGoodsListVo.setGoodsType("服务");
                                break;
                            case 3:
                                mgtCouponGoodsListVo.setGoodsType("体验");
                                break;
                            case 4:
                                mgtCouponGoodsListVo.setGoodsType("单品");
                                break;
                            default:
                                break;
                        }
                        mgtCouponGoodsListVo.setSalesPrice(goods.getSalesPrice());
                        relGoodsList.add(mgtCouponGoodsListVo);
                    }
                    merCouponGetVo.setRelGoodsList(relGoodsList);
                    merCouponGetVo.setRelGoodsList(goodsList);
                }
            }
        }
@@ -359,8 +333,12 @@
        Date nowTime = new Date();
        Integer sendType = coupon.getSendType();
        List<Long> userIdList = new ArrayList<>();
        Long shopId = null;
        if(coupon.getCouponFrom()==2 && sendType==3){
            shopId = coupon.getShopId();
        }
        if(sendType >= 2 && sendType <= 4){
            userIdList = memberService.listIdBySendType(sendType);
            userIdList = memberService.listIdBySendType(sendType,shopId);
        }else if(sendType == 5){
            //关联类型1.用户管理筛选2.活动管理筛选
            if(coupon.getRelationType()==2){
@@ -691,7 +669,7 @@
    }
    /**
     * @description  平台获取优惠券列表
     * @description  获取商户优惠券列表
     * @author  jqs
     * @date    2023/6/30 16:53
     * @param page
@@ -699,7 +677,7 @@
     * @return  List<MerCouponPageVo>
     */
    @Override
    public List<MerCouponPageVo> pageShopMerCoupon(Page page, MerPageDto merPageDto){
    public List<MerCouponPageVo> pageShopMerCoupon(Page page, MerCouponPageDto merPageDto){
        List<MerCouponPageVo> couponPageVoList = couponMapper.pageShopMerCoupon(page, merPageDto);
        //处理使用限制和有效期
        if(couponPageVoList!=null&&!couponPageVoList.isEmpty()){
@@ -747,4 +725,111 @@
        }
        return couponPageVoList;
    }
    /**
     * @description  商户编辑优惠券
     * @author  jqs
     * @date    2023/7/3 9:21
     * @param merCouponEditDto
     * @return  void
     */
    @Override
    public void editMerCoupon(MerCouponEditDto merCouponEditDto){
        //编辑优惠券
        Coupon coupon;
        CouponTotal couponTotal;
        if(StringUtils.isNotBlank(merCouponEditDto.getCouponId())){
            coupon = this.getById(merCouponEditDto.getCouponId());
            if(coupon.getAuditStatus()!=3){
                throw new ServiceException(AppErrorConstant.COUPON_AUDIT_EDIT);
            }
            couponRelUserService.deleteCouponRelByCouponId(coupon.getCouponId());
            couponRelGoodsService.deleteCouponRelByCouponId(coupon.getCouponId());
            coupon.setCouponStatus(1);
        }else{
            coupon = new Coupon();
            String couponId = IdUtils.simpleUUID();
            coupon.setCouponId(couponId);
            coupon.setDelFlag(0);
            coupon.setShopId(merCouponEditDto.getShopId());
            coupon.setCouponStatus(1);
            coupon.setCreateTime(new Date());
            coupon.setCreateUserId(merCouponEditDto.getUserId());
            coupon.setCouponFrom(2);
            //创建优惠券统计
            couponTotal = new CouponTotal();
            couponTotal.setCouponId(couponId);
            couponTotal.setSendCount(0);
            couponTotal.setSendUserCount(0);
            couponTotalService.save(couponTotal);
        }
        //优惠券赋值
        coupon.setAuditStatus(1);
        coupon.setCouponType(merCouponEditDto.getCouponType());
        coupon.setCouponName(merCouponEditDto.getCouponName());
        coupon.setSendType(merCouponEditDto.getSendType());
        coupon.setSendTimeType(merCouponEditDto.getSendTimeType());
        coupon.setSendTime(merCouponEditDto.getSendTime());
        coupon.setMoneyThreshold(merCouponEditDto.getMoneyThreshold());
        coupon.setDiscountMoney(merCouponEditDto.getDiscountMoney());
        coupon.setDiscountPercent(merCouponEditDto.getDiscountPercent());
        coupon.setUseScope(merCouponEditDto.getUseScope());
        coupon.setValidTimeType(merCouponEditDto.getValidTimeType());
        coupon.setValidStartTime(merCouponEditDto.getValidStartTime());
        coupon.setValidEndTime(merCouponEditDto.getValidEndTime());
        coupon.setValidDay(merCouponEditDto.getValidDay());
        coupon.setUpdateTime(new Date());
        coupon.setUpdateUserId(merCouponEditDto.getUserId());
        coupon.setRelationType(1);
        //判断是否指定商品
        if(coupon.getUseScope()==2&&!merCouponEditDto.getRelGoodsIdList().isEmpty()){
            List<String> relGoodsIdList = merCouponEditDto.getRelGoodsIdList();
            List<CouponRelGoods> couponRelGoodsList = relGoodsIdList.stream()
                    .map(str -> {
                        CouponRelGoods couponRelGoods = new CouponRelGoods();
                        couponRelGoods.setDelFlag(0);
                        couponRelGoods.setCouponId(coupon.getCouponId());
                        couponRelGoods.setGoodsId(str);
                        return couponRelGoods;
                    })
                    .collect(Collectors.toList());
            couponRelGoodsService.saveBatch(couponRelGoodsList);
            String relGoodsIds = relGoodsIdList.stream().collect(Collectors.joining(","));
            coupon.setRelGoodsIds(relGoodsIds);
        }
        //判断是否指定用户
        List<Long> relUserIdList = null;
        if(coupon.getSendType()==5&&coupon.getRelationType()==1&&!merCouponEditDto.getRelUserIdList().isEmpty()){
            relUserIdList = merCouponEditDto.getRelUserIdList();
            List<CouponRelUser> couponRelUserList = relUserIdList.stream()
                    .map(str -> {
                        CouponRelUser couponRelUser = new CouponRelUser();
                        couponRelUser.setDelFlag(0);
                        couponRelUser.setCouponId(coupon.getCouponId());
                        couponRelUser.setUserId(str);
                        return couponRelUser;
                    })
                    .collect(Collectors.toList());
            couponRelUserService.saveBatch(couponRelUserList);
        }
        this.saveOrUpdate(coupon);
    }
    /**
     * @description  商户删除优惠券
     * @author  jqs
     * @date    2023/7/3 15:04
     * @param merBaseGetDto
     * @return  void
     */
    @Override
    public void deleteMerCoupon(MerBaseGetDto merBaseGetDto){
        Coupon coupon = this.getById(merBaseGetDto.getId());
        coupon.setCouponStatus(-1);
        coupon.setDelFlag(1);
        coupon.setUpdateUserId(merBaseGetDto.getUserId());
        coupon.setUpdateTime(new Date());
        this.saveOrUpdate(coupon);
    }
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java
@@ -1002,9 +1002,9 @@
     * @date 2023/6/13 17:53
     */
    @Override
    public List<Long> listIdBySendType(Integer sendType) {
    public List<Long> listIdBySendType(Integer sendType,Long shopId) {
        //1.手动领取2.全部用户3.会员用户4非会员用户5自定义
        return memberMapper.listIdBySendType(sendType);
        return memberMapper.listIdBySendType(sendType,shopId);
    }
    /**
@@ -1360,4 +1360,130 @@
        }
        memberTotalService.saveOrUpdate(memberTotal);
    }
    /**
     * @description  商户获取会员统计
     * @author  jqs
     * @date    2023/7/3 17:16
     * @param merTotalDto
     * @return  MerMemberTotalVo
     */
    @Override
    public MerMemberTotalVo getMerMemberTotal(MerTotalDto merTotalDto){
        if(merTotalDto.getShopAllFlag()!=null&&merTotalDto.getShopAllFlag()==1){
            List<Long> shopIdList = remoteShopService.listShopIdByShopId(merTotalDto.getShopId()).getData();
            merTotalDto.setShopIdList(shopIdList);
            merTotalDto.setShopId(null);
        }
        MerMemberTotalVo merMemberTotalVo = memberMapper.getMerMemberTotal(merTotalDto);
        return merMemberTotalVo;
    }
    /**
     * @description  商户获取会员固定统计
     * @author  jqs
     * @date    2023/7/3 18:34
     * @param merTotalDto
     * @return  MerMemberFixedTotalVo
     */
    @Override
    public MerMemberFixedTotalVo getMerMemberFixedTotal(MerTotalDto merTotalDto){
        MerMemberFixedTotalVo memberFixedTotalVo = new MerMemberFixedTotalVo();
        Date nowDay = DateUtils.getNowDate();
        if(merTotalDto.getShopAllFlag()!=null&&merTotalDto.getShopAllFlag()==1){
            List<Long> shopIdList = remoteShopService.listShopIdByShopId(merTotalDto.getShopId()).getData();
            merTotalDto.setShopIdList(shopIdList);
            merTotalDto.setShopId(null);
        }
        MgtAgeTotalVo mgtAgeTotalVo = memberMapper.getMerMemberTotalAge(merTotalDto);
        // 年龄段数组
        String[] ageKey = {"<20", "21-30", "31-40", "41-50", ">50"};
        // 不同年龄段的会员数数组
        Integer[] ageValue = {mgtAgeTotalVo.getTenAge(), mgtAgeTotalVo.getTwentyAge(), mgtAgeTotalVo.getThirtyAge(), mgtAgeTotalVo.getFortyAge(), mgtAgeTotalVo.getFiftyAge()};
        // 设置年龄段数组和不同年龄段的会员数数组
        memberFixedTotalVo.setAgeKey(ageKey);
        memberFixedTotalVo.setAgeValue(ageValue);
        // 获取不同护理类型的会员数
        List<MgtMapIntTotalVo> nurseTotalVos = memberMapper.getMerMemberTotalNurse(merTotalDto);
        if (nurseTotalVos != null && nurseTotalVos.size() > 0) {
            nurseTotalVos = listRemoveNull(nurseTotalVos);
            memberFixedTotalVo.setNurseTotalVos(nurseTotalVos);
        }
        // 获取不同商品类型的会员数
        List<MgtMapIntTotalVo> goodsTypeTotalVos = memberMapper.getMerMemberTotalGoodsType(merTotalDto);
        if (goodsTypeTotalVos != null && goodsTypeTotalVos.size() > 0) {
            goodsTypeTotalVos = listRemoveNull(goodsTypeTotalVos);
            memberFixedTotalVo.setGoodsTypeTotalVos(goodsTypeTotalVos);
        }
        // 获取不同活跃度的会员数
        List<Activeness> activenessList = remoteConfigService.listActiveness().getData();
        if (activenessList != null && !activenessList.isEmpty()) {
            Activeness activeness;
            String actStartDate;
            String actEndDate;
            Integer count;
            List<MgtMapIntTotalVo> MgtMapIntTotalVoList = new ArrayList<>();
            MgtMapIntTotalVo MgtMapIntTotalVo;
            // 遍历不同活跃度列表,设置活跃度数组和对应的会员数数组
            for (int i = 0; i < activenessList.size(); i++) {
                activeness = activenessList.get(i);
                actStartDate = DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.addDays(nowDay, activeness.getEndDay()));
                actEndDate = DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.addDays(nowDay, activeness.getStartDay()));
                merTotalDto.setStartDate(actStartDate);
                merTotalDto.setEndDate(actEndDate);
                count = memberMapper.getMerMemberTotalActiveness(merTotalDto);
                MgtMapIntTotalVo = new MgtMapIntTotalVo();
                MgtMapIntTotalVo.setMapKey(activeness.getActivenessName());
                MgtMapIntTotalVo.setMapValue(count);
                MgtMapIntTotalVoList.add(MgtMapIntTotalVo);
            }
            memberFixedTotalVo.setActivenessList(MgtMapIntTotalVoList);
        }
        //获取会员消费排名
        List<MgtMapIntTotalVo> memberPayList = memberMapper.getMerMemberPayRank(merTotalDto);
        if (memberPayList != null && memberPayList.size() > 0) {
            memberPayList = listRemoveNull(memberPayList);
            memberFixedTotalVo.setMemberPayList(memberPayList);
        }
        return memberFixedTotalVo;
    }
    /**
     * @description  商会获取会员来源统计
     * @author  jqs
     * @date    2023/7/3 19:09
     * @param merTotalDto
     * @return  MerMemberSourceTotalVo
     */
    @Override
    public MerMemberSourceTotalVo getMerMemberSourceTotal(MerTotalDto merTotalDto){
        MerMemberSourceTotalVo memberSourceTotalVo = new MerMemberSourceTotalVo();
        //获取来源渠道排名
        List<MgtMapIntTotalVo> customerSourceList = memberMapper.getMerMemberCustomerSourceRank(merTotalDto);
        if (customerSourceList != null && customerSourceList.size() > 0) {
            customerSourceList = listRemoveNull(customerSourceList);
            memberSourceTotalVo.setCustomerSourceList(customerSourceList);
        }
        return memberSourceTotalVo;
    }
    /**
     * @description  商会获取会员推荐排名
     * @author  jqs
     * @date    2023/7/3 19:14
     * @param merTotalDto
     * @return  MerMemberRecommendTotalVo
     */
    @Override
    public MerMemberRecommendTotalVo getMerMemberRecommendTotal(MerTotalDto merTotalDto){
        MerMemberRecommendTotalVo memberRecommendTotalVo = new MerMemberRecommendTotalVo();
        //获取会员推荐排名
        List<MgtMapIntTotalVo> recommendList = memberMapper.getMerMemberRecommendRank(merTotalDto);
        if (recommendList != null && recommendList.size() > 0) {
            recommendList = listRemoveNull(recommendList);
            memberRecommendTotalVo.setRecommendList(recommendList);
        }
        return memberRecommendTotalVo;
    }
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberService.java
@@ -193,7 +193,7 @@
     * @param sendType
     * @return  List<Long>
     */
    List<Long> listIdBySendType(Integer sendType);
    List<Long> listIdBySendType(Integer sendType,Long shopId);
    /**
     * @description  通过ids获取用户简易返回
@@ -276,4 +276,40 @@
     * @return  void
     */
    void changeMemberTotal(MemberTotalChangeDto memberTotalChangeDto);
    /**
     * @description  商户获取会员统计
     * @author  jqs
     * @date    2023/7/3 17:16
     * @param merTotalDto
     * @return  MerMemberTotalVo
     */
    MerMemberTotalVo getMerMemberTotal(MerTotalDto merTotalDto);
    /**
     * @description  商户获取会员固定统计
     * @author  jqs
     * @date    2023/7/3 18:34
     * @param merTotalDto
     * @return  MerMemberFixedTotalVo
     */
    MerMemberFixedTotalVo getMerMemberFixedTotal(MerTotalDto merTotalDto);
    /**
     * @description  商会获取会员来源统计
     * @author  jqs
     * @date    2023/7/3 19:09
     * @param merTotalDto
     * @return  MerMemberSourceTotalVo
     */
    MerMemberSourceTotalVo getMerMemberSourceTotal(MerTotalDto merTotalDto);
    /**
     * @description  商会获取会员推荐排名
     * @author  jqs
     * @date    2023/7/3 19:14
     * @param merTotalDto
     * @return  MerMemberRecommendTotalVo
     */
    MerMemberRecommendTotalVo getMerMemberRecommendTotal(MerTotalDto merTotalDto);
}
ruoyi-modules/ruoyi-member/src/main/resources/mapper/coupon/CouponMapper.xml
@@ -330,10 +330,14 @@
            tc.money_threshold  moneyThreshold,
            tc.discount_money  discountMoney,
            tc.discount_percent  discountPercent,
            tc.create_time  createTime
            tc.create_time  createTime,
            tc.audit_reason auditReason
        FROM t_coupon tc
                 LEFT JOIN t_coupon_total tct ON tc.coupon_id = tct.coupon_id
        WHERE tc.del_flag = 0 AND tc.coupon_status = 2 AND tc.coupon_from = 2 AND tc.shop_id = #{param.shopId}
        <if test="param.auditStatus != null and param.auditStatus != ''">
            AND tc.audit_status = #{param.auditStatus}
        </if>
    </select>
ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml
@@ -320,6 +320,9 @@
        <if test="sendType != null and sendType == 4">
            AND tm.binding_flag = 0
        </if>
        <if test="shopId != null and shopId != ''">
            AND tm.relation_shop_id = #{shopId}
        </if>
    </select>
    <select id="listSimpleVoByIds" resultType="com.ruoyi.system.api.domain.vo.MgtSimpleMemberVo">
@@ -422,7 +425,7 @@
                AND create_time &lt;= #{param.endDate}
            </if>
            ) x
        WHERE member_nurse != ''
        WHERE member_nurse IS NOT NULL OR member_nurse != ''
        GROUP BY member_nurse
    </select>
@@ -442,7 +445,7 @@
            AND create_time &lt;= #{param.endDate}
        </if>
        ) x
        WHERE goods_type != ''
        WHERE goods_type IS NOT NULL OR goods_type != ''
        GROUP BY goods_type
    </select>
@@ -578,7 +581,7 @@
            AND create_time &lt;= #{param.endDate}
        </if>
        ) x
        WHERE member_nurse != ''
        WHERE member_nurse IS NOT NULL OR member_nurse != ''
        GROUP BY member_nurse
    </select>
@@ -601,7 +604,7 @@
            AND create_time &lt;= #{param.endDate}
        </if>
        ) x
        WHERE goods_type != ''
        WHERE goods_type IS NOT NULL OR goods_type != ''
        GROUP BY goods_type
    </select>
@@ -701,4 +704,207 @@
            </foreach>
        </if>
    </select>
    <select id="getMerMemberTotal" resultType="com.ruoyi.member.domain.vo.MerMemberTotalVo">
        SELECT
        COUNT(member_id) memberTotal,
        SUM(CASE WHEN customer_source = "小程序" THEN 1 ELSE 0 END) onlineTotal,
        SUM(CASE WHEN customer_source = "小程序" THEN 0 ELSE 1 END) offlineTotal,
        0 introduceTotal,
        SUM(CASE WHEN goods_type LIKE "%周期%" THEN 1 ELSE 0 END) cycleTotal,
        SUM(CASE WHEN goods_type LIKE "%体验%" THEN 1 ELSE 0 END) experienceTotal,
        SUM(CASE WHEN goods_type LIKE "%服务%" THEN 1 ELSE 0 END) serviceTotal
        FROM t_member WHERE del_flag = 0 AND binding_flag = 1
        <if test="param.shopId != null and param.shopId != ''">
            AND relation_shop_id = #{param.shopId}
        </if>
        <if test="param.shopIdList != null and param.shopIdList.size() > 0">
            AND relation_shop_id IN
            <foreach collection="param.shopIdList" item="item" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
        <if test="param.startDate!=null and param.startDate!=''">
            AND create_time &gt;= #{param.startDate}
        </if>
        <if test="param.endDate!=null and param.endDate!=''">
            AND create_time &lt;= #{param.endDate}
        </if>
    </select>
    <select id="getMerMemberTotalAge" resultType="com.ruoyi.member.domain.vo.MgtAgeTotalVo">
        SELECT
        SUM(CASE WHEN gender = 0 THEN 1 ELSE 0 END) manTotal,
        SUM(CASE WHEN gender = 1 THEN 1 ELSE 0 END) womenTotal,
        SUM(CASE WHEN TIMESTAMPDIFF(YEAR, birthday, CURDATE()) BETWEEN 1 AND 20 THEN 1 ELSE 0 END) AS tenAge,
        SUM(CASE WHEN TIMESTAMPDIFF(YEAR, birthday, CURDATE()) BETWEEN 21 AND 30 THEN 1 ELSE 0 END) AS twentyAge,
        SUM(CASE WHEN TIMESTAMPDIFF(YEAR, birthday, CURDATE()) BETWEEN 31 AND 40 THEN 1 ELSE 0 END) AS ThirtyAge,
        SUM(CASE WHEN TIMESTAMPDIFF(YEAR, birthday, CURDATE()) BETWEEN 41 AND 50 THEN 1 ELSE 0 END) AS fortyAge,
        SUM(CASE WHEN TIMESTAMPDIFF(YEAR, birthday, CURDATE()) &gt;= 51 THEN 1 ELSE 0 END) AS fiftyAge
        FROM t_member WHERE del_flag = 0 AND binding_flag = 1
        <if test="param.shopId != null and param.shopId != ''">
            AND relation_shop_id = #{param.shopId}
        </if>
        <if test="param.shopIdList != null and param.shopIdList.size() > 0">
            AND relation_shop_id IN
            <foreach collection="param.shopIdList" item="item" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
        <if test="param.startDate!=null and param.startDate!=''">
            AND create_time &gt;= #{param.startDate}
        </if>
        <if test="param.endDate!=null and param.endDate!=''">
            AND create_time &lt;= #{param.endDate}
        </if>
    </select>
    <select id="getMerMemberTotalNurse" resultType="com.ruoyi.system.api.domain.vo.MgtMapIntTotalVo">
        SELECT member_nurse mapKey, COUNT(*) mapValue
        FROM (
        SELECT member_id, SUBSTRING_INDEX(SUBSTRING_INDEX(member_nurse, ',', numbers.n), ',', -1) member_nurse
        FROM (SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10) numbers
        INNER JOIN t_member ON CHAR_LENGTH(member_nurse) - CHAR_LENGTH(REPLACE(member_nurse, ',', '')) >= numbers.n - 1
        <if test="param.shopId != null and param.shopId != ''">
            AND relation_shop_id = #{param.shopId}
        </if>
        <if test="param.shopIdList != null and param.shopIdList.size() > 0">
            AND relation_shop_id IN
            <foreach collection="param.shopIdList" item="item" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
        <if test="param.startDate!=null and param.startDate!=''">
            AND create_time &gt;= #{param.startDate}
        </if>
        <if test="param.endDate!=null and param.endDate!=''">
            AND create_time &lt;= #{param.endDate}
        </if>
        ) x
        WHERE member_nurse IS NOT NULL OR member_nurse != ''
        GROUP BY member_nurse
    </select>
    <select id="getMerMemberTotalGoodsType" resultType="com.ruoyi.system.api.domain.vo.MgtMapIntTotalVo">
        SELECT goods_type mapKey, COUNT(*) mapValue
        FROM (
        SELECT member_id, SUBSTRING_INDEX(SUBSTRING_INDEX(goods_type, ',', numbers.n), ',', -1) goods_type
        FROM (SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) numbers
        INNER JOIN t_member ON CHAR_LENGTH(goods_type) - CHAR_LENGTH(REPLACE(goods_type, ',', '')) >= numbers.n - 1
        <if test="param.shopId != null and param.shopId != ''">
            AND relation_shop_id = #{param.shopId}
        </if>
        <if test="param.shopIdList != null and param.shopIdList.size() > 0">
            AND relation_shop_id IN
            <foreach collection="param.shopIdList" item="item" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
        <if test="param.startDate!=null and param.startDate!=''">
            AND create_time &gt;= #{param.startDate}
        </if>
        <if test="param.endDate!=null and param.endDate!=''">
            AND create_time &lt;= #{param.endDate}
        </if>
        ) x
        WHERE goods_type IS NOT NULL OR goods_type != ''
        GROUP BY goods_type
    </select>
    <select id="getMerMemberTotalActiveness" resultType="java.lang.Integer">
        SELECT
        COUNT(tm.member_id)
        FROM t_member tm
        LEFT JOIN t_member_total tmt ON tm.member_id = tmt.member_id
        WHERE tm.del_Flag = 0
        <if test="param.shopId != null and param.shopId != ''">
            AND tm.relation_shop_id = #{param.shopId}
        </if>
        <if test="param.shopIdList != null and param.shopIdList.size() > 0">
            AND tm.relation_shop_id IN
            <foreach collection="param.shopIdList" item="item" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
        <if test="param.startDate!=null and param.startDate!=''">
            AND tmt.last_pay_time &gt;= #{actStartDate}
        </if>
        <if test="param.endDate!=null and param.endDate!=''">
            AND tmt.last_pay_time &lt;= #{actEndDate}
        </if>
    </select>
    <select id="getMerMemberPayRank" resultType="com.ruoyi.system.api.domain.vo.MgtMapIntTotalVo">
        SELECT
        tm.nick_name mapKey,
        tmt.total_pay_count mapValue
        FROM t_member tm
        INNER JOIN t_member_total tmt ON tm.member_id = tmt.member_id
        WHERE tm.del_flag = 0
        <if test="param.shopId != null and param.shopId != ''">
            AND tm.relation_shop_id = #{param.shopId}
        </if>
        <if test="param.shopIdList != null and param.shopIdList.size() > 0">
            AND tm.relation_shop_id IN
            <foreach collection="param.shopIdList" item="item" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
        <if test="param.startDate!=null and param.startDate!=''">
            AND tm.create_time &gt;= #{param.startDate}
        </if>
        <if test="param.endDate!=null and param.endDate!=''">
            AND tm.create_time &lt;= #{param.endDate}
        </if>
        ORDER BY tmt.total_pay_count DESC LIMIT 15
    </select>
    <select id="getMerMemberCustomerSourceRank" resultType="com.ruoyi.system.api.domain.vo.MgtMapIntTotalVo">
        SELECT
        tm.customer_source mapKey,
        COUNT(tm.user_id) mapValue
        FROM t_member tm WHERE tm.del_flag = 0
        <if test="param.shopId != null and param.shopId != ''">
            AND tm.relation_shop_id = #{param.shopId}
        </if>
        <if test="param.shopIdList != null and param.shopIdList.size() > 0">
            AND tm.relation_shop_id IN
            <foreach collection="param.shopIdList" item="item" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
        <if test="param.startDate!=null and param.startDate!=''">
            AND tm.create_time &gt;= #{param.startDate}
        </if>
        <if test="param.endDate!=null and param.endDate!=''">
            AND tm.create_time &lt;= #{param.endDate}
        </if>
        GROUP BY tm.customer_source
        ORDER BY COUNT(tm.user_id) DESC LIMIT 15
    </select>
    <select id="getMerMemberRecommendRank" resultType="com.ruoyi.system.api.domain.vo.MgtMapIntTotalVo">
        SELECT
        tm.referrer mapKey,
        COUNT(tm.user_id) mapValue
        FROM t_member tm WHERE tm.del_flag = 0
        <if test="param.shopId != null and param.shopId != ''">
            AND tm.relation_shop_id = #{param.shopId}
        </if>
        <if test="param.shopIdList != null and param.shopIdList.size() > 0">
            AND tm.relation_shop_id IN
            <foreach collection="param.shopIdList" item="item" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
        <if test="param.startDate!=null and param.startDate!=''">
            AND tm.create_time &gt;= #{param.startDate}
        </if>
        <if test="param.endDate!=null and param.endDate!=''">
            AND tm.create_time &lt;= #{param.endDate}
        </if>
        GROUP BY tm.referrer
        ORDER BY COUNT(tm.user_id) DESC LIMIT 15
    </select>
</mapper>
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerOrderDistributionTotalVo.java
New file
@@ -0,0 +1,28 @@
package com.ruoyi.order.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @ClassName MerOrderDistributionTotalVo
 * @Description TODO
 * @Author jqs
 * @Date 2023/7/3 16:42
 * @Version 1.0
 */
@Data
public class MerOrderDistributionTotalVo {
    @ApiModelProperty(value = "订单数量key")
    private String[] orderTotalKey;
    @ApiModelProperty(value = "订单数量value")
    private Integer[] orderTotalValue;
    @ApiModelProperty(value = "订单金额value")
    private BigDecimal[] orderMoneyValue;
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerOrderFromRankVo.java
New file
@@ -0,0 +1,23 @@
package com.ruoyi.order.domain.vo;
import com.ruoyi.system.api.domain.vo.MgtMapBigTotalVo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @ClassName MerOrderFromRankVo
 * @Description TODO
 * @Author jqs
 * @Date 2023/7/3 16:46
 * @Version 1.0
 */
@Data
public class MerOrderFromRankVo {
    @ApiModelProperty(value = "来源排行")
    private List<MgtMapBigTotalVo> orderFromRankList;
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerOrderGoodsRankVo.java
New file
@@ -0,0 +1,21 @@
package com.ruoyi.order.domain.vo;
import com.ruoyi.system.api.domain.vo.MgtMapBigTotalVo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @ClassName MerOrderGoodsRankVo
 * @Description TODO
 * @Author jqs
 * @Date 2023/7/3 16:45
 * @Version 1.0
 */
@Data
public class MerOrderGoodsRankVo {
    @ApiModelProperty(value = "商品排行")
    private List<MgtMapBigTotalVo> goodsRankList;
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerOrderTotalVo.java
New file
@@ -0,0 +1,61 @@
package com.ruoyi.order.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @ClassName MerOrderTotalVo
 * @Description TODO
 * @Author jqs
 * @Date 2023/7/3 16:38
 * @Version 1.0
 */
@Data
public class MerOrderTotalVo {
    @ApiModelProperty(value = "总订单数")
    private Integer orderTotal;
    @ApiModelProperty(value = "线上订单数")
    private Integer onlineTotal;
    @ApiModelProperty(value = "线下订单数")
    private Integer offlineTotal;
    @ApiModelProperty(value = "活动订单数")
    private Integer activityTotal;
    @ApiModelProperty(value = "周期订单数")
    private Integer cycleTotal;
    @ApiModelProperty(value = "体验订单数")
    private Integer experienceTotal;
    @ApiModelProperty(value = "服务订单数")
    private Integer serviceTotal;
    @ApiModelProperty(value = "总订单金额")
    private BigDecimal orderMoney;
    @ApiModelProperty(value = "线上订单金额")
    private BigDecimal onlineMoney;
    @ApiModelProperty(value = "线下订单金额")
    private BigDecimal offlineMoney;
    @ApiModelProperty(value = "活动订单金额")
    private BigDecimal activityMoney;
    @ApiModelProperty(value = "周期订单金额")
    private BigDecimal cycleMoney;
    @ApiModelProperty(value = "体验订单金额")
    private BigDecimal experienceMoney;
    @ApiModelProperty(value = "服务订单金额")
    private BigDecimal serviceMoney;
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MerOrderTypeTotalVo.java
New file
@@ -0,0 +1,28 @@
package com.ruoyi.order.domain.vo;
import com.ruoyi.system.api.domain.vo.MgtMapBigTotalVo;
import com.ruoyi.system.api.domain.vo.MgtMapIntTotalVo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @ClassName MerOrderTypeTotalVo
 * @Description TODO
 * @Author jqs
 * @Date 2023/7/3 16:44
 * @Version 1.0
 */
@Data
public class MerOrderTypeTotalVo {
    @ApiModelProperty(value = "商品类型数量")
    private List<MgtMapIntTotalVo> goodsTypeTotalList;
    @ApiModelProperty(value = "商品类型金额")
    private List<MgtMapBigTotalVo> goodsTypeMoneyList;
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtTotalOrderTotalVo.java
@@ -39,7 +39,7 @@
    @ApiModelProperty(value = "服务订单数")
    private Integer serviceTotal;
    @ApiModelProperty(value = "总订单数")
    @ApiModelProperty(value = "总订单金额")
    private BigDecimal orderMoney;
    @ApiModelProperty(value = "线上订单金额")
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/business/MerShopController.java
@@ -12,19 +12,14 @@
import com.ruoyi.shop.domain.vo.MerShopCertificateListVo;
import com.ruoyi.shop.domain.vo.MerShopSuggestVo;
import com.ruoyi.shop.service.shop.*;
import com.ruoyi.system.api.domain.dto.MerBaseDto;
import com.ruoyi.system.api.domain.dto.MerBaseGetDto;
import com.ruoyi.system.api.domain.dto.MerEditUserDto;
import com.ruoyi.system.api.domain.dto.MerPageDto;
import com.ruoyi.system.api.domain.dto.*;
import com.ruoyi.system.api.domain.poji.shop.Shop;
import com.ruoyi.system.api.domain.vo.MerHomeShopTotalVo;
import com.ruoyi.system.api.domain.vo.MerStaffInfoVo;
import com.ruoyi.system.api.domain.vo.MgtSimpleShopVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@@ -147,4 +142,14 @@
        shopSuggestService.suggest(merShopSuggestDto);
        return R.ok();
    }
    @RequestMapping(value = "/listShopByShop", method = RequestMethod.POST)
    @ApiOperation(value = "获取商户下属代理商")
    public R<List<MgtSimpleShopVo>> listShopByShop(@RequestBody MerBaseDto merBaseDto)
    {
        List<MgtSimpleShopVo> mgtShopListSimpleVos = shopService.listShopByShop(merBaseDto.getShopId());
        return R.ok(mgtShopListSimpleVos);
    }
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/console/ShopController.java
@@ -220,4 +220,18 @@
        return R.ok(taskSimpleVo);
    }
    /**
     * @description  获取商户下属代理商
     * @author  jqs
     * @date    2023/7/3 17:26
     * @return  R<List<Long>>
     */
    @PostMapping("/listShopIdByShopId")
    public R<List<Long>> listShopIdByShopId(@RequestBody Long shopId)
    {
        List<Long> shopIdList = shopService.listShopIdByShopId(shopId);
        return R.ok(shopIdList);
    }
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java
@@ -11,7 +11,6 @@
import com.ruoyi.common.core.utils.uuid.IdUtils;
import com.ruoyi.common.security.utils.CodeFactoryUtil;
import com.ruoyi.shop.domain.dto.*;
import com.ruoyi.shop.domain.pojo.shop.ShopTotal;
import com.ruoyi.shop.domain.pojo.shop.*;
import com.ruoyi.shop.domain.pojo.task.ShopFile;
import com.ruoyi.shop.domain.vo.*;
@@ -960,4 +959,40 @@
        mgtShopAuthCodeVo.setLegalValidationUrl(shopAuthentication.getLegalValidationUrl());
        return mgtShopAuthCodeVo;
    }
    /**
     * @description  获取商户下属代理商
     * @author  jqs
     * @date    2023/7/3 17:27
     * @param shopId
     * @return  List<Long>
     */
    @Override
    public List<Long> listShopIdByShopId(Long shopId){
        List<Long> shopIds = shopMapper.selectList(
                new LambdaQueryWrapper<Shop>().eq(Shop::getDelFlag, 0).eq(Shop::getBelongShopId, shopId)
        ).stream().map(Shop::getShopId).collect(Collectors.toList());
        return shopIds;
    }
    /**
     * @description  获取商户下属代理商
     * @author  jqs
     * @date    2023/7/3 18:18
     * @param shopId
     * @return  List<MgtSimpleShopVo>
     */
    @Override
    public List<MgtSimpleShopVo> listShopByShop(Long shopId){
        List<MgtSimpleShopVo> simpleShopVoList = shopMapper.selectList(
                new LambdaQueryWrapper<Shop>().eq(Shop::getDelFlag, 0).eq(Shop::getBelongShopId, shopId)).
                stream().map(shop->{
                    MgtSimpleShopVo simpleShopVo = new MgtSimpleShopVo();
                    simpleShopVo.setShopId(shop.getShopId());
                    simpleShopVo.setShopName(shop.getShopName());
                    return simpleShopVo;
                }).collect(Collectors.toList());
        return simpleShopVoList;
    }
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/task/MemberTaskServiceImpl.java
@@ -187,4 +187,6 @@
    public MemberTaskSimpleVo getLastMemberTask(Long userId){
        return memberTaskMapper.getLastMemberTask(userId);
    }
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java
@@ -233,4 +233,22 @@
     * @return  MgtShopAuthCodeVo
     */
    MgtShopAuthCodeVo getMgtShopAuthCode(String authId);
    /**
     * @description  获取商户下属代理商
     * @author  jqs
     * @date    2023/7/3 17:27
     * @param shopId
     * @return  List<Long>
     */
    List<Long> listShopIdByShopId(Long shopId);
    /**
     * @description  获取商户下属代理商
     * @author  jqs
     * @date    2023/7/3 18:18
     * @param shopId
     * @return  List<MgtSimpleShopVo>
     */
    List<MgtSimpleShopVo> listShopByShop(Long shopId);
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/task/MemberTaskService.java
@@ -58,4 +58,6 @@
     * @return  MemberTaskSimpleVo
     */
    MemberTaskSimpleVo getLastMemberTask(Long userId);
}
ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopMapper.xml
@@ -501,7 +501,7 @@
        ts.shop_name shopName,
        ts.shopowner_name shopownerName,
        ts.shopowner_phone shopownerPhone,
        CASE tsa.main_mype
        CASE tsa.main_type
            WHEN 1 THEN '个人'
            WHEN 2 THEN '企业'
            END mainType,
@@ -530,7 +530,7 @@
            AND ts.shopowner_phone LIKE CONCAT('%',#{param.shopownerPhone},'%')
        </if>
        <if test="param.mainType!=null and param.mainType!=''">
            AND tsa.main_mype = #{param.mainType}
            AND tsa.main_type = #{param.mainType}
        </if>
        <if test="param.auditStatus!=null">
            AND tsa.audit_status = #{param.auditStatus}