package edu.sjtu.infosec.ismp.manager.AM.dao.impl;
import java.io.Serializable;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import org.apache.commons.lang.ArrayUtils;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import edu.sjtu.infosec.ismp.manager.AM.dao.AssetRawAvailabilityDao;
import edu.sjtu.infosec.ismp.manager.AM.model.AssetDailyAvailabilityBO;
import edu.sjtu.infosec.ismp.manager.AM.model.AssetRawAvailabilityBO;
import edu.sjtu.infosec.ismp.manager.comm.model.page.Page;
import edu.sjtu.infosec.ismp.util.RandomCodeUtil;
/**
* AssetRawAvailabilityDao接口的实现类
*
* @author Breggor
*
*/
@SuppressWarnings("unchecked")
public class AssetRawAvailabilityDaoImpl extends HibernateDaoSupport implements
AssetRawAvailabilityDao {
/**
* 实现接口方法
*/
public void saveAssetRawAvailability(AssetRawAvailabilityBO entity) {
getHibernateTemplate().save(entity);
}
public void saveAssetRawAvailability(List<AssetRawAvailabilityBO> entities) {
getHibernateTemplate().saveOrUpdateAll(entities);
}
public void updateAssetRawAvailability(AssetRawAvailabilityBO entity) {
getHibernateTemplate().update(entity);
}
public void deleteAssetRawAvailability(AssetRawAvailabilityBO entity) {
getHibernateTemplate().delete(entity);
}
public AssetRawAvailabilityBO getAssetRawAvailability(Serializable entityId) {
return (AssetRawAvailabilityBO) getHibernateTemplate().get(
AssetRawAvailabilityBO.class, entityId);
}
public List<AssetRawAvailabilityBO> getListByAssetRawAvailability(
AssetRawAvailabilityBO entity) {
return (List<AssetRawAvailabilityBO>) spliceCriteria(entity).list();
}
public List<AssetRawAvailabilityBO> getPageListByAssetRawAvailability(
Page page, AssetRawAvailabilityBO entity) {
Criteria criteria = spliceCriteria(entity);
if (page != null) {
criteria.setFirstResult(page.getBeginIndex());
criteria.setMaxResults(page.getEveryPage());
}
return criteria.list();
}
public AssetDailyAvailabilityBO getAverageAssetRawAvailability(
Integer assetId, Integer type, Timestamp currentDate) {
Date startDate = new Date(currentDate.getTime() - 3600000); // 1000 * 60 * 60 * 24
Date endDate = new Date(currentDate.getTime());
AssetDailyAvailabilityBO assetDailyAvailability = new AssetDailyAvailabilityBO();
assetDailyAvailability.setSingleCode(RandomCodeUtil
.getSingleRandomCode());
String hql = "select avg(raw.usedPercent) from AssetRawAvailabilityBO raw where raw.assetId =:assetId and raw.availabilityType =:avType and (raw.time >=:start and raw.time<:end)";
Query query = getSession().createQuery(hql);
query.setParameter("assetId", assetId);
query.setParameter("avType", type);
query.setParameter("start", startDate);
query.setParameter("end", endDate);
Double percent = (Double) query.uniqueResult();
assetDailyAvailability.setAssetId(assetId);
assetDailyAvailability.setAvailabilityType(type);
if (percent == null)
assetDailyAvailability.setUsedPercent(0);
else
assetDailyAvailability.setUsedPercent(percent.intValue());
assetDailyAvailability.setTime(currentDate);
return assetDailyAvailability;
}
public Integer getAverAssetRawAval(
Integer assetId, Integer type, Timestamp currentDate) {
Date startDate = new Date(currentDate.getTime()); // 1000 * 60 * 60 * 24
startDate.setHours(0);
startDate.setMinutes(0);
startDate.setSeconds(0);
Date endDate = new Date(currentDate.getTime());
AssetDailyAvailabilityBO assetDailyAvailability = new AssetDailyAvailabilityBO();
// 原代码
assetDailyAvailability.setSingleCode(RandomCodeUtil
.getSingleRandomCode());
/*
* lisiwen 重写上面注释点的代码
*/
// assetDailyAvailability.setSingleCode(RandomCodeUtil.getRandomString(19));
// Calendar cale = Calendar.getInstance();
// Date tasktime=cale.getTime();
// SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//存储利用率=3 网络利用率=4
String hql = "select avg(raw.usedPercent) from AssetRawAvailabilityBO raw where raw.assetId =:assetId and raw.availabilityType =:avType and (raw.time >=:start and raw.time<:end)";
System.out.println("assetId="+assetId+",type="+type+",startDate="+startDate+",endDate="+endDate);
Query query = getSession().createQuery(hql);
query.setParameter("assetId", assetId);
query.setParameter("avType", type);
query.setParameter("start", startDate);
query.setParameter("end", endDate);
Object percent =query.uniqueResult();
// System.out.println("该集合的长度是:"+percent.size());
int percentint=10;
if(percent==null)
{
percentint=-1;
}else
{
long c=Math.round(new Double(percent.toString()));
percentint=Integer.parseInt(Long.toString(c));
}
// System.out.println("percent:"+percent);
// System.out.println("percentintCCC:"+percentint);
// System.out.println("-----------------------------");
return percentint;
}
public List<Integer> getHourChartDataByNet(Timestamp date,
AssetRawAvailabilityBO entity) {
List<Integer> data = new ArrayList<Integer>();
Date end = new Date(date.getTime());
Date begin = new Date(end.getYear(), end.getMonth(), end.getDate(), 0,
0, 0);
String hql = "select daily.time, avg(daily.totalQuantity) from AssetRawAvailabilityBO daily "
+ "where daily.assetId = ? and daily.availabilityType = ? "
+ "and (daily.time>= ? and daily.time<?) group by hour(daily.time)";
Query query = getSession().createQuery(hql);
query.setInteger(0, entity.getAssetId());
query.setInteger(1, entity.getAvailabilityType());
query.setParameter(2, begin);
query.setParameter(3, end);
List<Object[]> list = query.list();
// System.out.println(list.size());
int[] a = new int[24];
for (int i = 0; i < list.size(); i++) {
Object[] obj = list.get(i);
Timestamp date1 = (Timestamp) obj[0];
Calendar calendar = new GregorianCalendar();
calendar.setTime(date1);
a[calendar.get(Calendar.HOUR_OF_DAY)] = ((Double) obj[1])
.intValue();
}
data = Arrays.asList(ArrayUtils.toObject(a));
return data;
}
public List<Integer> getDayChartDataByNet(Timestamp date,
AssetRawAvailabilityBO entity) {
List<Integer> data = new ArrayList<Integer>();
Date end = new Date(date.getTime());
Date begin = new Date(end.getYear(), end.getMonth(), 1, 0, 0, 0);
String hql = "select daily.time, avg(daily.totalQuantity) from AssetRawAvailabilityBO daily "
+ "where daily.assetId = ? and daily.availabilityType = ? "
+ "and (daily.time>= ? and daily.time<?) group by day(daily.time)";
Query query = getSession().createQuery(hql);
query.setInteger(0, entity.getAssetId());
query.setInteger(1, entity.getAvailabilityType());
query.setParameter(2, begin);
query.setParameter(3, end);
List<Object[]> list = query.list();
// System.out.println(list.size());
int[] a = new int[31];
for (int i = 0; i < list.size(); i++) {
Object[] obj = list.get(i);
Timestamp date1 = (Timestamp) obj[0];
Calendar calendar = new GregorianCalendar();
calendar.setTime(date1);
a[calendar.get(Calendar.DAY_OF_MONTH)] = ((Double) obj[1])
.intValue();
}
data = Arrays.asList(ArrayUtils.toObject(a));
return data;
}
public List<Integer> getMonthChartDataByNet(Timestamp date,
AssetRawAvailabilityBO entity) {
List<Integer> data = new ArrayList<Integer>();
Date end = new Date(date.getTime());
Date begin = new Date(end.getYear(), 0, 1, 0, 0, 0);
String hql = "select daily.time, avg(daily.totalQuantity) from AssetRawAvailabilityBO daily "
+ "where daily.assetId = ? and daily.availabilityType = ? "
+ "and (daily.time>= ? and daily.time<?) group by month(daily.time)";
Query query = getSession().createQuery(hql);
query.setInteger(0, entity.getAssetId());
query.setInteger(1, entity.getAvailabilityType());
query.setParameter(2, begin);
query.setParameter(3, end);
List<Object[]> list = query.list();
// System.out.println(list.size());
int[] a = new int[12];
for (int i = 0; i < list.size(); i++) {
Object[] obj = list.get(i);
Timestamp date1 = (Timestamp) obj[0];
Calendar calendar = new GregorianCalendar();
calendar.setTime(date1);
a[calendar.get(Calendar.MONTH)] = ((Double) obj[1]).intValue();
}
data = Arrays.asList(ArrayUtils.toObject(a));
return data;
}
public List<Integer> getHourChartDataByOnline(Timestamp date,
AssetRawAvailabilityBO entity) {
List<Integer> data = new ArrayList<Integer>();
Date end = new Date(date.getTime());
Date begin = new Date(end.getYear(), end.getMonth(), end.getDate(), 0,
0, 0);
String hql = "select daily.time, count(daily) from AssetRawAvailabilityBO daily "
+ "where daily.assetId = ? and daily.availabilityType != ? "
+ "and (daily.time>= ? and daily.time<?) group by hour(daily.time)";
Query query = getSession().createQuery(hql);
query.setInteger(0, entity.getAssetId());
query.setInteger(1, entity.getAvailabilityType());
query.setParameter(2, begin);
query.setParameter(3, end);
List<Object[]> list = query.list();
// System.out.println(list.size());
int[] a = new int[24];
for (int i = 0; i < list.size(); i++) {
Object[] obj = list.get(i);
Timestamp date1 = (Timestamp) obj[0];
Calendar calendar = new GregorianCalendar();
calendar.setTime(date1);
a[calendar.get(Calendar.HOUR_OF_DAY)] = ((Long) obj[1]).intValue();
}
data = Arrays.asList(ArrayUtils.toObject(a));
return data;
}
public List<Integer> getDayChartDataByOnline(Timestamp date,
AssetRawAvailabilityBO entity) {
List<Integer> data = new ArrayList<Integer>();
Date end = new Date(date.getTime());
Date begin = new Date(end.getYear(), end.getMonth(), 1, 0, 0, 0);
String hql = "select daily.time, count(daily) from AssetRawAvailabilityBO daily "
+ "where daily.assetId = ? and daily.availabilityType != ? "
+ "and (daily.time>= ? and daily.time<?) group by day(daily.time)";
Query query = getSession().createQuery(hql);
query.setInteger(0, entity.getAssetId());
query.setInteger(1, entity.getAvailabilityType());
query.setParameter(2, begin);
query.setParameter(3, end);
List<Object[]> list = query.list();
// System.out.println(list.size());
int[] a = new int[31];
for (int i = 0; i < list.size(); i++) {
Object[] obj = list.get(i);
Timestamp date1 = (Timestamp) obj[0];
Calendar calendar = new GregorianCalendar();
calendar.setTime(date1);
a[calendar.get(Calendar.DAY_OF_MONTH)] = ((Long) obj[1]).intValue();
}
data = Arrays.asList(ArrayUtils.toObject(a));
return data;
}
public List<Integer> getMonthChartDataByOnline(Timestamp date,
AssetRawAvailabilityBO entity) {
List<Integer> data = new ArrayList<Integer>();
Date end = new Date(date.getTime());
Date begin = new Date(end.getYear(), 0, 1, 0, 0, 0);
String hql = "select daily.time, count(daily) from AssetRawAvailabilityBO daily "
+ "where daily.assetId = ? and daily.availabilityType != ? "
+ "and (daily.time>= ? and daily.time<?) group by month(daily.time)";
Query query = getSession().createQuery(hql);
query.setInteger(0, entity.getAssetId());
query.setInteger(1, entity.getAvailabilityType());
query.setParameter(2, begin);
query.setParameter(3, end);
List<Object[]> list = query.list();
// System.out.println(list.size());
int[] a = new int[12];
for (int i = 0; i < list.size(); i++) {
Object[] obj = list.get(i);
Timestamp date1 = (Timestamp) obj[0];
Calendar calendar = new GregorianCalendar();
calendar.setTime(date1);
a[calendar.get(Calendar.MONTH)] = ((Long) obj[1]).intValue();
}
data = Arrays.asList(ArrayUtils.toObject(a));
return data;
}
public Integer statisticsByLocId(Integer locId, Integer deviceType) {
String hql = "select avg(asset.usedPercent)from AssetRawAvailabilityBO asset where asset.assetId in(select device.id from AssetDeviceBO device where device.locationId=:locId and device.assetType=:assetType)";
Query query = getSession().createQuery(hql);
query.setParameter("locId", locId);
query.setParameter("assetType", deviceType);
Double usedPercent =(Double)query.uniqueResult();
if(usedPercent == null)
usedPercent = 0D;
return usedPercent.intValue();
}
/**
* 生成查询条件
*/
private Criteria spliceCriteria(AssetRawAvailabilityBO assetRawAvailability) {
Criteria criteria = getSession().createCriteria(
AssetRawAvailabilityBO.class);
if (null == assetRawAvailability) {
return criteria;
}
if (null != assetRawAvailability.getId()) {
criteria.add(Restrictions.eq("id", assetRawAvailability.getId()));
}
if (null != assetRawAvailability.getAssetId()) {
criteria.add(Restrictions.eq("assetId", assetRawAvailability
.getAssetId()));
}
if (null != assetRawAvailability.getAvailabilityType()) {
criteria.add(Restrictions.eq("availabilityType",
assetRawAvailability.getAvailabilityType()));
}
if (null != assetRawAvailability.getOnline()) {
criteria.add(Restrictions.eq("online", assetRawAvailability
.getOnline()));
}
if (null != assetRawAvailability.getTotalQuantity()) {
criteria.add(Restrictions.eq("totalQuantity", assetRawAvailability
.getTotalQuantity()));
}
if (null != assetRawAvailability.getUsedQuantity()) {
criteria.add(Restrictions.eq("usedQuantity", assetRawAvailability
.getUsedQuantity()));
}
if (null != assetRawAvailability.getUsedPercent()) {
criteria.add(Restrictions.eq("usedPercent", assetRawAvailability
.getUsedPercent()));
}
if (null != assetRawAvailability.getTime()) {
criteria.add(Restrictions
.eq("time", assetRawAvailability.getTime()));
}
return criteria;
}
}