Browse Source

update

main
wangshaoping 1 year ago
parent
commit
145794467b
  1. 5
      io.sc.engine.mv.sample/src/main/java/io/sc/engine/mv/sample/service/DaiKuanImporterService.java
  2. 5
      io.sc.engine.mv.sample/src/main/java/io/sc/engine/mv/sample/service/TestCaseImporterService.java
  3. 189
      io.sc.engine.mv.sample/src/main/java/io/sc/engine/mv/sample/service/impl/DaiKuanImporterServiceImpl.java
  4. 162
      io.sc.engine.mv.sample/src/main/java/io/sc/engine/mv/sample/service/impl/TestCaseImporterServiceImpl.java
  5. 10001
      io.sc.engine.mv.sample/src/main/resources/io/sc/engine/mv/sample/信用卡_工薪模型.csv
  6. 10001
      io.sc.engine.mv.sample/src/main/resources/io/sc/engine/mv/sample/信用卡_经营模型.csv
  7. 10001
      io.sc.engine.mv.sample/src/main/resources/io/sc/engine/mv/sample/贷款模型.csv
  8. 11
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/CoeResult.java
  9. 14
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/DataExtractor.java
  10. 106
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/DataExtractorManager.java
  11. 8
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/DataExtractorType.java
  12. 62
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/Validator.java
  13. 47
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/controller/ShowResultWebController.java
  14. 44
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/controller/ShowSampleWebController.java
  15. 35
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/controller/configuration/DataExtractorWebController.java
  16. 38
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/controller/core/ChiSquareWebController.java
  17. 15
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/controller/st/SvdWebController.java
  18. 68
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/controller/st/support/Threshold2SmartClientJavascript.java
  19. 204
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/executor/CoeBinomialExecutor.java
  20. 253
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/executor/CoeChiSquareExecutor.java
  21. 57
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/executor/DatabaseInitExecutor.java
  22. 285
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/executor/StPsiExecutor.java
  23. 33
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/executor/support/CutOffPointFinder.java
  24. 29
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/extractor/DefaultRecordDataExtractor.java
  25. 81
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/initializer/ConfigurationInitializer.java
  26. 243
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/CoeBinomialHistory.java
  27. 125
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/CoeChiSquareHistory.java
  28. 294
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/GeneralResultHistory.java
  29. 222
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/GeneralSampleHistory.java
  30. 223
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/StPsiHistory.java
  31. 66
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/id/CoeBinomialHistoryId.java
  32. 65
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/id/CoeChiSquareHistoryId.java
  33. 53
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/id/GeneralResultHistoryId.java
  34. 93
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/id/GeneralSampleHistoryId.java
  35. 79
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/id/StPsiHistoryId.java
  36. 10
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/repository/CoeBinomialHistoryRepository.java
  37. 10
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/repository/CoeChiSquareHistoryRepository.java
  38. 40
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/repository/GeneralResultHistoryRepository.java
  39. 20
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/repository/StPsiHistoryRepository.java
  40. 89
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/sc/echarts/Coordinates.java
  41. 40
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/sc/echarts/XyCoordinates.java
  42. 11
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/service/result/GeneralResultHistoryService.java
  43. 13
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/service/result/impl/GeneralResultHistoryServiceImpl.java
  44. 11
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/service/st/StPsiHistoryService.java
  45. 5
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/service/st/StSvdService.java
  46. 13
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/service/st/impl/StPsiHistoryServiceImpl.java
  47. 8
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/service/st/impl/StSvdServiceImpl.java
  48. 159
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/vo/CoeBinomialHistoryVo.java
  49. 79
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/vo/CoeChiSquareHistoryVo.java
  50. 196
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/vo/GeneralResultHistoryVo.java
  51. 142
      io.sc.engine.mv/src/main/java/io/sc/engine/mv/vo/StPsiHistoryVo.java
  52. 35
      io.sc.platform.core/src/main/java/io/sc/platform/core/util/StringUtil.java
  53. 13
      io.sc.platform.data/src/main/java/io/sc/platform/data/csv/CsvItemProcessor.java
  54. 99
      io.sc.platform.data/src/main/java/io/sc/platform/data/csv/CsvItemReader.java
  55. 23
      io.sc.platform.data/src/main/java/io/sc/platform/data/csv/CsvItemWriter.java
  56. 8
      io.sc.platform.data/src/main/java/io/sc/platform/data/db/DbItemProcessor.java
  57. 99
      io.sc.platform.data/src/main/java/io/sc/platform/data/db/DbItemReader.java
  58. 43
      io.sc.platform.data/src/main/java/io/sc/platform/data/db/DbItemWriter.java
  59. 90
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/springboot/SpringbootAutoConfigurationWebController.java
  60. 57
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/springboot/SpringbootEnvironmentWebController.java
  61. 110
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/springboot/SpringbootRequestMappingWebController.java
  62. 44
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/wrapper/springboot/DespatcherServletWrapper.java
  63. 41
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/wrapper/springboot/ServletWrapper.java
  64. 77
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/util/SqlTypeUtil.java
  65. 68
      io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/DefaultQueryResultSorter.java

5
io.sc.engine.mv.sample/src/main/java/io/sc/engine/mv/sample/service/DaiKuanImporterService.java

@ -0,0 +1,5 @@
package io.sc.engine.mv.sample.service;
public interface DaiKuanImporterService {
public void load() throws Exception;
}

5
io.sc.engine.mv.sample/src/main/java/io/sc/engine/mv/sample/service/TestCaseImporterService.java

@ -0,0 +1,5 @@
package io.sc.engine.mv.sample.service;
public interface TestCaseImporterService {
public void load() throws Exception;
}

189
io.sc.engine.mv.sample/src/main/java/io/sc/engine/mv/sample/service/impl/DaiKuanImporterServiceImpl.java

@ -0,0 +1,189 @@
package io.sc.engine.mv.sample.service.impl;
import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
import io.sc.engine.mv.sample.service.CardGongXinImporterService;
import io.sc.engine.mv.sample.service.DaiKuanImporterService;
import io.sc.platform.core.util.DateUtil;
import io.sc.platform.jdbc.sql.builder.InsertIntoSqlBuilder;
import io.sc.platform.jdbc.util.SqlBatcher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Iterator;
import java.util.UUID;
@Service
public class DaiKuanImporterServiceImpl implements DaiKuanImporterService {
private static final String URL ="classpath:/io/sc/engine/mv/sample/贷款模型.csv";
private static final String MODEL_ID ="DAIKUAN";
private static final String MODEL_NAME ="贷款";
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public void load() throws Exception {
//删除违约记录表的数据
deleteDefaultRecord();
//删除评分记录表的数据
deleteScoreRecord();
//更新模型配置表的数据
updateModelConfigure();
//更新咨询建模时的客户分布配置表的数据
updateDistributionConfigure();
//更新标尺表的数据
updateScaleConfigure();
//导入测试用例评分记录和违约记录
importData();
}
private void deleteDefaultRecord(){
jdbcTemplate.update("delete from MV_DEFAULT_RECORD where FD_CUSTOM_ID in (select distinct FD_CUSTOM_ID from MV_SCORE_RECORD where FD_MODEL_ID=?)",MODEL_ID);
}
private void deleteScoreRecord(){
jdbcTemplate.update("delete from MV_SCORE_RECORD where FD_MODEL_ID=?",MODEL_ID);
}
private void updateModelConfigure(){
jdbcTemplate.update("delete from MV_CFG_MODEL where FD_MODEL_ID=?",MODEL_ID);
InsertIntoSqlBuilder builder =new InsertIntoSqlBuilder();
builder.table("MV_CFG_MODEL")
.field("FD_ID",MODEL_ID)
.field("FD_MODEL_ID",MODEL_ID)
.field("FD_MODEL_NAME",MODEL_NAME)
.field("FD_TYPE","IMPORT_FROM_SCORE_RECORD")
.field("DATA_COME_FROM_","IMPORT")
.field("CREATOR_","system")
.field("CREATE_DATE_",new Date())
.field("LAST_MODIFIER_","system")
.field("LAST_MODIFYDATE_",new Date())
.insert(jdbcTemplate);
}
private void updateDistributionConfigure(){
jdbcTemplate.update("delete from MV_CFG_DISTRIBUTION where FD_MODEL_ID=?",MODEL_ID);
insertDistributionConfigure( 1,10,0);
insertDistributionConfigure(11,20,0);
insertDistributionConfigure(21,30,0);
insertDistributionConfigure(31,40,30);
insertDistributionConfigure(41,50,30);
insertDistributionConfigure(51,60,2000);
insertDistributionConfigure(61,70,1000);
insertDistributionConfigure(71,80,600);
insertDistributionConfigure(81,90,600);
insertDistributionConfigure(91,100,1500);
}
private void insertDistributionConfigure(int start,int end,int count){
new InsertIntoSqlBuilder().table("MV_CFG_DISTRIBUTION")
.field("FD_ID",UUID.randomUUID().toString())
.field("FD_MODEL_ID",MODEL_ID)
.field("FD_MODEL_NAME",MODEL_NAME)
.field("FD_SCORE_SEG_START",start)
.field("FD_SCORE_SEG_END",end)
.field("FD_COUNT",count)
.field("CREATOR_","system")
.field("CREATE_DATE_",new Date())
.field("LAST_MODIFIER_","system")
.field("LAST_MODIFYDATE_",new Date())
.insert(jdbcTemplate);
}
private void updateScaleConfigure(){
jdbcTemplate.update("delete from MV_CFG_SCALE where FD_MODEL_ID is null");
insertScaleConfigure( 1,0.0);
insertScaleConfigure(2,0.0015);
insertScaleConfigure(3,0.0033);
insertScaleConfigure(4,0.0060);
insertScaleConfigure(5,0.0088);
insertScaleConfigure(6,0.0189);
insertScaleConfigure(7,0.03);
insertScaleConfigure(8,0.0486);
insertScaleConfigure(9,0.0685);
insertScaleConfigure(10,0.1054);
insertScaleConfigure(11,0.2869);
insertScaleConfigure(12,0.5128);
}
private void insertScaleConfigure(int order,double pd){
new InsertIntoSqlBuilder().table("MV_CFG_SCALE")
.field("FD_ID", UUID.randomUUID().toString())
.field("FD_LEVEL",order)
.field("FD_PD",pd)
.field("FD_ORDER",order)
.field("CREATOR_","system")
.field("CREATE_DATE_",new Date())
.field("LAST_MODIFIER_","system")
.field("LAST_MODIFYDATE_",new Date())
.insert(jdbcTemplate);
}
private void importData() throws Exception {
Date scroeBeginDate =DateUtil.parseDate("2014-05-01", DateUtil.yyyy_MM_dd);
Date scroeEndDate =DateUtil.parseDate("2015-05-01", DateUtil.yyyy_MM_dd);
Date defaultConfirmDate =DateUtil.parseDate("2015-01-01", DateUtil.yyyy_MM_dd);
Resource resource =new DefaultResourceLoader().getResource(URL);
if(resource==null|| !resource.exists()){
throw new IOException("resource '" + URL + "' is not exists");
}
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
CSVReader reader = new CSVReaderBuilder(bufferedReader).withSkipLines(1).build();
Iterator<String[]> iterator = reader.iterator();
SqlBatcher scoreRecordBatcher =new SqlBatcher(getScoreRecordInsertSql());
SqlBatcher defaultRecordBatcher =new SqlBatcher(getDefaultRecordInsertSql());
long index =1;
while(iterator.hasNext()) {
String[] values = iterator.next();
scoreRecordBatcher.addArg(
values[0], /* FD_CUSTOM_ID */
values[0], /* FD_CUSTOM_NAME */
MODEL_ID, /* FD_MODEL_ID */
MODEL_NAME, /* FD_MODEL_NAME */
Double.parseDouble(values[1]), /* FD_SCORE */
values[2], /* FD_LEVEL */
scroeBeginDate, /* FD_SCORE_BEGIN_DATE */
scroeEndDate /* FD_SCORE_END_DATE */
);
if("1".equalsIgnoreCase(values[3])){
defaultRecordBatcher.addArg(values[0],defaultConfirmDate);
}
if(index%500==0){
scoreRecordBatcher.execute(jdbcTemplate);
defaultRecordBatcher.execute(jdbcTemplate);
}
index++;
}
scoreRecordBatcher.execute(jdbcTemplate);
defaultRecordBatcher.execute(jdbcTemplate);
}
private String getScoreRecordInsertSql(){
return ""
+ "insert into MV_SCORE_RECORD("
+ " FD_CUSTOM_ID,"
+ " FD_CUSTOM_NAME,"
+ " FD_MODEL_ID,"
+ " FD_MODEL_NAME,"
+ " FD_SCORE,"
+ " FD_LEVEL,"
+ " FD_SCORE_BEGIN_DATE,"
+ " FD_SCORE_END_DATE"
+ ") values (?,?,?,?,?,?,?,?)";
}
private String getDefaultRecordInsertSql(){
return "insert into MV_DEFAULT_RECORD(FD_CUSTOM_ID,FD_DEFAULT_CONFIRM_DATE) values (?,?)";
}
}

162
io.sc.engine.mv.sample/src/main/java/io/sc/engine/mv/sample/service/impl/TestCaseImporterServiceImpl.java

@ -0,0 +1,162 @@
package io.sc.engine.mv.sample.service.impl;
import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
import io.sc.engine.mv.sample.service.TestCaseImporterService;
import io.sc.platform.core.util.DateUtil;
import io.sc.platform.core.util.StringUtil;
import io.sc.platform.jdbc.sql.builder.InsertIntoSqlBuilder;
import io.sc.platform.jdbc.util.SqlBatcher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Iterator;
import java.util.UUID;
@Service
public class TestCaseImporterServiceImpl implements TestCaseImporterService {
private static final String URL ="classpath:/io/sc/engine/mv/sample/TestCase.csv";
private static final String MODEL_ID ="M1";
private static final String MODEL_NAME ="测试用例模型";
@Autowired private JdbcTemplate jdbcTemplate;
@Override
public void load() throws Exception {
//删除违约记录表的数据
deleteDefaultRecord();
//删除评分记录表的数据
deleteScoreRecord();
//更新模型配置表的数据
updateModelConfigure();
//更新咨询建模时的客户分布配置表的数据
updateDistributionConfigure();
//导入测试用例评分记录和违约记录
importData();
}
private void deleteDefaultRecord(){
jdbcTemplate.update("delete from MV_DEFAULT_RECORD where FD_CUSTOM_ID in (select distinct FD_CUSTOM_ID from MV_SCORE_RECORD where FD_MODEL_ID=?)",MODEL_ID);
}
private void deleteScoreRecord(){
jdbcTemplate.update("delete from MV_SCORE_RECORD where FD_MODEL_ID=?",MODEL_ID);
}
private void updateModelConfigure(){
jdbcTemplate.update("delete from MV_CFG_MODEL where FD_MODEL_ID=?",MODEL_ID);
InsertIntoSqlBuilder builder =new InsertIntoSqlBuilder();
builder.table("MV_CFG_MODEL")
.field("FD_ID",UUID.randomUUID().toString())
.field("FD_MODEL_ID",MODEL_ID)
.field("FD_MODEL_NAME",MODEL_NAME)
.field("FD_TYPE","IMPORT_FROM_SCORE_RECORD")
.field("DATA_COME_FROM_","IMPORT")
.field("CREATOR_","system")
.field("CREATE_DATE_",new Date())
.field("LAST_MODIFIER_","system")
.field("LAST_MODIFYDATE_",new Date())
.insert(jdbcTemplate);
}
private void updateDistributionConfigure(){
jdbcTemplate.update("delete from MV_CFG_DISTRIBUTION where FD_MODEL_ID=?",MODEL_ID);
insertDistributionConfigure(1,20,0);
insertDistributionConfigure(21,40,20);
insertDistributionConfigure(41,60,50);
insertDistributionConfigure(61,80,60);
insertDistributionConfigure(81,100,30);
}
private void insertDistributionConfigure(int start,int end,int count){
new InsertIntoSqlBuilder().table("MV_CFG_DISTRIBUTION")
.field("FD_ID", UUID.randomUUID().toString())
.field("FD_MODEL_ID",MODEL_ID)
.field("FD_MODEL_NAME",MODEL_NAME)
.field("FD_SCORE_SEG_START",start)
.field("FD_SCORE_SEG_END",end)
.field("FD_COUNT",count)
.field("CREATOR_","system")
.field("CREATE_DATE_",new Date())
.field("LAST_MODIFIER_","system")
.field("LAST_MODIFYDATE_",new Date())
.insert(jdbcTemplate);
}
private void importData() throws Exception {
Resource resource =new DefaultResourceLoader().getResource(URL);
if(resource==null|| !resource.exists()){
throw new IOException("resource '" + URL + "' is not exists");
}
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
CSVReader reader = new CSVReaderBuilder(bufferedReader).withSkipLines(3).build();
Iterator<String[]> iterator = reader.iterator();
SqlBatcher scoreRecordBatcher =new SqlBatcher(getScoreRecordInsertSql());
SqlBatcher defaultRecordBatcher =new SqlBatcher(getDefaultRecordInsertSql());
long index =1;
while(iterator.hasNext()) {
String[] values = iterator.next();
if(values!=null && values.length>0){
for(int i=0;i<values.length;i++){
values[i] =values[i]==null?null:values[i].trim();
}
}
scoreRecordBatcher.addArg(
values[0], /* FD_CUSTOM_ID */
values[1], /* FD_CUSTOM_NAME */
values[2], /* FD_MODEL_ID */
values[3], /* FD_MODEL_NAME */
Double.parseDouble(values[4]), /* FD_PD */
Double.parseDouble(values[5]), /* FD_SCORE */
Double.parseDouble(values[6]), /* FD_SCORE_QUANTITATIVE */
Double.parseDouble(values[7]), /* FD_SCORE_QUALITATIVE */
values[8], /* FD_LEVEL */
DateUtil.parseDate(values[9], DateUtil.yyyy_MM_dd), /* FD_SCORE_BEGIN_DATE */
DateUtil.parseDate(values[10], DateUtil.yyyy_MM_dd) /* FD_SCORE_END_DATE */
);
if(StringUtils.hasText(values[11])){
defaultRecordBatcher.addArg(values[0],DateUtil.parseDate(values[11], DateUtil.yyyy_MM_dd));
}
if(index%500==0){
scoreRecordBatcher.execute(jdbcTemplate);
defaultRecordBatcher.execute(jdbcTemplate);
}
index++;
}
scoreRecordBatcher.execute(jdbcTemplate);
defaultRecordBatcher.execute(jdbcTemplate);
}
private String getScoreRecordInsertSql(){
return "insert into MV_SCORE_RECORD("
+ " FD_CUSTOM_ID,"
+ " FD_CUSTOM_NAME,"
+ " FD_MODEL_ID,"
+ " FD_MODEL_NAME,"
+ " FD_PD,"
+ " FD_SCORE,"
+ " FD_SCORE_QUANTITATIVE,"
+ " FD_SCORE_QUALITATIVE,"
+ " FD_LEVEL,"
+ " FD_SCORE_BEGIN_DATE,"
+ " FD_SCORE_END_DATE"
+ ") values (?,?,?,?,?,?,?,?,?,?,?)";
}
private String getDefaultRecordInsertSql(){
return "insert into MV_DEFAULT_RECORD(FD_CUSTOM_ID,FD_DEFAULT_CONFIRM_DATE) values (?,?)";
}
}

