完成数据分析

This commit is contained in:
kingsfighter 2020-09-13 17:23:19 +08:00
parent 155afa715d
commit 47c7fa9ca7
6 changed files with 75284 additions and 14 deletions

View File

@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
@ -52,7 +53,7 @@ public class DataAnalysisController extends BaseController{
public ModelAndView defaultHandle(HttpServletRequest req,
HttpServletResponse res) throws Exception {
req.setAttribute("users", getSubmitUsers(req));
return new ModelAndView("dataAnalysis");
return new ModelAndView("dfm/dataAnalysis");
}
/**
@ -154,7 +155,8 @@ public class DataAnalysisController extends BaseController{
* @throws Exception
*/
@RequestMapping("/analysis")
public void analysis(HttpServletRequest req, HttpServletResponse res) throws Exception {
@ResponseBody
public Result analysis(HttpServletRequest req, HttpServletResponse res) throws Exception {
String projectName = req.getParameter("projectName");
String submitUser = req.getParameter("submitUser");
@ -163,10 +165,8 @@ public class DataAnalysisController extends BaseController{
String analysisType = req.getParameter("analysisType");
//List<DataAnalysisBean> data = null;
Map<String, Object> data = new TreeMap<>();
UserInfo currentUser = getUserInfo(req);
//获取当前登陆用户的用户组
//分析原则系统管理员分析所有的部门管理员只能分析本部门的普通用户只能分析自己的
@ -174,7 +174,8 @@ public class DataAnalysisController extends BaseController{
//校验projectName是否是当前用户可以看到的
Result checkResult = checkProjectNameByLoginUser(req, res);
if(null == checkResult || !checkResult.isSuccess()) {
outputJson(res, JSON.toJSONString(checkResult));
// outputJson(res, JSON.toJSONString(checkResult));
return checkResult;
}
List<DataAnalysisBean> result = dataAnalysisService.analysisByProject(projectName, startSubmitTime, endSubmitTime);
@ -256,8 +257,8 @@ public class DataAnalysisController extends BaseController{
Result result = new Result();
result.setSuccess(false);
result.setMessage("分析失败,未选择分析类型!");
outputJson(res, JSON.toJSONString(result));
return;
// outputJson(res, JSON.toJSONString(result));
return result;
}
}
@ -266,7 +267,8 @@ public class DataAnalysisController extends BaseController{
result.setSuccess(true);
result.setMessage("分析成功");
result.setData(data);
outputJson(res, JSON.toJSONString(result));
// outputJson(res, JSON.toJSONString(result));
return result;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,498 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<th:block th:include="include :: header('数据分析')" />
<th:block th:include="include :: select2-css" />
</head>
<body class="gray-bg">
<div class="container-div">
<div class="main-content">
<form id="dataAnalysisForm" class="form-horizontal">
<h4 class="form-header h4">数据分析</h4>
<div class="row">
<div class="col-sm-10">
<div class="form-group">
<div class="col-sm-1" style="text-align:right;">
<label class="check-box">
<input type="checkbox" name="analysisType" value="submitProject">
</label>
</div>
<label class="col-sm-2 control-label">项目描述:</label>
<div class="col-sm-7">
<input name="projectName" id="projectName" placeholder="请输入项目名称" class="form-control" type="text" maxlength="30" >
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-10">
<div class="form-group">
<div class="col-sm-1" style="text-align:right;">
<label class="check-box">
<input type="checkbox" name="analysisType" value="submitUser">
</label>
</div>
<label class="col-sm-2 control-label">上传人:</label>
<div class="col-sm-7">
<select name="submitUser" id="submitUser" class="form-control m-b">
<option value="-1">--请选择--</option>
<option th:each="user : ${users}" th:text="${user.username}" th:value="${user.username}"></option>
</select>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-10">
<div class="form-group">
<div class="col-sm-1" style="text-align:right;"></div>
<label class="col-sm-2 control-label is-required">上传时间段:</label>
<div class="select-time col-sm-7">
<input type="text" style="width: 200px;display: inline" class="form-control time-input" id="startSubmitTime" placeholder="开始时间" name="startSubmitTime" required readOnly/>
<span>-</span>
<input type="text" style="width: 200px;display: inline" class="form-control time-input" id="endSubmitTime" placeholder="结束时间" name="endSubmitTime" required readOnly/>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-10" >
<div class="form-group">
<div class="col-sm-1"></div>
<label class="col-sm-2 control-label">所有用户:</label>
<div class="col-sm-7">
<label class="check-box">
<input type="checkbox" name="analysisType" value="allUser" >
</label>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-10" >
<div class="form-group">
<div class="col-sm-1"></div>
<label class="col-sm-2 control-label">所有问题:</label>
<div class="col-sm-7">
<label class="check-box">
<input type="checkbox" name="analysisType" value="allIssue" checked="checked">
</label>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-offset-5 col-sm-10">
<button type="button" class="btn btn-sm btn-primary" onclick="submitAnalysis()"><i class="fa fa-check"></i>提 交</button>&nbsp;
<button type="button" class="btn btn-sm btn-danger" onclick="closeItem()"><i class="fa fa-reply-all"></i>关 闭 </button>
</div>
</div>
</form>
</div>
<div class="row">
<div class="col-sm-12 select-table table-striped" >
<table id="analysisResultTable"></table>
</div>
</div>
<div id="analysisResultChart" style="width:98%;height:400px;"></div>
</div>
<th:block th:include="include :: footer" />
<script th:inline="javascript">
var prefix = ctx + "dataAnalysis.do";
$(function() {
var options = {
sortName: "roleSort",
modalName: "用户数据分析",
pagination: false,
columns: [
{
field: 'submitUserName',
title: '上传人',
sortable: true
},
{
field: 'issueQty',
title: '问题数量',
sortable: true
}
]
};
$.table.init(options);
});
/**
* 初始化
*/
$(document).ready(function(){
$.each($("input:checkbox[name='analysisType']"), function(i, obj){
$(this).on("ifClicked",function(){
$.each($("input:checkbox[name='analysisType']"), function(i, obj){
$(this).iCheck('uncheck');
});
});
});
//设置时间默认值
var today = new Date();
var endSubmitTime = today.getFullYear().toString() + '-'+addzero(today.getMonth() + 1) + '-' + addzero(today.getDate());
$('#endSubmitTime').val(endSubmitTime);
//
var startTime = new Date(today.getFullYear(),today.getMonth() - 3 ,today.getDate());
var startSubmitTime = startTime.getFullYear().toString() + '-'+addzero(startTime.getMonth() + 1) + '-' + addzero(startTime.getDate());
$('#startSubmitTime').val(startSubmitTime);
});
function addzero(v) {
if (v < 10) return '0' + v;
return v.toString();
}
//提交分析
function submitAnalysis(){
//验证业务选择条件
var analysisType = $("[name='analysisType']:checked").val();
if(!analysisType) {
$.modal.alertError("请选择分析类型");
return false;
}
if("submitUser" == analysisType) {
if($("#submitUser").val().trim() == "") {
$.modal.alertError("请填写提交人");
return false;
}
} else if("submitProject" == analysisType) {
if($("#projectName").val().trim() == "") {
$.modal.alertError("请填写项目描述");
return false;
}
}
var data = $("#dataAnalysisForm").serialize();
$.ajax({
url: prefix + "/analysis",
data: data,
cache:false,
dataType:"json",
success: function(json){
//销毁表格
$("#analysisResultTable").html("");
//销毁图表
$("#analysisResultChart").html("");
var myChart = echarts.init(document.getElementById('analysisResultChart'));
myChart.dispose();
if (json.success) {
$.modal.alertSuccess("分析成功");
showAnalysisResult(json.data);
} else {
$.modal.alertError("分析失败,原因是:" + json.message);
}
}
});
}
//展示分析结果
function showAnalysisResult(data) {
var analysisType = $("[name='analysisType']:checked").val();
if ("submitUser" == analysisType) {
showAnalysisResultByUserWithTable(data);
showAnalysisResultByUserWithChart(data);
} else if ("submitProject" == analysisType) {
showAnalysisResultByProjectWithTable(data);
showAnalysisResultByProjectWithChart(data);
} else if ("allUser" == analysisType) {
showAnalysisResultByAllUserWithTable(data);
showAnalysisResultByAllUserWithChart(data);
} else if ("allIssue" == analysisType) {
showAnalysisResultByUserWithTable(data);
showAnalysisResultByUserWithChart(data);
}
}
//按照提交人
function showAnalysisResultByAllUserWithTable(data) {
var options = {
sortName: "roleSort",
modalName: "问题数据分析",
pagination: false,
id:"analysisResultTable"
};
var table = $("#analysisResultTable");
var result = data.result;
var tableHtml = "";
tableHtml += "<TABLE id=grid ";
tableHtml += "style='BORDER-TOP-WIDTH: 0px; FONT-WEIGHT: normal; BORDER-LEFT-WIDTH: 0px; BORDER-LEFT-COLOR: #cccccc;BORDER-BOTTOM-WIDTH: 0px; BORDER-BOTTOM-COLOR: #cccccc; WIDTH: 100%; BORDER-TOP-COLOR: #cccccc; FONT-STYLE: normal; BACKGROUND-COLOR: #cccccc; BORDER-RIGHT-WIDTH: 0px; TEXT-DECORATION: none; BORDER-RIGHT-COLOR: #cccccc'";
tableHtml += "cellSpacing=1 cellPadding=2 rules=all border=0> ";
tableHtml += "<TBODY>";
tableHtml += "<TR style='FONT-WEIGHT: bold;text-align:center; FONT-STYLE: normal; BACKGROUND-COLOR: #eeeeee; TEXT-DECORATION: none'>";
tableHtml += "<TD>上传人</TD>";
tableHtml += "<TD>问题数量</TD>";
tableHtml += "</TR>";
//构造数据行
if (null == result || result.length == 0) {
tableHtml += "<TR style='FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none'>";
tableHtml += "<TD colspan=2>--没有数据--</TD>";
tableHtml += "</TR>";
} else {
for (var i=0;i<result.length;i++) {
tableHtml += "<TR style='FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none'>";
tableHtml += "<TD >" + result[i].submitUserName + "</TD>";
tableHtml += "<TD >" + result[i].issueQty + "</TD>";
tableHtml += "</TR>";
}
}
tableHtml += "</TBODY>";
tableHtml += "</TABLE>";
$(table).html(tableHtml);
$("#analysisResultTable").bootstrapTable(options);
}
//按照提交人
function showAnalysisResultByAllUserWithChart(data) {
if (null == data || null == data.result) {
return false;
}
var result = data.result;
var myChart = echarts.init(document.getElementById('analysisResultChart'));
var xAxisData = new Array();
var seriesData = new Array();
for(var i=0;i<result.length;i++) {
xAxisData.push(result[i].submitUserName);
seriesData.push(result[i].issueQty);
}
// 指定图表的配置项和数据
var option = {
title: {
text: '根据提交人数据分析图表展示'
},
tooltip: {},
legend: {
data:['问题数量']
},
xAxis: {
data: xAxisData
},
yAxis: {},
series: [{
name: '问题数量',
type: 'bar',
data: seriesData
}]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
}
//按照提交人
function showAnalysisResultByUserWithTable(data) {
var result = data.result;
var options = {
sortName: "roleSort",
modalName: "问题数据分析",
pagination: false,
id:"analysisResultTable",
columns: [
{
field: 'issueDescription',
title: '问题描述',
sortable: true
},
{
field: 'issueQty',
title: '问题数量',
sortable: true
}
]
};
$.table.init(options);
$("#analysisResultTable").bootstrapTable('load', result);
}
//按照提交人
function showAnalysisResultByUserWithChart(data) {
if (null == data || null == data.result) {
return false;
}
var result = data.result;
var myChart = echarts.init(document.getElementById('analysisResultChart'));
var xAxisData = new Array();
var seriesData = new Array();
for(var i=0;i<result.length;i++) {
xAxisData.push(result[i].issueDescription);
seriesData.push(result[i].issueQty);
}
// 指定图表的配置项和数据
var option = {
title: {
text: '根据提交人数据分析图表展示'
},
tooltip: {},
legend: {
data:['问题数量']
},
xAxis: {
data: xAxisData
},
yAxis: {},
series: [{
name: '问题数量',
type: 'bar',
data: seriesData
}]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
}
//按照项目
function showAnalysisResultByProjectWithTable(data) {
var result = data.result;
var versions = data.versions;
var options = {
sortName: "roleSort",
modalName: "问题数据分析",
pagination: false,
id:"analysisResultTable"
};
var table = $("#analysisResultTable");
var tableHtml = "";
tableHtml += "<TABLE id=grid ";
tableHtml += "style='BORDER-TOP-WIDTH: 0px; FONT-WEIGHT: normal; BORDER-LEFT-WIDTH: 0px; BORDER-LEFT-COLOR: #cccccc;BORDER-BOTTOM-WIDTH: 0px; BORDER-BOTTOM-COLOR: #cccccc; WIDTH: 100%; BORDER-TOP-COLOR: #cccccc; FONT-STYLE: normal; BACKGROUND-COLOR: #cccccc; BORDER-RIGHT-WIDTH: 0px; TEXT-DECORATION: none; BORDER-RIGHT-COLOR: #cccccc'";
tableHtml += "cellSpacing=1 cellPadding=2 rules=all border=0> ";
tableHtml += "<TBODY>";
tableHtml += "<TR style='FONT-WEIGHT: bold;text-align:center; FONT-STYLE: normal; BACKGROUND-COLOR: #eeeeee; TEXT-DECORATION: none'>";
tableHtml += "<TD>问题描述</TD>";
if (null != versions && versions.length > 0) {
//构造表头
for (var i = 0; i < versions.length; i++) {
tableHtml += "<TD>版本" + versions[i] + "</TD>";
}
}
tableHtml += "</TR>";
//构造数据行
if (null == result || result.length == 0) {
tableHtml += "<TR style='FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none'>";
if (null != versions && versions.length > 0) {
tableHtml += "<TD colspan=" + (versions.length + 1)
+ ">--没有数据--</TD>";
} else {
tableHtml += "<TD >--没有数据--</TD>";
}
tableHtml += "</TR>";
} else {
for ( var key in result) {
tableHtml += "<TR style='FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none'>";
tableHtml += "<TD >" + key + "</TD>";
for (var i = 0; i < result[key].length; i++) {
tableHtml += "<TD >" + result[key][i].issueQty + "</TD>";
}
tableHtml += "</TR>";
}
}
tableHtml += "</TBODY>";
tableHtml += "</TABLE>";
$(table).html(tableHtml);
$("#analysisResultTable").bootstrapTable(options);
}
//按照项目
function showAnalysisResultByProjectWithChart(data) {
if (null == data || null == data.result || null == data.versions) {
return false;
}
var GROUP_VERSION_COUNT = 3;
var result = data.result;
var versions = data.versions;
var myChart = echarts.init(document.getElementById('analysisResultChart'));
var xAxisData = new Array();
for ( var key in result) {
xAxisData.push(key);
}
var seriesDataArr = new Array();
for (var i = 0; i < versions.length; i++) {
var seriesData = {};
seriesData.name = "版本" + versions[i];
seriesData.type = "bar";
seriesData.data = [];
for ( var key in result) {
var list = result[key];
for (var j = 0; j < list.length; j++) {
if (list[j].version == versions[i]) {
seriesData.data.push(list[j].issueQty);
break;
}
}
}
seriesDataArr.push(seriesData);
}
// 指定图表的配置项和数据
var option = {
title : {
text : '根据项目描述数据分析图表展示'
},
tooltip : {},
legend : {
data : [ '问题数量' ]
},
xAxis : {
type : 'category',
data : xAxisData
},
yAxis : {},
series : seriesDataArr
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
}
</script>
</body>
</html>

View File

@ -111,7 +111,6 @@
}
}
});
// document.location.href = 'project.do?method=serverMonitor&server=' + v;
}
function fillParams(project) {
@ -152,7 +151,6 @@
}
}
});
// document.location.href = 'project.do?method=stopProject&pid=' + pid + '&server=' + server;
}
</script>

