提交 bc13bf89 authored 作者: wyl's avatar wyl

工作量工具类

上级 def86cbd
...@@ -47,7 +47,44 @@ public class BrowserDifficulty { ...@@ -47,7 +47,44 @@ public class BrowserDifficulty {
/** /**
* 用户额外需求 * 用户额外需求
*/ */
private String demand = "*********"; /**
* 地理信息系统 int 1:是 2:否
*/
private Integer geography;
/**
* 调用外设
*/
private Integer peripheral;
/**
*动画
*/
private Integer animation;
/**
* 3d展示
*/
private Integer threeD;
/**
* 公文显现与编辑
*/
private Integer document;
/**
* 多媒体
*/
private Integer media;
/**
* Flash
*/
private Integer flash;
/**
* 其他
*/
private Integer otherDemand;
} }
package com.zjty.inspect.utils; package com.zjty.inspect.utils;
import com.alibaba.fastjson.JSON;
import com.zjty.inspect.entity.*; import com.zjty.inspect.entity.*;
import com.zjty.inspect.enums.CompatibleBrowser; import com.zjty.inspect.enums.CompatibleBrowser;
import com.zjty.inspect.enums.DatabaseType; import com.zjty.inspect.enums.DatabaseType;
import com.zjty.inspect.enums.Framework;
import com.zjty.inspect.enums.MiddlewareEnum; import com.zjty.inspect.enums.MiddlewareEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List; import java.util.List;
...@@ -13,164 +17,359 @@ import java.util.List; ...@@ -13,164 +17,359 @@ import java.util.List;
* @Date 2020-03-6 14:20 * @Date 2020-03-6 14:20
*/ */
public class WorkLoadUtil { public class WorkLoadUtil {
public double calculate(Reform reform){ Logger logger = LoggerFactory.getLogger(getClass());
private double calculate(Reform reform){
logger.info("分值计算,输入:"+JSON.toJSON(reform));
double score = 0; double score = 0;
/** /**
* 系统部署架构,其他需求,分布式、负载均衡、容灾每个+10 * 系统部署架构,其他需求,分布式、负载均衡、容灾每个+10
*/ */
SystemStructure systemStructure = reform.getSystemStructure(); SystemStructure systemStructure = reform.getSystemStructure();
//分布式 if(systemStructure!=null) {
if(systemStructure.getDistributed()==1){ //分布式
score+=10; if (systemStructure.getDistributed() != null && systemStructure.getDistributed() == 1) {
} score += 10;
//负载均衡 logger.info("分布式+10:" + score);
if(systemStructure.getLoadBalance()==1){ }
score+=10; //负载均衡
} if (systemStructure.getLoadBalance() != null && systemStructure.getLoadBalance() == 1) {
//容灾 score += 10;
if(systemStructure.getDisaster()==1){ logger.info("负载均衡+10:" + score);
score+=10; }
//容灾
if (systemStructure.getDisaster() != null && systemStructure.getDisaster() == 1) {
score += 10;
logger.info("容灾+10:" + score);
}
} }
/** /**
* 前端浏览器相关 * 前端浏览器相关
*/ */
Browser browser = reform.getBrowser(); Browser browser = reform.getBrowser();
//如果原浏览器包含IE,+10 if(browser!=null) {
if(browser.getCompatibleBrowsers().contains(CompatibleBrowser.IETRIDENT)){ //如果原浏览器包含IE,+10
score+=10; if (browser.getCompatibleBrowsers().contains(CompatibleBrowser.IETRIDENT)) {
} score += 10;
/*更多需求,每个+1*/ logger.info("包含IE+10:" + score);
//地理信息系统 }
if(browser.getGeography()==1){ /*更多需求,每个+1*/
score+=1; //地理信息系统
} if (browser.getGeography()!=null&&browser.getGeography() == 1) {
//调用外设 score += 1;
if(browser.getPeripheral()==1){ logger.info("浏览器-地理信息系统+1:" + score);
score+=1; }
} //调用外设
//动画 if (browser.getPeripheral()!=null&&browser.getPeripheral() == 1) {
if(browser.getAnimation()==1){ score += 1;
score+=1; logger.info("浏览器-调用外设+1:" + score);
} }
//3D展示 //动画
if(browser.getThreeD()==1){ if (browser.getAnimation()!=null&&browser.getAnimation() == 1) {
score+=1; score += 1;
} logger.info("浏览器-动画+1:" + score);
//公文实现与编辑 }
if(browser.getDocument()==1){ //3D展示
score+=1; if (browser.getThreeD()!=null&&browser.getThreeD() == 1) {
} score += 1;
//多媒体 logger.info("浏览器-3D展示+1:" + score);
if(browser.getMedia()==1){ }
score+=1; //公文实现与编辑
} if (browser.getDocument()!=null&&browser.getDocument() == 1) {
//flash score += 1;
if(browser.getFlash()==1){ logger.info("浏览器-公文编辑+1:" + score);
score+=1; }
} //多媒体
//其他 if (browser.getMedia()!=null&&browser.getMedia() == 1) {
if(browser.getOtherDemand()==1){ score += 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 * 中间件,除Tomcat外每个+5;更多需求,每个+10
*/ */
Middleware middleware = reform.getMiddleware(); Middleware middleware = reform.getMiddleware();
List<MiddlewareEnum> middlewareEnums = middleware.getMiddlewareEnums(); if(middleware!=null) {
int effectMidNum = middlewareEnums.size(); List<MiddlewareEnum> middlewareEnums = middleware.getMiddlewareEnums();
if(middlewareEnums.contains(MiddlewareEnum.TOMCAT)){ int effectMidNum = middlewareEnums.size();
effectMidNum--; if (middlewareEnums.contains(MiddlewareEnum.TOMCAT)) {
} effectMidNum--;
if(middleware.getOtherMiddleware()!=null&&!middleware.getOtherMiddleware().trim().equals("")){ }
effectMidNum++; if (middleware.getOtherMiddleware() != null && !middleware.getOtherMiddleware().trim().equals("")) {
} effectMidNum++;
score+=effectMidNum*5; }
/*更多需求*/ score += effectMidNum * 5;
//Web集群 logger.info("中间件-数量*5:" + effectMidNum + "\t" + score);
if(middleware.getWeb()==1){ /*更多需求*/
score+=10; //Web集群
} if (middleware.getWeb()!=null&&middleware.getWeb() == 1) {
//Jndi集群 score += 10;
if(middleware.getJndi()==1){ logger.info("中间件-Web集群+10:" + score);
score+=10; }
} //Jndi集群
//Jms集群 if (middleware.getJndi()!=null&&middleware.getJndi() == 1) {
if(middleware.getJms()==1){ score += 10;
score+=10; logger.info("中间件-Jndi集群+10:" + score);
} }
//消息路由 //Jms集群
if(middleware.getRoute()==1){ if (middleware.getJms()!=null&&middleware.getJms() == 1) {
score+=10; score += 10;
logger.info("中间件-Jms集群+10:" + score);
}
//消息路由
if (middleware.getRoute()!=null&&middleware.getRoute() == 1) {
score += 10;
logger.info("中间件-消息路由+10:" + score);
}
} }
/** /**
* 数据库相关,除mysql每个+10;小需求每个+2;更多需求每个+10 * 数据库相关,除mysql每个+10;小需求每个+2;更多需求每个+10
*/ */
Database database = reform.getDatabase(); Database database = reform.getDatabase();
List<DatabaseType> databaseType = database.getDatabaseType(); if(database!=null) {
int effectDatabaseNum = databaseType.size(); List<DatabaseType> databaseType = database.getDatabaseType();
if(databaseType.contains(DatabaseType.MYSQL)){ int effectDatabaseNum = databaseType.size();
effectDatabaseNum--; if (databaseType.contains(DatabaseType.MYSQL)) {
} effectDatabaseNum--;
if(database.getOtherType()!=null&&!database.getOtherType().trim().equals("")){ }
effectDatabaseNum++; if (database.getOtherType() != null && !database.getOtherType().trim().equals("")) {
} effectDatabaseNum++;
score+=effectDatabaseNum*10; }
/*小需求,每个+2*/ score += effectDatabaseNum * 10;
//视图 logger.info("数据库-数量*10:" + effectDatabaseNum + "\t" + score);
if(database.getView()==1){ /*小需求,每个+2*/
score+=2; //视图
} if (database.getView()!=null&&database.getView() == 1) {
//存储过程 score += 2;
if(database.getStorage()==1){ logger.info("数据库-视图+2:" + score);
score+=2; }
} //存储过程
//函数 if (database.getStorage()!=null&&database.getStorage() == 1) {
if(database.getFunction()==1){ score += 2;
score+=2; logger.info("数据库-存储过程+2:" + score);
} }
//DbLink //函数
if(database.getDbLink()==1){ if (database.getFunction()!=null&&database.getFunction() == 1) {
score+=2; score += 2;
} logger.info("数据库-函数+2:" + score);
//定时任务 }
if(database.getTimeTask()==1){ //DbLink
score+=2; if (database.getDbLink()!=null&&database.getDbLink() == 1) {
} score += 2;
//序列 logger.info("数据库-DBLink+2:" + score);
if(database.getSequence()==1){ }
score+=2; //定时任务
} if (database.getTimeTask()!=null&&database.getTimeTask() == 1) {
//触发器 score += 2;
if(database.getTrigger()==1){ logger.info("数据库-定时任务+2:" + score);
score+=2; }
} //序列
/*更多需求*/ if (database.getSequence()!=null&&database.getSequence() == 1) {
//容灾:2主备3分布式 score += 2;
if(database.getDisasterTolerance()==2||database.getDisasterTolerance()==3){ logger.info("数据库-序列+2:" + score);
score+=10; }
} //触发器
//安全 if (database.getTrigger()!=null&&database.getTrigger() == 1) {
if(database.getSafe()==1){ score += 2;
score+=10; logger.info("数据库-触发器+2:" + score);
} }
//读写分离 /*更多需求*/
if(database.getSeparate()==1){ //容灾:2主备3分布式
score+=10; if (database.getDisasterTolerance()!=null&&(database.getDisasterTolerance() == 2 || database.getDisasterTolerance() == 3)) {
} score += 10;
//更高性能 logger.info("数据库-容灾-主备/分布式+10:" + score);
if(database.getPerformance()==1){ }
score+=10; //安全
} if (database.getSafe()!=null&&database.getSafe() == 1) {
//其他 score += 10;
if(database.getOtherContent()!=null&&!database.getOtherContent().trim().equals((""))){ logger.info("数据库-安全+10:" + score);
score+=10; }
//读写分离
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%*/ /*迁移策略:平滑过渡+50%;短暂停顿+20%*/
if(reform.getStrategy()==1){ if(reform.getStrategy()!=null&&reform.getStrategy()==1){
score+=score/2; score+=score/2;
}else if(reform.getStrategy()==2){ logger.info("迁移策略-平滑过渡+50%:"+score);
}else if(reform.getStrategy()!=null&&reform.getStrategy()==2){
score+=score/5; score+=score/5;
logger.info("迁移策略-短暂停顿+20%:"+score);
} }
return 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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论