10001
io.sc.engine.mv.sample/src/main/resources/io/sc/engine/mv/sample/信用卡_工薪模型.csv

File diff suppressed because it is too large

10001
io.sc.engine.mv.sample/src/main/resources/io/sc/engine/mv/sample/信用卡_经营模型.csv

File diff suppressed because it is too large

10001
io.sc.engine.mv.sample/src/main/resources/io/sc/engine/mv/sample/贷款模型.csv

File diff suppressed because it is too large

11
io.sc.engine.mv/src/main/java/io/sc/engine/mv/CoeResult.java

@ -0,0 +1,11 @@
package io.sc.engine.mv;
/**
* 估值准确性检验结果枚举值
* @author wangshaoping
*
*/
public enum CoeResult {
PASS, //验证通过
NOT_PASS; //验证未通过
}

14
io.sc.engine.mv/src/main/java/io/sc/engine/mv/DataExtractor.java

@ -0,0 +1,14 @@
package io.sc.engine.mv;
/**
* 模型验证源数据抽取器
* @author wangshaoping
*
*/
public interface DataExtractor extends ProgressTracker{
/**
* 抽取源数据
* @param runtimeContext 模型验证执行上下文对象
*/
public void extract(RuntimeContext runtimeContext);
}

106
io.sc.engine.mv/src/main/java/io/sc/engine/mv/DataExtractorManager.java

@ -0,0 +1,106 @@
package io.sc.engine.mv;
import io.sc.engine.mv.jpa.entity.CfgDataExtractor;
import io.sc.engine.mv.jpa.repository.CfgDataExtractorRepository;
import io.sc.platform.core.support.ProgressInfo;
import io.sc.platform.groovy.GroovyScriptExecutor;
import io.sc.platform.jdbc.service.DatasourceService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 数据抽取器接口管理器
* @author wangshaoping
*
*/
@Component("mvDataExtractorManager")
public class DataExtractorManager {
private static final Logger log =LoggerFactory.getLogger(DataExtractorManager.class);
@Autowired private CfgDataExtractorRepository repository;
@Autowired private ApplicationContext applicationContext;
@Autowired private DatasourceService datasourceService;
/**
* 获取所有可用的数据抽取器的预计执行时间权重之和
* @param runtimeContext 执行上下文
* @return 所有可用的数据抽取器的预计执行时间权重之和
*/
public int getTotalWeight(RuntimeContext runtimeContext){
int totalWeight =0;
List<CfgDataExtractor> dataExtractors =repository.findByEnableOrderByOrder(true);
if(dataExtractors!=null && dataExtractors.size()>0){
for(CfgDataExtractor dataExtractor : dataExtractors){
totalWeight +=dataExtractor.getExecuteTimeWeight();
}
}
return totalWeight;
}
/**
* 执行所有可用的数据抽取器
* @param runtimeContext 执行上下文
* @param progressInfo 执行进度信息
* @throws Exception 违例
*/
public void execute(RuntimeContext runtimeContext, ProgressInfo progressInfo) throws Exception{
List<CfgDataExtractor> dataExtractors =repository.findByEnableOrderByOrder(true);
if(dataExtractors!=null && dataExtractors.size()>0){
for(CfgDataExtractor dataExtractor : dataExtractors){
execute(dataExtractor,runtimeContext,progressInfo);
}
}
}
/**
* 执行数据抽取器
* @param dataExtractor 数据抽取器
* @param runtimeContext 执行上下文
* @param progressInfo 执行进度信息
* @throws Exception 违例
*/
public void execute(CfgDataExtractor dataExtractor,RuntimeContext runtimeContext,ProgressInfo progressInfo) throws Exception{
String name =dataExtractor.getName();
String message ="开始执行数据抽取器[" + name + "]...";
log.info(message);
progressInfo.setMessageKey(message);
try {
executeGroovyScript(dataExtractor,runtimeContext);
} catch (Exception e) {
message ="执行数据抽取器[" + name + "]时,发生错误.";
progressInfo.setMessageKey(message);
throw new Exception(message,e);
}
message ="结束执行数据抽取器[" + name + "]";
log.info(message);
progressInfo.setMessageKey(message);
progressInfo.addWeight(dataExtractor.getExecuteTimeWeight());
}
/**
* 执行数据抽取器(Groovy 脚本)
* @param dataExtractor 数据抽取器
* @param runtimeContext 执行上下文
* @throws Exception 违例
*/
private void executeGroovyScript(CfgDataExtractor dataExtractor,RuntimeContext runtimeContext) throws Exception{
if(StringUtils.hasText(dataExtractor.getGroovyScript())){
Map<String,Object> context =new HashMap<String,Object>();
context.put("dataExtractor", dataExtractor);
context.put("runtimeContext", runtimeContext);
context.put("applicationContext", applicationContext);
context.put("defaultDataSource", datasourceService.getDefaultDatasource());
context.put("dataSource", datasourceService.getDatasource(dataExtractor.getDatasourceName()));
GroovyScriptExecutor.getInstance().eval(dataExtractor.getGroovyScript(), context);
}
}
}

8
io.sc.engine.mv/src/main/java/io/sc/engine/mv/DataExtractorType.java

@ -0,0 +1,8 @@
package io.sc.engine.mv;
public enum DataExtractorType {
SQL, //SQL 语句
JAVA_CLASS, //Java 类
GROOVY_SCRIPT, //groovy 脚本
SPRING_BEAN_NAME; //spring bean 名称
}

62
io.sc.engine.mv/src/main/java/io/sc/engine/mv/Validator.java

@ -0,0 +1,62 @@
package io.sc.engine.mv;
import java.util.Date;
import java.util.Locale;
import io.sc.platform.core.support.ProgressInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 模型验证器作为模型验证的执行入口
* @author wangshaoping
*
*/
@Component("mvValidator")
public class Validator {
//数据抽取器接口管理器
@Autowired private DataExtractorManager dataExtractorManager;
//模型验证执行器管理器
@Autowired private ExecutorManager executorManager;
/**
* 执行模型验证
* @param runtimeContext 模型验证运行时上下文对象
* @throws Exception 违例
*/
public void validate(RuntimeContext runtimeContext) throws Exception{
validate(runtimeContext,new ProgressInfo(),Locale.getDefault());
}
/**
* 执行模型验证
* @param runtimeContext 模型验证运行时上下文对象
* @param progressInfo 执行进度跟踪器对象
* @throws Exception 违例
*/
public void validate(RuntimeContext runtimeContext,ProgressInfo progressInfo) throws Exception{
validate(runtimeContext,progressInfo,Locale.getDefault());
}
/**
* 执行模型验证
* @param runtimeContext 模型验证运行时上下文对象
* @param progressInfo 执行进度跟踪器对象
* @param locale 区域对象
* @throws Exception 违例
*/
public void validate(RuntimeContext runtimeContext,ProgressInfo progressInfo,Locale locale) throws Exception{
progressInfo.setStartDatetime(new Date());
progressInfo.setTotalWeight(dataExtractorManager.getTotalWeight(runtimeContext) + executorManager.getTotalWeight());
//执行源数据抽取
dataExtractorManager.execute(runtimeContext,progressInfo);
//执行模型验证计算
executorManager.execute(runtimeContext, progressInfo,locale);
//执行完毕
progressInfo.setCompletedDatetime(new Date());
progressInfo.setCurrentWeight(progressInfo.getTotalWeight());
}
}

47
io.sc.engine.mv/src/main/java/io/sc/engine/mv/controller/ShowResultWebController.java

@ -0,0 +1,47 @@
package io.sc.engine.mv.controller;
import io.sc.engine.mv.jpa.entity.GeneralResultHistory;
import io.sc.engine.mv.jpa.entity.id.GeneralResultHistoryId;
import io.sc.engine.mv.jpa.repository.GeneralResultHistoryRepository;
import io.sc.engine.mv.jpa.repository.RuntimeParameterRepository;
import io.sc.engine.mv.service.result.GeneralResultHistoryService;
import io.sc.engine.mv.vo.GeneralResultHistoryVo;
import io.sc.platform.core.util.CollectionUtil;
import io.sc.platform.mvc.controller.support.RestCrudController;
import io.sc.platform.orm.service.support.QueryParameter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* 查询模型验证结果控制器
* @author wangshaoping
*
*/
@RestController
@RequestMapping("/api/mv/result")
public class ShowResultWebController extends RestCrudController<GeneralResultHistoryVo,GeneralResultHistory, GeneralResultHistoryId, GeneralResultHistoryRepository, GeneralResultHistoryService> {
@Autowired private GeneralResultHistoryRepository generalResultHistoryRepository;
@Autowired private RuntimeParameterRepository runtimeParameterRepository;
@Override
protected Page<GeneralResultHistoryVo> query(HttpServletRequest request, HttpServletResponse response, QueryParameter queryParameter) throws Exception {
Page<GeneralResultHistoryVo> page =super.query(request, response, queryParameter);
if(page!=null && page.getContent()!=null && !page.getContent().isEmpty()){
List<GeneralResultHistoryVo> content =page.getContent();
if(content!=null && !content.isEmpty()) {
for (GeneralResultHistoryVo vo : content) {
vo.setRuntimeParameters(runtimeParameterRepository.findByValidateDateOrderBySno(vo.getValidateDate()));
}
}
}
return page;
}
}

44
io.sc.engine.mv/src/main/java/io/sc/engine/mv/controller/ShowSampleWebController.java

@ -0,0 +1,44 @@
package io.sc.engine.mv.controller;
import io.sc.engine.mv.jpa.entity.GeneralSampleHistory;
import io.sc.engine.mv.jpa.entity.id.GeneralSampleHistoryId;
import io.sc.engine.mv.jpa.repository.GeneralSampleHistoryRepository;
import io.sc.engine.mv.service.result.GeneralSampleHistoryService;
import io.sc.engine.mv.vo.GeneralSampleHistoryVo;
import io.sc.platform.core.util.CollectionUtil;
import io.sc.platform.mvc.controller.support.RestCrudController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
/**
* 查询模型验证样本数据控制器
* @author wangshaoping
*
*/
@Controller
@RequestMapping("/mv/sample")
public class ShowSampleWebController extends RestCrudController<GeneralSampleHistoryVo,GeneralSampleHistory, GeneralSampleHistoryId, GeneralSampleHistoryRepository, GeneralSampleHistoryService> {
@Autowired private GeneralSampleHistoryRepository generalSampleHistoryRepository;
/**
* 模型验证样本页面
* @param modelId 模型ID
* @param validateDate 验证日期
* @return 模型视图对象
*/
@RequestMapping("sampleDataView")
public ModelAndView sampleView(
@RequestParam(name="modelId",required=false) String modelId,
@RequestParam(name="validateDate",required=false) String validateDate
){
ModelAndView mv =new ModelAndView("org/wsp/model/validator/view/sampleDataView.html");
mv.addObject("removeNavbar", true);
mv.addObject("modelId", modelId);
mv.addObject("validateDate", validateDate);
mv.addObject("distinctModelIdAndNames", CollectionUtil.arrayList2Map(generalSampleHistoryRepository.findDistinctModelIdAndNames()));
return mv;
}
}

35
io.sc.engine.mv/src/main/java/io/sc/engine/mv/controller/configuration/DataExtractorWebController.java

@ -0,0 +1,35 @@
package io.sc.engine.mv.controller.configuration;
import io.sc.engine.mv.jpa.entity.CfgDataExtractor;
import io.sc.engine.mv.jpa.repository.CfgDataExtractorRepository;
import io.sc.engine.mv.service.configuration.CfgDataExtractorService;
import io.sc.engine.mv.vo.CfgDataExtractorVo;
import io.sc.platform.mvc.controller.support.RestCrudController;
import io.sc.platform.system.ds.jpa.repository.DsRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
/**
* 数据抽取器接口配置控制器
* @author wangshaoping
*
*/
@RestController
@RequestMapping("/api/mv/config/dataExtractor")
public class DataExtractorWebController extends RestCrudController<CfgDataExtractorVo, CfgDataExtractor, String, CfgDataExtractorRepository, CfgDataExtractorService> {
@Autowired private DsRepository dsRepository;
@RequestMapping(value="test",method=RequestMethod.POST)
@ResponseBody
public void test(@RequestBody CfgDataExtractor object) throws Exception{
service.test(object);
}
@RequestMapping(value="generateSample",method=RequestMethod.POST)
@ResponseBody
public void generateSample() throws Exception{
service.generateSample();
}
}

38
io.sc.engine.mv/src/main/java/io/sc/engine/mv/controller/core/ChiSquareWebController.java

@ -0,0 +1,38 @@
package io.sc.engine.mv.controller.core;
import io.sc.engine.mv.jpa.entity.CoeChiSquareHistory;
import io.sc.engine.mv.jpa.repository.CoeChiSquareHistoryRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.data.domain.ExampleMatcher.StringMatcher;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
@RequestMapping("/mv/coe/chiSquare")
public class ChiSquareWebController {
@Autowired private CoeChiSquareHistoryRepository coeChiSquareHistoryRepository;
@RequestMapping(value="isc/fetch",method=RequestMethod.GET)
@ResponseBody
public List<CoeChiSquareHistory> iscFetch(CoeChiSquareHistory psiHistory){
return fetch(psiHistory);
}
@RequestMapping(value="fetch",method=RequestMethod.GET)
@ResponseBody
public List<CoeChiSquareHistory> fetch(CoeChiSquareHistory history){
ExampleMatcher matcher = ExampleMatcher.matching()
.withIgnoreNullValues()
.withIgnoreCase()
.withStringMatcher(StringMatcher.CONTAINING);
Example<CoeChiSquareHistory> example = Example.of(history, matcher);
List<CoeChiSquareHistory> result =coeChiSquareHistoryRepository.findAll(example);
return result;
}
}

15
io.sc.engine.mv/src/main/java/io/sc/engine/mv/controller/st/SvdWebController.java

@ -0,0 +1,15 @@
package io.sc.engine.mv.controller.st;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/mv/st")
public class SvdWebController {
/*
@Autowired private GeneralResultHistoryRepository generalResultHistoryRepository;
@Autowired private StPsiHistoryRepository stPsiHistoryRepository;
@Autowired private JdbcTemplate jdbcTemplate;
*/
}

68
io.sc.engine.mv/src/main/java/io/sc/engine/mv/controller/st/support/Threshold2SmartClientJavascript.java

@ -0,0 +1,68 @@
package io.sc.engine.mv.controller.st.support;
import io.sc.engine.mv.jpa.entity.CfgThreshold;
import java.util.List;
public class Threshold2SmartClientJavascript {
public static String getScript(String var,List<CfgThreshold> thresholds){
return getScript("range",var,thresholds);
}
public static String getScript(String type,String var,List<CfgThreshold> thresholds){
StringBuilder sb =new StringBuilder();
for(int i=0;i<thresholds.size();i++){
if(i==0){
sb.append("if(");
}else{
sb.append("else if(");
}
if("range".equalsIgnoreCase(type)){
sb.append(parseRangeCondition(var,thresholds.get(i).getRange()));
}else if("quantitativeRange".equalsIgnoreCase(type)){
sb.append(parseRangeCondition(var,thresholds.get(i).getQuantitativeRange()));
}else if("qualitativeRange".equalsIgnoreCase(type)){
sb.append(parseRangeCondition(var,thresholds.get(i).getQualitativeRange()));
}
sb.append("){").append("\n");
sb.append("\treturn 'color:" + thresholds.get(i).getColor()).append(";';\n");
sb.append("}");
}
return sb.toString();
}
private static String parseRangeCondition(String var,String condition){
StringBuilder sb =new StringBuilder();
char left =condition.charAt(0);
char right =condition.charAt(condition.length()-1);
String mid =condition.substring(1,condition.length()-1);
String[] split =mid.split(",");
String leftValue =split[0];
String rightValue =split[1];
if("-".equals(leftValue)){
}else{
if('('==left){
sb.append(var + ">" + leftValue);
}else if('['==left){
sb.append(var + ">=" + leftValue);
}
}
if("-".equals(rightValue)){
}else{
if(!"-".equals(leftValue)){
sb.append(" && ");
}
if(')'==right){
sb.append(var + "<" + rightValue);
}else if(']'==right){
sb.append(var + "<=" + rightValue);
}
}
return sb.toString();
}
}

204
io.sc.engine.mv/src/main/java/io/sc/engine/mv/executor/CoeBinomialExecutor.java

