jiangqs
2023-06-20 9e7b5dd397e17fe141cc7630df51699125857756
BUG修复和营销统计
29个文件已修改
5个文件已添加
859 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/AppErrorConstant.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/MgtActivityAgeDto.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/MgtBaseBathDto.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/MgtSimpleMemberVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteMemberFallbackFactory.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteShopFallbackFactory.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteMemberService.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteShopService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtGoodsPageVo.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/activity/ActivityServiceImpl.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/MemberController.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/MgtTotalController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/member/MemberMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/management/MgtTotalController.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtMapTotalVo.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtShopOrderPageVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtTotalActivityTotalVo.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtTotalDataTotalVo.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/order/OrderMapper.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/console/ShopController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/management/MgtShopController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MgtTerminateCooperationDto.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/RecommendCooperationMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constant/AppErrorConstant.java
@@ -53,4 +53,6 @@
    String ACTIVITY_ING_DELETE = "只能删除未开始活动";
    String COUPON_AUDIT_DOUBLE = "优惠券已被其他员工审核";
    String COOPERATION_TIME_ERROR = "未在合作时间内";
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/MgtActivityAgeDto.java
New file
@@ -0,0 +1,24 @@
package com.ruoyi.system.api.domain.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @ClassName MgtActivityAgeDto
 * @Description TODO
 * @Author jqs
 * @Date 2023/6/20 9:45
 * @Version 1.0
 */
