package com.yeshi.fanli.service.impl.count; import java.math.BigDecimal; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.springframework.stereotype.Service; import org.yeshi.utils.DateUtil; import com.yeshi.fanli.dao.mybatis.UserInfoMapper; import com.yeshi.fanli.service.inter.count.UserInfoCountService; @Service public class UserInfoCountServiceImpl implements UserInfoCountService { @Resource private UserInfoMapper userInfoMapper; @Override public long countNewUser(Integer isToday, Integer isMonth) { return userInfoMapper.countNewUser(isToday, isMonth); } @Override public long countRank(Integer rank) { return userInfoMapper.countRank(rank); } @Override public BigDecimal countAllMoney(Double rank) { return userInfoMapper.countAllMoney(rank); } @Override public long countLoseUser(int daysNum) { return userInfoMapper.countLoseUser(daysNum); } @Override public long countHasOrderUser() { return userInfoMapper.countHasOrderUser(); } @Override public List> countNewUserByDate(String channel,Integer type,String years, String startTime, String endTime) throws Exception { return userInfoMapper.countNewUserByDate(channel, type, years, startTime, endTime); } @Override public List> getTodayBuyRate(String channel, Integer dateType,String years, String startTime, String endTime) throws Exception { List> result_list = null; List> listToday = userInfoMapper.getTodayHasOrder(channel, dateType, years, startTime, endTime); if (listToday == null || listToday.size() == 0) { return result_list; } List> listTotal = userInfoMapper.countNewUserByDate(channel, dateType, years, startTime, endTime); if (listTotal == null || listTotal.size() == 0) { return result_list; } switch (dateType){ case 1: // 按天处理 result_list = dayFactory(startTime, endTime, listTotal); break; case 2: // 按月处理 result_list = monthFactory(listTotal); break; case 3: result_list = yearFactory(listTotal); break; default: break; } DecimalFormat df = new DecimalFormat("#.00"); for (int i = 0; i < result_list.size(); i++) { double proportion = 0; Map resultMap = result_list.get(i); Object showDate = resultMap.get("showDate"); for (int j = 0; j < listToday.size(); j++) { Map innerMap = listToday.get(j); Object innerDate = innerMap.get("showDate"); if (innerDate != null && innerDate.toString().equals(showDate.toString())) { Object innerValue = innerMap.get("showValue"); long innerData = Long.parseLong(innerValue.toString()); Object showValue = resultMap.get("showValue"); long showData = Long.parseLong(showValue.toString()); if (showData > 0) { proportion = innerData/(double)showData; } break; // 结束内部循环 } } resultMap.put("showValue", Double.parseDouble(df.format(proportion *100))); } return result_list; } @Override public List getWeekBuyRate(String channel, String startTime, String endTime, Integer orderNum, List dateList) throws Exception { List resultList = new ArrayList(); if (dateList == null || dateList.size() == 0) { return resultList; } List> totalList = userInfoMapper.countNewUserByDate(channel, 1, null, startTime, endTime); if (totalList == null || totalList.size() == 0) { return resultList; } DecimalFormat df = new DecimalFormat("#.00"); for (int i = 0; i < dateList.size(); i++) { double proportion = 0; String showDate = dateList.get(i); String plusDay = DateUtil.plusDay(7, showDate); Map map = userInfoMapper.getWeekHasOrder(channel, showDate, plusDay, orderNum); Object showValue = null; if (map != null) { showValue = map.get("showValue"); if (showValue != null) { for (int j = 0; j < totalList.size(); j++) { Map mapTotal = totalList.get(j); String reslutTime = mapTotal.get("showDate").toString(); if (showDate.equalsIgnoreCase(reslutTime)) { Object totalObject = mapTotal.get("showValue"); long hasCount = Long.parseLong(showValue.toString()); long total = Long.parseLong(totalObject.toString()); if (total > 0) { proportion = hasCount / (double) total; } break; } } } } resultList.add(Double.parseDouble(df.format(proportion * 100))); } return resultList; } public List> dayFactory(String startTime, String endTime, List> list) throws Exception { List> listObject = new ArrayList>(); if (startTime.equals(endTime)) { Map map = list.get(0); Object total = map.get("showValue"); if (total == null) { map.put("showValue", 0); } listObject.add(map); return listObject; } String plusDay = ""; for (int i = 0; i < 1000; i++) { if (i == 0) { plusDay = startTime; } else { plusDay = DateUtil.plusDay(i, startTime); } Map mapObject = new HashMap(); Object total = null; for (int j = 0; j < list.size(); j++) { Map map = list.get(j); Object createDate = map.get("showDate"); String month = createDate.toString(); if (plusDay.equalsIgnoreCase(month)) { total = map.get("showValue"); break; } } if (total == null) { total = 0; } mapObject.put("showValue", total); mapObject.put("showDate", plusDay); listObject.add(mapObject); if (plusDay.equals(endTime)) { break; // 时间结束 } } return listObject; } public List> monthFactory(List> list) { List> listObject = new ArrayList>(); // 12 个月处理 for (int i = 1; i <= 12; i++) { Map mapObject = new HashMap(); Object total = null; for (int j = 0; j < list.size(); j++) { Map map = list.get(j); Object createDate = map.get("showDate"); String month = createDate.toString(); if ((i + "").equalsIgnoreCase(month) || i == Integer.parseInt(month)) { total = map.get("showValue"); break; } } if (total == null) { total = 0; } mapObject.put("showValue", total); if (i <10) { mapObject.put("showDate", "0"+ i); } else { mapObject.put("showDate", i); } listObject.add(mapObject); } return listObject; } public List> yearFactory(List> list) { List> listObject = new ArrayList>(); for (int i = 0; i < list.size(); i++) { Map map = list.get(i); Object total = map.get("showValue"); if (total == null) { total = 0; } map.put("showValue", total); listObject.add(map); } return listObject; } }