Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
I
inspect
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
912协同工作系统
项目监控管理工具
inspect
Commits
eb3b263d
提交
eb3b263d
authored
3月 07, 2020
作者:
czq
浏览文件
操作
浏览文件
下载
差异文件
czq
上级
ebdffde4
9229a3c4
隐藏空白字符变更
内嵌
并排
正在显示
27 个修改的文件
包含
815 行增加
和
146 行删除
+815
-146
.gitignore
.gitignore
+2
-0
MvcConfig.java
src/main/java/com/zjty/inspect/config/MvcConfig.java
+18
-0
ConfigController.java
...in/java/com/zjty/inspect/controller/ConfigController.java
+44
-0
InspectController.java
...n/java/com/zjty/inspect/controller/InspectController.java
+57
-51
ConfigParamDao.java
src/main/java/com/zjty/inspect/dao/ConfigParamDao.java
+1
-0
ParameterDao.java
src/main/java/com/zjty/inspect/dao/ParameterDao.java
+2
-0
TechnologyDao.java
src/main/java/com/zjty/inspect/dao/TechnologyDao.java
+1
-1
Budget.java
src/main/java/com/zjty/inspect/entity/Budget.java
+20
-0
BudgetVo.java
src/main/java/com/zjty/inspect/entity/BudgetVo.java
+4
-0
DependencyVo.java
src/main/java/com/zjty/inspect/entity/DependencyVo.java
+2
-2
File.java
src/main/java/com/zjty/inspect/entity/File.java
+10
-0
InspectParameter.java
src/main/java/com/zjty/inspect/entity/InspectParameter.java
+4
-5
Report.java
src/main/java/com/zjty/inspect/entity/Report.java
+1
-4
ReportVo.java
src/main/java/com/zjty/inspect/entity/ReportVo.java
+9
-0
RuleQo.java
src/main/java/com/zjty/inspect/entity/RuleQo.java
+3
-1
CompatibleBrowser.java
src/main/java/com/zjty/inspect/enums/CompatibleBrowser.java
+0
-1
Inspector.java
src/main/java/com/zjty/inspect/inspect/Inspector.java
+108
-58
ConfigService.java
src/main/java/com/zjty/inspect/service/ConfigService.java
+11
-0
ParameterService.java
src/main/java/com/zjty/inspect/service/ParameterService.java
+7
-0
ConfigServiceImpl.java
...java/com/zjty/inspect/service/impl/ConfigServiceImpl.java
+26
-0
ParameterServiceImpl.java
...a/com/zjty/inspect/service/impl/ParameterServiceImpl.java
+14
-0
RuleServiceImpl.java
...n/java/com/zjty/inspect/service/impl/RuleServiceImpl.java
+15
-17
AnalysisFile.java
src/main/java/com/zjty/inspect/utils/AnalysisFile.java
+20
-2
BigDecimalUtil.java
src/main/java/com/zjty/inspect/utils/BigDecimalUtil.java
+23
-0
BudgetUitl.java
src/main/java/com/zjty/inspect/utils/BudgetUitl.java
+38
-3
FileUtil.java
src/main/java/com/zjty/inspect/utils/FileUtil.java
+0
-1
WorkLoadUtil.java
src/main/java/com/zjty/inspect/utils/WorkLoadUtil.java
+375
-0
没有找到文件。
.gitignore
浏览文件 @
eb3b263d
...
...
@@ -4,6 +4,8 @@ target/
**/lib/**
**/.DS_Store
./2020-**-**/**
!**/src/main/**
!**/src/test/**
mvnw
...
...
src/main/java/com/zjty/inspect/config/MvcConfig.java
0 → 100644
浏览文件 @
eb3b263d
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/"
);
}
};
}
}
src/main/java/com/zjty/inspect/controller/ConfigController.java
0 → 100644
浏览文件 @
eb3b263d
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
);
}
}
src/main/java/com/zjty/inspect/controller/InspectController.java
浏览文件 @
eb3b263d
...
...
@@ -11,6 +11,7 @@ import com.zjty.inspect.utils.*;
import
freemarker.template.TemplateException
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.io.FileUtils
;
import
org.apache.tomcat.util.http.fileupload.disk.DiskFileItem
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -25,11 +26,13 @@ import java.util.*;
/**
* 评估接口
*
* @author mcj
*/
@Slf4j
@RestController
@RequestMapping
(
"/inspect"
)
@Api
(
value
=
"评估接口管理接口"
,
description
=
"评估管理接口,提供页面的增、删、改、查"
)
@Api
(
value
=
"评估接口管理接口"
,
description
=
"评估管理接口,提供页面的增、删、改、查"
)
public
class
InspectController
{
@Autowired
private
InspectService
inspectService
;
...
...
@@ -42,32 +45,35 @@ public class InspectController {
@Autowired
private
ReportService
reportService
;
/**
* 上传代码进行评估
*
* @param years 系统开发时间
* @param systemFund
系统开发费用
* @param modules 模块数
* @param valid 预算数据是否可用
* @param framework 架构
* @param safety 安全能力
* @param disaster 容灾能力
* @param data 数据量
* @param admin 是否管理员
* @param multfile 文件
* @param systemFund 系统开发费用
* @param modules
模块数
* @param valid
预算数据是否可用
* @param framework
架构
* @param safety
安全能力
* @param disaster
容灾能力
* @param data
数据量
* @param admin
是否管理员
* @param multfile
文件
* @return
* @throws IOException
*/
@PostMapping
(
"/path"
)
@ApiOperation
(
"上传代码进行评估"
)
public
ResponseEntity
inspect
(
Integer
years
,
Integer
systemFund
,
Integer
modules
,
String
valid
,
Integer
framework
,
Integer
safety
,
Integer
disaster
,
Integer
data
,
Integer
admin
,
String
projectName
,
Integer
tables
,
String
databaseType
,
Integer
method
,
MultipartFile
multfile
)
throws
IOException
{
public
ResponseEntity
inspect
(
Integer
years
,
Integer
systemFund
,
Integer
modules
,
String
valid
,
Integer
framework
,
Integer
safety
,
Integer
disaster
,
Integer
data
,
Integer
admin
,
String
projectName
,
Integer
tables
,
String
databaseType
,
Integer
method
,
String
username
,
MultipartFile
multfile
)
throws
IOException
{
File
file
=
FileUtil
.
saveToLocal
(
multfile
);
log
.
info
(
"inspect:代码解压完成,地址为{}"
,
file
.
getCanonicalPath
());
InspectParameter
inspectParameter
=
new
InspectParameter
();
inspectParameter
.
setSourceAddress
(
file
.
getCanonicalPath
());
inspectParameter
.
setUsername
(
username
);
inspectParameter
.
setSystemFund
(
systemFund
);
inspectParameter
.
setAdmin
(
admin
);
inspectParameter
.
setModules
(
modules
);
inspectParameter
.
setSafety
(
safety
);
inspectParameter
.
setTables
(
tables
);
...
...
@@ -76,67 +82,67 @@ public class InspectController {
inspectParameter
.
setDisaster
(
disaster
);
inspectParameter
.
setData
(
data
);
inspectParameter
.
setFramework
(
framework
);
inspectParameter
.
setPath
(
file
.
getCanonicalPath
());
inspectParameter
.
setRecastMethod
(
method
);
inspectParameter
.
setId
(
UUIDUtil
.
getUUID
());
inspectParameter
.
setAdmin
(
admin
);
inspectParameter
.
setSystemFund
(
systemFund
);
inspectParameter
.
setRecastMethod
(
method
);
inspectParameter
.
setSourceAddress
(
file
.
getCanonicalPath
());
ReportVo
reportVo
=
new
ReportVo
();
int
count
=
technologyService
.
findAllTechnologyCount
();
reportVo
.
setTechnologiesNum
(
count
);
int
support
=
technologyService
.
findAllTechnologyNotSupport
();
reportVo
.
setTechnologiesRepair
(
support
);
reportVo
.
setId
(
RandomUtil
.
getRandom
());
reportVo
.
setUploadType
(
"文件上传"
);
reportVo
.
setFileName
(
file
.
getName
());
reportVo
.
setProjectName
(
projectName
);
reportVo
.
setSourceAddress
(
file
.
getCanonicalPath
());
reportVo
.
setDatabaseType
(
databaseType
);
ReportVo
inspect
=
inspectService
.
inspect
(
reportVo
,
inspectParameter
);
ReportVo
inspect
=
inspectService
.
inspect
(
reportVo
,
inspectParameter
);
Map
map
=
new
HashMap
();
map
.
put
(
"inspect"
,
inspect
);
map
.
put
(
"time"
,
TimeUtil
.
getTime
());
HashMap
<
String
,
List
<
Warn
>>
warnMap
=
inspect
.
getWarnDetails
();
List
<
Technology
>
technologies
=
inspect
.
getTechnologies
();
Map
techMap
=
new
HashMap
();
for
(
Technology
technology
:
technologies
)
{
techMap
.
put
(
technology
.
getTechnologyName
(),
technology
.
getSupport
());
}
map
.
put
(
"techMap"
,
techMap
);
map
.
put
(
"warnMap"
,
warnMap
);
map
.
put
(
"technologies"
,
technologies
);
try
{
String
template
=
FreemarkerUtils
.
getTemplate
(
"pg.ftl"
,
map
);
String
s
=
inspectService
.
generateHtml
(
template
,
map
);
String
filePath
=
FileUtil
.
createFilePath
();
File
file1
=
new
File
(
"./pgbg/"
+
filePath
+
"/"
+
file
.
getName
()
+
".html"
);
FileUtil
.
write
(
s
,
"./pgbg/"
+
filePath
+
"/"
+
file
.
getName
()+
".html"
);
reportVo
.
setHtmlAddress
(
file1
.
getCanonicalPath
());
System
.
out
.
println
(
"内容"
+
s
);
}
catch
(
TemplateException
e
)
{
e
.
printStackTrace
();
}
int
count
=
technologyService
.
findAllTechnologyCount
();
reportVo
.
setTechnologiesNum
(
count
);
int
support
=
technologyService
.
findAllTechnologyNotSupport
();
reportVo
.
setTechnologiesRepair
(
support
);
log
.
info
(
"inspect:代码评估完成"
);
// Map map = new HashMap();
// map.put("inspect", inspect);
// map.put("time", TimeUtil.getTime());
// HashMap<String, List<Warn>> warnMap = inspect.getWarnDetails();
// List<Technology> technologies = inspect.getTechnologies();
// Map techMap = new HashMap();
// for (Technology technology : technologies) {
// techMap.put(technology.getTechnologyName(), technology.getSupport());
// }
// map.put("techMap", techMap);
// map.put("warnMap", warnMap);
// map.put("technologies", technologies);
// try {
// String template = FreemarkerUtils.getTemplate("pg.ftl", map);
// String s = inspectService.generateHtml(template, map);
// String filePath = FileUtil.createFilePath();
// File file1 = new File("./pgbg/" + filePath + "/" + file.getName() + ".html");
// FileUtil.write(s,"./pgbg/"+filePath+"/"+file.getName()+".html");
// reportVo.setHtmlAddress(file1.getCanonicalPath());
// System.out.println("内容"+s);
// } catch (TemplateException e) {
// e.printStackTrace();
// }
Report
report
=
new
Report
();
String
random
=
RandomUtil
.
getRandom
();
report
.
setId
(
RandomUtil
.
getRandom
());
report
.
setHtmlAddress
(
reportVo
.
getHtmlAddress
());
reportService
.
saveReport
(
report
);
inspectParameter
.
setReportId
(
random
);
parameterService
.
saveParameter
(
inspectParameter
);
return
ResponseEntity
.
ok
(
inspect
);
}
/**
* git下载代码进行评估
*
* @param inspectParameter 封装
* @return
*/
@PostMapping
(
"/git"
)
@ApiOperation
(
"git下载代码进行评估"
)
public
ResponseEntity
inspect1
(
@RequestBody
InspectParameter
inspectParameter
){
String
path
=
GitLabUtil
.
downLoadProject
(
inspectParameter
.
getGitAddress
(),
inspectParameter
.
getGitName
());
public
ResponseEntity
inspect1
(
@RequestBody
InspectParameter
inspectParameter
)
{
String
path
=
GitLabUtil
.
downLoadProject
(
inspectParameter
.
getGitAddress
(),
inspectParameter
.
getGitName
());
inspectParameter
.
setId
(
UUIDUtil
.
getUUID
());
inspectParameter
.
setSourceAddress
(
path
);
ReportVo
reportVo
=
new
ReportVo
();
...
...
src/main/java/com/zjty/inspect/dao/ConfigParamDao.java
浏览文件 @
eb3b263d
...
...
@@ -9,4 +9,5 @@ import org.springframework.data.jpa.repository.JpaRepository;
*/
public
interface
ConfigParamDao
extends
JpaRepository
<
Config
,
Integer
>
{
Config
findByName
(
String
name
);
}
src/main/java/com/zjty/inspect/dao/ParameterDao.java
浏览文件 @
eb3b263d
...
...
@@ -4,4 +4,6 @@ import com.zjty.inspect.entity.InspectParameter;
import
org.springframework.data.jpa.repository.JpaRepository
;
public
interface
ParameterDao
extends
JpaRepository
<
InspectParameter
,
String
>
{
InspectParameter
findByUsernameEquals
(
String
username
);
}
src/main/java/com/zjty/inspect/dao/TechnologyDao.java
浏览文件 @
eb3b263d
...
...
@@ -47,5 +47,5 @@ public interface TechnologyDao extends JpaRepository<Technology,String>, JpaSpec
* @param backOrFront
* @return
*/
List
<
Technology
>
findAllByBackorfrontEquals
(
String
backOrFront
);
List
<
Technology
>
findAllByBackorfrontEquals
(
Integer
backOrFront
);
}
src/main/java/com/zjty/inspect/entity/Budget.java
浏览文件 @
eb3b263d
...
...
@@ -34,4 +34,24 @@ public class Budget {
*/
private
String
fundDetail
;
/**
* 占比
*/
private
double
proportion
;
/**
* 系统开发费用
*/
private
Integer
sysFund
;
/**
* 年利率
*/
private
double
moneyRate
;
/**
* 修正系数
*/
private
double
coefficient
;
}
src/main/java/com/zjty/inspect/entity/BudgetVo.java
浏览文件 @
eb3b263d
...
...
@@ -16,5 +16,9 @@ public class BudgetVo {
private
List
<
Budget
>
budget
=
new
ArrayList
<>();
/**
* 修正系数
*/
private
List
<
CoefficientModelVo
>
coefficientModelVos
=
new
ArrayList
<>();
}
src/main/java/com/zjty/inspect/entity/DependencyVo.java
浏览文件 @
eb3b263d
...
...
@@ -13,8 +13,8 @@ import java.util.List;
*/
@Data
public
class
DependencyVo
implements
Serializable
{
private
List
<
ProjectPom
>
depTreeList
=
new
ArrayList
<>();
private
List
<
ProjectPom
>
frontend
=
new
ArrayList
<>();
private
List
<
ProjectPom
>
depTreeList
=
new
ArrayList
<>(
64
);
private
List
<
ProjectPom
>
frontend
=
new
ArrayList
<>(
64
);
public
void
add
(
ProjectPom
projectPom
){
depTreeList
.
add
(
projectPom
);
...
...
src/main/java/com/zjty/inspect/entity/File.java
0 → 100644
浏览文件 @
eb3b263d
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
{
}
src/main/java/com/zjty/inspect/entity/InspectParameter.java
浏览文件 @
eb3b263d
...
...
@@ -22,6 +22,10 @@ public class InspectParameter {
@Id
private
String
id
;
/**
* 用户名
*/
private
String
username
;
/**
* 重构占比
*/
...
...
@@ -87,11 +91,6 @@ public class InspectParameter {
*/
private
Integer
disaster
;
/**
* git地址
*/
private
String
path
;
/**
* null:无效
*/
...
...
src/main/java/com/zjty/inspect/entity/Report.java
浏览文件 @
eb3b263d
...
...
@@ -26,10 +26,7 @@ public class Report {
*/
private
String
htmlAddress
;
//前端适配预算
//代码重构预算
//代码修改预算
private
String
username
;
/**
* 数据创建时间
*/
...
...
src/main/java/com/zjty/inspect/entity/ReportVo.java
浏览文件 @
eb3b263d
...
...
@@ -99,6 +99,15 @@ public class ReportVo {
*/
private
Integer
technologiesRepair
;
/**
* 文件个数
*/
private
Integer
fileNum
;
/**
* 文件行数
*/
private
Integer
fileLine
;
/**
* 评估时间
...
...
src/main/java/com/zjty/inspect/entity/RuleQo.java
浏览文件 @
eb3b263d
...
...
@@ -23,7 +23,9 @@ public class RuleQo {
/**
* 匹配的文件后缀
*/
private
List
<
String
>
suffix
;
private
List
<
String
>
suffixes
;
private
String
suffix
;
/**
* 适配技术id
...
...
src/main/java/com/zjty/inspect/enums/CompatibleBrowser.java
浏览文件 @
eb3b263d
package
com
.
zjty
.
inspect
.
enums
;
import
jdk.internal.dynalink.beans.BeansLinker
;
/**
* <h4>Description : 兼容的浏览器</h4>
...
...
src/main/java/com/zjty/inspect/inspect/Inspector.java
浏览文件 @
eb3b263d
...
...
@@ -16,6 +16,7 @@ import org.springframework.stereotype.Service;
import
org.springframework.transaction.annotation.Transactional
;
import
java.io.IOException
;
import
java.nio.charset.MalformedInputException
;
import
java.nio.file.*
;
import
java.nio.file.attribute.BasicFileAttributes
;
import
java.util.*
;
...
...
@@ -49,8 +50,8 @@ public class Inspector {
private
ParameterDao
parameterDao
;
private
DependencyVo
dependencyVo
=
new
DependencyVo
();
private
ArrayList
<
Rule
>
rules
=
new
ArrayList
<
Rule
>(
);
private
ArrayList
<
Warn
>
warns
=
new
ArrayList
<>();
private
ArrayList
<
Rule
>
rules
=
new
ArrayList
<
>(
512
);
private
ArrayList
<
Warn
>
warns
=
new
ArrayList
<>(
64
);
/**
* 添加规则时去重使用
...
...
@@ -60,7 +61,7 @@ public class Inspector {
* <p>
* value:随意
*/
private
HashMap
<
String
,
Rule
>
ruleMap
=
new
HashMap
<>();
private
HashMap
<
String
,
Rule
>
ruleMap
=
new
HashMap
<>(
512
);
/**
* 支持的国产化技术
...
...
@@ -80,7 +81,19 @@ public class Inspector {
*/
private
InspectParameter
inspectParameter
;
/**
* 源代码大小
*/
private
double
codeSize
=
0
;
/**
* 文件数量
*/
private
Integer
fileNum
=
0
;
/**
* 文件行数
*/
private
Integer
fileLine
=
0
;
/**
* 报告对象
*/
...
...
@@ -91,14 +104,14 @@ public class Inspector {
* key:java
* value:10
*/
private
Map
<
String
,
Counter
>
languageMatchMap
=
new
HashMap
<>();
private
Map
<
String
,
Counter
>
languageMatchMap
=
new
HashMap
<>(
16
);
/**
* 后缀语言
* key:properties
* 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 {
* 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
>>
ruleSuffixFile
Path
Map
;
private
Map
<
String
,
List
<
Rule
>>
ruleSuffixMap
;
/**
...
...
@@ -120,7 +133,7 @@ public class Inspector {
* key:技术id
* value:Technology
*/
private
Map
<
String
,
Technology
>
technologyHashMap
=
new
HashMap
<>();
private
Map
<
String
,
Technology
>
technologyHashMap
=
new
HashMap
<>(
64
);
/**
* 统计各后缀文件路径与出现次数,顺便解析jar与js文件
...
...
@@ -128,19 +141,28 @@ public class Inspector {
* FileVisitResult.TERMINATE 中止访问
* FileVisitResult.SKIP_SIBLINGS 不访问同级的文件或目录
* FileVisitResult.SKIP_SUBTREE 不访问子目录
*
* @return 报告
* 准备工作
* 1.解析文件
* 2/记录文件地址
* 3/统计各个规则文件后缀
* @return
*/
public
ReportVo
inspect
()
{
ruleSuffixFileMap
=
new
HashMap
<>();
ruleSuffixFile
Path
Map
=
new
HashMap
<>();
ruleSuffixMap
=
new
HashMap
<>();
warns
.
clear
();
rules
.
clear
();
//查询技术,构造支持与非支持技术对象
findExistTechnology
();
statisticsLanguage
();
this
.
ruleList
=
ruleDao
.
findAll
();
//统计项目组成文件构成
//统计配置文件地址
statisticsConfigFile
();
this
.
ruleList
=
ruleDao
.
findAll
();
//根据后缀名,收集文件进行操作
for
(
Rule
rule
:
ruleList
)
{
if
(!
ruleSuffixFilePathMap
.
containsKey
(
rule
.
getSuffix
()))
{
ruleSuffixFilePathMap
.
put
(
rule
.
getSuffix
(),
new
ArrayList
<>());
}
}
try
{
//以下为计算文件名称匹配正则表达式
FileSystem
aDefault
=
FileSystems
.
getDefault
();
...
...
@@ -155,12 +177,13 @@ public class Inspector {
configFileMatcherSuffixMapping
.
put
(
aDefault
.
getPathMatcher
(
"glob:**/*."
+
s
),
s
);
}
//构造规则后缀的正则表达式
Map
<
PathMatcher
,
String
>
ruleSuffix
=
new
HashMap
<>(
16
);
for
(
String
s
:
ruleSuffixFileMap
.
keySet
())
{
ruleSuffix
.
put
(
aDefault
.
getPathMatcher
(
"glob:**/*."
+
s
),
s
);
Map
<
PathMatcher
,
String
>
ruleSuffix
Map
=
new
HashMap
<>(
16
);
for
(
String
s
:
ruleSuffixFile
Path
Map
.
keySet
())
{
ruleSuffix
Map
.
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
public
FileVisitResult
preVisitDirectory
(
Path
dir
,
BasicFileAttributes
attrs
)
throws
IOException
{
//这里是对于路径(文件夹)的过滤,在这里读不到文件如果能判断,可以返回FileVisitResult.SKIP_SUBTREE 不访问子目录
...
...
@@ -171,7 +194,15 @@ public class Inspector {
@Override
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
())
{
//通过正则表达式匹配.java类型后缀文件,并+1
if
(
entry
.
getValue
().
matches
(
file
))
{
...
...
@@ -186,10 +217,10 @@ public class Inspector {
configFileTypePathsMapping
.
get
(
entry
.
getValue
()).
add
(
file
);
}
}
for
(
Map
.
Entry
<
PathMatcher
,
String
>
entry
:
ruleSuffix
.
entrySet
())
{
for
(
Map
.
Entry
<
PathMatcher
,
String
>
entry
:
ruleSuffix
Map
.
entrySet
())
{
//通过规则匹配后缀正则表达式匹配,记录匹配上的文件地址
if
(
entry
.
getKey
().
matches
(
file
))
{
ruleSuffixFileMap
.
get
(
entry
.
getValue
()).
add
(
file
);
ruleSuffixFile
Path
Map
.
get
(
entry
.
getValue
()).
add
(
file
);
}
}
//检查到普通jar包
...
...
@@ -248,6 +279,9 @@ public class Inspector {
e
.
printStackTrace
();
}
inspectParameter
.
setCodeSize
((
int
)
codeSize
);
report
.
setFileNum
(
fileNum
);
report
.
setFileLine
(
fileLine
);
log
.
info
(
"inspect:源代码扫描完成,统计各个文件后缀完成"
);
return
analysis
();
}
...
...
@@ -260,11 +294,8 @@ public class Inspector {
public
ReportVo
analysis
()
{
DependencyVo
dependencyVo
=
new
DependencyVo
();
setReportLanguageAndFrame
();
//查询技术,构造支持与非支持技术对象
findExistTechnology
();
//查询所有规则
ruleTransform
(
report
.
getRecastMethod
());
//解析配置文件集合
for
(
Map
.
Entry
<
String
,
List
<
Path
>>
entry
:
configFileTypePathsMapping
.
entrySet
())
{
switch
(
entry
.
getKey
())
{
...
...
@@ -306,7 +337,7 @@ public class Inspector {
}
}
//指定后缀到文件匹配关键字
for
(
Map
.
Entry
<
String
,
List
<
Path
>>
entry
:
ruleSuffixFileMap
.
entrySet
())
{
for
(
Map
.
Entry
<
String
,
List
<
Path
>>
entry
:
ruleSuffixFile
Path
Map
.
entrySet
())
{
//entry,key为后缀,value为文件列表
String
key
=
entry
.
getKey
();
//从ruleSuffixList获取指定后缀的规则列表
...
...
@@ -331,6 +362,7 @@ public class Inspector {
//将得到的告警信息根据技术id进行转换
Set
<
String
>
collect
=
warns
.
stream
().
map
(
Warn:
:
getTechnologyId
).
collect
(
Collectors
.
toSet
());
List
<
Technology
>
allById
=
technologyDao
.
findAllById
(
collect
);
//计算技术金额
Integer
fund
=
0
;
for
(
Technology
tech
:
allById
)
{
...
...
@@ -340,9 +372,8 @@ public class Inspector {
if
(
inspectParameter
.
getValid
()
!=
null
)
{
BudgetVo
budget
=
budgetUitl
.
getBudget
(
fund
,
report
,
inspectParameter
);
report
.
setBudgets
(
budget
);
inspectParameter
.
setId
(
UUIDUtil
.
getUUID
());
parameterDao
.
save
(
inspectParameter
);
}
parameterDao
.
save
(
inspectParameter
);
//填充地址(如果有)
report
.
setGitAddress
(
inspectParameter
.
getGitAddress
());
//填充适配技术
...
...
@@ -350,16 +381,15 @@ public class Inspector {
//填充依赖
report
.
setDependencyVo
(
dependencyVo
);
//数据转换
HashMap
<
String
,
Technology
>
map
=
new
HashMap
<>();
for
(
Technology
technology1
:
allById
)
{
map
.
put
(
technology1
.
getId
(),
technology1
);
}
HashMap
<
String
,
List
<
Warn
>>
warnMap
=
getWarnMap
(
map
);
HashMap
<
String
,
List
<
Warn
>>
warnMap
=
getWarnMap
();
ruleDao
.
saveAll
(
rules
);
report
.
setWarnDetails
(
warnMap
);
fileLine
=
0
;
fileNum
=
0
;
return
report
;
}
private
void
setReportLanguageAndFrame
()
{
String
most
=
null
;
int
mostStatus
=
0
;
...
...
@@ -380,26 +410,28 @@ public class Inspector {
//设置是否需要重构
if
(
languageMatchMap
.
get
(
"jsp"
).
i
==
0
&
languageMatchMap
.
get
(
"java"
).
i
==
0
)
{
report
.
setRecastMethod
(
RecastMethod
.
适配重构
.
getStatus
());
log
.
info
(
"inspect:代码解析完成,建议进行适配重构"
);
}
else
{
report
.
setRecastMethod
(
RecastMethod
.
代码修改
.
getStatus
());
log
.
info
(
"inspect:代码解析完成,建议进行代码修改"
);
}
}
/**
* rule所需要数据装配
*/
private
void
ruleTransform
(
int
i
)
{
if
(
i
==
1
)
{
List
<
Technology
>
front
=
technologyDao
.
findAllByBackorfrontEquals
(
"1"
);
private
void
ruleTransform
(
Integer
i
)
{
if
(
i
==
1
)
{
List
<
Technology
>
front
=
technologyDao
.
findAllByBackorfrontEquals
(
1
);
List
<
String
>
ids
=
front
.
stream
().
map
(
Technology:
:
getId
).
collect
(
Collectors
.
toList
());
this
.
ruleList
=
ruleDao
.
findAllByTechnologyIdIn
(
ids
);
}
else
{
if
(
inspectParameter
.
getRecastMethod
()==
1
)
{
this
.
ruleList
=
ruleDao
.
findAll
();
}
else
{
List
<
Technology
>
front
=
technologyDao
.
findAllByBackorfrontEquals
(
"1"
);
this
.
ruleList
=
ruleDao
.
findAllByTechnologyIdIn
(
ids
);
}
else
{
if
(
inspectParameter
.
getRecastMethod
()
==
1
)
{
this
.
ruleList
=
ruleDao
.
findAll
();
}
else
{
List
<
Technology
>
front
=
technologyDao
.
findAllByBackorfrontEquals
(
1
);
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
());
...
...
@@ -407,12 +439,6 @@ public class Inspector {
for
(
Technology
technology
:
technologies
)
{
technologyHashMap
.
put
(
technology
.
getId
(),
technology
);
}
//根据后缀名,收集文件进行操作
for
(
Rule
rule
:
ruleList
)
{
if
(!
ruleSuffixFileMap
.
containsKey
(
rule
.
getSuffix
()))
{
ruleSuffixFileMap
.
put
(
rule
.
getSuffix
(),
new
ArrayList
<>());
}
}
//根据后缀名进行规则收集
for
(
Rule
rule
:
ruleList
)
{
if
(!
ruleSuffixMap
.
containsKey
(
rule
.
getSuffix
()))
{
...
...
@@ -422,6 +448,15 @@ public class Inspector {
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
()
{
...
...
@@ -441,22 +476,38 @@ public class Inspector {
}
private
void
findExistTechnology
()
{
techJavaSupport
=
technologyDao
.
findAllByTechnologyNameEquals
(
"
Java依赖
"
);
techNotCnSupport
=
technologyDao
.
findAllByTechnologyNameEquals
(
"非国产化依赖"
);
techUnKnowSupport
=
technologyDao
.
findAllByTechnologyNameEquals
(
"未知依赖"
);
techJavaSupport
=
technologyDao
.
findAllByTechnologyNameEquals
(
"
国产化依赖(支持)
"
);
techNotCnSupport
=
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
<>();
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
<>();
warns1
.
add
(
warn
);
warnMap
.
put
(
map
.
get
(
warn
.
getTechnologyId
()).
getTechnologyName
(),
warns1
);
}
else
{
warnMap
.
get
(
map
.
get
(
warn
.
getTechnologyId
()).
getTechnologyName
()).
add
(
warn
);
warnMap
.
put
(
techMap
.
get
(
warn
.
getTechnologyId
()).
getTechnologyName
(),
warns1
);
}
else
{
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
;
}
...
...
@@ -466,6 +517,7 @@ public class Inspector {
* @param dependency 依赖
*/
private
void
setRule
(
Path
path
,
StringBuilder
stringBuilder
,
PomDependency
dependency
)
{
stringBuilder
.
append
(
dependency
.
getGroupId
()).
append
(
":"
).
append
(
dependency
.
getArtifactId
());
if
(
inspectParameter
.
getAdmin
()
==
1
)
{
Rule
rule
=
new
Rule
();
...
...
@@ -474,14 +526,12 @@ public class Inspector {
rule
.
setTechnologyName
(
techJavaSupport
.
getTechnologyName
());
rule
.
setSuffix
(
"*"
);
rule
.
setId
(
UUIDUtil
.
getUUID
());
Rule
rule1
=
new
Rule
();
rule1
.
setTechnologyId
(
techJavaSupport
.
getId
());
rule1
.
setTarget
(
dependency
.
getArtifactId
());
rule1
.
setTechnologyName
(
techJavaSupport
.
getTechnologyName
());
rule1
.
setSuffix
(
"*"
);
rule1
.
setId
(
UUIDUtil
.
getUUID
());
if
(!
ruleMap
.
containsKey
(
dependency
.
getGroupId
()
+
":"
+
rule
.
getSuffix
()))
{
rules
.
add
(
rule
);
ruleMap
.
put
(
dependency
.
getGroupId
()
+
":"
+
rule
.
getSuffix
(),
rule
);
...
...
src/main/java/com/zjty/inspect/service/ConfigService.java
0 → 100644
浏览文件 @
eb3b263d
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
();
}
src/main/java/com/zjty/inspect/service/ParameterService.java
浏览文件 @
eb3b263d
...
...
@@ -20,4 +20,11 @@ public interface ParameterService {
* @param id id
*/
public
InspectParameter
getParameterById
(
String
id
);
/**
* 根据用户名获取参数
* @param username 用户名
* @return 参数对象
*/
public
InspectParameter
getParameterByUsername
(
String
username
);
}
src/main/java/com/zjty/inspect/service/impl/ConfigServiceImpl.java
0 → 100644
浏览文件 @
eb3b263d
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
();
}
}
src/main/java/com/zjty/inspect/service/impl/ParameterServiceImpl.java
浏览文件 @
eb3b263d
...
...
@@ -7,6 +7,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.Objects
;
import
java.util.Optional
;
/**
* 参数
* @author Mcj
...
...
@@ -32,4 +35,15 @@ public class ParameterServiceImpl implements ParameterService {
}
return
new
InspectParameter
();
}
/**
* 根据用户名查询参数
* @param username 用户名
* @return 参数
*/
@Override
public
InspectParameter
getParameterByUsername
(
String
username
)
{
InspectParameter
inspectParameter
=
parameterDao
.
findByUsernameEquals
(
username
);
return
inspectParameter
;
}
}
src/main/java/com/zjty/inspect/service/impl/RuleServiceImpl.java
浏览文件 @
eb3b263d
...
...
@@ -44,7 +44,7 @@ public class RuleServiceImpl implements RuleService {
private
TechnologyService
technologyService
;
@Override
public
void
test
(){
public
void
test
()
{
List
<
Rule
>
rules
=
ruleDao
.
findAll
();
for
(
Rule
rule
:
rules
)
{
Technology
technology
=
technologyService
.
findByid
(
rule
.
getTechnologyId
());
...
...
@@ -52,6 +52,7 @@ public class RuleServiceImpl implements RuleService {
}
ruleDao
.
saveAll
(
rules
);
}
/**
* 新增规则
*
...
...
@@ -59,10 +60,10 @@ public class RuleServiceImpl implements RuleService {
*/
@Override
public
void
addRule
(
RuleQo
ruleQo
)
{
for
(
String
suffix
:
ruleQo
.
getSuffix
()
)
{
Rule
rule1
=
ruleDao
.
findByTargetAndSuffixEquals
(
ruleQo
.
getTarget
(),
suffix
);
if
(
rule1
!=
null
)
{
List
<
String
>
suffixes
=
ruleQo
.
getSuffixes
();
for
(
String
suffix
:
suffixes
)
{
Rule
rule1
=
ruleDao
.
findByTargetAndSuffixEquals
(
ruleQo
.
getTarget
(),
suffix
);
if
(
rule1
!=
null
)
{
return
;
}
Rule
rule
=
new
Rule
();
...
...
@@ -73,6 +74,7 @@ public class RuleServiceImpl implements RuleService {
rule
.
setId
(
UUIDUtil
.
getUUID
());
ruleDao
.
save
(
rule
);
}
}
/**
...
...
@@ -115,19 +117,15 @@ public class RuleServiceImpl implements RuleService {
@Override
public
void
upRule
(
RuleQo
ruleQo
)
{
for
(
String
suffix
:
ruleQo
.
getSuffix
())
{
Rule
rule1
=
ruleDao
.
findByTarget
(
ruleQo
.
getTarget
());
if
(
rule1
!=
null
){
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
);
Rule
rule1
=
ruleDao
.
findByTarget
(
ruleQo
.
getId
());
if
(
rule1
==
null
)
{
return
;
}
rule1
.
setTarget
(
ruleQo
.
getTarget
());
rule1
.
setSuffix
(
ruleQo
.
getSuffix
());
rule1
.
setTechnologyId
(
ruleQo
.
getTechnologyId
());
rule1
.
setTechnologyName
(
ruleQo
.
getTechnologyName
());
ruleDao
.
save
(
rule1
);
}
@Override
...
...
src/main/java/com/zjty/inspect/utils/AnalysisFile.java
浏览文件 @
eb3b263d
...
...
@@ -38,9 +38,11 @@ public class AnalysisFile {
if
(
string
.
indexOf
(
"compile"
)>
0
){
PomDependency
pomDependency
=
new
PomDependency
();
int
compile
=
string
.
indexOf
(
"compile"
);
int
i
=
compile
+
8
;
int
i
=
compile
+
9
;
String
substring
=
string
.
substring
(
i
);
pomDependency
.
setGradle
(
substring
);
String
[]
split
=
substring
.
split
(
":"
);
pomDependency
.
setGroupId
(
split
[
0
]);
pomDependency
.
setArtifactId
(
split
[
1
]);
dependencies
.
add
(
pomDependency
);
}
}
...
...
@@ -172,4 +174,20 @@ public class AnalysisFile {
projectPom
.
setDependencies
(
dependencies
);
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
);
}
}
}
src/main/java/com/zjty/inspect/utils/BigDecimalUtil.java
0 → 100644
浏览文件 @
eb3b263d
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.1111111
D
);
System
.
out
.
println
(
precision
);
}
}
src/main/java/com/zjty/inspect/utils/BudgetUitl.java
浏览文件 @
eb3b263d
...
...
@@ -6,6 +6,7 @@ import com.zjty.inspect.entity.*;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
java.math.BigDecimal
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
...
...
@@ -120,14 +121,28 @@ public class BudgetUitl {
budgetVo
.
getCoefficientModelVos
().
add
(
coefficientModelVo
);
}
coefficient
=
BigDecimalUtil
.
get2precision
(
coefficient
);
if
(
inspectParameter
.
getRecastMethod
()==
1
){
//用户需要适配
double
refactorProportion
=
Double
.
valueOf
(
doubleHashMap
.
get
(
4
));
inspectParameter
.
setProportion
(
refactorProportion
);
Budget
codeRefactor
=
new
Budget
();
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
;
fundNotRepair
+=
fund
;
fundRepair
+=
fund
;
fundNotRepair
=
BigDecimalUtil
.
get2precision
(
fundNotRepair
);
fundRepair
=
BigDecimalUtil
.
get2precision
(
fundRepair
);
if
(
fundNotRepair
<
fundRepair
){
codeRefactor
.
setFund
(
fundNotRepair
+
"--"
+
fundRepair
);
}
else
if
(
fundNotRepair
>
fundRepair
){
...
...
@@ -143,9 +158,19 @@ public class BudgetUitl {
double
refactorProportion1
=
Double
.
valueOf
(
doubleHashMap
.
get
(
2
));
inspectParameter
.
setProportion
(
refactorProportion1
);
Budget
codeRefactor1
=
new
Budget
();
codeRefactor1
.
setProportion
(
refactorProportion1
);
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
;
fundNotRepair1
=
BigDecimalUtil
.
get2precision
(
fundNotRepair1
);
fundRepair1
=
BigDecimalUtil
.
get2precision
(
fundRepair1
);
fundNotRepair1
+=
fund
;
fundRepair1
+=
fund
;
if
(
fundNotRepair1
<
fundRepair1
){
codeRefactor1
.
setFund
(
fundNotRepair1
+
"--"
+
fundRepair1
);
}
else
if
(
fundNotRepair1
>
fundRepair1
){
...
...
@@ -162,9 +187,19 @@ public class BudgetUitl {
double
refactorProportion
=
Double
.
valueOf
(
doubleHashMap
.
get
(
3
));
inspectParameter
.
setProportion
(
refactorProportion
);
Budget
codeRefactor1
=
new
Budget
();
codeRefactor1
.
setProportion
(
refactorProportion
);
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
;
fundNotRepair1
+=
fund
;
fundRepair1
+=
fund
;
fundNotRepair1
=
BigDecimalUtil
.
get2precision
(
fundNotRepair1
);
fundRepair1
=
BigDecimalUtil
.
get2precision
(
fundRepair1
);
if
(
fundNotRepair1
<
fundRepair1
){
codeRefactor1
.
setFund
(
fundNotRepair1
+
"--"
+
fundRepair1
);
}
else
if
(
fundNotRepair1
>
fundRepair1
){
...
...
src/main/java/com/zjty/inspect/utils/FileUtil.java
浏览文件 @
eb3b263d
...
...
@@ -51,7 +51,6 @@ public class FileUtil {
File
file3
=
new
File
(
"./"
+
name
+
"/"
+
split1
[
0
]+
"/"
+
split
[
0
]);
excelFile
.
delete
();
log
.
info
(
"end unpack file"
);
System
.
out
.
println
(
file3
.
getCanonicalPath
());
return
file3
;
}
...
...
src/main/java/com/zjty/inspect/utils/WorkLoadUtil.java
0 → 100644
浏览文件 @
eb3b263d
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
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论