@Data
public class MgtActivityAgeDto extends MgtBaseShopDto {
    @ApiModelProperty(value = "年龄分布1.<20 2.21-30 3.31-40 4.41-50 5.>50")
    private Integer ageType;
    @ApiModelProperty(value = "userIds",hidden = true)
    private List<Long> userIds;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/MgtBaseBathDto.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.system.api.domain.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @ClassName MgtBaseBathDto
 * @Description TODO
 * @Author jqs
 * @Date 2023/6/20 16:52
 * @Version 1.0
 */
@Data
public class MgtBaseBathDto extends MgtBaseDto{
    @ApiModelProperty(value = "请求对象id集合 多个用,隔开")
    private String ids;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/MgtSimpleMemberVo.java
@@ -20,7 +20,7 @@
    private String nickName;
    @ApiModelProperty(value = "用户姓名")
    private String userName;
    private String realName;
    @ApiModelProperty(value = "用户电话")
    private String userMobile;
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteMemberFallbackFactory.java
@@ -1,12 +1,9 @@
package com.ruoyi.system.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.dto.AppMiniRegisterDto;
import com.ruoyi.system.api.domain.dto.MgtUserIdByKeywordDto;
import com.ruoyi.system.api.domain.dto.*;
import com.ruoyi.system.api.domain.vo.*;
import com.ruoyi.system.api.service.RemoteMemberService;
import com.ruoyi.system.api.domain.dto.AppMemberBindingDto;
import com.ruoyi.system.api.domain.dto.AppMemberGoodsTypeDto;
import com.ruoyi.system.api.domain.poji.member.Member;
import com.ruoyi.system.api.model.AppMiniLoginDto;
import com.ruoyi.system.api.model.AppMiniLoginVo;
@@ -86,7 +83,7 @@
            }
            @Override
            public R<List<MgtSimpleMemberVo>> listSimpleVoByIds(String userIds) {
            public R<List<MgtSimpleMemberVo>> listSimpleVoByIds(MgtBaseBathDto mgtBaseBathDto) {
                return R.fail("获取用户列表失败:" + throwable.getMessage());
            }
@@ -99,6 +96,11 @@
            public R<MgtBulletinBoardVo> boardMemberTotal() {
                return null;
            }
            @Override
            public R<List<Long>> listUserIdByAge(MgtActivityAgeDto mgtActivityAgeDto) {
                return R.fail("筛选userId年龄段失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteShopFallbackFactory.java
@@ -1,6 +1,7 @@
package com.ruoyi.system.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.dto.MgtBaseBathDto;
import com.ruoyi.system.api.domain.dto.MgtShopIdByCodeDto;
import com.ruoyi.system.api.domain.vo.MgtBulletinBoardVo;
import com.ruoyi.system.api.domain.vo.MgtShopIdByCodeVo;
@@ -64,7 +65,7 @@
            }
            @Override
            public R<List<MgtSimpleShopVo>> listShopSimpleVoByIds(String shopIds) {
            public R<List<MgtSimpleShopVo>> listShopSimpleVoByIds(MgtBaseBathDto mgtBaseBathDto) {
                return R.fail("获取商户列表失败:" + throwable.getMessage());
            }
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteMemberService.java
@@ -2,10 +2,7 @@
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.dto.AppMemberBindingDto;
import com.ruoyi.system.api.domain.dto.AppMemberGoodsTypeDto;
import com.ruoyi.system.api.domain.dto.AppMiniRegisterDto;
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.*;
import com.ruoyi.system.api.factory.RemoteMemberFallbackFactory;
@@ -107,7 +104,7 @@
     * @return  R<List<MgtSimpleMemberVo>>
     */
    @PostMapping("/member/listSimpleVoByIds")
    public R<List<MgtSimpleMemberVo>> listSimpleVoByIds(@RequestBody String userIds);
    public R<List<MgtSimpleMemberVo>> listSimpleVoByIds(@RequestBody MgtBaseBathDto mgtBaseBathDto);
    /**
     * @description
@@ -128,4 +125,14 @@
     */
    @PostMapping("/member/boardMemberTotal")
    public R<MgtBulletinBoardVo> boardMemberTotal();
    /**
     * @description  筛选userId年龄段
     * @author  jqs
     * @date    2023/6/20 14:31
     * @param mgtActivityAgeDto
     * @return  R<List<Long>>
     */
    @PostMapping("/listUserIdByAge")
    public R<List<Long>> listUserIdByAge(@RequestBody MgtActivityAgeDto mgtActivityAgeDto);
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteShopService.java
@@ -2,6 +2,7 @@
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.dto.MgtBaseBathDto;
import com.ruoyi.system.api.domain.dto.MgtShopIdByCodeDto;
import com.ruoyi.system.api.domain.poji.shop.Shop;
import com.ruoyi.system.api.domain.vo.MgtBulletinBoardVo;
@@ -67,7 +68,7 @@
    @PostMapping("/shop/listShopSimpleVoByIds")
    public R<List<MgtSimpleShopVo>> listShopSimpleVoByIds(@RequestBody String shopIds);
    public R<List<MgtSimpleShopVo>> listShopSimpleVoByIds(@RequestBody MgtBaseBathDto mgtBaseBathDto);
    /**
     * @description boardShopTotal
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsController.java
@@ -83,7 +83,7 @@
    }
    @RequestMapping(value = "/deleteMgtGoods", method = RequestMethod.POST)
    @ApiOperation(value = "平台推荐商品")
    @ApiOperation(value = "删除商品")
    public R deleteMgtGoods(@RequestBody MgtBaseGetDto mgtBaseGetDto) {
        Long userId = SecurityUtils.getUserId();
        mgtBaseGetDto.setUserId(userId);
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtGoodsPageVo.java
@@ -1,6 +1,5 @@
package com.ruoyi.goods.domain.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -38,7 +37,7 @@
    private String goodsPicture;
    @ApiModelProperty(value = "商品类型1周期2服务3体验4单品")
    private Integer goodsType;
    private String goodsType;
    @ApiModelProperty(value = "商品建议售价")
    private BigDecimal suggestSalesPrice;;
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/activity/ActivityServiceImpl.java
@@ -19,6 +19,7 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.goods.service.activity.ActivityTotalService;
import com.ruoyi.system.api.constant.AppErrorConstant;
import com.ruoyi.system.api.domain.dto.MgtBaseBathDto;
import com.ruoyi.system.api.domain.poji.activity.ActivityGoods;
import com.ruoyi.system.api.domain.vo.MgtSimpleShopVo;
import com.ruoyi.system.api.service.RemoteShopService;
@@ -170,7 +171,9 @@
        //活动关联商户
        if(activity.getShopFlag()==2&&StringUtils.isNotBlank(activity.getApplicableShop())){
            String applicableShop = activity.getApplicableShop();
            List<MgtSimpleShopVo> mgtSimpleShopVoList= remoteShopService.listShopSimpleVoByIds(applicableShop).getData();
            MgtBaseBathDto mgtBaseBathDto = new MgtBaseBathDto();
            mgtBaseBathDto.setIds(applicableShop);
            List<MgtSimpleShopVo> mgtSimpleShopVoList= remoteShopService.listShopSimpleVoByIds(mgtBaseBathDto).getData();
            mgtActivityGetVo.setMgtSimpleShopVosList(mgtSimpleShopVoList);
        }
        //活动关联商品
ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml
@@ -377,7 +377,7 @@
    </update>
    <select id="listGoodsByGoodsId" resultType="com.ruoyi.system.api.domain.poji.goods.Goods">
        SELECT * FROM t_goods WHERE del_flag = 0 AND goods_id IN (#{goodsIds})
        SELECT * FROM t_goods WHERE del_flag = 0 AND FIND_IN_SET(goods_id,#{goodsIds}) &gt; 0
    </select>
    
    <select id="pageMgtSelectGoods" resultType="com.ruoyi.system.api.domain.vo.MgtSelectGoodsPageVo">
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/console/MemberController.java
@@ -5,10 +5,7 @@
import com.ruoyi.member.service.member.MemberCouponService;
import com.ruoyi.member.service.member.MemberService;
import com.ruoyi.member.service.member.MemberSuggestService;
import com.ruoyi.system.api.domain.dto.AppMemberBindingDto;
import com.ruoyi.system.api.domain.dto.AppMemberGoodsTypeDto;
import com.ruoyi.system.api.domain.dto.AppMiniRegisterDto;
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.*;
import com.ruoyi.system.api.model.AppMiniLoginDto;
@@ -171,13 +168,13 @@
     * @description  通过ids获取用户简易返回
     * @author  jqs
     * @date    2023/6/16 11:05
     * @param userIds
     * @param mgtBaseBathDto
     * @return  R<List<MgtSimpleMemberVo>>
     */
    @PostMapping("/listSimpleVoByIds")
    public R<List<MgtSimpleMemberVo>> listSimpleVoByIds(@RequestBody String userIds)
    public R<List<MgtSimpleMemberVo>> listSimpleVoByIds(@RequestBody MgtBaseBathDto mgtBaseBathDto)
    {
        List<MgtSimpleMemberVo> simpleMemberVoList = memberService.listSimpleVoByIds(userIds);
        List<MgtSimpleMemberVo> simpleMemberVoList = memberService.listSimpleVoByIds(mgtBaseBathDto.getIds());
        return R.ok(simpleMemberVoList);
    }
@@ -209,4 +206,17 @@
        return R.ok(bulletinBoardVo);
    }
    /**
     * @description  筛选userId年龄段
     * @author  jqs
     * @date    2023/6/20 14:31
     * @param mgtActivityAgeDto
     * @return  R<List<Long>>
     */
    @PostMapping("/listUserIdByAge")
    public R<List<Long>> listUserIdByAge(@RequestBody MgtActivityAgeDto mgtActivityAgeDto)
    {
        List<Long> userIdList = memberService.listUserIdByAge(mgtActivityAgeDto);
        return R.ok(userIdList);
    }
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/MgtTotalController.java
@@ -39,5 +39,4 @@
        return R.ok(totalMemberTotalVo);
    }
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/member/MemberMapper.java
@@ -6,6 +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.MgtBaseShopDto;
import com.ruoyi.system.api.domain.dto.MgtUserIdByKeywordDto;
import com.ruoyi.system.api.domain.poji.member.Member;
@@ -198,6 +199,16 @@
     */
    List<MgtMapTotalVo> getTotalMemberRankCustomerSource(@Param("param") MgtBaseShopDto mgtBaseShopDto);
    /**
     * @description
     * @author  jqs
     * @date    2023/6/20 11:49
     * @param mgtActivityAgeDto
     * @return  List<Long>
     */
    List<Long> listUserIdByAge(@Param("param")MgtActivityAgeDto mgtActivityAgeDto);
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java
@@ -1044,4 +1044,20 @@
        // 返回总会员数和不同类型会员数的统计结果
        return mgtTotalMemberTotalVo;
    }
    /**
     * @description
     * @author  jqs
     * @date    2023/6/20 11:42
     * @param mgtActivityAgeDto
     * @return  List<Long>
     */
    @Override
    public List<Long> listUserIdByAge(MgtActivityAgeDto mgtActivityAgeDto){
        List<Long> userIdList = memberMapper.listUserIdByAge(mgtActivityAgeDto);
        return userIdList;
    }
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberService.java
@@ -233,4 +233,15 @@
     * @return  MgtTotalMemberTotalVo
     */
    MgtTotalMemberTotalVo getTotalMemberTotal(MgtBaseShopDto mgtBaseShopDto);
    /**
     * @description
     * @author  jqs
     * @date    2023/6/20 11:49
     * @param mgtActivityAgeDto
     * @return  List<Long>
     */
    List<Long> listUserIdByAge(MgtActivityAgeDto mgtActivityAgeDto);
}
ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml
@@ -304,7 +304,7 @@
            tm.nick_name nickName,
            tm.mobile mobile
        FROM t_member tm
        WHERE tm.del_flag = 0 AND tm.user_id IN (#{userIds})
        WHERE tm.del_flag = 0 AND FIND_IN_SET(tm.user_id, #{userIds}) &gt; 0
    </select>
    <select id="getUserIdByKeyword" resultType="java.lang.Long">
@@ -475,4 +475,33 @@
        GROUP BY tm.customer_source
        ORDER BY SUM(tm.customer_source) DESC LIMIT 10
    </select>
    <select id="listUserIdByAge" resultType="java.lang.Long">
        SELECT user_id
        FROM t_member
        WHERE del_flag = 0
        <if test="param.ageType != null and param.ageType ==1">
            AND TIMESTAMPDIFF(YEAR, birthday, CURDATE()) BETWEEN 1 AND 20
        </if>
        <if test="param.ageType != null and param.ageType ==2">
            AND TIMESTAMPDIFF(YEAR, birthday, CURDATE()) BETWEEN 21 AND 30
        </if>
        <if test="param.ageType != null and param.ageType ==3">
            AND TIMESTAMPDIFF(YEAR, birthday, CURDATE()) BETWEEN 31 AND 40
        </if>
        <if test="param.ageType != null and param.ageType ==4">
            AND TIMESTAMPDIFF(YEAR, birthday, CURDATE()) BETWEEN 41 AND 50
        </if>
        <if test="param.ageType != null and param.ageType ==5">
            AND TIMESTAMPDIFF(YEAR, birthday, CURDATE()) BETWEEN 1 AND 20
        </if>
        <if test="param.userIds != null">
            AND user_id IN
            <foreach collection="list" item="item" open="(" separator="," close=")">
                #{param.userIds}
            </foreach>
        </if>
    </select>
</mapper>
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/management/MgtTotalController.java
@@ -2,8 +2,11 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.order.domain.vo.MgtTotalActivityTotalVo;
import com.ruoyi.order.domain.vo.MgtTotalDataTotalVo;
import com.ruoyi.order.domain.vo.MgtTotalOrderTotalVo;
import com.ruoyi.order.service.order.OrderService;
import com.ruoyi.system.api.domain.dto.MgtActivityAgeDto;
import com.ruoyi.system.api.domain.dto.MgtBaseShopDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -30,7 +33,7 @@
    private OrderService orderService;
    @RequestMapping(value = "/getTotalOrderTotal", method = RequestMethod.POST)
    @ApiOperation(value = "获取会员人数统计")
    @ApiOperation(value = "获取订单统计")
    public R<MgtTotalOrderTotalVo> getTotalOrderTotal(@RequestBody MgtBaseShopDto mgtBaseShopDto) {
        Long userId = SecurityUtils.getUserId();
        mgtBaseShopDto.setUserId(userId);
@@ -38,4 +41,30 @@
        return R.ok(totalOrderTotalVo);
    }
    @RequestMapping(value = "/getTotalActivityTotal", method = RequestMethod.POST)
    @ApiOperation(value = "获取活动统计")
    public R<MgtTotalActivityTotalVo> getTotalActivityTotal(@RequestBody MgtBaseShopDto mgtBaseShopDto) {
        Long userId = SecurityUtils.getUserId();
        mgtBaseShopDto.setUserId(userId);
        MgtTotalActivityTotalVo totalActivityTotal = orderService.getTotalActivityTotal(mgtBaseShopDto);
        return R.ok(totalActivityTotal);
    }
    @RequestMapping(value = "/getTotalActivityAgeRank", method = RequestMethod.POST)
    @ApiOperation(value = "获取活动年龄分布")
    public R<MgtTotalActivityTotalVo> getTotalActivityAgeRank(@RequestBody MgtActivityAgeDto mgtActivityAgeDto) {
        Long userId = SecurityUtils.getUserId();
        mgtActivityAgeDto.setUserId(userId);
        MgtTotalActivityTotalVo totalActivityTotal = orderService.getTotalActivityAgeRank(mgtActivityAgeDto);
        return R.ok(totalActivityTotal);
    }
    @RequestMapping(value = "/getTotalDataTotal", method = RequestMethod.POST)
    @ApiOperation(value = "获取数据统计")
    public R<MgtTotalDataTotalVo> getTotalDataTotal(@RequestBody MgtBaseShopDto mgtBaseShopDto) {
        Long userId = SecurityUtils.getUserId();
        mgtBaseShopDto.setUserId(userId);
        MgtTotalDataTotalVo totalDataTotalVo = orderService.getTotalDataTotal(mgtBaseShopDto);
        return R.ok(totalDataTotalVo);
    }
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtMapTotalVo.java
@@ -24,4 +24,6 @@
    @ApiModelProperty(value = "mapValueSecond")
    private BigDecimal mapValueSecond;
    @ApiModelProperty(value = "mapValueThird")
    private Integer mapValueThird;
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtShopOrderPageVo.java
@@ -43,6 +43,9 @@
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    @ApiModelProperty("优惠金额")
    private BigDecimal discountMoney;
    @ApiModelProperty("应付金额")
    private BigDecimal receivableMoney;
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtTotalActivityTotalVo.java
New file
@@ -0,0 +1,78 @@
package com.ruoyi.order.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @ClassName MgtTotalActivityTotalVo
 * @Description TODO
 * @Author jqs
 * @Date 2023/6/20 9:22
 * @Version 1.0
 */
@Data
public class MgtTotalActivityTotalVo {
    @ApiModelProperty(value = "总订单数")
    private Integer orderTotal;
    @ApiModelProperty(value = "周期订单数")
    private Integer cycleTotal;
    @ApiModelProperty(value = "体验订单数")
    private Integer experienceTotal;
    @ApiModelProperty(value = "服务订单数")
    private Integer serviceTotal;
    @ApiModelProperty(value = "总订单金额")
    private BigDecimal orderMoney;
    @ApiModelProperty(value = "周期订单金额")
    private BigDecimal cycleMoney;
    @ApiModelProperty(value = "体验订单金额")
    private BigDecimal experienceMoney;
    @ApiModelProperty(value = "服务订单金额")
    private BigDecimal serviceMoney;
    @ApiModelProperty(value = "总人数")
    private Integer orderPerson;
    @ApiModelProperty(value = "周期人数")
    private Integer cyclePerson;
    @ApiModelProperty(value = "体验人数")
    private Integer experiencePerson;
    @ApiModelProperty(value = "服务人数")
    private Integer servicePerson;
    @ApiModelProperty(value = "订单数量key")
    private String[] orderTotalKey;
    @ApiModelProperty(value = "订单数量value")
    private Integer[] orderTotalValue;
    @ApiModelProperty(value = "订单数量value")
    private BigDecimal[] orderMoneyValue;
    @ApiModelProperty(value = "商品类型数量key")
    private String[] goodsTypeKey;
    @ApiModelProperty(value = "商品类型数量value")
    private Integer[] goodsTypeTotalValue;
    @ApiModelProperty(value = "商品类型金额value")
    private BigDecimal[] goodsTypeMoneyValue;
    @ApiModelProperty(value = "来源排行key")
    private String[] orderAgeKey;
    @ApiModelProperty(value = "来源排行value")
    private BigDecimal[] orderAgeValue;
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtTotalDataTotalVo.java
New file
@@ -0,0 +1,43 @@
package com.ruoyi.order.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @ClassName MgtTotalDataTotalVo
 * @Description TODO
 * @Author jqs
 * @Date 2023/6/20 14:56
 * @Version 1.0
 */
@Data
public class MgtTotalDataTotalVo {
    @ApiModelProperty(value = "总人数")
    private Integer orderPerson;
    @ApiModelProperty(value = "体验人数")
    private Integer onlyExperiencePerson;
    @ApiModelProperty(value = "体验开单人数")
    private Integer experienceCyclePerson;
    @ApiModelProperty(value = "没体验开单人数")
    private Integer onlyCyclePerson;
    @ApiModelProperty(value = "续单人数")
    private Integer reorderPerson;
    @ApiModelProperty(value = "老客户回店人数")
    private Integer returnedPerson;
    @ApiModelProperty(value = "整体调理人数")
    private Integer cyclePerson;
    @ApiModelProperty(value = "单品人数")
    private Integer goodsPerson;
    @ApiModelProperty(value = "单品数量")
    private Integer goodsNumber;
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/order/OrderMapper.java
@@ -5,6 +5,7 @@
import com.ruoyi.order.domain.dto.*;
import com.ruoyi.order.domain.pojo.order.Order;
import com.ruoyi.order.domain.vo.*;
import com.ruoyi.system.api.domain.dto.MgtActivityAgeDto;
import com.ruoyi.system.api.domain.dto.MgtBaseShopDto;
import com.ruoyi.system.api.domain.vo.MgtBulletinBoardVo;
import org.apache.ibatis.annotations.Param;
@@ -139,7 +140,7 @@
    MgtBulletinBoardVo boardOrderTotal();
    /**
    * @description getTotalOrderTotal
    * @description getTotalOrderTotalOrderFrom
    * @param mgtBaseShopDto
    * @return MgtTotalOrderTotalVo
    * @author jqs34
@@ -148,7 +149,7 @@
    MgtTotalOrderTotalVo getTotalOrderTotalOrderFrom(@Param("param") MgtBaseShopDto mgtBaseShopDto);
    /**
     * @description getTotalOrderTotal
     * @description getTotalOrderTotalGoodsType
     * @param mgtBaseShopDto
     * @return MgtTotalOrderTotalVo
     * @author jqs34
@@ -157,7 +158,7 @@
    MgtTotalOrderTotalVo getTotalOrderTotalGoodsType(@Param("param") MgtBaseShopDto mgtBaseShopDto);
    /**
    * @description getTotalOrderTotal
    * @description listTotalOrderTotal
    * @param mgtBaseShopDto
    * @return List<MgtMapTotalVo>
    * @author jqs34
@@ -166,7 +167,7 @@
    List<MgtMapTotalVo> listTotalOrderTotal(@Param("param") MgtBaseShopDto mgtBaseShopDto);
    /**
     * @description getTotalOrderTotal
     * @description listTotalOrderTotalGoodsType
     * @param mgtBaseShopDto
     * @return List<MgtMapTotalVo>
     * @author jqs34
@@ -176,7 +177,7 @@
    /**
     * @description getTotalOrderTotal
     * @description listTotalOrderTotalGoodsRank
     * @param mgtBaseShopDto
     * @return List<MgtMapTotalVo>
     * @author jqs34
@@ -185,11 +186,86 @@
    List<MgtMapTotalVo> listTotalOrderTotalGoodsRank(@Param("param") MgtBaseShopDto mgtBaseShopDto);
    /**
     * @description getTotalOrderTotal
     * @description listTotalOrderTotalOrderFrom
     * @param mgtBaseShopDto
     * @return List<MgtMapTotalVo>
     * @author jqs34
     * @date 2023/6/19 22:48
     */
    List<MgtMapTotalVo> listTotalOrderTotalOrderFrom(@Param("param") MgtBaseShopDto mgtBaseShopDto);
    /**
     * @description getTotalActivityTotal
     * @author  jqs
     * @date    2023/6/20 9:28
     * @param mgtBaseShopDto
     * @return  MgtTotalActivityTotalVo
     */
    MgtTotalActivityTotalVo getTotalActivityTotal(@Param("param")MgtBaseShopDto mgtBaseShopDto);
    /**
     * @description listTotalActivityTotalGoodsType
     * @param mgtBaseShopDto
     * @return List<MgtMapTotalVo>
     * @author jqs34
     * @date 2023/6/19 22:48
     */
    List<MgtMapTotalVo> listTotalActivityTotalGoodsType(@Param("param") MgtBaseShopDto mgtBaseShopDto);
    /**
     * @description listTotalActivityTotal
     * @param mgtBaseShopDto
     * @return List<MgtMapTotalVo>
     * @author jqs34
     * @date 2023/6/19 22:48
     */
    List<MgtMapTotalVo> listTotalActivityTotal(@Param("param") MgtBaseShopDto mgtBaseShopDto);
    /**
     * @description
     * @author  jqs
     * @date    2023/6/20 11:37
     * @param mgtActivityAgeDto
     * @return  List<Long>
     */
    List<Long> getUserIdAgeRank(@Param("param") MgtActivityAgeDto mgtActivityAgeDto);
    /**
     * @description
     * @author  jqs
     * @date    2023/6/20 9:57
     * @param mgtActivityAgeDto
     * @return  MgtTotalActivityTotalVo
     */
    MgtTotalActivityTotalVo getTotalActivityAgeRank(@Param("param")MgtActivityAgeDto mgtActivityAgeDto);
    /**
     * @description
     * @author  jqs
     * @date    2023/6/20 15:50
     * @param mgtBaseShopDto
     * @return  MgtTotalDataTotalVo
     */
    MgtTotalDataTotalVo getTotalDataTotal(@Param("param")MgtBaseShopDto mgtBaseShopDto);
    /**
     * @description
     * @author  jqs
     * @date    2023/6/20 18:16
     * @param
     * @return  Integer
     */
    Integer getReorderPerson(@Param("param")MgtBaseShopDto mgtBaseShopDto);
    /**
     * @description
     * @author  jqs
     * @date    2023/6/20 18:16
     * @param
     * @return  Integer
     */
    Integer getReturnedPerson(@Param("param")MgtBaseShopDto mgtBaseShopDto);
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
@@ -982,7 +982,9 @@
            // 将set中的shopId转换为逗号分隔的字符串
            String joinedString = String.join(",", set);
            // 通过remoteShopService获取MgtSimpleShopVoList
            List<MgtSimpleShopVo> simpleShopVoList = remoteShopService.listShopSimpleVoByIds(joinedString).getData();
            MgtBaseBathDto mgtBaseBathDto = new MgtBaseBathDto();
            mgtBaseBathDto.setIds(joinedString);
            List<MgtSimpleShopVo> simpleShopVoList = remoteShopService.listShopSimpleVoByIds(mgtBaseBathDto).getData();
            // 将MgtSimpleShopVoList转换为Map<Long, MgtSimpleShopVo>,以便后续根据shopId获取对应的MgtSimpleShopVo
            Map<Long, MgtSimpleShopVo> map = simpleShopVoList.stream()
                    .collect(Collectors.toMap(MgtSimpleShopVo::getShopId, Function.identity()));
@@ -1043,16 +1045,22 @@
            String shopJoinedString = String.join(",", shopIdSet.stream().map(Object::toString).collect(Collectors.toList()));
            String userJoinedString = String.join(",", userIdSet.stream().map(Object::toString).collect(Collectors.toList()));
            // 从远程服务获取店铺和用户信息
            List<MgtSimpleShopVo> simpleShopVoList = remoteShopService.listShopSimpleVoByIds(shopJoinedString).getData();
            MgtBaseBathDto mgtBaseBathDto = new MgtBaseBathDto();
            mgtBaseBathDto.setIds(shopJoinedString);
            List<MgtSimpleShopVo> simpleShopVoList = remoteShopService.listShopSimpleVoByIds(mgtBaseBathDto).getData();
            Map<Long, MgtSimpleShopVo> shopMap = simpleShopVoList.stream()
                    .collect(Collectors.toMap(MgtSimpleShopVo::getShopId, Function.identity()));
            List<MgtSimpleMemberVo> simpleMemberVoList = remoteMemberService.listSimpleVoByIds(userJoinedString).getData();
            mgtBaseBathDto = new MgtBaseBathDto();
            mgtBaseBathDto.setIds(userJoinedString);
            List<MgtSimpleMemberVo> simpleMemberVoList = remoteMemberService.listSimpleVoByIds(mgtBaseBathDto).getData();
            Map<Long, MgtSimpleMemberVo> userMap = simpleMemberVoList.stream()
                    .collect(Collectors.toMap(MgtSimpleMemberVo::getUserId, Function.identity()));
            // 遍历列表,设置店铺名称、用户名称和未支付金额
            for (MgtActivityOrderPageVo mgtActivityOrderPageVo : activityOrderPageVoList) {
                mgtActivityOrderPageVo.setShopName(shopMap.get(mgtActivityOrderPageVo.getShopId()).getShopName());
                mgtActivityOrderPageVo.setUserName(userMap.get(mgtActivityOrderPageVo.getUserId()).getUserName());
                if(userMap.get(mgtActivityOrderPageVo.getUserId())!=null){
                    mgtActivityOrderPageVo.setUserName(userMap.get(mgtActivityOrderPageVo.getUserId()).getNickName());
                }
                BigDecimal unPaidMoney = mgtActivityOrderPageVo.getReceivableMoney().subtract(mgtActivityOrderPageVo.getPayMoney());
                mgtActivityOrderPageVo.setUnPaidMoney(unPaidMoney == null ? zeroBig : unPaidMoney);
            }
@@ -1149,20 +1157,35 @@
                shopIdSet.add(mgtShopOrderPageVo.getShopId());
                userIdSet.add(mgtShopOrderPageVo.getUserId());
            }
            // 将店铺 ID 和用户 ID 转换为逗号分隔的字符串
            String shopJoinedString = String.join(",", shopIdSet.stream().map(Object::toString).collect(Collectors.toList()));
            String userJoinedString = String.join(",", userIdSet.stream().map(Object::toString).collect(Collectors.toList()));
            // 从远程服务获取店铺和用户信息
            List<MgtSimpleShopVo> simpleShopVoList = remoteShopService.listShopSimpleVoByIds(shopJoinedString).getData();
            Map<Long, MgtSimpleShopVo> shopMap = simpleShopVoList.stream()
                    .collect(Collectors.toMap(MgtSimpleShopVo::getShopId, Function.identity()));
            List<MgtSimpleMemberVo> simpleMemberVoList = remoteMemberService.listSimpleVoByIds(userJoinedString).getData();
            Map<Long, MgtSimpleMemberVo> userMap = simpleMemberVoList.stream()
                    .collect(Collectors.toMap(MgtSimpleMemberVo::getUserId, Function.identity()));
            Map<Long, MgtSimpleShopVo> shopMap = null;
            Map<Long, MgtSimpleMemberVo> userMap = null;
            if(shopIdSet!=null&&!shopIdSet.isEmpty()){
                String shopJoinedString = String.join(",", shopIdSet.stream().map(Object::toString).collect(Collectors.toList()));
                MgtBaseBathDto mgtBaseBathDto = new MgtBaseBathDto();
                mgtBaseBathDto.setIds(shopJoinedString);
                List<MgtSimpleShopVo> simpleShopVoList = remoteShopService.listShopSimpleVoByIds(mgtBaseBathDto).getData();
                shopMap = simpleShopVoList.stream()
                        .collect(Collectors.toMap(MgtSimpleShopVo::getShopId, Function.identity()));
            }
            if(userIdSet!=null&&!userIdSet.isEmpty()){
                String userJoinedString = String.join(",", userIdSet.stream().map(Object::toString).collect(Collectors.toList()));
                MgtBaseBathDto mgtBaseBathDto = new MgtBaseBathDto();
                mgtBaseBathDto.setIds(userJoinedString);
                List<MgtSimpleMemberVo> simpleMemberVoList = remoteMemberService.listSimpleVoByIds(mgtBaseBathDto).getData();
                userMap = simpleMemberVoList.stream()
                        .collect(Collectors.toMap(MgtSimpleMemberVo::getUserId, Function.identity()));
            }
            // 遍历列表,设置店铺名称、用户名称和未支付金额
            for (MgtShopOrderPageVo mgtShopOrderPageVo : shopOrderPageVoList) {
                mgtShopOrderPageVo.setShopName(shopMap.get(mgtShopOrderPageVo.getShopId()).getShopName());
                mgtShopOrderPageVo.setUserName(userMap.get(mgtShopOrderPageVo.getUserId()).getUserName());
                if(shopMap!=null&&!shopMap.isEmpty()){
                    mgtShopOrderPageVo.setShopName(shopMap.get(mgtShopOrderPageVo.getShopId()).getShopName());
                }
                if(userMap!=null&&!userMap.isEmpty()){
                    if(userMap.get(mgtShopOrderPageVo.getUserId())!=null){
                        mgtShopOrderPageVo.setUserName(userMap.get(mgtShopOrderPageVo.getUserId()).getNickName());
                    }
                }
                BigDecimal unPaidMoney = mgtShopOrderPageVo.getReceivableMoney().subtract(mgtShopOrderPageVo.getPayMoney());
                mgtShopOrderPageVo.setUnPaidMoney(unPaidMoney == null ? zeroBig : unPaidMoney);
            }
@@ -1348,4 +1371,102 @@
        }
        return mgtTotalOrderTotalVo;
    }
    /**
     * @description
     * @author  jqs
     * @date    2023/6/20 9:27
     * @param mgtBaseShopDto
     * @return  MgtTotalActivityTotalVo
     */
    @Override
    public MgtTotalActivityTotalVo getTotalActivityTotal(MgtBaseShopDto mgtBaseShopDto){
        //获取基础统计
        MgtTotalActivityTotalVo totalActivityTotalVo = orderMapper.getTotalActivityTotal(mgtBaseShopDto);
        //获取商品分类销售数据
        List<MgtMapTotalVo> mgtMapTotalVoGoodsType = orderMapper.listTotalActivityTotalGoodsType(mgtBaseShopDto);
        if (mgtMapTotalVoGoodsType != null && mgtMapTotalVoGoodsType.size() > 0) {
            String[] goodsTypeKey = new String[mgtMapTotalVoGoodsType.size()];
            Integer[] goodsTypeTotalValue = new Integer[mgtMapTotalVoGoodsType.size()];
            BigDecimal[] goodsTypeMoneyValue = new BigDecimal[mgtMapTotalVoGoodsType.size()];
            // 遍历不同商品类型的会员数列表,设置商品类型数组和对应的会员数数组
            for (int i = 0; i < mgtMapTotalVoGoodsType.size(); i++) {
                goodsTypeTotalValue[i] = mgtMapTotalVoGoodsType.get(i).getMapValueFirst();
                goodsTypeMoneyValue[i] = mgtMapTotalVoGoodsType.get(i).getMapValueSecond();
                if(mgtMapTotalVoGoodsType.get(i).getMapKey().equals("1")){
                    goodsTypeKey[i] = "周期";
                    totalActivityTotalVo.setCycleTotal(mgtMapTotalVoGoodsType.get(i).getMapValueFirst());
                    totalActivityTotalVo.setCycleMoney(mgtMapTotalVoGoodsType.get(i).getMapValueSecond());
                    totalActivityTotalVo.setCyclePerson(mgtMapTotalVoGoodsType.get(i).getMapValueThird());
                }else if(mgtMapTotalVoGoodsType.get(i).getMapKey().equals("2")){
                    goodsTypeKey[i] = "服务";
                    totalActivityTotalVo.setServiceTotal(mgtMapTotalVoGoodsType.get(i).getMapValueFirst());
                    totalActivityTotalVo.setServiceMoney(mgtMapTotalVoGoodsType.get(i).getMapValueSecond());
                    totalActivityTotalVo.setServicePerson(mgtMapTotalVoGoodsType.get(i).getMapValueThird());
                }else if(mgtMapTotalVoGoodsType.get(i).getMapKey().equals("3")){
                    goodsTypeKey[i] = "体验";
                    totalActivityTotalVo.setExperienceTotal(mgtMapTotalVoGoodsType.get(i).getMapValueFirst());
                    totalActivityTotalVo.setExperienceMoney(mgtMapTotalVoGoodsType.get(i).getMapValueSecond());
                    totalActivityTotalVo.setExperiencePerson(mgtMapTotalVoGoodsType.get(i).getMapValueThird());
                }else if(mgtMapTotalVoGoodsType.get(i).getMapKey().equals("4")){
                    goodsTypeKey[i] = "单品";
                }
            }
            totalActivityTotalVo.setGoodsTypeKey(goodsTypeKey);
            totalActivityTotalVo.setGoodsTypeTotalValue(goodsTypeTotalValue);
            totalActivityTotalVo.setGoodsTypeMoneyValue(goodsTypeMoneyValue);
        }
        //获取订单分布
        List<MgtMapTotalVo> mgtMapTotalVos = orderMapper.listTotalActivityTotal(mgtBaseShopDto);
        if (mgtMapTotalVos != null && mgtMapTotalVos.size() > 0) {
            String[] orderTotalKey = new String[mgtMapTotalVos.size()];
            Integer[] orderTotalValue = new Integer[mgtMapTotalVos.size()];
            BigDecimal[] orderMoneyValue = new BigDecimal[mgtMapTotalVos.size()];
            for (int i = 0; i < mgtMapTotalVos.size(); i++) {
                orderTotalKey[i] = mgtMapTotalVos.get(i).getMapKey();
                orderTotalValue[i] = mgtMapTotalVos.get(i).getMapValueFirst();
                orderMoneyValue[i] = mgtMapTotalVos.get(i).getMapValueSecond();
            }
            totalActivityTotalVo.setOrderTotalKey(orderTotalKey);
            totalActivityTotalVo.setOrderTotalValue(orderTotalValue);
            totalActivityTotalVo.setOrderMoneyValue(orderMoneyValue);
        }
        return totalActivityTotalVo;
    }
    /**
     * @description
     * @author  jqs
     * @date    2023/6/20 9:56
     * @param mgtActivityAgeDto
     * @return  MgtTotalActivityTotalVo
     */
    @Override
    public MgtTotalActivityTotalVo getTotalActivityAgeRank(MgtActivityAgeDto mgtActivityAgeDto){
        List<Long> userIds = orderMapper.getUserIdAgeRank(mgtActivityAgeDto);
        mgtActivityAgeDto.setUserIds(userIds);
        userIds = remoteMemberService.listUserIdByAge(mgtActivityAgeDto).getData();
        mgtActivityAgeDto.setUserIds(userIds);
        MgtTotalActivityTotalVo totalActivityTotalVo = orderMapper.getTotalActivityAgeRank(mgtActivityAgeDto);
        return totalActivityTotalVo;
    }
    /**
     * @description
     * @author  jqs
     * @date    2023/6/20 15:31
     * @param mgtBaseShopDto
     * @return  MgtTotalDataTotalVo
     */
    @Override
    public MgtTotalDataTotalVo getTotalDataTotal(MgtBaseShopDto mgtBaseShopDto){
        //获取人数统计
        MgtTotalDataTotalVo mgtTotalDataTotalVo = orderMapper.getTotalDataTotal(mgtBaseShopDto);
        Integer reorderPerson = orderMapper.getReorderPerson(mgtBaseShopDto);
        mgtTotalDataTotalVo.setReorderPerson(reorderPerson);
        Integer returnedPerson = orderMapper.getReturnedPerson(mgtBaseShopDto);
        mgtTotalDataTotalVo.setReturnedPerson(returnedPerson);
        return mgtTotalDataTotalVo;
    }
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java
@@ -6,6 +6,7 @@
import com.ruoyi.order.domain.pojo.order.Order;
import com.ruoyi.order.domain.vo.*;
import com.ruoyi.system.api.domain.dto.AppBaseGetDto;
import com.ruoyi.system.api.domain.dto.MgtActivityAgeDto;
import com.ruoyi.system.api.domain.dto.MgtBaseShopDto;
import com.ruoyi.system.api.domain.vo.AppOrderTotalVo;
import com.ruoyi.system.api.domain.vo.MerHomeShopTotalVo;
@@ -195,4 +196,32 @@
    * @date 2023/6/19 22:23
    */
    MgtTotalOrderTotalVo getTotalOrderTotal(MgtBaseShopDto mgtBaseShopDto);
    /**
     * @description
     * @author  jqs
     * @date    2023/6/20 9:28
     * @param mgtBaseShopDto
     * @return  MgtTotalActivityTotalVo
     */
    MgtTotalActivityTotalVo getTotalActivityTotal(MgtBaseShopDto mgtBaseShopDto);
    /**
     * @description
     * @author  jqs
     * @date    2023/6/20 9:57
     * @param mgtActivityAgeDto
     * @return  MgtTotalActivityTotalVo
     */
    MgtTotalActivityTotalVo getTotalActivityAgeRank(MgtActivityAgeDto mgtActivityAgeDto);
    /**
     * @description
     * @author  jqs
     * @date    2023/6/20 15:50
     * @param mgtBaseShopDto
     * @return  MgtTotalDataTotalVo
     */
    MgtTotalDataTotalVo getTotalDataTotal(MgtBaseShopDto mgtBaseShopDto);
}
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml
@@ -418,9 +418,9 @@
            toc.user_id userId,
            toc.activity_name activityName,
            tog.goods_name goodsName,
            tog.goods_price activityPrice,
            tog.buy_num buyNum,
            toc.order_money orderMoney,
            toc.discount_money discountMoney,
            toc.receivable_money receivableMoney,
            toc.create_time createTime,
            toc.pay_money payMoney,