View File

@ -38,6 +38,7 @@
<script th:src="@{/ajax/libs/layui/layui.js}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.4.0}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.4.0}"></script>
<script th:src="@{/ajax/libs/echarts/echarts.js}"></script>
<script th:inline="javascript"> var ctx = [[@{/}]]; </script>
</div>

View File

@ -17,7 +17,7 @@ public class DataAnalysisDAO extends JdbcBaseDao {
StringBuilder sb = new StringBuilder();
sb.append("SELECT t.F_PROJECT_NAME, t.F_VERSION , t.F_ISSUE_DESCRIPTION, SUM(t.F_ISSUE_QTY) F_ISSUE_QTY ");
sb.append("FROM dfm.t_dataays t ");
sb.append("FROM t_dataays t ");
sb.append("where t.F_PROJECT_NAME = ? AND T.F_SUBMIT_TIME >= ? AND T.F_SUBMIT_TIME <= ? ");
sb.append("group by t.F_PROJECT_NAME, t.F_VERSION , t.F_ISSUE_DESCRIPTION ");
sb.append("order by SUM(t.F_ISSUE_QTY) desc, t.F_VERSION ASC");
@ -47,7 +47,7 @@ public class DataAnalysisDAO extends JdbcBaseDao {
public List<DataAnalysisBean> analysisByUser(String userName, String startSubmitTime, String endSubmitTime) {
StringBuilder sb = new StringBuilder();
sb.append("SELECT t.F_SUBMIT_USERNAME, t.F_ISSUE_DESCRIPTION, SUM(t.F_ISSUE_QTY) F_ISSUE_QTY ");
sb.append("FROM dfm.t_dataays t ");
sb.append("FROM t_dataays t ");
sb.append("where t.F_SUBMIT_USERNAME = ? AND T.F_SUBMIT_TIME >= ? AND T.F_SUBMIT_TIME <= ? ");
sb.append("group by t.F_SUBMIT_USERNAME, t.F_ISSUE_DESCRIPTION ");
sb.append("order by SUM(t.F_ISSUE_QTY) DESC");
@ -75,7 +75,7 @@ public class DataAnalysisDAO extends JdbcBaseDao {
public List<DataAnalysisBean> analysisByAllUser(String startSubmitTime, String endSubmitTime, List<UserInfo> submitUsers) {
StringBuilder sb = new StringBuilder();
sb.append("SELECT t.F_SUBMIT_USERNAME, SUM(t.F_ISSUE_QTY) F_ISSUE_QTY ");
sb.append("FROM dfm.t_dataays t ");
sb.append("FROM t_dataays t ");
sb.append("where T.F_SUBMIT_TIME >= ? AND T.F_SUBMIT_TIME <= ? ");
sb.append("AND T.F_SUBMIT_USER IN (-1");
for (int i = 0; i < submitUsers.size(); ++i)
@ -108,7 +108,7 @@ public class DataAnalysisDAO extends JdbcBaseDao {
public List<DataAnalysisBean> analysisByAllIssue(String startSubmitTime, String endSubmitTime, List<UserInfo> submitUsers) {
StringBuilder sb = new StringBuilder();
sb.append("SELECT t.F_ISSUE_DESCRIPTION, SUM(t.F_ISSUE_QTY) F_ISSUE_QTY ");
sb.append("FROM dfm.t_dataays t ");
sb.append("FROM t_dataays t ");
sb.append("where T.F_SUBMIT_TIME >= ? AND T.F_SUBMIT_TIME <= ? ");
sb.append("AND T.F_SUBMIT_USER IN (-1");
for (int i = 0; i < submitUsers.size(); ++i)