From f0acb97e91f456c9b402977416e73951b708a157 Mon Sep 17 00:00:00 2001 From: jiangqs <343695869@qq.com> Date: 星期一, 19 六月 2023 23:23:23 +0800 Subject: [PATCH] 营销统计 --- ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MgtTotalMemberTotalVo.java | 30 ++ ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml | 121 ++++++++++ ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java | 87 ++++++ ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtTotalOrderTotalVo.java | 89 +++++++ ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java | 10 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java | 84 +++++++ ruoyi-modules/ruoyi-system/src/main/resources/mapper/sys/SysUserMapper.xml | 2 ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml | 80 ++++++ /dev/null | 22 - ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/management/MgtTotalController.java | 41 +++ ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MgtMapTotalVo.java | 22 + ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/order/OrderMapper.java | 56 ++++ ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/member/MemberMapper.java | 44 +++ ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtMapTotalVo.java | 27 ++ 14 files changed, 684 insertions(+), 31 deletions(-) diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MgtMapTotalVo.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MgtMapTotalVo.java new file mode 100644 index 0000000..5690d81 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MgtMapTotalVo.java @@ -0,0 +1,22 @@ +package com.ruoyi.member.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @ClassName MgtNurseTotalVo + * @Description TODO + * @Author jqs + * @Date 2023/6/19 18:06 + * @Version 1.0 + */ +@Data +public class MgtMapTotalVo { + + @ApiModelProperty(value = "mapKey") + private String mapKey; + + @ApiModelProperty(value = "mapValue") + private Integer mapValue; + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MgtNurseTotalVo.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MgtNurseTotalVo.java deleted file mode 100644 index 57f7816..0000000 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MgtNurseTotalVo.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.ruoyi.member.domain.vo; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * @ClassName MgtNurseTotalVo - * @Description TODO - * @Author jqs - * @Date 2023/6/19 18:06 - * @Version 1.0 - */ -@Data -public class MgtNurseTotalVo { - - @ApiModelProperty(value = "调理问题") - private String nurse; - - @ApiModelProperty(value = "人数") - private Integer userCount; - -} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MgtTotalMemberTotalVo.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MgtTotalMemberTotalVo.java index a227cbd..c818cc4 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MgtTotalMemberTotalVo.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MgtTotalMemberTotalVo.java @@ -45,4 +45,34 @@ @ApiModelProperty(value = "会员年龄value") private Integer[] ageValue; + + @ApiModelProperty(value = "会员年龄key") + private String[] nurseKey; + + @ApiModelProperty(value = "会员年龄value") + private Integer[] nurseValue; + + @ApiModelProperty(value = "商品类型key") + private String[] goodsTypeKey; + + @ApiModelProperty(value = "商品类型value") + private Integer[] goodsTypeValue; + + @ApiModelProperty(value = "活跃度key") + private String[] activenessKey; + + @ApiModelProperty(value = "活跃度value") + private Integer[] activenessValue; + + @ApiModelProperty(value = "消费排行key") + private String[] orderRankKey; + + @ApiModelProperty(value = "消费排行value") + private Integer[] orderRankValue; + + @ApiModelProperty(value = "来源排行key") + private String[] customerSourceKey; + + @ApiModelProperty(value = "来源排行value") + private Integer[] customerSourceValue; } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/member/MemberMapper.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/member/MemberMapper.java index be6d804..25b131b 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/member/MemberMapper.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/member/MemberMapper.java @@ -156,7 +156,49 @@ * @param * @return MgtTotalMemberTotalVo */ - List<MgtNurseTotalVo> getTotalMemberTotalNurse(@Param("param") MgtBaseShopDto mgtBaseShopDto); + List<MgtMapTotalVo> getTotalMemberTotalNurse(@Param("param") MgtBaseShopDto mgtBaseShopDto); + + + /** + * @description 会员人数统计 + * @author jqs + * @date 2023/6/19 15:26 + * @param + * @return MgtTotalMemberTotalVo + */ + List<MgtMapTotalVo> getTotalMemberTotalGoodsType(@Param("param") MgtBaseShopDto mgtBaseShopDto); + + /** + * @description getTotalMemberTotalActiveness + * @param shopId + * @param actStartDate + * @param actEndDate + * @return Integer + * @author jqs34 + * @date 2023/6/19 21:24 + */ + Integer getTotalMemberTotalActiveness(@Param("shopId") Long shopId,@Param("actStartDate") String actStartDate,@Param("actEndDate") String actEndDate); + + /** + * @description 会员人数统计 + * @author jqs + * @date 2023/6/19 15:26 + * @param + * @return MgtTotalMemberTotalVo + */ + List<MgtMapTotalVo> getTotalMemberRankPay(@Param("param") MgtBaseShopDto mgtBaseShopDto); + + + /** + * @description 会员人数统计 + * @author jqs + * @date 2023/6/19 15:26 + * @param + * @return MgtTotalMemberTotalVo + */ + List<MgtMapTotalVo> getTotalMemberRankCustomerSource(@Param("param") MgtBaseShopDto mgtBaseShopDto); + + } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java index 302bf90..15affd3 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java @@ -955,14 +955,93 @@ */ @Override public MgtTotalMemberTotalVo getTotalMemberTotal(MgtBaseShopDto mgtBaseShopDto){ + Date nowDay = DateUtils.getNowDate(); + // 获取店铺ID + Long shopId = mgtBaseShopDto.getShopId(); + // 获取总会员数和不同年龄段的会员数 MgtTotalMemberTotalVo mgtTotalMemberTotalVo = memberMapper.getTotalMemberTotal(mgtBaseShopDto); MgtAgeTotalVo mgtAgeTotalVo = memberMapper.getTotalMemberTotalAge(mgtBaseShopDto); - String[] ageKey = {"<20","21-30","31-40","41-50",">50"}; - Integer[] ageValue = {mgtAgeTotalVo.getTenAge(),mgtAgeTotalVo.getTwentyAge(),mgtAgeTotalVo.getThirtyAge(),mgtAgeTotalVo.getFortyAge(),mgtAgeTotalVo.getFiftyAge()}; + // 年龄段数组 + String[] ageKey = {"<20", "21-30", "31-40", "41-50", ">50"}; + // 不同年龄段的会员数数组 + Integer[] ageValue = {mgtAgeTotalVo.getTenAge(), mgtAgeTotalVo.getTwentyAge(), mgtAgeTotalVo.getThirtyAge(), mgtAgeTotalVo.getFortyAge(), mgtAgeTotalVo.getFiftyAge()}; + // 设置年龄段数组和不同年龄段的会员数数组 mgtTotalMemberTotalVo.setAgeKey(ageKey); mgtTotalMemberTotalVo.setAgeValue(ageValue); - List<MgtNurseTotalVo> nurseTotalVos = memberMapper.getTotalMemberTotalNurse(mgtBaseShopDto); - + // 获取不同护理类型的会员数 + List<MgtMapTotalVo> nurseTotalVos = memberMapper.getTotalMemberTotalNurse(mgtBaseShopDto); + if (nurseTotalVos != null && nurseTotalVos.size() > 0) { + String[] nurseKey = new String[nurseTotalVos.size()]; + Integer[] nurseValue = new Integer[nurseTotalVos.size()]; + // 遍历不同护理类型的会员数列表,设置护理类型数组和对应的会员数数组 + for (int i = 0; i < nurseTotalVos.size(); i++) { + nurseKey[i] = nurseTotalVos.get(i).getMapKey(); + nurseValue[i] = nurseTotalVos.get(i).getMapValue(); + } + mgtTotalMemberTotalVo.setNurseKey(nurseKey); + mgtTotalMemberTotalVo.setNurseValue(nurseValue); + } + // 获取不同商品类型的会员数 + List<MgtMapTotalVo> goodsTypeTotalVos = memberMapper.getTotalMemberTotalGoodsType(mgtBaseShopDto); + if (goodsTypeTotalVos != null && goodsTypeTotalVos.size() > 0) { + String[] goodsTypeKey = new String[goodsTypeTotalVos.size()]; + Integer[] goodsTypeValue = new Integer[goodsTypeTotalVos.size()]; + // 遍历不同商品类型的会员数列表,设置商品类型数组和对应的会员数数组 + for (int i = 0; i < goodsTypeTotalVos.size(); i++) { + goodsTypeKey[i] = goodsTypeTotalVos.get(i).getMapKey(); + goodsTypeValue[i] = goodsTypeTotalVos.get(i).getMapValue(); + } + mgtTotalMemberTotalVo.setGoodsTypeKey(goodsTypeKey); + mgtTotalMemberTotalVo.setGoodsTypeValue(goodsTypeValue); + } + // 获取不同活跃度的会员数 + List<Activeness> activenessList = remoteConfigService.listActiveness().getData(); + if (activenessList != null && !activenessList.isEmpty()) { + String[] activenessKey = new String[activenessList.size()]; + Integer[] activenessValue = new Integer[activenessList.size()]; + Activeness activeness; + String actStartDate; + String actEndDate; + Integer count; + // 遍历不同活跃度列表,设置活跃度数组和对应的会员数数组 + 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())); + count = memberMapper.getTotalMemberTotalActiveness(shopId, actStartDate, actEndDate); + activenessKey[i] = activeness.getActivenessName(); + activenessValue[i] = count; + } + mgtTotalMemberTotalVo.setActivenessKey(activenessKey); + mgtTotalMemberTotalVo.setActivenessValue(activenessValue); + } + //获取会员消费排名 + List<MgtMapTotalVo> memberPayList = memberMapper.getTotalMemberRankPay(mgtBaseShopDto); + if (memberPayList != null && memberPayList.size() > 0) { + String[] memberPayKey = new String[memberPayList.size()]; + Integer[] memberPayValue = new Integer[memberPayList.size()]; + // 遍历不同商品类型的会员数列表,设置商品类型数组和对应的会员数数组 + for (int i = 0; i < memberPayList.size(); i++) { + memberPayKey[i] = memberPayList.get(i).getMapKey(); + memberPayValue[i] = memberPayList.get(i).getMapValue(); + } + mgtTotalMemberTotalVo.setOrderRankKey(memberPayKey); + mgtTotalMemberTotalVo.setOrderRankValue(memberPayValue); + } + //获取来源渠道排名 + List<MgtMapTotalVo> customerSourceList = memberMapper.getTotalMemberRankCustomerSource(mgtBaseShopDto); + if (customerSourceList != null && customerSourceList.size() > 0) { + String[] customerSourceKey = new String[customerSourceList.size()]; + Integer[] customerSourceValue = new Integer[customerSourceList.size()]; + // 遍历不同商品类型的会员数列表,设置商品类型数组和对应的会员数数组 + for (int i = 0; i < customerSourceList.size(); i++) { + customerSourceKey[i] = customerSourceList.get(i).getMapKey(); + customerSourceValue[i] = customerSourceList.get(i).getMapValue(); + } + mgtTotalMemberTotalVo.setCustomerSourceKey(customerSourceKey); + mgtTotalMemberTotalVo.setCustomerSourceValue(customerSourceValue); + } + // 返回总会员数和不同类型会员数的统计结果 return mgtTotalMemberTotalVo; } } diff --git a/ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml b/ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml index 3f67897..97a85f3 100644 --- a/ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml +++ b/ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml @@ -381,10 +381,10 @@ </if> </select> - <select id="getTotalMemberTotalNurse" resultType="com.ruoyi.member.domain.vo.MgtNurseTotalVo"> - SELECT member_nurse nurse, COUNT(*) AS userCount + <select id="getTotalMemberTotalNurse" resultType="com.ruoyi.member.domain.vo.MgtMapTotalVo"> + SELECT member_nurse mapKey, COUNT(*) mapValue FROM ( - SELECT member_id, SUBSTRING_INDEX(SUBSTRING_INDEX(member_nurse, ',', numbers.n), ',', -1) user_tag + 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 != ''"> @@ -401,4 +401,78 @@ GROUP BY member_nurse ORDER BY count DESC; </select> + + <select id="getTotalMemberTotalGoodsType" resultType="com.ruoyi.member.domain.vo.MgtMapTotalVo"> + 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.startDate!=null and param.startDate!=''"> + AND create_time >= #{param.startDate} + </if> + <if test="param.endDate!=null and param.endDate!=''"> + AND create_time <= #{param.endDate} + </if> + ) x + WHERE goods_type != '' + GROUP BY goods_type + ORDER BY count DESC; + </select> + + <select id="getTotalMemberTotalActiveness" 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 del_Flag = 0 + <if test="shopId != null and shopId != ''"> + AND relation_shop_id = #{shopId} + </if> + <if test="actStartDate != null and actStartDate != ''"> + AND tmt.last_pay_time >= #{actStartDate} + </if> + <if test="actEndDate != null and actEndDate != ''"> + AND tmt.last_pay_time <= #{actEndDate} + </if> + </select> + + <select id="getTotalMemberRankPay" resultType="com.ruoyi.member.domain.vo.MgtMapTotalVo"> + SELECT + tm.nick_name mapKey, + tmt.total_pay_count mapValue + FROM t_member tm WHERE del_flag = 0 + INNER JOIN t_member_total tmt ON tm.member_id = tmt.member_id + <if test="param.shopId != null and param.shopId != ''"> + AND tm.relation_shop_id = #{param.shopId} + </if> + <if test="param.startDate!=null and param.startDate!=''"> + AND tm.create_time >= #{param.startDate} + </if> + <if test="param.endDate!=null and param.endDate!=''"> + AND tm.create_time <= #{param.endDate} + </if> + ORDER BY tmt.total_pay_count DESC LIMIT 10 + </select> + + <select id="getTotalMemberRankCustomerSource" resultType="com.ruoyi.member.domain.vo.MgtMapTotalVo"> + SELECT + tm.customer_source mapKey, + SUM(tm.customer_source) mapValue + FROM t_member tm WHERE del_flag = 0 + <if test="param.shopId != null and param.shopId != ''"> + AND tm.relation_shop_id = #{param.shopId} + </if> + <if test="param.startDate!=null and param.startDate!=''"> + AND tm.create_time >= #{param.startDate} + </if> + <if test="param.endDate!=null and param.endDate!=''"> + AND tm.create_time <= #{param.endDate} + </if> + GROUP BY tm.customer_source + ORDER BY SUM(tm.customer_source) DESC LIMIT 10 + </select> </mapper> diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/management/MgtTotalController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/management/MgtTotalController.java new file mode 100644 index 0000000..2fc39ae --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/management/MgtTotalController.java @@ -0,0 +1,41 @@ +package com.ruoyi.order.controller.management; + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.order.domain.vo.MgtTotalOrderTotalVo; +import com.ruoyi.order.service.order.OrderService; +import com.ruoyi.system.api.domain.dto.MgtBaseShopDto; +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; + +/** + * @author jqs34 + * @version 1.0 + * @classname MgtTotalController + * @description: TODO + * @date 2023 2023/6/19 22:18 + */ +@Api(value = "管理台订单统计相关接口", tags = "管理台订单统计相关接口", description = "管理台订单统计相关接口") +@RestController +@RequestMapping("/mgt/total") +public class MgtTotalController { + + @Resource + private OrderService orderService; + + @RequestMapping(value = "/getTotalOrderTotal", method = RequestMethod.POST) + @ApiOperation(value = "获取会员人数统计") + public R<MgtTotalOrderTotalVo> getTotalOrderTotal(@RequestBody MgtBaseShopDto mgtBaseShopDto) { + Long userId = SecurityUtils.getUserId(); + mgtBaseShopDto.setUserId(userId); + MgtTotalOrderTotalVo totalOrderTotalVo = orderService.getTotalOrderTotal(mgtBaseShopDto); + return R.ok(totalOrderTotalVo); + } + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtMapTotalVo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtMapTotalVo.java new file mode 100644 index 0000000..c454cd6 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtMapTotalVo.java @@ -0,0 +1,27 @@ +package com.ruoyi.order.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @ClassName MgtNurseTotalVo + * @Description TODO + * @Author jqs + * @Date 2023/6/19 18:06 + * @Version 1.0 + */ +@Data +public class MgtMapTotalVo { + + @ApiModelProperty(value = "mapKey") + private String mapKey; + + @ApiModelProperty(value = "mapValueFirst") + private Integer mapValueFirst; + + @ApiModelProperty(value = "mapValueSecond") + private BigDecimal mapValueSecond; + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtTotalOrderTotalVo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtTotalOrderTotalVo.java new file mode 100644 index 0000000..9395786 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/vo/MgtTotalOrderTotalVo.java @@ -0,0 +1,89 @@ +package com.ruoyi.order.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author jqs34 + * @version 1.0 + * @classname MgtTotalOrderTotalVo + * @description: TODO + * @date 2023 2023/6/19 21:56 + */ +@Data +public class MgtTotalOrderTotalVo { + + @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; + + @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[] goodsRankKey; + + @ApiModelProperty(value = "商品排行value") + private BigDecimal[] goodsRankValue; + + @ApiModelProperty(value = "来源排行key") + private String[] orderFromRankKey; + + @ApiModelProperty(value = "来源排行value") + private BigDecimal[] orderFromRankValue; +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/order/OrderMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/order/OrderMapper.java index f494453..8f7ae89 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/mapper/order/OrderMapper.java +++ b/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.MgtBaseShopDto; import com.ruoyi.system.api.domain.vo.MgtBulletinBoardVo; import org.apache.ibatis.annotations.Param; @@ -136,4 +137,59 @@ * @date 2023/6/18 17:20 */ MgtBulletinBoardVo boardOrderTotal(); + + /** + * @description getTotalOrderTotal + * @param mgtBaseShopDto + * @return MgtTotalOrderTotalVo + * @author jqs34 + * @date 2023/6/19 22:24 + */ + MgtTotalOrderTotalVo getTotalOrderTotalOrderFrom(@Param("param") MgtBaseShopDto mgtBaseShopDto); + + /** + * @description getTotalOrderTotal + * @param mgtBaseShopDto + * @return MgtTotalOrderTotalVo + * @author jqs34 + * @date 2023/6/19 22:24 + */ + MgtTotalOrderTotalVo getTotalOrderTotalGoodsType(@Param("param") MgtBaseShopDto mgtBaseShopDto); + + /** + * @description getTotalOrderTotal + * @param mgtBaseShopDto + * @return List<MgtMapTotalVo> + * @author jqs34 + * @date 2023/6/19 22:48 + */ + List<MgtMapTotalVo> listTotalOrderTotal(@Param("param") MgtBaseShopDto mgtBaseShopDto); + + /** + * @description getTotalOrderTotal + * @param mgtBaseShopDto + * @return List<MgtMapTotalVo> + * @author jqs34 + * @date 2023/6/19 22:48 + */ + List<MgtMapTotalVo> listTotalOrderTotalGoodsType(@Param("param") MgtBaseShopDto mgtBaseShopDto); + + + /** + * @description getTotalOrderTotal + * @param mgtBaseShopDto + * @return List<MgtMapTotalVo> + * @author jqs34 + * @date 2023/6/19 22:48 + */ + List<MgtMapTotalVo> listTotalOrderTotalGoodsRank(@Param("param") MgtBaseShopDto mgtBaseShopDto); + + /** + * @description getTotalOrderTotal + * @param mgtBaseShopDto + * @return List<MgtMapTotalVo> + * @author jqs34 + * @date 2023/6/19 22:48 + */ + List<MgtMapTotalVo> listTotalOrderTotalOrderFrom(@Param("param") MgtBaseShopDto mgtBaseShopDto); } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java index 9189131..cf27bba 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java @@ -1264,4 +1264,88 @@ MgtBulletinBoardVo mgtBulletinBoardVo = orderMapper.boardOrderTotal(); return mgtBulletinBoardVo; } + + /** + * @description getTotalOrderTotal + * @param mgtBaseShopDto + * @return MgtTotalOrderTotalVo + * @author jqs34 + * @date 2023/6/19 22:23 + */ + @Override + public MgtTotalOrderTotalVo getTotalOrderTotal(MgtBaseShopDto mgtBaseShopDto){ + MgtTotalOrderTotalVo mgtTotalOrderTotalVo = orderMapper.getTotalOrderTotalOrderFrom(mgtBaseShopDto); + //MgtTotalOrderTotalVo mgtTotalOrderTotalVoGoodsType = orderMapper.getTotalOrderTotalGoodsType(mgtBaseShopDto); + List<MgtMapTotalVo> mgtMapTotalVos = orderMapper.listTotalOrderTotal(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(); + } + mgtTotalOrderTotalVo.setOrderTotalKey(orderTotalKey); + mgtTotalOrderTotalVo.setOrderTotalValue(orderTotalValue); + mgtTotalOrderTotalVo.setOrderMoneyValue(orderMoneyValue); + } + //获取商品分类销售数据 + List<MgtMapTotalVo> mgtMapTotalVoGoodsType = orderMapper.listTotalOrderTotalGoodsType(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] = "周期"; + mgtTotalOrderTotalVo.setCycleTotal(mgtMapTotalVoGoodsType.get(i).getMapValueFirst()); + mgtTotalOrderTotalVo.setCycleMoney(mgtMapTotalVoGoodsType.get(i).getMapValueSecond()); + }else if(mgtMapTotalVoGoodsType.get(i).getMapKey().equals("2")){ + goodsTypeKey[i] = "服务"; + mgtTotalOrderTotalVo.setServiceTotal(mgtMapTotalVoGoodsType.get(i).getMapValueFirst()); + mgtTotalOrderTotalVo.setServiceMoney(mgtMapTotalVoGoodsType.get(i).getMapValueSecond()); + }else if(mgtMapTotalVoGoodsType.get(i).getMapKey().equals("3")){ + goodsTypeKey[i] = "体验"; + mgtTotalOrderTotalVo.setExperienceTotal(mgtMapTotalVoGoodsType.get(i).getMapValueFirst()); + mgtTotalOrderTotalVo.setExperienceMoney(mgtMapTotalVoGoodsType.get(i).getMapValueSecond()); + }else if(mgtMapTotalVoGoodsType.get(i).getMapKey().equals("4")){ + goodsTypeKey[i] = "单品"; + } + } + mgtTotalOrderTotalVo.setGoodsTypeKey(goodsTypeKey); + mgtTotalOrderTotalVo.setGoodsTypeTotalValue(goodsTypeTotalValue); + mgtTotalOrderTotalVo.setGoodsTypeMoneyValue(goodsTypeMoneyValue); + } + //获取商品销售排名 + List<MgtMapTotalVo> goodsRankList = orderMapper.listTotalOrderTotalGoodsRank(mgtBaseShopDto); + if (goodsRankList != null && goodsRankList.size() > 0) { + String[] goodsRankKey = new String[goodsRankList.size()]; + BigDecimal[] goodsRankValue = new BigDecimal[goodsRankList.size()]; + // 遍历不同商品类型的会员数列表,设置商品类型数组和对应的会员数数组 + for (int i = 0; i < goodsRankList.size(); i++) { + goodsRankKey[i] = goodsRankList.get(i).getMapKey(); + goodsRankValue[i] = goodsRankList.get(i).getMapValueSecond(); + } + mgtTotalOrderTotalVo.setGoodsRankKey(goodsRankKey); + mgtTotalOrderTotalVo.setGoodsRankValue(goodsRankValue); + } + //获取来源销售排名 + List<MgtMapTotalVo> orderFromList = orderMapper.listTotalOrderTotalOrderFrom(mgtBaseShopDto); + if (orderFromList != null && orderFromList.size() > 0) { + String[] orderFromKey = new String[orderFromList.size()]; + BigDecimal[] orderFromValue = new BigDecimal[orderFromList.size()]; + // 遍历不同商品类型的会员数列表,设置商品类型数组和对应的会员数数组 + for (int i = 0; i < orderFromList.size(); i++) { + orderFromKey[i] = orderFromList.get(i).getMapKey(); + orderFromValue[i] = orderFromList.get(i).getMapValueSecond(); + } + mgtTotalOrderTotalVo.setOrderFromRankKey(orderFromKey); + mgtTotalOrderTotalVo.setOrderFromRankValue(orderFromValue); + } + return mgtTotalOrderTotalVo; + } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java index 0685248..a20206a 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/order/OrderService.java +++ b/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.MgtBaseShopDto; import com.ruoyi.system.api.domain.vo.AppOrderTotalVo; import com.ruoyi.system.api.domain.vo.MerHomeShopTotalVo; import com.ruoyi.system.api.domain.vo.MgtBulletinBoardVo; @@ -185,4 +186,13 @@ * @date 2023/6/18 17:20 */ MgtBulletinBoardVo boardOrderTotal(); + + /** + * @description getTotalOrderTotal + * @param mgtBaseShopDto + * @return MgtTotalOrderTotalVo + * @author jqs34 + * @date 2023/6/19 22:23 + */ + MgtTotalOrderTotalVo getTotalOrderTotal(MgtBaseShopDto mgtBaseShopDto); } diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml index 1276082..69e80e2 100644 --- a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml +++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml @@ -615,4 +615,125 @@ FROM t_order WHERE del_flag = 0 </select> + + <select id="getTotalOrderTotalOrderFrom" resultType="com.ruoyi.order.domain.vo.MgtTotalOrderTotalVo"> + SELECT + COUNT(order_id) orderTotal, + SUM(CASE WHEN order_from = 1 THEN 1 ELSE 0 END) onlineTotal, + SUM(CASE WHEN order_from = 3 THEN 1 ELSE 0 END) offlineTotal, + SUM(CASE WHEN order_from = 2 THEN 1 ELSE 0 END) activityTotal, + IFNULL(SUM(order_money),0) orderMoney, + SUM(CASE WHEN order_from = 1 THEN order_money ELSE 0 END) onlineMoney, + SUM(CASE WHEN order_from = 3 THEN order_money ELSE 0 END) offlineMoney, + SUM(CASE WHEN order_from = 2 THEN order_money ELSE 0 END) activityMoney + FROM t_order WHERE del_flag = 0 + <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 >= #{param.startDate} + </if> + <if test="param.endDate!=null and param.endDate!=''"> + AND create_time <= #{param.endDate} + </if> + </select> + + <select id="getTotalOrderTotalGoodsType" resultType="com.ruoyi.order.domain.vo.MgtTotalOrderTotalVo"> + SELECT + SUM(CASE WHEN tog.goods_type = 1 THEN 1 ELSE 0 END) cycleTotal, + SUM(CASE WHEN tog.goods_type = 3 THEN 1 ELSE 0 END) experienceTotal, + SUM(CASE WHEN tog.goods_type = 2 THEN 1 ELSE 0 END) serviceTotal, + SUM(CASE WHEN tog.goods_type = 1 THEN tog.goods_total_money ELSE 0 END) cycleMoney, + SUM(CASE WHEN tog.goods_type = 3 THEN tog.goods_total_money ELSE 0 END) experienceMoney, + SUM(CASE WHEN tog.goods_type = 2 THEN tog.goods_total_money ELSE 0 END) serviceMoney + FROM t_order toc + INNER JOIN t_order_goods tog ON tog.order_id = toc.order_id + WHERE toc.del_flag = 0 + <if test="param.shopId != null and param.shopId != ''"> + AND toc.shop_id = #{param.shopId} + </if> + <if test="param.startDate!=null and param.startDate!=''"> + AND toc.create_time >= #{param.startDate} + </if> + <if test="param.endDate!=null and param.endDate!=''"> + AND toc.create_time <= #{param.endDate} + </if> + </select> + + <select id="listTotalOrderTotal" resultType="com.ruoyi.order.domain.vo.MgtMapTotalVo"> + SELECT + DATE_FORMAT(create_time, '%Y-%m-%d') AS mapKey, + COUNT(order_id) AS mapValueFirst, + IFNULL(SUM(order_money),0) AS mapValueSecond + FROM + t_order + WHERE + del_flag = 0 + AND create_time >= DATE_SUB(CURDATE(), INTERVAL 6 DAY) + <if test="param.shopId != null and param.shopId != ''"> + AND shop_id = #{param.shopId} + </if> + GROUP BY + order_date + ORDER BY + order_date ASC + </select> + + <select id="listTotalOrderTotalGoodsType" 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 + FROM + t_order toc + INNER JOIN t_order_goods tog ON tog.order_id = toc.order_id + WHERE toc.del_flag = 0 + <if test="param.shopId != null and param.shopId != ''"> + AND toc.shop_id = #{param.shopId} + </if> + GROUP BY tog.goods_type + </select> + + <select id="listTotalOrderTotalGoodsRank" resultType="com.ruoyi.order.domain.vo.MgtMapTotalVo"> + SELECT + tog.goods_name mapKey, + IFNULL(SUM(tog.goods_total_money),0) mapValueSecond + FROM t_order toc + INNER JOIN t_order_goods tog ON tog.order_id = toc.order_id + WHERE toc.del_flag = 0 + <if test="param.shopId != null and param.shopId != ''"> + AND toc.shop_id = #{param.shopId} + </if> + <if test="param.startDate!=null and param.startDate!=''"> + AND toc.create_time >= #{param.startDate} + </if> + <if test="param.endDate!=null and param.endDate!=''"> + AND toc.create_time <= #{param.endDate} + </if> + GROUP BY tog.goods_name + ORDER BY SUM(tog.goods_total_money) DESC LIMIT 10 + </select> + + <select id="listTotalOrderTotalOrderFrom" resultType="com.ruoyi.order.domain.vo.MgtMapTotalVo"> + SELECT + CASE toc.order_from + WHEN 1 THEN "商城订单" + WHEN 2 THEN "秒杀活动订单" + WHEN 3 THEN "线下创建订单" + END mapKey, + IFNULL(SUM(toc.order_money),0) mapValueSecond + FROM t_order toc + WHERE toc.del_flag = 0 + <if test="param.shopId != null and param.shopId != ''"> + AND toc.shop_id = #{param.shopId} + </if> + <if test="param.startDate!=null and param.startDate!=''"> + AND toc.create_time >= #{param.startDate} + </if> + <if test="param.endDate!=null and param.endDate!=''"> + AND toc.create_time <= #{param.endDate} + </if> + GROUP BY toc.order_from + ORDER BY SUM(toc.order_money) DESC LIMIT 10 + </select> </mapper> diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/sys/SysUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/sys/SysUserMapper.xml index a9827e6..65875e2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/sys/SysUserMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/sys/SysUserMapper.xml @@ -11,7 +11,7 @@ <result property="nickName" column="nick_name" /> <result property="email" column="email" /> <result property="phonenumber" column="phonenumber" /> - <result property="userType" column="user_type" /> + <result property="userType" column="user_type" /> <result property="sex" column="sex" /> <result property="avatar" column="avatar" /> <result property="password" column="password" /> -- Gitblit v1.7.1