/**
* 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.ClientVo;
import com.ewcms.plugin.visit.util.ChartVisitUtil;
import com.ewcms.plugin.visit.util.DateTimeUtil;
import com.ewcms.plugin.visit.util.NumberUtil;
@Service
public class ClientService implements ClientServiceable {
@Autowired
private VisitDAO visitDAO;
@Override
public List<ClientVo> findClientTable(String startDate, String endDate, String fieldName, Integer siteId) {
Date start = DateTimeUtil.getStringToDate(startDate);
Date end = DateTimeUtil.getStringToDate(endDate);
List<String> categories = DateTimeUtil.getDateArea(startDate, endDate);
List<String> fieldNames = visitDAO.findClientNameInDateIntervalByFieldName(start, end, fieldName, siteId);
List<ClientVo> clientVos = new ArrayList<ClientVo>();
Long sumPv = visitDAO.findPvSumInDateInterval(start, end, siteId);
ClientVo vo = null;
for (String name : fieldNames){
vo = new ClientVo();
Long pvCount = 0L;
for (String category : categories){
Date categoryDate = DateTimeUtil.getStringToDate(category);
pvCount += visitDAO.findPvSumInDayByStringField(categoryDate, fieldName, name, siteId).intValue();
}
vo.setPvCount(pvCount);
vo.setPvRate(NumberUtil.percentage(pvCount, sumPv));
vo.setName(name);
clientVos.add(vo);
}
Collections.sort(clientVos, new ClientVoPvDescComparator());
return clientVos;
}
@Override
public String findClientReport(String startDate, String endDate, String fieldName, Integer siteId) {
List<ClientVo> list = findClientTable(startDate, endDate, fieldName, siteId);
Map<String, Long> dataSet = new LinkedHashMap<String, Long>();
for (ClientVo vo : list){
dataSet.put(vo.getName(), vo.getPvCount().longValue());
}
return ChartVisitUtil.getPie3DChart(dataSet);
}
@Override
public String findClientTrendReport(String startDate, String endDate, String fieldName, String fieldValue, 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> dataValuePv = new LinkedHashMap<String, Long>();
for (String category : categories){
Long countPv = visitDAO.findPvSumInDayByStringField(DateTimeUtil.getStringToDate(category), fieldName, fieldValue, siteId);
dataValuePv.put(category, countPv);
}
dataSet.put("PV", dataValuePv);
return ChartVisitUtil.getLine2DChart(categories, dataSet, labelCount);
}
@Override
public List<ClientVo> findClientBooleanTable(String startDate, String endDate, String fieldName, Integer siteId) {
Date start = DateTimeUtil.getStringToDate(startDate);
Date end = DateTimeUtil.getStringToDate(endDate);
List<String> categories = DateTimeUtil.getDateArea(startDate, endDate);
boolean[] fieldNames = {true, false};
List<ClientVo> summarys = new ArrayList<ClientVo>();
Long pvSum = visitDAO.findPvSumInDateInterval(start, end, siteId);
ClientVo vo = null;
String fieldZhName = "Cookie";
if (fieldName.equals("javaEnabled")){
fieldZhName = "Applet";
}
for (Boolean name : fieldNames){
vo = new ClientVo();
Long countPv = 0L;
for (String category : categories){
Date categoryDate = DateTimeUtil.getStringToDate(category);
countPv += visitDAO.findPvSumInDayByBooleanField(categoryDate, fieldName, name, siteId).intValue();
}
vo.setPvCount(countPv);
vo.setPvRate(NumberUtil.percentage(countPv, pvSum));
if (name){
if (fieldZhName.equals("Cookie")){
vo.setName("允许Cookie");
}else{
vo.setName("支持Applet");
}
} else {
if (fieldZhName.equals("Cookie")){
vo.setName("不允许Cookie");
}else{
vo.setName("不支持Applet");
}
}
summarys.add(vo);
}
Collections.sort(summarys, new ClientVoPvDescComparator());
return summarys;
}
@Override
public String findClientBooleanReport(String startDate, String endDate, String fieldName, Integer siteId) {
List<ClientVo> list = findClientBooleanTable(startDate, endDate, fieldName, siteId);
Map<String, Long> dataSet = new LinkedHashMap<String, Long>();
for (ClientVo vo : list){
dataSet.put(vo.getName(), vo.getPvCount().longValue());
}
return ChartVisitUtil.getPie3DChart(dataSet);
}
@Override
public String findClientTrendBooleanReport(String startDate, String endDate, String fieldName, Boolean enabled, 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> dataValuePv = new LinkedHashMap<String, Long>();
for (String category : categories){
Long countPv = visitDAO.findPvSumInDayByBooleanField(DateTimeUtil.getStringToDate(category), fieldName, enabled, siteId);
dataValuePv.put(category, countPv);
}
dataSet.put("PV", dataValuePv);
return ChartVisitUtil.getLine2DChart(categories, dataSet, labelCount);
}
class ClientVoPvDescComparator implements Comparator<ClientVo>{
@Override
public int compare(ClientVo o1, ClientVo o2) {
if (o1.getPvCount() < o2.getPvCount()){
return 1;
}else{
if (o1.getPvCount() == o2.getPvCount())
return 0;
else
return -1;
}
}
}
}