提交 eb3b263d authored 作者: czq's avatar czq

czq

...@@ -4,6 +4,8 @@ target/ ...@@ -4,6 +4,8 @@ target/
**/lib/** **/lib/**
**/.DS_Store **/.DS_Store
./2020-**-**/**
!**/src/main/** !**/src/main/**
!**/src/test/** !**/src/test/**
mvnw mvnw
......
package com.zjty.inspect.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MvcConfig {
public WebMvcConfigurer webMvcConfigurer(){
return new WebMvcConfigurer() {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/freemaker/**").addResourceLocations("file:/opt/inspect/freemaker/");
}
};
}
}
package com.zjty.inspect.controller;
import com.zjty.inspect.entity.Config;
import com.zjty.inspect.entity.RuleQo;
import com.zjty.inspect.service.ConfigService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@Slf4j
@RestController
@RequestMapping("/config")
@Api(value = "参数配置接口管理接口",description = "参数配置管理接口,提供页面的增、删、改、查")
public class ConfigController {
@Autowired
private ConfigService configService;
/**
* 查询所有参数配置
* @return 参数配置
*/
@ApiOperation("查询所有参数配置")
@GetMapping
public ResponseEntity getConfigs(){
return ResponseEntity.ok(configService.findAll());
}
/**
* 根据name修改参数
* @param config 参数
* @param name name
* @return
*/
@PostMapping(value = "/{name}")
@ApiOperation("根据name修改参数")
public ResponseEntity update(@RequestBody Config config, @PathVariable String name){
config.setName(name);
configService.updateConfig(config);
return ResponseEntity.ok(200);
}
}
...@@ -11,6 +11,7 @@ import com.zjty.inspect.utils.*; ...@@ -11,6 +11,7 @@ import com.zjty.inspect.utils.*;
import freemarker.template.TemplateException; import freemarker.template.TemplateException;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItem; import org.apache.tomcat.util.http.fileupload.disk.DiskFileItem;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -25,11 +26,13 @@ import java.util.*; ...@@ -25,11 +26,13 @@ import java.util.*;
/** /**
* 评估接口 * 评估接口
*
* @author mcj * @author mcj
*/ */
@Slf4j
@RestController @RestController
@RequestMapping("/inspect") @RequestMapping("/inspect")
@Api(value = "评估接口管理接口",description = "评估管理接口,提供页面的增、删、改、查") @Api(value = "评估接口管理接口", description = "评估管理接口,提供页面的增、删、改、查")
public class InspectController { public class InspectController {
@Autowired @Autowired
private InspectService inspectService; private InspectService inspectService;
...@@ -42,32 +45,35 @@ public class InspectController { ...@@ -42,32 +45,35 @@ public class InspectController {
@Autowired @Autowired
private ReportService reportService; private ReportService reportService;
/** /**
* 上传代码进行评估 * 上传代码进行评估
*
* @param years 系统开发时间 * @param years 系统开发时间
* @param systemFund 系统开发费用 * @param systemFund 系统开发费用
* @param modules 模块数 * @param modules 模块数
* @param valid 预算数据是否可用 * @param valid 预算数据是否可用
* @param framework 架构 * @param framework 架构
* @param safety 安全能力 * @param safety 安全能力
* @param disaster 容灾能力 * @param disaster 容灾能力
* @param data 数据量 * @param data 数据量
* @param admin 是否管理员 * @param admin 是否管理员
* @param multfile 文件 * @param multfile 文件
* @return * @return
* @throws IOException * @throws IOException
*/ */
@PostMapping("/path") @PostMapping("/path")
@ApiOperation("上传代码进行评估") @ApiOperation("上传代码进行评估")
public ResponseEntity inspect(Integer years,Integer systemFund,Integer modules public ResponseEntity inspect(Integer years, Integer systemFund, Integer modules
,String valid,Integer framework,Integer safety,Integer disaster,Integer data , String valid, Integer framework, Integer safety, Integer disaster, Integer data
,Integer admin,String projectName,Integer tables,String databaseType,Integer method, MultipartFile multfile) throws IOException { , Integer admin, String projectName, Integer tables, String databaseType, Integer method, String username, MultipartFile multfile) throws IOException {
File file = FileUtil.saveToLocal(multfile); File file = FileUtil.saveToLocal(multfile);
log.info("inspect:代码解压完成,地址为{}", file.getCanonicalPath());
InspectParameter inspectParameter = new InspectParameter(); InspectParameter inspectParameter = new InspectParameter();
inspectParameter.setSourceAddress(file.getCanonicalPath());
inspectParameter.setUsername(username);
inspectParameter.setSystemFund(systemFund); inspectParameter.setSystemFund(systemFund);
inspectParameter.setAdmin(admin);
inspectParameter.setModules(modules); inspectParameter.setModules(modules);
inspectParameter.setSafety(safety); inspectParameter.setSafety(safety);
inspectParameter.setTables(tables); inspectParameter.setTables(tables);
...@@ -76,67 +82,67 @@ public class InspectController { ...@@ -76,67 +82,67 @@ public class InspectController {
inspectParameter.setDisaster(disaster); inspectParameter.setDisaster(disaster);
inspectParameter.setData(data); inspectParameter.setData(data);
inspectParameter.setFramework(framework); inspectParameter.setFramework(framework);
inspectParameter.setPath(file.getCanonicalPath());
inspectParameter.setRecastMethod(method);
inspectParameter.setId(UUIDUtil.getUUID()); inspectParameter.setId(UUIDUtil.getUUID());
inspectParameter.setAdmin(admin);
inspectParameter.setSystemFund(systemFund);
inspectParameter.setRecastMethod(method);
inspectParameter.setSourceAddress(file.getCanonicalPath());
ReportVo reportVo = new ReportVo(); ReportVo reportVo = new ReportVo();
int count = technologyService.findAllTechnologyCount();
reportVo.setTechnologiesNum(count);
int support = technologyService.findAllTechnologyNotSupport();
reportVo.setTechnologiesRepair(support);
reportVo.setId(RandomUtil.getRandom()); reportVo.setId(RandomUtil.getRandom());
reportVo.setUploadType("文件上传"); reportVo.setUploadType("文件上传");
reportVo.setFileName(file.getName()); reportVo.setFileName(file.getName());
reportVo.setProjectName(projectName); reportVo.setProjectName(projectName);
reportVo.setSourceAddress(file.getCanonicalPath()); reportVo.setSourceAddress(file.getCanonicalPath());
reportVo.setDatabaseType(databaseType); reportVo.setDatabaseType(databaseType);
ReportVo inspect = inspectService.inspect(reportVo, inspectParameter);
ReportVo inspect = inspectService.inspect(reportVo,inspectParameter); int count = technologyService.findAllTechnologyCount();
reportVo.setTechnologiesNum(count);
Map map=new HashMap(); int support = technologyService.findAllTechnologyNotSupport();
map.put("inspect",inspect); reportVo.setTechnologiesRepair(support);
map.put("time",TimeUtil.getTime()); log.info("inspect:代码评估完成");
HashMap<String, List<Warn>> warnMap = inspect.getWarnDetails(); // Map map = new HashMap();
List<Technology> technologies = inspect.getTechnologies(); // map.put("inspect", inspect);
Map techMap=new HashMap(); // map.put("time", TimeUtil.getTime());
for (Technology technology : technologies) { // HashMap<String, List<Warn>> warnMap = inspect.getWarnDetails();
techMap.put(technology.getTechnologyName(),technology.getSupport()); // List<Technology> technologies = inspect.getTechnologies();
} // Map techMap = new HashMap();
map.put("techMap",techMap); // for (Technology technology : technologies) {
map.put("warnMap",warnMap); // techMap.put(technology.getTechnologyName(), technology.getSupport());
map.put("technologies",technologies); // }
try { // map.put("techMap", techMap);
String template = FreemarkerUtils.getTemplate("pg.ftl", map); // map.put("warnMap", warnMap);
String s = inspectService.generateHtml(template, map); // map.put("technologies", technologies);
String filePath = FileUtil.createFilePath(); // try {
File file1 = new File("./pgbg/" + filePath + "/" + file.getName() + ".html"); // String template = FreemarkerUtils.getTemplate("pg.ftl", map);
FileUtil.write(s,"./pgbg/"+filePath+"/"+file.getName()+".html"); // String s = inspectService.generateHtml(template, map);
reportVo.setHtmlAddress(file1.getCanonicalPath()); // String filePath = FileUtil.createFilePath();
System.out.println("内容"+s); // File file1 = new File("./pgbg/" + filePath + "/" + file.getName() + ".html");
} catch (TemplateException e) { // FileUtil.write(s,"./pgbg/"+filePath+"/"+file.getName()+".html");
e.printStackTrace(); // reportVo.setHtmlAddress(file1.getCanonicalPath());
} // System.out.println("内容"+s);
// } catch (TemplateException e) {
// e.printStackTrace();
// }
Report report = new Report(); Report report = new Report();
String random = RandomUtil.getRandom(); String random = RandomUtil.getRandom();
report.setId(RandomUtil.getRandom()); report.setId(RandomUtil.getRandom());
report.setHtmlAddress(reportVo.getHtmlAddress()); report.setHtmlAddress(reportVo.getHtmlAddress());
reportService.saveReport(report); reportService.saveReport(report);
inspectParameter.setReportId(random);
parameterService.saveParameter(inspectParameter);
return ResponseEntity.ok(inspect); return ResponseEntity.ok(inspect);
} }
/** /**
* git下载代码进行评估 * git下载代码进行评估
*
* @param inspectParameter 封装 * @param inspectParameter 封装
* @return * @return
*/ */
@PostMapping("/git") @PostMapping("/git")
@ApiOperation("git下载代码进行评估") @ApiOperation("git下载代码进行评估")
public ResponseEntity inspect1(@RequestBody InspectParameter inspectParameter){ public ResponseEntity inspect1(@RequestBody InspectParameter inspectParameter) {
String path = GitLabUtil.downLoadProject(inspectParameter.getGitAddress(),inspectParameter.getGitName()); String path = GitLabUtil.downLoadProject(inspectParameter.getGitAddress(), inspectParameter.getGitName());
inspectParameter.setId(UUIDUtil.getUUID()); inspectParameter.setId(UUIDUtil.getUUID());
inspectParameter.setSourceAddress(path); inspectParameter.setSourceAddress(path);
ReportVo reportVo = new ReportVo(); ReportVo reportVo = new ReportVo();
......
...@@ -9,4 +9,5 @@ import org.springframework.data.jpa.repository.JpaRepository; ...@@ -9,4 +9,5 @@ import org.springframework.data.jpa.repository.JpaRepository;
*/ */
public interface ConfigParamDao extends JpaRepository<Config,Integer> { public interface ConfigParamDao extends JpaRepository<Config,Integer> {
Config findByName(String name);
} }
...@@ -4,4 +4,6 @@ import com.zjty.inspect.entity.InspectParameter; ...@@ -4,4 +4,6 @@ import com.zjty.inspect.entity.InspectParameter;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
public interface ParameterDao extends JpaRepository<InspectParameter,String> { public interface ParameterDao extends JpaRepository<InspectParameter,String> {
InspectParameter findByUsernameEquals(String username);
} }
...@@ -47,5 +47,5 @@ public interface TechnologyDao extends JpaRepository<Technology,String>, JpaSpec ...@@ -47,5 +47,5 @@ public interface TechnologyDao extends JpaRepository<Technology,String>, JpaSpec
* @param backOrFront * @param backOrFront
* @return * @return
*/ */
List<Technology> findAllByBackorfrontEquals(String backOrFront); List<Technology> findAllByBackorfrontEquals(Integer backOrFront);
} }
...@@ -34,4 +34,24 @@ public class Budget { ...@@ -34,4 +34,24 @@ public class Budget {
*/ */
private String fundDetail; private String fundDetail;
/**
* 占比
*/
private double proportion;
/**
* 系统开发费用
*/
private Integer sysFund;
/**
* 年利率
*/
private double moneyRate;
/**
* 修正系数
*/
private double coefficient;
} }
...@@ -16,5 +16,9 @@ public class BudgetVo { ...@@ -16,5 +16,9 @@ public class BudgetVo {
private List<Budget> budget = new ArrayList<>(); private List<Budget> budget = new ArrayList<>();
/**
* 修正系数
*/
private List<CoefficientModelVo> coefficientModelVos = new ArrayList<>(); private List<CoefficientModelVo> coefficientModelVos = new ArrayList<>();
} }
...@@ -13,8 +13,8 @@ import java.util.List; ...@@ -13,8 +13,8 @@ import java.util.List;
*/ */
@Data @Data
public class DependencyVo implements Serializable { public class DependencyVo implements Serializable {
private List<ProjectPom> depTreeList = new ArrayList<>(); private List<ProjectPom> depTreeList = new ArrayList<>(64);
private List<ProjectPom> frontend = new ArrayList<>(); private List<ProjectPom> frontend = new ArrayList<>(64);
public void add(ProjectPom projectPom){ public void add(ProjectPom projectPom){
depTreeList.add(projectPom); depTreeList.add(projectPom);
......
package com.zjty.inspect.entity;
/**
* <h4>Description : inspect</h4>
*
* @author : M@tr!x [xhyrzldf@foxmail.com]
* @Date : 2020-03-06 21:25
*/
public class File {
}
...@@ -22,6 +22,10 @@ public class InspectParameter { ...@@ -22,6 +22,10 @@ public class InspectParameter {
@Id @Id
private String id; private String id;
/**
* 用户名
*/
private String username;
/** /**
* 重构占比 * 重构占比
*/ */
...@@ -87,11 +91,6 @@ public class InspectParameter { ...@@ -87,11 +91,6 @@ public class InspectParameter {
*/ */
private Integer disaster; private Integer disaster;
/**
* git地址
*/
private String path;
/** /**
* null:无效 * null:无效
*/ */
......
...@@ -26,10 +26,7 @@ public class Report { ...@@ -26,10 +26,7 @@ public class Report {
*/ */
private String htmlAddress; private String htmlAddress;
//前端适配预算 private String username;
//代码重构预算
//代码修改预算
/** /**
* 数据创建时间 * 数据创建时间
*/ */
......
...@@ -99,6 +99,15 @@ public class ReportVo { ...@@ -99,6 +99,15 @@ public class ReportVo {
*/ */
private Integer technologiesRepair; private Integer technologiesRepair;
/**
* 文件个数
*/
private Integer fileNum;
/**
* 文件行数
*/
private Integer fileLine;
/** /**
* 评估时间 * 评估时间
......
...@@ -23,7 +23,9 @@ public class RuleQo { ...@@ -23,7 +23,9 @@ public class RuleQo {
/** /**
* 匹配的文件后缀 * 匹配的文件后缀
*/ */
private List<String> suffix; private List<String> suffixes;
private String suffix;
/** /**
* 适配技术id * 适配技术id
......
package com.zjty.inspect.enums; package com.zjty.inspect.enums;
import jdk.internal.dynalink.beans.BeansLinker;
/** /**
* <h4>Description : 兼容的浏览器</h4> * <h4>Description : 兼容的浏览器</h4>
......
...@@ -16,6 +16,7 @@ import org.springframework.stereotype.Service; ...@@ -16,6 +16,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.MalformedInputException;
import java.nio.file.*; import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.BasicFileAttributes;
import java.util.*; import java.util.*;
...@@ -49,8 +50,8 @@ public class Inspector { ...@@ -49,8 +50,8 @@ public class Inspector {
private ParameterDao parameterDao; private ParameterDao parameterDao;
private DependencyVo dependencyVo = new DependencyVo(); private DependencyVo dependencyVo = new DependencyVo();
private ArrayList<Rule> rules = new ArrayList<Rule>(); private ArrayList<Rule> rules = new ArrayList<>(512);
private ArrayList<Warn> warns = new ArrayList<>(); private ArrayList<Warn> warns = new ArrayList<>(64);
/** /**
* 添加规则时去重使用 * 添加规则时去重使用
...@@ -60,7 +61,7 @@ public class Inspector { ...@@ -60,7 +61,7 @@ public class Inspector {
* <p> * <p>
* value:随意 * value:随意
*/ */
private HashMap<String, Rule> ruleMap = new HashMap<>(); private HashMap<String, Rule> ruleMap = new HashMap<>(512);
/** /**
* 支持的国产化技术 * 支持的国产化技术
...@@ -80,7 +81,19 @@ public class Inspector { ...@@ -80,7 +81,19 @@ public class Inspector {
*/ */
private InspectParameter inspectParameter; private InspectParameter inspectParameter;
/**
* 源代码大小
*/
private double codeSize = 0; private double codeSize = 0;
/**
* 文件数量
*/
private Integer fileNum = 0;
/**
* 文件行数
*/
private Integer fileLine = 0;
/** /**
* 报告对象 * 报告对象
*/ */
...@@ -91,14 +104,14 @@ public class Inspector { ...@@ -91,14 +104,14 @@ public class Inspector {
* key:java * key:java
* value:10 * value:10
*/ */
private Map<String, Counter> languageMatchMap = new HashMap<>(); private Map<String, Counter> languageMatchMap = new HashMap<>(16);
/** /**
* 后缀语言 * 后缀语言
* key:properties * key:properties
* value:[{/Users/path},{/Users/path}] * value:[{/Users/path},{/Users/path}]
*/ */
private Map<String, Language> suffixLanguageMapping = new HashMap<>(); private Map<String, Language> suffixLanguageMapping = new HashMap<>(16);
/** /**
* 规则列表 * 规则列表
...@@ -110,9 +123,9 @@ public class Inspector { ...@@ -110,9 +123,9 @@ public class Inspector {
* xml:list【路径】 * xml:list【路径】
*/ */
private Map<String, List<Path>> configFileTypePathsMapping = new HashMap<>(); private Map<String, List<Path>> configFileTypePathsMapping = new HashMap<>(512);
private Map<String, List<Path>> ruleSuffixFileMap; private Map<String, List<Path>> ruleSuffixFilePathMap;
private Map<String, List<Rule>> ruleSuffixMap; private Map<String, List<Rule>> ruleSuffixMap;
/** /**
...@@ -120,7 +133,7 @@ public class Inspector { ...@@ -120,7 +133,7 @@ public class Inspector {
* key:技术id * key:技术id
* value:Technology * value:Technology
*/ */
private Map<String, Technology> technologyHashMap = new HashMap<>(); private Map<String, Technology> technologyHashMap = new HashMap<>(64);
/** /**
* 统计各后缀文件路径与出现次数,顺便解析jar与js文件 * 统计各后缀文件路径与出现次数,顺便解析jar与js文件
...@@ -128,19 +141,28 @@ public class Inspector { ...@@ -128,19 +141,28 @@ public class Inspector {
* FileVisitResult.TERMINATE 中止访问 * FileVisitResult.TERMINATE 中止访问
* FileVisitResult.SKIP_SIBLINGS 不访问同级的文件或目录 * FileVisitResult.SKIP_SIBLINGS 不访问同级的文件或目录
* FileVisitResult.SKIP_SUBTREE 不访问子目录 * FileVisitResult.SKIP_SUBTREE 不访问子目录
* * 准备工作
* @return 报告 * 1.解析文件
* 2/记录文件地址
* 3/统计各个规则文件后缀
* @return
*/ */
public ReportVo inspect() { public ReportVo inspect() {
ruleSuffixFileMap = new HashMap<>(); ruleSuffixFilePathMap = new HashMap<>();
ruleSuffixMap = new HashMap<>(); ruleSuffixMap = new HashMap<>();
warns.clear(); warns.clear();
rules.clear(); rules.clear();
//查询技术,构造支持与非支持技术对象
findExistTechnology();
statisticsLanguage(); statisticsLanguage();
this.ruleList=ruleDao.findAll();
//统计项目组成文件构成
//统计配置文件地址
statisticsConfigFile(); statisticsConfigFile();
this.ruleList = ruleDao.findAll();
//根据后缀名,收集文件进行操作
for (Rule rule : ruleList) {
if (!ruleSuffixFilePathMap.containsKey(rule.getSuffix())) {
ruleSuffixFilePathMap.put(rule.getSuffix(), new ArrayList<>());
}
}
try { try {
//以下为计算文件名称匹配正则表达式 //以下为计算文件名称匹配正则表达式
FileSystem aDefault = FileSystems.getDefault(); FileSystem aDefault = FileSystems.getDefault();
...@@ -155,12 +177,13 @@ public class Inspector { ...@@ -155,12 +177,13 @@ public class Inspector {
configFileMatcherSuffixMapping.put(aDefault.getPathMatcher("glob:**/*." + s), s); configFileMatcherSuffixMapping.put(aDefault.getPathMatcher("glob:**/*." + s), s);
} }
//构造规则后缀的正则表达式 //构造规则后缀的正则表达式
Map<PathMatcher, String> ruleSuffix = new HashMap<>(16); Map<PathMatcher, String> ruleSuffixMap = new HashMap<>(16);
for (String s : ruleSuffixFileMap.keySet()) { for (String s : ruleSuffixFilePathMap.keySet()) {
ruleSuffix.put(aDefault.getPathMatcher("glob:**/*." + s), s); ruleSuffixMap.put(aDefault.getPathMatcher("glob:**/*." + s), s);
} }
//文件读取 //文件读取
Files.walkFileTree(Paths.get(inspectParameter.getPath()), new FileVisitor<Path>() {
Files.walkFileTree(Paths.get(inspectParameter.getSourceAddress()), new FileVisitor<Path>() {
@Override @Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
//这里是对于路径(文件夹)的过滤,在这里读不到文件如果能判断,可以返回FileVisitResult.SKIP_SUBTREE 不访问子目录 //这里是对于路径(文件夹)的过滤,在这里读不到文件如果能判断,可以返回FileVisitResult.SKIP_SUBTREE 不访问子目录
...@@ -171,7 +194,15 @@ public class Inspector { ...@@ -171,7 +194,15 @@ public class Inspector {
@Override @Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
fileNum+=1;
try {
List<String> allLines = Files.readAllLines(file);
fileLine+=allLines.size();
}catch (MalformedInputException e){
return FileVisitResult.CONTINUE;
} catch (IOException e) {
e.printStackTrace();
}
for (Map.Entry<String, PathMatcher> entry : languageSuffixMatcherMapping.entrySet()) { for (Map.Entry<String, PathMatcher> entry : languageSuffixMatcherMapping.entrySet()) {
//通过正则表达式匹配.java类型后缀文件,并+1 //通过正则表达式匹配.java类型后缀文件,并+1
if (entry.getValue().matches(file)) { if (entry.getValue().matches(file)) {
...@@ -186,10 +217,10 @@ public class Inspector { ...@@ -186,10 +217,10 @@ public class Inspector {
configFileTypePathsMapping.get(entry.getValue()).add(file); configFileTypePathsMapping.get(entry.getValue()).add(file);
} }
} }
for (Map.Entry<PathMatcher, String> entry : ruleSuffix.entrySet()) { for (Map.Entry<PathMatcher, String> entry : ruleSuffixMap.entrySet()) {
//通过规则匹配后缀正则表达式匹配,记录匹配上的文件地址 //通过规则匹配后缀正则表达式匹配,记录匹配上的文件地址
if (entry.getKey().matches(file)) { if (entry.getKey().matches(file)) {
ruleSuffixFileMap.get(entry.getValue()).add(file); ruleSuffixFilePathMap.get(entry.getValue()).add(file);
} }
} }
//检查到普通jar包 //检查到普通jar包
...@@ -248,6 +279,9 @@ public class Inspector { ...@@ -248,6 +279,9 @@ public class Inspector {
e.printStackTrace(); e.printStackTrace();
} }
inspectParameter.setCodeSize((int) codeSize); inspectParameter.setCodeSize((int) codeSize);
report.setFileNum(fileNum);
report.setFileLine(fileLine);
log.info("inspect:源代码扫描完成,统计各个文件后缀完成");
return analysis(); return analysis();
} }
...@@ -260,11 +294,8 @@ public class Inspector { ...@@ -260,11 +294,8 @@ public class Inspector {
public ReportVo analysis() { public ReportVo analysis() {
DependencyVo dependencyVo = new DependencyVo(); DependencyVo dependencyVo = new DependencyVo();
setReportLanguageAndFrame(); setReportLanguageAndFrame();
//查询技术,构造支持与非支持技术对象
findExistTechnology();
//查询所有规则 //查询所有规则
ruleTransform(report.getRecastMethod()); ruleTransform(report.getRecastMethod());
//解析配置文件集合 //解析配置文件集合
for (Map.Entry<String, List<Path>> entry : configFileTypePathsMapping.entrySet()) { for (Map.Entry<String, List<Path>> entry : configFileTypePathsMapping.entrySet()) {
switch (entry.getKey()) { switch (entry.getKey()) {
...@@ -306,7 +337,7 @@ public class Inspector { ...@@ -306,7 +337,7 @@ public class Inspector {
} }
} }
//指定后缀到文件匹配关键字 //指定后缀到文件匹配关键字
for (Map.Entry<String, List<Path>> entry : ruleSuffixFileMap.entrySet()) { for (Map.Entry<String, List<Path>> entry : ruleSuffixFilePathMap.entrySet()) {
//entry,key为后缀,value为文件列表 //entry,key为后缀,value为文件列表
String key = entry.getKey(); String key = entry.getKey();
//从ruleSuffixList获取指定后缀的规则列表 //从ruleSuffixList获取指定后缀的规则列表
...@@ -331,6 +362,7 @@ public class Inspector { ...@@ -331,6 +362,7 @@ public class Inspector {
//将得到的告警信息根据技术id进行转换 //将得到的告警信息根据技术id进行转换
Set<String> collect = warns.stream().map(Warn::getTechnologyId).collect(Collectors.toSet()); Set<String> collect = warns.stream().map(Warn::getTechnologyId).collect(Collectors.toSet());
List<Technology> allById = technologyDao.findAllById(collect); List<Technology> allById = technologyDao.findAllById(collect);
//计算技术金额 //计算技术金额
Integer fund = 0; Integer fund = 0;
for (Technology tech : allById) { for (Technology tech : allById) {
...@@ -340,9 +372,8 @@ public class Inspector { ...@@ -340,9 +372,8 @@ public class Inspector {
if (inspectParameter.getValid() != null) { if (inspectParameter.getValid() != null) {
BudgetVo budget = budgetUitl.getBudget(fund, report, inspectParameter); BudgetVo budget = budgetUitl.getBudget(fund, report, inspectParameter);
report.setBudgets(budget); report.setBudgets(budget);
inspectParameter.setId(UUIDUtil.getUUID());
parameterDao.save(inspectParameter);
} }
parameterDao.save(inspectParameter);
//填充地址(如果有) //填充地址(如果有)
report.setGitAddress(inspectParameter.getGitAddress()); report.setGitAddress(inspectParameter.getGitAddress());
//填充适配技术 //填充适配技术
...@@ -350,16 +381,15 @@ public class Inspector { ...@@ -350,16 +381,15 @@ public class Inspector {
//填充依赖 //填充依赖
report.setDependencyVo(dependencyVo); report.setDependencyVo(dependencyVo);
//数据转换 //数据转换
HashMap<String, Technology> map = new HashMap<>(); HashMap<String, List<Warn>> warnMap = getWarnMap();
for (Technology technology1 : allById) {
map.put(technology1.getId(), technology1);
}
HashMap<String, List<Warn>> warnMap = getWarnMap(map);
ruleDao.saveAll(rules); ruleDao.saveAll(rules);
report.setWarnDetails(warnMap); report.setWarnDetails(warnMap);
fileLine=0;
fileNum=0;
return report; return report;
} }
private void setReportLanguageAndFrame() { private void setReportLanguageAndFrame() {
String most = null; String most = null;
int mostStatus = 0; int mostStatus = 0;
...@@ -380,26 +410,28 @@ public class Inspector { ...@@ -380,26 +410,28 @@ public class Inspector {
//设置是否需要重构 //设置是否需要重构
if (languageMatchMap.get("jsp").i == 0 & languageMatchMap.get("java").i == 0) { if (languageMatchMap.get("jsp").i == 0 & languageMatchMap.get("java").i == 0) {
report.setRecastMethod(RecastMethod.适配重构.getStatus()); report.setRecastMethod(RecastMethod.适配重构.getStatus());
log.info("inspect:代码解析完成,建议进行适配重构");
} else { } else {
report.setRecastMethod(RecastMethod.代码修改.getStatus()); report.setRecastMethod(RecastMethod.代码修改.getStatus());
log.info("inspect:代码解析完成,建议进行代码修改");
} }
} }
/** /**
* rule所需要数据装配 * rule所需要数据装配
*/ */
private void ruleTransform(int i) { private void ruleTransform(Integer i) {
if(i==1){ if (i == 1) {
List<Technology> front = technologyDao.findAllByBackorfrontEquals("1"); List<Technology> front = technologyDao.findAllByBackorfrontEquals(1);
List<String> ids = front.stream().map(Technology::getId).collect(Collectors.toList()); List<String> ids = front.stream().map(Technology::getId).collect(Collectors.toList());
this.ruleList=ruleDao.findAllByTechnologyIdIn(ids); this.ruleList = ruleDao.findAllByTechnologyIdIn(ids);
}else{ } else {
if(inspectParameter.getRecastMethod()==1){ if (inspectParameter.getRecastMethod() == 1) {
this.ruleList=ruleDao.findAll(); this.ruleList = ruleDao.findAll();
}else{ } else {
List<Technology> front = technologyDao.findAllByBackorfrontEquals("1"); List<Technology> front = technologyDao.findAllByBackorfrontEquals(1);
List<String> ids = front.stream().map(Technology::getId).collect(Collectors.toList()); List<String> ids = front.stream().map(Technology::getId).collect(Collectors.toList());
this.ruleList=ruleDao.findAllByTechnologyIdIn(ids); this.ruleList = ruleDao.findAllByTechnologyIdIn(ids);
} }
} }
Set<String> id = ruleList.stream().map(Rule::getTechnologyId).collect(Collectors.toSet()); Set<String> id = ruleList.stream().map(Rule::getTechnologyId).collect(Collectors.toSet());
...@@ -407,12 +439,6 @@ public class Inspector { ...@@ -407,12 +439,6 @@ public class Inspector {
for (Technology technology : technologies) { for (Technology technology : technologies) {
technologyHashMap.put(technology.getId(), technology); technologyHashMap.put(technology.getId(), technology);
} }
//根据后缀名,收集文件进行操作
for (Rule rule : ruleList) {
if (!ruleSuffixFileMap.containsKey(rule.getSuffix())) {
ruleSuffixFileMap.put(rule.getSuffix(), new ArrayList<>());
}
}
//根据后缀名进行规则收集 //根据后缀名进行规则收集
for (Rule rule : ruleList) { for (Rule rule : ruleList) {
if (!ruleSuffixMap.containsKey(rule.getSuffix())) { if (!ruleSuffixMap.containsKey(rule.getSuffix())) {
...@@ -422,6 +448,15 @@ public class Inspector { ...@@ -422,6 +448,15 @@ public class Inspector {
ruleSuffixMap.get(rule.getSuffix()).add(rule); ruleSuffixMap.get(rule.getSuffix()).add(rule);
} }
} }
ArrayList<String> keys = new ArrayList<>();
for (String s : ruleSuffixFilePathMap.keySet()) {
if(!ruleSuffixMap.containsKey(s)){
keys.add(s);
}
}
for (String key : keys) {
ruleSuffixFilePathMap.remove(key);
}
} }
private void statisticsConfigFile() { private void statisticsConfigFile() {
...@@ -441,22 +476,38 @@ public class Inspector { ...@@ -441,22 +476,38 @@ public class Inspector {
} }
private void findExistTechnology() { private void findExistTechnology() {
techJavaSupport = technologyDao.findAllByTechnologyNameEquals("Java依赖"); techJavaSupport = technologyDao.findAllByTechnologyNameEquals("国产化依赖(支持)");
techNotCnSupport = technologyDao.findAllByTechnologyNameEquals("非国产化依赖"); techNotCnSupport = technologyDao.findAllByTechnologyNameEquals("非国产化依赖(不支持)");
techUnKnowSupport = technologyDao.findAllByTechnologyNameEquals("未知依赖"); techUnKnowSupport = technologyDao.findAllByTechnologyNameEquals("未知依赖(未知)");
} }
private HashMap<String, List<Warn>> getWarnMap(HashMap<String, Technology> map) { private HashMap<String, List<Warn>> getWarnMap() {
List<Technology> technologies = technologyDao.findAll();
HashMap<String, Technology> techMap = new HashMap<>();
for (Technology technology : technologies) {
if(!techMap.containsKey(technology.getId())){
techMap.put(technology.getId(),technology);
}
}
HashMap<String, List<Warn>> warnMap = new HashMap<>(); HashMap<String, List<Warn>> warnMap = new HashMap<>();
for (Warn warn : warns) { for (Warn warn : warns) {
if (!warnMap.containsKey(map.get(warn.getTechnologyId()).getTechnologyName())) { if(!warnMap.containsKey(techMap.get(warn.getTechnologyId()).getId())){
ArrayList<Warn> warns1 = new ArrayList<>(); ArrayList<Warn> warns1 = new ArrayList<>();
warns1.add(warn); warns1.add(warn);
warnMap.put(map.get(warn.getTechnologyId()).getTechnologyName(), warns1); warnMap.put(techMap.get(warn.getTechnologyId()).getTechnologyName(), warns1);
} else { }else{
warnMap.get(map.get(warn.getTechnologyId()).getTechnologyName()).add(warn); warnMap.get(techMap.get(warn.getTechnologyId()).getTechnologyName()).add(warn);
}
}
for (Technology technology : technologies) {
if(!warnMap.containsKey(technology.getTechnologyName())){
ArrayList<Warn> warns1 = new ArrayList<>();
warnMap.put(technology.getTechnologyName(), warns1);
} }
} }
return warnMap; return warnMap;
} }
...@@ -466,6 +517,7 @@ public class Inspector { ...@@ -466,6 +517,7 @@ public class Inspector {
* @param dependency 依赖 * @param dependency 依赖
*/ */
private void setRule(Path path, StringBuilder stringBuilder, PomDependency dependency) { private void setRule(Path path, StringBuilder stringBuilder, PomDependency dependency) {
stringBuilder.append(dependency.getGroupId()).append(":").append(dependency.getArtifactId()); stringBuilder.append(dependency.getGroupId()).append(":").append(dependency.getArtifactId());
if (inspectParameter.getAdmin() == 1) { if (inspectParameter.getAdmin() == 1) {
Rule rule = new Rule(); Rule rule = new Rule();
...@@ -474,14 +526,12 @@ public class Inspector { ...@@ -474,14 +526,12 @@ public class Inspector {
rule.setTechnologyName(techJavaSupport.getTechnologyName()); rule.setTechnologyName(techJavaSupport.getTechnologyName());
rule.setSuffix("*"); rule.setSuffix("*");
rule.setId(UUIDUtil.getUUID()); rule.setId(UUIDUtil.getUUID());
Rule rule1 = new Rule(); Rule rule1 = new Rule();
rule1.setTechnologyId(techJavaSupport.getId()); rule1.setTechnologyId(techJavaSupport.getId());
rule1.setTarget(dependency.getArtifactId()); rule1.setTarget(dependency.getArtifactId());
rule1.setTechnologyName(techJavaSupport.getTechnologyName()); rule1.setTechnologyName(techJavaSupport.getTechnologyName());
rule1.setSuffix("*"); rule1.setSuffix("*");
rule1.setId(UUIDUtil.getUUID()); rule1.setId(UUIDUtil.getUUID());
if (!ruleMap.containsKey(dependency.getGroupId() + ":" + rule.getSuffix())) { if (!ruleMap.containsKey(dependency.getGroupId() + ":" + rule.getSuffix())) {
rules.add(rule); rules.add(rule);
ruleMap.put(dependency.getGroupId() + ":" + rule.getSuffix(), rule); ruleMap.put(dependency.getGroupId() + ":" + rule.getSuffix(), rule);
......
package com.zjty.inspect.service;
import com.zjty.inspect.entity.Config;
import java.util.List;
public interface ConfigService {
public void updateConfig(Config config);
List<Config> findAll();
}
...@@ -20,4 +20,11 @@ public interface ParameterService { ...@@ -20,4 +20,11 @@ public interface ParameterService {
* @param id id * @param id id
*/ */
public InspectParameter getParameterById(String id); public InspectParameter getParameterById(String id);
/**
* 根据用户名获取参数
* @param username 用户名
* @return 参数对象
*/
public InspectParameter getParameterByUsername(String username);
} }
package com.zjty.inspect.service.impl;
import com.zjty.inspect.dao.ConfigParamDao;
import com.zjty.inspect.entity.Config;
import com.zjty.inspect.service.ConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ConfigServiceImpl implements ConfigService {
@Autowired
private ConfigParamDao configParamDao;
@Override
public void updateConfig(Config config) {
Config c = configParamDao.findByName(config.getName());
c.setValue(config.getValue());
configParamDao.save(c);
}
@Override
public List<Config> findAll() {
return configParamDao.findAll();
}
}
...@@ -7,6 +7,9 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -7,6 +7,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.Objects;
import java.util.Optional;
/** /**
* 参数 * 参数
* @author Mcj * @author Mcj
...@@ -32,4 +35,15 @@ public class ParameterServiceImpl implements ParameterService { ...@@ -32,4 +35,15 @@ public class ParameterServiceImpl implements ParameterService {
} }
return new InspectParameter(); return new InspectParameter();
} }
/**
* 根据用户名查询参数
* @param username 用户名
* @return 参数
*/
@Override
public InspectParameter getParameterByUsername(String username) {
InspectParameter inspectParameter = parameterDao.findByUsernameEquals(username);
return inspectParameter;
}
} }
...@@ -44,7 +44,7 @@ public class RuleServiceImpl implements RuleService { ...@@ -44,7 +44,7 @@ public class RuleServiceImpl implements RuleService {
private TechnologyService technologyService; private TechnologyService technologyService;
@Override @Override
public void test(){ public void test() {
List<Rule> rules = ruleDao.findAll(); List<Rule> rules = ruleDao.findAll();
for (Rule rule : rules) { for (Rule rule : rules) {
Technology technology = technologyService.findByid(rule.getTechnologyId()); Technology technology = technologyService.findByid(rule.getTechnologyId());
...@@ -52,6 +52,7 @@ public class RuleServiceImpl implements RuleService { ...@@ -52,6 +52,7 @@ public class RuleServiceImpl implements RuleService {
} }
ruleDao.saveAll(rules); ruleDao.saveAll(rules);
} }
/** /**
* 新增规则 * 新增规则
* *
...@@ -59,10 +60,10 @@ public class RuleServiceImpl implements RuleService { ...@@ -59,10 +60,10 @@ public class RuleServiceImpl implements RuleService {
*/ */
@Override @Override
public void addRule(RuleQo ruleQo) { public void addRule(RuleQo ruleQo) {
List<String> suffixes = ruleQo.getSuffixes();
for (String suffix : ruleQo.getSuffix()) { for (String suffix : suffixes) {
Rule rule1 = ruleDao.findByTargetAndSuffixEquals(ruleQo.getTarget(),suffix); Rule rule1 = ruleDao.findByTargetAndSuffixEquals(ruleQo.getTarget(), suffix);
if(rule1!=null){ if (rule1 != null) {
return; return;
} }
Rule rule = new Rule(); Rule rule = new Rule();
...@@ -73,6 +74,7 @@ public class RuleServiceImpl implements RuleService { ...@@ -73,6 +74,7 @@ public class RuleServiceImpl implements RuleService {
rule.setId(UUIDUtil.getUUID()); rule.setId(UUIDUtil.getUUID());
ruleDao.save(rule); ruleDao.save(rule);
} }
} }
/** /**
...@@ -115,19 +117,15 @@ public class RuleServiceImpl implements RuleService { ...@@ -115,19 +117,15 @@ public class RuleServiceImpl implements RuleService {
@Override @Override
public void upRule(RuleQo ruleQo) { public void upRule(RuleQo ruleQo) {
for (String suffix : ruleQo.getSuffix()) { Rule rule1 = ruleDao.findByTarget(ruleQo.getId());
Rule rule1 = ruleDao.findByTarget(ruleQo.getTarget()); if (rule1 == null) {
if(rule1!=null){ return;
return;
}
Rule rule = new Rule();
rule.setTarget(ruleQo.getTarget());
rule.setSuffix(suffix);
rule.setTechnologyId(ruleQo.getTechnologyId());
rule.setTechnologyName(ruleQo.getTechnologyName());
rule.setId(ruleQo.getId());
ruleDao.save(rule);
} }
rule1.setTarget(ruleQo.getTarget());
rule1.setSuffix(ruleQo.getSuffix());
rule1.setTechnologyId(ruleQo.getTechnologyId());
rule1.setTechnologyName(ruleQo.getTechnologyName());
ruleDao.save(rule1);
} }
@Override @Override
......
...@@ -38,9 +38,11 @@ public class AnalysisFile { ...@@ -38,9 +38,11 @@ public class AnalysisFile {
if(string.indexOf("compile")>0){ if(string.indexOf("compile")>0){
PomDependency pomDependency = new PomDependency(); PomDependency pomDependency = new PomDependency();
int compile = string.indexOf("compile"); int compile = string.indexOf("compile");
int i = compile + 8; int i = compile + 9;
String substring = string.substring(i); String substring = string.substring(i);
pomDependency.setGradle(substring); String[] split = substring.split(":");
pomDependency.setGroupId(split[0]);
pomDependency.setArtifactId(split[1]);
dependencies.add(pomDependency); dependencies.add(pomDependency);
} }
} }
...@@ -172,4 +174,20 @@ public class AnalysisFile { ...@@ -172,4 +174,20 @@ public class AnalysisFile {
projectPom.setDependencies(dependencies); projectPom.setDependencies(dependencies);
return projectPom; return projectPom;
} }
public static void main(String[] args) {
String string = " compile 'com.spring.test:spring-core:4.25'";
String[] split = string.split(":");
if(string.indexOf("compile")>-1){
PomDependency pomDependency = new PomDependency();
int compile = string.indexOf("compile");
int i = compile + 9;
String substring = string.substring(i);
String[] split1 = substring.split(":");
System.out.println(split1[0]);
System.out.println(split1[1]);
pomDependency.setGradle(substring);
}
}
} }
package com.zjty.inspect.utils;
import java.math.BigDecimal;
/**
* @author Mcj
* @date 2020-03-06 16:38
*/
public class BigDecimalUtil {
public static double get2precision(double data){
BigDecimal bigDecimal = new BigDecimal(data);
double value = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
return value;
}
public static void main(String[] args) {
double precision = BigDecimalUtil.get2precision(1.1111111D);
System.out.println(precision);
}
}
...@@ -6,6 +6,7 @@ import com.zjty.inspect.entity.*; ...@@ -6,6 +6,7 @@ import com.zjty.inspect.entity.*;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
...@@ -120,14 +121,28 @@ public class BudgetUitl { ...@@ -120,14 +121,28 @@ public class BudgetUitl {
budgetVo.getCoefficientModelVos().add(coefficientModelVo); budgetVo.getCoefficientModelVos().add(coefficientModelVo);
} }
coefficient = BigDecimalUtil.get2precision(coefficient);
if(inspectParameter.getRecastMethod()==1){ if(inspectParameter.getRecastMethod()==1){
//用户需要适配 //用户需要适配
double refactorProportion = Double.valueOf(doubleHashMap.get(4)); double refactorProportion = Double.valueOf(doubleHashMap.get(4));
inspectParameter.setProportion(refactorProportion); inspectParameter.setProportion(refactorProportion);
Budget codeRefactor = new Budget(); Budget codeRefactor = new Budget();
codeRefactor.setBudgetName("代码修改预算"); codeRefactor.setBudgetName("代码修改预算");
double fundNotRepair = inspectParameter.getProportion() * pow * systemFund + fund; codeRefactor.setProportion(refactorProportion);
codeRefactor.setSysFund(systemFund);
codeRefactor.setMoneyRate(moneyRate);
codeRefactor.setCoefficient(coefficient);
double fundNotRepair = inspectParameter.getProportion() * pow * systemFund;
double fundRepair=fundNotRepair*coefficient; double fundRepair=fundNotRepair*coefficient;
fundNotRepair+=fund;
fundRepair+=fund;
fundNotRepair = BigDecimalUtil.get2precision(fundNotRepair);
fundRepair = BigDecimalUtil.get2precision(fundRepair);
if(fundNotRepair<fundRepair){ if(fundNotRepair<fundRepair){
codeRefactor.setFund(fundNotRepair +"--"+fundRepair); codeRefactor.setFund(fundNotRepair +"--"+fundRepair);
}else if(fundNotRepair>fundRepair){ }else if(fundNotRepair>fundRepair){
...@@ -143,9 +158,19 @@ public class BudgetUitl { ...@@ -143,9 +158,19 @@ public class BudgetUitl {
double refactorProportion1 = Double.valueOf(doubleHashMap.get(2)); double refactorProportion1 = Double.valueOf(doubleHashMap.get(2));
inspectParameter.setProportion(refactorProportion1); inspectParameter.setProportion(refactorProportion1);
Budget codeRefactor1 = new Budget(); Budget codeRefactor1 = new Budget();
codeRefactor1.setProportion(refactorProportion1);
codeRefactor1.setBudgetName("代码重构预算"); codeRefactor1.setBudgetName("代码重构预算");
double fundNotRepair1 = inspectParameter.getProportion() * pow * systemFund + fund; codeRefactor1.setMoneyRate(moneyRate);
codeRefactor1.setSysFund(systemFund);
codeRefactor1.setCoefficient(coefficient);
double fundNotRepair1 = inspectParameter.getProportion() * pow * systemFund;
double fundRepair1=fundNotRepair1*coefficient; double fundRepair1=fundNotRepair1*coefficient;
fundNotRepair1 = BigDecimalUtil.get2precision(fundNotRepair1);
fundRepair1 = BigDecimalUtil.get2precision(fundRepair1);
fundNotRepair1+=fund;
fundRepair1+=fund;
if(fundNotRepair1<fundRepair1){ if(fundNotRepair1<fundRepair1){
codeRefactor1.setFund(fundNotRepair1 +"--"+fundRepair1); codeRefactor1.setFund(fundNotRepair1 +"--"+fundRepair1);
}else if(fundNotRepair1>fundRepair1){ }else if(fundNotRepair1>fundRepair1){
...@@ -162,9 +187,19 @@ public class BudgetUitl { ...@@ -162,9 +187,19 @@ public class BudgetUitl {
double refactorProportion = Double.valueOf(doubleHashMap.get(3)); double refactorProportion = Double.valueOf(doubleHashMap.get(3));
inspectParameter.setProportion(refactorProportion); inspectParameter.setProportion(refactorProportion);
Budget codeRefactor1 = new Budget(); Budget codeRefactor1 = new Budget();
codeRefactor1.setProportion(refactorProportion);
codeRefactor1.setBudgetName("代码修改预算"); codeRefactor1.setBudgetName("代码修改预算");
double fundNotRepair1 = inspectParameter.getProportion() * pow * systemFund + fund; codeRefactor1.setSysFund(systemFund);
codeRefactor1.setMoneyRate(moneyRate);
codeRefactor1.setCoefficient(coefficient);
double fundNotRepair1 = inspectParameter.getProportion() * pow * systemFund;
double fundRepair1=fundNotRepair1*coefficient; double fundRepair1=fundNotRepair1*coefficient;
fundNotRepair1+=fund;
fundRepair1+=fund;
fundNotRepair1 = BigDecimalUtil.get2precision(fundNotRepair1);
fundRepair1 = BigDecimalUtil.get2precision(fundRepair1);
if(fundNotRepair1<fundRepair1){ if(fundNotRepair1<fundRepair1){
codeRefactor1.setFund(fundNotRepair1 +"--"+fundRepair1); codeRefactor1.setFund(fundNotRepair1 +"--"+fundRepair1);
}else if(fundNotRepair1>fundRepair1){ }else if(fundNotRepair1>fundRepair1){
......
...@@ -51,7 +51,6 @@ public class FileUtil { ...@@ -51,7 +51,6 @@ public class FileUtil {
File file3 = new File("./"+name+"/"+split1[0]+"/"+split[0]); File file3 = new File("./"+name+"/"+split1[0]+"/"+split[0]);
excelFile.delete(); excelFile.delete();
log.info("end unpack file"); log.info("end unpack file");
System.out.println(file3.getCanonicalPath());
return file3; return file3;
} }
......
package com.zjty.inspect.utils;
import com.alibaba.fastjson.JSON;
import com.zjty.inspect.entity.*;
import com.zjty.inspect.enums.CompatibleBrowser;
import com.zjty.inspect.enums.DatabaseType;
import com.zjty.inspect.enums.Framework;
import com.zjty.inspect.enums.MiddlewareEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
/**
* 应用系统改造替换工作量根据表单计算
* @Author wyl
* @Date 2020-03-6 14:20
*/
public class WorkLoadUtil {
Logger logger = LoggerFactory.getLogger(getClass());
private double calculate(Reform reform){
logger.info("分值计算,输入:"+JSON.toJSON(reform));
double score = 0;
/**
* 系统部署架构,其他需求,分布式、负载均衡、容灾每个+10
*/
SystemStructure systemStructure = reform.getSystemStructure();
if(systemStructure!=null) {
//分布式
if (systemStructure.getDistributed() != null && systemStructure.getDistributed() == 1) {
score += 10;
logger.info("分布式+10:" + score);
}
//负载均衡
if (systemStructure.getLoadBalance() != null && systemStructure.getLoadBalance() == 1) {
score += 10;
logger.info("负载均衡+10:" + score);
}
//容灾
if (systemStructure.getDisaster() != null && systemStructure.getDisaster() == 1) {
score += 10;
logger.info("容灾+10:" + score);
}
}
/**
* 前端浏览器相关
*/
Browser browser = reform.getBrowser();
if(browser!=null) {
//如果原浏览器包含IE,+10
if (browser.getCompatibleBrowsers().contains(CompatibleBrowser.IETRIDENT)) {
score += 10;
logger.info("包含IE+10:" + score);
}
/*更多需求,每个+1*/
//地理信息系统
if (browser.getGeography()!=null&&browser.getGeography() == 1) {
score += 1;
logger.info("浏览器-地理信息系统+1:" + score);
}
//调用外设
if (browser.getPeripheral()!=null&&browser.getPeripheral() == 1) {
score += 1;
logger.info("浏览器-调用外设+1:" + score);
}
//动画
if (browser.getAnimation()!=null&&browser.getAnimation() == 1) {
score += 1;
logger.info("浏览器-动画+1:" + score);
}
//3D展示
if (browser.getThreeD()!=null&&browser.getThreeD() == 1) {
score += 1;
logger.info("浏览器-3D展示+1:" + score);
}
//公文实现与编辑
if (browser.getDocument()!=null&&browser.getDocument() == 1) {
score += 1;
logger.info("浏览器-公文编辑+1:" + score);
}
//多媒体
if (browser.getMedia()!=null&&browser.getMedia() == 1) {
score += 1;
logger.info("浏览器-多媒体+1:" + score);
}
//flash
if (browser.getFlash()!=null&&browser.getFlash() == 1) {
score += 1;
logger.info("浏览器-flash+1:" + score);
}
//其他
if (browser.getOtherDemand()!=null&&browser.getOtherDemand() == 1) {
score += 1;
logger.info("浏览器-其他+1:" + score);
}
}
/**
* 中间件,除Tomcat外每个+5;更多需求,每个+10
*/
Middleware middleware = reform.getMiddleware();
if(middleware!=null) {
List<MiddlewareEnum> middlewareEnums = middleware.getMiddlewareEnums();
int effectMidNum = middlewareEnums.size();
if (middlewareEnums.contains(MiddlewareEnum.TOMCAT)) {
effectMidNum--;
}
if (middleware.getOtherMiddleware() != null && !middleware.getOtherMiddleware().trim().equals("")) {
effectMidNum++;
}
score += effectMidNum * 5;
logger.info("中间件-数量*5:" + effectMidNum + "\t" + score);
/*更多需求*/
//Web集群
if (middleware.getWeb()!=null&&middleware.getWeb() == 1) {
score += 10;
logger.info("中间件-Web集群+10:" + score);
}
//Jndi集群
if (middleware.getJndi()!=null&&middleware.getJndi() == 1) {
score += 10;
logger.info("中间件-Jndi集群+10:" + score);
}
//Jms集群
if (middleware.getJms()!=null&&middleware.getJms() == 1) {
score += 10;
logger.info("中间件-Jms集群+10:" + score);
}
//消息路由
if (middleware.getRoute()!=null&&middleware.getRoute() == 1) {
score += 10;
logger.info("中间件-消息路由+10:" + score);
}
}
/**
* 数据库相关,除mysql每个+10;小需求每个+2;更多需求每个+10
*/
Database database = reform.getDatabase();
if(database!=null) {
List<DatabaseType> databaseType = database.getDatabaseType();
int effectDatabaseNum = databaseType.size();
if (databaseType.contains(DatabaseType.MYSQL)) {
effectDatabaseNum--;
}
if (database.getOtherType() != null && !database.getOtherType().trim().equals("")) {
effectDatabaseNum++;
}
score += effectDatabaseNum * 10;
logger.info("数据库-数量*10:" + effectDatabaseNum + "\t" + score);
/*小需求,每个+2*/
//视图
if (database.getView()!=null&&database.getView() == 1) {
score += 2;
logger.info("数据库-视图+2:" + score);
}
//存储过程
if (database.getStorage()!=null&&database.getStorage() == 1) {
score += 2;
logger.info("数据库-存储过程+2:" + score);
}
//函数
if (database.getFunction()!=null&&database.getFunction() == 1) {
score += 2;
logger.info("数据库-函数+2:" + score);
}
//DbLink
if (database.getDbLink()!=null&&database.getDbLink() == 1) {
score += 2;
logger.info("数据库-DBLink+2:" + score);
}
//定时任务
if (database.getTimeTask()!=null&&database.getTimeTask() == 1) {
score += 2;
logger.info("数据库-定时任务+2:" + score);
}
//序列
if (database.getSequence()!=null&&database.getSequence() == 1) {
score += 2;
logger.info("数据库-序列+2:" + score);
}
//触发器
if (database.getTrigger()!=null&&database.getTrigger() == 1) {
score += 2;
logger.info("数据库-触发器+2:" + score);
}
/*更多需求*/
//容灾:2主备3分布式
if (database.getDisasterTolerance()!=null&&(database.getDisasterTolerance() == 2 || database.getDisasterTolerance() == 3)) {
score += 10;
logger.info("数据库-容灾-主备/分布式+10:" + score);
}
//安全
if (database.getSafe()!=null&&database.getSafe() == 1) {
score += 10;
logger.info("数据库-安全+10:" + score);
}
//读写分离
if (database.getSeparate()!=null&&database.getSeparate() == 1) {
score += 10;
logger.info("数据库-读写分离+10:" + score);
}
//更高性能
if (database.getPerformance()!=null&&database.getPerformance() == 1) {
score += 10;
logger.info("数据库-更高性能+10:" + score);
}
//其他
if (database.getOtherContent() != null && !database.getOtherContent().trim().equals((""))) {
score += 10;
logger.info("数据库-其他+10:" + score);
}
}
/*迁移策略:平滑过渡+50%;短暂停顿+20%*/
if(reform.getStrategy()!=null&&reform.getStrategy()==1){
score+=score/2;
logger.info("迁移策略-平滑过渡+50%:"+score);
}else if(reform.getStrategy()!=null&&reform.getStrategy()==2){
score+=score/5;
logger.info("迁移策略-短暂停顿+20%:"+score);
}
return score;
}
//f:工作量(马)
//r:人工费
public void result(Reform reform,AssessmentReport report,double f,double r){
logger.info("计算工作量,输入:"+JSON.toJSONString(report));
//总计J = F(马) * 人工费
double j = f/r;
logger.info("总计J:"+j);
/*
计算以下三项,拼接字符串,完成关键技术及替换策略建议:
*/
//关键技术xx个
//本地程序开发项xx个
//中间件依赖修改项xx个
String string = "本系统通过源代码评估适配关键技术"+report.getTechnologyList().getTechnologyReports().size()+"项,"
+"其中本地程序开发修改项"+report.getDifficultyAssessment().getProgramDifficulty().getDependOnNum().size()+"项,"
+"中间件依赖修改项"+report.getDifficultyAssessment().getMiddlewareDifficulty().getDependOnNum().size()+"个....";
/*
先计算难度,再算基础工作量
*/
FrameDifficulty frameDifficulty = report.getDifficultyAssessment().getFrameDifficulty();
//系统部署架构难度P(混合:1.1 前后分离:1)即系统评估
double pFramework = (frameDifficulty.getDetails()== 1)?1.1:1;
logger.info("系统部署架构难度-评估:"+pFramework);
frameDifficulty.setSystemEvaluation(pFramework);
//系统部署架构难度e(分布式 0.2 负载均衡 0.1 容灾0.1 其他0.1) e = 1.2*1.1*1.1*1.1 即用户额外信息
double eFramework = 1*frameDifficulty.getDistributed()==1?1.2:1*frameDifficulty.getLoadBalance()==1?1.1:1*frameDifficulty.getDisaster()==1?1.1:1;
logger.info("系统部署架构难度-用户额外:"+eFramework);
frameDifficulty.setMessage(eFramework);
//系统部署架构综合难度 p*e
double multipleFramework = pFramework*eFramework;
logger.info("系统部署架构难度-综合:"+multipleFramework);
frameDifficulty.setDifficulty(multipleFramework);
//工作量2*j*(z-1)
double frameworkWorkload = 2*j*(multipleFramework-1);
logger.info("系统部署工作量:"+frameworkWorkload);
BrowserDifficulty browserDifficulty = report.getDifficultyAssessment().getBrowserDifficulty();
//浏览器难度P(0.001*样式数量+0.01*API数量+0.01*插件数量+1) max=1.3
double pBrowser = 0.001*browserDifficulty.getStyle()+0.01*browserDifficulty.getApi()+0.01*browserDifficulty.getPlugInUnit()+1;
pBrowser = pBrowser>1.3?1.3:pBrowser;
logger.info("浏览器难度-评估:"+pBrowser);
browserDifficulty.setSystemEvaluation(pBrowser);
//浏览器难度e(1+需求分数/100)*(1+需求分数/100) max=1.3
double eBrowser = (1+(browserDifficulty.getGeography()!=null&&browserDifficulty.getGeography()==1?1:0)/100)*
(1+(browserDifficulty.getPeripheral()!=null&&browserDifficulty.getPeripheral()==1?1:0)/100)*
(1+(browserDifficulty.getAnimation()!=null&&browserDifficulty.getAnimation()==1?1:0)/100)*
(1+(browserDifficulty.getThreeD()!=null&&browserDifficulty.getThreeD()==1?1:0)/100)*
(1+(browserDifficulty.getDocument()!=null&&browserDifficulty.getDocument()==1?1:0)/100)*
(1+(browserDifficulty.getMedia()!=null&&browserDifficulty.getMedia()==1?1:0)/100)*
(1+(browserDifficulty.getFlash()!=null&&browserDifficulty.getFlash()==1?1:0)/100)*
(1+(browserDifficulty.getOtherDemand()!=null&&browserDifficulty.getOtherDemand()==1?1:0)/100);
eBrowser = eBrowser>1.3?1.3:eBrowser;
logger.info("浏览器难度-用户额外:"+eBrowser);
browserDifficulty.setMessage(eBrowser);
//浏览器综合难度 p*e开根号
double multipleBrowser = Math.sqrt(pBrowser*eBrowser);
logger.info("浏览器难度-综合:"+multipleBrowser);
browserDifficulty.setDifficulty(multipleBrowser);
//工作量2*j*(z-1)
double browserWorkload = 2*j*(1-multipleBrowser);
logger.info("系统部署工作量:"+browserWorkload);
MiddlewareDifficulty middlewareDifficulty = report.getDifficultyAssessment().getMiddlewareDifficulty();
//中间件系统评估P (1+0.001*依赖数量)*(1+0.001*依赖数量)
double pMiddle = 1;
for(DependOnNum dependOnNum:middlewareDifficulty.getDependOnNum()){
pMiddle*=(1+0.001*dependOnNum.getNum());
}
pMiddle = pMiddle>1.3?1.3:pMiddle;
logger.info("中间件难度-评估:"+pMiddle);
middlewareDifficulty.setSystemEvaluation(pMiddle);
//中间件系统评估e (1+需求分数/100)*(1+需求分数/100) max=1.3
double emiddle = (1+(middlewareDifficulty.getWeb()==1?1:0)/100)*
(1+(middlewareDifficulty.getJms()==1?1:0)/100)*
(1+(middlewareDifficulty.getJndi()==1?1:0)/100)*
(1+(middlewareDifficulty.getRoute()==1?1:0)/100);
emiddle = emiddle>1.3?1.3:emiddle;
logger.info("中间件难度-用户额外:"+emiddle);
middlewareDifficulty.setMessage(emiddle);
//中间件综合难度 p*e开根号
double multipleMiddle = Math.sqrt(pMiddle*emiddle);
logger.info("中间件难度-综合:"+multipleMiddle);
middlewareDifficulty.setDifficulty(multipleMiddle);
//工作量2*j*(z-1)
double middleWorkload = 2*j*(multipleMiddle-1);
logger.info("中间件工作量:"+middleWorkload);
DatabaseDifficulty databaseDifficulty = report.getDifficultyAssessment().getDatabaseDifficulty();
//数据库e (1+需求/100)*...*(1+需求/100)
double eDatabase = 1;
for(DependOnNum dependOnNum:databaseDifficulty.getDependOnNum()){
eDatabase *= (1+1/100);
}
eDatabase *= (1+(databaseDifficulty.getSafe()==1?1:0)/100)*
(1+(databaseDifficulty.getSeparate()==1?1:0)/100)*
(1+(databaseDifficulty.getPerformance()==1?1:0)/100)*
(1+(databaseDifficulty.getOtherContent()==1?1:0)/100);
logger.info("数据库难度:"+eDatabase);
databaseDifficulty.setDifficulty(eDatabase);
//工作量2*j*(z-1)
double databaseWorkload = 2*j*(eDatabase-1);
logger.info("系统部署工作量:"+databaseWorkload);
//本地程序e (1+0.2)数量次幂 max=1.5
ProgramDifficulty programDifficulty = report.getDifficultyAssessment().getProgramDifficulty();
double eProgram = Math.pow(1.2, programDifficulty.getDependOnNum().size());
eProgram = eProgram>1.5?1.5:eProgram;
logger.info("本地程序难度:"+eProgram);
programDifficulty.setDifficulty(eProgram);
//工作量2*j*(z-1)
double programWorkload = 2*j*(eProgram-1);
logger.info("系统部署工作量:"+programWorkload);
/*
基础工作量评估
*/
//开发修正系数 (本地难度系数-1)+(浏览器难度系数-1)
double developmentCorrectionFactor = eProgram-1+multipleBrowser-1;
logger.info("开发修正系数 (本地难度系数-1)+(浏览器难度系数-1):"+developmentCorrectionFactor);
//测试修正系数 (系统部署难度-1)+(浏览器-1)
double testCorrectionFactor = multipleFramework-1+multipleBrowser-1;
logger.info("测试修正系数 (系统部署难度-1)+(浏览器-1):"+testCorrectionFactor);
//部署修正系数 (迁移)/100+(系统部署-1)+中间件部署-1+数据库部署-1
double deploymentCorrectionFactor = calculate(reform)/100+multipleFramework-1+multipleMiddle-1+eDatabase-1;
logger.info("部署修正系数 (迁移)/100+(系统部署-1)+中间件部署-1+数据库部署-1:"+deploymentCorrectionFactor);
//开发的开发量 J*(开发修正系数+0.4)
double developmentWorkload = j*(developmentCorrectionFactor+0.4);
logger.info("开发的开发量 J*(开发修正系数+0.4):"+developmentWorkload);
//测试的开发量 J*(测试修正系数+0.3)
double testWorkload = j*(testCorrectionFactor+0.3);
logger.info("测试的开发量 J*(测试修正系数+0.3):"+testWorkload);
//部署的开发量 J*(部署修正系数+0.3)
double deploymentWorkload = j*(deploymentCorrectionFactor+0.3);
logger.info("部署的开发量 J*(部署修正系数+0.3):"+deploymentWorkload);
//合计的开发量 总数
double totalWorkload = developmentWorkload+testWorkload+deploymentWorkload;
logger.info("合计的开发量 总数:"+totalWorkload);
report.getWorkload().getDevelopment().setDevelopmentVolume(developmentWorkload);
report.getWorkload().getDevelopment().setCorrectionFactor(developmentCorrectionFactor);
report.getWorkload().getTest().setDevelopmentVolume(testWorkload);
report.getWorkload().getTest().setCorrectionFactor(testCorrectionFactor);
report.getWorkload().getDeploy().setDevelopmentVolume(deploymentWorkload);
report.getWorkload().getDeploy().setCorrectionFactor(deploymentCorrectionFactor);
report.getWorkload().getTotal().setDevelopmentVolume(totalWorkload);
}
public static void main(String[] args) {
WorkLoadUtil workLoadUtil = new WorkLoadUtil();
workLoadUtil.result(new Reform(),new AssessmentReport(),1,1);
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论