|
|
@@ -8,11 +8,14 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.kxs.common.core.constant.CommonConstants;
|
|
|
import com.kxs.common.core.constant.SecurityConstants;
|
|
|
+import com.kxs.common.core.util.R;
|
|
|
+import com.kxs.stat.api.dto.statUser.StatUserGetUserStatByDayOrMonthDTO;
|
|
|
import com.kxs.stat.api.model.KxsLkbTrade;
|
|
|
import com.kxs.stat.api.model.KxsUserActTrade;
|
|
|
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.statUser.*;
|
|
|
import com.kxs.stat.biz.constant.enums.TotalTypeEnum;
|
|
|
import com.kxs.stat.biz.mapper.KxsLkbTradeMapper;
|
|
|
import com.kxs.stat.biz.mapper.KxsUserActTradeMapper;
|
|
|
@@ -30,10 +33,14 @@ 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.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
|
|
|
/**
|
|
|
* 个人交易统计总表(KxsUserTrade)表服务实现类
|
|
|
@@ -65,9 +72,9 @@ public class KxsUserTradeServiceImpl extends ServiceImpl<KxsUserTradeMapper, Kxs
|
|
|
//拼接表名
|
|
|
String thisMoth;
|
|
|
//如果定时任务传了参数就使用定时任务的参数
|
|
|
- if(StrUtil.isNotBlank(para)){
|
|
|
+ if (StrUtil.isNotBlank(para)) {
|
|
|
thisMoth = para;
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
thisMoth = LocalDateTimeUtil.format(LocalDate.now(), DatePattern.SIMPLE_MONTH_PATTERN);
|
|
|
}
|
|
|
|
|
|
@@ -87,12 +94,12 @@ public class KxsUserTradeServiceImpl extends ServiceImpl<KxsUserTradeMapper, Kxs
|
|
|
Cursor<ShdTradeAmtVO> kxsUserTrades = baseMapper.getUserTradeList(tableName);
|
|
|
for (ShdTradeAmtVO kxsUserTrade : kxsUserTrades) {
|
|
|
ShdTradeAmtVO shdTradeAmtVO = baseMapper.getTempShdTableData(tempTableName, kxsUserTrade.getUserId());
|
|
|
- if(shdTradeAmtVO == null){
|
|
|
+ if (shdTradeAmtVO == null) {
|
|
|
shdTradeAmtVO = new ShdTradeAmtVO();
|
|
|
shdTradeAmtVO.setUserId(kxsUserTrade.getUserId());
|
|
|
shdTradeAmtVO.setPosAmt(kxsUserTrade.getPosAmt());
|
|
|
baseMapper.insertTempShdTableData(tempTableName, shdTradeAmtVO);
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
shdTradeAmtVO.setPosAmt(shdTradeAmtVO.getPosAmt());
|
|
|
baseMapper.updateTempShdTableData(tempTableName, shdTradeAmtVO);
|
|
|
}
|
|
|
@@ -102,19 +109,19 @@ public class KxsUserTradeServiceImpl extends ServiceImpl<KxsUserTradeMapper, Kxs
|
|
|
Cursor<KxsLkbTrade> lkbTrades = kxsLkbTradeMapper.getUserTradeMonthList(thisMoth);
|
|
|
for (KxsLkbTrade lkbTrade : lkbTrades) {
|
|
|
ShdTradeAmtVO shdTradeAmtVO = baseMapper.getTempShdTableData(tempTableName, lkbTrade.getUserId());
|
|
|
- if(shdTradeAmtVO == null){
|
|
|
+ if (shdTradeAmtVO == null) {
|
|
|
shdTradeAmtVO = new ShdTradeAmtVO();
|
|
|
shdTradeAmtVO.setUserId(lkbTrade.getUserId());
|
|
|
shdTradeAmtVO.setLkbAmt(lkbTrade.getTradeAmt());
|
|
|
//活动交易 * 4加入
|
|
|
- if(lkbTrade.getActTradeAmt() != null){
|
|
|
+ if (lkbTrade.getActTradeAmt() != null) {
|
|
|
shdTradeAmtVO.setLkbActAmt(lkbTrade.getActTradeAmt().multiply(BigDecimal.valueOf(4)));
|
|
|
}
|
|
|
baseMapper.insertTempShdTableData(tempTableName, shdTradeAmtVO);
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
shdTradeAmtVO.setLkbAmt(lkbTrade.getTradeAmt());
|
|
|
//活动交易 * 4加入
|
|
|
- if(lkbTrade.getActTradeAmt() != null){
|
|
|
+ if (lkbTrade.getActTradeAmt() != null) {
|
|
|
shdTradeAmtVO.setLkbActAmt(lkbTrade.getActTradeAmt().multiply(BigDecimal.valueOf(4)));
|
|
|
}
|
|
|
baseMapper.updateTempShdTableData(tempTableName, shdTradeAmtVO);
|
|
|
@@ -130,17 +137,17 @@ public class KxsUserTradeServiceImpl extends ServiceImpl<KxsUserTradeMapper, Kxs
|
|
|
.eq(KxsUserLogoutTrade::getUserId, kxsUserActTrade.getUserId())
|
|
|
.eq(KxsUserLogoutTrade::getTotalType, TotalTypeEnum.TEAM.getType()).last("limit 1"));
|
|
|
//总激活数 减去注销的卡 = 实际激活总数
|
|
|
- if(kxsUserLogoutTrade != null){
|
|
|
+ if (kxsUserLogoutTrade != null) {
|
|
|
actNum = actNum - kxsUserLogoutTrade.getLogoutNum();
|
|
|
}
|
|
|
ShdTradeAmtVO shdTradeAmtVO = baseMapper.getTempShdTableData(tempTableName, kxsUserActTrade.getUserId());
|
|
|
- if(shdTradeAmtVO == null){
|
|
|
+ if (shdTradeAmtVO == null) {
|
|
|
shdTradeAmtVO = new ShdTradeAmtVO();
|
|
|
shdTradeAmtVO.setUserId(kxsUserActTrade.getUserId());
|
|
|
//广电卡 * 10000加入
|
|
|
shdTradeAmtVO.setGdAmt(NumberUtil.mul(actNum, CommonConstants.GD_CARDINAL_NUMBER));
|
|
|
baseMapper.insertTempShdTableData(tempTableName, shdTradeAmtVO);
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
//广电卡 * 10000加入
|
|
|
shdTradeAmtVO.setGdAmt(NumberUtil.mul(actNum, CommonConstants.GD_CARDINAL_NUMBER));
|
|
|
baseMapper.updateTempShdTableData(tempTableName, shdTradeAmtVO);
|
|
|
@@ -152,19 +159,19 @@ public class KxsUserTradeServiceImpl extends ServiceImpl<KxsUserTradeMapper, Kxs
|
|
|
for (ShdTradeAmtVO kxsUserTrade : shdTradeAmtVOList) {
|
|
|
//pos交易额 + 来客吧非活动交易额
|
|
|
BigDecimal totalAmount = BigDecimal.ZERO;
|
|
|
- if(kxsUserTrade.getPosAmt() != null){
|
|
|
+ if (kxsUserTrade.getPosAmt() != null) {
|
|
|
totalAmount = totalAmount.add(kxsUserTrade.getPosAmt());
|
|
|
}
|
|
|
- if(kxsUserTrade.getLkbAmt() != null){
|
|
|
+ if (kxsUserTrade.getLkbAmt() != null) {
|
|
|
totalAmount = totalAmount.add(kxsUserTrade.getLkbAmt());
|
|
|
}
|
|
|
- if(kxsUserTrade.getGdAmt() != null){
|
|
|
+ if (kxsUserTrade.getGdAmt() != null) {
|
|
|
totalAmount = totalAmount.add(kxsUserTrade.getGdAmt());
|
|
|
}
|
|
|
- if(kxsUserTrade.getLkbActAmt() != null){
|
|
|
+ if (kxsUserTrade.getLkbActAmt() != null) {
|
|
|
totalAmount = totalAmount.add(kxsUserTrade.getLkbActAmt());
|
|
|
}
|
|
|
- if(totalAmount.compareTo(CommonConstants.MAX_TOTAL_AMT) >= 0){
|
|
|
+ if (totalAmount.compareTo(CommonConstants.MAX_TOTAL_AMT) >= 0) {
|
|
|
IntegralStatDTO integralStatDTO = new IntegralStatDTO();
|
|
|
integralStatDTO.setTradeMonth(thisMoth);
|
|
|
integralStatDTO.setUserId(Long.valueOf(kxsUserTrade.getUserId()));
|
|
|
@@ -194,6 +201,140 @@ public class KxsUserTradeServiceImpl extends ServiceImpl<KxsUserTradeMapper, Kxs
|
|
|
String tableName = PREFIX_TABLE_NAME + month;
|
|
|
return baseMapper.getStatAmount(tableName);
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public R getUserStatByDayOrMonth(StatUserGetUserStatByDayOrMonthDTO param) {
|
|
|
+ Long userId = param.getUserId();
|
|
|
+ Integer type = param.getType();
|
|
|
+ LocalDate now = LocalDate.now();
|
|
|
+ List<String> times = new ArrayList<>();
|
|
|
+ List<String> lastMonthTimes = null;
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //开始查询
|
|
|
+ //查询全部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();
|
|
|
+
|
|
|
+ } 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);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return R.failed("类型错误");
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
}
|
|
|
|