/**
* Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved.
* EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
* http://www.ewcms.com
*/
package com.ewcms.plugin.visit.manager.service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ewcms.plugin.visit.manager.dao.VisitDAO;
import com.ewcms.plugin.visit.manager.vo.LoyaltyVo;
import com.ewcms.plugin.visit.util.ChartVisitUtil;
import com.ewcms.plugin.visit.util.DateTimeUtil;
import com.ewcms.plugin.visit.util.NumberUtil;
@Service
public class LoyaltyService implements LoyaltyServiceable {
@Autowired
private VisitDAO visitDAO;
@Override
public List<LoyaltyVo> findFrequencyTable(String startDate, String endDate, Integer siteId) {
Date start = DateTimeUtil.getStringToDate(startDate);
Date end = DateTimeUtil.getStringToDate(endDate);
List<LoyaltyVo> list = visitDAO.findFrequencyInDateInterval(start, end, siteId);
Long freqSum = visitDAO.findFrequencyCountInDateInterval(start, end, siteId);
Long greaterThanThirty = 0L;
List<LoyaltyVo> newVfVo = new ArrayList<LoyaltyVo>();
for (LoyaltyVo visitFreqVo : list){
if (visitFreqVo.getFrequency() < 31L){
visitFreqVo.setRate(NumberUtil.percentage(visitFreqVo.getFreqCount(), freqSum));
newVfVo.add(visitFreqVo);
}else{
greaterThanThirty += visitFreqVo.getFreqCount();
}
}
LoyaltyVo visitFreqVo = new LoyaltyVo();
visitFreqVo.setFrequency(31L);
visitFreqVo.setFreqCount(greaterThanThirty);
visitFreqVo.setRate(NumberUtil.percentage(greaterThanThirty, freqSum));
newVfVo.add(visitFreqVo);
Collections.sort(newVfVo, new VisitFreqVoPvDescComparator());
return newVfVo;
}
@Override
public String findFrequencyReport(String startDate, String endDate, Integer siteId) {
List<LoyaltyVo> list = findFrequencyTable(startDate, endDate, siteId);
Map<String, Long> dataSet = new LinkedHashMap<String, Long>();
for (LoyaltyVo vo : list){
if (vo.getFrequency() < 31L){
dataSet.put(vo.getFrequency() + "次", vo.getFreqCount());
}else{
dataSet.put(">30次", vo.getFreqCount());
}
}
return ChartVisitUtil.getPie3DChart(dataSet);
}
@Override
public String findFrequencyTrendReport(String startDate, String endDate, Long frequency, Integer labelCount, Integer siteId) {
List<String> categories = DateTimeUtil.getDateArea(startDate, endDate);
Map<String, Map<String, Long>> dataSet = new LinkedHashMap<String, Map<String, Long>>();
Map<String, Long> dataValueFreq = new LinkedHashMap<String, Long>();
for (String category : categories){
Long sumFreq = visitDAO.findFrequencyInDayByFrequency(DateTimeUtil.getStringToDate(category), frequency, siteId);
dataValueFreq.put(category, sumFreq);
}
if (frequency < 31L){
dataSet.put(frequency + "次", dataValueFreq);
}else{
dataSet.put(">30次", dataValueFreq);
}
return ChartVisitUtil.getLine2DChart(categories, dataSet, labelCount);
}
@Override
public List<LoyaltyVo> findDepthTable(String startDate, String endDate, Integer siteId) {
Date start = DateTimeUtil.getStringToDate(startDate);
Date end = DateTimeUtil.getStringToDate(endDate);
List<LoyaltyVo> list = visitDAO.findDepthInDateInterval(start, end, siteId);
Long freqSum = visitDAO.findDepthCountInDateInterval(start, end, siteId);
Long greaterThanThirty = 0L;
List<LoyaltyVo> newVfVo = new ArrayList<LoyaltyVo>();
for (LoyaltyVo loyaltyVo : list){
if (loyaltyVo.getFrequency() < 31L){
loyaltyVo.setRate(NumberUtil.percentage(loyaltyVo.getFreqCount(), freqSum));
newVfVo.add(loyaltyVo);
}else{
greaterThanThirty += loyaltyVo.getFreqCount();
}
}
LoyaltyVo visitFreqVo = new LoyaltyVo();
visitFreqVo.setFrequency(31L);
visitFreqVo.setFreqCount(greaterThanThirty);
visitFreqVo.setRate(NumberUtil.percentage(greaterThanThirty, freqSum));
newVfVo.add(visitFreqVo);
Collections.sort(newVfVo, new VisitFreqVoPvDescComparator());
return newVfVo;
}
@Override
public String findDepthReport(String startDate, String endDate, Integer siteId) {
List<LoyaltyVo> list = findDepthTable(startDate, endDate, siteId);
Map<String, Long> dataSet = new LinkedHashMap<String, Long>();
for (LoyaltyVo vo : list){
if (vo.getFrequency() < 31L){
dataSet.put(vo.getFrequency() + "页", vo.getFreqCount());
}else{
dataSet.put(">30页", vo.getFreqCount());
}
}
return ChartVisitUtil.getPie3DChart(dataSet);
}
@Override
public String findDepthTrendReport(String startDate, String endDate, Long depth, Integer labelCount, Integer siteId) {
List<String> categories = DateTimeUtil.getDateArea(startDate, endDate);
Map<String, Map<String, Long>> dataSet = new LinkedHashMap<String, Map<String, Long>>();
Map<String, Long> dataValueFreq = new LinkedHashMap<String, Long>();
for (String category : categories){
Long sumFreq = visitDAO.findDepthCountInDateByDepth(DateTimeUtil.getStringToDate(category), depth, siteId);
dataValueFreq.put(category, sumFreq);
}
if (depth < 31L){
dataSet.put(depth + "页", dataValueFreq);
}else{
dataSet.put(">30页", dataValueFreq);
}
return ChartVisitUtil.getLine2DChart(categories, dataSet, labelCount);
}
class VisitFreqVoPvDescComparator implements Comparator<LoyaltyVo>{
@Override
public int compare(LoyaltyVo o1, LoyaltyVo o2) {
if (o1.getFrequency() < o2.getFrequency()){
return 1;
}else{
if (o1.getFrequency() == o2.getFrequency())
return 0;
else
return -1;
}
}
}
@Override
public List<LoyaltyVo> findVisitorTable(String startDate, String endDate, Integer siteId) {
List<LoyaltyVo> list = new ArrayList<LoyaltyVo>();
List<String> dateArea = DateTimeUtil.getDateArea(startDate, endDate);
LoyaltyVo vo = new LoyaltyVo();
list.add(vo);
Long nvSum = 0L, rvSum = 0L;
for (String dateValue : dateArea){
Date date = DateTimeUtil.getStringToDate(dateValue);
Long nv = visitDAO.findRvCountInDayByRvFlag(date, false, siteId);
nvSum += nv;
Long rv = visitDAO.findRvCountInDayByRvFlag(date, true, siteId);
rvSum += rv;
Double rr = 0d;
if (nv + rv > 0) rr = new Double(NumberUtil.round(rv * 100.0D / (rv + nv), 2));
vo = new LoyaltyVo(dateValue, nv, rv, rr);
list.add(vo);
}
Double rrSum = 0d;
if (nvSum + rvSum > 0) rrSum = new Double(NumberUtil.round(rvSum * 100.0D / (rvSum + nvSum), 2));
vo = new LoyaltyVo("总计", nvSum, rvSum, rrSum);
list.set(0, vo);
return list;
}
@Override
public String findVisitorReport(String startDate, String endDate, Integer labelCount, Integer siteId) {
Map<String, Map<String, String>> dataSet = new LinkedHashMap<String, Map<String, String>>();
Map<String, String> nvMap = new LinkedHashMap<String, String>();
Map<String, String> rvMap = new LinkedHashMap<String, String>();
Map<String, String> rrMap = new LinkedHashMap<String, String>();
List<LoyaltyVo> list = findVisitorTable(startDate, endDate, siteId);
list.remove(0);
for (LoyaltyVo vo : list){
nvMap.put(vo.getName(), String.valueOf(vo.getNewVisitor()));
rvMap.put(vo.getName(), String.valueOf(vo.getReturnVisitor()));
rrMap.put(vo.getName(), String.valueOf(vo.getReturningRage()));
}
dataSet.put("新访客", nvMap);
dataSet.put("回头客", rvMap);
dataSet.put("回头率", rrMap);
List<String> categories = DateTimeUtil.getDateArea(startDate, endDate);
return ChartVisitUtil.getMixed2DChart(categories, dataSet, "回头率", labelCount);
}
@Override
public List<LoyaltyVo> findStickTimeTable(String startDate, String endDate, Integer siteId) {
List<LoyaltyVo> list = new ArrayList<LoyaltyVo>();
List<String> dateArea = DateTimeUtil.getDateArea(startDate, endDate);
LoyaltyVo vo = null;
for (String dateValue : dateArea){
Date date = DateTimeUtil.getStringToDate(dateValue);
Long stSum = visitDAO.findStSumInDay(date, siteId);
Long stCount = visitDAO.findStCountInDay(date, siteId);
vo = new LoyaltyVo(dateValue, stSum, (stCount == 0) ? 0L : (stSum / stCount));
list.add(vo);
}
return list;
}
@Override
public String findStickTimeReport(String startDate, String endDate, Integer labelCount, Integer siteId) {
Map<String, Map<String, Long>> dataSet = new LinkedHashMap<String, Map<String, Long>>();
Map<String, Long> stSumMap = new LinkedHashMap<String, Long>();
Map<String, Long> stAvgMap = new LinkedHashMap<String, Long>();
List<LoyaltyVo> list = findStickTimeTable(startDate, endDate, siteId);
for (LoyaltyVo vo : list){
stSumMap.put(vo.getDate(), vo.getStSum());
stAvgMap.put(vo.getDate(), vo.getStAvg());
}
dataSet.put("会话停留", stSumMap);
dataSet.put("页均停留", stAvgMap);
List<String> categories = DateTimeUtil.getDateArea(startDate, endDate);
return ChartVisitUtil.getLine2DChart(categories, dataSet, labelCount);
}
}