|
|
@@ -2,6 +2,7 @@ package com.kxs.stat.biz.service.impl;
|
|
|
|
|
|
import cn.hutool.core.date.DatePattern;
|
|
|
import cn.hutool.core.date.LocalDateTimeUtil;
|
|
|
+import cn.hutool.core.map.MapUtil;
|
|
|
import cn.hutool.core.util.NumberUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
@@ -11,7 +12,12 @@ import com.kxs.common.core.constant.SecurityConstants;
|
|
|
import com.kxs.common.core.exception.GlobalCustomerException;
|
|
|
import com.kxs.common.core.util.AssertUtil;
|
|
|
import com.kxs.common.core.util.R;
|
|
|
+import com.kxs.common.core.util.RetOps;
|
|
|
+import com.kxs.common.core.util.TotalDateUtil;
|
|
|
+import com.kxs.common.mybatis.handler.MonthTableNameHandler;
|
|
|
import com.kxs.common.security.util.SecurityUtils;
|
|
|
+import com.kxs.product.api.feign.RemoteKxsProductService;
|
|
|
+import com.kxs.product.api.model.KxsBrand;
|
|
|
import com.kxs.stat.api.dto.statUser.StatUserGetMyTradeDTO;
|
|
|
import com.kxs.stat.api.dto.statUser.StatUserGetTradeDetailDTO;
|
|
|
import com.kxs.stat.api.dto.statUser.StatUserGetUserStatByDayOrMonthDTO;
|
|
|
@@ -22,9 +28,12 @@ import com.kxs.stat.api.model.KxsUserLogoutTrade;
|
|
|
import com.kxs.stat.api.model.KxsUserTrade;
|
|
|
import com.kxs.stat.api.vo.ShdTradeAmtVO;
|
|
|
import com.kxs.stat.api.vo.TotalTradeAmtVO;
|
|
|
+import com.kxs.stat.api.vo.myUser.*;
|
|
|
import com.kxs.stat.api.vo.statUser.*;
|
|
|
import com.kxs.stat.biz.constant.enums.TotalTypeEnum;
|
|
|
import com.kxs.stat.biz.mapper.*;
|
|
|
+import com.kxs.stat.biz.service.KxsUserActTradeService;
|
|
|
+import com.kxs.stat.biz.service.KxsUserNewTradeService;
|
|
|
import com.kxs.stat.biz.service.KxsUserTradeService;
|
|
|
import com.kxs.user.api.dto.kxsapp.IntegralStatDTO;
|
|
|
import com.kxs.user.api.feign.RemoteKxsUserService;
|
|
|
@@ -37,11 +46,12 @@ import org.springframework.transaction.PlatformTransactionManager;
|
|
|
import org.springframework.transaction.support.TransactionTemplate;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
-import java.math.RoundingMode;
|
|
|
import java.time.LocalDate;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
import java.util.*;
|
|
|
+import java.util.function.Function;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 个人交易统计总表(KxsUserTrade)表服务实现类
|
|
|
@@ -54,28 +64,33 @@ import java.util.*;
|
|
|
@Slf4j
|
|
|
public class KxsUserTradeServiceImpl extends ServiceImpl<KxsUserTradeMapper, KxsUserTrade> implements KxsUserTradeService {
|
|
|
private final RemoteKxsUserService remoteKxsUserService;
|
|
|
+ private final RemoteKxsProductService remoteKxsProductService;
|
|
|
|
|
|
private final PlatformTransactionManager platformTransactionManager;
|
|
|
|
|
|
+ private final KxsUserActTradeService kxsUserActTradeService;
|
|
|
private final KxsUserActTradeMapper kxsUserActTradeMapper;
|
|
|
|
|
|
private final KxsLkbTradeMapper kxsLkbTradeMapper;
|
|
|
|
|
|
private final KxsUserLogoutTradeMapper kxsUserLogoutTradeMapper;
|
|
|
|
|
|
+ private final KxsUserNewTradeService kxsUserNewTradeService;
|
|
|
private final KxsUserNewTradeMapper kxsUserNewTradeMapper;
|
|
|
|
|
|
private final KxsZlbTradeMapper kxsZlbTradeMapper;
|
|
|
- private final static String PREFIX_TABLE_NAME = "kxs_user_trade_";
|
|
|
+ private final static String PREFIX_TABLE_NAME = CommonConstants.USER_TABLE_PREFIX;
|
|
|
|
|
|
- private final static String PREFIX_TABLE_NAME_AFTER = "kxs_user_trade_after_";
|
|
|
- private final static String PREFIX_TABLE_NAME_BEFORE = "kxs_user_trade_before_";
|
|
|
+ private final static String PREFIX_TABLE_NAME_AFTER = CommonConstants.USER_TABLE_AFTER_PREFIX;
|
|
|
+ private final static String PREFIX_TABLE_NAME_BEFORE = CommonConstants.USER_TABLE_BEFORE_PREFIX;
|
|
|
|
|
|
|
|
|
private final static String PREFIX_TABLE_NAME_TEMP = "kxs_user_trade_temp_";
|
|
|
private final KxsUserGdTradeMapper kxsUserGdTradeMapper;
|
|
|
private final KxsLkbActTradeMapper kxsLkbActTradeMapper;
|
|
|
|
|
|
+ private static Map<Integer, KxsBrand> brandsMap;
|
|
|
+
|
|
|
@Override
|
|
|
@Async
|
|
|
public void getUserTradeList(String para) {
|
|
|
@@ -216,47 +231,40 @@ public class KxsUserTradeServiceImpl extends ServiceImpl<KxsUserTradeMapper, Kxs
|
|
|
public R getUserStatByDayOrMonth(StatUserGetUserStatByDayOrMonthDTO param) {
|
|
|
Long userId = param.getUserId();
|
|
|
Integer type = param.getType();
|
|
|
- Integer totalType = param.getTotalType();
|
|
|
LocalDate now = LocalDate.now();
|
|
|
- List<String> times = new ArrayList<>();
|
|
|
- List<String> lastMonthTimes = null;
|
|
|
+ List<Integer> times;
|
|
|
+ StatUserGetUserStatByDayOrMonthVO statUserGetUserStatByDayOrMonthVO = new StatUserGetUserStatByDayOrMonthVO();
|
|
|
if (type == 1) {
|
|
|
- //获取今日月份 用以校验是否跨越月份
|
|
|
- int toDayMonth = now.getMonthValue();
|
|
|
- //近七日
|
|
|
- for (int i = 0; i < 7; i++) {
|
|
|
- // 计算每一天的日期
|
|
|
- LocalDate currentDay = now.minusDays(i);
|
|
|
- // 将LocalDate转换为字符串 yyyyMMdd 获取到所需查询日期
|
|
|
- String currentDateString = LocalDateTimeUtil.format(currentDay, DatePattern.PURE_DATE_PATTERN);
|
|
|
- //获取当前日的月份值
|
|
|
- int monthValue = now.getMonthValue();//判断今日月份值与当前查询日月份是否一致
|
|
|
- if (toDayMonth == monthValue) {
|
|
|
- //一致加入正常查询序列
|
|
|
- times.add(currentDateString);
|
|
|
- } else {
|
|
|
- //不一致构造加入二次查询序列
|
|
|
- lastMonthTimes = new ArrayList<>();
|
|
|
- lastMonthTimes.add(currentDateString);
|
|
|
- }
|
|
|
- }
|
|
|
- //开始查询 该方法整合全部查询
|
|
|
- StatUserGetUserStatByDayOrMonthVO statUserGetUserStatByDayOrMonthVO = getStatUserGetUserStatByDayOrMonthVO(userId, now, times, lastMonthTimes, type, totalType);
|
|
|
- return R.ok(statUserGetUserStatByDayOrMonthVO);
|
|
|
+ times = TotalDateUtil.getDayList(now.minusDays(1), 7);
|
|
|
} else if (type == 2) {
|
|
|
//近半年
|
|
|
- for (int i = 0; i < 6; i++) {
|
|
|
- // 计算过去半年每月月份
|
|
|
- LocalDate currentDay = now.minusMonths(i);
|
|
|
- // 将LocalDate转换为字符串
|
|
|
- String currentDateString = LocalDateTimeUtil.format(currentDay, DatePattern.SIMPLE_MONTH_PATTERN);
|
|
|
- times.add(currentDateString);
|
|
|
- }
|
|
|
- StatUserGetUserStatByDayOrMonthVO statUserGetUserStatByDayOrMonthVO = getStatUserGetUserStatByDayOrMonthVO(userId, now, times, lastMonthTimes, type, totalType);
|
|
|
- return R.ok(statUserGetUserStatByDayOrMonthVO);
|
|
|
+ times = TotalDateUtil.getMonthList(now.minusDays(1), 6);
|
|
|
} else {
|
|
|
return R.failed("类型错误");
|
|
|
}
|
|
|
+
|
|
|
+ //交易趋势图
|
|
|
+ List<TrendVO> trendVOList = setTradeTrend(userId, times, type);
|
|
|
+ statUserGetUserStatByDayOrMonthVO.setTradeTrend(trendVOList);
|
|
|
+
|
|
|
+ //交易占比
|
|
|
+ List<PercentVO> percentVOList = setTradeTotalAndPercent(userId, times, type);
|
|
|
+ statUserGetUserStatByDayOrMonthVO.setTradePercent(percentVOList);
|
|
|
+
|
|
|
+ //激活商户占比
|
|
|
+ List<MchActPercentVO> mchActPercentList = kxsUserActTradeMapper.getMchActTimePercent(userId, times, type == 1 ? 1 : 0, TotalTypeEnum.TEAM.getType());
|
|
|
+ mchActPercentList.forEach(item -> item.setName(getBrandMap().get(item.getBrandId()).getName()));
|
|
|
+ statUserGetUserStatByDayOrMonthVO.setActMchPercent(mchActPercentList);
|
|
|
+
|
|
|
+ //新增激活商户趋势图
|
|
|
+ List<TrendVO> addMchTrendList = kxsUserActTradeService.getAddActMchTrend(userId, times, type == 1 ? 1 : 0, TotalTypeEnum.TEAM, getBrandMap());
|
|
|
+ statUserGetUserStatByDayOrMonthVO.setMchAddTrend(addMchTrendList);
|
|
|
+
|
|
|
+ //新增创客趋势图
|
|
|
+ List<UserAddTrendVO> userAddTrendVOList = kxsUserNewTradeService.getAddUserTrend(userId, times, type == 1 ? 1 : 0, TotalTypeEnum.TEAM.getType());
|
|
|
+ statUserGetUserStatByDayOrMonthVO.setUserAddTrend(userAddTrendVOList);
|
|
|
+
|
|
|
+ return R.ok(statUserGetUserStatByDayOrMonthVO);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@@ -526,7 +534,7 @@ public class KxsUserTradeServiceImpl extends ServiceImpl<KxsUserTradeMapper, Kxs
|
|
|
StatUserTradeVo proBstatUserTradeVo = new StatUserTradeVo();
|
|
|
|
|
|
//pos交易
|
|
|
- KxsUserTrade kxsUserTradePos = baseMapper.getAllUserTrderSum(userId, month, getType, 0, brandId, totalType, tableName);
|
|
|
+ KxsUserTrade kxsUserTradePos = baseMapper.getAllUserTradeSum(userId, month, getType, 0, brandId, totalType, tableName);
|
|
|
if (kxsUserTradePos != null) {
|
|
|
statUserTradeVo.setDirectTradeAmt(kxsUserTradePos.getHelpDirectTradeAmt());//扶持期贷记卡
|
|
|
statUserTradeVo.setDebitTradeAmt(kxsUserTradePos.getHelpDebitTradeAmt());//扶持期借记卡
|
|
|
@@ -561,7 +569,7 @@ public class KxsUserTradeServiceImpl extends ServiceImpl<KxsUserTradeMapper, Kxs
|
|
|
proBstatUserTradeVo.setPosTrade(kxsUserTradePos.getProBDirectTradeAmt().add(kxsUserTradePos.getProBDebitTradeAmt()));//交易总和
|
|
|
}
|
|
|
//云闪付
|
|
|
- KxsUserTrade kxsUserTradeCloud = baseMapper.getAllUserTrderSum(userId, month, getType, 1, brandId, totalType, tableName);
|
|
|
+ KxsUserTrade kxsUserTradeCloud = baseMapper.getAllUserTradeSum(userId, month, getType, 1, brandId, totalType, tableName);
|
|
|
if (kxsUserTradeCloud != null) {
|
|
|
BigDecimal helpTrade = kxsUserTradeCloud.getHelpDebitCapTradeAmt().add(kxsUserTradeCloud.getHelpDirectTradeAmt());//计算扶持期云闪付交易额
|
|
|
statUserTradeVo.setCloudTrade(helpTrade);//扶持期云闪付交易额
|
|
|
@@ -820,201 +828,123 @@ public class KxsUserTradeServiceImpl extends ServiceImpl<KxsUserTradeMapper, Kxs
|
|
|
}
|
|
|
|
|
|
|
|
|
- private StatUserGetUserStatByDayOrMonthVO getStatUserGetUserStatByDayOrMonthVO(Long userId, LocalDate now, List<String> times, List<String> lastMonthTimes, Integer type, Integer totalType) {
|
|
|
- StatUserGetUserStatByDayOrMonthVO statUserGetUserStatByDayOrMonthVO = new StatUserGetUserStatByDayOrMonthVO();
|
|
|
- /* ------ 交易趋势图 ------ */
|
|
|
- setTreadeTrend(userId, now, times, lastMonthTimes, statUserGetUserStatByDayOrMonthVO, type, totalType);
|
|
|
- /* ------ 交易百分比及总额 ------ */
|
|
|
- setTreadeTotalAndPercent(userId, times, lastMonthTimes, statUserGetUserStatByDayOrMonthVO, type, totalType);
|
|
|
- /* ------ 激活百分比及总额 ------ */
|
|
|
- setActTotalAndPercent(userId, times, lastMonthTimes, statUserGetUserStatByDayOrMonthVO, type, totalType);
|
|
|
- /* ------ 激活趋势图 ------ */
|
|
|
- setActTrend(userId, times, lastMonthTimes, statUserGetUserStatByDayOrMonthVO, type, totalType);
|
|
|
- /* ------ 新增用户趋势图 ------ */
|
|
|
- setUserAddTrend(userId, times, type, statUserGetUserStatByDayOrMonthVO, totalType);
|
|
|
- return statUserGetUserStatByDayOrMonthVO;
|
|
|
- }
|
|
|
-
|
|
|
- private void setUserAddTrend(Long userId, List<String> times, Integer type, StatUserGetUserStatByDayOrMonthVO statUserGetUserStatByDayOrMonthVO, Integer totalType) {
|
|
|
- TrendVO trendVO = new TrendVO();
|
|
|
- List<TrendTimesVO> trendTimesVOS = kxsUserNewTradeMapper.getUserAddTrend(userId, times, type, totalType);
|
|
|
- repZero(times, trendTimesVOS);
|
|
|
- trendVO.setName("all");
|
|
|
- trendVO.setTimes(trendTimesVOS);
|
|
|
- statUserGetUserStatByDayOrMonthVO.setUserAddTrend(trendVO);
|
|
|
- }
|
|
|
-
|
|
|
- private void setActTrend(Long userId, List<String> times, List<String> lastMonthTimes, StatUserGetUserStatByDayOrMonthVO statUserGetUserStatByDayOrMonthVO, Integer type, Integer totalType) {
|
|
|
-
|
|
|
+ /**
|
|
|
+ * 创客交易品牌占比
|
|
|
+ *
|
|
|
+ * @param userId 用户 ID
|
|
|
+ * @param times 时间区间
|
|
|
+ * @param type 类型
|
|
|
+ * @return {@link List}<{@link PercentVO}>
|
|
|
+ */
|
|
|
+ private List<PercentVO> setTradeTotalAndPercent(Long userId, List<Integer> times, Integer type) {
|
|
|
+
|
|
|
+ List<PercentVO> percentVOList = new ArrayList<>();
|
|
|
+ if(type == 1){
|
|
|
+ //近7天
|
|
|
+ for (Integer day : times) {
|
|
|
+ Integer month = TotalDateUtil.getMonthNumber(LocalDateTimeUtil.parseDate(String.valueOf(day), DatePattern.PURE_DATE_PATTERN));
|
|
|
+ List<PercentVO> userTradeTotal = baseMapper.getUserTradeDayTotal(CommonConstants.USER_TABLE_PREFIX + month, userId, day, TotalTypeEnum.TEAM.getType());
|
|
|
+ percentVOList.addAll(userTradeTotal);
|
|
|
+ }
|
|
|
+ return percentVOList.stream()
|
|
|
+ .peek(item -> item.setName(getBrandMap().get(item.getBrandId()).getName()))
|
|
|
+ .collect(Collectors.toMap(PercentVO::getBrandId, a -> a, (o1, o2) -> {
|
|
|
+ o1.setTradeAmt(o1.getTradeAmt().add(o2.getTradeAmt()));
|
|
|
+ return o1;
|
|
|
+ })).values().stream().toList();
|
|
|
+
|
|
|
+ }else{
|
|
|
+ //近半年
|
|
|
+ for (Integer month : times) {
|
|
|
+ List<PercentVO> userTradeTotal = baseMapper.getUserTradeMonthTotal(CommonConstants.USER_TABLE_PREFIX + month, userId, TotalTypeEnum.TEAM.getType());
|
|
|
+ percentVOList.addAll(userTradeTotal);
|
|
|
+ }
|
|
|
+ return percentVOList.stream()
|
|
|
+ .peek(item -> item.setName(getBrandMap().get(item.getBrandId()).getName()))
|
|
|
+ .collect(Collectors.toMap(PercentVO::getBrandId, a -> a, (o1, o2) -> {
|
|
|
+ o1.setTradeAmt(o1.getTradeAmt().add(o2.getTradeAmt()));
|
|
|
+ return o1;
|
|
|
+ })).values().stream().toList();
|
|
|
|
|
|
- //查询用户全部激活根据日期分组
|
|
|
- List<TrendTimesVO> trendTimesActVOS = kxsUserActTradeMapper.getUserActListByDayOrMonth(times, userId, null, type, totalType);
|
|
|
- //判断是否二次查询
|
|
|
- if (lastMonthTimes != null) {
|
|
|
- List<TrendTimesVO> trendTimesActVOSLast = kxsUserActTradeMapper.getUserActListByDayOrMonth(lastMonthTimes, userId, null, type, totalType);
|
|
|
- trendTimesActVOS.addAll(trendTimesActVOSLast);
|
|
|
}
|
|
|
- //查询用户全部激活量根据 日期以及品牌 分组
|
|
|
- List<TrendTimesVO> trendTimesActBrandVOS = kxsUserActTradeMapper.getUserActListByDayOrMonth(times, userId, 1, type, totalType);
|
|
|
- //判断是否二次查询
|
|
|
- if (lastMonthTimes != null) {
|
|
|
- List<TrendTimesVO> trendTimesActBrandVOSLast = kxsUserActTradeMapper.getUserActListByDayOrMonth(lastMonthTimes, userId, 1, type, totalType);
|
|
|
- trendTimesActBrandVOS.addAll(trendTimesActBrandVOSLast);
|
|
|
- }
|
|
|
- //构造数据
|
|
|
- ArrayList<TrendVO> trendVOSBrand = getTrendVOS(trendTimesActVOS, trendTimesActBrandVOS, times);
|
|
|
- statUserGetUserStatByDayOrMonthVO.setActMerchantTrend(trendVOSBrand);//激活趋势图
|
|
|
- }
|
|
|
-
|
|
|
- private void setActTotalAndPercent(Long userId, List<String> times, List<String> lastMonthTimes, StatUserGetUserStatByDayOrMonthVO statUserGetUserStatByDayOrMonthVO, Integer type, Integer totalType) {
|
|
|
- //获取传入日期激活商户数根据品牌分组
|
|
|
- List<PercentVO> percentVOSAct = kxsUserActTradeMapper.getUserTradeTotal(times, userId, type, totalType);
|
|
|
- //判断是否二次查询
|
|
|
- if (lastMonthTimes != null) {
|
|
|
- List<PercentVO> percentVOSActLast = kxsUserActTradeMapper.getUserTradeTotal(lastMonthTimes, userId, type, totalType);
|
|
|
- percentVOSAct.addAll(percentVOSActLast);
|
|
|
- }
|
|
|
- //总激活数
|
|
|
- Integer actTotalCount = 0;
|
|
|
- for (PercentVO percentVO : percentVOSAct) {
|
|
|
- actTotalCount += percentVO.getTotal();
|
|
|
- }
|
|
|
- //计算百分比
|
|
|
- for (PercentVO percentVO : percentVOSAct) {
|
|
|
- percentVO.setPercent(BigDecimal.valueOf(percentVO.getTotal()).divide(BigDecimal.valueOf(actTotalCount), 6, RoundingMode.FLOOR));
|
|
|
- }
|
|
|
- statUserGetUserStatByDayOrMonthVO.setActMerchantPercent(percentVOSAct);//激活百分比
|
|
|
- statUserGetUserStatByDayOrMonthVO.setActMerchantTotal(actTotalCount);//激活总数
|
|
|
- }
|
|
|
-
|
|
|
- private void setTreadeTotalAndPercent(Long userId, List<String> times, List<String> lastMonthTimes, StatUserGetUserStatByDayOrMonthVO statUserGetUserStatByDayOrMonthVO, Integer type, Integer totalType) {
|
|
|
- String thisMoth = LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.SIMPLE_MONTH_PATTERN);
|
|
|
- String tableName = PREFIX_TABLE_NAME + thisMoth;
|
|
|
- //获取全部品牌总交易额
|
|
|
- List<PercentVO> percentVOS = baseMapper.getUserTradeTotal(tableName, userId, times, type, totalType);
|
|
|
- //判断是否二次查询
|
|
|
- if (lastMonthTimes != null) {
|
|
|
- //需要构造上月表名
|
|
|
- LocalDate date = LocalDate.now().minusMonths(1);//月份减一
|
|
|
- String lastMoth = LocalDateTimeUtil.format(date, DatePattern.SIMPLE_MONTH_PATTERN);
|
|
|
- String lastTableName = PREFIX_TABLE_NAME + lastMoth;
|
|
|
- List<PercentVO> percentVOSLast = baseMapper.getUserTradeTotal(lastTableName, userId, lastMonthTimes, type, totalType);
|
|
|
- percentVOS.addAll(percentVOSLast);
|
|
|
- }
|
|
|
- BigDecimal totalAmout = BigDecimal.ZERO;
|
|
|
- //计算总金额
|
|
|
- for (PercentVO percentVO : percentVOS) {
|
|
|
- totalAmout = totalAmout.add(percentVO.getAmount());
|
|
|
- }
|
|
|
- //计算百分比
|
|
|
- for (PercentVO percentVO : percentVOS) {
|
|
|
- percentVO.setPercent(percentVO.getAmount().divide(totalAmout, 6, RoundingMode.FLOOR));
|
|
|
- }
|
|
|
- statUserGetUserStatByDayOrMonthVO.setTreadePercent(percentVOS);//交易百分比
|
|
|
- statUserGetUserStatByDayOrMonthVO.setTreadeTotal(totalAmout);//交易总额
|
|
|
}
|
|
|
|
|
|
- private void setTreadeTrend(Long userId, LocalDate now, List<String> times, List<String> lastMonthTimes, StatUserGetUserStatByDayOrMonthVO statUserGetUserStatByDayOrMonthVO, Integer type, Integer totalType) {
|
|
|
- String thisMoth = LocalDateTimeUtil.format(now, DatePattern.SIMPLE_MONTH_PATTERN);
|
|
|
- String tableName = PREFIX_TABLE_NAME + thisMoth;
|
|
|
- List<TrendTimesVO> trendTimesVOS = new ArrayList<>();
|
|
|
- if (type == 1) {
|
|
|
- //查询用户全部交易额根据日期分组
|
|
|
- trendTimesVOS = baseMapper.getUserTradeListByDayOrMonth(tableName, times, userId, null, type, totalType);
|
|
|
- //判断是否需要二次查询
|
|
|
- if (lastMonthTimes != null) {
|
|
|
- //需要构造上月表名
|
|
|
- LocalDate date = now.minusMonths(1);//月份减一
|
|
|
- String lastMoth = LocalDateTimeUtil.format(date, DatePattern.SIMPLE_MONTH_PATTERN);
|
|
|
- String lastTableName = PREFIX_TABLE_NAME + lastMoth;
|
|
|
- try {
|
|
|
- //因为这里可能存在查询的月份的表未创建的原因 使用try包裹跳过报错 视为该月无数据
|
|
|
- List<TrendTimesVO> trendTimesVOSByLastMonthTimes = baseMapper.getUserTradeListByDayOrMonth(lastTableName, lastMonthTimes, userId, null, type, totalType);
|
|
|
- trendTimesVOS.addAll(trendTimesVOSByLastMonthTimes);
|
|
|
- } catch (Exception e) {
|
|
|
- log.info(e.getMessage());
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- for (String month : times) {
|
|
|
- //拼接表名
|
|
|
- String newTableName = PREFIX_TABLE_NAME + month;
|
|
|
- //因为这里可能存在查询的月份的表未创建的原因 使用try包裹跳过报错 视为该月无数据
|
|
|
- try {
|
|
|
- List<TrendTimesVO> userTradeListByDayOrMonth = baseMapper.getUserTradeListByDayOrMonth(newTableName, times, userId, null, type, totalType);
|
|
|
- trendTimesVOS.addAll(userTradeListByDayOrMonth);
|
|
|
- } catch (Exception e) {
|
|
|
- log.info(e.getMessage());
|
|
|
- }
|
|
|
+ /**
|
|
|
+ * 创客交易趋势图
|
|
|
+ *
|
|
|
+ * @param userId 用户 ID
|
|
|
+ * @param times 时间区间
|
|
|
+ * @param type 类型
|
|
|
+ * @return {@link List}<{@link TrendVO}>
|
|
|
+ */
|
|
|
+ private List<TrendVO> setTradeTrend(Long userId, List<Integer> times, Integer type) {
|
|
|
+
|
|
|
+ MonthTableNameHandler.setData(MonthTableNameHandler.getThisMoth());
|
|
|
+ List<TrendVO> trendVOList = new ArrayList<>();
|
|
|
+ if(type == 1){
|
|
|
+ //近7天交易趋势图
|
|
|
+ LinkedHashMap<Integer, List<TrendTimesVO>> tradeTrend = new LinkedHashMap<>();
|
|
|
+ for (Integer day : times) {
|
|
|
+ Integer month = TotalDateUtil.getMonthNumber(LocalDateTimeUtil.parseDate(String.valueOf(day), DatePattern.PURE_DATE_PATTERN));
|
|
|
+ //每个月表统计查询出来后再合并进map里
|
|
|
+ List<TrendTimesVO> monthTradeTrend = baseMapper.getUserTradeDayTrend(CommonConstants.USER_TABLE_PREFIX + month, userId, day, TotalTypeEnum.TEAM.getType());
|
|
|
+ tradeTrend.put(day, monthTradeTrend);
|
|
|
}
|
|
|
+ initUserTrend(trendVOList, tradeTrend);
|
|
|
}
|
|
|
- //查询用户全部交易额根据 日期以及品牌 分组
|
|
|
- List<TrendTimesVO> trendTimesVOListBrand = baseMapper.getUserTradeListByDayOrMonth(tableName, times, userId, 1, type, totalType);
|
|
|
- //判断是否需要二次查询
|
|
|
- if (lastMonthTimes != null) {
|
|
|
- //需要构造上月表名
|
|
|
- LocalDate date = now.minusMonths(1);//月份减一
|
|
|
- String lastMoth = LocalDateTimeUtil.format(date, DatePattern.SIMPLE_MONTH_PATTERN);
|
|
|
- String lastTableName = PREFIX_TABLE_NAME + lastMoth;
|
|
|
- List<TrendTimesVO> trendTimesVOListBrandLast = baseMapper.getUserTradeListByDayOrMonth(lastTableName, lastMonthTimes, userId, 1, type, totalType);
|
|
|
- trendTimesVOListBrand.addAll(trendTimesVOListBrandLast);
|
|
|
- }
|
|
|
- //构造数据
|
|
|
- ArrayList<TrendVO> trendVOS = getTrendVOS(trendTimesVOS, trendTimesVOListBrand, times);
|
|
|
- statUserGetUserStatByDayOrMonthVO.setTreadeTrend(trendVOS);//交易趋势
|
|
|
- }
|
|
|
+ if(type == 2){
|
|
|
+ //近半年
|
|
|
+ LinkedHashMap<Integer, List<TrendTimesVO>> tradeTrend = new LinkedHashMap<>();
|
|
|
|
|
|
- private static void repZero(List<String> times, List<TrendTimesVO> trendTimesVOS) {
|
|
|
- for (String time : times) {
|
|
|
- //补充标识
|
|
|
- int repFlag = 0;
|
|
|
- Integer brandId = null;
|
|
|
- for (TrendTimesVO trendTimesVO : trendTimesVOS) {
|
|
|
- brandId = trendTimesVO.getBrandId();
|
|
|
- //如果存在则开启标识
|
|
|
- if (time.equals(trendTimesVO.getTime())) {
|
|
|
- repFlag = 1;
|
|
|
- }
|
|
|
- }
|
|
|
- //当返回集合中不存在查询的时间则构造一条0数据加入trendTimesVOS集合
|
|
|
- if (repFlag == 0) {
|
|
|
- TrendTimesVO trendTimesVO = new TrendTimesVO();
|
|
|
- trendTimesVO.setTime(time);
|
|
|
- trendTimesVO.setTotal(0);
|
|
|
- trendTimesVO.setBrandId(brandId);
|
|
|
- trendTimesVOS.add(trendTimesVO);
|
|
|
+ for (Integer month : times) {
|
|
|
+ //每个月表统计查询出来后再合并进map里
|
|
|
+ List<TrendTimesVO> monthTradeTrend = baseMapper.getUserTradeMonthTrend(CommonConstants.USER_TABLE_PREFIX + month, userId, TotalTypeEnum.TEAM.getType());
|
|
|
+ tradeTrend.put(month, monthTradeTrend);
|
|
|
}
|
|
|
+ initUserTrend(trendVOList, tradeTrend);
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- private static ArrayList<TrendVO> getTrendVOS(List<TrendTimesVO> trendTimesVOS, List<TrendTimesVO> trendTimesVOListBrand, List<String> times) {
|
|
|
- //将全部交易额以及品牌交易额构造进入map key为品牌id 或 all
|
|
|
- Map<String, List<TrendTimesVO>> treadTrend = new HashMap<>();
|
|
|
- treadTrend.put("all", trendTimesVOS);
|
|
|
- for (TrendTimesVO trendTimesVO : trendTimesVOListBrand) {
|
|
|
- List<TrendTimesVO> trendTimesVOSBrand = treadTrend.get(trendTimesVO.getBrandId() == null ? null : trendTimesVO.getBrandId().toString());
|
|
|
- if (trendTimesVOSBrand == null) {
|
|
|
- //未查询到则构造map key为品牌id
|
|
|
- trendTimesVOSBrand = new ArrayList<>();
|
|
|
- trendTimesVOSBrand.add(trendTimesVO);
|
|
|
- treadTrend.put(trendTimesVO.getBrandId() != null ? trendTimesVO.getBrandId().toString() : "all", trendTimesVOSBrand);
|
|
|
- } else {
|
|
|
- trendTimesVOSBrand.add(trendTimesVO);
|
|
|
+ return trendVOList;
|
|
|
+ }
|
|
|
+ private void initUserTrend(List<TrendVO> trendVOList, LinkedHashMap<Integer, List<TrendTimesVO>> tradeTrend){
|
|
|
+ //全部交易额
|
|
|
+ TrendVO trendVO = new TrendVO();
|
|
|
+ trendVO.setName("全部");
|
|
|
+ LinkedList<Map<String, Object>> allAmt = new LinkedList<>();
|
|
|
+ for (Integer date : tradeTrend.keySet()) {
|
|
|
+ List<TrendTimesVO> trendTimesList = tradeTrend.get(date);
|
|
|
+ //当前月份的所有总和
|
|
|
+ BigDecimal totalAmt = trendTimesList.stream().map(TrendTimesVO::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ allAmt.addFirst(MapUtil.<String, Object>builder().put("time", date).put("tradeAmt", totalAmt).build());
|
|
|
+ }
|
|
|
+ trendVO.setTimes(allAmt);
|
|
|
+ trendVOList.add(trendVO);
|
|
|
+ //各品牌交易额
|
|
|
+ for (Integer brandId : getBrandMap().keySet()) {
|
|
|
+ TrendVO trendBrandVO = new TrendVO();
|
|
|
+ trendBrandVO.setName(getBrandMap().get(brandId).getName());
|
|
|
+ LinkedList<Map<String, Object>> brandAmt = new LinkedList<>();
|
|
|
+ for (Integer date : tradeTrend.keySet()) {
|
|
|
+ List<TrendTimesVO> trendTimesList = tradeTrend.get(date);
|
|
|
+ BigDecimal totalAmt = trendTimesList.stream().filter(item -> Objects.equals(brandId, item.getBrandId())).map(TrendTimesVO::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ brandAmt.addFirst(MapUtil.<String, Object>builder().put("time", date).put("tradeAmt", totalAmt).build());
|
|
|
}
|
|
|
+ trendBrandVO.setTimes(brandAmt);
|
|
|
+ trendVOList.add(trendBrandVO);
|
|
|
}
|
|
|
- //将map转换为返回实体类
|
|
|
- ArrayList<TrendVO> trendVOS = new ArrayList<>();
|
|
|
- for (Map.Entry<String, List<TrendTimesVO>> entry : treadTrend.entrySet()) {
|
|
|
- //补0数据
|
|
|
- repZero(times, entry.getValue());
|
|
|
- TrendVO trendVO = new TrendVO();
|
|
|
- trendVO.setName(entry.getKey());
|
|
|
- trendVO.setTimes(entry.getValue());
|
|
|
- trendVOS.add(trendVO);
|
|
|
- }
|
|
|
- return trendVOS;
|
|
|
}
|
|
|
|
|
|
|
|
|
+ private Map<Integer, KxsBrand>getBrandMap(){
|
|
|
+ if(brandsMap == null){
|
|
|
+ R<List<KxsBrand>> brandRes = remoteKxsProductService.loadByAllBrand();
|
|
|
+ List<KxsBrand> brands = RetOps.of(brandRes)
|
|
|
+ .getData()
|
|
|
+ .orElseThrow(() -> new GlobalCustomerException("获取品牌列表为空"));
|
|
|
+ brandsMap = brands.stream().collect(Collectors.toMap(KxsBrand::getId, Function.identity()));
|
|
|
+ }
|
|
|
+ return brandsMap;
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
|