admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/service/impl/count/DailyCountUserServiceImpl.java
@@ -1,539 +1,532 @@
package com.yeshi.fanli.service.impl.count;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.yeshi.utils.DateUtil;
import com.yeshi.fanli.dao.user.count.DailyCountUserDao;
import com.yeshi.fanli.entity.admin.count.DailyCountUser;
import com.yeshi.fanli.entity.admin.count.DailyCountUser.DailyCountUserEnum;
import com.yeshi.fanli.entity.bus.user.Extract;
import com.yeshi.fanli.entity.bus.user.UserInfoRegister;
import com.yeshi.fanli.entity.system.ChannelEnum;
import com.yeshi.fanli.service.inter.count.DailyCountUserService;
import com.yeshi.fanli.service.inter.money.extract.ExtractAuditRecordService;
import com.yeshi.fanli.service.inter.order.CommonOrderCountService;
import com.yeshi.fanli.service.inter.redpack.RedPackDetailService;
import com.yeshi.fanli.service.inter.tlj.UserTaoLiJinDetailService;
import com.yeshi.fanli.service.inter.user.UserActiveLogService;
import com.yeshi.fanli.service.inter.user.UserInfoRegisterService;
import com.yeshi.fanli.service.inter.user.integral.IntegralDetailService;
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TimeUtil;
@Service
public class DailyCountUserServiceImpl implements DailyCountUserService {
   @Resource
   private DailyCountUserDao dailyCountUserDao;
   @Resource
   private UserInfoRegisterService userInfoRegisterService;
   @Resource
   private CommonOrderCountService commonOrderCountService;
   @Resource
   private UserActiveLogService userActiveLogService;
   @Resource
   private IntegralDetailService integralDetailService;
   @Resource
   private RedPackDetailService redPackDetailService;
   @Resource
   private UserTaoLiJinDetailService userTaoLiJinDetailService;
   @Resource
   private ExtractAuditRecordService extractAuditRecordService;
   @Override
   public List<DailyCountUser> getDailyCountList(String type, Date startTime, Date endTime, String channel) throws Exception {
      // 查询类型
      DailyCountUserEnum typeEnum = getTypeEnum(type);
      if (typeEnum == null) {
         return null;
      }
      // 初始化数据
      initData(typeEnum);
      return dailyCountUserDao.query(typeEnum, startTime, endTime, channel);
   }
   /**
    * 获取枚举类型
    * @param type
    * @return
    */
   private DailyCountUserEnum getTypeEnum(String name) {
      if (StringUtil.isNullOrEmpty(name)) {
         return null;
      }
      DailyCountUserEnum[] array = DailyCountUserEnum.values();
      for (int i = 0; i < array.length; i ++) {
         if (array[i].name().equals(name)) {
            return array[i];
         }
      }
      return null;
   }
   /**
    * 获取枚举类型
    * @param type
    * @return
    */
   @Override
   public String getTypeEnumDesc(String name) {
      if (StringUtil.isNullOrEmpty(name)) {
         return "";
      }
      DailyCountUserEnum[] array = DailyCountUserEnum.values();
      for (int i = 0; i < array.length; i ++) {
         if (array[i].name().equals(name)) {
            return array[i].getDesc();
         }
      }
      return "";
   }
   /**
    * 初始数据
    * @param typeEnum
    * @throws Exception
    */
   @Override
   public void initData(DailyCountUserEnum typeEnum) throws Exception {
      Date lastDate = null;
      DailyCountUser lastRecord = dailyCountUserDao.getMaxDate(typeEnum);
      if (lastRecord != null) {
         lastDate = lastRecord.getUpdateDate();
      } else {
         lastDate = TimeUtil.parse("2017-05-06");
      }
      long min = DateUtil.dateDiffMin(lastDate, new Date());
      if (min <= 10) { // 10分钟以内不统计
         return;
      }
      Date today = new Date();
      int betweenDays = DateUtil.daysBetween2(lastDate, today);
      for (int i = 0; i <= betweenDays; i++) {
         // 计算日期
         String preDay = DateUtil.plusDay(i, lastDate);
         // 统计数据
         if (DailyCountUserEnum.newUserChannel == typeEnum) {
            addNewUserChannel(preDay, typeEnum);
         } else if (DailyCountUserEnum.newUserDownOrderDay == typeEnum) {
            addNewUserDownOrderDay(preDay, typeEnum);
         } else if (DailyCountUserEnum.newUserDownOrderWeek == typeEnum) {
            addNewUserDownOrderWeek(preDay);
         } else if (DailyCountUserEnum.newUserDownOrderWeek3 == typeEnum) {
            addNewUserDownOrderWeek(preDay);
         } else if (DailyCountUserEnum.activeAgain90 == typeEnum) {
            addActiveAgain90(preDay, typeEnum);
         } else if (DailyCountUserEnum.integralNum == typeEnum) {
            addIntegralNum(preDay, typeEnum);
         } else if (DailyCountUserEnum.newUserTljNum == typeEnum) {
            addNewUserTljNum(preDay, typeEnum);
         } else if (DailyCountUserEnum.newUserTljMoney == typeEnum) {
            addNewUserTljMoney(preDay, typeEnum);
         } else if (DailyCountUserEnum.redpackNum == typeEnum) {
            addRedpackNum(preDay, typeEnum);
         } else if (DailyCountUserEnum.redpackMoney == typeEnum) {
            addRedpackMoney(preDay, typeEnum);
         } else if (DailyCountUserEnum.extractApplyNumber == typeEnum) {
            addExtractApplyNumber(preDay, typeEnum);
         } else if (DailyCountUserEnum.extractApplyMoney == typeEnum) {
            addExtractApplyMoney(preDay, typeEnum);
         } else if (DailyCountUserEnum.extractAuditPass == typeEnum) {
            addExtractAuditNum(preDay, Extract.STATE_PASS, typeEnum);
         } else if (DailyCountUserEnum.extractAuditReject == typeEnum) {
            addExtractAuditNum(preDay, Extract.STATE_REJECT, typeEnum);
         }
      }
   }
   /**
    * 统计各个渠道新增用户数量
    * @param preDay
    */
   private void addNewUserChannel(String preDay, DailyCountUserEnum typeEnum) throws Exception{
      ChannelEnum[] channels = ChannelEnum.values();
      for (int i = 0; i < channels.length; i++) {
         Long count = userInfoRegisterService.countByChannelAndDay(channels[i].getVlaue(), preDay);
         if (count == null) {
            count = 0L;
         }
         DailyCountUser obj = new DailyCountUser();
         obj.setTotal(BigDecimal.valueOf(count));
         obj.setType(typeEnum);
         obj.setChannel(channels[i].name());
         obj.setUpdateDate(new Date());
         obj.setDay(TimeUtil.parse(preDay));
         obj.setId(StringUtil.Md5(preDay + channels[i].name() + typeEnum.name()));
         dailyCountUserDao.save(obj);
      }
   }
   /**
    * 统计各个渠道每日下单转化率
    * @param preDay
    * @throws Exception
    */
   private void addNewUserDownOrderDay(String preDay, DailyCountUserEnum typeEnum) throws Exception {
      // 统计当日有效订单
      List<Long> listOrder = commonOrderCountService.getUidByValidOrderByDay(preDay);
      // 查询当日新注册用户
      List<UserInfoRegister> listRegister = userInfoRegisterService.listByDay(preDay);
      ChannelEnum[] channels = ChannelEnum.values();
      for (int i = 0; i < channels.length; i++) {
         long totalDay = 0;
         long totalValid = 0;
         String channelName = channels[i].getVlaue();
         if (listOrder != null && listOrder.size() > 0 && listRegister != null && listRegister.size() > 0) {
            for (UserInfoRegister register: listRegister) {
               String channel = register.getChannel();
               if (channelName.equalsIgnoreCase(channel)) {
                  totalDay ++ ;
               }
               Long id = register.getId();
               // 判断当前用户是否今日下单
               for (Long uid: listOrder) {
                  if (uid.longValue() == id.longValue()) {
                     totalValid ++;
                     break;
                  }
               }
            }
         }
         // 计算比例: 下单用户数/新增用户数
         BigDecimal total = new BigDecimal(0);
         if (totalDay > 0 && totalValid > 0) {
            total = MoneyBigDecimalUtil.div(BigDecimal.valueOf(totalValid),BigDecimal.valueOf(totalDay));
            total = MoneyBigDecimalUtil.mul(total, BigDecimal.valueOf(100));
         }
         DailyCountUser obj = new DailyCountUser();
         obj.setTotal(total);
         obj.setRate(true);
         obj.setTotalDay(BigDecimal.valueOf(totalDay));
         obj.setTotalValid(BigDecimal.valueOf(totalValid));
         obj.setType(typeEnum);
         obj.setChannel(channels[i].name());
         obj.setUpdateDate(new Date());
         obj.setDay(TimeUtil.parse(preDay));
         obj.setId(StringUtil.Md5(preDay + channels[i].name() + typeEnum.name()));
         dailyCountUserDao.save(obj);
      }
   }
   /**
    * 统计当周下单数据
    * @param preDay
    * @throws Exception
    */
   private void addNewUserDownOrderWeek(String preDay) throws Exception {
      // 加上6天 -注册一周内数据
      Date startDay = new Date(TimeUtil.convertDateToTemp2(preDay + " 23:59:59"));
      Date limitDay = DateUtil.plusDayDate(6, startDay);
      // 渠道数据
      ChannelEnum[] channels = ChannelEnum.values();
      for (int i = 0; i < channels.length; i++) {
         long totalUser = 0;
         long totalWeek = 0;
         long totalWeek3 = 0;
         List<Long> listUid = new ArrayList<Long>();
         // 查询今日新增用户
         List<UserInfoRegister> list = userInfoRegisterService.listByChannelAndDay(channels[i].getVlaue(), preDay);
         if (list != null && list.size() > 0) {
            System.out.println("***********************" +list.size());
            totalUser = list.size();
            for (UserInfoRegister user : list) {
               listUid.add(user.getId());
            }
         }
         if (listUid.size() > 0) {
            List<Long> listUidDown = commonOrderCountService.getDownOrderUserByListUidAndDate(limitDay, listUid);
            if (listUidDown != null && listUidDown.size() > 0) {
               System.out.println("***********************" +listUidDown.size());
               for (Long uid: listUid) {
                  int total = 0;
                  for (Long id: listUidDown) {
                     if (uid.longValue() == id.longValue()) {
                        total ++;
                     }
                  }
                  if (total > 0) {
                     System.out.println("-----------------------------------------------------");
                     totalWeek ++;
                     System.out.println(totalWeek);
                     System.out.println("-----------------------------------------------------");
                  }
                  if (total >= 3) {
                     System.out.println("-----------------------------------------------------");
                     totalWeek3 ++;
                     System.out.println(totalWeek3);
                     System.out.println("-----------------------------------------------------");
                  }
               }
            }
         }
         // 计算比例:当周 下单用户数/新增用户数
         BigDecimal total = new BigDecimal(0);
         if (totalUser > 0 && totalWeek > 0) {
            total = MoneyBigDecimalUtil.div(BigDecimal.valueOf(totalWeek),BigDecimal.valueOf(totalUser));
            total = MoneyBigDecimalUtil.mul(total, BigDecimal.valueOf(100));
         }
         DailyCountUser obj = new DailyCountUser();
         obj.setRate(true);
         obj.setTotalDay(BigDecimal.valueOf(totalUser));
         obj.setTotalValid(BigDecimal.valueOf(totalWeek));
         obj.setTotal(total);
         obj.setType(DailyCountUserEnum.newUserDownOrderWeek);
         obj.setChannel(channels[i].name());
         obj.setUpdateDate(new Date());
         obj.setDay(TimeUtil.parse(preDay));
         obj.setId(StringUtil.Md5(preDay + channels[i].name() + DailyCountUserEnum.newUserDownOrderWeek.name()));
         dailyCountUserDao.save(obj);
         // 计算比例: 下3单用户数/新增用户数
         BigDecimal total3 = new BigDecimal(0);
         if (totalUser > 0 && totalWeek3 > 0) {
            total3 = MoneyBigDecimalUtil.div(BigDecimal.valueOf(totalWeek3),BigDecimal.valueOf(totalUser));
            total3 = MoneyBigDecimalUtil.mul(total3, BigDecimal.valueOf(100));
         }
         DailyCountUser obj3 = new DailyCountUser();
         obj3.setRate(true);
         obj3.setTotalDay(BigDecimal.valueOf(totalUser));
         obj3.setTotalValid(BigDecimal.valueOf(totalWeek3));
         obj3.setTotal(total3);
         obj3.setType(DailyCountUserEnum.newUserDownOrderWeek3);
         obj3.setChannel(channels[i].name());
         obj3.setUpdateDate(new Date());
         obj3.setDay(TimeUtil.parse(preDay));
         obj3.setId(StringUtil.Md5(preDay + channels[i].name() + DailyCountUserEnum.newUserDownOrderWeek3.name()));
         dailyCountUserDao.save(obj3);
      }
   }
   /**
    * 统计90天内再次活跃
    * @param preDay
    * @throws Exception
    */
   private void addActiveAgain90(String preDay, DailyCountUserEnum typeEnum) throws Exception{
      long count = userActiveLogService.count90DaysLaterActiveNum(preDay);
      DailyCountUser obj3 = new DailyCountUser();
      obj3.setTotal(BigDecimal.valueOf(count));
      obj3.setType(typeEnum);
      obj3.setUpdateDate(new Date());
      obj3.setDay(TimeUtil.parse(preDay));
      obj3.setId(StringUtil.Md5(preDay + typeEnum.name()));
      dailyCountUserDao.save(obj3);
   }
   /**
    * 金币新增数量
    * @param preDay
    * @throws Exception
    */
   private void addIntegralNum(String preDay, DailyCountUserEnum typeEnum) throws Exception{
      Long count = integralDetailService.countNewAddByDate(preDay);
      if (count == null) {
         count = 0L;
      }
      DailyCountUser obj3 = new DailyCountUser();
      obj3.setTotal(BigDecimal.valueOf(count));
      obj3.setType(typeEnum);
      obj3.setUpdateDate(new Date());
      obj3.setDay(TimeUtil.parse(preDay));
      obj3.setId(StringUtil.Md5(preDay + typeEnum.name()));
      dailyCountUserDao.save(obj3);
   }
   /**
    * 红包新增数量
    * @param preDay
    * @throws Exception
    */
   private void addRedpackNum(String preDay, DailyCountUserEnum typeEnum) throws Exception{
      Long total = redPackDetailService.countNumByDay(preDay);
      if (total == null) {
         total = 0L;
      }
      DailyCountUser obj3 = new DailyCountUser();
      obj3.setTotal(new BigDecimal(total));
      obj3.setType(typeEnum);
      obj3.setUpdateDate(new Date());
      obj3.setDay(TimeUtil.parse(preDay));
      obj3.setId(StringUtil.Md5(preDay + typeEnum.name()));
      dailyCountUserDao.save(obj3);
   }
   /**
    * 红包新增金额
    * @param preDay
    * @throws Exception
    */
   private void addRedpackMoney(String preDay, DailyCountUserEnum typeEnum) throws Exception{
      BigDecimal total = redPackDetailService.countMoneyByDay(preDay);
      if (total == null) {
         total = new BigDecimal(0);
      }
      DailyCountUser obj3 = new DailyCountUser();
      obj3.setTotal(total);
      obj3.setType(typeEnum);
      obj3.setUpdateDate(new Date());
      obj3.setDay(TimeUtil.parse(preDay));
      obj3.setId(StringUtil.Md5(preDay + typeEnum.name()));
      dailyCountUserDao.save(obj3);
   }
   /**
    * 红包新增数量
    * @param preDay
    * @throws Exception
    */
   private void addNewUserTljNum(String preDay, DailyCountUserEnum typeEnum) throws Exception{
      Long total = userTaoLiJinDetailService.countNumByDay(preDay);
      if (total == null) {
         total = 0L;
      }
      DailyCountUser obj3 = new DailyCountUser();
      obj3.setTotal(new BigDecimal(total));
      obj3.setType(typeEnum);
      obj3.setUpdateDate(new Date());
      obj3.setDay(TimeUtil.parse(preDay));
      obj3.setId(StringUtil.Md5(preDay + typeEnum.name()));
      dailyCountUserDao.save(obj3);
   }
   /**
    * 红包新增金额
    * @param preDay
    * @throws Exception
    */
   private void addNewUserTljMoney(String preDay, DailyCountUserEnum typeEnum) throws Exception{
      BigDecimal total = userTaoLiJinDetailService.countMoneyByDay(preDay);
      if (total == null) {
         total = new BigDecimal(0);
      }
      DailyCountUser obj3 = new DailyCountUser();
      obj3.setTotal(total);
      obj3.setType(typeEnum);
      obj3.setUpdateDate(new Date());
      obj3.setDay(TimeUtil.parse(preDay));
      obj3.setId(StringUtil.Md5(preDay + typeEnum.name()));
      dailyCountUserDao.save(obj3);
   }
   /**
    * 提现申请数量
    * @param preDay
    * @throws Exception
    */
   private void addExtractApplyNumber(String preDay, DailyCountUserEnum typeEnum) throws Exception{
      Long total = extractAuditRecordService.countApplyNumberByDay(preDay);
      if (total == null) {
         total = 0L;
      }
      DailyCountUser obj3 = new DailyCountUser();
      obj3.setTotal(new BigDecimal(total));
      obj3.setType(typeEnum);
      obj3.setUpdateDate(new Date());
      obj3.setDay(TimeUtil.parse(preDay));
      obj3.setId(StringUtil.Md5(preDay + typeEnum.name()));
      dailyCountUserDao.save(obj3);
   }
   /**
    * 提现申请金额
    * @param preDay
    * @throws Exception
    */
   private void addExtractApplyMoney(String preDay, DailyCountUserEnum typeEnum) throws Exception{
      BigDecimal total = extractAuditRecordService.countApplyMoneyByDay(preDay);
      if (total == null) {
         total = new BigDecimal(0);
      }
      DailyCountUser obj3 = new DailyCountUser();
      obj3.setTotal(total);
      obj3.setType(typeEnum);
      obj3.setUpdateDate(new Date());
      obj3.setDay(TimeUtil.parse(preDay));
      obj3.setId(StringUtil.Md5(preDay + typeEnum.name()));
      dailyCountUserDao.save(obj3);
   }
   /**
    * 提现审核数量
    * @param preDay
    * @throws Exception
    */
   private void addExtractAuditNum(String preDay, int state, DailyCountUserEnum typeEnum) throws Exception{
      Long total = extractAuditRecordService.countAuditNumberByDay(state, preDay);
      if (total == null) {
         total = 0L;
      }
      DailyCountUser obj3 = new DailyCountUser();
      obj3.setTotal(new BigDecimal(total));
      obj3.setType(typeEnum);
      obj3.setUpdateDate(new Date());
      obj3.setDay(TimeUtil.parse(preDay));
      obj3.setId(StringUtil.Md5(preDay + state + typeEnum.name()));
      dailyCountUserDao.save(obj3);
   }
}
package com.yeshi.fanli.service.impl.count;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.yeshi.utils.DateUtil;
import com.yeshi.fanli.dao.user.count.DailyCountUserDao;
import com.yeshi.fanli.entity.admin.count.DailyCountUser;
import com.yeshi.fanli.entity.admin.count.DailyCountUser.DailyCountUserEnum;
import com.yeshi.fanli.entity.bus.user.Extract;
import com.yeshi.fanli.entity.bus.user.UserInfoRegister;
import com.yeshi.fanli.entity.system.ChannelEnum;
import com.yeshi.fanli.service.inter.count.DailyCountUserService;
import com.yeshi.fanli.service.inter.money.extract.ExtractAuditRecordService;
import com.yeshi.fanli.service.inter.order.CommonOrderCountService;
import com.yeshi.fanli.service.inter.redpack.RedPackDetailService;
import com.yeshi.fanli.service.inter.tlj.UserTaoLiJinDetailService;
import com.yeshi.fanli.service.inter.user.UserActiveLogService;
import com.yeshi.fanli.service.inter.user.UserInfoRegisterService;
import com.yeshi.fanli.service.inter.user.integral.IntegralDetailService;
import org.yeshi.utils.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.StringUtil;
import org.yeshi.utils.TimeUtil;
@Service
public class DailyCountUserServiceImpl implements DailyCountUserService {
   @Resource
   private DailyCountUserDao dailyCountUserDao;
   @Resource
   private UserInfoRegisterService userInfoRegisterService;
   @Resource
   private CommonOrderCountService commonOrderCountService;
   @Resource
   private UserActiveLogService userActiveLogService;
   @Resource
   private IntegralDetailService integralDetailService;
   @Resource
   private RedPackDetailService redPackDetailService;
   @Resource
   private UserTaoLiJinDetailService userTaoLiJinDetailService;
   @Resource
   private ExtractAuditRecordService extractAuditRecordService;
   @Override
   public List<DailyCountUser> getDailyCountList(String type, Date startTime, Date endTime, String channel) throws Exception {
      // 查询类型
      DailyCountUserEnum typeEnum = getTypeEnum(type);
      if (typeEnum == null) {
         return null;
      }
      // 初始化数据
      initData(typeEnum);
      return dailyCountUserDao.query(typeEnum, startTime, endTime, channel);
   }
   /**
    * 获取枚举类型
    * @param type
    * @return
    */
   private DailyCountUserEnum getTypeEnum(String name) {
      if (StringUtil.isNullOrEmpty(name)) {
         return null;
      }
      DailyCountUserEnum[] array = DailyCountUserEnum.values();
      for (int i = 0; i < array.length; i ++) {
         if (array[i].name().equals(name)) {
            return array[i];
         }
      }
      return null;
   }
   /**
    * 获取枚举类型
    * @param type
    * @return
    */
   @Override
   public String getTypeEnumDesc(String name) {
      if (StringUtil.isNullOrEmpty(name)) {
         return "";
      }
      DailyCountUserEnum[] array = DailyCountUserEnum.values();
      for (int i = 0; i < array.length; i ++) {
         if (array[i].name().equals(name)) {
            return array[i].getDesc();
         }
      }
      return "";
   }
   /**
    * 初始数据
    * @param typeEnum
    * @throws Exception
    */
   @Override
   public void initData(DailyCountUserEnum typeEnum) throws Exception {
      Date lastDate = null;
      DailyCountUser lastRecord = dailyCountUserDao.getMaxDate(typeEnum);
      if (lastRecord != null) {
         lastDate = lastRecord.getUpdateDate();
      } else {
         lastDate = TimeUtil.parse("2017-05-06");
      }
      long min = DateUtil.dateDiffMin(lastDate, new Date());
      if (min <= 10) { // 10分钟以内不统计
         return;
      }
      Date today = new Date();
      int betweenDays = DateUtil.daysBetween2(lastDate, today);
      for (int i = 0; i <= betweenDays; i++) {
         // 计算日期
         String preDay = DateUtil.plusDay(i, lastDate);
         // 统计数据
         if (DailyCountUserEnum.newUserChannel == typeEnum) {
            addNewUserChannel(preDay, typeEnum);
         } else if (DailyCountUserEnum.newUserDownOrderDay == typeEnum) {
            addNewUserDownOrderDay(preDay, typeEnum);
         } else if (DailyCountUserEnum.newUserDownOrderWeek == typeEnum) {
            addNewUserDownOrderWeek(preDay);
         } else if (DailyCountUserEnum.newUserDownOrderWeek3 == typeEnum) {
            addNewUserDownOrderWeek(preDay);
         } else if (DailyCountUserEnum.activeAgain90 == typeEnum) {
            addActiveAgain90(preDay, typeEnum);
         } else if (DailyCountUserEnum.integralNum == typeEnum) {
            addIntegralNum(preDay, typeEnum);
         } else if (DailyCountUserEnum.newUserTljNum == typeEnum) {
            addNewUserTljNum(preDay, typeEnum);
         } else if (DailyCountUserEnum.newUserTljMoney == typeEnum) {
            addNewUserTljMoney(preDay, typeEnum);
         } else if (DailyCountUserEnum.redpackNum == typeEnum) {
            addRedpackNum(preDay, typeEnum);
         } else if (DailyCountUserEnum.redpackMoney == typeEnum) {
            addRedpackMoney(preDay, typeEnum);
         } else if (DailyCountUserEnum.extractApplyNumber == typeEnum) {
            addExtractApplyNumber(preDay, typeEnum);
         } else if (DailyCountUserEnum.extractApplyMoney == typeEnum) {
            addExtractApplyMoney(preDay, typeEnum);
         } else if (DailyCountUserEnum.extractAuditPass == typeEnum) {
            addExtractAuditNum(preDay, Extract.STATE_PASS, typeEnum);
         } else if (DailyCountUserEnum.extractAuditReject == typeEnum) {
            addExtractAuditNum(preDay, Extract.STATE_REJECT, typeEnum);
         }
      }
   }
   /**
    * 统计各个渠道新增用户数量
    * @param preDay
    */
   private void addNewUserChannel(String preDay, DailyCountUserEnum typeEnum) throws Exception{
      ChannelEnum[] channels = ChannelEnum.values();
      for (int i = 0; i < channels.length; i++) {
         Long count = userInfoRegisterService.countByChannelAndDay(channels[i].getVlaue(), preDay);
         if (count == null) {
            count = 0L;
         }
         DailyCountUser obj = new DailyCountUser();
         obj.setTotal(BigDecimal.valueOf(count));
         obj.setType(typeEnum);
         obj.setChannel(channels[i].name());
         obj.setUpdateDate(new Date());
         obj.setDay(TimeUtil.parse(preDay));
         obj.setId(StringUtil.Md5(preDay + channels[i].name() + typeEnum.name()));
         dailyCountUserDao.save(obj);
      }
   }
   /**
    * 统计各个渠道每日下单转化率
    * @param preDay
    * @throws Exception
    */
   private void addNewUserDownOrderDay(String preDay, DailyCountUserEnum typeEnum) throws Exception {
      // 统计当日有效订单
      List<Long> listOrder = commonOrderCountService.getUidByValidOrderByDay(preDay);
      // 查询当日新注册用户
      List<UserInfoRegister> listRegister = userInfoRegisterService.listByDay(preDay);
      ChannelEnum[] channels = ChannelEnum.values();
      for (int i = 0; i < channels.length; i++) {
         long totalDay = 0;
         long totalValid = 0;
         String channelName = channels[i].getVlaue();
         if (listOrder != null && listOrder.size() > 0 && listRegister != null && listRegister.size() > 0) {
            for (UserInfoRegister register: listRegister) {
               String channel = register.getChannel();
               if (channelName.equalsIgnoreCase(channel)) {
                  // 当日渠道用户
                  totalDay ++ ;
                  Long id = register.getId();
                  // 判断当前用户是否今日下单
                  for (Long uid: listOrder) {
                     if (uid.longValue() == id.longValue()) {
                        totalValid ++;
                        break;
                     }
                  }
               }
            }
         }
         // 计算比例: 下单用户数/新增用户数
         BigDecimal total = new BigDecimal(0);
         if (totalDay > 0 && totalValid > 0) {
            total = MoneyBigDecimalUtil.div(BigDecimal.valueOf(totalValid),BigDecimal.valueOf(totalDay));
            total = MoneyBigDecimalUtil.mul(total, BigDecimal.valueOf(100));
         }
         DailyCountUser obj = new DailyCountUser();
         obj.setTotal(total);
         obj.setRate(true);
         obj.setTotalDay(BigDecimal.valueOf(totalDay));
         obj.setTotalValid(BigDecimal.valueOf(totalValid));
         obj.setType(typeEnum);
         obj.setChannel(channels[i].name());
         obj.setUpdateDate(new Date());
         obj.setDay(TimeUtil.parse(preDay));
         obj.setId(StringUtil.Md5(preDay + channels[i].name() + typeEnum.name()));
         dailyCountUserDao.save(obj);
      }
   }
   /**
    * 统计当周下单数据
    * @param preDay
    * @throws Exception
    */
   private void addNewUserDownOrderWeek(String preDay) throws Exception {
      // 加上6天 -注册一周内数据
      Date startDay = new Date(TimeUtil.convertDateToTemp2(preDay + " 23:59:59"));
      Date limitDay = DateUtil.plusDayDate(6, startDay);
      // 渠道数据
      ChannelEnum[] channels = ChannelEnum.values();
      for (int i = 0; i < channels.length; i++) {
         long totalUser = 0;
         long totalWeek = 0;
         long totalWeek3 = 0;
         List<Long> listUid = new ArrayList<Long>();
         // 查询今日新增用户
         List<UserInfoRegister> list = userInfoRegisterService.listByChannelAndDay(channels[i].getVlaue(), preDay);
         if (list != null && list.size() > 0) {
            totalUser = list.size();
            for (UserInfoRegister user : list) {
               listUid.add(user.getId());
            }
         }
         if (listUid.size() > 0) {
            List<Long> listUidDown = commonOrderCountService.getDownOrderUserByListUidAndDate(limitDay, listUid);
            if (listUidDown != null && listUidDown.size() > 0) {
               for (Long uid: listUid) {
                  int total = 0;
                  for (Long id: listUidDown) {
                     if (uid.longValue() == id.longValue()) {
                        total ++;
                     }
                  }
                  if (total > 0) {
                     totalWeek ++;
                  }
                  if (total >= 3) {
                     totalWeek3 ++;
                  }
               }
            }
         }
         // 计算比例:当周 下单用户数/新增用户数
         BigDecimal total = new BigDecimal(0);
         if (totalUser > 0 && totalWeek > 0) {
            total = MoneyBigDecimalUtil.div(BigDecimal.valueOf(totalWeek),BigDecimal.valueOf(totalUser));
            total = MoneyBigDecimalUtil.mul(total, BigDecimal.valueOf(100));
         }
         DailyCountUser obj = new DailyCountUser();
         obj.setRate(true);
         obj.setTotalDay(BigDecimal.valueOf(totalUser));
         obj.setTotalValid(BigDecimal.valueOf(totalWeek));
         obj.setTotal(total);
         obj.setType(DailyCountUserEnum.newUserDownOrderWeek);
         obj.setChannel(channels[i].name());
         obj.setUpdateDate(new Date());
         obj.setDay(TimeUtil.parse(preDay));
         obj.setId(StringUtil.Md5(preDay + channels[i].name() + DailyCountUserEnum.newUserDownOrderWeek.name()));
         dailyCountUserDao.save(obj);
         // 计算比例: 下3单用户数/新增用户数
         BigDecimal total3 = new BigDecimal(0);
         if (totalUser > 0 && totalWeek3 > 0) {
            total3 = MoneyBigDecimalUtil.div(BigDecimal.valueOf(totalWeek3),BigDecimal.valueOf(totalUser));
            total3 = MoneyBigDecimalUtil.mul(total3, BigDecimal.valueOf(100));
         }
         DailyCountUser obj3 = new DailyCountUser();
         obj3.setRate(true);
         obj3.setTotalDay(BigDecimal.valueOf(totalUser));
         obj3.setTotalValid(BigDecimal.valueOf(totalWeek3));
         obj3.setTotal(total3);
         obj3.setType(DailyCountUserEnum.newUserDownOrderWeek3);
         obj3.setChannel(channels[i].name());
         obj3.setUpdateDate(new Date());
         obj3.setDay(TimeUtil.parse(preDay));
         obj3.setId(StringUtil.Md5(preDay + channels[i].name() + DailyCountUserEnum.newUserDownOrderWeek3.name()));
         dailyCountUserDao.save(obj3);
      }
   }
   /**
    * 统计90天内再次活跃
    * @param preDay
    * @throws Exception
    */
   private void addActiveAgain90(String preDay, DailyCountUserEnum typeEnum) throws Exception{
      long count = userActiveLogService.count90DaysLaterActiveNum(preDay);
      DailyCountUser obj3 = new DailyCountUser();
      obj3.setTotal(BigDecimal.valueOf(count));
      obj3.setType(typeEnum);
      obj3.setUpdateDate(new Date());
      obj3.setDay(TimeUtil.parse(preDay));
      obj3.setId(StringUtil.Md5(preDay + typeEnum.name()));
      dailyCountUserDao.save(obj3);
   }
   /**
    * 金币新增数量
    * @param preDay
    * @throws Exception
    */
   private void addIntegralNum(String preDay, DailyCountUserEnum typeEnum) throws Exception{
      Long count = integralDetailService.countNewAddByDate(preDay);
      if (count == null) {
         count = 0L;
      }
      DailyCountUser obj3 = new DailyCountUser();
      obj3.setTotal(BigDecimal.valueOf(count));
      obj3.setType(typeEnum);
      obj3.setUpdateDate(new Date());
      obj3.setDay(TimeUtil.parse(preDay));
      obj3.setId(StringUtil.Md5(preDay + typeEnum.name()));
      dailyCountUserDao.save(obj3);
   }
   /**
    * 红包新增数量
    * @param preDay
    * @throws Exception
    */
   private void addRedpackNum(String preDay, DailyCountUserEnum typeEnum) throws Exception{
      Long total = redPackDetailService.countNumByDay(preDay);
      if (total == null) {
         total = 0L;
      }
      DailyCountUser obj3 = new DailyCountUser();
      obj3.setTotal(new BigDecimal(total));
      obj3.setType(typeEnum);
      obj3.setUpdateDate(new Date());
      obj3.setDay(TimeUtil.parse(preDay));
      obj3.setId(StringUtil.Md5(preDay + typeEnum.name()));
      dailyCountUserDao.save(obj3);
   }
   /**
    * 红包新增金额
    * @param preDay
    * @throws Exception
    */
   private void addRedpackMoney(String preDay, DailyCountUserEnum typeEnum) throws Exception{
      BigDecimal total = redPackDetailService.countMoneyByDay(preDay);
      if (total == null) {
         total = new BigDecimal(0);
      }
      DailyCountUser obj3 = new DailyCountUser();
      obj3.setTotal(total);
      obj3.setType(typeEnum);
      obj3.setUpdateDate(new Date());
      obj3.setDay(TimeUtil.parse(preDay));
      obj3.setId(StringUtil.Md5(preDay + typeEnum.name()));
      dailyCountUserDao.save(obj3);
   }
   /**
    * 红包新增数量
    * @param preDay
    * @throws Exception
    */
   private void addNewUserTljNum(String preDay, DailyCountUserEnum typeEnum) throws Exception{
      Long total = userTaoLiJinDetailService.countNumByDay(preDay);
      if (total == null) {
         total = 0L;
      }
      DailyCountUser obj3 = new DailyCountUser();
      obj3.setTotal(new BigDecimal(total));
      obj3.setType(typeEnum);
      obj3.setUpdateDate(new Date());
      obj3.setDay(TimeUtil.parse(preDay));
      obj3.setId(StringUtil.Md5(preDay + typeEnum.name()));
      dailyCountUserDao.save(obj3);
   }
   /**
    * 红包新增金额
    * @param preDay
    * @throws Exception
    */
   private void addNewUserTljMoney(String preDay, DailyCountUserEnum typeEnum) throws Exception{
      BigDecimal total = userTaoLiJinDetailService.countMoneyByDay(preDay);
      if (total == null) {
         total = new BigDecimal(0);
      }
      DailyCountUser obj3 = new DailyCountUser();
      obj3.setTotal(total);
      obj3.setType(typeEnum);
      obj3.setUpdateDate(new Date());
      obj3.setDay(TimeUtil.parse(preDay));
      obj3.setId(StringUtil.Md5(preDay + typeEnum.name()));
      dailyCountUserDao.save(obj3);
   }
   /**
    * 提现申请数量
    * @param preDay
    * @throws Exception
    */
   private void addExtractApplyNumber(String preDay, DailyCountUserEnum typeEnum) throws Exception{
      Long total = extractAuditRecordService.countApplyNumberByDay(preDay);
      if (total == null) {
         total = 0L;
      }
      DailyCountUser obj3 = new DailyCountUser();
      obj3.setTotal(new BigDecimal(total));
      obj3.setType(typeEnum);
      obj3.setUpdateDate(new Date());
      obj3.setDay(TimeUtil.parse(preDay));
      obj3.setId(StringUtil.Md5(preDay + typeEnum.name()));
      dailyCountUserDao.save(obj3);
   }
   /**
    * 提现申请金额
    * @param preDay
    * @throws Exception
    */
   private void addExtractApplyMoney(String preDay, DailyCountUserEnum typeEnum) throws Exception{
      BigDecimal total = extractAuditRecordService.countApplyMoneyByDay(preDay);
      if (total == null) {
         total = new BigDecimal(0);
      }
      DailyCountUser obj3 = new DailyCountUser();
      obj3.setTotal(total);
      obj3.setType(typeEnum);
      obj3.setUpdateDate(new Date());
      obj3.setDay(TimeUtil.parse(preDay));
      obj3.setId(StringUtil.Md5(preDay + typeEnum.name()));
      dailyCountUserDao.save(obj3);
   }
   /**
    * 提现审核数量
    * @param preDay
    * @throws Exception
    */
   private void addExtractAuditNum(String preDay, int state, DailyCountUserEnum typeEnum) throws Exception{
      Long total = extractAuditRecordService.countAuditNumberByDay(state, preDay);
      if (total == null) {
         total = 0L;
      }
      DailyCountUser obj3 = new DailyCountUser();
      obj3.setTotal(new BigDecimal(total));
      obj3.setType(typeEnum);
      obj3.setUpdateDate(new Date());
      obj3.setDay(TimeUtil.parse(preDay));
      obj3.setId(StringUtil.Md5(preDay + state + typeEnum.name()));
      dailyCountUserDao.save(obj3);
   }
}