/**
* 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.core.site.dao.ChannelDAO;
import com.ewcms.core.site.model.Channel;
import com.ewcms.plugin.visit.manager.dao.VisitDAO;
import com.ewcms.plugin.visit.manager.vo.TrafficVo;
import com.ewcms.plugin.visit.util.ChartVisitUtil;
import com.ewcms.plugin.visit.util.DateTimeUtil;
import com.ewcms.plugin.visit.util.NumberUtil;
@Service
public class TrafficService implements TrafficServiceable {
@Autowired
private VisitDAO visitDAO;
@Autowired
private ChannelDAO channelDAO;
@Override
public List<TrafficVo> findArticleTable(Integer channelId, Integer siteId) {
List<TrafficVo> list = new ArrayList<TrafficVo>();
if (channelId == 0) {
list = visitDAO.findArticleByChannelIds(null, siteId);
} else{
List<Integer> channelIds = new ArrayList<Integer>();
getChannelId(channelIds, channelId);
channelIds.add(channelId);
list = visitDAO.findArticleByChannelIds(channelIds, siteId);
}
Collections.sort(list, new ClickVoPvDescComparator());
return list;
}
private void getChannelId(List<Integer> channelIds, Integer parentId){
List<Channel> channels = channelDAO.getChannelChildren(parentId);
if (!channels.isEmpty()){
for (Channel channel : channels){
channelIds.add(channel.getId());
getChannelId(channelIds, channel.getId());
}
}
}
@Override
public List<TrafficVo> findUrlTable(String startDate, String endDate, Integer siteId) {
Date start = DateTimeUtil.getStringToDate(startDate);
Date end = DateTimeUtil.getStringToDate(endDate);
List<TrafficVo> list = visitDAO.findUrlInDateInterval(start, end, siteId);
Collections.sort(list, new ClickVoPvDescComparator());
Long sumPv = visitDAO.findPvSumInDateInterval(start, end, siteId);
TrafficVo vo = null;
for (int i = 0; i < list.size(); i++){
vo = list.get(i);
if (vo == null) continue;
vo.setPvRate(NumberUtil.percentage(vo.getPageView(), sumPv));
list.set(i, vo);
}
return list;
}
@Override
public String findUrlTrendReport(String startDate, String endDate, String url, 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> dataValue = new LinkedHashMap<String, Long>();
for (String category : categories){
Long countPv = visitDAO.findPvSumInDayByUrl(DateTimeUtil.getStringToDate(category), url, siteId);
if (countPv == null) countPv = 0L;
dataValue.put(category, countPv);
}
dataSet.put(url, dataValue);
return ChartVisitUtil.getLine2DChart(categories, dataSet, labelCount);
}
@Override
public List<TrafficVo> findChannelTable(String startDate, String endDate, Integer channelParentId, Integer siteId) {
if (channelParentId == null){
Channel rootChannel = channelDAO.getChannelRoot(siteId);
if (rootChannel == null) return null;
channelParentId = rootChannel.getId();
}
Date start = DateTimeUtil.getStringToDate(startDate);
Date end = DateTimeUtil.getStringToDate(endDate);
TrafficVo childrenVo = null;
TrafficVo levelVo = null;
List<TrafficVo> list = new ArrayList<TrafficVo>();
List<Channel> channels = channelDAO.getChannelChildren(channelParentId);
for (Channel channel : channels){
List<Integer> channelIds = new ArrayList<Integer>();
getChannelId(channelIds, channel.getId());
childrenVo = visitDAO.findChannelInDateIntervalByChannelIds(start, end, channelIds, siteId);
if (childrenVo == null) {
childrenVo = new TrafficVo();
}else{
childrenVo.setIsChannelChildren(true);
}
childrenVo.setChannelId(channel.getId());
childrenVo.setChannelName(channel.getName());
List<Integer> levelChannelIds = new ArrayList<Integer>();
levelChannelIds.add(channel.getId());
levelVo = visitDAO.findChannelInDateIntervalByChannelIds(start, end, levelChannelIds, siteId);
if (levelVo != null) {
childrenVo.setLevelPv(levelVo.getPageView());
childrenVo.setLevelSt(levelVo.getStickTime());
}
list.add(childrenVo);
}
return list;
}
@Override
public String findChannelReport(String startDate, String endDate, Integer channelParentId, Integer labelCount, Integer siteId){
List<TrafficVo> list = findChannelTable(startDate, endDate, channelParentId, siteId);
Map<String, Long> dataSet = new LinkedHashMap<String, Long>();
for (TrafficVo vo : list){
dataSet.put(vo.getChannelName(), (vo.getLevelPv() + vo.getPageView()));
}
return ChartVisitUtil.getPie3DChart(dataSet);
}
@Override
public String findChannelTrendReport(String startDate, String endDate, Integer channelId, 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> dataValue = new LinkedHashMap<String, Long>();
for (String category : categories){
Long countPv = visitDAO.findPvSumInDayByChannelId(DateTimeUtil.getStringToDate(category), channelId, siteId);
if (countPv == null) countPv = 0L;
dataValue.put(category, countPv);
}
dataSet.put("PV", dataValue);
return ChartVisitUtil.getLine2DChart(categories, dataSet, labelCount);
}
class ClickVoPvDescComparator implements Comparator<TrafficVo>{
@Override
public int compare(TrafficVo o1, TrafficVo o2) {
if (o1.getPageView() < o2.getPageView()){
return 1;
}else{
if (o1.getPageView() == o2.getPageView())
return 0;
else
return -1;
}
}
}
}