@@ -439,10 +439,10 @@
            AND toc.shop_id = #{param.shopId}
        </if>
        <if test="param.shopIds != null and param.shopIds != ''">
            AND toc.shop_id IN (#{param.shopIds})
            AND FIND_IN_SET(toc.shop_id, #{param.shopIds}) &gt; 0
        </if>
        <if test="param.keyword != null and param.keyword != ''">
            AND (toc.order_no LIKE CONCAT('%',#{param.keyword},'%') OR toc.activity_name LIKE CONCAT('%',#{param.keyword},'%') OR toc.user_id IN (#{param.userIds}))
            AND (toc.order_no LIKE CONCAT('%',#{param.keyword},'%') OR toc.activity_name LIKE CONCAT('%',#{param.keyword},'%') OR FIND_IN_SET(toc.user_id, #{param.userIds}) &gt; 0)
        </if>
        <if test="param.verifyStartTime != null and param.verifyStartTime != ''">
            AND toc.use_time &gt;= #{param.verifyStartTime}
@@ -479,10 +479,10 @@
            AND toc.shop_id = #{param.shopId}
        </if>
        <if test="param.shopIds != null and param.shopIds != ''">
            AND toc.shop_id IN (#{param.shopIds})
            AND FIND_IN_SET(toc.shop_id, #{param.shopIds}) &gt; 0
        </if>
        <if test="param.keyword != null and param.keyword != ''">
            AND (toc.order_no LIKE CONCAT('%',#{param.keyword},'%') OR toc.activity_name LIKE CONCAT('%',#{param.keyword},'%') OR toc.user_id IN (#{param.userIds}))
            AND (toc.order_no LIKE CONCAT('%',#{param.keyword},'%') OR toc.activity_name LIKE CONCAT('%',#{param.keyword},'%') OR FIND_IN_SET(toc.user_id, #{param.userIds}) &gt; 0)
        </if>
        <if test="param.verifyStartTime != null and param.verifyStartTime != ''">
            AND toc.use_time &gt;= #{param.verifyStartTime}
@@ -512,10 +512,10 @@
            AND toc.shop_id = #{param.shopId}
        </if>
        <if test="param.shopIds != null and param.shopIds != ''">
            AND toc.shop_id IN (#{param.shopIds})
            AND FIND_IN_SET(toc.shop_id, #{param.shopIds}) &gt; 0
        </if>
        <if test="param.keyword != null and param.keyword != ''">
            AND (toc.order_no LIKE CONCAT('%',#{param.keyword},'%') OR toc.activity_name LIKE CONCAT('%',#{param.keyword},'%') OR toc.user_id IN (#{param.userIds}))
            AND (toc.order_no LIKE CONCAT('%',#{param.keyword},'%') OR toc.activity_name LIKE CONCAT('%',#{param.keyword},'%') OR FIND_IN_SET(toc.user_id, #{param.userIds}) &gt; 0)
        </if>
        <if test="param.verifyStartTime != null and param.verifyStartTime != ''">
            AND toc.use_time &gt;= #{param.verifyStartTime}
@@ -551,10 +551,10 @@
            AND toc.shop_id = #{param.shopId}
        </if>
        <if test="param.shopIds != null and param.shopIds != ''">
            AND toc.shop_id IN (#{param.shopIds})
            AND FIND_IN_SET(toc.shop_id, #{param.shopIds}) &gt; 0
        </if>
        <if test="param.keyword != null and param.keyword != ''">
            AND (toc.order_no LIKE CONCAT('%',#{param.keyword},'%') OR toc.activity_name LIKE CONCAT('%',#{param.keyword},'%') OR toc.user_id IN (#{param.userIds}))
            AND (toc.order_no LIKE CONCAT('%',#{param.keyword},'%') OR toc.activity_name LIKE CONCAT('%',#{param.keyword},'%') OR FIND_IN_SET(toc.user_id, #{param.userIds}) &gt; 0)
        </if>
        <if test="param.verifyStartTime != null and param.verifyStartTime != ''">
            AND toc.use_time &gt;= #{param.verifyStartTime}
@@ -573,10 +573,11 @@
        tog.goods_name goodsName,
        tog.buy_num buyNum,
        toc.order_money orderMoney,
        toc.discount_money discountMoney,
        toc.receivable_money receivableMoney,
        toc.create_time createTime,
        toc.pay_money payMoney,
        toc.shop_id shopName,
        toc.shop_id shopId,
        toc.use_time verifyTime,
        CASE toc.order_from WHEN 1 THEN '小程序' WHEN 3 THEN '线下创建' END orderFrom
        FROM t_order toc
@@ -592,10 +593,10 @@
            AND toc.shop_id = #{param.shopId}
        </if>
        <if test="param.shopIds != null and param.shopIds != ''">
            AND toc.shop_id IN (#{param.shopIds})
            AND FIND_IN_SET(toc.shop_id, #{param.shopIds}) &gt; 0
        </if>
        <if test="param.keyword != null and param.keyword != ''">
            AND (toc.order_no LIKE CONCAT('%',#{param.keyword},'%') OR toc.activity_name LIKE CONCAT('%',#{param.keyword},'%') OR toc.user_id IN (#{param.userIds}))
            AND (toc.order_no LIKE CONCAT('%',#{param.keyword},'%') OR toc.activity_name LIKE CONCAT('%',#{param.keyword},'%') OR FIND_IN_SET(toc.user_id, #{param.userIds}) &gt; 0)
        </if>
        <if test="param.verifyStartTime != null and param.verifyStartTime != ''">
            AND toc.use_time &gt;= #{param.verifyStartTime}
@@ -736,4 +737,140 @@
        GROUP BY toc.order_from
        ORDER BY SUM(toc.order_money) DESC LIMIT 10
    </select>
    <select id="getTotalActivityTotal" resultType="com.ruoyi.order.domain.vo.MgtTotalActivityTotalVo">
        SELECT
        COUNT(order_id) orderTotal,
        IFNULL(SUM(order_money),0) orderMoney,
        COUNT(DISTINCT user_id) orderPerson
        FROM t_order WHERE del_flag = 0 AND order_from = 2
        <if test="param.shopId != null and param.shopId != ''">
            AND shop_id = #{param.shopId}
        </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="listTotalActivityTotalGoodsType" resultType="com.ruoyi.order.domain.vo.MgtMapTotalVo">
        SELECT
        tog.goods_type mapKey,
        COUNT(DISTINCT toc.order_id) AS mapValueFirst,
        IFNULL(SUM(tog.goods_total_money),0) AS mapValueSecond,
        COUNT(DISTINCT toc.user_id) AS mapValueThird,
        FROM
        t_order toc
        INNER JOIN t_order_goods tog ON tog.order_id = toc.order_id
        WHERE toc.del_flag = 0 AND order_from = 2
        <if test="param.shopId != null and param.shopId != ''">
            AND toc.shop_id = #{param.shopId}
        </if>
        GROUP BY tog.goods_type
    </select>
    <select id="listTotalActivityTotal" resultType="com.ruoyi.order.domain.vo.MgtMapTotalVo">
        SELECT
        DATE_FORMAT(create_time, '%Y-%m-%d') AS mapKey,
        COUNT(DISTINCT toc.user_id) AS mapValueFirst
        FROM
        t_order
        WHERE
        del_flag = 0 AND order_from = 2
        AND create_time >= DATE_SUB(CURDATE(), INTERVAL 6 DAY)
        <if test="param.shopId != null and param.shopId != ''">
            AND shop_id = #{param.shopId}
        </if>
        <if test="param.userIds != null">
            AND user_id IN
            <foreach collection="list" item="item" open="(" separator="," close=")">
                #{param.userIds}
            </foreach>
        </if>
        GROUP BY
        order_date
        ORDER BY
        order_date ASC
    </select>
    <select id="getUserIdAgeRank" resultType="java.lang.Long">
        SELECT
        DISTINCT user_id
        FROM
        t_order
        WHERE
        del_flag = 0 AND order_from = 2
        AND create_time >= DATE_SUB(CURDATE(), INTERVAL 6 DAY)
        <if test="param.shopId != null and param.shopId != ''">
            AND shop_id = #{param.shopId}
        </if>
    </select>
    <select id="getTotalDataTotal" resultType="com.ruoyi.order.domain.vo.MgtTotalDataTotalVo">
        SELECT
            COUNT(DISTINCT CASE WHEN goods_type_1_count > 0 AND goods_type_3_count = 0 THEN user_id ELSE NULL END) AS onlyCyclePerson,
            COUNT(DISTINCT CASE WHEN goods_type_1_count = 0 AND goods_type_3_count > 0 THEN user_id ELSE NULL END) AS onlyExperiencePerson,
            COUNT(DISTINCT CASE WHEN goods_type_1_count > 0 AND goods_type_3_count > 0 THEN user_id ELSE NULL END) AS experienceCyclePerson,
            COUNT(DISTINCT CASE WHEN goods_type_1_count > 0 THEN user_id ELSE NULL END) AS cyclePerson,
            COUNT(DISTINCT CASE WHEN goods_type_4_count > 0 THEN user_id ELSE NULL END) AS goodsPerson,
            SUM(goods_type_4_count) AS goodsNumber,
            COUNT(DISTINCT CASE WHEN goods_type_1_count > 0 AND goods_type_2_count > 0 AND goods_type_3_count > 0 AND goods_type_4_count > 0 THEN user_id ELSE NULL END) AS orderPerson
        FROM (
                 SELECT
                     o.user_id,
                     COUNT(DISTINCT CASE WHEN og.goods_type = 1 THEN og.goods_id ELSE NULL END) AS goods_type_1_count,
                     COUNT(DISTINCT CASE WHEN og.goods_type = 2 THEN og.goods_id ELSE NULL END) AS goods_type_2_count,
                     COUNT(DISTINCT CASE WHEN og.goods_type = 3 THEN og.goods_id ELSE NULL END) AS goods_type_3_count,
                     COUNT(DISTINCT CASE WHEN og.goods_type = 4 THEN og.goods_id ELSE NULL END) AS goods_type_4_count
                 FROM t_order o
                          JOIN t_order_goods og ON o.order_id = og.order_id
                 WHERE o.del_flag = 0 AND og.del_flag = 0
                <if test="param.shopId != null and param.shopId != ''">
                    AND o.shop_id = #{param.shopId}
                </if>
                <if test="param.startDate!=null and param.startDate!=''">
                    AND o.create_time &gt;= #{param.startDate}
                </if>
                <if test="param.endDate!=null and param.endDate!=''">
                    AND o.create_time &lt;= #{param.endDate}
                </if>
                 GROUP BY o.user_id
             ) AS user_goods_type_counts
    </select>
    <select id="getReorderPerson" resultType="java.lang.Integer">
        SELECT COUNT(DISTINCT user_id)
        FROM (SELECT t1.user_id, t1.pay_time, t2.pay_time as last_pay_time
        FROM t_order t1
        INNER JOIN (SELECT toc.user_id, toc.pay_time
        FROM t_order toc
        INNER JOIN t_order_goods tog ON toc.order_id = tog.order_id
        WHERE toc.del_flag = 0 AND tog.goods_type = 1
        <if test="param.shopId != null and param.shopId != ''">
            AND toc.shop_id = #{param.shopId}
        </if>
        ORDER BY toc.pay_time DESC LIMIT 2) t2
        ON t1.user_id = t2.user_id AND t1.pay_time &lt; t2.pay_time
        WHERE t1.del_flag = 0
        HAVING DATEDIFF(t2.pay_time, t1.pay_time) &lt;= 30) AS temp
    </select>
    <select id="getReturnedPerson" resultType="java.lang.Integer">
        SELECT COUNT(DISTINCT user_id)
        FROM (SELECT t1.user_id, t1.pay_time, t2.pay_time as last_pay_time
        FROM t_order t1
        INNER JOIN (SELECT toc.user_id, toc.pay_time
        FROM t_order toc
        INNER JOIN t_order_goods tog ON toc.order_id = tog.order_id
        WHERE toc.del_flag = 0 AND tog.goods_type = 1
        <if test="param.shopId != null and param.shopId != ''">
            AND toc.shop_id = #{param.shopId}
        </if>
        ORDER BY toc.pay_time DESC LIMIT 2) t2
        ON t1.user_id = t2.user_id AND t1.pay_time &lt; t2.pay_time
        WHERE t1.del_flag = 0
        HAVING DATEDIFF(t2.pay_time, t1.pay_time) &gt; 30) AS temp
    </select>
</mapper>
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/console/ShopController.java
@@ -9,6 +9,7 @@
import com.ruoyi.shop.service.shop.ShopStaffService;
import com.ruoyi.shop.service.shop.ShopSuggestService;
import com.ruoyi.shop.service.task.ShopTaskService;
import com.ruoyi.system.api.domain.dto.MgtBaseBathDto;
import com.ruoyi.system.api.domain.dto.MgtShopIdByCodeDto;
import com.ruoyi.system.api.domain.poji.shop.Shop;
import com.ruoyi.system.api.domain.poji.sys.SysUser;
@@ -134,9 +135,9 @@
    }
    @PostMapping("/listShopSimpleVoByIds")
    public R<List<MgtSimpleShopVo>> listShopSimpleVoByIds(@RequestBody String shopIds)
    public R<List<MgtSimpleShopVo>> listShopSimpleVoByIds(@RequestBody MgtBaseBathDto mgtBaseBathDto)
    {
        List<MgtSimpleShopVo> mgtShopListSimpleVos = shopService.listShopSimpleVoByIds(shopIds);
        List<MgtSimpleShopVo> mgtShopListSimpleVos = shopService.listShopSimpleVoByIds(mgtBaseBathDto.getIds());
        return R.ok(mgtShopListSimpleVos);
    }
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/management/MgtShopController.java
@@ -92,6 +92,15 @@
        return R.ok();
    }
    @RequestMapping(value = "/terminateMgtCooperation", method = RequestMethod.POST)
    @ApiOperation(value = "终止合作")
    public R terminateMgtCooperation(@RequestBody MgtTerminateCooperationDto mgtTerminateCooperationDto) {
        Long userId = SecurityUtils.getUserId();
        mgtTerminateCooperationDto.setUserId(userId);
        shopService.terminateMgtCooperation(mgtTerminateCooperationDto);
        return R.ok();
    }
    @RequestMapping(value = "/changeMgtCooperationTime", method = RequestMethod.POST)
    @ApiOperation(value = "修改合作时间")
    public R changeMgtCooperationTime(@RequestBody MgtChangeCoopDto mgtChangeCoopDto) {
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MgtTerminateCooperationDto.java
New file
@@ -0,0 +1,25 @@
package com.ruoyi.shop.domain.dto;
import com.ruoyi.system.api.domain.dto.MgtBaseDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @ClassName MgtTerminateCooperationDto
 * @Description TODO
 * @Author jqs
 * @Date 2023/6/20 12:41
 * @Version 1.0
 */
@Data
public class MgtTerminateCooperationDto extends MgtBaseDto {
    @ApiModelProperty(value = "商户id")
    private Long shopId;
    @ApiModelProperty("合作状态0终止1开启")
    private Integer cooperativeFlag;
}
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java
@@ -271,6 +271,40 @@
    }
    /**
     * @description  终止合作
     * @author  jqs
     * @date    2023/6/20 12:01
     * @param mgtTerminateCooperationDto
     * @return  void
     */
    @Override
    public void terminateMgtCooperation(MgtTerminateCooperationDto mgtTerminateCooperationDto){
        Shop shop = this.getById(mgtTerminateCooperationDto.getShopId());
        if(mgtTerminateCooperationDto.getCooperativeFlag()==1){
            /*Date coopStartDate = shop.getCooperationStartTime();
            Date coopEndDate = shop.getCooperationEndTime();
            Date nowTime = new Date();
            //判断合作时间 没在时间内不能开启
            if(coopStartDate.compareTo(nowTime)>0&&coopEndDate.compareTo(nowTime)<0){
                 throw new ServiceException(AppErrorConstant.COOPERATION_TIME_ERROR);
            }*/
            shop.setCooperativeFlag(1);
            if(shop.getShopStatus()==2&&shop.getFrozenFlag()==0){
                shop.setShopStatus(1);
            }else if(shop.getShopStatus()==2&&shop.getFrozenFlag()==1){
                shop.setShopStatus(0);
            }
        }else{
            shop.setCooperativeFlag(0);
            shop.setShopStatus(2);
        }
        shop.setUpdateTime(new Date());
        shop.setUpdateUserId(mgtTerminateCooperationDto.getUserId());
        this.saveOrUpdate(shop);
    }
    /**
     * 修改合作时间
     * @param mgtChangeCoopDto
     */
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java
@@ -44,6 +44,15 @@
    void changeCooperationTime(MgtChangeCoopDto mgtChangeCoopDto);
    /**
     * @description  终止合作
     * @author  jqs
     * @date    2023/6/20 12:01
     * @param mgtTerminateCooperationDto
     * @return  void
     */
    void terminateMgtCooperation(MgtTerminateCooperationDto mgtTerminateCooperationDto);
    /**
     * 分页获取商户
     * @param page
     * @param mgtShopPageDto
ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopMapper.xml
@@ -482,7 +482,7 @@
            shop_id,
            shop_name
        FROM t_shop
        WHERE del_flag = 0 AND shop_id IN (#{shopIds})
        WHERE del_flag = 0 AND FIND_IN_SET(shop_id,#{shopIds}) &gt; 0
    </select>
    
    <select id="pageMgtShopByCityCode" resultType="com.ruoyi.system.api.domain.vo.MgtSimpleShopVo">
ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/RecommendCooperationMapper.xml
@@ -44,7 +44,7 @@
    </select>
    <update id="allotRecommend">
        UPDATE t_recommend_cooperation set allot_user_id = #{param.allotUserId} WHERE id IN (#{param.recommendIds})
        UPDATE t_recommend_cooperation set allot_user_id = #{param.allotUserId} WHERE del_flag = 0 AND FIND_IN_SET(id, #{param.recommendIds}) &gt; 0
    </update>
    <select id="customTotal" resultType="java.lang.Integer">