10 changed files with 428 additions and 1 deletions
@ -0,0 +1,23 @@ |
|||
package com.epmet.dto.screen.form; |
|||
|
|||
import lombok.Data; |
|||
|
|||
import java.io.Serializable; |
|||
|
|||
/** |
|||
* desc:初始化客户指标权重参数实体类 |
|||
* @author liujianjun |
|||
*/ |
|||
@Data |
|||
public class IndexCalculateForm implements Serializable { |
|||
private static final long serialVersionUID = 3280392511156378209L; |
|||
/** |
|||
* desc:客户id |
|||
*/ |
|||
private String customerId; |
|||
|
|||
/** |
|||
* desc:月份id |
|||
*/ |
|||
private String monthId; |
|||
} |
@ -0,0 +1,154 @@ |
|||
package com.epmet.controller; |
|||
|
|||
import com.epmet.commons.extappauth.annotation.ExternalAppRequestAuth; |
|||
import com.epmet.commons.extappauth.bean.ExternalAppRequestParam; |
|||
import com.epmet.commons.tools.utils.Result; |
|||
import com.epmet.dto.screen.form.IndexCalculateForm; |
|||
import com.epmet.service.screen.IndexCalculateService; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.web.bind.annotation.PostMapping; |
|||
import org.springframework.web.bind.annotation.RequestBody; |
|||
import org.springframework.web.bind.annotation.RequestMapping; |
|||
import org.springframework.web.bind.annotation.RestController; |
|||
|
|||
/** |
|||
* 指标计算controller |
|||
* |
|||
* @author liujianjun@elink-cn.com |
|||
* @date 2020/8/24 14:38 |
|||
*/ |
|||
@RestController |
|||
@RequestMapping("indexcalculate") |
|||
public class IndexCalculateController { |
|||
|
|||
@Autowired |
|||
private IndexCalculateService indexCalculateService; |
|||
|
|||
/** |
|||
* 1、党建能力-党员相关指标计算(按照月份) |
|||
* |
|||
* @param externalAppRequestParam |
|||
* @param formDTO |
|||
* @return com.epmet.commons.tools.utils.Result |
|||
* @Author zhangyong |
|||
* @Date 10:52 2020-08-20 |
|||
**/ |
|||
@ExternalAppRequestAuth |
|||
@PostMapping("cpc") |
|||
public Result cpcIndexCalculate(ExternalAppRequestParam externalAppRequestParam, @RequestBody IndexCalculateForm formDTO) { |
|||
indexCalculateService.cpcIndexCalculate(formDTO); |
|||
return new Result(); |
|||
} |
|||
|
|||
/* *//** |
|||
* 2、党建能力-网格相关指标上报(按照月份) |
|||
* |
|||
* @param externalAppRequestParam |
|||
* @param formDTO |
|||
* @return com.epmet.commons.tools.utils.Result |
|||
* @Author zhangyong |
|||
* @Date 10:52 2020-08-20 |
|||
**//*
|
|||
@ExternalAppRequestAuth |
|||
@PostMapping("gridpartyability") |
|||
public Result gridPartyAbility(ExternalAppRequestParam externalAppRequestParam, @RequestBody List<GridPartyAbilityFormDTO> formDTO) { |
|||
factIndexCollectService.insertGridPartyAbility(formDTO, externalAppRequestParam.getCustomerId()); |
|||
return new Result(); |
|||
} |
|||
|
|||
*//**
|
|||
* 3、党建能力-街道及社区相关指标 |
|||
* |
|||
* @param externalAppRequestParam |
|||
* @param formDTO |
|||
* @return com.epmet.commons.tools.utils.Result |
|||
* @Author zhangyong |
|||
* @Date 10:52 2020-08-20 |
|||
**//*
|
|||
@ExternalAppRequestAuth |
|||
@PostMapping("orgpartyability") |
|||
public Result orgPartyAbility(ExternalAppRequestParam externalAppRequestParam, @RequestBody List<OrgPartyAbilityFormDTO> formDTO) { |
|||
factIndexCollectService.insertOrgPartyAbility(formDTO, externalAppRequestParam.getCustomerId()); |
|||
return new Result(); |
|||
} |
|||
|
|||
*//**
|
|||
* 4、服务能力-网格相关指标 |
|||
* |
|||
* @param externalAppRequestParam |
|||
* @param formDTO |
|||
* @return com.epmet.commons.tools.utils.Result |
|||
* @Author zhangyong |
|||
* @Date 10:52 2020-08-20 |
|||
**//*
|
|||
@ExternalAppRequestAuth |
|||
@PostMapping("gridserviceability") |
|||
public Result gridServiceAbility(ExternalAppRequestParam externalAppRequestParam, @RequestBody List<GridServiceAbilityFormDTO> formDTO) { |
|||
factIndexCollectService.insertGridServiceAbility(formDTO, externalAppRequestParam.getCustomerId()); |
|||
return new Result(); |
|||
} |
|||
|
|||
*//**
|
|||
* 5、服务能力-组织(街道|社区|全区)相关指标 |
|||
* |
|||
* @param externalAppRequestParam |
|||
* @param formDTO |
|||
* @return com.epmet.commons.tools.utils.Result |
|||
* @Author zhangyong |
|||
* @Date 10:52 2020-08-20 |
|||
**//*
|
|||
@ExternalAppRequestAuth |
|||
@PostMapping("orgserviceability") |
|||
public Result orgServiceAbility(ExternalAppRequestParam externalAppRequestParam, @RequestBody List<OrgServiceAbilityFormDTO> formDTO) { |
|||
factIndexCollectService.insertOrgServiceAbility(formDTO, externalAppRequestParam.getCustomerId()); |
|||
return new Result(); |
|||
} |
|||
|
|||
*//**
|
|||
* 6、治理能力-网格相关指标 |
|||
* |
|||
* @param externalAppRequestParam |
|||
* @param formDTO |
|||
* @return com.epmet.commons.tools.utils.Result |
|||
* @Author zhangyong |
|||
* @Date 10:52 2020-08-20 |
|||
**//*
|
|||
@ExternalAppRequestAuth |
|||
@PostMapping("gridgovrnability") |
|||
public Result gridGovrnAbility(ExternalAppRequestParam externalAppRequestParam, @RequestBody List<GridGovrnAbilityFormDTO> formDTO) { |
|||
factIndexCollectService.insertGridGovrnAbility(formDTO, externalAppRequestParam.getCustomerId()); |
|||
return new Result(); |
|||
} |
|||
|
|||
*//**
|
|||
* 7、治理能力-街道及社区相关指标 |
|||
* |
|||
* @param externalAppRequestParam |
|||
* @param formDTO |
|||
* @return com.epmet.commons.tools.utils.Result |
|||
* @Author zhangyong |
|||
* @Date 10:52 2020-08-20 |
|||
**//*
|
|||
@ExternalAppRequestAuth |
|||
@PostMapping("orggovrnability") |
|||
public Result orgGovrnAbility(ExternalAppRequestParam externalAppRequestParam, @RequestBody List<OrgGovrnAbilityFormDTO> formDTO) { |
|||
factIndexCollectService.insertOrgGovrnAbility(formDTO, externalAppRequestParam.getCustomerId()); |
|||
return new Result(); |
|||
} |
|||
|
|||
*//**
|
|||
* 8、治理能力-部门相关指标 |
|||
* |
|||
* @param externalAppRequestParam |
|||
* @param formDTO |
|||
* @return com.epmet.commons.tools.utils.Result |
|||
* @Author zhangyong |
|||
* @Date 10:52 2020-08-20 |
|||
**//*
|
|||
@ExternalAppRequestAuth |
|||
@PostMapping("deptgovrnability") |
|||
public Result deptGovrnAbility(ExternalAppRequestParam externalAppRequestParam, @RequestBody List<DeptGovrnAbilityFormDTO> formDTO) { |
|||
factIndexCollectService.insertDeptGovrnAbility(formDTO, externalAppRequestParam.getCustomerId()); |
|||
return new Result(); |
|||
}*/ |
|||
} |
@ -0,0 +1,17 @@ |
|||
package com.epmet.service.screen; |
|||
|
|||
import com.epmet.dto.screen.form.IndexCalculateForm; |
|||
|
|||
/** |
|||
* 指标计算service |
|||
* |
|||
* @author liujianjun@elink-cn.com |
|||
* @date 2020/8/18 10:25 |
|||
*/ |
|||
public interface IndexCalculateService { |
|||
/** |
|||
* desc:计算党员相关指标 |
|||
* @param formDTO |
|||
*/ |
|||
void cpcIndexCalculate(IndexCalculateForm formDTO); |
|||
} |
@ -0,0 +1,14 @@ |
|||
package com.epmet.service.screen.impl; |
|||
|
|||
import com.epmet.dto.screen.form.IndexCalculateForm; |
|||
import com.epmet.service.screen.IndexCalculateService; |
|||
|
|||
/** |
|||
* @author liujianjun |
|||
*/ |
|||
public class IndexCalculateServiceImpl implements IndexCalculateService { |
|||
@Override |
|||
public void cpcIndexCalculate(IndexCalculateForm formDTO) { |
|||
|
|||
} |
|||
} |
@ -0,0 +1,17 @@ |
|||
package com.epmet.support.normalizing; |
|||
|
|||
/** |
|||
* 指标正负相关枚举 |
|||
*/ |
|||
public enum Correlation { |
|||
POSITIVE("positive","正相关"), |
|||
NEGATIVE("negative","负相关"), |
|||
; |
|||
|
|||
private String code; |
|||
private String desc; |
|||
Correlation(String code,String desc){ |
|||
this.code = code; |
|||
this.desc = desc; |
|||
} |
|||
} |
@ -0,0 +1,43 @@ |
|||
package com.epmet.support.normalizing; |
|||
|
|||
import java.math.BigDecimal; |
|||
|
|||
/** |
|||
* Double的分值计算 |
|||
* 每一种数据类型的计算都要继承ScoreCalculator并且实现其抽象方法,实现数据类型的转换 |
|||
*/ |
|||
public class DoubleScoreCalculator extends ScoreCalculator { |
|||
|
|||
/** |
|||
* 初始化double类型分值计算 |
|||
* ☆☆☆ 务必在该构造方法最后调用父类的prepare()方法 ☆☆☆ |
|||
* @param sourceArray 数据所在的数组 |
|||
* @param minScore 分值区间的左边界 |
|||
* @param maxScore 分值区间的右边界 |
|||
* @param correlation 相关性 |
|||
*/ |
|||
public DoubleScoreCalculator(Double[] sourceArray, BigDecimal minScore, BigDecimal maxScore, Correlation correlation) { |
|||
this.sourceArrary = sourceArray; |
|||
this.minScore = minScore; |
|||
this.maxScore = maxScore; |
|||
this.correlation = correlation; |
|||
this.prepare(); |
|||
} |
|||
|
|||
@Override |
|||
public BigDecimal getMaxFromSourceArray() { |
|||
Double[] doubleSourceArrary = (Double[]) this.sourceArrary; |
|||
return new BigDecimal(doubleSourceArrary[doubleSourceArrary.length - 1]); |
|||
} |
|||
|
|||
@Override |
|||
public BigDecimal getMinFromSourceArray() { |
|||
Double[] intSourceArrary = (Double[]) this.sourceArrary; |
|||
return new BigDecimal(intSourceArrary[0]); |
|||
} |
|||
|
|||
@Override |
|||
public BigDecimal convertValue2BigDecimal(Object sourceValue) { |
|||
return new BigDecimal((Double) sourceValue); |
|||
} |
|||
} |
@ -0,0 +1,45 @@ |
|||
package com.epmet.support.normalizing; |
|||
|
|||
import java.math.BigDecimal; |
|||
|
|||
/** |
|||
* Integer的分值计算 |
|||
* 每一种数据类型的计算都要继承ScoreCalculator并且实现其抽象方法,实现数据类型的转换 |
|||
*/ |
|||
public class IntegerScoreCalculator extends ScoreCalculator { |
|||
|
|||
/** |
|||
* 初始化整数分值计算 |
|||
* ☆☆☆ 务必在该构造方法最后调用父类的prepare()方法 ☆☆☆ |
|||
* @param sourceArray 数据所在的数组 |
|||
* @param minScore 分值区间的左边界 |
|||
* @param maxScore 分值区间的右边界 |
|||
* @param correlation 相关性 |
|||
*/ |
|||
public IntegerScoreCalculator(Integer[] sourceArray, BigDecimal minScore, BigDecimal maxScore, Correlation correlation) { |
|||
this.sourceArrary = sourceArray; |
|||
this.minScore = minScore; |
|||
this.maxScore = maxScore; |
|||
this.correlation = correlation; |
|||
this.prepare(); |
|||
System.out.println("最小值:"+minScore+";最大值:"+maxScore); |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public BigDecimal getMaxFromSourceArray() { |
|||
Integer[] intSourceArrary = (Integer[]) this.sourceArrary; |
|||
return new BigDecimal(intSourceArrary[intSourceArrary.length - 1]); |
|||
} |
|||
|
|||
@Override |
|||
public BigDecimal getMinFromSourceArray() { |
|||
Integer[] intSourceArrary = (Integer[]) this.sourceArrary; |
|||
return new BigDecimal(intSourceArrary[0]); |
|||
} |
|||
|
|||
@Override |
|||
public BigDecimal convertValue2BigDecimal(Object sourceValue) { |
|||
return new BigDecimal((Integer) sourceValue); |
|||
} |
|||
} |
@ -0,0 +1,114 @@ |
|||
package com.epmet.support.normalizing; |
|||
|
|||
import java.math.BigDecimal; |
|||
import java.math.MathContext; |
|||
import java.util.Arrays; |
|||
|
|||
/** |
|||
* 所有数据类型计算器的父类,实现算法骨架,数据类型转换方法则由子类实现 |
|||
* @param <T> 数据类型泛型 |
|||
*/ |
|||
public abstract class ScoreCalculator<T> { |
|||
|
|||
protected T[] sourceArrary; |
|||
|
|||
protected BigDecimal minScore; |
|||
protected BigDecimal maxScore; |
|||
|
|||
protected Correlation correlation; |
|||
|
|||
private BigDecimal maxValue; |
|||
private BigDecimal minValue; |
|||
private BigDecimal coefficient; |
|||
|
|||
/** |
|||
* 计算准备 |
|||
*/ |
|||
protected void prepare() { |
|||
// 校验数组
|
|||
if (!validSourceArray(sourceArrary)) { |
|||
throw new RuntimeException("入参数组错误:请设置非空数组"); |
|||
} |
|||
Arrays.sort(sourceArrary); |
|||
maxValue = getMaxFromSourceArray(); |
|||
minValue = getMinFromSourceArray(); |
|||
//计算系数
|
|||
System.out.println("最小值:"+minScore+";最大值:"+maxScore); |
|||
coefficient = getCoefficient(minValue, maxValue); |
|||
} |
|||
|
|||
/** |
|||
* 归一算法 |
|||
* @return |
|||
*/ |
|||
public BigDecimal normalize(T sourceValue) { |
|||
|
|||
if (sourceValue == null) { |
|||
throw new RuntimeException("入参数组错误:请设置sourceValue"); |
|||
} |
|||
|
|||
if (!Arrays.asList(sourceArrary).contains(sourceValue)) { |
|||
throw new RuntimeException("请确认要计算的数组在数组中存在"); |
|||
} |
|||
|
|||
if (correlation == Correlation.POSITIVE) { |
|||
// 正相关
|
|||
BigDecimal x = coefficient.multiply(convertValue2BigDecimal(sourceValue).subtract(minValue)); |
|||
BigDecimal score = minScore.add(x, MathContext.DECIMAL32); |
|||
return score; |
|||
} else if (correlation == Correlation.NEGATIVE) { |
|||
// 负相关
|
|||
BigDecimal x = coefficient.multiply(convertValue2BigDecimal(sourceValue).subtract(minValue)); |
|||
BigDecimal score = minScore.add(x); |
|||
return maxScore.subtract(score, MathContext.DECIMAL32); |
|||
} else { |
|||
throw new RuntimeException("错误的相关性"); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 校验数组 |
|||
* @param sourceArray |
|||
* @param <T> |
|||
* @return |
|||
*/ |
|||
protected <T> boolean validSourceArray(T[] sourceArray) { |
|||
if (sourceArray == null || sourceArray.length == 0) { |
|||
return false; |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
/** |
|||
* 计算系数 |
|||
* @return |
|||
*/ |
|||
protected BigDecimal getCoefficient(BigDecimal min, BigDecimal max) { |
|||
BigDecimal fenmu = max.subtract(min); |
|||
if (fenmu.toString().equals("0"))return new BigDecimal(0); |
|||
BigDecimal fenzi = maxScore.subtract(minScore); |
|||
BigDecimal divide = fenzi.divide(fenmu, MathContext.DECIMAL32); |
|||
System.out.println("分子:"+fenzi+"分母:"+fenmu+"系数:"+divide.toString()); |
|||
return divide; |
|||
} |
|||
|
|||
/** |
|||
* 从源数组中获取最大值 |
|||
* @return |
|||
*/ |
|||
protected abstract BigDecimal getMaxFromSourceArray(); |
|||
|
|||
/** |
|||
* 从源数组中获取最小值 |
|||
* @return |
|||
*/ |
|||
protected abstract BigDecimal getMinFromSourceArray(); |
|||
|
|||
/** |
|||
* 将值转化为BigDecimal |
|||
* @param sourceValue |
|||
* @return |
|||
*/ |
|||
protected abstract BigDecimal convertValue2BigDecimal(T sourceValue); |
|||
|
|||
} |
Loading…
Reference in new issue