Commit 55255eb6 by dengwei

指标积分个性化修改

parent ae99835d
...@@ -28,6 +28,7 @@ public class IndScorecard { ...@@ -28,6 +28,7 @@ public class IndScorecard {
private Double compLimitScore; private Double compLimitScore;
private String scoreType;//综合评分类型 0:定义 1:公式 private String scoreType;//综合评分类型 0:定义 1:公式
private String improveScoreType;//改善提升类型(新增字段2022-03-31) 0:普通 1:公式
//定义综合评价 //定义综合评价
private Double indBaseScore;//基础分 private Double indBaseScore;//基础分
private Double moreAverage;//大于组内平均分加分 private Double moreAverage;//大于组内平均分加分
...@@ -61,12 +62,22 @@ public class IndScorecard { ...@@ -61,12 +62,22 @@ public class IndScorecard {
private Double improveBaseScore;//改善提升基础分,新增改善提升基础分-hzc 2020 12 29 private Double improveBaseScore;//改善提升基础分,新增改善提升基础分-hzc 2020 12 29
private String sectionFormula;//区间公式表达式 private String sectionFormula;//区间公式表达式
private Double compLimitFloorScore;//综合评价下限 private Double compLimitFloorScore;//综合评价下限
private Double limitFloorScore;//改善提升下限 private Double limitFloorScore;//改善提升下限
private Double improveLimitScore;// 改善提升积分上限(新增字段2022-03-31)
private Double improveLimitFloorScore;// 改善提升积分下限(新增字段2022-03-31)
private String improveFormulaInfo;//(新增字段2022-03-31)
private String improveOtherCalFormula;// 改善提升公式积分公式(新增字段2022-03-31)
private Double improveBestScore;// 改善提升同比值最佳积分(新增字段2022-03-31)
private Double improveWorstScore;// 改善提升同比值最差积分(新增字段2022-03-31)
} }
...@@ -23,4 +23,5 @@ public class UploadFile { ...@@ -23,4 +23,5 @@ public class UploadFile {
private String uploadUser;//上传用户名 private String uploadUser;//上传用户名
private String uploadDate;//上传时间 private String uploadDate;//上传时间
private String code;//机构编码 private String code;//机构编码
private String orgName;//机构名称
} }
package com.keymobile.indicators.service.hytobacco; package com.keymobile.indicators.service.hytobacco;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
...@@ -181,7 +177,6 @@ public class IndScorecardService { ...@@ -181,7 +177,6 @@ public class IndScorecardService {
DriveIndCalResultDef currentCompareObjResult = driveIndCalResultDefMapper DriveIndCalResultDef currentCompareObjResult = driveIndCalResultDefMapper
.findByIndIdAndDateAndCompareObjAndCompareCatalog(indId, date, .findByIndIdAndDateAndCompareObjAndCompareCatalog(indId, date,
compareObj, code, compareCatalog,dateMark); compareObj, code, compareCatalog,dateMark);
if(currentCompareObjResult!=null) { if(currentCompareObjResult!=null) {
String average = currentCompareObjResult.getAverage(); String average = currentCompareObjResult.getAverage();
//如果实际平均值存在 //如果实际平均值存在
...@@ -290,7 +285,14 @@ public class IndScorecardService { ...@@ -290,7 +285,14 @@ public class IndScorecardService {
sectionScores,acsType); sectionScores,acsType);
} }
} }else if ("3".equals(scoreCard.getScoreType())){ // 排名强制区间表达式计算
// 计算(排名/组内单位数*100)
double x = new Double(currentCompareObjResult.getRank()) / currentDriveResult.size() * 100;
// 解析区间表达式,计算基本分
baseScoreValue = this.getBaseScoreByExpression(x, scoreCard);
// 解析排名加减分JSON,计算基本分
baseScoreValue = baseScoreValue + this.getBonusByJson(currentCompareObjResult, scoreCard, currentDriveResult);
}
//判断是否有设置综合评分分数上限,有的话判断上限分和实际分 //判断是否有设置综合评分分数上限,有的话判断上限分和实际分
if(scoreCard.getCompLimitScore()!=null) { if(scoreCard.getCompLimitScore()!=null) {
if(baseScoreValue>scoreCard.getCompLimitScore()) { if(baseScoreValue>scoreCard.getCompLimitScore()) {
...@@ -307,44 +309,87 @@ public class IndScorecardService { ...@@ -307,44 +309,87 @@ public class IndScorecardService {
} }
//改善提升 //改善提升
if("1".equals(scoreCard.getIsIncluScore())) {//纳入单位得分计算 if("1".equals(scoreCard.getIsIncluScore())) {//纳入单位得分计算
//同期 if(StringUtils.equals("0", scoreCard.getImproveScoreType())){
//改用添加对标单元目录做为过滤条件 // 改善提升普通积分
DriveIndCalResultDef sameCompareObjResult = driveIndCalResultDefMapper //同期
.findByIndIdAndDateAndCompareObjAndCompareCatalog(indId, (date-100), //改用添加对标单元目录做为过滤条件
compareObj,code,compareCatalog,dateMark); DriveIndCalResultDef sameCompareObjResult = driveIndCalResultDefMapper
if(sameCompareObjResult!=null) { .findByIndIdAndDateAndCompareObjAndCompareCatalog(indId, (date-100),
List<ImproveScoreDef> importScoreDefList = new ArrayList<>(); compareObj,code,compareCatalog,dateMark);
if(StringUtils.isNotBlank(scoreCard.getImproveScoreItemJson())) { if(sameCompareObjResult!=null) {
importScoreDefList = gson. List<ImproveScoreDef> importScoreDefList = new ArrayList<>();
fromJson(scoreCard.getImproveScoreItemJson(), if(StringUtils.isNotBlank(scoreCard.getImproveScoreItemJson())) {
new TypeToken<List<ImproveScoreDef>>(){}.getType()); importScoreDefList = gson.
} fromJson(scoreCard.getImproveScoreItemJson(),
double improveScore = this.calImproveValue(acsType, unit, new TypeToken<List<ImproveScoreDef>>(){}.getType());
importScoreDefList, currentCompareObjResult, }
sameCompareObjResult,compareObjs, double improveScore = this.calImproveValue(acsType, unit,
driveIndDef.getGrowCalType(),code); importScoreDefList, currentCompareObjResult,
//新增基础分 hzc sameCompareObjResult,compareObjs,
Double improveBaseScore = scoreCard.getImproveBaseScore(); driveIndDef.getGrowCalType(),code);
if(improveBaseScore!=null&&improveBaseScore!=0){ //新增基础分 hzc
improveScore+=improveBaseScore; Double improveBaseScore = scoreCard.getImproveBaseScore();
if(improveBaseScore!=null&&improveBaseScore!=0){
improveScore+=improveBaseScore;
}
//改善上限
if(scoreCard.getLimitScore()!=null) {
if(improveScore>scoreCard.getLimitScore()) {
improveScore = scoreCard.getLimitScore();
}
}
//改善下限
if(scoreCard.getLimitFloorScore()!=null&&scoreCard.getLimitFloorScore()!=0){
if(improveScore<scoreCard.getLimitFloorScore()) {
improveScore = scoreCard.getLimitFloorScore();
}
}
indImproveScoreValue = String.format("%.8f",new BigDecimal(improveScore));
result.put("improveScore",indImproveScoreValue);
}else{
//没有同期值
result.put("improveScore","No");//表示不纳入单位得分计算标识
} }
//改善上限 }else if(StringUtils.equals("1", scoreCard.getImproveScoreType())){
if(scoreCard.getLimitScore()!=null) { // 改善提升公式积分
if(improveScore>scoreCard.getLimitScore()) { // 获取本组的同期考核指标结果
improveScore = scoreCard.getLimitScore(); List<DriveIndCalResultDef> sameDriveResult = new ArrayList<>();
// 判断本期成员与同期成员是否一致,可能存在换组的情况
if (compareObjs.isEmpty()){
sameDriveResult = driveIndCalResultDefMapper.findByIndIdAndDateAndCompareIdAndSort(indId, (date-100), compareId, code, dateMark);
}else {
for (String obj : compareObjs){
DriveIndCalResultDef indCalResultDef = driveIndCalResultDefMapper
.findByIndIdAndDateAndCompareObjAndCompareCatalog(currentCompareObjResult.getIndId(), (currentCompareObjResult.getDate()-100),
obj, code, currentCompareObjResult.getCompareCatalog(), currentCompareObjResult.getDateMark());
if (indCalResultDef != null){
sameDriveResult.add(indCalResultDef);
}
} }
} }
//改善下限 if(!sameDriveResult.isEmpty()){
if(scoreCard.getLimitFloorScore()!=null&&scoreCard.getLimitFloorScore()!=0){ // 增幅计算类型 0:本期-同期 1:(本期-同期)/同期*100
if(improveScore<scoreCard.getLimitFloorScore()) { String growCalType = driveIndDef.getGrowCalType();
improveScore = scoreCard.getLimitFloorScore(); // 获取改善提升积分
double improveScore = this.getImproveScore(currentDriveResult, sameDriveResult, currentCompareObjResult, scoreCard, growCalType, acsType);
// 改善提升积分上限
if (scoreCard.getImproveLimitScore() != null && scoreCard.getImproveLimitScore() != 0){
if (improveScore > scoreCard.getImproveLimitScore()){
improveScore = scoreCard.getImproveLimitScore();
}
} }
// 改善提升积分下限
if (scoreCard.getImproveLimitFloorScore() != null && scoreCard.getImproveLimitFloorScore() != 0){
if (improveScore < scoreCard.getImproveLimitFloorScore()){
improveScore = scoreCard.getImproveLimitFloorScore();
}
}
indImproveScoreValue = String.format("%.8f", new BigDecimal(improveScore));
result.put("improveScore", indImproveScoreValue);
}else{
//没有同期值
result.put("improveScore","No");//表示不纳入单位得分计算标识
} }
indImproveScoreValue = String.format("%.8f",new BigDecimal(improveScore));
result.put("improveScore",indImproveScoreValue);
}else{
//没有同期值
result.put("improveScore","No");//表示不纳入单位得分计算标识
} }
}else { }else {
result.put("improveScore","No");//表示不纳入单位得分计算标识 result.put("improveScore","No");//表示不纳入单位得分计算标识
...@@ -368,7 +413,177 @@ public class IndScorecardService { ...@@ -368,7 +413,177 @@ public class IndScorecardService {
return result; return result;
} }
private List<DriveIndCalResultDef> getSectionFonmulaValues(List<DriveIndCalResultDef> currentDriveResult, IndScorecard scoreCard) { /**
* 获取改善提升积分
* @param currentDriveResult
* @param sameDriveResult
* @param currentCompareObjResult
* @param scoreCard
* @param growCalType
* @return
*/
private double getImproveScore(List<DriveIndCalResultDef> currentDriveResult, List<DriveIndCalResultDef> sameDriveResult, DriveIndCalResultDef currentCompareObjResult, IndScorecard scoreCard, String growCalType, String acsType) {
double improveScore = 0.0;
Map<String, String> current = new HashMap<>();
Map<String, String> same = new HashMap<>();
// 同比值集合
Map<String, String> valueMap = new HashMap<>();
// 同比值平均值
double avg;
double sum = 0.0;
currentDriveResult.forEach(e -> {
if (StringUtils.isNotBlank(e.getValue())){
current.put(e.getCompareObj(), e.getValue());
}else {
current.put(e.getCompareObj(), "0");
}
});
sameDriveResult.forEach(e -> {
if (StringUtils.isNotBlank(e.getValue())){
same.put(e.getCompareObj(), e.getValue());
}else {
same.put(e.getCompareObj(), "0");
}
});
//增幅计算类型 0:本期-同期 1:(本期-同期)/同期*100
for (String s : current.keySet()){
// 计算同期比
String rate = CalculateUtils.calGowth(current.get(s), same.get(s), growCalType);
double improveValue = 0;
if (StringUtils.isNotBlank(rate)) {
improveValue = Double.parseDouble(rate);
}
valueMap.put(s, String.valueOf(improveValue));
sum += improveValue;
}
avg = (sum * 1.0) / (current.size() * 1.0);
// 排名
Map<String, Integer> rankValue = CalculateUtils.rankValue(valueMap, "0");
// 排序
Map<String, Integer> sortValue = CalculateUtils.sortByValueAsc(rankValue);
String compareObj = currentCompareObjResult.getCompareObj();
currentCompareObjResult.setRank(sortValue.get(compareObj));
currentCompareObjResult.setCompareObj(compareObj);
currentCompareObjResult.setValue(valueMap.get(compareObj));
currentCompareObjResult.setAverage(String.format("%.8f", new BigDecimal(avg)));
List<DriveIndCalResultDef> list = new ArrayList<>();
for (String sort : sortValue.keySet()){
DriveIndCalResultDef def = new DriveIndCalResultDef();
def.setCompareObj(sort);
def.setRank(sortValue.get(sort));
def.setValue(valueMap.get(sort));
def.setAverage(String.format("%.8f", new BigDecimal(avg)));
list.add(def);
}
int rank = currentCompareObjResult.getRank();
if(rank==1 && scoreCard.getBestIndScore()!=null) { // 同比值最佳积分
if(checkMaxEqMin(list,acsType)){
improveScore = 0;
}else{
improveScore = scoreCard.getBestIndScore();
}
}else if(rank == list.size() && scoreCard.getWorstIndScore()!=null) { // 同比值最差积分
if(checkMaxEqMin(list,acsType)){
improveScore = 0;
}else{
improveScore = scoreCard.getWorstIndScore();
}
}else { // 公式
if(StringUtils.isNotBlank(scoreCard.getImproveOtherCalFormula())) {
improveScore = this.getValueFromFormula(scoreCard.getImproveOtherCalFormula(), currentCompareObjResult, list, acsType);
}
}
return improveScore;
}
/**
* 根据排名加减分规则获取额外分数
* @param currentCompareObjResult
* @param scoreCard
* @param currentDriveResult
* @return
*/
private double getBonusByJson(DriveIndCalResultDef currentCompareObjResult, IndScorecard scoreCard, List<DriveIndCalResultDef> currentDriveResult) {
Double value = 0.0;
Gson gson = new Gson();
int rank = currentCompareObjResult.getRank();
//加分项
if(StringUtils.isNotBlank(scoreCard.getAddScoreItemJson())) {
List<RankScoreDef> addScoreItem = gson.
fromJson(scoreCard.getAddScoreItemJson(), new TypeToken<List<RankScoreDef>>(){}.getType());
for(RankScoreDef scoreDef : addScoreItem) {
if(scoreDef.getRank() == rank) {
value += scoreDef.getScore();
break;
}
}
}
//减分项
if(StringUtils.isNotBlank(scoreCard.getMinusScoreItemJson())) {
List<RankScoreDef> minusScoreItem = gson.
fromJson(scoreCard.getMinusScoreItemJson(), new TypeToken<List<RankScoreDef>>(){}.getType());
rank = currentDriveResult.size()-rank+1;
for(RankScoreDef scoreDef : minusScoreItem) {
if(scoreDef.getRank()==rank) {
value -= scoreDef.getScore();
break;
}
}
}
return value;
}
/**
* 根据排名强制区间表达式获取基本分
* @param x
* @param scoreCard
* @return
*/
private double getBaseScoreByExpression(double x, IndScorecard scoreCard) {
double value = 0.0;
String[] sections = scoreCard.getSectionFormula().split(",");
double start;
boolean startEq;
double end;
boolean endEq;
for (String section : sections){
String[] sec = section.split(":");
if(StringUtils.isBlank(sec[0])&&StringUtils.isBlank(sec[3])){
//范围边界都是空
log.info("范围边界不可全为空!!!");
continue;
}
if(StringUtils.isBlank(sec[0])){
start=Double.MIN_VALUE;
}else{
start = Double.parseDouble(sec[0]);
}
startEq = "1".equals(sec[1]);
if(StringUtils.isBlank(sec[3])){
end=Double.MAX_VALUE;
}else{
end = Double.parseDouble(sec[3]);
}
endEq = "1".equals(sec[2]);
//先假设全是闭区间
if(x >= start && x <= end) {
if (!startEq && x == start) {
//是开区间,而且值就等于边界值跳过
continue;
}
if (!endEq && x == end) {
//是开区间,而且值就等于边界值跳过
continue;
}
//符合区间范围
value = StringUtils.isNotBlank(sec[4]) ? Double.parseDouble(sec[4]) : 0.0;
break;
}
}
return value;
}
private List<DriveIndCalResultDef> getSectionFonmulaValues(List<DriveIndCalResultDef> currentDriveResult, IndScorecard scoreCard) {
List<DriveIndCalResultDef> values = new ArrayList<>(); List<DriveIndCalResultDef> values = new ArrayList<>();
Map<String,String> rankMapTmp = new HashMap<>(); Map<String,String> rankMapTmp = new HashMap<>();
double sum=0; double sum=0;
......
package com.keymobile.indicators.service.uploadfile; package com.keymobile.indicators.service.uploadfile;
import java.io.InputStream; import java.io.InputStream;
import java.util.Date; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSONObject;
import com.keymobile.indicators.service.SystemAuthService;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -27,6 +26,8 @@ public class UploadFileService { ...@@ -27,6 +26,8 @@ public class UploadFileService {
@Autowired @Autowired
private UploadFileMapper uploadFileMapper; private UploadFileMapper uploadFileMapper;
@Autowired
private SystemAuthService systemAuthService;
@Value("${uploadfile.path}") @Value("${uploadfile.path}")
private String uploadFilePath; private String uploadFilePath;
...@@ -34,6 +35,7 @@ public class UploadFileService { ...@@ -34,6 +35,7 @@ public class UploadFileService {
//上传文件 //上传文件
public void uploadFile(InputStream in,String fileName,String fileType, public void uploadFile(InputStream in,String fileName,String fileType,
String user,String code) throws Exception{ String user,String code) throws Exception{
fileName = this.filterFilename(fileName);
//先保存文件详情到数据库中 //先保存文件详情到数据库中
UploadFile uploadFile = new UploadFile(); UploadFile uploadFile = new UploadFile();
if(StringUtils.isNotBlank(fileType)) { if(StringUtils.isNotBlank(fileType)) {
...@@ -46,6 +48,12 @@ public class UploadFileService { ...@@ -46,6 +48,12 @@ public class UploadFileService {
uploadFile.setUploadUser(user); uploadFile.setUploadUser(user);
uploadFile.setUploadDate(DateUtils.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss")); uploadFile.setUploadDate(DateUtils.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss"));
uploadFile.setCode(code); uploadFile.setCode(code);
List<String> codes = new ArrayList<>();
codes.add(code);
List<JSONObject> jsonObjects = systemAuthService.getByNos(codes);
for (JSONObject object : jsonObjects){
uploadFile.setOrgName(object.getString("name"));
}
//保存 //保存
uploadFileMapper.insert(uploadFile); uploadFileMapper.insert(uploadFile);
//设置上传文件路径 //设置上传文件路径
...@@ -81,6 +89,9 @@ public class UploadFileService { ...@@ -81,6 +89,9 @@ public class UploadFileService {
int page,int rows)throws Exception{ int page,int rows)throws Exception{
Map<String,Object> resultMap = new HashMap<>(); Map<String,Object> resultMap = new HashMap<>();
Map<String,Object> paramMap = new HashMap<>(); Map<String,Object> paramMap = new HashMap<>();
if(code.length()>2){
code = code.substring(0,code.length()-2);
}
paramMap.put("code", code+"%"); paramMap.put("code", code+"%");
if(StringUtils.isBlank(keyword)) { if(StringUtils.isBlank(keyword)) {
paramMap.put("keyword", null); paramMap.put("keyword", null);
...@@ -105,4 +116,26 @@ public class UploadFileService { ...@@ -105,4 +116,26 @@ public class UploadFileService {
public void deleteUploadFile(List<Integer> ids) { public void deleteUploadFile(List<Integer> ids) {
uploadFileMapper.deleteByIdIn(ids); uploadFileMapper.deleteByIdIn(ids);
} }
/**
* 过滤文件名称
* @param filename
* @return
*/
private String filterFilename(String filename) {
String newFileName;
// 看是否unix带路径格式
int unixSep = filename.lastIndexOf('/');
// 看是否win带路径格式
int winSep = filename.lastIndexOf('\\');
// 检查分隔符长度 winSep == -1 && unixSep == -1 则filename不带路径格式
int pos = (winSep > unixSep ? winSep : unixSep);
if (pos != -1) {
// 只获取分隔符后文件名
filename = filename.substring(pos + 1);
}
newFileName = filename;
return newFileName;
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment