ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/MgtBaseDateDto.java
New file @@ -0,0 +1,21 @@ package com.ruoyi.system.api.domain.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @ClassName MgtBaseDateDto * @Description TODO * @Author jqs * @Date 2023/6/19 15:04 * @Version 1.0 */ @Data public class MgtBaseDateDto extends MgtBaseDto{ @ApiModelProperty(value = "开始日期") private String startDate; @ApiModelProperty(value = "结束日期") private String endDate; } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/MgtBaseShopDto.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.system.api.domain.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @ClassName MgtBaseShopDto * @Description TODO * @Author jqs * @Date 2023/6/19 15:31 * @Version 1.0 */ @Data public class MgtBaseShopDto extends MgtBaseDateDto{ @ApiModelProperty(value = "商户id") private Long shopId; } ruoyi-auth/src/main/java/com/ruoyi/auth/RuoYiAuthApplication.java
@@ -18,7 +18,7 @@ @EnableCustomSwagger2 @EnableRyFeignClients @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class }) @ComponentScans(value = {@ComponentScan("com.ruoyi.system.api")}) @ComponentScans(value = {@ComponentScan("com.ruoyi.system.api"),@ComponentScan("com.ruoyi.common.security.utils")}) public class RuoYiAuthApplication { public static void main(String[] args) ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/ApplicationContextUtil.java
New file @@ -0,0 +1,27 @@ package com.ruoyi.common.security.utils; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** * @ClassName ApplicationContextUtil * @Description TODO * @Author jqs * @Date 2023/6/19 17:47 * @Version 1.0 */ @Component public class ApplicationContextUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { ApplicationContextUtil.applicationContext = applicationContext; } public static <T> T getBean(Class<T> clazz) { return applicationContext.getBean(clazz); } } ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/CodeFactoryUtil.java
@@ -5,7 +5,6 @@ import org.apache.commons.lang3.time.DateFormatUtils; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.security.SecureRandom; import java.util.Date; import java.util.Random; @@ -21,14 +20,13 @@ @Component public class CodeFactoryUtil { private static RedisService redisService = null; //静态住入到自己的类中 private static RedisService redisService; //将静态属性以入参(形参)的方式传入一个方法中,然后将此方法通过 @Resource 注入到Spring容器中 @Resource public void setService(RedisService redisService) { CodeFactoryUtil.redisService = redisService; private static RedisService getRedisService() { if (redisService == null) { redisService = ApplicationContextUtil.getBean(RedisService.class); } return redisService; } /** @@ -123,7 +121,7 @@ */ public static void main(String[] args) { System.out.printf("getShopNo()"+getShopNo()); } /** @@ -167,13 +165,13 @@ private static String getNoSuffixNumber(String prefix){ Integer suffixNumberInt; String suffixNumber = "00001"; if(redisService.hasKey(prefix)){ suffixNumberInt = redisService.getCacheObject(prefix); if(getRedisService().hasKey(prefix)){ suffixNumberInt = getRedisService().getCacheObject(prefix); suffixNumber = toFillZeroSuffixNumber(suffixNumberInt,SHOP_LENGTH); suffixNumberInt = suffixNumberInt + 1; redisService.setCacheObject(prefix, suffixNumberInt); getRedisService().setCacheObject(prefix, suffixNumberInt); }else{ redisService.setCacheObject(prefix, 1); getRedisService().setCacheObject(prefix, 1); } return suffixNumber; } @@ -200,13 +198,13 @@ private static String getOrderSuffixNumber(String prefix){ Integer suffixNumberInt; String suffixNumber = "0001"; if(redisService.hasKey(prefix)){ suffixNumberInt = redisService.getCacheObject(prefix); if(getRedisService().hasKey(prefix)){ suffixNumberInt = getRedisService().getCacheObject(prefix); suffixNumber = toFillZeroSuffixNumber(suffixNumberInt,ORDER_LENGTH); suffixNumberInt = suffixNumberInt + 1; redisService.setCacheObject(prefix, suffixNumberInt, 24L, TimeUnit.HOURS); getRedisService().setCacheObject(prefix, suffixNumberInt, 24L, TimeUnit.HOURS); }else{ redisService.setCacheObject(prefix, 1, 24L, TimeUnit.HOURS); getRedisService().setCacheObject(prefix, 1, 24L, TimeUnit.HOURS); } return suffixNumber; } ruoyi-gateway/src/main/resources/bootstrap.yml
@@ -35,8 +35,8 @@ datasource: ds1: nacos: server-addr: 47.109.78.184:5000 #server-addr: 127.0.0.1:8848 #server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 dataId: sentinel-ruoyi-gateway groupId: DEFAULT_GROUP data-type: json ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/RuoYiGoodsApplication.java
@@ -17,7 +17,7 @@ @EnableCustomSwagger2 @EnableRyFeignClients @SpringBootApplication @ComponentScans(value = {@ComponentScan("com.ruoyi.system.api")}) @ComponentScans(value = {@ComponentScan("com.ruoyi.system.api"),@ComponentScan("com.ruoyi.common.security.utils")}) public class RuoYiGoodsApplication { public static void main(String[] args) ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/goods/GoodsServiceImpl.java
@@ -61,6 +61,8 @@ @Resource private GoodsTotalService goodsTotalService; /** * @description 获取推荐商品列表 * @param page shopId @@ -278,7 +280,7 @@ String goodsId = mgtGoodsEditDto.getGoodsId(); Goods goodsSame = this.getOne(new LambdaQueryWrapper<Goods>().eq(Goods::getDelFlag,0).eq(Goods::getGoodsName,mgtGoodsEditDto.getGoodsName())); // 判断是否有商品ID 没有则新建 if (goodsId != null) { if (StringUtils.isNotBlank(goodsId)) { if(goodsSame!=null&&!Objects.equals(goodsSame.getGoodsId(), goodsId)){ throw new ServiceException(AppErrorConstant.GOODS_DOUBLE); } ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/RuoYiMemberApplication.java
@@ -17,7 +17,7 @@ @EnableCustomSwagger2 @EnableRyFeignClients @SpringBootApplication @ComponentScans(value = {@ComponentScan("com.ruoyi.system.api")}) @ComponentScans(value = {@ComponentScan("com.ruoyi.system.api"),@ComponentScan("com.ruoyi.common.security.utils")}) public class RuoYiMemberApplication { public static void main(String[] args) ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/MgtTotalController.java
New file @@ -0,0 +1,43 @@ package com.ruoyi.member.controller.management; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.member.domain.vo.MgtTotalMemberTotalVo; import com.ruoyi.member.service.member.MemberService; 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; /** * @ClassName MgtTotalController * @Description TODO * @Author jqs * @Date 2023/6/19 14:36 * @Version 1.0 */ @Api(value = "管理台会员统计相关接口", tags = "管理台会员统计相关接口", description = "管理台会员统计相关接口") @RestController @RequestMapping("/mgt/total") public class MgtTotalController { @Resource private MemberService memberService; @RequestMapping(value = "/getTotalMemberTotal", method = RequestMethod.POST) @ApiOperation(value = "获取会员人数统计") public R<MgtTotalMemberTotalVo> getTotalMemberTotal(@RequestBody MgtBaseShopDto mgtBaseShopDto) { Long userId = SecurityUtils.getUserId(); mgtBaseShopDto.setUserId(userId); MgtTotalMemberTotalVo totalMemberTotalVo = memberService.getTotalMemberTotal(mgtBaseShopDto); return R.ok(totalMemberTotalVo); } } ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MgtAgeTotalVo.java
New file @@ -0,0 +1,36 @@ package com.ruoyi.member.domain.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @ClassName MgtAgeTotalVo * @Description TODO * @Author jqs * @Date 2023/6/19 15:56 * @Version 1.0 */ @Data public class MgtAgeTotalVo { @ApiModelProperty(value = "男人") private Integer manTotal; @ApiModelProperty(value = "女人") private Integer womenTotal; @ApiModelProperty(value = "<20") private Integer tenAge; @ApiModelProperty(value = "21-30") private Integer twentyAge; @ApiModelProperty(value = "31-40") private Integer ThirtyAge; @ApiModelProperty(value = "41-50") private Integer fortyAge; @ApiModelProperty(value = ">50") private Integer fiftyAge; } ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MgtNurseTotalVo.java
New file @@ -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 MgtNurseTotalVo { @ApiModelProperty(value = "调理问题") private String nurse; @ApiModelProperty(value = "人数") private Integer userCount; } ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/vo/MgtTotalMemberTotalVo.java
New file @@ -0,0 +1,48 @@ package com.ruoyi.member.domain.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @ClassName MgtTotalMemberTotalVo * @Description TODO * @Author jqs * @Date 2023/6/19 15:06 * @Version 1.0 */ @Data public class MgtTotalMemberTotalVo { @ApiModelProperty(value = "总会员") private Integer memberTotal; @ApiModelProperty(value = "线上来源") private Integer onlineTotal; @ApiModelProperty(value = "线下来源") private Integer offlineTotal; @ApiModelProperty(value = "转介绍") private Integer introduceTotal; @ApiModelProperty(value = "周期会员") private Integer cycleTotal; @ApiModelProperty(value = "体验会员") private Integer experienceTotal; @ApiModelProperty(value = "服务会员") private Integer serviceTotal; @ApiModelProperty(value = "男人") private Integer manTotal; @ApiModelProperty(value = "女人") private Integer womenTotal; @ApiModelProperty(value = "会员年龄key") private String[] ageKey; @ApiModelProperty(value = "会员年龄value") private Integer[] ageValue; } ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/mapper/member/MemberMapper.java
@@ -5,9 +5,8 @@ import com.ruoyi.member.domain.dto.MerCashMemberPageDto; import com.ruoyi.member.domain.dto.MerMemberPageDto; import com.ruoyi.member.domain.dto.MgtMemberPageDto; import com.ruoyi.member.domain.vo.MerCashMemberPageVo; import com.ruoyi.member.domain.vo.MerMemberPageVo; import com.ruoyi.member.domain.vo.MgtMemberPageVo; import com.ruoyi.member.domain.vo.*; 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; import com.ruoyi.system.api.domain.vo.MgtSimpleMemberVo; @@ -130,6 +129,34 @@ * @date 2023/6/18 16:47 */ Integer memberToday(); /** * @description 会员人数统计 * @author jqs * @date 2023/6/19 15:26 * @param * @return MgtTotalMemberTotalVo */ MgtTotalMemberTotalVo getTotalMemberTotal(@Param("param") MgtBaseShopDto mgtBaseShopDto); /** * @description 会员人数统计 * @author jqs * @date 2023/6/19 15:26 * @param * @return MgtTotalMemberTotalVo */ MgtAgeTotalVo getTotalMemberTotalAge(@Param("param") MgtBaseShopDto mgtBaseShopDto); /** * @description 会员人数统计 * @author jqs * @date 2023/6/19 15:26 * @param * @return MgtTotalMemberTotalVo */ List<MgtNurseTotalVo> getTotalMemberTotalNurse(@Param("param") MgtBaseShopDto mgtBaseShopDto); } ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java
@@ -102,6 +102,7 @@ @Resource private MemberArchiveService memberArchiveService; /** * @description: TODO @@ -740,7 +741,7 @@ String memberUserIds = mgtMemberRelDelDto.getMemberUserIds(); String[] memberUserIdArr = memberUserIds.split(","); for(String str : memberUserIdArr) { Member member = this.getById(Long.valueOf(str)); Member member = this.getByUserId(Long.valueOf(str)); member.setBindingFlag(0); member.setUpdateTime(new Date()); member.setUpdateUserId(mgtMemberRelDelDto.getUserId()); @@ -944,4 +945,24 @@ mgtBulletinBoardVo.setMemberToday(memberMapper.memberToday()); return mgtBulletinBoardVo; } /** * @description 会员人数统计 * @author jqs * @date 2023/6/19 15:26 * @param * @return MgtTotalMemberTotalVo */ @Override public MgtTotalMemberTotalVo getTotalMemberTotal(MgtBaseShopDto mgtBaseShopDto){ 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()}; mgtTotalMemberTotalVo.setAgeKey(ageKey); mgtTotalMemberTotalVo.setAgeValue(ageValue); List<MgtNurseTotalVo> nurseTotalVos = memberMapper.getTotalMemberTotalNurse(mgtBaseShopDto); return mgtTotalMemberTotalVo; } } ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/member/MemberService.java
@@ -208,7 +208,7 @@ List<MgtSimpleMemberVo> listSimpleVoByIds(String userIds); /** * @description * @description 通过关键词获取用户id集合 * @author jqs * @date 2023/6/16 12:42 * @param mgtUserIdByKeywordDto @@ -217,11 +217,20 @@ MgtUserIdByKeywordVo getUserIdByKeyword(MgtUserIdByKeywordDto mgtUserIdByKeywordDto); /** * @description boardMemberTotal * @description 看板会员统计 * @param * @return MgtBulletinBoardVo * @author jqs34 * @date 2023/6/18 16:47 */ MgtBulletinBoardVo boardMemberTotal(); /** * @description 会员人数统计 * @author jqs * @date 2023/6/19 15:26 * @param * @return MgtTotalMemberTotalVo */ MgtTotalMemberTotalVo getTotalMemberTotal(MgtBaseShopDto mgtBaseShopDto); } ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberMapper.xml
@@ -195,6 +195,7 @@ <select id="pageMgtMember" resultType="com.ruoyi.member.domain.vo.MgtMemberPageVo"> SELECT tm.member_id memberId, tm.user_id userId, tm.relation_shop_id relationShopId, tm.member_no memberNo, @@ -322,4 +323,82 @@ <select id="memberToday" resultType="java.lang.Integer"> SELECT COUNT(user_id) FROM t_member WHERE del_flag = 0 AND create_time = CURDATE() </select> <select id="getTotalMemberTotal" resultType="com.ruoyi.member.domain.vo.MgtTotalMemberTotalVo"> SELECT COUNT(member_id) memberTotal, SUM(CASE WHEN customer_source = "小程序" THEN 1 ELSE 0 END) onlineTotal, SUM(CASE WHEN customer_source = "小程序" THEN 0 ELSE 1 END) offlineTotal, 0 introduceTotal, SUM(CASE WHEN goods_type LIKE "%周期%" THEN 1 ELSE 0 END) cycleTotal, SUM(CASE WHEN goods_type LIKE "%体验%" THEN 1 ELSE 0 END) experienceTotal, SUM(CASE WHEN goods_type LIKE "%服务%" THEN 1 ELSE 0 END) serviceTotal FROM t_member WHERE del_flag = 0 AND binding_flag = 1 <if test="param.shopId != null and param.shopId != ''"> AND relation_shop_id = #{param.shopId} </if> <if test="param.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="getTotalMemberTotal" resultType="com.ruoyi.member.domain.vo.MgtTotalMemberTotalVo"> SELECT COUNT(member_id) memberTotal, SUM(CASE WHEN customer_source = "小程序" THEN 1 ELSE 0 END) onlineTotal, SUM(CASE WHEN customer_source = "小程序" THEN 0 ELSE 1 END) offlineTotal, 0 introduceTotal, SUM(CASE WHEN goods_type LIKE "%周期%" THEN 1 ELSE 0 END) cycleTotal, SUM(CASE WHEN goods_type LIKE "%体验%" THEN 1 ELSE 0 END) experienceTotal, SUM(CASE WHEN goods_type LIKE "%服务%" THEN 1 ELSE 0 END) serviceTotal FROM t_member WHERE del_flag = 0 AND binding_flag = 1 <if test="param.shopId != null and param.shopId != ''"> AND relation_shop_id = #{param.shopId} </if> </select> <select id="getTotalMemberTotalAge" resultType="com.ruoyi.member.domain.vo.MgtAgeTotalVo"> SELECT SUM(CASE WHEN gender = 0 THEN 1 ELSE 0 END) manTotal, SUM(CASE WHEN gender = 1 THEN 1 ELSE 0 END) womenTotal, SUM(CASE WHEN TIMESTAMPDIFF(YEAR, birthday, CURDATE()) BETWEEN 1 AND 20 THEN 1 ELSE 0 END) AS tenAge, SUM(CASE WHEN TIMESTAMPDIFF(YEAR, birthday, CURDATE()) BETWEEN 21 AND 30 THEN 1 ELSE 0 END) AS twentyAge, SUM(CASE WHEN TIMESTAMPDIFF(YEAR, birthday, CURDATE()) BETWEEN 31 AND 40 THEN 1 ELSE 0 END) AS ThirtyAge, SUM(CASE WHEN TIMESTAMPDIFF(YEAR, birthday, CURDATE()) BETWEEN 41 AND 50 THEN 1 ELSE 0 END) AS fortyAge, SUM(CASE WHEN TIMESTAMPDIFF(YEAR, birthday, CURDATE()) >= 51 THEN 1 ELSE 0 END) AS fiftyAge FROM t_member WHERE del_flag = 0 AND binding_flag = 1 <if test="param.shopId != null and param.shopId != ''"> AND relation_shop_id = #{param.shopId} </if> <if test="param.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="getTotalMemberTotalNurse" resultType="com.ruoyi.member.domain.vo.MgtNurseTotalVo"> SELECT member_nurse nurse, COUNT(*) AS userCount FROM ( SELECT member_id, SUBSTRING_INDEX(SUBSTRING_INDEX(member_nurse, ',', numbers.n), ',', -1) user_tag FROM (SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10) numbers INNER JOIN t_member ON CHAR_LENGTH(member_nurse) - CHAR_LENGTH(REPLACE(member_nurse, ',', '')) >= numbers.n - 1 <if test="param.shopId != null and param.shopId != ''"> AND relation_shop_id = #{param.shopId} </if> <if test="param.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 member_nurse != '' GROUP BY member_nurse ORDER BY count DESC; </select> </mapper> ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/RuoYiOrderApplication.java
@@ -17,7 +17,7 @@ @EnableCustomSwagger2 @EnableRyFeignClients @SpringBootApplication @ComponentScans(value = {@ComponentScan("com.ruoyi.system.api")}) @ComponentScans(value = {@ComponentScan("com.ruoyi.system.api"),@ComponentScan("com.ruoyi.common.security.utils")}) public class RuoYiOrderApplication { public static void main(String[] args) ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
@@ -72,6 +72,8 @@ @Resource private RemoteShoppingCartService remoteShoppingCartService; /** * @description: buyGoods ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/RuoYiShopApplication.java
@@ -17,7 +17,7 @@ @EnableCustomSwagger2 @EnableRyFeignClients @SpringBootApplication @ComponentScans(value = {@ComponentScan("com.ruoyi.system.api")}) @ComponentScans(value = {@ComponentScan("com.ruoyi.system.api"),@ComponentScan("com.ruoyi.common.security.utils")}) public class RuoYiShopApplication { public static void main(String[] args) ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java
@@ -93,7 +93,7 @@ @Resource private ShopProportionService shopProportionService; /** * 获取商户详情