业务代码经过优化处理,为了方便理解,将list和查询语句不复用
for ( String type : DIMENSION_TYPE) {
if ( "dept_id" . equals ( type) ) {
List < ElectricHourReport > list = new ArrayList < ElectricHourReport > ( 64 ) ;
List < ElectricConsumerSumSo > electricConsumerSumList = dwdElectricConsumeMapper. hourReport ( beforeDate, type) ;
for ( ElectricConsumerSumSo sumSo : electricConsumerSumList) {
if ( deptMap. containsKey ( Long . parseLong ( sumSo. getId ( ) ) ) ) {
String dimension = deptMap. get ( Long . parseLong ( sumSo. getId ( ) ) ) . getDeptName ( ) ;
ElectricHourReport electricHourReport = new ElectricHourReport ( dimension,
type,
yymmddhh. get ( MY_YEAR) ,
yymmddhh. get ( MY_MONTH) ,
yymmddhh. get ( MY_DAY) ,
yymmddhh. get ( MY_HOUR) ,
sumSo. getConsume ( ) ,
nowDate) ;
list. add ( electricHourReport) ;
}
}
}
if ( "build_id" . equals ( type) ) {
List < ElectricHourReport > list = new ArrayList < ElectricHourReport > ( 64 ) ;
List < ElectricConsumerSumSo > electricConsumerSumList = dwdElectricConsumeMapper. hourReport ( beforeDate, type) ;
for ( ElectricConsumerSumSo sumSo : electricConsumerSumList) {
if ( buildMap. containsKey ( sumSo. getId ( ) ) ) {
String dimension = buildMap. get ( sumSo. getId ( ) ) . getBuildName ( ) ;
ElectricHourReport electricHourReport = new ElectricHourReport ( dimension,
type,
yymmddhh. get ( MY_YEAR) ,
yymmddhh. get ( MY_MONTH) ,
yymmddhh. get ( MY_DAY) ,
yymmddhh. get ( MY_HOUR) ,
sumSo. getConsume ( ) ,
nowDate) ;
list. add ( electricHourReport) ;
}
}
}
}
定义策略接口
package com. rjgf. report. other. design ;
import com. rjgf. report. domain. ElectricHourReport ;
import java. util. List ;
public interface ElectricConsumerStrategy {
void hourReport ( String type) ;
}
实现策略接口
package com. rjgf. report. other. design ;
import com. rjgf. common. core. utils. MyDateUtil ;
import com. rjgf. common. core. utils. SpringUtils ;
import com. rjgf. common. redis. service. RedisService ;
import com. rjgf. report. domain. ElectricConsumerSumSo ;
import com. rjgf. report. domain. ElectricHourReport ;
import com. rjgf. report. mapper. DwdElectricConsumeMapper ;
import com. rjgf. system. api. domain. EnergyBuild ;
import java. util. ArrayList ;
import java. util. Date ;
import java. util. List ;
import java. util. Map ;
import static com. rjgf. common. core. constant. CacheConstants . BUILD_REDIS_CACHE_KEY;
import static com. rjgf. common. core. utils. MyDateUtil . *;
public class BuildElectricConsumerStrategy implements ElectricConsumerStrategy {
@Override
public void hourReport ( String type) {
Date nowDate = new Date ( ) ;
String beforeDate = MyDateUtil . beforeHourToString ( nowDate, 1 ) ;
Map < String , Integer > yymmddhh = MyDateUtil . getYYMMDDHH ( beforeDate) ;
Map < String , EnergyBuild > buildMap = SpringUtils . getBean ( RedisService . class ) . getCacheMap ( BUILD_REDIS_CACHE_KEY) ;
DwdElectricConsumeMapper dwdElectricConsumeMapper = SpringUtils . getBean ( DwdElectricConsumeMapper . class ) ;
List < ElectricHourReport > list = new ArrayList < ElectricHourReport > ( 64 ) ;
List < ElectricConsumerSumSo > electricConsumerSumList = dwdElectricConsumeMapper. hourReport ( beforeDate, type) ;
for ( ElectricConsumerSumSo sumSo : electricConsumerSumList) {
if ( buildMap. containsKey ( sumSo. getId ( ) ) ) {
String dimension = buildMap. get ( sumSo. getId ( ) ) . getBuildName ( ) ;
ElectricHourReport electricHourReport = new ElectricHourReport ( dimension,
type,
yymmddhh. get ( MY_YEAR) ,
yymmddhh. get ( MY_MONTH) ,
yymmddhh. get ( MY_DAY) ,
yymmddhh. get ( MY_HOUR) ,
sumSo. getConsume ( ) ,
nowDate) ;
list. add ( electricHourReport) ;
}
}
dwdElectricConsumeMapper. batchInsertElectricHourReport ( list) ;
}
}
package com. rjgf. report. other. design ;
import com. rjgf. common. core. utils. MyDateUtil ;
import com. rjgf. common. core. utils. SpringUtils ;
import com. rjgf. report. domain. ElectricConsumerSumSo ;
import com. rjgf. report. domain. ElectricHourReport ;
import com. rjgf. report. mapper. DwdElectricConsumeMapper ;
import com. rjgf. system. api. RemoteDeptService ;
import com. rjgf. system. api. domain. SysDept ;
import java. util. ArrayList ;
import java. util. Date ;
import java. util. List ;
import java. util. Map ;
import static com. rjgf. common. core. constant. SecurityConstants . INNER;
import static com. rjgf. common. core. utils. MyDateUtil . *;
public class DeptElectricConsumerStrategy implements ElectricConsumerStrategy {
@Override
public void hourReport ( String type) {
Date nowDate = new Date ( ) ;
String beforeDate = MyDateUtil . beforeHourToString ( nowDate, 1 ) ;
Map < String , Integer > yymmddhh = MyDateUtil . getYYMMDDHH ( beforeDate) ;
RemoteDeptService remoteDeptService = SpringUtils . getBean ( RemoteDeptService . class ) ;
DwdElectricConsumeMapper dwdElectricConsumeMapper = SpringUtils . getBean ( DwdElectricConsumeMapper . class ) ;
Map < Long , SysDept > deptMap = remoteDeptService. map ( INNER) . getData ( ) ;
List < ElectricHourReport > list = new ArrayList < ElectricHourReport > ( 64 ) ;
List < ElectricConsumerSumSo > electricConsumerSumList = dwdElectricConsumeMapper. hourReport ( beforeDate, type) ;
for ( ElectricConsumerSumSo sumSo : electricConsumerSumList) {
if ( deptMap. containsKey ( Long . parseLong ( sumSo. getId ( ) ) ) ) {
String dimension = deptMap. get ( Long . parseLong ( sumSo. getId ( ) ) ) . getDeptName ( ) ;
ElectricHourReport electricHourReport = new ElectricHourReport ( dimension,
type,
yymmddhh. get ( MY_YEAR) ,
yymmddhh. get ( MY_MONTH) ,
yymmddhh. get ( MY_DAY) ,
yymmddhh. get ( MY_HOUR) ,
sumSo. getConsume ( ) ,
nowDate) ;
list. add ( electricHourReport) ;
}
}
dwdElectricConsumeMapper. batchInsertElectricHourReport ( list) ;
}
}
使用工厂模式创建策略 ,饿汉式(静态代码块方式)
package com. rjgf. report. other. design ;
import com. google. common. collect. ImmutableMap ;
import java. util. Map ;
import static com. rjgf. report. service. impl. DwdElectricConsumeServiceImpl . DIMENSION_TYPE;
public class ElectricConsumerStrategyFactory {
public static final String [ ] DIMENSION_TYPE = { "dept_id" , "build_id" , "energy_category" } ;
static Map < String , ElectricConsumerStrategy > map;
static {
map = ImmutableMap . of (
DIMENSION_TYPE[ 0 ] , new DeptElectricConsumerStrategy ( ) ,
DIMENSION_TYPE[ 1 ] , new BuildElectricConsumerStrategy ( ) ,
DIMENSION_TYPE[ 2 ] , new EnergyCategoryElectricConsumerStrategy ( )
) ;
}
public static class SingletonHolder {
public static ElectricConsumerStrategyFactory electricConsumerStrategyFactory = new ElectricConsumerStrategyFactory ( ) ;
}
public static ElectricConsumerStrategyFactory getInstance ( ) {
return SingletonHolder . electricConsumerStrategyFactory;
}
public ElectricConsumerStrategy createStrategy ( String type) {
return map. get ( type) ;
}
}
优化之后
* 按维度查询小时用电量, 清洗数据到 electric_hour_report
*
* @return 结果
* /
@Override
@Transactional ( rollbackFor = Exception . class )
public Boolean hourReport ( ) {
for ( String type : DIMENSION_TYPE) {
ElectricConsumerStrategy strategy = ElectricConsumerStrategyFactory . getInstance ( ) . createStrategy ( type) ;
strategy. hourReport ( type) ;
}
return true ;
}
业务更复杂,代码命名进行优化,策略模式中套用策略模式。
package com. rjgf. report. other. design ;
import com. rjgf. common. core. utils. MyDateUtil ;
import com. rjgf. common. core. utils. SpringUtils ;
import com. rjgf. common. core. utils. StringUtils ;
import com. rjgf. common. redis. service. RedisService ;
import com. rjgf. report. domain. ElectricDimensionHourReport ;
import com. rjgf. report. domain. ElectricHourReport ;
import com. rjgf. report. domain. so. ElectricConsumerDimensionGroupBySo ;
import com. rjgf. report. domain. so. ElectricConsumerGroupBySo ;
import com. rjgf. report. mapper. DwdElectricConsumeMapper ;
import com. rjgf. system. api. domain. EnergyBuild ;
import java. util. ArrayList ;
import java. util. Date ;
import java. util. List ;
import java. util. Map ;
import static com. rjgf. common. core. constant. CacheConstants . BUILD_REDIS_CACHE_KEY;
import static com. rjgf. common. core. utils. MyDateUtil . *;
public class BuildElectricConsumerStrategy implements ElectricConsumerStrategy {
private Map < String , EnergyBuild > buildMap = null ;
@Override
public void hourReport ( String masterDimension) {
Date nowDate = new Date ( ) ;
String beforeDate = MyDateUtil . beforeHourToString ( nowDate, 1 ) ;
Map < String , Integer > yymmddhh = MyDateUtil . getYYMMDDHH ( beforeDate) ;
DwdElectricConsumeMapper dwdElectricConsumeMapper = SpringUtils . getBean ( DwdElectricConsumeMapper . class ) ;
List < ElectricHourReport > list = new ArrayList < ElectricHourReport > ( 64 ) ;
refreshDimensionMap ( ) ;
List < ElectricConsumerGroupBySo > electricConsumerSumList = dwdElectricConsumeMapper. hourReport ( beforeDate, masterDimension) ;
for ( ElectricConsumerGroupBySo sumSo : electricConsumerSumList) {
String dimensionName = getDimensionName ( sumSo. getDimensionId ( ) ) ;
if ( StringUtils . isNotEmpty ( dimensionName) ) {
ElectricHourReport electricHourReport = new ElectricHourReport ( dimensionName,
masterDimension,
yymmddhh. get ( MY_YEAR) ,
yymmddhh. get ( MY_MONTH) ,
yymmddhh. get ( MY_DAY) ,
yymmddhh. get ( MY_HOUR) ,
sumSo. getRecord ( ) ,
nowDate) ;
list. add ( electricHourReport) ;
}
}
dwdElectricConsumeMapper. batchInsertElectricHourReport ( list) ;
}
@Override
public void hourDimensionReport ( String masterDimension, String slaveDimension) {
Date nowDate = new Date ( ) ;
String beforeDate = MyDateUtil . beforeHourToString ( nowDate, 1 ) ;
Map < String , Integer > yymmddhh = MyDateUtil . getYYMMDDHH ( beforeDate) ;
DwdElectricConsumeMapper dwdElectricConsumeMapper = SpringUtils . getBean ( DwdElectricConsumeMapper . class ) ;
List < ElectricConsumerDimensionGroupBySo > groupBySoList = dwdElectricConsumeMapper
. hourDimensionReport ( beforeDate, masterDimension, slaveDimension) ;
ElectricConsumerStrategy strategy = ElectricConsumerStrategyFactory . getInstance ( ) . createStrategy ( slaveDimension) ;
refreshDimensionMap ( ) ;
List < ElectricDimensionHourReport > list = new ArrayList < ElectricDimensionHourReport > ( 64 ) ;
for ( ElectricConsumerDimensionGroupBySo so : groupBySoList) {
String mDimension = getDimensionName ( so. getMasterDimensionId ( ) ) ;
String sDimension = strategy. getDimensionName ( so. getSlaveDimensionId ( ) ) ;
if ( StringUtils . isNotEmpty ( mDimension) && StringUtils . isNotEmpty ( sDimension) ) {
ElectricDimensionHourReport electricDimensionHourReport = new ElectricDimensionHourReport ( mDimension,
sDimension,
masterDimension,
yymmddhh. get ( MY_YEAR) ,
yymmddhh. get ( MY_MONTH) ,
yymmddhh. get ( MY_DAY) ,
yymmddhh. get ( MY_HOUR) ,
so. getRecord ( ) ) ;
list. add ( electricDimensionHourReport) ;
}
}
dwdElectricConsumeMapper. batchInsertElectricDimensionHourReport ( list) ;
}
@Override
public String getDimensionName ( String dimensionId) {
if ( buildMap. containsKey ( dimensionId) ) {
return buildMap. get ( dimensionId) . getBuildName ( ) ;
}
return null ;
}
@Override
public void refreshDimensionMap ( ) {
buildMap = SpringUtils . getBean ( RedisService . class ) . getCacheMap ( BUILD_REDIS_CACHE_KEY) ;
}
}
< select id= "hourDimensionReport"
resultType= "com.rjgf.report.domain.so.ElectricConsumerDimensionGroupBySo" >
SELECT
${ masterDimension} AS masterDimensionId ,
${ slaveDimension} AS slaveDimensionId,
SUM ( consume) AS record
FROM ods_hour_electric_consume
WHERE influxdb_time= #{ datetime}
GROUP BY ${ masterDimension} , ${ slaveDimension}
< / select>
优化后代码
@Override
@Transactional ( rollbackFor = Exception . class )
public Boolean hourDimensionReport ( ) {
for ( String masterDimension : DIMENSION_TYPE) {
for ( String slaveDimension : DIMENSION_TYPE) {
if ( ! masterDimension. equals ( slaveDimension) ) {
ElectricConsumerStrategy strategy = ElectricConsumerStrategyFactory . getInstance ( ) . createStrategy ( masterDimension) ;
strategy. hourDimensionReport ( masterDimension, slaveDimension) ;
}
}
}
return true ;
}