@ -0,0 +1,204 @@
package io.sc.engine.mv.executor;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import io.sc.engine.mv.CoeResult;
import io.sc.engine.mv.RuntimeContext;
import io.sc.engine.mv.jpa.entity.CfgBinomial;
import io.sc.engine.mv.jpa.repository.CfgBinomialRepository;
import io.sc.platform.core.support.ProgressInfo;
import io.sc.platform.core.util.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.stereotype.Component;
@Component
public class CoeBinomialExecutor extends AbstractExecutor{
private static final int ORDER =3000;
@Autowired private CfgBinomialRepository cfgBinomialRepository;
@Override
public int getOrder() {
return ORDER;
}
@Override
public int getExecuteTimeWeight() {
return 10;
}
@Override
public void execute(RuntimeContext runtimeContext, ProgressInfo progressInfo) {
//初始化合格样本表及合格样本临时表
initKpi(runtimeContext,progressInfo);
//生成合格样本表
generateKpi(runtimeContext,progressInfo);
//将合格样本数据保存到历史表
saveToHistory(runtimeContext,progressInfo);
}
protected void initKpi(final RuntimeContext runtimeContext,ProgressInfo progressInfo){
log.info("开始执行初始化指标表...");
jdbcTemplate.execute("delete from MV_COE_BINOMIAL");
log.info("完成执行初始化指标表");
}
protected void generateKpi(final RuntimeContext runtimeContext,ProgressInfo progressInfo){
doGenerateKpi(runtimeContext,progressInfo);
}
private void doGenerateKpi(final RuntimeContext runtimeContext,ProgressInfo progressInfo){
CfgBinomial cfgBinomial =cfgBinomialRepository.findBySignificanceLevel(runtimeContext.getBinomialSignificanceLevel());
String sql =""
+ " insert into MV_COE_BINOMIAL("
+ " FD_MODEL_ID,"
+ " FD_MODEL_NAME,"
+ " FD_LEVEL,"
+ " FD_PD,"
+ " FD_COUNT,"
+ " FD_DEFAULT_COUNT,"
+ " FD_SL,"
+ " FD_CL,"
+ " FD_Z_UPPER,"
+ " FD_Z_LOWER"
+ " )"
+ " select "
+ " FD_MODEL_ID,"
+ " FD_MODEL_NAME,"
+ " FD_LEVEL,"
+ " FD_PD,"
+ " FD_COUNT,"
+ " FD_DEFAULT_COUNT,"
+ " " + cfgBinomial.getSignificanceLevel() + ","
+ " " + cfgBinomial.getConfidenceLevel() + ","
+ " " + cfgBinomial.getzUpper() + ","
+ " " + cfgBinomial.getzLower() + ""
+ " from MV_COE_CHI_SQUARE";
jdbcTemplate.execute(sql);
jdbcTemplate.execute("update MV_COE_BINOMIAL set FD_ND_AVG=FD_PD*FD_COUNT");
jdbcTemplate.execute("update MV_COE_BINOMIAL set FD_ND_SD=SQRT(FD_PD*FD_COUNT*(1-FD_PD))");
jdbcTemplate.execute("update MV_COE_BINOMIAL set FD_D_UPPER=FD_Z_UPPER*FD_ND_SD+FD_ND_AVG");
jdbcTemplate.execute("update MV_COE_BINOMIAL set FD_D_LOWER=FD_Z_LOWER*FD_ND_SD+FD_ND_AVG");
jdbcTemplate.execute("update MV_COE_BINOMIAL set FD_LE_UPPER=0");
jdbcTemplate.execute("update MV_COE_BINOMIAL set FD_LE_UPPER=1 where FD_DEFAULT_COUNT<=FD_D_UPPER");
jdbcTemplate.execute("update MV_COE_BINOMIAL set FD_GE_LOWER=0");
jdbcTemplate.execute("update MV_COE_BINOMIAL set FD_GE_LOWER=1 where FD_DEFAULT_COUNT>=FD_D_LOWER");
//更新模型验证结果表
sql ="select FD_MODEL_ID,max(FD_MODEL_NAME) FD_MODEL_NAME from MV_COE_BINOMIAL group by FD_MODEL_ID";
jdbcTemplate.query(sql, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
String modelId =rs.getString("FD_MODEL_ID");
String modelName =rs.getString("FD_MODEL_NAME");
CoeResult result =pass(modelId);
//更新模型验证结果表
int updated =jdbcTemplate.update("update MV_GENERAL_RESULT set FD_COE_BINOMIAL=? where FD_MODEL_ID=?", result.toString(),modelId);
if(updated==0){
jdbcTemplate.update("insert into MV_GENERAL_RESULT(FD_MODEL_ID,FD_MODEL_NAME,FD_COE_BINOMIAL) values(?,?,?)", modelId,modelName,result.toString());
}
}
});
}
private CoeResult pass(String modelId){
String sql ="select count(*) FD_COUNT,sum(FD_LE_UPPER) FD_SUM from MV_COE_BINOMIAL where FD_MODEL_ID='" + modelId + "'";
CoeResult result =jdbcTemplate.query(sql,new ResultSetExtractor<CoeResult>() {
@Override
public CoeResult extractData(ResultSet rs) throws SQLException, DataAccessException {
if(rs.next()){
long count =rs.getLong("FD_COUNT");
long sum =rs.getLong("FD_SUM");
if(count==sum){
return CoeResult.PASS;
}
}
return CoeResult.NOT_PASS;
}
});
if(CoeResult.NOT_PASS.equals(result)){
return result;
}else{
sql ="select count(*) FD_COUNT,sum(FD_GE_LOWER) FD_SUM from MV_COE_BINOMIAL where FD_MODEL_ID='" + modelId + "'";
result =jdbcTemplate.query(sql,new ResultSetExtractor<CoeResult>() {
@Override
public CoeResult extractData(ResultSet rs) throws SQLException, DataAccessException {
if(rs.next()){
long count =rs.getLong("FD_COUNT");
long sum =rs.getLong("FD_SUM");
if(count==sum){
return CoeResult.PASS;
}
}
return CoeResult.NOT_PASS;
}
});
}
return result;
}
protected void saveToHistory(final RuntimeContext runtimeContext,ProgressInfo progressInfo){
log.info("开始将计算并生成指标表数据保存到历史表中...");
final String runtimeDateString = DateUtil.formatDate(runtimeContext.getValidateDate(), DateUtil.yyyy_MM_dd_HH_mm_ss);
String sql ="delete from MV_COE_BINOMIAL_HIS where FD_VALIDATE_DATE=?";
jdbcTemplate.update(sql, new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement pstmt) throws SQLException {
pstmt.setObject(1, runtimeDateString);
}
});
sql = ""
+ " insert into MV_COE_BINOMIAL_HIS ("
+ " FD_VALIDATE_DATE,"
+ " FD_MODEL_ID,"
+ " FD_MODEL_NAME,"
+ " FD_LEVEL,"
+ " FD_PD,"
+ " FD_COUNT,"
+ " FD_DEFAULT_COUNT,"
+ " FD_ND_AVG,"
+ " FD_ND_SD,"
+ " FD_SL,"
+ " FD_CL,"
+ " FD_Z_UPPER,"
+ " FD_Z_LOWER,"
+ " FD_D_UPPER,"
+ " FD_D_LOWER,"
+ " FD_LE_UPPER,"
+ " FD_GE_LOWER"
+ " )"
+ " select "
+ " ?,"
+ " FD_MODEL_ID,"
+ " FD_MODEL_NAME,"
+ " FD_LEVEL,"
+ " FD_PD,"
+ " FD_COUNT,"
+ " FD_DEFAULT_COUNT,"
+ " FD_ND_AVG,"
+ " FD_ND_SD,"
+ " FD_SL,"
+ " FD_CL,"
+ " FD_Z_UPPER,"
+ " FD_Z_LOWER,"
+ " FD_D_UPPER,"
+ " FD_D_LOWER,"
+ " FD_LE_UPPER,"
+ " FD_GE_LOWER"
+ " from MV_COE_BINOMIAL";
jdbcTemplate.update(sql, new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement pstmt) throws SQLException {
pstmt.setObject(1, runtimeDateString);
}
});
log.info("完成将计算并生成指标表数据保存到历史表中");
}
}

253
io.sc.engine.mv/src/main/java/io/sc/engine/mv/executor/CoeChiSquareExecutor.java

@ -0,0 +1,253 @@
package io.sc.engine.mv.executor;
import io.sc.engine.mv.CoeResult;
import io.sc.engine.mv.RuntimeContext;
import io.sc.engine.mv.executor.support.ExecutorUtil;
import io.sc.engine.mv.jpa.entity.CfgChiSquare;
import io.sc.engine.mv.jpa.entity.CfgScale;
import io.sc.engine.mv.jpa.repository.CfgChiSquareRepository;
import io.sc.engine.mv.jpa.repository.CfgScaleRepository;
import io.sc.platform.core.support.ProgressInfo;
import io.sc.platform.core.util.DateUtil;
import io.sc.platform.jdbc.util.SqlBatcher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Component;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
@Component
public class CoeChiSquareExecutor extends AbstractExecutor{
private static final int ORDER =2000;
@Autowired private CfgScaleRepository scaleRepository;
@Autowired private CfgChiSquareRepository chiSquareRepository;
@Override
public int getOrder() {
return ORDER;
}
@Override
public int getExecuteTimeWeight() {
return 10;
}
@Override
public void execute(RuntimeContext runtimeContext, ProgressInfo progressInfo) {
//初始化合格样本表及合格样本临时表
initKpi(runtimeContext,progressInfo);
//生成合格样本表
generateKpi(runtimeContext,progressInfo);
//将合格样本数据保存到历史表
saveToHistory(runtimeContext,progressInfo);
}
protected void initKpi(final RuntimeContext runtimeContext,ProgressInfo progressInfo){
log.info("开始执行初始化指标表...");
jdbcTemplate.execute("delete from MV_COE_CHI_SQUARE");
log.info("完成执行初始化指标表");
}
protected void generateKpi(final RuntimeContext runtimeContext,ProgressInfo progressInfo){
initScale(runtimeContext,progressInfo);
doGenerateKpi(runtimeContext,progressInfo);
calChiSquare(runtimeContext,progressInfo);
}
private void initScale(final RuntimeContext runtimeContext,ProgressInfo progressInfo){
final SqlBatcher sqlBatcher =new SqlBatcher(""
+ " insert into MV_COE_CHI_SQUARE("
+ " FD_MODEL_ID,"
+ " FD_MODEL_NAME,"
+ " FD_LEVEL,"
+ " FD_PD"
+ " ) values (?,?,?,?)"
);
Map<String,String> models = ExecutorUtil.getAllModels(jdbcTemplate);
if(models!=null && models.size()>0){
for(String key : models.keySet()){
String modelId =key;
String modelName =models.get(key);
List<CfgScale> scales =getScaleConfiguration(modelId);
if(scales!=null && scales.size()>0){
for(CfgScale scale : scales){
sqlBatcher.addArg(new Object[]{
modelId,
modelName,
scale.getLevel(),
scale.getPd()
});
}
sqlBatcher.execute(jdbcTemplate);
}
}
}
}
private List<CfgScale> getScaleConfiguration(String modelId){
List<CfgScale> result =scaleRepository.findByModelIdOrderByOrder(modelId);
if(result==null || result.size()==0){
result =scaleRepository.findByNullModelIdOrderByOrder();
}
return result;
}
private void doGenerateKpi(final RuntimeContext runtimeContext,ProgressInfo progressInfo){
final SqlBatcher sqlBatcher =new SqlBatcher(""
+ " update MV_COE_CHI_SQUARE"
+ " set"
+ " FD_COUNT=?,"
+ " FD_DEFAULT_COUNT=?,"
+ " FD_CHI_SQUARE=?"
+ " where"
+ " FD_MODEL_ID=?"
+ " and FD_LEVEL=?"
);
List<CfgScale> scales =getAllScale();
if(scales!=null && scales.size()>0){
for(CfgScale scale : scales){
double e =scale.getPd(); //E
long f =getCount(scale); //F
long g =getDefaultCount(scale); //G
double chiSquare =0;
if(e!=0 && e!=1 && f!=0){
chiSquare =(f*e-g)*(f*e-g)/(f*e*(1-e));
}
sqlBatcher.addArg(new Object[]{getCount(scale),getDefaultCount(scale),chiSquare,scale.getModelId(),scale.getLevel()});
}
sqlBatcher.execute(jdbcTemplate);
}
}
private List<CfgScale> getAllScale(){
String sql ="select FD_MODEL_ID,FD_LEVEL,FD_PD from MV_COE_CHI_SQUARE order by FD_MODEL_ID,FD_LEVEL";
return jdbcTemplate.query(sql, new RowMapper<CfgScale>() {
@Override
public CfgScale mapRow(ResultSet rs, int rowNum) throws SQLException {
CfgScale scale =new CfgScale();
scale.setModelId(rs.getString("FD_MODEL_ID"));
scale.setLevel(rs.getString("FD_LEVEL"));
scale.setPd(rs.getDouble("FD_PD"));
return scale;
}
});
}
private Long getCount(final CfgScale scale){
String sql ="select count(*) from MV_GENERAL_SAMPLE where FD_MODEL_ID=? and FD_LEVEL=?";
return jdbcTemplate.query(sql,new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps) throws SQLException {
ps.setString(1, scale.getModelId());
ps.setString(2, scale.getLevel());
}
},new ResultSetExtractor<Long>() {
@Override
public Long extractData(ResultSet rs) throws SQLException, DataAccessException {
if(rs.next()){
return rs.getLong(1);
}
return 0L;
}
});
}
private Long getDefaultCount(final CfgScale scale){
String sql ="select count(*) from MV_GENERAL_SAMPLE where FD_MODEL_ID=? and FD_LEVEL=? and FD_DEFAULT_STATUS='D'";
return jdbcTemplate.query(sql,new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps) throws SQLException {
ps.setString(1, scale.getModelId());
ps.setString(2, scale.getLevel());
}
},new ResultSetExtractor<Long>() {
@Override
public Long extractData(ResultSet rs) throws SQLException, DataAccessException {
if(rs.next()){
return rs.getLong(1);
}
return 0L;
}
});
}
private void calChiSquare(final RuntimeContext runtimeContext,ProgressInfo progressInfo){
String sql ="select FD_MODEL_ID,max(FD_MODEL_NAME) FD_MODEL_NAME,sum(FD_CHI_SQUARE) FD_CHI_SQUARE from MV_COE_CHI_SQUARE group by FD_MODEL_ID";
jdbcTemplate.query(sql, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
String modelId =rs.getString("FD_MODEL_ID");
String modelName =rs.getString("FD_MODEL_NAME");
double chiSquare =rs.getDouble("FD_CHI_SQUARE");
double criticalValue =0;
List<CfgScale> scales =getScaleConfiguration(modelId);
if(scales!=null && scales.size()>0){
CfgChiSquare cfg =chiSquareRepository.findByDofAndSignificanceLevel(scales.size(),runtimeContext.getChiSquareSignificanceLevel());
if(cfg!=null){
criticalValue =cfg.getCriticalValue();
}
}
String chiSquareStr = CoeResult.PASS.toString();
if(chiSquare>criticalValue){
chiSquareStr =CoeResult.NOT_PASS.toString();
}
//更新模型验证结果表
int updated =jdbcTemplate.update("update MV_GENERAL_RESULT set FD_COE_CHI_SQUARE=? where FD_MODEL_ID=?", chiSquareStr,modelId);
if(updated==0){
jdbcTemplate.update("insert into MV_GENERAL_RESULT(FD_MODEL_ID,FD_MODEL_NAME,FD_COE_CHI_SQUARE) values(?,?,?)", modelId,modelName,chiSquareStr);
}
}
});
}
protected void saveToHistory(final RuntimeContext runtimeContext,ProgressInfo progressInfo){
log.info("开始将计算并生成指标表数据保存到历史表中...");
final String runtimeDateString = DateUtil.formatDate(runtimeContext.getValidateDate(), DateUtil.yyyy_MM_dd_HH_mm_ss);
String sql ="delete from MV_COE_CHI_SQUARE_HIS where FD_VALIDATE_DATE=?";
jdbcTemplate.update(sql, new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement pstmt) throws SQLException {
pstmt.setObject(1, runtimeDateString);
}
});
sql = ""
+ " insert into MV_COE_CHI_SQUARE_HIS ("
+ " FD_VALIDATE_DATE,"
+ " FD_MODEL_ID,"
+ " FD_MODEL_NAME,"
+ " FD_LEVEL,"
+ " FD_PD,"
+ " FD_COUNT,"
+ " FD_DEFAULT_COUNT,"
+ " FD_CHI_SQUARE"
+ " )"
+ " select "
+ " ?,"
+ " FD_MODEL_ID,"
+ " FD_MODEL_NAME,"
+ " FD_LEVEL,"
+ " FD_PD,"
+ " FD_COUNT,"
+ " FD_DEFAULT_COUNT,"
+ " FD_CHI_SQUARE"
+ " from MV_COE_CHI_SQUARE";
jdbcTemplate.update(sql, new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement pstmt) throws SQLException {
pstmt.setObject(1, runtimeDateString);
}
});
log.info("完成将计算并生成指标表数据保存到历史表中");
}
}

57
io.sc.engine.mv/src/main/java/io/sc/engine/mv/executor/DatabaseInitExecutor.java

@ -0,0 +1,57 @@
package io.sc.engine.mv.executor;
import java.sql.SQLException;
import javax.sql.DataSource;
import io.sc.engine.mv.RuntimeContext;
import io.sc.platform.core.support.ProgressInfo;
import io.sc.platform.jdbc.DatabaseType;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
/**
* 数据库初始化操作
* 通常用于优化数据的性能
* @author wangshaoping
*
*/
@Component
public class DatabaseInitExecutor extends AbstractExecutor{
private static final int ORDER =-1000;
@Override
public int getOrder() {
return ORDER;
}
@Override
public int getExecuteTimeWeight() {
return 10;
}
@Override
public void execute(RuntimeContext runtimeContext, ProgressInfo progressInfo) {
log.info("开始执行数据库初始化...");
//initDatabase();
log.info("完成执行数据库初始化");
}
protected void initDatabase(){
String databaseType = DatabaseType.getDatabaseType(jdbcTemplate.getDataSource());
if(databaseType!=null && databaseType.contains("derby")){
try {
DataSource ds =jdbcTemplate.getDataSource();
if(ds!=null) {
String schema =DataSourceUtils.getConnection(ds).getSchema();
if(StringUtils.hasText(schema)) {
jdbcTemplate.execute("call SYSCS_UTIL.SYSCS_UPDATE_STATISTICS('" + schema + "','',null)");
}
}
} catch (SQLException e) {
log.error("",e);
}
}
}
}

285
io.sc.engine.mv/src/main/java/io/sc/engine/mv/executor/StPsiExecutor.java

