From 3bce400f9e9780c54ce0a4943e9abaef4172057d Mon Sep 17 00:00:00 2001 From: zhangyongzhangyong <2012005003@qq.coom> Date: Wed, 25 Dec 2019 10:35:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E8=AE=A1=E5=88=92=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epdc/service/impl/KpiRuleServiceImpl.java | 268 ++++++++++-------- 1 file changed, 144 insertions(+), 124 deletions(-) diff --git a/esua-epdc/epdc-module/epdc-kpi/epdc-kpi-server/src/main/java/com/elink/esua/epdc/service/impl/KpiRuleServiceImpl.java b/esua-epdc/epdc-module/epdc-kpi/epdc-kpi-server/src/main/java/com/elink/esua/epdc/service/impl/KpiRuleServiceImpl.java index a21ca4efc..3a048bfd4 100644 --- a/esua-epdc/epdc-module/epdc-kpi/epdc-kpi-server/src/main/java/com/elink/esua/epdc/service/impl/KpiRuleServiceImpl.java +++ b/esua-epdc/epdc-module/epdc-kpi/epdc-kpi-server/src/main/java/com/elink/esua/epdc/service/impl/KpiRuleServiceImpl.java @@ -33,6 +33,7 @@ import com.elink.esua.epdc.commons.tools.utils.Result; import com.elink.esua.epdc.constant.KpiFieldConstant; import com.elink.esua.epdc.dao.*; import com.elink.esua.epdc.dto.*; +import com.elink.esua.epdc.dto.form.KpiMetaDataOfEventsFormDTO; import com.elink.esua.epdc.dto.form.KpiRuleSaveOrUpdateFormDTO; import com.elink.esua.epdc.dto.result.KpiRuleQueryResultDTO; import com.elink.esua.epdc.entity.*; @@ -41,6 +42,7 @@ import com.elink.esua.epdc.enums.KpiRuleModeEnum; import com.elink.esua.epdc.service.KpiRuleService; import com.elink.esua.epdc.utils.DeptUtils; import com.google.common.collect.Lists; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,6 +55,7 @@ import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import java.math.BigDecimal; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.YearMonth; import java.util.*; @@ -62,6 +65,7 @@ import java.util.*; * @author qu qu@elink-cn.com * @since v1.0.0 2019-11-27 */ +@Slf4j @Service public class KpiRuleServiceImpl extends BaseServiceImpl implements KpiRuleService { private Logger logger = LoggerFactory.getLogger(getClass()); @@ -306,69 +310,64 @@ public class KpiRuleServiceImpl extends BaseServiceImpl ruleParamList = kpiRuleParamDao.queryFormulaParam(kpiRuleDTO.getId()); - List metaDateCodeList = Lists.newArrayList(); - for (int i = 0; i < ruleParamList.size(); i++) { - metaDateCodeList.add(ruleParamList.get(i).getMetaDataCode()); - } - - int pageSize = NumConstant.THIRTY; - int pageIndex = NumConstant.ONE; - - List deptIdList = deptUtils.getDeptIdList(OrganizationTypeConstant.ORG_TYPE_GRID_PARTY, pageSize, pageIndex); - do { - - for (Long deptId : deptIdList) { - - BigDecimal[] paramValue = selectArrayOfMetaDate(deptId, startDate, endDate, metaDateCodeList); + //每次JOB启动时,根据当前时间,获取时间范围 + Map mapDate = this.initKpiParam(kpiRuleDTO.getKpiCycle(), "calcWorkScoreByRuleCode"); + if (mapDate != null){ + // 根据 考核规则表-外键(公式id),查询绩效考核公式表,待运行公式方法 + KpiFormulaDTO kpiFormulaDTO = kpiFormulaDao.queryFormula(kpiRuleDTO.getReferenceId()); + // 根据 考核规则表-主键,查询公式参数表,排序:1,2,3,4,5 + List ruleParamList = kpiRuleParamDao.queryFormulaParam(kpiRuleDTO.getId()); + List metaDateCodeList = Lists.newArrayList(); + for (int i = 0; i < ruleParamList.size(); i++) { + metaDateCodeList.add(ruleParamList.get(i).getMetaDataCode()); + } - //参数准备完全时,执行js运算 - if (paramValue.length == kpiFormulaDTO.getParamAmount()) { - BigDecimal workScore; - try { - //获得一个javascipt的执行引擎 - ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript"); - //执行js代码:参数为:公式运行方法 - engine.eval(kpiFormulaDTO.getFormula()); - //是否可调用方法 - boolean flag = engine instanceof Invocable; - if (!flag) { - return new Result().error("运行方法异常"); + int pageSize = NumConstant.THIRTY; + int pageIndex = NumConstant.ONE; + List deptIdList = deptUtils.getDeptIdList(OrganizationTypeConstant.ORG_TYPE_GRID_PARTY, pageSize, pageIndex); + do { + + for (Long deptId : deptIdList) { + + BigDecimal[] paramValue = selectArrayOfMetaDate(deptId, mapDate.get("startDate"), mapDate.get("endDate"), metaDateCodeList); + //参数准备完全时,执行js运算 + if (paramValue.length == kpiFormulaDTO.getParamAmount()) { + BigDecimal workScore; + try { + //获得一个javascipt的执行引擎 + ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript"); + //执行js代码:参数为:公式运行方法 + engine.eval(kpiFormulaDTO.getFormula()); + //是否可调用方法 + boolean flag = engine instanceof Invocable; + if (!flag) { + return new Result().error("运行方法异常"); + } + Invocable in = (Invocable) engine; + //执行js中的函数 参数:js方法名 + 参数 + Double result = (Double) in.invokeFunction(kpiFormulaDTO.getFunctionName(), paramValue); + Double workScoreDoouble = (double) Math.round(result * 100) / 100; + workScore = new BigDecimal(workScoreDoouble); + // 网格考核最终得分 表操作 + KpiResultGridEntity kpiManualScoreEntity = new KpiResultGridEntity(); + kpiManualScoreEntity.setWorkScore(workScore); + kpiManualScoreEntity.setGridId(deptId); + kpiManualScoreEntity.setStartDate(mapDate.get("startDate")); + kpiManualScoreEntity.setEndDate(mapDate.get("endDate")); + kpiManualScoreEntity.setKpiCycle(kpiRuleDTO.getKpiCycle()); + this.saveOrUpdateKpiResult(kpiManualScoreEntity); + } catch (Exception e) { + e.printStackTrace(); + return new Result().error("运行方法异常" + e.getMessage()); } - Invocable in = (Invocable) engine; - //执行js中的函数 参数:js方法名 + 参数 - Double result = (Double) in.invokeFunction(kpiFormulaDTO.getFunctionName(), paramValue); - Double workScoreDoouble = (double) Math.round(result * 100) / 100; - workScore = new BigDecimal(workScoreDoouble); - // 网格考核最终得分 表操作 - KpiResultGridEntity kpiManualScoreEntity = new KpiResultGridEntity(); - kpiManualScoreEntity.setWorkScore(workScore); - kpiManualScoreEntity.setGridId(deptId); - kpiManualScoreEntity.setStartDate(startDate); - kpiManualScoreEntity.setEndDate(endDate); - kpiManualScoreEntity.setKpiCycle(kpiRuleDTO.getKpiCycle()); - this.saveOrUpdateKpiResult(kpiManualScoreEntity); - } catch (Exception e) { - e.printStackTrace(); - return new Result().error("运行方法异常" + e.getMessage()); } } - } - - pageIndex++; - deptIdList = deptUtils.getDeptIdList(OrganizationTypeConstant.ORG_TYPE_GRID_PARTY, pageSize, pageIndex); - } while (CollUtil.isNotEmpty(deptIdList)); - + pageIndex++; + deptIdList = deptUtils.getDeptIdList(OrganizationTypeConstant.ORG_TYPE_GRID_PARTY, pageSize, pageIndex); + } while (CollUtil.isNotEmpty(deptIdList)); + } return new Result(); } @@ -386,48 +385,41 @@ public class KpiRuleServiceImpl extends BaseServiceImpl resultGrid = kpiResultGridDao.selectKpiResultGrid(kpiResultGridEntity); - for (KpiResultGridEntity kpi : resultGrid){ - BigDecimal finalScore; - try { - //获得一个javascipt的执行引擎 - ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript"); - //执行js代码:参数为:公式运行方法 - engine.eval(kpiFormulaDTO.getFormula()); - //是否可调用方法 - boolean flag = engine instanceof Invocable; - if (!flag) { - return new Result().error("运行方法异常"); + //每次JOB启动时,根据当前时间,获取时间范围 + Map mapDate = this.initKpiParam(kpiCycle, "calcBaseGridFinalScoreByRuleCode"); + if (mapDate != null) { + kpiResultGridEntity.setEndDate(mapDate.get("endDate")); + kpiResultGridEntity.setStartDate(mapDate.get("startDate")); + //查询网格最终得分:所有网格 + List resultGrid = kpiResultGridDao.selectKpiResultGrid(kpiResultGridEntity); + for (KpiResultGridEntity kpi : resultGrid){ + BigDecimal finalScore; + try { + //获得一个javascipt的执行引擎 + ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript"); + //执行js代码:参数为:公式运行方法 + engine.eval(kpiFormulaDTO.getFormula()); + //是否可调用方法 + boolean flag = engine instanceof Invocable; + if (!flag) { + return new Result().error("运行方法异常"); + } + Invocable in = (Invocable) engine; + //执行js中的函数 参数:js方法名 + 参数 + Double result = (Double) in.invokeFunction(kpiFormulaDTO.getFunctionName(), kpi.getManualScore(),kpi.getWorkScore()); + Double finalScoreDoouble = (double) Math.round(result * 100) / 100; + finalScore = new BigDecimal(finalScoreDoouble); + // 网格考核最终得分 表操作 + KpiResultGridEntity kpiManualScore = new KpiResultGridEntity(); + kpiManualScore.setFinalScore(finalScore); + kpiManualScore.setId(kpi.getId()); + kpiResultGridDao.updateById(kpiManualScore); + } catch (Exception e) { + e.printStackTrace(); + return new Result().error("运行方法异常" + e.getMessage()); } - Invocable in = (Invocable) engine; - //执行js中的函数 参数:js方法名 + 参数 - Double result = (Double) in.invokeFunction(kpiFormulaDTO.getFunctionName(), kpi.getManualScore(),kpi.getWorkScore()); - Double finalScoreDoouble = (double) Math.round(result * 100) / 100; - finalScore = new BigDecimal(finalScoreDoouble); - // 网格考核最终得分 表操作 - KpiResultGridEntity kpiManualScore = new KpiResultGridEntity(); - kpiManualScore.setFinalScore(finalScore); - kpiManualScore.setId(kpi.getId()); - kpiResultGridDao.updateById(kpiManualScore); - } catch (Exception e) { - e.printStackTrace(); - return new Result().error("运行方法异常" + e.getMessage()); } } return new Result(); @@ -511,37 +503,31 @@ public class KpiRuleServiceImpl extends BaseServiceImpl ruleParamList = kpiRuleParamDao.queryFormulaParam(kpiRuleDTO.getId()); - List metaDateCodeList = Lists.newArrayList(); - for (int i = 0; i < ruleParamList.size(); i++) { - metaDateCodeList.add(ruleParamList.get(i).getMetaDataCode()); + //每次JOB启动时,根据当前时间,获取时间范围 + Map mapDate = this.initKpiParam(kpiCycle, "calcDistrictStreetGeneralRule"); + if (mapDate != null) { + kpiResultSuperiorEntity.setEndDate(mapDate.get("endDate")); + kpiResultSuperiorEntity.setStartDate(mapDate.get("startDate")); + kpiResultSuperiorEntity.setKpiCycle(kpiCycle); + + // 根据 考核规则表-主键,查询公式参数表,排序:1,2,3,4,5,6 + List ruleParamList = kpiRuleParamDao.queryFormulaParam(kpiRuleDTO.getId()); + List metaDateCodeList = Lists.newArrayList(); + for (int i = 0; i < ruleParamList.size(); i++) { + metaDateCodeList.add(ruleParamList.get(i).getMetaDataCode()); + } + //区 考核最终得分计算 + this.assessmentScoreCalculation(kpiRuleDTO.getReferenceId(), + kpiResultSuperiorEntity.getStartDate(),kpiResultSuperiorEntity.getEndDate(), + metaDateCodeList,OrganizationTypeConstant.ORG_TYPE_DISTRICT_DEPT,kpiCycle); + + //街区 考核最终得分计算 + this.assessmentScoreCalculation(kpiRuleDTO.getReferenceId(), + kpiResultSuperiorEntity.getStartDate(),kpiResultSuperiorEntity.getEndDate(), + metaDateCodeList,OrganizationTypeConstant.ORG_TYPE_STREET_DEPT,kpiCycle); } - //区 考核最终得分计算 - this.assessmentScoreCalculation(kpiRuleDTO.getReferenceId(), - kpiResultSuperiorEntity.getStartDate(),kpiResultSuperiorEntity.getEndDate(), - metaDateCodeList,OrganizationTypeConstant.ORG_TYPE_DISTRICT_DEPT,kpiCycle); - - //街区 考核最终得分计算 - this.assessmentScoreCalculation(kpiRuleDTO.getReferenceId(), - kpiResultSuperiorEntity.getStartDate(),kpiResultSuperiorEntity.getEndDate(), - metaDateCodeList,OrganizationTypeConstant.ORG_TYPE_STREET_DEPT,kpiCycle); return new Result(); } @@ -628,4 +614,38 @@ public class KpiRuleServiceImpl extends BaseServiceImpl initKpiParam(String kpiCycle, String methodName) { + LocalDate startDate = null; + YearMonth now = YearMonth.now(); + if (KpiCycleEnum.KPI_CYCLE_MONTH.getValue().equals(kpiCycle)) { + startDate = now.minusMonths(NumConstant.ONE).atDay(NumConstant.ONE); + } else if (KpiCycleEnum.KPI_CYCLE_QUARTER.getValue().equals(kpiCycle)) { + int monthValue = now.getMonthValue(); + if (monthValue == NumConstant.ONE || monthValue == NumConstant.FOUR || monthValue == NumConstant.SEVEN || monthValue == NumConstant.TEN) { + startDate = now.minusMonths(NumConstant.THREE).atDay(NumConstant.ONE); + } + } else if (KpiCycleEnum.KPI_CYCLE_YEAR.getValue().equals(kpiCycle)) { + if (now.getMonthValue() == NumConstant.ONE) { + startDate = now.minusMonths(NumConstant.TWELVE).atDay(NumConstant.ONE); + } + } + if (null == startDate) { + log.error("当前时间:{},无法按照{}执行绩效考核{}", LocalDateTime.now().toString(), kpiCycle, methodName); + return null; + } + log.info("开始执行:{},当前时间:{},考核周期:{}", methodName, LocalDateTime.now().toString(), kpiCycle); + Map map = new HashMap(); + map.put("startDate", LocalDateUtils.localDateToDate(startDate)); + map.put("endDate", LocalDateUtils.localDateToDate(YearMonth.now().minusMonths(NumConstant.ONE).atEndOfMonth())); + return map; + } }