/** * 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.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ewcms.common.lang.EmptyUtil; import com.ewcms.plugin.visit.manager.dao.VisitDAO; import com.ewcms.plugin.visit.manager.vo.ClickRateVo; import com.ewcms.plugin.visit.util.ChartVisitUtil; import com.ewcms.plugin.visit.util.DateTimeUtil; import com.ewcms.plugin.visit.util.NumberUtil; import com.ewcms.plugin.visit.util.SourceUtil; @Service public class ClickRateService implements ClickRateServiceable { @Autowired private VisitDAO visitDAO; @Override public List<ClickRateVo> findSourceTable(String startDate, String endDate, Integer siteId) { List<ClickRateVo> list = new ArrayList<ClickRateVo>(); List<String> dateArea = DateTimeUtil.getDateArea(startDate, endDate); ClickRateVo vo = null; list.add(vo); Long dSum = 0L, sSum = 0L, oSum = 0L; for (String dateValue : dateArea){ Date date = DateTimeUtil.getStringToDate(dateValue); List<ClickRateVo> sources = visitDAO.findSourceInDay(date, siteId); Long dCount = 0L, sCount = 0L, oCount = 0L; for (ClickRateVo sourceVo : sources){ String referer = sourceVo.getReferer(); if (EmptyUtil.isStringEmpty(referer)){ dCount += sourceVo.getRefererCount(); dSum += sourceVo.getRefererCount(); }else if (EmptyUtil.isNotNull(SourceUtil.getDomainName(referer))){ sCount += sourceVo.getRefererCount(); sSum += sourceVo.getRefererCount(); }else{ oCount += sourceVo.getRefererCount(); oSum += sourceVo.getRefererCount(); } } vo = new ClickRateVo(dateValue, dCount, sCount, oCount); list.add(vo); } vo = new ClickRateVo("总计", dSum, sSum, oSum); list.set(0, vo); return list; } @Override public String findSourceReport(String startDate, String endDate, Integer siteId) { List<ClickRateVo> list = findSourceTable(startDate, endDate, siteId); ClickRateVo vo = list.get(0); Map<String, Long> dataSet = new LinkedHashMap<String, Long>(); dataSet.put("搜索引擎", vo.getSearchCount()); dataSet.put("直接输入", vo.getDirectCount()); dataSet.put("其他网站", vo.getOtherCount()); return ChartVisitUtil.getPie3DChart(dataSet); } @Override public List<ClickRateVo> findSearchTable(String startDate, String endDate, Integer siteId) { List<String> dateArea = DateTimeUtil.getDateArea(startDate, endDate); Map<String, Long> searchMap = new LinkedHashMap<String, Long>(); Long sSum = 0L; for (String dateValue : dateArea){ Date date = DateTimeUtil.getStringToDate(dateValue); List<ClickRateVo> sources = visitDAO.findSourceInDay(date, siteId); for (ClickRateVo sourceVo : sources){ String referer = sourceVo.getReferer(); if (EmptyUtil.isStringEmpty(referer)) continue; String domain = SourceUtil.getDomain(referer); if (domain == null) continue; String domainName = SourceUtil.getDomainName(referer); if (domainName == null) continue; if (searchMap.containsKey(domain)){ searchMap.put(domain,searchMap.get(domain) + 1); }else{ searchMap.put(domain, 1L); } sSum += 1; } } List<ClickRateVo> list = new ArrayList<ClickRateVo>(); Iterator<Entry<String, Long>> it = searchMap.entrySet().iterator(); ClickRateVo vo = null; while (it.hasNext()){ Map.Entry<String, Long> entry = it.next(); String domain = entry.getKey(); String domainName = SourceUtil.searchEngineMap.get(domain); Long domainCount = entry.getValue(); String searchRate = NumberUtil.percentage(domainCount, sSum); vo = new ClickRateVo(domain, domainName, domainCount, searchRate); list.add(vo); } Collections.sort(list, new SearchUvDescComparator()); return list; } @Override public String findSearchReport(String startDate, String endDate, Integer siteId) { List<String> dateArea = DateTimeUtil.getDateArea(startDate, endDate); Map<String, Long> searchMap = new LinkedHashMap<String, Long>(); for (String dateValue : dateArea){ Date date = DateTimeUtil.getStringToDate(dateValue); List<ClickRateVo> sources = visitDAO.findSourceInDay(date, siteId); for (ClickRateVo sourceVo : sources){ String referer = sourceVo.getReferer(); if (EmptyUtil.isStringEmpty(referer)) continue; String domain = SourceUtil.getDomain(referer); if (domain == null) continue; String domainName = SourceUtil.getDomainName(referer); if (domainName == null) continue; if (searchMap.containsKey(domainName)){ searchMap.put(domainName,searchMap.get(domainName) + 1); }else{ searchMap.put(domainName, 1L); } } } return ChartVisitUtil.getPie3DChart(searchMap); } @Override public String findSearchTrendReport(String startDate, String endDate, String domain, 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> dataValueUv = new LinkedHashMap<String, Long>(); for (String category : categories){ Long countPv = visitDAO.findUvCountInDayByDomain(DateTimeUtil.getStringToDate(category), domain, siteId); dataValueUv.put(category, countPv); } dataSet.put("UV", dataValueUv); return ChartVisitUtil.getLine2DChart(categories, dataSet, labelCount); } @Override public List<ClickRateVo> findWebSiteTable(String startDate, String endDate, Integer siteId) { List<String> dateArea = DateTimeUtil.getDateArea(startDate, endDate); Map<String, Long> searchMap = new LinkedHashMap<String, Long>(); Long wsSum = 0L; for (String dateValue : dateArea){ Date date = DateTimeUtil.getStringToDate(dateValue); List<ClickRateVo> sources = visitDAO.findSourceInDay(date, siteId); for (ClickRateVo sourceVo : sources){ String referer = sourceVo.getReferer(); if (EmptyUtil.isStringEmpty(referer)) continue; String webSite = SourceUtil.getWebSiteUrl(referer); if (webSite == null) continue; if (searchMap.containsKey(webSite)){ searchMap.put(webSite,searchMap.get(webSite) + 1); }else{ searchMap.put(webSite, 1L); } wsSum += 1; } } List<ClickRateVo> list = new ArrayList<ClickRateVo>(); Iterator<Entry<String, Long>> it = searchMap.entrySet().iterator(); ClickRateVo vo = null; while (it.hasNext()){ Map.Entry<String, Long> entry = it.next(); String webSite = entry.getKey(); Long webSiteCount = entry.getValue(); String searchRate = NumberUtil.percentage(webSiteCount, wsSum); vo = new ClickRateVo(webSite, webSiteCount, searchRate); list.add(vo); } Collections.sort(list, new WebSiteUvDescComparator()); return list; } @Override public String findWebSiteReport(String startDate, String endDate, Integer siteId) { List<String> dateArea = DateTimeUtil.getDateArea(startDate, endDate); Map<String, Long> searchMap = new LinkedHashMap<String, Long>(); for (String dateValue : dateArea){ Date date = DateTimeUtil.getStringToDate(dateValue); List<ClickRateVo> sources = visitDAO.findSourceInDay(date, siteId); for (ClickRateVo sourceVo : sources){ String referer = sourceVo.getReferer(); if (EmptyUtil.isStringEmpty(referer)) continue; String webSite = SourceUtil.getWebSiteUrl(referer); if (webSite == null) continue; if (searchMap.containsKey(webSite)){ searchMap.put(webSite,searchMap.get(webSite) + 1); }else{ searchMap.put(webSite, 1L); } } } return ChartVisitUtil.getPie3DChart(searchMap); } @Override public String findWebSiteTrendReport(String startDate, String endDate, String webSite, 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> dataValueUv = new LinkedHashMap<String, Long>(); for (String category : categories){ Long countPv = visitDAO.findUvCountInDayByWebSite(DateTimeUtil.getStringToDate(category), webSite, siteId); dataValueUv.put(category, countPv); } dataSet.put("UV", dataValueUv); return ChartVisitUtil.getLine2DChart(categories, dataSet, labelCount); } class SearchUvDescComparator implements Comparator<ClickRateVo>{ @Override public int compare(ClickRateVo o1, ClickRateVo o2) { if (o1.getDomainCount() < o2.getDomainCount()){ return 1; }else{ if (o1.getDomainCount() == o2.getDomainCount()) return 0; else return -1; } } } class WebSiteUvDescComparator implements Comparator<ClickRateVo>{ @Override public int compare(ClickRateVo o1, ClickRateVo o2) { if (o1.getWebSiteCount() < o2.getWebSiteCount()){ return 1; }else{ if (o1.getWebSiteCount() == o2.getWebSiteCount()) return 0; else return -1; } } } }