@ -0,0 +1,285 @@
package io.sc.engine.mv.executor;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import io.sc.engine.mv.RuntimeContext;
import io.sc.platform.core.support.ProgressInfo;
import io.sc.platform.core.util.DateUtil;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.stereotype.Component;
/**
* 模型稳定性 PSI 验证执行器
* @author wangshaoping
*
*/
@Component
public class StPsiExecutor extends AbstractExecutor{
protected static final int ORDER =1000;
@Override
public int getOrder() {
return ORDER;
}
@Override
public int getExecuteTimeWeight() {
return 10;
}
@Override
public void execute(RuntimeContext runtimeContext, ProgressInfo progressInfo) {
if(checkDistributionConfiguration()){
//初始化指标表
initKpi(runtimeContext);
//计算并生成指标表数据
generateKpi(runtimeContext);
//计算 PSI 值,并更新到模型验证结果表中
calPsi(runtimeContext);
//将计算并生成指标表数据保存到历史表中
saveToHistory(runtimeContext);
}
}
/**
* 删除指标表历史数据
* @param runtimeContext 执行上下文
*/
protected void initKpi(final RuntimeContext runtimeContext){
log.info("开始执行初始化指标表...");
jdbcTemplate.execute("delete from MV_ST_PSI");
log.info("完成执行初始化指标表");
}
/**
* 计算并生成指标表
* @param runtimeContext 执行上下文
*/
protected void generateKpi(final RuntimeContext runtimeContext){
log.info("开始执行计算并生成指标表数据...");
//根据咨询建模时分数段初始化指标表
String sql =""
+ " select "
+ " FD_MODEL_ID,"
+ " FD_MODEL_NAME,"
+ " FD_SCORE_SEG_START,"
+ " FD_SCORE_SEG_END,"
+ " FD_COUNT FD_COUNT_DEV"
+ " from MV_CFG_DISTRIBUTION";
jdbcTemplate.query(sql, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
String countAppSql =""
+ " select"
+ " count(*) FD_COUNT_APP"
+ " from MV_GENERAL_SAMPLE"
+ " where"
+ " FD_MODEL_ID='" + rs.getString("FD_MODEL_ID") + "'"
+ " and FD_SCORE>=" + rs.getDouble("FD_SCORE_SEG_START")
+ " and FD_SCORE<=" + rs.getDouble("FD_SCORE_SEG_END");
Long countApp =jdbcTemplate.query(countAppSql,new ResultSetExtractor<Long>(){
@Override
public Long extractData(ResultSet rs) throws SQLException, DataAccessException {
if(rs.next()){
return rs.getLong("FD_COUNT_APP");
}else{
return 0L;
}
}
});
String sqlInsert =""
+ " insert into MV_ST_PSI("
+ " FD_MODEL_ID,"
+ " FD_MODEL_NAME,"
+ " FD_SCORE_SEG_START,"
+ " FD_SCORE_SEG_END,"
+ " FD_COUNT_DEV,"
+ " FD_COUNT_APP"
+ " ) values ("
+ " '" + rs.getString("FD_MODEL_ID") + "',"
+ " '" + rs.getString("FD_MODEL_NAME") + "',"
+ " " + rs.getDouble("FD_SCORE_SEG_START") + ","
+ " " + rs.getDouble("FD_SCORE_SEG_END") + ","
+ " " + rs.getInt("FD_COUNT_DEV") + ","
+ " " + countApp
+ ")";
jdbcTemplate.update(sqlInsert);
}
});
sql ="select FD_MODEL_ID from MV_CFG_DISTRIBUTION group by FD_MODEL_ID";
jdbcTemplate.query(sql, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
String modelId =rs.getString("FD_MODEL_ID");
String totalCountDevSql ="select sum(FD_COUNT_DEV) FD_TOTAL_COUNT_DEV from MV_ST_PSI where FD_MODEL_ID='" + modelId + "'";
Long totalCountDev =jdbcTemplate.query(totalCountDevSql,new ResultSetExtractor<Long>(){
@Override
public Long extractData(ResultSet rs) throws SQLException, DataAccessException {
if(rs.next()){
return rs.getLong("FD_TOTAL_COUNT_DEV");
}else{
return 0L;
}
}
});
String totalCountAppSql ="select sum(FD_COUNT_APP) FD_TOTAL_COUNT_APP from MV_ST_PSI where FD_MODEL_ID='" + modelId + "'";
Long totalCountApp =jdbcTemplate.query(totalCountAppSql,new ResultSetExtractor<Long>(){
@Override
public Long extractData(ResultSet rs) throws SQLException, DataAccessException {
if(rs.next()){
return rs.getLong("FD_TOTAL_COUNT_APP");
}else{
return 0L;
}
}
});
String updateSql ="update MV_ST_PSI set FD_TOTAL_COUNT_DEV=" + totalCountDev + ",FD_TOTAL_COUNT_APP=" + totalCountApp + " where FD_MODEL_ID='" + modelId + "'";
jdbcTemplate.update(updateSql);
}
});
//计算分数段内申请人数占群体总人数百分比(咨询建模时)
jdbcTemplate.update("update MV_ST_PSI set FD_COUNT_DEV=0 where FD_COUNT_DEV is null");
jdbcTemplate.update("update MV_ST_PSI set FD_TOTAL_COUNT_DEV=0 where FD_TOTAL_COUNT_DEV is null");
jdbcTemplate.update("update MV_ST_PSI set FD_PERCENT_DEV=0 where FD_TOTAL_COUNT_DEV=0");
jdbcTemplate.update("update MV_ST_PSI set FD_PERCENT_DEV=(FD_COUNT_DEV*1.000000/FD_TOTAL_COUNT_DEV) where FD_TOTAL_COUNT_DEV<>0");
//计算分数段内申请人数占群体总人数百分比(模型应用时)
jdbcTemplate.update("update MV_ST_PSI set FD_COUNT_APP=0 where FD_COUNT_APP is null");
jdbcTemplate.update("update MV_ST_PSI set FD_TOTAL_COUNT_APP=0 where FD_TOTAL_COUNT_APP is null");
jdbcTemplate.update("update MV_ST_PSI set FD_PERCENT_APP=0 where FD_TOTAL_COUNT_APP=0");
jdbcTemplate.update("update MV_ST_PSI set FD_PERCENT_APP=(FD_COUNT_APP*1.000000/FD_TOTAL_COUNT_APP) where FD_TOTAL_COUNT_APP<>0");
//计算百分比变化
jdbcTemplate.update("update MV_ST_PSI set FD_PERCENT_DIFF=(FD_PERCENT_APP-FD_PERCENT_DEV)");
//计算百分比相对比例
jdbcTemplate.update("update MV_ST_PSI set FD_PERCENT_RATE=0 where FD_PERCENT_DEV=0");
jdbcTemplate.update("update MV_ST_PSI set FD_PERCENT_RATE=(FD_PERCENT_APP*1.000000/FD_PERCENT_DEV) where FD_PERCENT_DEV<>0");
//计算加权系数
jdbcTemplate.update("update MV_ST_PSI set FD_WEIGHT=0 where FD_PERCENT_RATE=0");
jdbcTemplate.update("update MV_ST_PSI set FD_WEIGHT=ln(FD_PERCENT_RATE) where FD_PERCENT_RATE>0");
//计算稳定性加权
jdbcTemplate.update("update MV_ST_PSI set FD_ST_WEIGHT=(FD_WEIGHT*FD_PERCENT_DIFF)");
log.info("完成执行计算并生成指标表数据...");
}
/**
* 计算 PSI 并更新到模型验证结果表中
* @param runtimeContext 执行上下文
*/
protected void calPsi(final RuntimeContext runtimeContext){
log.info("开始计算 PSI 值,并更新到模型验证结果表中...");
String sql =""
+ " select"
+ " FD_MODEL_ID"
+ " ,max(FD_MODEL_NAME) as FD_MODEL_NAME"
+ " ,sum(FD_ST_WEIGHT) as PSI"
+ " from MV_ST_PSI"
+ " group by FD_MODEL_ID";
jdbcTemplate.query(sql, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
final String modelId = rs.getString("FD_MODEL_ID");
final String modelName = rs.getString("FD_MODEL_NAME");
//更新模型验证结果表
//更新模型验证结果表
int updated =jdbcTemplate.update("update MV_GENERAL_RESULT set FD_ST_PSI=? where FD_MODEL_ID=?", rs.getDouble("PSI"),modelId);
if(updated==0){
jdbcTemplate.update("insert into MV_GENERAL_RESULT(FD_MODEL_ID,FD_MODEL_NAME,FD_ST_PSI) values(?,?,?)", modelId,modelName,rs.getDouble("PSI"));
}
}
});
log.info("完成计算 PSI 值,并更新到模型验证结果表中...");
}
/**
* 将计算并生成指标表数据保存到历史表中
* @param runtimeContext 执行上下文
*/
protected void saveToHistory(final RuntimeContext runtimeContext){
log.info("开始将计算并生成指标表数据保存到历史表中...");
final String runtimeDateString = DateUtil.formatDate(runtimeContext.getValidateDate(), DateUtil.yyyy_MM_dd_HH_mm_ss);
String sql ="delete from MV_ST_PSI_HIS where FD_VALIDATE_DATE=?";
jdbcTemplate.update(sql, new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement pstmt) throws SQLException {
pstmt.setObject(1, runtimeDateString);
}
});
sql = ""
+ " insert into MV_ST_PSI_HIS ("
+ " FD_VALIDATE_DATE,"
+ " FD_MODEL_ID,"
+ " FD_MODEL_NAME,"
+ " FD_SCORE_SEG_START,"
+ " FD_SCORE_SEG_END,"
+ " FD_COUNT_DEV,"
+ " FD_TOTAL_COUNT_DEV,"
+ " FD_PERCENT_DEV,"
+ " FD_COUNT_APP,"
+ " FD_TOTAL_COUNT_APP,"
+ " FD_PERCENT_APP,"
+ " FD_PERCENT_DIFF,"
+ " FD_PERCENT_RATE,"
+ " FD_WEIGHT,"
+ " FD_ST_WEIGHT"
+ " )"
+ " select "
+ " ?,"
+ " FD_MODEL_ID,"
+ " FD_MODEL_NAME,"
+ " FD_SCORE_SEG_START,"
+ " FD_SCORE_SEG_END,"
+ " FD_COUNT_DEV,"
+ " FD_TOTAL_COUNT_DEV,"
+ " FD_PERCENT_DEV,"
+ " FD_COUNT_APP,"
+ " FD_TOTAL_COUNT_APP,"
+ " FD_PERCENT_APP,"
+ " FD_PERCENT_DIFF,"
+ " FD_PERCENT_RATE,"
+ " FD_WEIGHT,"
+ " FD_ST_WEIGHT"
+ " from MV_ST_PSI";
jdbcTemplate.update(sql, new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement pstmt) throws SQLException {
pstmt.setObject(1, runtimeDateString);
}
});
log.info("完成将计算并生成指标表数据保存到历史表中");
}
/**
* 检查咨询建模客户分布表是否已经配置
* @return 是否通过检查
*/
private boolean checkDistributionConfiguration(){
String sql ="select count(*) count from MV_CFG_DISTRIBUTION";
Long count =jdbcTemplate.query(sql, new ResultSetExtractor<Long>(){
@Override
public Long extractData(ResultSet rs) throws SQLException, DataAccessException {
if(rs.next()){
return rs.getLong("count");
}else{
return 0L;
}
}
});
if(count!=null && count>0){
return true;
}else{
//throw new RuntimeException("未找到咨询建模时客户分布情况配置信息,请首先对参数[咨询建模时客户分布情况配置]进行配置后,再重试.");
return false;
}
}
}

33
io.sc.engine.mv/src/main/java/io/sc/engine/mv/executor/support/CutOffPointFinder.java

@ -0,0 +1,33 @@
package io.sc.engine.mv.executor.support;
import java.math.BigDecimal;
import io.sc.engine.mv.jpa.entity.CfgCutOffPoint;
import io.sc.engine.mv.jpa.repository.CfgCutOffPointRepository;
import io.sc.platform.core.support.NumberIterator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class CutOffPointFinder{
@Autowired protected CfgCutOffPointRepository cfgCutPointRepository;
/**
* 获取截断点配置
* @param cutOffPointName 截断点名称
* @return 截断点配置
*/
public NumberIterator getCufOffPoint(String cutOffPointName){
CfgCutOffPoint cutPoint =cfgCutPointRepository.findByName(cutOffPointName);
if(cutPoint!=null){
NumberIterator result =new NumberIterator();
result.setFrom(new BigDecimal(cutPoint.getFrom()));
result.setTo(new BigDecimal(cutPoint.getTo()));
result.setStep(new BigDecimal(cutPoint.getStep()));
result.setScale(cutPoint.getScale());
result.setRoundingMode(cutPoint.getRoundingMode());
return result;
}
return null;
}
}

29
io.sc.engine.mv/src/main/java/io/sc/engine/mv/extractor/DefaultRecordDataExtractor.java

@ -0,0 +1,29 @@
package io.sc.engine.mv.extractor;
import io.sc.engine.mv.DataExtractor;
import io.sc.engine.mv.RuntimeContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* 违约记录源数据抽取器
* @author wangshaoping
*
*/
@Component
public class DefaultRecordDataExtractor implements DataExtractor {
private static final Logger log =LoggerFactory.getLogger(DefaultRecordDataExtractor.class);
@Override
public void extract(RuntimeContext runtimeContext) {
log.info("开始抽取违约记录数据...");
log.info("完成抽取违约记录数据...");
}
@Override
public int getExecuteTimeWeight() {
return 10;
}
}

81
io.sc.engine.mv/src/main/java/io/sc/engine/mv/initializer/ConfigurationInitializer.java

@ -0,0 +1,81 @@
package io.sc.engine.mv.initializer;
import io.sc.engine.mv.service.configuration.*;
import io.sc.platform.core.initializer.ApplicationInitializer;
import io.sc.platform.core.initializer.ApplicationInitializerExecuteException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
public class ConfigurationInitializer implements ApplicationInitializer {
@Autowired private CfgDataExtractorService cfgDataExtractorService;
@Autowired private CfgBinomialService binomialService;
@Autowired private CfgChiSquareService chiSquareService;
@Autowired private CfgCutOffPointService cutOffPointService;
@Autowired private CfgThresholdService thresholdService;
private Boolean isInitialized =null;
@Override
public String getId() {
return this.getClass().getName();
}
@Override
public String getName() {
return "Model Validator Configuration Initializer";
}
@Override
public String getDescription() {
return "Model Validator Configuration Initializer";
}
@Override
public void init(ApplicationContext applicationContext) {
this.cfgDataExtractorService =applicationContext.getBean(CfgDataExtractorService.class);
this.binomialService =applicationContext.getBean(CfgBinomialService.class);
this.chiSquareService =applicationContext.getBean(CfgChiSquareService.class);
this.cutOffPointService =applicationContext.getBean(CfgCutOffPointService.class);
this.thresholdService =applicationContext.getBean(CfgThresholdService.class);
}
@Override
public int getOrder() {
return 1100;
}
@Override
public synchronized boolean isInitialized() {
if(isInitialized!=null) {
return isInitialized;
}
isInitialized = ( cfgDataExtractorService.getRepository().count()>0
|| binomialService.getRepository().count()>0
|| chiSquareService.getRepository().count()>0
|| cutOffPointService.getRepository().count()>0
|| thresholdService.getRepository().count()>0);
return isInitialized;
}
@Override
public void execute() throws ApplicationInitializerExecuteException {
try {
if(cfgDataExtractorService.getRepository().count()<=0){
cfgDataExtractorService.generateSample();
}
if(binomialService.getRepository().count()<=0) {
binomialService.resetDefaultValues();
}
if(chiSquareService.getRepository().count()<=0) {
chiSquareService.resetDefaultValues();
}
if(cutOffPointService.getRepository().count()<=0) {
cutOffPointService.resetDefaultValues();
}
if(thresholdService.getRepository().count()<=0) {
thresholdService.resetDefaultValues();
}
} catch (Exception e) {
throw new ApplicationInitializerExecuteException(e);
}
}
}

243
io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/CoeBinomialHistory.java

