|
|
@@ -17,10 +17,7 @@ import com.kxs.stat.api.model.KxsUserTrade;
|
|
|
import com.kxs.stat.api.vo.ShdTradeAmtVO;
|
|
|
import com.kxs.stat.api.vo.statUser.*;
|
|
|
import com.kxs.stat.biz.constant.enums.TotalTypeEnum;
|
|
|
-import com.kxs.stat.biz.mapper.KxsLkbTradeMapper;
|
|
|
-import com.kxs.stat.biz.mapper.KxsUserActTradeMapper;
|
|
|
-import com.kxs.stat.biz.mapper.KxsUserLogoutTradeMapper;
|
|
|
-import com.kxs.stat.biz.mapper.KxsUserTradeMapper;
|
|
|
+import com.kxs.stat.biz.mapper.*;
|
|
|
import com.kxs.stat.biz.service.KxsUserTradeService;
|
|
|
import com.kxs.user.api.dto.kxsapp.IntegralStatDTO;
|
|
|
import com.kxs.user.api.feign.RemoteKxsUserService;
|
|
|
@@ -36,7 +33,6 @@ import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
import java.time.LocalDate;
|
|
|
import java.time.LocalDateTime;
|
|
|
-import java.time.format.DateTimeFormatter;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
@@ -62,6 +58,7 @@ public class KxsUserTradeServiceImpl extends ServiceImpl<KxsUserTradeMapper, Kxs
|
|
|
|
|
|
private final KxsUserLogoutTradeMapper kxsUserLogoutTradeMapper;
|
|
|
|
|
|
+ private final KxsUserNewTradeMapper kxsUserNewTradeMapper;
|
|
|
private final static String PREFIX_TABLE_NAME = "kxs_user_trade_";
|
|
|
private final static String PREFIX_TABLE_NAME_TEMP = "kxs_user_trade_temp_";
|
|
|
|
|
|
@@ -230,110 +227,172 @@ public class KxsUserTradeServiceImpl extends ServiceImpl<KxsUserTradeMapper, Kxs
|
|
|
lastMonthTimes.add(currentDateString);
|
|
|
}
|
|
|
}
|
|
|
- //开始查询
|
|
|
- //查询全部pos交易
|
|
|
- String thisMoth = LocalDateTimeUtil.format(now, DatePattern.SIMPLE_MONTH_PATTERN);
|
|
|
- String tableName = PREFIX_TABLE_NAME + thisMoth;
|
|
|
- //获取到日期以及金额
|
|
|
- List<TrendTimesVO> trendTimesVOS = baseMapper.getUserTradeListByDay(tableName,times,userId,null);
|
|
|
- //判断是否需要二次查询
|
|
|
- if (lastMonthTimes != null){
|
|
|
- List<TrendTimesVO> trendTimesVOSByLastMonthTimes = baseMapper.getUserTradeListByDay(tableName, lastMonthTimes, userId,null);
|
|
|
- trendTimesVOS.addAll(trendTimesVOSByLastMonthTimes);
|
|
|
- }
|
|
|
- Map<String,List<TrendTimesVO>> treadTrend = new HashMap<>();
|
|
|
- treadTrend.put("all",trendTimesVOS);
|
|
|
- //查询品牌数据
|
|
|
- List<TrendTimesVO> trendTimesVOListBrand = baseMapper.getUserTradeListByDay(tableName, lastMonthTimes, userId,1);
|
|
|
- //循环将查询到的数据加入map
|
|
|
- for (TrendTimesVO trendTimesVO : trendTimesVOListBrand) {
|
|
|
- List<TrendTimesVO> trendTimesVOSBrand = treadTrend.get(trendTimesVO.getBrandId().toString());
|
|
|
- if (trendTimesVOSBrand == null){
|
|
|
- //未查询到则构造map key为品牌id
|
|
|
- trendTimesVOSBrand = new ArrayList<>();
|
|
|
- trendTimesVOSBrand.add(trendTimesVO);
|
|
|
- treadTrend.put(trendTimesVO.getBrandId().toString(),trendTimesVOSBrand);
|
|
|
- }else {
|
|
|
- trendTimesVOSBrand.add(trendTimesVO);
|
|
|
- }
|
|
|
- }
|
|
|
- ArrayList<TrendVO> trendVOS = new ArrayList<>();
|
|
|
- for (Map.Entry<String, List<TrendTimesVO>> entry : treadTrend.entrySet()) {
|
|
|
- TrendVO trendVO = new TrendVO();
|
|
|
- trendVO.setName(entry.getKey());
|
|
|
- trendVO.setTimes(entry.getValue());
|
|
|
- trendVOS.add(trendVO);
|
|
|
- }
|
|
|
- //获取全部品牌总交易额
|
|
|
- List<PercentVO> percentVOS = baseMapper.getUserTradeTotal(userId);
|
|
|
- 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.HALF_UP));
|
|
|
- }
|
|
|
- //获取激活商户
|
|
|
- List<TrendTimesVO> trendTimesVOSAct = kxsUserActTradeMapper.getUserActListByDay(times,userId);
|
|
|
- Integer totalCount = 0;
|
|
|
- for (TrendTimesVO trendTimesVO : trendTimesVOSAct) {
|
|
|
- totalCount += trendTimesVO.getTotal();
|
|
|
- }
|
|
|
-// for (){
|
|
|
-//
|
|
|
-// }
|
|
|
- StatUserGetUserStatByDayOrMonthVO statUserGetUserStatByDayOrMonthVO = new StatUserGetUserStatByDayOrMonthVO();
|
|
|
- statUserGetUserStatByDayOrMonthVO.setTreadePercent(percentVOS);//交易百分比
|
|
|
- statUserGetUserStatByDayOrMonthVO.setTreadeTotal(totalAmout);//交易总额
|
|
|
-// statUserGetUserStatByDayOrMonthVO.setTreadeTrend(trendVOS);//交易趋势
|
|
|
-// statUserGetUserStatByDayOrMonthVO.setActMerchantPercent();
|
|
|
-// statUserGetUserStatByDayOrMonthVO.setActMerchantTotal(totalCount);
|
|
|
-// statUserGetUserStatByDayOrMonthVO.setActMerchantTrend();
|
|
|
-// statUserGetUserStatByDayOrMonthVO.setUserAddTrend();
|
|
|
-
|
|
|
+ StatUserGetUserStatByDayOrMonthVO statUserGetUserStatByDayOrMonthVO = getStatUserGetUserStatByDayOrMonthVO(userId, now, times, lastMonthTimes,type);
|
|
|
+ return R.ok(statUserGetUserStatByDayOrMonthVO);
|
|
|
} 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);
|
|
|
+ return R.ok(statUserGetUserStatByDayOrMonthVO);
|
|
|
} else {
|
|
|
return R.failed("类型错误");
|
|
|
}
|
|
|
-
|
|
|
- return null;
|
|
|
}
|
|
|
|
|
|
+ private StatUserGetUserStatByDayOrMonthVO getStatUserGetUserStatByDayOrMonthVO(Long userId, LocalDate now, List<String> times, List<String> lastMonthTimes, Integer type) {
|
|
|
+ StatUserGetUserStatByDayOrMonthVO statUserGetUserStatByDayOrMonthVO = new StatUserGetUserStatByDayOrMonthVO();
|
|
|
+ /* ------ 交易趋势图 ------ */
|
|
|
+ setTreadeTrend(userId, now, times, lastMonthTimes, statUserGetUserStatByDayOrMonthVO,type);
|
|
|
+ /* ------ 交易百分比及总额 ------ */
|
|
|
+ setTreadeTotalAndPercent(userId, times, lastMonthTimes, statUserGetUserStatByDayOrMonthVO,type);
|
|
|
+ /* ------ 激活百分比及总额 ------ */
|
|
|
+ setActTotalAndPercent(userId, times, lastMonthTimes, statUserGetUserStatByDayOrMonthVO,type);
|
|
|
+ /* ------ 激活趋势图 ------ */
|
|
|
+ setActTrend(userId, times, lastMonthTimes, statUserGetUserStatByDayOrMonthVO,type);
|
|
|
+ /* ------ 新增用户趋势图 ------ */
|
|
|
+ setUserAddTrend(userId, times, type, statUserGetUserStatByDayOrMonthVO);
|
|
|
+ return statUserGetUserStatByDayOrMonthVO;
|
|
|
+ }
|
|
|
|
|
|
+ private void setUserAddTrend(Long userId, List<String> times, Integer type, StatUserGetUserStatByDayOrMonthVO statUserGetUserStatByDayOrMonthVO) {
|
|
|
+ TrendVO trendVO = new TrendVO();
|
|
|
+ List<TrendTimesVO> trendTimesVOS = kxsUserNewTradeMapper.getUserAddTrend(userId, times, type);
|
|
|
+ trendVO.setName("all");
|
|
|
+ trendVO.setTimes(trendTimesVOS);
|
|
|
+ statUserGetUserStatByDayOrMonthVO.setUserAddTrend(trendVO);
|
|
|
+ }
|
|
|
|
|
|
+ private void setActTrend(Long userId, List<String> times, List<String> lastMonthTimes, StatUserGetUserStatByDayOrMonthVO statUserGetUserStatByDayOrMonthVO,Integer type) {
|
|
|
+ //查询用户全部激活根据日期分组
|
|
|
+ List<TrendTimesVO> trendTimesActVOS = kxsUserActTradeMapper.getUserActListByDayOrMonth(times, userId,null,type);
|
|
|
+ //判断是否二次查询
|
|
|
+ if (lastMonthTimes != null){
|
|
|
+ List<TrendTimesVO> trendTimesActVOSLast = kxsUserActTradeMapper.getUserActListByDayOrMonth(lastMonthTimes, userId,null,type);
|
|
|
+ trendTimesActVOS.addAll(trendTimesActVOSLast);
|
|
|
+ }
|
|
|
+ //查询用户全部激活量根据 日期以及品牌 分组
|
|
|
+ List<TrendTimesVO> trendTimesActBrandVOS = kxsUserActTradeMapper.getUserActListByDayOrMonth(times, userId,1,type);
|
|
|
+ //判断是否二次查询
|
|
|
+ if (lastMonthTimes != null){
|
|
|
+ List<TrendTimesVO> trendTimesActBrandVOSLast = kxsUserActTradeMapper.getUserActListByDayOrMonth(lastMonthTimes, userId,1,type);
|
|
|
+ trendTimesActBrandVOS.addAll(trendTimesActBrandVOSLast);
|
|
|
+ }
|
|
|
+ //构造数据
|
|
|
+ ArrayList<TrendVO> trendVOSBrand = getTrendVOS(trendTimesActVOS, trendTimesActBrandVOS);
|
|
|
+ statUserGetUserStatByDayOrMonthVO.setActMerchantTrend(trendVOSBrand);//激活趋势图
|
|
|
+ }
|
|
|
|
|
|
+ private void setActTotalAndPercent(Long userId, List<String> times, List<String> lastMonthTimes, StatUserGetUserStatByDayOrMonthVO statUserGetUserStatByDayOrMonthVO, Integer type) {
|
|
|
+ //获取传入日期激活商户数根据品牌分组
|
|
|
+ List<PercentVO> percentVOSAct = kxsUserActTradeMapper.getUserTradeTotal(times, userId,type);
|
|
|
+ //判断是否二次查询
|
|
|
+ if (lastMonthTimes != null){
|
|
|
+ List<PercentVO> percentVOSActLast = kxsUserActTradeMapper.getUserTradeTotal(lastMonthTimes, userId,type);
|
|
|
+ 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.HALF_UP));
|
|
|
+ }
|
|
|
+ statUserGetUserStatByDayOrMonthVO.setActMerchantPercent(percentVOSAct);//激活百分比
|
|
|
+ statUserGetUserStatByDayOrMonthVO.setActMerchantTotal(actTotalCount);//激活总数
|
|
|
+ }
|
|
|
|
|
|
+ private void setTreadeTotalAndPercent(Long userId, List<String> times, List<String> lastMonthTimes, StatUserGetUserStatByDayOrMonthVO statUserGetUserStatByDayOrMonthVO,Integer type) {
|
|
|
+ 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);
|
|
|
+ //判断是否二次查询
|
|
|
+ if (lastMonthTimes != null){
|
|
|
+ List<PercentVO> percentVOSLast = baseMapper.getUserTradeTotal(tableName,userId, lastMonthTimes,type);
|
|
|
+ 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.HALF_UP));
|
|
|
+ }
|
|
|
+ statUserGetUserStatByDayOrMonthVO.setTreadePercent(percentVOS);//交易百分比
|
|
|
+ statUserGetUserStatByDayOrMonthVO.setTreadeTotal(totalAmout);//交易总额
|
|
|
+ }
|
|
|
|
|
|
+ private void setTreadeTrend(Long userId, LocalDate now, List<String> times, List<String> lastMonthTimes, StatUserGetUserStatByDayOrMonthVO statUserGetUserStatByDayOrMonthVO,Integer type) {
|
|
|
+ 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);
|
|
|
+ //判断是否需要二次查询
|
|
|
+ if (lastMonthTimes != null){
|
|
|
+ List<TrendTimesVO> trendTimesVOSByLastMonthTimes = baseMapper.getUserTradeListByDayOrMonth(tableName, lastMonthTimes, userId,null,type);
|
|
|
+ trendTimesVOS.addAll(trendTimesVOSByLastMonthTimes);
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ for (String month : times) {
|
|
|
+ //拼接表名
|
|
|
+ String newTableName = PREFIX_TABLE_NAME + month;
|
|
|
+ try{
|
|
|
+ List<TrendTimesVO> userTradeListByDayOrMonth = baseMapper.getUserTradeListByDayOrMonth(newTableName, times, userId, null, type);
|
|
|
+ trendTimesVOS.addAll(userTradeListByDayOrMonth);
|
|
|
+ }catch (Exception e){
|
|
|
+ log.info(e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //查询用户全部交易额根据 日期以及品牌 分组
|
|
|
+ List<TrendTimesVO> trendTimesVOListBrand = baseMapper.getUserTradeListByDayOrMonth(tableName, times, userId,1,type);
|
|
|
+ //判断是否需要二次查询
|
|
|
+ if (lastMonthTimes != null){
|
|
|
+ List<TrendTimesVO> trendTimesVOListBrandLast = baseMapper.getUserTradeListByDayOrMonth(tableName, lastMonthTimes, userId,1,type);
|
|
|
+ trendTimesVOListBrand.addAll(trendTimesVOListBrandLast);
|
|
|
+ }
|
|
|
+ //构造数据
|
|
|
+ ArrayList<TrendVO> trendVOS = getTrendVOS(trendTimesVOS, trendTimesVOListBrand);
|
|
|
+ statUserGetUserStatByDayOrMonthVO.setTreadeTrend(trendVOS);//交易趋势
|
|
|
+ }
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+ private static ArrayList<TrendVO> getTrendVOS(List<TrendTimesVO> trendTimesVOS, List<TrendTimesVO> trendTimesVOListBrand) {
|
|
|
+ //将全部交易额以及品牌交易额构造进入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().toString());
|
|
|
+ if (trendTimesVOSBrand == null){
|
|
|
+ //未查询到则构造map key为品牌id
|
|
|
+ trendTimesVOSBrand = new ArrayList<>();
|
|
|
+ trendTimesVOSBrand.add(trendTimesVO);
|
|
|
+ treadTrend.put(trendTimesVO.getBrandId().toString(),trendTimesVOSBrand);
|
|
|
+ }else {
|
|
|
+ trendTimesVOSBrand.add(trendTimesVO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //将map转换为返回实体类
|
|
|
+ ArrayList<TrendVO> trendVOS = new ArrayList<>();
|
|
|
+ for (Map.Entry<String, List<TrendTimesVO>> entry : treadTrend.entrySet()) {
|
|
|
+ TrendVO trendVO = new TrendVO();
|
|
|
+ trendVO.setName(entry.getKey());
|
|
|
+ trendVO.setTimes(entry.getValue());
|
|
|
+ trendVOS.add(trendVO);
|
|
|
+ }
|
|
|
+ return trendVOS;
|
|
|
+ }
|
|
|
|
|
|
|
|
|
}
|