Commit 55255eb6 by dengwei

指标积分个性化修改

parent ae99835d
......@@ -28,6 +28,7 @@ public class IndScorecard {
private Double compLimitScore;
private String scoreType;//综合评分类型 0:定义 1:公式
private String improveScoreType;//改善提升类型(新增字段2022-03-31) 0:普通 1:公式
//定义综合评价
private Double indBaseScore;//基础分
private Double moreAverage;//大于组内平均分加分
......@@ -61,12 +62,22 @@ public class IndScorecard {
private Double improveBaseScore;//改善提升基础分,新增改善提升基础分-hzc 2020 12 29
private String sectionFormula;//区间公式表达式
private Double compLimitFloorScore;//综合评价下限
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 {
private String uploadUser;//上传用户名
private String uploadDate;//上传时间
private String code;//机构编码
private String orgName;//机构名称
}
package com.keymobile.indicators.service.hytobacco;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
......@@ -181,7 +177,6 @@ public class IndScorecardService {
DriveIndCalResultDef currentCompareObjResult = driveIndCalResultDefMapper
.findByIndIdAndDateAndCompareObjAndCompareCatalog(indId, date,
compareObj, code, compareCatalog,dateMark);
if(currentCompareObjResult!=null) {
String average = currentCompareObjResult.getAverage();
//如果实际平均值存在
......@@ -290,6 +285,13 @@ public class IndScorecardService {
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) {
......@@ -307,6 +309,8 @@ public class IndScorecardService {
}
//改善提升
if("1".equals(scoreCard.getIsIncluScore())) {//纳入单位得分计算
if(StringUtils.equals("0", scoreCard.getImproveScoreType())){
// 改善提升普通积分
//同期
//改用添加对标单元目录做为过滤条件
DriveIndCalResultDef sameCompareObjResult = driveIndCalResultDefMapper
......@@ -346,6 +350,47 @@ public class IndScorecardService {
//没有同期值
result.put("improveScore","No");//表示不纳入单位得分计算标识
}
}else if(StringUtils.equals("1", scoreCard.getImproveScoreType())){
// 改善提升公式积分
// 获取本组的同期考核指标结果
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()){
// 增幅计算类型 0:本期-同期 1:(本期-同期)/同期*100
String growCalType = driveIndDef.getGrowCalType();
// 获取改善提升积分
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");//表示不纳入单位得分计算标识
}
}
}else {
result.put("improveScore","No");//表示不纳入单位得分计算标识
}
......@@ -368,6 +413,176 @@ public class IndScorecardService {
return result;
}
/**
* 获取改善提升积分
* @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<>();
Map<String,String> rankMapTmp = new HashMap<>();
......
package com.keymobile.indicators.service.uploadfile;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSONObject;
import com.keymobile.indicators.service.SystemAuthService;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -27,6 +26,8 @@ public class UploadFileService {
@Autowired
private UploadFileMapper uploadFileMapper;
@Autowired
private SystemAuthService systemAuthService;
@Value("${uploadfile.path}")
private String uploadFilePath;
......@@ -34,6 +35,7 @@ public class UploadFileService {
//上传文件
public void uploadFile(InputStream in,String fileName,String fileType,
String user,String code) throws Exception{
fileName = this.filterFilename(fileName);
//先保存文件详情到数据库中
UploadFile uploadFile = new UploadFile();
if(StringUtils.isNotBlank(fileType)) {
......@@ -46,6 +48,12 @@ public class UploadFileService {
uploadFile.setUploadUser(user);
uploadFile.setUploadDate(DateUtils.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss"));
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);
//设置上传文件路径
......@@ -81,6 +89,9 @@ public class UploadFileService {
int page,int rows)throws Exception{
Map<String,Object> resultMap = new HashMap<>();
Map<String,Object> paramMap = new HashMap<>();
if(code.length()>2){
code = code.substring(0,code.length()-2);
}
paramMap.put("code", code+"%");
if(StringUtils.isBlank(keyword)) {
paramMap.put("keyword", null);
......@@ -105,4 +116,26 @@ public class UploadFileService {
public void deleteUploadFile(List<Integer> 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