package com.cabletech.business.wplan.plan.dao; import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.springframework.stereotype.Repository; import com.cabletech.business.wplan.plan.model.Patrolinfo; import com.cabletech.common.base.BaseDao; import com.cabletech.common.util.DateUtil; import com.cabletech.common.util.Page; /** * 巡检分析Dao * * @author Administrator * */ @Repository public class PatrolanalysisDao extends BaseDao<Patrolinfo, String> { private Logger logger = Logger.getLogger(this.getClass()); /** * 月类型 */ private static final String TIMETYPE_MONTH ="0"; /** * 季度类型 */ private static final String TIMETYPE_SEASON ="1"; /** * 年度类型 */ private static final String TIMETYPE_YEAR ="2"; /** * 获取所有巡检 * * @param patrolinfo * Patrolinfo * @return */ public Map<String, Object> getAllPatrolCount(Patrolinfo patrolinfo) { StringBuffer sqlBuffer = new StringBuffer(""); sqlBuffer .append(" select count(id) PLANCOUNT,nvl(sum(patrolcount),0) PLANRESCOUNT,nvl(sum(nopatrolcount),0) PLANLOSTRESCOUNT,nvl(sum(endpatrolcount),0) PLANOVERRESCOUNT,"); sqlBuffer .append(" case when nvl(sum(patrolcount),0)=0 then '--' else to_char(Round(TO_NUMBER((nvl(sum(endpatrolcount),0)/nvl(sum(patrolcount),0))*100),2),'9999990.99')||'%'end PLANRATE from("); sqlBuffer.append(getAllPatrolSql(patrolinfo)); sqlBuffer.append(getPatrolCondition(patrolinfo)); sqlBuffer.append(" )"); String sql = sqlBuffer.toString(); logger.debug("获取所有巡检分析统计数据sql:" + sql); return this.getJdbcTemplate().queryForMap(sql); } /** * 按指定条件获得巡检组统计信息分页列表 * * @param patrolinfo * Patrolinfo * @param page * Page * @return */ public Page getPatrolGroupPatrolInfo(Patrolinfo patrolinfo, Page page) { String sql = getPatrolGroupPatrolSQL(patrolinfo).toString(); logger.debug("查询获得巡检组统计信息列表sql:" + sql); this.findSQLPage(page, sql); return page; } /** * 获取巡检组巡检列表数据 * * @param patrolinfo * Patrolinfo * @return */ public List<Map<String, Object>> getPatrolGroupPatrolList( Patrolinfo patrolinfo) { String sql = getPatrolGroupPatrolSQL(patrolinfo).toString(); logger.info("查询获得巡检组统计信息sql:" + sql); return this.getJdbcTemplate().queryForList(sql); } /** * 获取巡检组巡检sql * * @param patrolinfo * Patrolinfo * @return */ private StringBuffer getPatrolGroupPatrolSQL(Patrolinfo patrolinfo) { StringBuffer sqlBuffer = new StringBuffer(""); sqlBuffer .append(" select orgid,orgname,patrol_group_id,patrolGROUPname,region_id,regionname,count(id) PLANCOUNT,nvl(sum(patrolcount),0) PLANRESCOUNT,nvl(sum(nopatrolcount),0) PLANLOSTRESCOUNT,nvl(sum(endpatrolcount),0) PLANOVERRESCOUNT,sum(EXCEPTIONCOUNT) EXCEPTIONCOUNT from("); sqlBuffer.append(getAllPatrolSql(patrolinfo)); sqlBuffer.append(getPatrolCondition(patrolinfo)); sqlBuffer .append(" ) group by orgid,orgname,patrol_group_id,patrolGROUPname,region_id,regionname order by orgid"); return sqlBuffer; } /** * 取得区县巡检情况(县区、代维公司、区县的站点数、计划巡检站点数、实际巡检站点数、巡检率) * * @param patrolinfo * Patrolinfo * @param page * Page * @return */ public Page getPatrolRegionInfo(Patrolinfo patrolinfo, Page page) { String sql = getRegionPatrolSQL(patrolinfo).toString(); logger.info("区域巡检情况的sql: " + sql); this.findSQLPage(page, sql); return page; } /** * 取得区县巡检情况(县区、代维公司、区县的站点数、计划巡检站点数、实际巡检站点数、巡检率) * * @param patrolinfo * Patrolinfo * @return */ public List<Map<String, Object>> getPatrolOrgList(Patrolinfo patrolinfo) { String sql = getRegionPatrolSQL(patrolinfo).toString(); logger.info("区域巡检情况的图表sql: " + sql); return this.getJdbcTemplate().queryForList(sql); } /** * 获取巡检组巡检sql * * @param patrolinfo * Patrolinfo * @return */ private StringBuffer getRegionPatrolSQL(Patrolinfo patrolinfo) { StringBuffer sqlBuffer = new StringBuffer(""); sqlBuffer .append(" select orgid,orgname,region_id,regionname,count(id) PLANCOUNT,sum(patrolcount) PLANRESCOUNT,sum(nopatrolcount)PLANLOSTRESCOUNT,sum(endpatrolcount) PLANOVERRESCOUNT,sum(EXCEPTIONCOUNT) EXCEPTIONCOUNT "); sqlBuffer .append(" ,(select count(1) from rs_resourcerecord_v v where v.regionid=region_id and v.type ='" + patrolinfo.getBusinesstype() + "') rescount from("); sqlBuffer.append(getAllPatrolSql(patrolinfo)); sqlBuffer.append(getPatrolCondition(patrolinfo)); sqlBuffer .append(" ) group by region_id,regionname,orgid,orgname order by region_id"); return sqlBuffer; } /** * 获取所有巡检信息sql * * @param patrolinfo * Patrolinfo * @return */ private StringBuffer getAllPatrolSql(Patrolinfo patrolinfo) { StringBuffer sqlBuffer = new StringBuffer(""); sqlBuffer .append(" select t.*,(t.patrolcount-t.endpatrolcount) nopatrolcount ,FN_GET_EXCEPTION_STATION_COUNT(t.id,to_char(t.start_time,'yyyy-mm-dd hh24:mi:ss'),to_char(t.end_time,'yyyy-mm-dd hh24:mi:ss')) EXCEPTIONCOUNT "); sqlBuffer .append(" from((select tt.*, (select count(1) from WPLAN_PATROLRESOURCE pr where pr.plan_id=tt.id) patrolcount,nvl(g.endpatrolcount,0) endpatrolcount from "); sqlBuffer .append(" (select distinct pi.id,pi.region_id,pi.year,pi.plan_type,pi.PLAN_state,PI.BUSINESS_TYPE,pi.plan_name,pi.start_time,pi.end_time,p.orgid,p.orgname,pi.PATROL_GROUP_ID,p.name patrolGROUPname,vr.regionname"); sqlBuffer .append(" from WPLAN_PATROLINFO pi join WPLAN_PATROLRESOURCE pr on pr.plan_id=pi.id "); sqlBuffer.append(" join view_region vr on pi.region_id=vr.regionid "); sqlBuffer .append(" join view_patrolgroup p on pi.patrol_group_id=p.id)tt "); sqlBuffer .append(" left join (select count(distinct r.id) endpatrolcount,r.plan_id from wplan_executeresult r "); sqlBuffer .append(" join WPLAN_PATROLRESOURCE pr on pr.plan_id=r.plan_id and pr.resource_id=r.resource_id and pr.resource_type=r.resource_type "); sqlBuffer .append(" and r.end_time=(select max(end_time) from wplan_executeresult where plan_id=r.plan_id and resource_id=r.resource_id and resource_type=r.resource_type and patrol_group_id=r.patrol_group_id)"); sqlBuffer .append(" group by r.plan_id) g on tt.id=g.plan_id))t where 1=1 "); return sqlBuffer; } /** * 取得统计计划相关条件 * * @param patrolinfo * Patrolinfo * @return */ private StringBuffer getPatrolCondition(Patrolinfo patrolinfo) { SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd"); StringBuffer sqlBuffer = new StringBuffer(""); if (patrolinfo != null) { // 按专业类型 if (StringUtils.isNotBlank(patrolinfo.getBusinesstype())) { sqlBuffer.append(" and BUSINESS_TYPE ='" + patrolinfo.getBusinesstype() + "'"); } // 按区域 if (StringUtils.isNotBlank(patrolinfo.getRegionid())) { sqlBuffer .append(" and REGION_ID= any(select regionid from view_region start with regionid='" + patrolinfo.getRegionid() + "' connect by prior regionid=parentid)"); } // 按巡检公司查询 if (StringUtils.isNotBlank(patrolinfo.getContractorid())) { sqlBuffer .append(" and orgid=any(select id from view_org start with id='" + patrolinfo.getContractorid() + "' connect by prior id=parentid)"); } // 按巡检组 if (StringUtils.isNotBlank(patrolinfo.getPatrolgroupid())) { sqlBuffer.append(" and PATROL_GROUP_ID ='" + patrolinfo.getPatrolgroupid() + "'"); } // 按巡检状态 if (StringUtils.isNotBlank(patrolinfo.getPlanstate())) { sqlBuffer.append(" and PLAN_state='" + patrolinfo.getPlanstate() + "'"); } // 按统计开始时间 if (StringUtils.isNotBlank(patrolinfo.getStarttime())) { if (StringUtils.isBlank(patrolinfo.getEndtime())) { patrolinfo.setEndtime("2099-12-31"); } // 添加查询的开始、结束时间在计划的时间段 sqlBuffer.append(" and (((date '" + patrolinfo.getStarttime() + "' between start_time and end_time+1) " + " or (date '" + patrolinfo.getEndtime() + "' between start_time and end_time+1)) "); } // 统计结束时间 if (StringUtils.isNotBlank(patrolinfo.getEndtime())) { if (StringUtils.isBlank(patrolinfo.getStarttime())) { patrolinfo.setStarttime("1900-01-01"); } // 添加计划时间在查询的开始、结束时间段 sqlBuffer.append(" or ((start_time " + " between date '" + patrolinfo.getStarttime() + "' and date '" + patrolinfo.getEndtime() + "'+1) " + " or (end_time " + " between date '" + patrolinfo.getStarttime() + "' and date '" + patrolinfo.getEndtime() + "'+1))) "); }// 按组合查询条件 if (StringUtils.isNotBlank(patrolinfo.getCondition())) { sqlBuffer.append(patrolinfo.getCondition()); } } return sqlBuffer; } /** * 获取区域巡检率 * * @param regionid * 区域ID * @param busstype * 专业类型 * @param timetype 时间类型 * @return */ public List<Map<String, Object>> getRegionPatrolRate(String regionid, String busstype,String timetype) { StringBuffer sqlBuffer = new StringBuffer(""); sqlBuffer .append(" select r.REGIONID,r.REGIONNAME NAME,nvl(sum(d.rate),0) rate from "); sqlBuffer .append(" (select regionid,regionname from view_region where lv=3 start with regionid='" + regionid + "' connect by prior regionid=parentid) r"); sqlBuffer .append(" left join (select p.region_id,count(distinct pr.id) allplancount,count(distinct e.resource_id) YXCOUNT, "); sqlBuffer .append(" to_char(decode(count(distinct pr.id),null,0,0,0,100*count(distinct e.resource_id)/count(distinct pr.id)),'FM990.09') rate "); sqlBuffer .append(" from wplan_patrolinfo p left join wplan_patrolresource pr on p.id=pr.plan_id left join wplan_executeresult e "); sqlBuffer .append(" on e.plan_id=pr.plan_id and e.resource_type=pr.resource_type and e.end_time is not null"); sqlBuffer .append(" join view_region r on p.region_id=r.REGIONID where p.plan_state='03' and p.business_type='" + busstype + "'"); sqlBuffer .append(" AND p.REGION_ID=any(select regionid from region start with regionid='" + regionid + "' connect by prior regionid=parentregionid) "); sqlBuffer.append(getTimeTypeStr(timetype)); sqlBuffer .append(" group by p.region_id,r.REGIONNAME,p.business_type order by r.REGIONNAME) d on r.REGIONID=substr(d.region_id,0,4)||'00' "); sqlBuffer .append(" group by r.REGIONID,r.REGIONNAME order by r.REGIONID"); logger.info("getRegionPatrolRate: " + sqlBuffer.toString()); return this.getJdbcTemplate().queryForList(sqlBuffer.toString()); } /** * 获取代维公司巡检率 * * @param regionid * 区域ID * @param busstype * 专业类型 * @param timetype 时间类型 * @return */ public List<Map<String, Object>> getContractoridPatrolRate(String regionid, String busstype,String timetype) { StringBuffer sqlBuffer = new StringBuffer(""); sqlBuffer .append(" select m.ID,m.NAME,nvl(d.rate,0) rate from view_org m left join "); sqlBuffer .append(" (select count(distinct pr.id) allplancount,count(distinct e.resource_id) YXCOUNT,"); sqlBuffer .append(" to_char(decode(count(distinct pr.id),null,0,0,0,100*count(distinct e.resource_id)/count(distinct pr.id)),'FM990.09') rate, "); sqlBuffer .append(" op.orgid from wplan_patrolinfo p left join wplan_patrolresource pr on p.id=pr.plan_id left join wplan_executeresult e on e.plan_id=pr.plan_id and e.resource_type=pr.resource_type and e.end_time is not null"); sqlBuffer .append(" join view_patrolgroup op on p.patrol_group_id=op.ID where p.plan_state='03' and p.REGION_ID=any (select regionid from region start with regionid='" + regionid + "' connect by prior regionid=parentregionid)"); sqlBuffer.append(getTimeTypeStr(timetype)); sqlBuffer .append(" and p.business_type='" + busstype + "' group by op.orgid,op.orgname order by op.orgname) d on m.ID=d.orgid where 1=1"); // sqlBuffer // .append(" and e.end_time=(select max(end_time) from wplan_executeresult where plan_id=e.plan_id and resource_id=e.resource_id and resource_type=e.resource_type and patrol_group_id=e.patrol_group_id)"); sqlBuffer.append(" and m.REGIONID='" + regionid + "' and m.ORGTYPE='2' order by m.ID"); logger.info("代维巡检率 getContractoridPatrolRate: " + sqlBuffer.toString()); return this.getJdbcTemplate().queryForList(sqlBuffer.toString()); } /** * 获取巡检组比率 * * @param orgid * 组织ID * @param busstype * busstype * @param timetype 时间类型 * @return */ public List<Map<String, Object>> getPatrolGroupPatrolRate(String orgid, String busstype,String timetype) { StringBuffer sqlBuffer = new StringBuffer(""); sqlBuffer .append("select m.ID,m.NAME,nvl(d.rate,0) rate from view_patrolgroup m left join "); sqlBuffer .append(" (select count(distinct pr.id) allplancount,count(distinct e.resource_id) YXCOUNT,"); sqlBuffer .append(" to_char(decode(count(distinct pr.id),null,0,0,0,100*count(distinct e.resource_id)/count(distinct pr.id)),'FM990.09') rate,"); sqlBuffer .append(" op.ID from wplan_patrolinfo p left join wplan_patrolresource pr on p.id=pr.plan_id left join wplan_executeresult e on e.plan_id=pr.plan_id and e.resource_type=pr.resource_type and e.end_time is not null"); sqlBuffer .append(" join view_patrolgroup op on p.patrol_group_id=op.ID where p.plan_state='03' and p.REGION_ID=op.regionid"); sqlBuffer.append(getTimeTypeStr(timetype)); // sqlBuffer.append(" and e.end_time=(select max(end_time) from wplan_executeresult where plan_id=e.plan_id and resource_id=e.resource_id and resource_type=e.resource_type and patrol_group_id=e.patrol_group_id)"); sqlBuffer.append(" and p.business_type='" + busstype + "' group by op.id) d"); sqlBuffer.append(" on m.ID=d.id where m.ORGID='" + orgid + "' order by m.id "); logger.info("巡检组巡检率 getPatrolGroupPatrolRate: " + sqlBuffer.toString()); return this.getJdbcTemplate().queryForList(sqlBuffer.toString()); } /** * 获取查询时间类型条件 * @param timetype 数据类型本月,本季度,本年度 * @return */ private StringBuffer getTimeTypeStr(String timetype){ HashMap<String,String> map=new HashMap<String, String>(); StringBuffer buf=new StringBuffer(); if(TIMETYPE_MONTH.equals(timetype)){ map=DateUtil.getMonthSlot(); }else if(TIMETYPE_SEASON.equals(timetype)){ map=DateUtil.getQuarterSlot(); }else{ map=DateUtil.getYearSlot(); } // 添加查询的开始、结束时间在计划的时间段 buf.append(" and (((date '" + map.get("startTime") + "' between p.start_time and p.end_time) " + " or (date '" + map.get("endTime") + "' between p.start_time and p.end_time)) "); buf.append(" or ((p.start_time " + " between date '" +map.get("startTime") + "' and date '" + map.get("endTime") + "') " + " or (p.end_time " + " between date '" + map.get("startTime") + "' and date '" + map.get("endTime") + "'))) "); return buf; } }