Browse Source

公式计算暂存

dev_shibei_match
jianjun 5 years ago
parent
commit
7b5b0f737e
  1. 23
      epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/form/IndexCalculateForm.java
  2. 154
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/IndexCalculateController.java
  3. 1
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/IndexDictController.java
  4. 17
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/screen/IndexCalculateService.java
  5. 1
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/screen/ScreenCollService.java
  6. 14
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/screen/impl/IndexCalculateServiceImpl.java
  7. 17
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/Correlation.java
  8. 43
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/DoubleScoreCalculator.java
  9. 45
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/IntegerScoreCalculator.java
  10. 114
      epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/ScoreCalculator.java

23
epmet-module/data-statistical/data-statistical-client/src/main/java/com/epmet/dto/screen/form/IndexCalculateForm.java

@ -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;
}

154
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/IndexCalculateController.java

@ -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();
}*/
}

1
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/controller/IndexDictController.java

@ -70,6 +70,7 @@ public class IndexDictController {
} }
/** /**
* urlhttp://localhost:8108/data/stats/indexdict/initCustomerIndex
* desc 初始化客户的评价指标数据 * desc 初始化客户的评价指标数据
* @param formDTO customerId * @param formDTO customerId
* @return * @return

17
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/screen/IndexCalculateService.java

@ -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);
}

1
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/screen/ScreenCollService.java

@ -1,6 +1,5 @@
package com.epmet.service.screen; package com.epmet.service.screen;
import com.epmet.commons.tools.utils.Result;
import com.epmet.dto.screencoll.form.*; import com.epmet.dto.screencoll.form.*;
import java.util.List; import java.util.List;

14
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/service/screen/impl/IndexCalculateServiceImpl.java

@ -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) {
}
}

17
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/Correlation.java

@ -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;
}
}

43
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/DoubleScoreCalculator.java

@ -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);
}
}

45
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/IntegerScoreCalculator.java

@ -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);
}
}

114
epmet-module/data-statistical/data-statistical-server/src/main/java/com/epmet/support/normalizing/ScoreCalculator.java

@ -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…
Cancel
Save