@ -0,0 +1,243 @@
package io.sc.engine.mv.jpa.entity;
import io.sc.engine.mv.jpa.entity.id.CoeBinomialHistoryId;
import io.sc.engine.mv.vo.CoeBinomialHistoryVo;
import io.sc.platform.orm.entity.BaseEntity;
import javax.persistence.*;
@Entity
@Table(name="MV_COE_BINOMIAL_HIS")
@IdClass(CoeBinomialHistoryId.class)
public class CoeBinomialHistory extends BaseEntity<CoeBinomialHistoryVo> {
//模型验证日期
@Id
@Column(name="FD_VALIDATE_DATE")
private String validateDate;
//模型标识
@Id
@Column(name="FD_MODEL_ID")
private String modelId;
//模型名称
@Column(name="FD_MODEL_NAME")
private String modelName;
//评分等级
@Id
@Column(name="FD_LEVEL")
private String level;
//违约概率
@Column(name="FD_PD")
private Double pd;
//客户个数
@Column(name="FD_COUNT")
private Long count;
//事实违约客户个数
@Column(name="FD_DEFAULT_COUNT")
private Long defaultCount;
//正态分布平均数
@Column(name="FD_ND_AVG")
private Double ndAvg;
//正态分布标准差
@Column(name="FD_ND_SD")
private Double ndSd;
//显著水平
@Column(name="FD_SL")
private Double sl;
//置信水平
@Column(name="FD_CL")
private Double cl;
//正态分布Z值上界
@Column(name="FD_Z_UPPER")
private Double zUpper;
//正态分布Z值下界
@Column(name="FD_Z_LOWER")
private Double zLower;
//临界值上界
@Column(name="FD_D_UPPER")
private Double dUpper;
//临界值下界
@Column(name="FD_D_LOWER")
private Double dLower;
//是否小于等于上界
@Column(name="FD_LE_UPPER")
private Double leUpper;
//是否大于等于下界
@Column(name="FD_GE_LOWER")
private Double geLower;
@Override
public CoeBinomialHistoryVo toVo() {
CoeBinomialHistoryVo vo =new CoeBinomialHistoryVo();
vo.setValidateDate(this.getValidateDate());
vo.setModelId(this.getModelId());
vo.setModelName(this.getModelName());
vo.setLevel(this.getLevel());
vo.setPd(this.getPd());
vo.setCount(this.getCount());
vo.setDefaultCount(this.getDefaultCount());
vo.setNdAvg(this.getNdAvg());
vo.setNdSd(this.getNdSd());
vo.setSl(this.getSl());
vo.setCl(this.getCl());
vo.setzUpper(this.getzUpper());
vo.setzLower(this.getzLower());
vo.setdUpper(this.getdUpper());
vo.setdLower(this.getdLower());
vo.setLeUpper(this.getLeUpper());
vo.setGeLower(this.getGeLower());
return vo;
}
public String getValidateDate() {
return validateDate;
}
public void setValidateDate(String validateDate) {
this.validateDate = validateDate;
}
public String getModelId() {
return modelId;
}
public void setModelId(String modelId) {
this.modelId = modelId;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public Double getPd() {
return pd;
}
public void setPd(Double pd) {
this.pd = pd;
}
public Long getCount() {
return count;
}
public void setCount(Long count) {
this.count = count;
}
public Long getDefaultCount() {
return defaultCount;
}
public void setDefaultCount(Long defaultCount) {
this.defaultCount = defaultCount;
}
public Double getNdAvg() {
return ndAvg;
}
public void setNdAvg(Double ndAvg) {
this.ndAvg = ndAvg;
}
public Double getNdSd() {
return ndSd;
}
public void setNdSd(Double ndSd) {
this.ndSd = ndSd;
}
public Double getSl() {
return sl;
}
public void setSl(Double sl) {
this.sl = sl;
}
public Double getCl() {
return cl;
}
public void setCl(Double cl) {
this.cl = cl;
}
public Double getzUpper() {
return zUpper;
}
public void setzUpper(Double zUpper) {
this.zUpper = zUpper;
}
public Double getzLower() {
return zLower;
}
public void setzLower(Double zLower) {
this.zLower = zLower;
}
public Double getdUpper() {
return dUpper;
}
public void setdUpper(Double dUpper) {
this.dUpper = dUpper;
}
public Double getdLower() {
return dLower;
}
public void setdLower(Double dLower) {
this.dLower = dLower;
}
public Double getLeUpper() {
return leUpper;
}
public void setLeUpper(Double leUpper) {
this.leUpper = leUpper;
}
public Double getGeLower() {
return geLower;
}
public void setGeLower(Double geLower) {
this.geLower = geLower;
}
}

125
io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/CoeChiSquareHistory.java

@ -0,0 +1,125 @@
package io.sc.engine.mv.jpa.entity;
import io.sc.engine.mv.jpa.entity.id.CoeChiSquareHistoryId;
import io.sc.engine.mv.vo.CoeChiSquareHistoryVo;
import io.sc.platform.orm.entity.BaseEntity;
import javax.persistence.*;
@Entity
@Table(name="MV_COE_CHI_SQUARE_HIS")
@IdClass(CoeChiSquareHistoryId.class)
public class CoeChiSquareHistory extends BaseEntity<CoeChiSquareHistoryVo> {
//模型验证日期
@Id
@Column(name="FD_VALIDATE_DATE")
private String validateDate;
//模型标识
@Id
@Column(name="FD_MODEL_ID")
private String modelId;
//模型名称
@Column(name="FD_MODEL_NAME")
private String modelName;
//评分等级
@Id
@Column(name="FD_LEVEL")
private String level;
//违约概率
@Column(name="FD_PD")
private Double pd;
//客户个数
@Column(name="FD_COUNT")
private Long count;
//事实违约客户个数
@Column(name="FD_DEFAULT_COUNT")
private Long defaultCount;
//卡方值
@Column(name="FD_CHI_SQUARE")
private Double chiSquare;
@Override
public CoeChiSquareHistoryVo toVo() {
CoeChiSquareHistoryVo vo =new CoeChiSquareHistoryVo();
vo.setValidateDate(this.getValidateDate());
vo.setModelId(this.getModelId());
vo.setModelName(this.getModelName());
vo.setLevel(this.getLevel());
vo.setPd(this.getPd());
vo.setCount(this.getCount());
vo.setDefaultCount(this.getDefaultCount());
vo.setChiSquare(this.getChiSquare());
return vo;
}
public String getValidateDate() {
return validateDate;
}
public void setValidateDate(String validateDate) {
this.validateDate = validateDate;
}
public String getModelId() {
return modelId;
}
public void setModelId(String modelId) {
this.modelId = modelId;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public Double getPd() {
return pd;
}
public void setPd(Double pd) {
this.pd = pd;
}
public Long getCount() {
return count;
}
public void setCount(Long count) {
this.count = count;
}
public Long getDefaultCount() {
return defaultCount;
}
public void setDefaultCount(Long defaultCount) {
this.defaultCount = defaultCount;
}
public Double getChiSquare() {
return chiSquare;
}
public void setChiSquare(Double chiSquare) {
this.chiSquare = chiSquare;
}
}

294
io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/GeneralResultHistory.java

@ -0,0 +1,294 @@
package io.sc.engine.mv.jpa.entity;
import io.sc.engine.mv.CoeResult;
import io.sc.engine.mv.ExecuteMode;
import io.sc.engine.mv.jpa.entity.id.GeneralResultHistoryId;
import io.sc.engine.mv.vo.GeneralResultHistoryVo;
import io.sc.platform.orm.entity.BaseEntity;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
/**
* 验证结果历史实体类
* @author wangshaoping
*
*/
@Entity
@Table(name="MV_GENERAL_RESULT_HIS")
@IdClass(GeneralResultHistoryId.class)
public class GeneralResultHistory extends BaseEntity<GeneralResultHistoryVo> {
private static final long serialVersionUID = -6490873659011192600L;
//验证日期
@Id
@Column(name="FD_VALIDATE_DATE", nullable=false, length=19)
private String validateDate;
//模型标识
@Id
@Column(name="FD_MODEL_ID", nullable=false)
private String modelId;
//模型名称
@Column(name="FD_MODEL_NAME")
private String modelName;
//验证执行模式
@Id
@Column(name="FD_EXECUTE_MODE", nullable=false)
@Enumerated(EnumType.STRING)
private ExecuteMode executeMode;
//总样本数
@Column(name="FD_TOTAL_SAMPLE_COUNT")
private Long totalSampleCount;
//事实违约样本个数
@Column(name="FD_DEFAULT_SAMPLE_COUNT")
private Long defaultSampleCount;
//区分能力 AUC 值(总体)
@Column(name="FD_SC_AUC")
private Double auc;
//区分能力 AUC 值(定量)
@Column(name="FD_SC_AUC_QUANTITATIVE")
private Double aucQuantitative;
//区分能力 AUC 值(定性)
@Column(name="FD_SC_AUC_QUALITATIVE")
private Double aucQualitative;
//区分能力 AR 值(总体)
@Column(name="FD_SC_AR")
private Double ar;
//区分能力 AR 值(定量)
@Column(name="FD_SC_AR_QUANTITATIVE")
private Double arQuantitative;
//区分能力 AR 值(定性)
@Column(name="FD_SC_AR_QUALITATIVE")
private Double arQualitative;
//区分能力 KS 值(总体)
@Column(name="FD_SC_KS")
private Double ks;
//区分能力 KS 值(定量)
@Column(name="FD_SC_KS_QUANTITATIVE")
private Double ksQuantitative;
//区分能力 KS 值(定性)
@Column(name="FD_SC_KS_QUALITATIVE")
private Double ksQualitative;
//稳定性转移矩阵 SVD 值
@Column(name="FD_ST_SVD")
private Double svd;
//稳定性群体稳定性 PSI 值
@Column(name="FD_ST_PSI")
private Double psi;
//卡方检验结果
@Column(name="FD_COE_CHI_SQUARE")
@Enumerated(EnumType.STRING)
private CoeResult chiSquare;
//卡方检验结果
@Column(name="FD_COE_BINOMIAL")
@Enumerated(EnumType.STRING)
private CoeResult binomial;
//模型验证执行时参数配置
@Transient
private List<RuntimeParameter> runtimeParameters =new ArrayList<RuntimeParameter>();
@Override
public GeneralResultHistoryVo toVo() {
GeneralResultHistoryVo vo =new GeneralResultHistoryVo();
vo.setValidateDate(this.getValidateDate());
vo.setModelId(this.getModelId());
vo.setModelName(this.getModelName());
vo.setExecuteMode(this.getExecuteMode());
vo.setTotalSampleCount(this.getTotalSampleCount());
vo.setDefaultSampleCount(this.getDefaultSampleCount());
vo.setAuc(this.getAuc());
vo.setAucQuantitative(this.getAucQuantitative());
vo.setAucQualitative(this.getAucQualitative());
vo.setAr(this.getAr());
vo.setArQuantitative(this.getArQuantitative());
vo.setArQualitative(this.getArQualitative());
vo.setKs(this.getKs());
vo.setKsQuantitative(this.getKsQuantitative());
vo.setKsQualitative(this.getKsQualitative());
vo.setSvd(this.getSvd());
vo.setPsi(this.getPsi());
vo.setChiSquare(this.getChiSquare());
vo.setBinomial(this.getBinomial());
return vo;
}
public String getValidateDate() {
return validateDate;
}
public void setValidateDate(String validateDate) {
this.validateDate = validateDate;
}
public String getModelId() {
return modelId;
}
public void setModelId(String modelId) {
this.modelId = modelId;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public ExecuteMode getExecuteMode() {
return executeMode;
}
public void setExecuteMode(ExecuteMode executeMode) {
this.executeMode = executeMode;
}
public Long getTotalSampleCount() {
return totalSampleCount;
}
public void setTotalSampleCount(Long totalSampleCount) {
this.totalSampleCount = totalSampleCount;
}
public Long getDefaultSampleCount() {
return defaultSampleCount;
}
public void setDefaultSampleCount(Long defaultSampleCount) {
this.defaultSampleCount = defaultSampleCount;
}
public Double getAuc() {
return auc;
}
public void setAuc(Double auc) {
this.auc = auc;
}
public Double getAucQuantitative() {
return aucQuantitative;
}
public void setAucQuantitative(Double aucQuantitative) {
this.aucQuantitative = aucQuantitative;
}
public Double getAucQualitative() {
return aucQualitative;
}
public void setAucQualitative(Double aucQualitative) {
this.aucQualitative = aucQualitative;
}
public Double getAr() {
return ar;
}
public void setAr(Double ar) {
this.ar = ar;
}
public Double getArQuantitative() {
return arQuantitative;
}
public void setArQuantitative(Double arQuantitative) {
this.arQuantitative = arQuantitative;
}
public Double getArQualitative() {
return arQualitative;
}
public void setArQualitative(Double arQualitative) {
this.arQualitative = arQualitative;
}
public Double getKs() {
return ks;
}
public void setKs(Double ks) {
this.ks = ks;
}
public Double getKsQuantitative() {
return ksQuantitative;
}
public void setKsQuantitative(Double ksQuantitative) {
this.ksQuantitative = ksQuantitative;
}
public Double getKsQualitative() {
return ksQualitative;
}
public void setKsQualitative(Double ksQualitative) {
this.ksQualitative = ksQualitative;
}
public Double getSvd() {
return svd;
}
public void setSvd(Double svd) {
this.svd = svd;
}
public Double getPsi() {
return psi;
}
public void setPsi(Double psi) {
this.psi = psi;
}
public CoeResult getChiSquare() {
return chiSquare;
}
public void setChiSquare(CoeResult chiSquare) {
this.chiSquare = chiSquare;
}
public CoeResult getBinomial() {
return binomial;
}
public void setBinomial(CoeResult binomial) {
this.binomial = binomial;
}
public List<RuntimeParameter> getRuntimeParameters() {
return runtimeParameters;
}
public void setRuntimeParameters(List<RuntimeParameter> runtimeParameters) {
this.runtimeParameters = runtimeParameters;
}
}

222
io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/GeneralSampleHistory.java

@ -0,0 +1,222 @@
package io.sc.engine.mv.jpa.entity;
import io.sc.engine.mv.jpa.entity.id.GeneralSampleHistoryId;
import io.sc.engine.mv.vo.GeneralSampleHistoryVo;
import io.sc.platform.orm.entity.BaseEntity;
import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
/**
* 验证样本历史实体类
* @author wangshaoping
*
*/
@Entity
@Table(name="MV_GENERAL_SAMPLE_HIS")
@IdClass(GeneralSampleHistoryId.class)
public class GeneralSampleHistory extends BaseEntity<GeneralSampleHistoryVo> {
//验证日期
@Id
@Column(name="FD_VALIDATE_DATE")
private String validateDate;
//客户标识
@Id
@Column(name="FD_CUSTOM_ID")
private String customId;
//客户名称
@Column(name="FD_CUSTOM_NAME")
private String customName;
//模型标识
@Id
@Column(name="FD_MODEL_ID")
private String modelId;
//模型名称
@Column(name="FD_MODEL_NAME")
private String modelName;
//违约概率
@Column(name="FD_PD")
private BigDecimal pd;
//评分
@Column(name="FD_SCORE")
private BigDecimal score;
//评分(定量得分)
@Column(name="FD_SCORE_QUANTITATIVE")
private BigDecimal scoreQuantitative;
//评分(定性得分)
@Column(name="FD_SCORE_QUALITATIVE")
private BigDecimal scoreQualitative;
//评级等级
@Column(name="FD_LEVEL")
private String level;
//评级有效期开始日期
@Id
@Column(name="FD_SCORE_BEGIN_DATE")
@Temporal(TemporalType.TIMESTAMP)
private Date beginDate;
//评级有效期结束日期
@Id
@Column(name="FD_SCORE_END_DATE")
@Temporal(TemporalType.TIMESTAMP)
private Date endDate;
//违约状态
@Column(name="FD_DEFAULT_STATUS")
private String status;
//违约认定日期
@Column(name="FD_DEFAULT_CONFIRM_DATE")
private Date defaultConfirmDate;
@Override
public GeneralSampleHistoryVo toVo() {
GeneralSampleHistoryVo vo =new GeneralSampleHistoryVo();
vo.setValidateDate(this.getValidateDate());
vo.setCustomId(this.getCustomId());
vo.setCustomName(this.getCustomName());
vo.setModelId(this.getModelId());
vo.setModelName(this.getModelName());
vo.setPd(this.getPd());
vo.setScore(this.getScore());
vo.setScoreQuantitative(this.getScoreQuantitative());
vo.setScoreQualitative(this.getScoreQualitative());
vo.setLevel(this.getLevel());
vo.setBeginDate(this.getBeginDate());
vo.setEndDate(this.getEndDate());
vo.setStatus(this.getStatus());
vo.setDefaultConfirmDate(this.getDefaultConfirmDate());
return vo;
}
public String getValidateDate() {
return validateDate;
}
public void setValidateDate(String validateDate) {
this.validateDate = validateDate;
}
public String getCustomId() {
return customId;
}
public void setCustomId(String customId) {
this.customId = customId;
}
public String getCustomName() {
return customName;
}
public void setCustomName(String customName) {
this.customName = customName;
}
public String getModelId() {
return modelId;
}
public void setModelId(String modelId) {
this.modelId = modelId;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public BigDecimal getPd() {
return pd;
}
public void setPd(BigDecimal pd) {
this.pd = pd;
}
public BigDecimal getScore() {
return score;
}
public void setScore(BigDecimal score) {
this.score = score;
}
public BigDecimal getScoreQuantitative() {
return scoreQuantitative;
}
public void setScoreQuantitative(BigDecimal scoreQuantitative) {
this.scoreQuantitative = scoreQuantitative;
}
public BigDecimal getScoreQualitative() {
return scoreQualitative;
}
public void setScoreQualitative(BigDecimal scoreQualitative) {
this.scoreQualitative = scoreQualitative;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public Date getBeginDate() {
return beginDate;
}
public void setBeginDate(Date beginDate) {
this.beginDate = beginDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Date getDefaultConfirmDate() {
return defaultConfirmDate;
}
public void setDefaultConfirmDate(Date defaultConfirmDate) {
this.defaultConfirmDate = defaultConfirmDate;
}
}

223
io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/StPsiHistory.java

@ -0,0 +1,223 @@
package io.sc.engine.mv.jpa.entity;
import io.sc.engine.mv.jpa.entity.id.StPsiHistoryId;
import io.sc.engine.mv.vo.StPsiHistoryVo;
import io.sc.platform.orm.entity.BaseEntity;
import javax.persistence.*;
/**
* 模型稳定性验证 PSI 指标表历史数据实体类
* @author wangshaoping
*
*/
@Entity
@Table(name="MV_ST_PSI_HIS")
@IdClass(StPsiHistoryId.class)
public class StPsiHistory extends BaseEntity<StPsiHistoryVo> {
//模型验证日期
@Id
@Column(name="FD_VALIDATE_DATE")
private String validateDate;
//模型标识
@Id
@Column(name="FD_MODEL_ID")
private String modelId;
//模型名称
@Column(name="FD_MODEL_NAME")
private String modelName;
//分数段开始值_含该值
@Id
@Column(name="FD_SCORE_SEG_START")
private Double scoreSegStart;
//分数段结束值_含该值
@Id
@Column(name="FD_SCORE_SEG_END")
private Double scoreSegEnd;
//分数段内申请人数_咨询建模时
@Column(name="FD_COUNT_DEV")
private Long countDev;
//群体总人数_咨询建模时
@Column(name="FD_TOTAL_COUNT_DEV")
private Long totalCountDev;
//分数段内申请人数占群体总人数百分比_咨询建模时
@Column(name="FD_PERCENT_DEV")
private Double percentDev;
//分数段内申请人数_模型应用时
@Column(name="FD_COUNT_APP")
private Long countApp;
//群体总人数_模型应用时
@Column(name="FD_TOTAL_COUNT_APP")
private Long totalCountApp;
//分数段内申请人数占群体总人数百分比_模型应用时
@Column(name="FD_PERCENT_APP")
private Double percentApp;
//百分比变化
@Column(name="FD_PERCENT_DIFF")
private Double percentDiff;
//百分比相对比例
@Column(name="FD_PERCENT_RATE")
private Double percentRate;
//加权系数
@Column(name="FD_WEIGHT")
private Double weight;
//稳定性加权
@Column(name="FD_ST_WEIGHT")
private Double stWeight;
@Override
public StPsiHistoryVo toVo() {
StPsiHistoryVo vo =new StPsiHistoryVo();
vo.setValidateDate(this.getValidateDate());
vo.setModelId(this.getModelId());
vo.setModelName(this.getModelName());
vo.setScoreSegStart(this.getScoreSegStart());
vo.setScoreSegEnd(this.getScoreSegEnd());
vo.setCountDev(this.getCountDev());
vo.setTotalCountDev(this.getTotalCountDev());
vo.setPercentDev(this.getPercentDev());
vo.setCountApp(this.getCountApp());
vo.setTotalCountApp(this.getTotalCountApp());
vo.setPercentApp(this.getPercentApp());
vo.setPercentDiff(this.getPercentDiff());
vo.setPercentRate(this.getPercentRate());
vo.setWeight(this.getWeight());
vo.setStWeight(this.getStWeight());
return vo;
}
public String getValidateDate() {
return validateDate;
}
public void setValidateDate(String validateDate) {
this.validateDate = validateDate;
}
public String getModelId() {
return modelId;
}
public void setModelId(String modelId) {
this.modelId = modelId;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public Double getScoreSegStart() {
return scoreSegStart;
}
public void setScoreSegStart(Double scoreSegStart) {
this.scoreSegStart = scoreSegStart;
}
public Double getScoreSegEnd() {
return scoreSegEnd;
}
public void setScoreSegEnd(Double scoreSegEnd) {
this.scoreSegEnd = scoreSegEnd;
}
public Long getCountDev() {
return countDev;
}
public void setCountDev(Long countDev) {
this.countDev = countDev;
}
public Long getTotalCountDev() {
return totalCountDev;
}
public void setTotalCountDev(Long totalCountDev) {
this.totalCountDev = totalCountDev;
}
public Double getPercentDev() {
return percentDev;
}
public void setPercentDev(Double percentDev) {
this.percentDev = percentDev;
}
public Long getCountApp() {
return countApp;
}
public void setCountApp(Long countApp) {
this.countApp = countApp;
}
public Long getTotalCountApp() {
return totalCountApp;
}
public void setTotalCountApp(Long totalCountApp) {
this.totalCountApp = totalCountApp;
}
public Double getPercentApp() {
return percentApp;
}
public void setPercentApp(Double percentApp) {
this.percentApp = percentApp;
}
public Double getPercentDiff() {
return percentDiff;
}
public void setPercentDiff(Double percentDiff) {
this.percentDiff = percentDiff;
}
public Double getPercentRate() {
return percentRate;
}
public void setPercentRate(Double percentRate) {
this.percentRate = percentRate;
}
public Double getWeight() {
return weight;
}
public void setWeight(Double weight) {
this.weight = weight;
}
public Double getStWeight() {
return stWeight;
}
public void setStWeight(Double stWeight) {
this.stWeight = stWeight;
}
}

66
io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/id/CoeBinomialHistoryId.java

@ -0,0 +1,66 @@
package io.sc.engine.mv.jpa.entity.id;
import java.io.Serializable;
public class CoeBinomialHistoryId implements Serializable{
private static final long serialVersionUID = 7292907540613138975L;
private String validateDate;
private String modelId;
private String level;
public String getValidateDate() {
return validateDate;
}
public void setValidateDate(String validateDate) {
this.validateDate = validateDate;
}
public String getModelId() {
return modelId;
}
public void setModelId(String modelId) {
this.modelId = modelId;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((level == null) ? 0 : level.hashCode());
result = prime * result + ((modelId == null) ? 0 : modelId.hashCode());
result = prime * result + ((validateDate == null) ? 0 : validateDate.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CoeBinomialHistoryId other = (CoeBinomialHistoryId) obj;
if (level == null) {
if (other.level != null)
return false;
} else if (!level.equals(other.level))
return false;
if (modelId == null) {
if (other.modelId != null)
return false;
} else if (!modelId.equals(other.modelId))
return false;
if (validateDate == null) {
if (other.validateDate != null)
return false;
} else if (!validateDate.equals(other.validateDate))
return false;
return true;
}
}

65
io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/id/CoeChiSquareHistoryId.java

@ -0,0 +1,65 @@
package io.sc.engine.mv.jpa.entity.id;
import java.io.Serializable;
public class CoeChiSquareHistoryId implements Serializable{
private static final long serialVersionUID = -3256367575140177940L;
private String validateDate;
private String modelId;
private String level;
public String getValidateDate() {
return validateDate;
}
public void setValidateDate(String validateDate) {
this.validateDate = validateDate;
}
public String getModelId() {
return modelId;
}
public void setModelId(String modelId) {
this.modelId = modelId;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((level == null) ? 0 : level.hashCode());
result = prime * result + ((modelId == null) ? 0 : modelId.hashCode());
result = prime * result + ((validateDate == null) ? 0 : validateDate.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CoeChiSquareHistoryId other = (CoeChiSquareHistoryId) obj;
if (level == null) {
if (other.level != null)
return false;
} else if (!level.equals(other.level))
return false;
if (modelId == null) {
if (other.modelId != null)
return false;
} else if (!modelId.equals(other.modelId))
return false;
if (validateDate == null) {
if (other.validateDate != null)
return false;
} else if (!validateDate.equals(other.validateDate))
return false;
return true;
}
}

53
io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/id/GeneralResultHistoryId.java

@ -0,0 +1,53 @@
package io.sc.engine.mv.jpa.entity.id;
import java.io.Serializable;
public class GeneralResultHistoryId implements Serializable{
private static final long serialVersionUID = -6831606643821339120L;
private String validateDate;
private String modelId;
public String getValidateDate() {
return validateDate;
}
public void setValidateDate(String validateDate) {
this.validateDate = validateDate;
}
public String getModelId() {
return modelId;
}
public void setModelId(String modelId) {
this.modelId = modelId;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((modelId == null) ? 0 : modelId.hashCode());
result = prime * result + ((validateDate == null) ? 0 : validateDate.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
GeneralResultHistoryId other = (GeneralResultHistoryId) obj;
if (modelId == null) {
if (other.modelId != null)
return false;
} else if (!modelId.equals(other.modelId))
return false;
if (validateDate == null) {
if (other.validateDate != null)
return false;
} else if (!validateDate.equals(other.validateDate))
return false;
return true;
}
}

93
io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/id/GeneralSampleHistoryId.java

@ -0,0 +1,93 @@
package io.sc.engine.mv.jpa.entity.id;
import java.io.Serializable;
import java.util.Date;
public class GeneralSampleHistoryId implements Serializable{
private static final long serialVersionUID = -1449379762137544415L;
private String validateDate;
private String customId;
private String modelId;
private Date beginDate;
private Date endDate;
public String getValidateDate() {
return validateDate;
}
public void setValidateDate(String validateDate) {
this.validateDate = validateDate;
}
public String getCustomId() {
return customId;
}
public void setCustomId(String customId) {
this.customId = customId;
}
public String getModelId() {
return modelId;
}
public void setModelId(String modelId) {
this.modelId = modelId;
}
public Date getBeginDate() {
return beginDate;
}
public void setBeginDate(Date beginDate) {
this.beginDate = beginDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((beginDate == null) ? 0 : beginDate.hashCode());
result = prime * result + ((customId == null) ? 0 : customId.hashCode());
result = prime * result + ((endDate == null) ? 0 : endDate.hashCode());
result = prime * result + ((modelId == null) ? 0 : modelId.hashCode());
result = prime * result + ((validateDate == null) ? 0 : validateDate.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
GeneralSampleHistoryId other = (GeneralSampleHistoryId) obj;
if (beginDate == null) {
if (other.beginDate != null)
return false;
} else if (!beginDate.equals(other.beginDate))
return false;
if (customId == null) {
if (other.customId != null)
return false;
} else if (!customId.equals(other.customId))
return false;
if (endDate == null) {
if (other.endDate != null)
return false;
} else if (!endDate.equals(other.endDate))
return false;
if (modelId == null) {
if (other.modelId != null)
return false;
} else if (!modelId.equals(other.modelId))
return false;
if (validateDate == null) {
if (other.validateDate != null)
return false;
} else if (!validateDate.equals(other.validateDate))
return false;
return true;
}
}

79
io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/entity/id/StPsiHistoryId.java

@ -0,0 +1,79 @@
package io.sc.engine.mv.jpa.entity.id;
import java.io.Serializable;
public class StPsiHistoryId implements Serializable{
private static final long serialVersionUID = -6358520753599342392L;
private String validateDate;
private String modelId;
private Double scoreSegStart;
private Double scoreSegEnd;
public String getValidateDate() {
return validateDate;
}
public void setValidateDate(String validateDate) {
this.validateDate = validateDate;
}
public String getModelId() {
return modelId;
}
public void setModelId(String modelId) {
this.modelId = modelId;
}
public Double getScoreSegStart() {
return scoreSegStart;
}
public void setScoreSegStart(Double scoreSegStart) {
this.scoreSegStart = scoreSegStart;
}
public Double getScoreSegEnd() {
return scoreSegEnd;
}
public void setScoreSegEnd(Double scoreSegEnd) {
this.scoreSegEnd = scoreSegEnd;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((modelId == null) ? 0 : modelId.hashCode());
result = prime * result + ((scoreSegEnd == null) ? 0 : scoreSegEnd.hashCode());
result = prime * result + ((scoreSegStart == null) ? 0 : scoreSegStart.hashCode());
result = prime * result + ((validateDate == null) ? 0 : validateDate.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
StPsiHistoryId other = (StPsiHistoryId) obj;
if (modelId == null) {
if (other.modelId != null)
return false;
} else if (!modelId.equals(other.modelId))
return false;
if (scoreSegEnd == null) {
if (other.scoreSegEnd != null)
return false;
} else if (!scoreSegEnd.equals(other.scoreSegEnd))
return false;
if (scoreSegStart == null) {
if (other.scoreSegStart != null)
return false;
} else if (!scoreSegStart.equals(other.scoreSegStart))
return false;
if (validateDate == null) {
if (other.validateDate != null)
return false;
} else if (!validateDate.equals(other.validateDate))
return false;
return true;
}
}

10
io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/repository/CoeBinomialHistoryRepository.java

@ -0,0 +1,10 @@
package io.sc.engine.mv.jpa.repository;
import io.sc.engine.mv.jpa.entity.CoeBinomialHistory;
import io.sc.engine.mv.jpa.entity.id.CoeBinomialHistoryId;
import io.sc.platform.orm.repository.DaoRepository;
public interface CoeBinomialHistoryRepository extends DaoRepository<CoeBinomialHistory, CoeBinomialHistoryId> {
}

10
io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/repository/CoeChiSquareHistoryRepository.java

@ -0,0 +1,10 @@
package io.sc.engine.mv.jpa.repository;
import io.sc.engine.mv.jpa.entity.CoeChiSquareHistory;
import io.sc.engine.mv.jpa.entity.id.CoeChiSquareHistoryId;
import io.sc.platform.orm.repository.DaoRepository;
public interface CoeChiSquareHistoryRepository extends DaoRepository<CoeChiSquareHistory, CoeChiSquareHistoryId> {
}

40
io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/repository/GeneralResultHistoryRepository.java

@ -0,0 +1,40 @@
package io.sc.engine.mv.jpa.repository;
import java.util.List;
import io.sc.engine.mv.jpa.entity.GeneralResultHistory;
import io.sc.engine.mv.jpa.entity.id.GeneralResultHistoryId;
import io.sc.platform.orm.repository.DaoRepository;
import org.springframework.data.jpa.repository.Query;
public interface GeneralResultHistoryRepository extends DaoRepository<GeneralResultHistory, GeneralResultHistoryId> {
/**
* 根据验证日期查找模型验证结果摘要信息列表
* @param validateDate 模型验证日期
* @return 模型验证结果摘要信息列表
*/
public List<GeneralResultHistory> findByValidateDate(String validateDate);
/**
* 获取模型验证结果摘要信息包含的所有验证日期
* @return 模型验证结果摘要信息包含的所有验证日期
*/
@Query("select distinct e.validateDate from GeneralResultHistory e order by e.validateDate desc")
public List<String> findDistinctValidateDates();
/**
* 获取模型验证结果摘要信息包含的所有模型标示和名称
* @return 模型验证结果摘要信息包含的所有模型标示和名称
*/
@Query("select e.modelId,max(e.modelName) from GeneralResultHistory e group by e.modelId")
public List<Object[]> findDistinctModelIdAndNames();
/**
* 获取模型验证结果
* @param modelId 模型标识
* @param validateDate 模型验证日期
* @return 模型验证结果
*/
public GeneralResultHistory findByModelIdAndValidateDate(String modelId,String validateDate);
}

20
io.sc.engine.mv/src/main/java/io/sc/engine/mv/jpa/repository/StPsiHistoryRepository.java

@ -0,0 +1,20 @@
package io.sc.engine.mv.jpa.repository;
import java.util.List;
import io.sc.engine.mv.jpa.entity.StPsiHistory;
import io.sc.engine.mv.jpa.entity.id.StPsiHistoryId;
import io.sc.platform.orm.repository.DaoRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
public interface StPsiHistoryRepository extends DaoRepository<StPsiHistory, StPsiHistoryId> {
public Page<StPsiHistory> findAllByValidateDate(String validateDate,Pageable pageable);
@Query("select distinct e.validateDate from StPsiHistory e order by e.validateDate desc")
public List<String> findDistinctValidateDates();
@Query("select e.modelId,max(e.modelName) from StPsiHistory e group by e.modelId")
public List<Object[]> findDistinctModelIdAndNames();
}

89
io.sc.engine.mv/src/main/java/io/sc/engine/mv/sc/echarts/Coordinates.java

@ -0,0 +1,89 @@
package io.sc.engine.mv.sc.echarts;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import org.springframework.util.StringUtils;
public class Coordinates {
private List<BigDecimal> xs =new ArrayList<BigDecimal>();
private List<BigDecimal> y1s =new ArrayList<BigDecimal>();
private List<BigDecimal> y2s =new ArrayList<BigDecimal>();
public void add(BigDecimal x, BigDecimal y1){
this.xs.add(x==null?new BigDecimal(0):x);
this.y1s.add(y1==null?new BigDecimal(0):y1);
}
public void add(BigDecimal x, BigDecimal y1, BigDecimal y2){
this.xs.add(x==null?new BigDecimal(0):x);
this.y1s.add(y1==null?new BigDecimal(0):y1);
this.y2s.add(y2==null?new BigDecimal(0):y2);
}
public void setScale(int newScale){
setScale("x",newScale,RoundingMode.HALF_UP);
setScale("y1",newScale,RoundingMode.HALF_UP);
setScale("y2",newScale,RoundingMode.HALF_UP);
}
public void setScale(int newScale, RoundingMode roundingMode){
setScale("x",newScale,roundingMode);
setScale("y1",newScale,roundingMode);
setScale("y2",newScale,roundingMode);
}
public void setScale(String axis,int newScale){
setScale(axis,newScale,RoundingMode.HALF_UP);
}
public void setScale(String axis,int newScale, RoundingMode roundingMode){
if(StringUtils.hasText(axis)){
if("x".equalsIgnoreCase(axis)){
List<BigDecimal> _xs =new ArrayList<BigDecimal>();
for(BigDecimal x : xs){
_xs.add(x.setScale(newScale, roundingMode));
}
xs =_xs;
}else if("y".equalsIgnoreCase(axis) || "y1".equalsIgnoreCase(axis)){
List<BigDecimal> _y1s =new ArrayList<BigDecimal>();
for(BigDecimal y : y1s){
_y1s.add(y.setScale(newScale, roundingMode));
}
y1s =_y1s;
}else if("y2".equalsIgnoreCase(axis)){
List<BigDecimal> _y2s =new ArrayList<BigDecimal>();
for(BigDecimal y : y2s){
_y2s.add(y.setScale(newScale, roundingMode));
}
y2s =_y2s;
}
}
}
public List<BigDecimal> getXs() {
return xs;
}
public void setXs(List<BigDecimal> xs) {
this.xs = xs;
}
public List<BigDecimal> getY1s() {
return y1s;
}
public void setY1s(List<BigDecimal> y1s) {
this.y1s = y1s;
}
public List<BigDecimal> getY2s() {
return y2s;
}
public void setY2s(List<BigDecimal> y2s) {
this.y2s = y2s;
}
}

40
io.sc.engine.mv/src/main/java/io/sc/engine/mv/sc/echarts/XyCoordinates.java

@ -0,0 +1,40 @@
package io.sc.engine.mv.sc.echarts;
import java.util.ArrayList;
import java.util.List;
public class XyCoordinates<T> {
private List<String> xs =new ArrayList<String>();
private List<T> y1s =new ArrayList<T>();
private List<T> y2s =new ArrayList<T>();
public void add(String x, T y1, T y2){
this.xs.add(x==null?"":x);
this.y1s.add(y1);
this.y2s.add(y2);
}
public List<String> getXs() {
return xs;
}
public void setXs(List<String> xs) {
this.xs = xs;
}
public List<T> getY1s() {
return y1s;
}
public void setY1s(List<T> y1s) {
this.y1s = y1s;
}
public List<T> getY2s() {
return y2s;
}
public void setY2s(List<T> y2s) {
this.y2s = y2s;
}
}

11
io.sc.engine.mv/src/main/java/io/sc/engine/mv/service/result/GeneralResultHistoryService.java

@ -0,0 +1,11 @@
package io.sc.engine.mv.service.result;
import io.sc.engine.mv.jpa.entity.GeneralResultHistory;
import io.sc.engine.mv.jpa.entity.id.GeneralResultHistoryId;
import io.sc.engine.mv.jpa.repository.GeneralResultHistoryRepository;
import io.sc.platform.orm.service.DaoService;
public interface GeneralResultHistoryService extends DaoService<GeneralResultHistory, GeneralResultHistoryId, GeneralResultHistoryRepository> {
}

13
io.sc.engine.mv/src/main/java/io/sc/engine/mv/service/result/impl/GeneralResultHistoryServiceImpl.java

@ -0,0 +1,13 @@
package io.sc.engine.mv.service.result.impl;
import io.sc.engine.mv.jpa.entity.GeneralResultHistory;
import io.sc.engine.mv.jpa.entity.id.GeneralResultHistoryId;
import io.sc.engine.mv.jpa.repository.GeneralResultHistoryRepository;
import io.sc.engine.mv.service.result.GeneralResultHistoryService;
import io.sc.platform.orm.service.impl.DaoServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class GeneralResultHistoryServiceImpl extends DaoServiceImpl<GeneralResultHistory, GeneralResultHistoryId, GeneralResultHistoryRepository> implements GeneralResultHistoryService {
}

11
io.sc.engine.mv/src/main/java/io/sc/engine/mv/service/st/StPsiHistoryService.java

@ -0,0 +1,11 @@
package io.sc.engine.mv.service.st;
import io.sc.engine.mv.jpa.entity.StPsiHistory;
import io.sc.engine.mv.jpa.entity.id.StPsiHistoryId;
import io.sc.engine.mv.jpa.repository.StPsiHistoryRepository;
import io.sc.platform.orm.service.DaoService;
public interface StPsiHistoryService extends DaoService<StPsiHistory, StPsiHistoryId, StPsiHistoryRepository> {
}

5
io.sc.engine.mv/src/main/java/io/sc/engine/mv/service/st/StSvdService.java

@ -0,0 +1,5 @@
package io.sc.engine.mv.service.st;
public interface StSvdService {
}

13
io.sc.engine.mv/src/main/java/io/sc/engine/mv/service/st/impl/StPsiHistoryServiceImpl.java

@ -0,0 +1,13 @@
package io.sc.engine.mv.service.st.impl;
import io.sc.engine.mv.jpa.entity.StPsiHistory;
import io.sc.engine.mv.jpa.entity.id.StPsiHistoryId;
import io.sc.engine.mv.jpa.repository.StPsiHistoryRepository;
import io.sc.engine.mv.service.st.StPsiHistoryService;
import io.sc.platform.orm.service.impl.DaoServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class StPsiHistoryServiceImpl extends DaoServiceImpl<StPsiHistory, StPsiHistoryId, StPsiHistoryRepository> implements StPsiHistoryService {
}

8
io.sc.engine.mv/src/main/java/io/sc/engine/mv/service/st/impl/StSvdServiceImpl.java

@ -0,0 +1,8 @@
package io.sc.engine.mv.service.st.impl;
import io.sc.engine.mv.service.st.StSvdService;
public class StSvdServiceImpl implements StSvdService {
}

159
io.sc.engine.mv/src/main/java/io/sc/engine/mv/vo/CoeBinomialHistoryVo.java

@ -0,0 +1,159 @@
package io.sc.engine.mv.vo;
import io.sc.platform.orm.api.vo.BaseVo;
public class CoeBinomialHistoryVo extends BaseVo {
private String validateDate;
private String modelId;
private String modelName;
private String level;
private Double pd;
private Long count;
private Long defaultCount;
private Double ndAvg;
private Double ndSd;
private Double sl;
private Double cl;
private Double zUpper;
private Double zLower;
private Double dUpper;
private Double dLower;
private Double leUpper;
private Double geLower;
public String getValidateDate() {
return validateDate;
}
public void setValidateDate(String validateDate) {
this.validateDate = validateDate;
}
public String getModelId() {
return modelId;
}
public void setModelId(String modelId) {
this.modelId = modelId;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public Double getPd() {
return pd;
}
public void setPd(Double pd) {
this.pd = pd;
}
public Long getCount() {
return count;
}
public void setCount(Long count) {
this.count = count;
}
public Long getDefaultCount() {
return defaultCount;
}
public void setDefaultCount(Long defaultCount) {
this.defaultCount = defaultCount;
}
public Double getNdAvg() {
return ndAvg;
}
public void setNdAvg(Double ndAvg) {
this.ndAvg = ndAvg;
}
public Double getNdSd() {
return ndSd;
}
public void setNdSd(Double ndSd) {
this.ndSd = ndSd;
}
public Double getSl() {
return sl;
}
public void setSl(Double sl) {
this.sl = sl;
}
public Double getCl() {
return cl;
}
public void setCl(Double cl) {
this.cl = cl;
}
public Double getzUpper() {
return zUpper;
}
public void setzUpper(Double zUpper) {
this.zUpper = zUpper;
}
public Double getzLower() {
return zLower;
}
public void setzLower(Double zLower) {
this.zLower = zLower;
}
public Double getdUpper() {
return dUpper;
}
public void setdUpper(Double dUpper) {
this.dUpper = dUpper;
}
public Double getdLower() {
return dLower;
}
public void setdLower(Double dLower) {
this.dLower = dLower;
}
public Double getLeUpper() {
return leUpper;
}
public void setLeUpper(Double leUpper) {
this.leUpper = leUpper;
}
public Double getGeLower() {
return geLower;
}
public void setGeLower(Double geLower) {
this.geLower = geLower;
}
}

79
io.sc.engine.mv/src/main/java/io/sc/engine/mv/vo/CoeChiSquareHistoryVo.java

@ -0,0 +1,79 @@
package io.sc.engine.mv.vo;
import io.sc.platform.orm.api.vo.BaseVo;
public class CoeChiSquareHistoryVo extends BaseVo {
private String validateDate;
private String modelId;
private String modelName;
private String level;
private Double pd;
private Long count;
private Long defaultCount;
private Double chiSquare;
public String getValidateDate() {
return validateDate;
}
public void setValidateDate(String validateDate) {
this.validateDate = validateDate;
}
public String getModelId() {
return modelId;
}
public void setModelId(String modelId) {
this.modelId = modelId;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public Double getPd() {
return pd;
}
public void setPd(Double pd) {
this.pd = pd;
}
public Long getCount() {
return count;
}
public void setCount(Long count) {
this.count = count;
}
public Long getDefaultCount() {
return defaultCount;
}
public void setDefaultCount(Long defaultCount) {
this.defaultCount = defaultCount;
}
public Double getChiSquare() {
return chiSquare;
}
public void setChiSquare(Double chiSquare) {
this.chiSquare = chiSquare;
}
}

196
io.sc.engine.mv/src/main/java/io/sc/engine/mv/vo/GeneralResultHistoryVo.java

@ -0,0 +1,196 @@
package io.sc.engine.mv.vo;
import io.sc.engine.mv.CoeResult;
import io.sc.engine.mv.ExecuteMode;
import io.sc.engine.mv.jpa.entity.RuntimeParameter;
import io.sc.platform.orm.api.vo.BaseVo;
import javax.persistence.Transient;
import java.util.ArrayList;
import java.util.List;
public class GeneralResultHistoryVo extends BaseVo {
private String validateDate;
private String modelId;
private String modelName;
private ExecuteMode executeMode;
private Long totalSampleCount;
private Long defaultSampleCount;
private Double auc;
private Double aucQuantitative;
private Double aucQualitative;
private Double ar;
private Double arQuantitative;
private Double arQualitative;
private Double ks;
private Double ksQuantitative;
private Double ksQualitative;
private Double svd;
private Double psi;
private CoeResult chiSquare;
private CoeResult binomial;
//模型验证执行时参数配置
@Transient
private List<RuntimeParameter> runtimeParameters =new ArrayList<RuntimeParameter>();
public String getValidateDate() {
return validateDate;
}
public void setValidateDate(String validateDate) {
this.validateDate = validateDate;
}
public String getModelId() {
return modelId;
}
public void setModelId(String modelId) {
this.modelId = modelId;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public ExecuteMode getExecuteMode() {
return executeMode;
}
public void setExecuteMode(ExecuteMode executeMode) {
this.executeMode = executeMode;
}
public Long getTotalSampleCount() {
return totalSampleCount;
}
public void setTotalSampleCount(Long totalSampleCount) {
this.totalSampleCount = totalSampleCount;
}
public Long getDefaultSampleCount() {
return defaultSampleCount;
}
public void setDefaultSampleCount(Long defaultSampleCount) {
this.defaultSampleCount = defaultSampleCount;
}
public Double getAuc() {
return auc;
}
public void setAuc(Double auc) {
this.auc = auc;
}
public Double getAucQuantitative() {
return aucQuantitative;
}
public void setAucQuantitative(Double aucQuantitative) {
this.aucQuantitative = aucQuantitative;
}
public Double getAucQualitative() {
return aucQualitative;
}
public void setAucQualitative(Double aucQualitative) {
this.aucQualitative = aucQualitative;
}
public Double getAr() {
return ar;
}
public void setAr(Double ar) {
this.ar = ar;
}
public Double getArQuantitative() {
return arQuantitative;
}
public void setArQuantitative(Double arQuantitative) {
this.arQuantitative = arQuantitative;
}
public Double getArQualitative() {
return arQualitative;
}
public void setArQualitative(Double arQualitative) {
this.arQualitative = arQualitative;
}
public Double getKs() {
return ks;
}
public void setKs(Double ks) {
this.ks = ks;
}
public Double getKsQuantitative() {
return ksQuantitative;
}
public void setKsQuantitative(Double ksQuantitative) {
this.ksQuantitative = ksQuantitative;
}
public Double getKsQualitative() {
return ksQualitative;
}
public void setKsQualitative(Double ksQualitative) {
this.ksQualitative = ksQualitative;
}
public Double getSvd() {
return svd;
}
public void setSvd(Double svd) {
this.svd = svd;
}
public Double getPsi() {
return psi;
}
public void setPsi(Double psi) {
this.psi = psi;
}
public CoeResult getChiSquare() {
return chiSquare;
}
public void setChiSquare(CoeResult chiSquare) {
this.chiSquare = chiSquare;
}
public CoeResult getBinomial() {
return binomial;
}
public void setBinomial(CoeResult binomial) {
this.binomial = binomial;
}
public List<RuntimeParameter> getRuntimeParameters() {
return runtimeParameters;
}
public void setRuntimeParameters(List<RuntimeParameter> runtimeParameters) {
this.runtimeParameters = runtimeParameters;
}
}

142
io.sc.engine.mv/src/main/java/io/sc/engine/mv/vo/StPsiHistoryVo.java

@ -0,0 +1,142 @@
package io.sc.engine.mv.vo;
import io.sc.platform.orm.api.vo.BaseVo;
public class StPsiHistoryVo extends BaseVo {
private String validateDate;
private String modelId;
private String modelName;
private Double scoreSegStart;
private Double scoreSegEnd;
private Long countDev;
private Long totalCountDev;
private Double percentDev;
private Long countApp;
private Long totalCountApp;
private Double percentApp;
private Double percentDiff;
private Double percentRate;
private Double weight;
private Double stWeight;
public String getValidateDate() {
return validateDate;
}
public void setValidateDate(String validateDate) {
this.validateDate = validateDate;
}
public String getModelId() {
return modelId;
}
public void setModelId(String modelId) {
this.modelId = modelId;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public Double getScoreSegStart() {
return scoreSegStart;
}
public void setScoreSegStart(Double scoreSegStart) {
this.scoreSegStart = scoreSegStart;
}
public Double getScoreSegEnd() {
return scoreSegEnd;
}
public void setScoreSegEnd(Double scoreSegEnd) {
this.scoreSegEnd = scoreSegEnd;
}
public Long getCountDev() {
return countDev;
}
public void setCountDev(Long countDev) {
this.countDev = countDev;
}
public Long getTotalCountDev() {
return totalCountDev;
}
public void setTotalCountDev(Long totalCountDev) {
this.totalCountDev = totalCountDev;
}
public Double getPercentDev() {
return percentDev;
}
public void setPercentDev(Double percentDev) {
this.percentDev = percentDev;
}
public Long getCountApp() {
return countApp;
}
public void setCountApp(Long countApp) {
this.countApp = countApp;
}
public Long getTotalCountApp() {
return totalCountApp;
}
public void setTotalCountApp(Long totalCountApp) {
this.totalCountApp = totalCountApp;
}
public Double getPercentApp() {
return percentApp;
}
public void setPercentApp(Double percentApp) {
this.percentApp = percentApp;
}
public Double getPercentDiff() {
return percentDiff;
}
public void setPercentDiff(Double percentDiff) {
this.percentDiff = percentDiff;
}
public Double getPercentRate() {
return percentRate;
}
public void setPercentRate(Double percentRate) {
this.percentRate = percentRate;
}
public Double getWeight() {
return weight;
}
public void setWeight(Double weight) {
this.weight = weight;
}
public Double getStWeight() {
return stWeight;
}
public void setStWeight(Double stWeight) {
this.stWeight = stWeight;
}
}

35
io.sc.platform.core/src/main/java/io/sc/platform/core/util/StringUtil.java

@ -1088,29 +1088,16 @@ public class StringUtil {
}
/**
* 用指定的字符串链接字符串列表
* 用指定的字符串链接字符串集合
* @param splitor 指定的字符串
* @param list 字符串列表
* @param collection 字符串集合
* @return 链接后的字符串
*/
public static String combine(String splitor,List<String> list){
if(list==null || list.isEmpty()){
return null;
}
return combine(splitor,list.toArray(new String[]{}));
}
/**
* 用指定的字符串链接字符串列表
* @param splitor 指定的字符串
* @param set 字符串列表
* @return 链接后的字符串
*/
public static String combine(String splitor,Set<String> set){
if(set==null || set.isEmpty()){
public static String combine(String splitor,Collection<String> collection){
if(collection==null || collection.isEmpty()){
return null;
}
return combine(splitor,set.toArray(new String[]{}));
return combine(splitor,collection.toArray(new String[]{}));
}
/**
@ -1154,16 +1141,16 @@ public class StringUtil {
}
/**
* 用指定的字符串链接字符串列表(反序)
* @param list 字符串列表
* 用指定的字符串链接字符串集合(反序)
* @param collection 字符串集合
* @param splitor 指定的字符串
* @return 链接后的字符串
*/
public static String reverseCombine(List<String> list, String splitor){
if(list==null || list.isEmpty()){
public static String reverseCombine(String splitor,Collection<String> collection){
if(collection==null || collection.isEmpty()){
return null;
}
return reverseCombine(list.toArray(new String[]{}),splitor);
return reverseCombine(splitor,collection.toArray(new String[]{}));
}
/**
@ -1172,7 +1159,7 @@ public class StringUtil {
* @param splitor 指定的字符串
* @return 链接后的字符串
*/
public static String reverseCombine(String[] list, String splitor){
public static String reverseCombine(String splitor,String[] list){
if(list==null || list.length==0){
return null;
}

13
io.sc.platform.data/src/main/java/io/sc/platform/data/csv/CsvItemProcessor.java

@ -0,0 +1,13 @@
package io.sc.platform.data.csv;
import io.sc.platform.data.ItemProcessor;
import java.math.BigDecimal;
public class CsvItemProcessor implements ItemProcessor<Record, Record> {
@Override
public Record process(Record item) throws Exception {
System.out.println(item.get("CUSTOMER_ID") + "," + item.get("SCORE", BigDecimal.class) + "," + item.get("LEVEL",Integer.class) + "," + item.get("IS_DEFAULT",Boolean.class));
return item;
}
}

99
io.sc.platform.data/src/main/java/io/sc/platform/data/csv/CsvItemReader.java

@ -0,0 +1,99 @@
package io.sc.platform.data.csv;
import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
import io.sc.platform.data.ItemReader;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.util.StringUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Iterator;
public class CsvItemReader implements ItemReader<Record> {
private String resourceUrl;
private int skipLines;
private String splitChar;
private CSVReader reader;
private Iterator<String[]> iterator;
private RecordMapper mapper;
public CsvItemReader(RecordMapper mapper){
this.mapper =mapper;
}
@Override
public void init() throws IOException {
if(!StringUtils.hasText(resourceUrl)){
throw new IOException("resourceUrl is not defined");
}
Resource resource =new DefaultResourceLoader().getResource(resourceUrl);
if(resource==null|| !resource.exists()){
throw new IOException("resource '" + resourceUrl + "' is not exists");
}
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
reader = new CSVReaderBuilder(bufferedReader)
.withSkipLines(this.skipLines)
.build();
iterator = reader.iterator();
}
@Override
public boolean hasNext() throws IOException {
return iterator.hasNext();
}
@Override
public Record read() throws IOException {
return new Record(mapper,iterator.next());
}
@Override
public void close() throws IOException {
if(reader!=null) {
reader.close();
}
}
public String getResourceUrl() {
return resourceUrl;
}
public void setResourceUrl(String resourceUrl) {
this.resourceUrl = resourceUrl;
}
public int getSkipLines() {
return skipLines;
}
public void setSkipLines(int skipLines) {
this.skipLines = skipLines;
}
public String getSplitChar() {
return splitChar;
}
public void setSplitChar(String splitChar) {
this.splitChar = splitChar;
}
public CSVReader getReader() {
return reader;
}
public void setReader(CSVReader reader) {
this.reader = reader;
}
public Iterator<String[]> getIterator() {
return iterator;
}
public void setIterator(Iterator<String[]> iterator) {
this.iterator = iterator;
}
}

23
io.sc.platform.data/src/main/java/io/sc/platform/data/csv/CsvItemWriter.java

@ -0,0 +1,23 @@
package io.sc.platform.data.csv;
import io.sc.platform.data.ItemWriter;
import java.io.IOException;
import java.util.List;
public class CsvItemWriter implements ItemWriter<Record> {
@Override
public void init() throws IOException {
}
@Override
public void write(List<Record> items) throws IOException {
}
@Override
public void close() throws IOException {
}
}

8
io.sc.platform.data/src/main/java/io/sc/platform/data/db/DbItemProcessor.java

@ -0,0 +1,8 @@
package io.sc.platform.data.db;
import io.sc.platform.data.ItemProcessor;
import io.sc.platform.data.csv.Record;
public abstract class DbItemProcessor<S,T> implements ItemProcessor<S, T> {
}

99
io.sc.platform.data/src/main/java/io/sc/platform/data/db/DbItemReader.java

@ -0,0 +1,99 @@
package io.sc.platform.data.db;
import io.sc.platform.data.ItemReader;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public abstract class DbItemReader<S> implements ItemReader<S> {
protected DataSource datasource;
protected String tableName;
protected String sql;
protected int fetchSize;
protected Connection conn;
protected Statement statement;
protected ResultSet rs;
@Override
public void init() throws IOException {
try {
statement =conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
statement.setFetchSize(fetchSize);
rs =statement.executeQuery(sql);
}catch (SQLException e){
throw new IOException(e);
}
}
@Override
public boolean hasNext() throws IOException {
try {
return rs.next();
}catch (SQLException e){
throw new IOException(e);
}
}
@Override
public void close() throws IOException {
SQLException exceptionRs =null;
SQLException exceptionStatement =null;
SQLException exceptionConnection =null;
try{
rs.close();
}catch (SQLException e){
exceptionRs =e;
}
try{
statement.close();
}catch (SQLException e){
exceptionStatement =e;
}
try {
conn.close();
} catch (SQLException e) {
exceptionConnection =e;
}
if(exceptionRs!=null || exceptionStatement!=null || exceptionConnection!=null){
SQLException exception =exceptionRs!=null?exceptionRs:exceptionStatement!=null?exceptionStatement:exceptionConnection!=null?exceptionConnection:null;
throw new IOException(exception);
}
}
public DataSource getDatasource() {
return datasource;
}
public void setDatasource(DataSource datasource) {
this.datasource = datasource;
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
public int getFetchSize() {
return fetchSize;
}
public void setFetchSize(int fetchSize) {
this.fetchSize = fetchSize;
}
}

43
io.sc.platform.data/src/main/java/io/sc/platform/data/db/DbItemWriter.java

@ -0,0 +1,43 @@
package io.sc.platform.data.db;
import io.sc.platform.data.ItemWriter;
import javax.sql.DataSource;
import java.io.IOException;
import java.util.List;
public abstract class DbItemWriter<T> implements ItemWriter<T> {
protected DataSource datasource;
protected String tableName;
@Override
public void init() throws IOException {
}
@Override
public void write(List<T> items) throws IOException {
}
@Override
public void close() throws IOException {
}
public DataSource getDatasource() {
return datasource;
}
public void setDatasource(DataSource datasource) {
this.datasource = datasource;
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
}

90
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/springboot/SpringbootAutoConfigurationWebController.java

@ -0,0 +1,90 @@
package io.sc.platform.developer.controller.springboot;
import io.sc.platform.developer.wrapper.springboot.AutoConfigurationWrapper;
import io.sc.platform.orm.service.support.QueryParameter;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.autoconfigure.condition.ConditionsReportEndpoint;
import org.springframework.boot.actuate.autoconfigure.condition.ConditionsReportEndpoint.ApplicationConditionEvaluation;
import org.springframework.boot.actuate.autoconfigure.condition.ConditionsReportEndpoint.ContextConditionEvaluation;
import org.springframework.boot.actuate.autoconfigure.condition.ConditionsReportEndpoint.MessageAndCondition;
import org.springframework.boot.actuate.autoconfigure.condition.ConditionsReportEndpoint.MessageAndConditions;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping("/api/developer/springboot/autoConfiguration")
public class SpringbootAutoConfigurationWebController {
@Autowired private ConditionsReportEndpoint conditionsReportEndpoint;
@GetMapping("")
@ResponseBody
public Page<AutoConfigurationWrapper> autoConfiguration(QueryParameter queryParameter){
List<AutoConfigurationWrapper> result =new ArrayList<AutoConfigurationWrapper>();
ApplicationConditionEvaluation applicationConditionEvaluation =conditionsReportEndpoint.applicationConditionEvaluation();
Map<String, ContextConditionEvaluation> contextConditionEvaluationMap =applicationConditionEvaluation.getContexts();
if(contextConditionEvaluationMap!=null && contextConditionEvaluationMap.size()>0) {
for(String contextName : contextConditionEvaluationMap.keySet()) {
ContextConditionEvaluation contextConditionEvaluation =contextConditionEvaluationMap.get(contextName);
Map<String, List<MessageAndCondition>> positiveMatches =contextConditionEvaluation.getPositiveMatches();
if(positiveMatches!=null && positiveMatches.size()>0) {
for(String key : positiveMatches.keySet()) {
List<MessageAndCondition> messageAndConditions =positiveMatches.get(key);
if(messageAndConditions!=null && messageAndConditions.size()>0) {
for(MessageAndCondition messageAndCondition : messageAndConditions) {
AutoConfigurationWrapper wrapper =new AutoConfigurationWrapper();
wrapper.setContext(contextName);
wrapper.setName(key);
wrapper.setPositiveAndNegativeType(AutoConfigurationWrapper.PositiveAndNegativeType.Positive);
wrapper.setCondition(messageAndCondition.getCondition());
wrapper.setMessage(messageAndCondition.getMessage());
result.add(wrapper);
}
}
}
}
Map<String, MessageAndConditions> negativeMatches =contextConditionEvaluation.getNegativeMatches();
if(negativeMatches!=null && negativeMatches.size()>0) {
for(String key : negativeMatches.keySet()) {
MessageAndConditions messageAndCondition =negativeMatches.get(key);
List<MessageAndCondition> matcheds =messageAndCondition.getMatched();
if(matcheds!=null && matcheds.size()>0) {
for(MessageAndCondition matched : matcheds) {
AutoConfigurationWrapper wrapper =new AutoConfigurationWrapper();
wrapper.setContext(contextName);
wrapper.setName(key);
wrapper.setPositiveAndNegativeType(AutoConfigurationWrapper.PositiveAndNegativeType.Positive);
wrapper.setMatchedAndNotMatchedType(AutoConfigurationWrapper.MatchedAndNotMatchedType.Matched);
wrapper.setCondition(matched.getCondition());
wrapper.setMessage(matched.getMessage());
result.add(wrapper);
}
}
List<MessageAndCondition> notMatcheds =messageAndCondition.getNotMatched();
if(notMatcheds!=null && notMatcheds.size()>0) {
for(MessageAndCondition notMatched : notMatcheds) {
AutoConfigurationWrapper wrapper =new AutoConfigurationWrapper();
wrapper.setContext(contextName);
wrapper.setName(key);
wrapper.setPositiveAndNegativeType(AutoConfigurationWrapper.PositiveAndNegativeType.Positive);
wrapper.setMatchedAndNotMatchedType(AutoConfigurationWrapper.MatchedAndNotMatchedType.NotMatched);
wrapper.setCondition(notMatched.getCondition());
wrapper.setMessage(notMatched.getMessage());
result.add(wrapper);
}
}
}
}
}
}
return QueryResult.page(result,queryParameter);
}
}

57
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/springboot/SpringbootEnvironmentWebController.java

@ -0,0 +1,57 @@
package io.sc.platform.developer.controller.springboot;
import io.sc.platform.developer.wrapper.springboot.EnvironmentWrapper;
import io.sc.platform.orm.service.support.QueryParameter;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.env.EnvironmentEndpoint;
import org.springframework.boot.actuate.env.EnvironmentEndpoint.EnvironmentDescriptor;
import org.springframework.boot.actuate.env.EnvironmentEndpoint.PropertySourceDescriptor;
import org.springframework.boot.actuate.env.EnvironmentEndpoint.PropertyValueDescriptor;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping("/api/developer/springboot/environment")
public class SpringbootEnvironmentWebController {
@Autowired private EnvironmentEndpoint endpoint;
@GetMapping("")
@ResponseBody
public Page<EnvironmentWrapper> environment(QueryParameter queryParameter){
List<EnvironmentWrapper> result =new ArrayList<EnvironmentWrapper>();
EnvironmentDescriptor environmentDescriptor =endpoint.environment("\\w+");
List<PropertySourceDescriptor> propertySourceDescriptors =environmentDescriptor.getPropertySources();
if(propertySourceDescriptors!=null && propertySourceDescriptors.size()>0) {
for(PropertySourceDescriptor propertySourceDescriptor : propertySourceDescriptors) {
String propertySourceName =propertySourceDescriptor.getName();
if(propertySourceName.contains("application.properties")){
propertySourceName ="application.properties";
}
Map<String, PropertyValueDescriptor> map =propertySourceDescriptor.getProperties();
if(map!=null && map.size()>0) {
for(String name : map.keySet()) {
PropertyValueDescriptor propertyValueDescriptor =map.get(name);
String origin =propertyValueDescriptor.getOrigin();
Object value =propertyValueDescriptor.getValue();
EnvironmentWrapper wrapper =new EnvironmentWrapper();
wrapper.setPropertySourceName(propertySourceName);
wrapper.setPropertyName(name);
wrapper.setOrigin(origin);
wrapper.setValue(value);
result.add(wrapper);
}
}
}
}
return QueryResult.page(result,queryParameter);
}
}

110
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/springboot/SpringbootRequestMappingWebController.java

@ -1,14 +1,19 @@
package io.sc.platform.developer.controller.springboot;
import io.sc.platform.developer.wrapper.springboot.BeanWrapper;
import io.sc.platform.developer.wrapper.springboot.DespatcherServletWrapper;
import io.sc.platform.developer.wrapper.springboot.FilterWrapper;
import io.sc.platform.developer.wrapper.springboot.MappingWrapper;
import io.sc.platform.developer.wrapper.springboot.ServletWrapper;
import io.sc.platform.orm.service.support.QueryParameter;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.web.mappings.HandlerMethodDescription;
import org.springframework.boot.actuate.web.mappings.MappingsEndpoint;
import org.springframework.boot.actuate.web.mappings.MappingsEndpoint.ApplicationMappings;
import org.springframework.boot.actuate.web.mappings.MappingsEndpoint.ContextMappings;
import org.springframework.boot.actuate.web.mappings.servlet.*;
import org.springframework.boot.actuate.web.mappings.servlet.RequestMappingConditionsDescription.MediaTypeExpressionDescription;
import org.springframework.boot.actuate.web.mappings.servlet.RequestMappingConditionsDescription.NameValueExpressionDescription;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -24,63 +29,96 @@ public class SpringbootRequestMappingWebController {
@GetMapping("dispatcherServletMappingDescriptions")
@ResponseBody
public List<DispatcherServletMappingDescription> dispatcherServletMappingDescriptions(QueryParameter queryParameter){
List<DispatcherServletMappingDescription> result =new ArrayList<>();
public Page<MappingWrapper> dispatcherServletMappingDescriptions(QueryParameter queryParameter){
List<MappingWrapper> result =new ArrayList<>();
ApplicationMappings applicationMappings =mappingsEndpoint.mappings();
Map<String, ContextMappings> contexts =applicationMappings.getContexts();
for(Map.Entry<String, ContextMappings> contextEntry : contexts.entrySet()) {
ContextMappings contextMappings = contextEntry.getValue();
Map<String, Object> mappings = contextMappings.getMappings();
for (Map.Entry<String, Object> mapping : mappings.entrySet()) {
String name = mapping.getKey();
Map<String, ContextMappings> contextMappingMap =applicationMappings.getContexts();
for(Map.Entry<String, ContextMappings> contextMappingEntry : contextMappingMap.entrySet()) {
ContextMappings contextMappings = contextMappingEntry.getValue();
Map<String, Object> mappingMap = contextMappings.getMappings();
for (Map.Entry<String, Object> mappingEntry : mappingMap.entrySet()) {
String name = mappingEntry.getKey();
if ("dispatcherServlets".equalsIgnoreCase(name)) {
Map<String, List<DispatcherServletMappingDescription>> dispatcherServletMappings = (Map<String, List<DispatcherServletMappingDescription>>) mapping.getValue();
for(Map.Entry<String, List<DispatcherServletMappingDescription>> dispatcherServletMapping : dispatcherServletMappings.entrySet()) {
result.addAll(dispatcherServletMapping.getValue());
Map<String, List<DispatcherServletMappingDescription>> map = (Map<String, List<DispatcherServletMappingDescription>>) mappingEntry.getValue();
if(map!=null && !map.isEmpty()) {
for (Map.Entry<String, List<DispatcherServletMappingDescription>> entry : map.entrySet()) {
List<DispatcherServletMappingDescription> descriptions = entry.getValue();
if(descriptions!=null && !descriptions.isEmpty()) {
for (DispatcherServletMappingDescription description : descriptions) {
DispatcherServletMappingDetails details = description.getDetails();
if(details!=null) {
RequestMappingConditionsDescription conditions = details.getRequestMappingConditions();
HandlerMethodDescription handler = details.getHandlerMethod();
Set<RequestMethod> httpMethod = conditions.getMethods();
Set<String> patterns = conditions.getPatterns();
List<MediaTypeExpressionDescription> consumes = conditions.getConsumes();
List<MediaTypeExpressionDescription> produces = conditions.getProduces();
List<NameValueExpressionDescription> headers = conditions.getHeaders();
List<NameValueExpressionDescription> params = conditions.getParams();
result.add(new MappingWrapper(handler, httpMethod, patterns, consumes, produces, headers, params));
}
}
}
}
}
}
}
}
return result;
return QueryResult.page(result,queryParameter);
}
@GetMapping("filterRegistrationMappingDescriptions")
@ResponseBody
public List<FilterRegistrationMappingDescription> filterRegistrationMappingDescriptions(QueryParameter queryParameter){
List<FilterRegistrationMappingDescription> result =new ArrayList<>();
public Page<FilterWrapper> filterRegistrationMappingDescriptions(QueryParameter queryParameter){
List<FilterWrapper> result =new ArrayList<>();
ApplicationMappings applicationMappings =mappingsEndpoint.mappings();
Map<String, ContextMappings> contexts =applicationMappings.getContexts();
for(Map.Entry<String, ContextMappings> contextEntry : contexts.entrySet()) {
ContextMappings contextMappings = contextEntry.getValue();
Map<String, Object> mappings = contextMappings.getMappings();
for (Map.Entry<String, Object> mapping : mappings.entrySet()) {
String name = mapping.getKey();
Map<String, ContextMappings> contextMappingMap =applicationMappings.getContexts();
for(Map.Entry<String, ContextMappings> contextMappingEntry : contextMappingMap.entrySet()) {
ContextMappings contextMappings = contextMappingEntry.getValue();
Map<String, Object> mappingMap = contextMappings.getMappings();
for (Map.Entry<String, Object> mappingEntry : mappingMap.entrySet()) {
String name = mappingEntry.getKey();
if ("servletFilters".equalsIgnoreCase(name)) {
List<FilterRegistrationMappingDescription> filters =(List<FilterRegistrationMappingDescription>)mapping.getValue();
result.addAll(filters);
List<FilterRegistrationMappingDescription> filters =(List<FilterRegistrationMappingDescription>)mappingEntry.getValue();
if(filters!=null && !filters.isEmpty()) {
for(FilterRegistrationMappingDescription filter : filters){
String className =filter.getClassName();
Collection<String> patterns =filter.getUrlPatternMappings();
String registeredName =filter.getName();
Collection<String> mappingNames =filter.getServletNameMappings();
result.add(new FilterWrapper(registeredName, patterns,className));
}
}
}
}
}
return result;
return QueryResult.page(result,queryParameter);
}
@GetMapping("servletRegistrationMappingDescriptions")
@ResponseBody
public List<ServletRegistrationMappingDescription> servletRegistrationMappingDescriptions(QueryParameter queryParameter){
List<ServletRegistrationMappingDescription> result =new ArrayList<>();
public Page<ServletWrapper> servletRegistrationMappingDescriptions(QueryParameter queryParameter){
List<ServletWrapper> result =new ArrayList<>();
ApplicationMappings applicationMappings =mappingsEndpoint.mappings();
Map<String, ContextMappings> contexts =applicationMappings.getContexts();
for(Map.Entry<String, ContextMappings> contextEntry : contexts.entrySet()) {
ContextMappings contextMappings = contextEntry.getValue();
Map<String, Object> mappings = contextMappings.getMappings();
for (Map.Entry<String, Object> mapping : mappings.entrySet()) {
String name = mapping.getKey();
Map<String, ContextMappings> contextMappingMap =applicationMappings.getContexts();
for(Map.Entry<String, ContextMappings> contextMappingEntry : contextMappingMap.entrySet()) {
ContextMappings contextMappings = contextMappingEntry.getValue();
Map<String, Object> mappingMap = contextMappings.getMappings();
for (Map.Entry<String, Object> mappingEntry : mappingMap.entrySet()) {
String name = mappingEntry.getKey();
if ("servlets".equalsIgnoreCase(name)) {
List<ServletRegistrationMappingDescription> servlets =(List<ServletRegistrationMappingDescription>)mapping.getValue();
result.addAll(servlets);
List<ServletRegistrationMappingDescription> servlets =(List<ServletRegistrationMappingDescription>)mappingEntry.getValue();
if(servlets!=null && !servlets.isEmpty()) {
for(ServletRegistrationMappingDescription servlet : servlets){
String servletName =servlet.getName();
Collection<String> patterns =servlet.getMappings();
String className =servlet.getClassName();
result.add(new ServletWrapper(servletName, patterns,className));
}
}
}
}
}
return result;
return QueryResult.page(result,queryParameter);
}
}

44
io.sc.platform.developer/src/main/java/io/sc/platform/developer/wrapper/springboot/DespatcherServletWrapper.java

@ -1,44 +0,0 @@
package io.sc.platform.developer.wrapper.springboot;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.Set;
public class DespatcherServletWrapper {
private String className;
private String methodName;
private Set<RequestMethod> httpMethods;
private Set<String> patterns;
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public Set<RequestMethod> getHttpMethods() {
return httpMethods;
}
public void setHttpMethods(Set<RequestMethod> httpMethods) {
this.httpMethods = httpMethods;
}
public Set<String> getPatterns() {
return patterns;
}
public void setPatterns(Set<String> patterns) {
this.patterns = patterns;
}
}

41
io.sc.platform.developer/src/main/java/io/sc/platform/developer/wrapper/springboot/ServletWrapper.java

@ -0,0 +1,41 @@
package io.sc.platform.developer.wrapper.springboot;
import io.sc.platform.core.util.StringUtil;
import java.util.Collection;
public class ServletWrapper {
private String name;
private String patterns;
private String className;
public ServletWrapper(String name, Collection<String> patterns, String className) {
this.name = name;
this.patterns = StringUtil.combine(",", patterns);
this.className = className;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPatterns() {
return patterns;
}
public void setPatterns(String patterns) {
this.patterns = patterns;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}

77
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/util/SqlTypeUtil.java

@ -36,11 +36,11 @@ public class SqlTypeUtil {
case Types.CHAR:
case Types.VARCHAR:
case Types.LONGVARCHAR:
case Types.NCHAR:
case Types.NVARCHAR:
case Types.LONGNVARCHAR:
case Types.BIT:
case Types.TINYINT:
case Types.SMALLINT:
@ -98,7 +98,7 @@ public class SqlTypeUtil {
return sqlXml.getString();
}
return null;
//case Types.NULL:
//case Types.OTHER:
//case Types.JAVA_OBJECT:
@ -113,7 +113,7 @@ public class SqlTypeUtil {
throw new RuntimeException(fieldName + " field's type is NOT supported");
}
}
/**
* 获取 SQL 对应的 Java 对象
* @param connection 数据库连接
@ -131,7 +131,7 @@ public class SqlTypeUtil {
case Types.CHAR:
case Types.VARCHAR:
case Types.LONGVARCHAR:
case Types.NCHAR:
case Types.NVARCHAR:
case Types.LONGNVARCHAR:
@ -195,7 +195,7 @@ public class SqlTypeUtil {
return null;
}
}
/**
* 获取 SQL 类型名称
* @param type 类型
@ -236,7 +236,7 @@ public class SqlTypeUtil {
case Types.DECIMAL:
return "java.sql.Types.DECIMAL";
case Types.DATE:
return "java.sql.Types.DATE";
return "java.sql.Types.DATE";
case Types.TIME:
return "java.sql.Types.TIME";
case Types.TIME_WITH_TIMEZONE:
@ -285,4 +285,67 @@ public class SqlTypeUtil {
return null;
}
}
public static Class<?> getJavaType(int sqlType) {
switch(sqlType) {
case Types.CHAR:
case Types.VARCHAR:
case Types.LONGVARCHAR:
case Types.NCHAR:
case Types.NVARCHAR:
case Types.LONGNVARCHAR:
return String.class;
case Types.BIT:
return Byte.class;
case Types.TINYINT:
case Types.SMALLINT:
return Short.class;
case Types.INTEGER:
return Integer.class;
case Types.BIGINT:
return Long.class;
case Types.FLOAT:
case Types.REAL:
return Float.class;
case Types.DOUBLE:
return Double.class;
case Types.NUMERIC:
case Types.DECIMAL:
return BigDecimal.class;
case Types.DATE:
return java.sql.Date.class;
case Types.TIME:
case Types.TIME_WITH_TIMEZONE:
return java.sql.Time.class;
case Types.TIMESTAMP:
case Types.TIMESTAMP_WITH_TIMEZONE:
return java.sql.Timestamp.class;
case Types.BINARY:
case Types.VARBINARY:
case Types.LONGVARBINARY:
return byte[].class;
case Types.BLOB:
return byte[].class;
case Types.CLOB:
case Types.NCLOB:
return String.class;
case Types.BOOLEAN:
return Boolean.class;
case Types.SQLXML:
return String.class;
//case Types.NULL:
//case Types.OTHER:
//case Types.JAVA_OBJECT:
//case Types.DISTINCT:
//case Types.STRUCT:
//case Types.ARRAY:
//case Types.REF:
//case Types.DATALINK:
//case Types.ROWID:
//case Types.REF_CURSOR:
default:
return null;
}
}
}

68
io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/DefaultQueryResultSorter.java

@ -0,0 +1,68 @@
package io.sc.platform.orm.service.support;
import org.springframework.data.util.DirectFieldAccessFallbackBeanWrapper;
import java.util.Comparator;
public class DefaultQueryResultSorter<T> implements QueryResultSorter<T>{
@Override
public Comparator<T> getComparator(String propertyName, boolean isAscending) {
return new AscComparator<T>(propertyName,isAscending);
}
static class AscComparator<T> implements Comparator<T>{
private String propertyName;
private boolean isAscending;
public AscComparator(String propertyName,boolean isAscending){
this.propertyName =propertyName;
this.isAscending =isAscending;
}
@Override
public int compare(T o1, T o2) {
int direction =isAscending?1:-1;
if(o1!=null && o2==null){
return 1*direction;
}
if(o1==null && o2!=null){
return -1*direction;
}
if(o1==null && o2==null){
return 0;
}
DirectFieldAccessFallbackBeanWrapper e1 = new DirectFieldAccessFallbackBeanWrapper(o1);
DirectFieldAccessFallbackBeanWrapper e2 = new DirectFieldAccessFallbackBeanWrapper(o2);
Object v1 =e1.getPropertyValue(propertyName);
Object v2 =e2.getPropertyValue(propertyName);
if(v1!=null && v2==null){
return 1*direction;
}
if(v1==null && v2!=null){
return -1*direction;
}
if(v1==null && v2==null){
return 0;
}
Comparable c1 =null;
Comparable c2 =null;
if(Comparable.class.isAssignableFrom(v1.getClass())){
c1 =(Comparable)v1;
}
if(Comparable.class.isAssignableFrom(v1.getClass())){
c2 =(Comparable)v2;
}
if(c1!=null && c2!=null){
if(v1.getClass().equals(v2.getClass())) {
return c1.compareTo(c2) * direction;
}else{
return v1.toString().compareTo(v2.toString())*direction;
}
}else {
return v1.toString().compareTo(v2.toString())*direction;
}
}
}
}
Loading…
Cancel
Save