Merge branch 'master' of e.coding.net:tsteam/btsaqscksfwpt/system-examination-signup

This commit is contained in:
wans 2021-05-12 15:03:59 +08:00
commit 2feeb259ef
10 changed files with 458 additions and 92 deletions

View File

@ -3,6 +3,7 @@ package cn.com.tenlion.controller.api.indexcount;
import cn.com.tenlion.institutionmanagement.pojo.dtos.institution.InstitutionDTO;
import cn.com.tenlion.pojo.dtos.apply.ApplyDTO;
import cn.com.tenlion.pojo.dtos.classplan.ClassPlanDTO;
import cn.com.tenlion.service.apply.IApplyService;
import cn.com.tenlion.service.classplan.IClassPlanService;
import cn.com.tenlion.service.lessons.ILessonsService;
@ -54,6 +55,7 @@ public class IndexCountController extends DefaultBaseController {
private ITeacherService teacherService;
@ApiOperation(value = "统计当前登录机构报名数量", notes = "统计当前登录机构报名数量接口")
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@GetMapping("count-apply-all-num")
@ -128,11 +130,11 @@ public class IndexCountController extends DefaultBaseController {
@ApiOperation(value = "统计当前登录机构报名情况", notes = "统计当前登录机构报名情况接口")
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@GetMapping("count-one-weeks-apply-num")
public SuccessResultData<Map<String, Object>> countOneWeeksApplyNum(){
@GetMapping("count-one-weeks-apply-num/{applyClassId}")
public SuccessResultData<Map<String, Object>> countOneWeeksApplyNum(@PathVariable("applyClassId") String applyClassId){
Map<String, Object> params = requestParams();
String institutionId = this.getInstitutionId();
String classId = "";//params.get("applyClassId").toString();
String classId = "99".equals(applyClassId) ? "":applyClassId;
if(!StringUtils.isBlank(institutionId)) {
String states0Time = DateUtil.getDay();
String states1Time = DateUtil.getBeforeDate(1,"yyyy-MM-dd");
@ -175,8 +177,65 @@ public class IndexCountController extends DefaultBaseController {
@ApiOperation(value = "获取当前机构的培训计划列表", notes = "获取当前机构的培训计划列表")
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@GetMapping("list-plan-class")
public SuccessResultData<List<ClassPlanDTO>> listPlanClass(){
Map<String, Object> params = new HashMap<>();
params.put("orgId",this.getInstitutionId());
List<ClassPlanDTO> list = classPlanService.list(params);
return new SuccessResultData<>(list);
}
@ApiOperation(value = "统计当前机构计划分类占比", notes = "统计当前机构计划分类占比")
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@GetMapping("count-plan-type")
public SuccessResultData<Map<String, Object>> countPlanType(){
Map<String, Object> map = new HashMap<>();
String institutionId = this.getInstitutionId();
if(!StringUtils.isBlank(institutionId)){
map.put("orgId",institutionId);
map= classPlanService.countPlanType(institutionId);
}
return new SuccessResultData<>(map);
}
@ApiOperation(value = "统计当前机构计划报名人数", notes = "统计当前机构计划报名人数")
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@GetMapping("count-plan-apply-user-num")
public SuccessResultData<Map<String, Object>> countPlanApplyUserNum(){
Map<String, Object> map = new HashMap<>();
List<String> title = new ArrayList<>();//计划名称
List<String> data0 = new ArrayList<>();//待审核
List<String> data1 = new ArrayList<>();//用户撤回
List<String> data2 = new ArrayList<>();//审核通过
List<String> data3 = new ArrayList<>();//报名完成
List<String> data4 = new ArrayList<>();//审核不通过
String institutionId = this.getInstitutionId();
if(!StringUtils.isBlank(institutionId)){
map.put("orgId",institutionId);
List<ClassPlanDTO> list = classPlanService.list(map);
for (ClassPlanDTO classPlanDTO : list) {
Map<String, Object> planMap = applyService.countWeekNum("",institutionId,classPlanDTO.getClassPlanId());
title.add(classPlanDTO.getPlanName());
data0.add(planMap.get("0").toString());
data1.add(planMap.get("1").toString());
data2.add(planMap.get("2").toString());
data3.add(planMap.get("3").toString());
data4.add(planMap.get("-1").toString());
}
map.put("title",title);
map.put("data0",data0);
map.put("data1",data1);
map.put("data2",data2);
map.put("data3",data3);
map.put("data4",data4);
}
return new SuccessResultData<>(map);
}

View File

@ -135,4 +135,11 @@ public interface IClassPlanDao {
* @param params
*/
void deleteClassPlanLessons(Map<String, Object> params);
/**
* 根据机构id统计计划的分类数量
* @param params
* @return
*/
Map<String, Object> countPlanType(Map<String, Object> params);
}

View File

@ -22,6 +22,13 @@ import java.util.Map;
**/
public interface IClassPlanService {
/**
* 根据机构id统计计划的分类数量
* @param orgId
* @return
*/
Map<String,Object> countPlanType(String orgId);
/**
* 新增
*

View File

@ -36,6 +36,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -459,4 +460,13 @@ public class ClassPlanServiceImpl extends DefaultBaseService implements IClassPl
}
return list;
}
public Map<String,Object> countPlanType(String orgId){
Map<String, Object> parmas = new HashMap<>();
parmas.put("orgId",orgId);
return classPlanDao.countPlanType(parmas);
}
}

View File

@ -636,9 +636,12 @@
sum(case when apply_audit_state = 3 then 1 else 0 end) as '3',
sum(case when apply_audit_state = -1 then 1 else 0 end) as '-1'
from e_apply
WHERE is_delete = 0 AND DATE_FORMAT(gmt_create,'%Y-%m-%d') = #{weekTime} AND apply_institution_id = #{applyInstitutionId}
WHERE is_delete = 0 AND apply_institution_id = #{applyInstitutionId}
<if test="weekTime != null and weekTime != ''">
AND DATE_FORMAT(gmt_create,'%Y-%m-%d') = #{weekTime}
</if>
<if test="applyClassId != null and applyClassId != ''">
AND t1.apply_class_id = #{applyClassId}
AND apply_class_id = #{applyClassId}
</if>
</select>

View File

@ -400,7 +400,18 @@
WHERE
1 = 1
</select>
<!--统计培训类型-->
<select id="countPlanType" parameterType="map" resultType="map">
select
sum(case when teacher_catalog = 1 then 1 else 0 end) as '1',
sum(case when teacher_catalog = 2 then 1 else 0 end) as '2',
sum(case when teacher_catalog = 3 then 1 else 0 end) as '3'
from e_teacher
WHERE is_delete = 0 AND org_id = #{orgId}
</select>
<insert id="saveClassPlanLesson" parameterType="map">
INSERT INTO e_class_plan_lesson
(class_plan_id,lesson_id,teacher_id,is_delete)

View File

@ -169,16 +169,16 @@
<if test="examApplyNum != null and examApplyNum != ''">
exam_apply_num = #{examApplyNum},
</if>
<if test="status != null and status != ''">
<if test="status != null">
status = #{status},
</if>
<if test="userStatus != null and userStatus != ''">
<if test="userStatus != null">
user_status = #{userStatus},
</if>
<if test="checkStatus != null and checkStatus != ''">
<if test="checkStatus != null">
check_status = #{checkStatus},
</if>
<if test="examType != null and examType != ''">
<if test="examType != null">
exam_type = #{examType},
</if>
<if test="reason != null and reason != ''">

View File

@ -165,7 +165,7 @@
return rowData;
}
},
{field: 'cz', width: 180, title: '操作', align:'center', fixed: 'right',
{field: 'cz', width: 100, title: '操作', align:'center', fixed: 'right',
templet: function(row) {
var rowData = '<div class="layui-btn-group">';
rowData +='<button type="button" class="layui-btn layui-btn-xs" lay-event="user">添加人员</button>';

View File

@ -72,12 +72,12 @@
<div class="layui-row layui-col-space15">
<div class="layui-col-sm6 layui-col-md6">
<div class="layui-card">
<div class="layui-card-header" style="overflow: visible">近七天报名情况
<div class="layui-inline search-item layui-form" style="position: absolute;right: 15px;top: 7px;">
<select id="applyClassId" name="applyClassId" >
<option value="">全部</option>
</select>
</div>
<div class="layui-card-header" style="overflow: visible">近七天机构报名情况
<!--<div class="layui-inline search-item layui-form" style="position: absolute;right: 15px;top: 7px;">-->
<!--<select id="applyClassId" name="applyClassId">-->
<!--</select>-->
<!--</div>-->
</div>
<div class="layui-card-body">
<div id="applyEChart" style="width: 100%; height: 300px;"></div>
@ -96,7 +96,7 @@
<div class="layui-row layui-col-space15">
<div class="layui-col-sm6 layui-col-md6">
<div class="layui-card">
<div class="layui-card-header">培训计划占比</div>
<div class="layui-card-header">培训计划类型占比</div>
<div class="layui-card-body">
<div id="planEChart" style="width: 100%; height: 300px;"></div>
</div>
@ -104,9 +104,9 @@
</div>
<div class="layui-col-sm6 layui-col-md6">
<div class="layui-card">
<div class="layui-card-header">培训课程占比</div>
<div class="layui-card-header">培训计划报名情况</div>
<div class="layui-card-body">
<div id="classEChart" style="width: 100%; height: 300px;"></div>
<div id="planApplyUserNumEChart" style="width: 100%; height: 300px;"></div>
</div>
</div>
</div>
@ -130,13 +130,14 @@
teacherEChart:null,
applyEChart:null,
planEChart:null,
classEChart:null,
planApplyUserNumEChart:null,
resizeTimeout: null,
applyAllNum: 0,
classPlanNum: 0,
lessonsNum: 0,
teacherNum: 0,
selectedApplyClassId: '99',
optionsList: []
},
methods: {
initApplyAllNum: function(){
@ -185,7 +186,8 @@
});
},
initApplyEChart: function(){
top.restAjax.get('api/indexcount/count-one-weeks-apply-num', {}, null, function(code, data) {
var self = this;
top.restAjax.get(top.restAjax.path('api/indexcount/count-one-weeks-apply-num/{applyClassId}', [self.selectedApplyClassId]), {}, null, function(code, data) {
var status0 = [];
var status1 = [];
var status2 = [];
@ -269,7 +271,7 @@
]
}
)
form.render();
});
},
@ -290,7 +292,6 @@
datajson['value'] = data.data[i+""]
dataList.push(datajson)
}
console.log(dataList)
self.teacherEChart = echarts.init(document.getElementById('teacherEChart'));
self.teacherEChart.setOption(
{
@ -323,75 +324,171 @@
},
initPlanEChart: function(){
self.planEChart = echarts.init(document.getElementById('planEChart'));
self.planEChart.setOption(
{
title: {
text: '世界人口总量',
subtext: '数据来自网络'
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
legend: {
data: ['2011年', '2012年']
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'value',
boundaryGap: [0, 0.01]
},
yAxis: {
type: 'category',
data: ['巴西', '印尼', '美国', '印度', '中国', '世界人口(万)']
},
series: [
{
name: '2011年',
type: 'bar',
data: [18203, 23489, 29034, 104970, 131744, 630230]
top.restAjax.get('api/indexcount/count-plan-type', {}, null, function(code, data) {
var dataList = [];
for(var i= 1;i<=3;i++){
var datajson = {};
if(i === 1){
datajson['name'] = "初训"
}
if(i === 2){
datajson['name'] = "复训"
}
if(i === 3){
datajson['name'] = "换证"
}
datajson['value'] = data.data[i+""]
dataList.push(datajson)
}
console.log(dataList)
self.teacherEChart = echarts.init(document.getElementById('planEChart'));
self.teacherEChart.setOption(
{
tooltip: {
trigger: 'item'
},
{
name: '2012年',
type: 'bar',
data: [19325, 23438, 31000, 121594, 134141, 681807]
}
]
}
)
},
initClassEChart: function(){
self.classEChart = echarts.init(document.getElementById('classEChart'));
self.classEChart.setOption(
{
legend: {},
tooltip: {},
dataset: {
source: [
['product', '2015', '2016', '2017'],
['Matcha Latte', 43.3, 85.8, 93.7],
['Milk Tea', 83.1, 73.4, 55.1],
['Cheese Cocoa', 86.4, 65.2, 82.5],
['Walnut Brownie', 72.4, 53.9, 39.1]
legend: {
orient: 'vertical',
left: 'left',
},
series: [
{
name: '访问来源',
type: 'pie',
radius: '70%',
data: dataList,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
},
xAxis: {type: 'category'},
yAxis: {},
series: [
{type: 'bar'},
{type: 'bar'},
{type: 'bar'}
]
}
)
})
},
initPlanApplyUserNumEChart: function(){
top.restAjax.get('api/indexcount/count-plan-apply-user-num', {}, null, function(code, data) {
self.planApplyUserNumEChart = echarts.init(document.getElementById('planApplyUserNumEChart'));
self.planApplyUserNumEChart.setOption(
{
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
legend: {
data: ['待审核', '用户撤回', '审核通过', '报名完成', '审核不通过']
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'category',
data: data.data.title //计划名称
},
yAxis: {
type: 'value'
},
series: [
{
name: '待审核',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: data.data.data0
},
{
name: '用户撤回',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: data.data.data1
},
{
name: '审核通过',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: data.data.data2
},
{
name: '报名完成',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: data.data.data3
},
{
name: '审核不通过',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: data.data.data4
}
]
}
)
});
},
initPlanList: function(){
var self = this
top.restAjax.get('api/indexcount/list-plan-class', {}, null, function(code, data) {
// self.optionsList = data.data
var options = '<option value="99">全部</option>';
for (var i = 0; i < data.data.length; i++) {
options += '<option value="'+data.data[i].classPlanId+'">'+data.data[i].planName+'</option>'
}
)
$('#applyClassId').append(options);
setTimeout(function () {
$('#applyClassId').on('change', function () {
console.log('123')
self.selectedApplyClassId = $(this).value()
self.initApplyEChart()
})
}, 50)
form.render()
}, function(code, data) {
top.dialog.msg(data.msg);
});
}
},
mounted: function() {
@ -403,7 +500,8 @@
self.initTeacherEChart();
self.initApplyEChart();
self.initPlanEChart();
self.initClassEChart();
self.initPlanApplyUserNumEChart();
//self.initPlanList();
// 事件 - 页面变化
$win.on('resize', function() {
if(self.resizeTimeout) {
@ -416,6 +514,11 @@
});
}
})
});
</script>
</body>

View File

@ -0,0 +1,166 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<base th:href="${#request.getContextPath() + '/'}">
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="assets/fonts/font-awesome/css/font-awesome.css"/>
<link rel="stylesheet" href="assets/layuiadmin/layui/css/layui.css" media="all">
<link rel="stylesheet" href="assets/layuiadmin/style/admin.css" media="all">
<style>
.layui-badge {height: auto;}
.layui-card-header {overflow: hidden; white-space: nowrap; text-overflow: ellipsis;}
.count-second-row {padding-bottom: 0px;}
</style>
</head>
<body>
<div id="LAY-app" class="layui-fluid">
<div class="layui-row layui-col-space15">
<div class="layui-col-sm12 layui-col-md12">
<div class="layui-row layui-col-space15">
<div class="layui-col-sm6 layui-col-md3">
<div class="layui-card">
<div class="layui-card-header">
报名数量
<span class="layui-badge layui-bg-green layuiadmin-badge"></span>
</div>
<div class="layui-card-body layuiadmin-card-list">
<p id="applyAllNum" class="layuiadmin-big-font">0</p>
</div>
</div>
</div>
<div class="layui-col-sm6 layui-col-md3">
<div class="layui-card">
<div class="layui-card-header">
培训计划数量
<span class="layui-badge layui-bg-blue layuiadmin-badge"></span>
</div>
<div class="layui-card-body layuiadmin-card-list">
<p id="classPlanNum" class="layuiadmin-big-font">0</p>
</div>
</div>
</div>
<div class="layui-col-sm6 layui-col-md3">
<div class="layui-card">
<div class="layui-card-header">
课程数量
<span class="layui-badge layui-bg-cyan layuiadmin-badge"></span>
</div>
<div class="layui-card-body layuiadmin-card-list" style="height: 100%">
<p id="lessonsNum" class="layuiadmin-big-font">0</p>
</div>
</div>
</div>
<div class="layui-col-sm6 layui-col-md3">
<div class="layui-card">
<div class="layui-card-header">
讲师
<span class="layui-badge layui-bg-orange layuiadmin-badge"></span>
</div>
<div class="layui-card-body layuiadmin-card-list">
<p id="teacherNum" class="layuiadmin-big-font">0</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="layui-row layui-col-space15">
<div class="layui-col-sm6 layui-col-md6">
<div class="layui-card">
<div class="layui-card-header" style="overflow: visible">近七天报名情况
<!--<div class="layui-inline search-item layui-form" style="position: absolute;right: 15px;top: 7px;">-->
<!--<select id="applyClassId" name="applyClassId">-->
<!--</select>-->
<!--</div>-->
</div>
<div class="layui-card-body">
<div id="applyEChart" style="width: 100%; height: 300px;"></div>
</div>
</div>
</div>
<div class="layui-col-sm6 layui-col-md6">
<div class="layui-card">
<div class="layui-card-header">讲师占比</div>
<div class="layui-card-body">
<div id="teacherEChart" style="width: 100%; height: 300px;"></div>
</div>
</div>
</div>
</div>
<div class="layui-row layui-col-space15">
<div class="layui-col-sm6 layui-col-md6">
<div class="layui-card">
<div class="layui-card-header">培训计划类型占比</div>
<div class="layui-card-body">
<div id="planEChart" style="width: 100%; height: 300px;"></div>
</div>
</div>
</div>
<div class="layui-col-sm6 layui-col-md6">
<div class="layui-card">
<div class="layui-card-header">培训课程占比</div>
<div class="layui-card-body">
<div id="classEChart" style="width: 100%; height: 300px;"></div>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="assets/js/vue.min.js"></script>
<script type="text/javascript" src="assets/js/vendor/echarts/echarts.min.js"></script>
<script src="assets/layuiadmin/layui/layui.js"></script>
<script>
layui.config({
base: 'assets/layuiadmin/' //静态资源所在路径
}).extend({
index: 'lib/index' //主入口模块
}).use(['index', 'animate-numbers', 'form'], function() {
var $ = layui.$;
var $win = $(window);
var form = layui.form;
new Vue({
el: '#LAY-app',
data: {
teacherEChart:null,
applyEChart:null,
planEChart:null,
classEChart:null,
resizeTimeout: null,
applyAllNum: 0,
classPlanNum: 0,
lessonsNum: 0,
teacherNum: 0,
selectedApplyClassId: '99',
optionsList: []
},
methods: {
},
mounted: function() {
var self = this;
// 事件 - 页面变化
$win.on('resize', function() {
if(self.resizeTimeout) {
return;
}
self.resizeTimeout = setTimeout(function() {
self.resizeTimeout = null;
}, 500);
});
}
})
});
</script>
</body>
</html>