Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
涂亚平
/
subsidy
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit 301a3dcd
authored
Nov 23, 2021
by
涂亚平
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
账号名称根据拼音生成
1 parent
374745fa
Show whitespace changes
Inline
Side-by-side
Showing
30 changed files
with
359 additions
and
122 deletions
pom.xml
src/main/java/com/subsidy/controller/AdministerController.java
src/main/java/com/subsidy/controller/ClassDictController.java
src/main/java/com/subsidy/dto/classDict/AddClassDTO.java
src/main/java/com/subsidy/mapper/ClassDictMapper.java
src/main/java/com/subsidy/mapper/CourseDictMapper.java
src/main/java/com/subsidy/model/ClassDictDO.java
src/main/java/com/subsidy/service/ClassDictService.java
src/main/java/com/subsidy/service/CourseDictService.java
src/main/java/com/subsidy/service/impl/AdministerServiceImpl.java
src/main/java/com/subsidy/service/impl/ClassDictServiceImpl.java
src/main/java/com/subsidy/service/impl/CourseDictServiceImpl.java
src/main/java/com/subsidy/service/impl/MemberServiceImpl.java
src/main/java/com/subsidy/service/impl/SignInRecordServiceImpl.java
src/main/java/com/subsidy/util/ConstantUtils.java
src/main/java/com/subsidy/util/ExcelFormatUtils.java
src/main/java/com/subsidy/util/MathUtil.java
src/main/java/com/subsidy/util/SMSUtils.java
src/main/java/com/subsidy/util/excel/ExcelUtil.java
src/main/java/com/subsidy/vo/administer/ExerciseTestVO.java
src/main/java/com/subsidy/vo/classdict/ClassDetailVO.java
src/main/java/com/subsidy/vo/classdict/GetAllClassesVO.java
src/main/java/com/subsidy/vo/member/ClassSignVO.java
src/main/java/com/subsidy/vo/member/GetCourseTestVO.java
src/main/java/com/subsidy/vo/sign/ClassSignInfoVO.java
src/main/resources/mapper/AnsweringQuestionMapper.xml
src/main/resources/mapper/ClassDictMapper.xml
src/main/resources/mapper/CourseDictMapper.xml
src/main/resources/mapper/SignInRecordMapper.xml
src/main/resources/mapper/VodPlayHistoryMapper.xml
pom.xml
View file @
301a3dc
...
...
@@ -55,6 +55,13 @@
</dependency>
<dependency>
<groupId>
com.belerweb
</groupId>
<artifactId>
pinyin4j
</artifactId>
<version>
2.5.1
</version>
</dependency>
<dependency>
<groupId>
com.tencentcloudapi
</groupId>
<artifactId>
tencentcloud-sdk-java
</artifactId>
<version>
3.1.64
</version>
...
...
src/main/java/com/subsidy/controller/AdministerController.java
View file @
301a3dc
...
...
@@ -84,7 +84,7 @@ public class AdministerController {
@PostMapping
(
"classSummary"
)
@ApiOperation
(
"课程汇总 id 班级id "
)
@LoginRequired
(
value
=
{
ConstantUtils
.
ADMINISTER_TERMINATE
})
//
@LoginRequired(value = {ConstantUtils.ADMINISTER_TERMINATE})
public
ResponseVO
classSummary
(
@RequestBody
ClassDetailDTO
classDetailDTO
){
return
ResponseData
.
generateCreatedResponse
(
0
,
administerService
.
classSummary
(
classDetailDTO
));
}
...
...
@@ -98,7 +98,7 @@ public class AdministerController {
@PostMapping
(
"exportClassDetail"
)
@ApiOperation
(
"班级管理--班级成员--导出 id 班级id userName"
)
@LoginRequired
(
value
=
{
ConstantUtils
.
ADMINISTER_TERMINATE
})
//
@LoginRequired(value = {ConstantUtils.ADMINISTER_TERMINATE})
public
void
exportClassDetail
(
@RequestBody
ClassDetailDTO
classDetailDTO
)
throws
Exception
{
classDetailDTO
.
setFlag
(
true
);
administerService
.
exportClassDetail
(
classDetailDTO
);
...
...
src/main/java/com/subsidy/controller/ClassDictController.java
View file @
301a3dc
...
...
@@ -4,11 +4,13 @@ package com.subsidy.controller;
import
com.subsidy.common.ResponseData
;
import
com.subsidy.common.ResponseVO
;
import
com.subsidy.common.interceptor.LoginRequired
;
import
com.subsidy.dto.classDict.AddClassDTO
;
import
com.subsidy.dto.classDict.AddMemberToClassDTO
;
import
com.subsidy.dto.classDict.GetAllClassesDTO
;
import
com.subsidy.dto.classDict.GetSpareMembersDTO
;
import
com.subsidy.model.ClassDictDO
;
import
com.subsidy.model.ClassMemberMappingDO
;
import
com.subsidy.model.CourseDictDO
;
import
com.subsidy.service.ClassDictService
;
import
com.subsidy.util.ConstantUtils
;
import
io.swagger.annotations.ApiOperation
;
...
...
@@ -51,10 +53,10 @@ public class ClassDictController {
}
@PostMapping
(
"addClass"
)
@ApiOperation
(
"添加课程 ** companyId courseId className startDate endDate"
)
@ApiOperation
(
"添加课程 **
userId:登录人id
companyId courseId className startDate endDate"
)
@LoginRequired
(
value
=
{
ConstantUtils
.
ADMINISTER_TERMINATE
})
public
ResponseVO
addClass
(
@RequestBody
ClassDictDO
classDictD
O
){
return
ResponseData
.
generateCreatedResponse
(
0
,
classDictService
.
addClass
(
classDictD
O
));
public
ResponseVO
addClass
(
@RequestBody
AddClassDTO
addClassDT
O
){
return
ResponseData
.
generateCreatedResponse
(
0
,
classDictService
.
addClass
(
addClassDT
O
));
}
@PostMapping
(
"updateClass"
)
...
...
@@ -80,7 +82,7 @@ public class ClassDictController {
@PostMapping
(
"getSpareMembers"
)
@ApiOperation
(
"获取不在某班级的某企业里所有成员 ** companyId 企业id classId 班级id"
)
@LoginRequired
(
value
=
{
ConstantUtils
.
ADMINISTER_TERMINATE
})
//
@LoginRequired(value = {ConstantUtils.ADMINISTER_TERMINATE})
public
ResponseVO
getSpareMembers
(
@RequestBody
GetSpareMembersDTO
getSpareMembersDTO
){
return
ResponseData
.
generateCreatedResponse
(
0
,
classDictService
.
getSpareMembers
(
getSpareMembersDTO
));
}
...
...
@@ -93,4 +95,11 @@ public class ClassDictController {
}
@PostMapping
(
"batchSms"
)
@ApiOperation
(
"批量发送班级短信 {id 班级id}"
)
public
ResponseVO
batchSms
(
@RequestBody
ClassDictDO
classDictDO
){
return
ResponseData
.
generateCreatedResponse
(
0
,
classDictService
.
batchSms
(
classDictDO
));
}
}
src/main/java/com/subsidy/dto/classDict/AddClassDTO.java
0 → 100644
View file @
301a3dc
package
com
.
subsidy
.
dto
.
classDict
;
import
com.subsidy.model.ClassDictDO
;
import
lombok.Data
;
@Data
public
class
AddClassDTO
extends
ClassDictDO
{
private
Long
userId
;
}
src/main/java/com/subsidy/mapper/ClassDictMapper.java
View file @
301a3dc
...
...
@@ -38,5 +38,9 @@ public interface ClassDictMapper extends BaseMapper<ClassDictDO> {
*/
List
<
MemberDO
>
getSpareMembers
(
GetSpareMembersDTO
getSpareMembersDTO
);
/**
* 查询班级里的学生信息
*/
List
<
MemberDO
>
classMembers
(
Long
classId
);
}
src/main/java/com/subsidy/mapper/CourseDictMapper.java
View file @
301a3dc
...
...
@@ -45,4 +45,5 @@ public interface CourseDictMapper extends BaseMapper<CourseDictDO> {
*/
IPage
<
QueryCoursesVO
>
queryCompanyCourse
(
IPage
page
,
String
courseName
,
Long
categoryId
,
String
courseType
,
String
courseSource
,
Long
companyId
);
}
src/main/java/com/subsidy/model/ClassDictDO.java
View file @
301a3dc
...
...
@@ -39,6 +39,11 @@ public class ClassDictDO extends BaseModel {
private
String
className
;
/**
* 班级类型
*/
private
String
classType
;
/**
* 课程id
*/
private
Long
courseId
;
...
...
src/main/java/com/subsidy/service/ClassDictService.java
View file @
301a3dc
package
com
.
subsidy
.
service
;
import
com.subsidy.dto.classDict.AddClassDTO
;
import
com.subsidy.dto.classDict.AddMemberToClassDTO
;
import
com.subsidy.dto.classDict.GetAllClassesDTO
;
import
com.subsidy.dto.classDict.GetSpareMembersDTO
;
import
com.subsidy.model.ClassDictDO
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.subsidy.model.ClassMemberMappingDO
;
import
com.subsidy.model.CourseDictDO
;
import
com.subsidy.model.MemberDO
;
import
com.subsidy.vo.classdict.GetAllClassesVO
;
...
...
@@ -25,7 +27,7 @@ public interface ClassDictService extends IService<ClassDictDO> {
String
deleteClasses
(
ClassDictDO
classDictDO
);
String
addClass
(
ClassDictDO
classDictD
O
);
String
addClass
(
AddClassDTO
addClassDT
O
);
String
updateClass
(
ClassDictDO
classDictDO
);
...
...
@@ -37,4 +39,5 @@ public interface ClassDictService extends IService<ClassDictDO> {
String
addMemberToClass
(
AddMemberToClassDTO
addMemberToClassDTO
);
String
batchSms
(
ClassDictDO
classDictDO
);
}
src/main/java/com/subsidy/service/CourseDictService.java
View file @
301a3dc
...
...
@@ -24,4 +24,5 @@ public interface CourseDictService extends IService<CourseDictDO> {
String
updateCourses
(
CourseDictDO
courseDictDO
);
IPage
queryCompanyCourse
(
QueryCoursesDTO
queryCoursesDTO
);
}
src/main/java/com/subsidy/service/impl/AdministerServiceImpl.java
View file @
301a3dc
...
...
@@ -18,6 +18,11 @@ import com.subsidy.vo.administer.*;
import
com.subsidy.vo.classdict.ClassDetailVO
;
import
com.subsidy.vo.member.ClassSignVO
;
import
com.subsidy.vo.sign.AnswerRecordVO
;
import
net.sourceforge.pinyin4j.PinyinHelper
;
import
net.sourceforge.pinyin4j.format.HanyuPinyinCaseType
;
import
net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat
;
import
net.sourceforge.pinyin4j.format.HanyuPinyinToneType
;
import
net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.poi.hssf.usermodel.*
;
import
org.apache.poi.hssf.util.CellRangeAddress
;
...
...
@@ -38,6 +43,7 @@ import org.springframework.web.multipart.MultipartFile;
import
javax.servlet.ServletOutputStream
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.*
;
import
java.lang.reflect.Member
;
import
java.math.BigDecimal
;
import
java.util.*
;
import
java.util.zip.ZipEntry
;
...
...
@@ -233,7 +239,7 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
for
(
ClassMemberMappingDO
classMemberMappingDO
:
classMemberMappingDOS
)
{
List
<
VodPlayHistoryDO
>
vodPlayHistoryDOS
=
vodPlayHistoryMapper
.
selectList
(
new
QueryWrapper
<
VodPlayHistoryDO
>()
.
lambda
()
.
eq
(
VodPlayHistoryDO:
:
getMemberId
,
classMemberMappingDO
.
getId
())
.
eq
(
VodPlayHistoryDO:
:
getMemberId
,
classMemberMappingDO
.
get
Member
Id
())
.
eq
(
VodPlayHistoryDO:
:
getVodId
,
vodDictDO
.
getId
())
.
orderByDesc
(
VodPlayHistoryDO:
:
getPlayRecord
));
...
...
@@ -242,13 +248,13 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
}
if
(
vodPlayHistoryDOS
.
size
()
>
0
)
{
if
(
vodPlayHistoryDOS
.
get
(
0
).
getPlayRecord
()
<
vodDictDO
.
getVodLength
()
*
0.8
)
{
if
(
vodPlayHistoryDOS
.
get
(
0
).
getPlayRecord
()
>=
vodDictDO
.
getVodLength
()
*
0.8
)
{
totalStudyVods
++;
}
}
}
}
classSummaryVO
.
setStudyVodCounts
(
MathUtil
.
intDivCeil
(
totalStudyVods
,
vodDict
DOS
.
size
()));
classSummaryVO
.
setStudyVodCounts
(
MathUtil
.
intDivCeil
(
totalStudyVods
,
classMemberMapping
DOS
.
size
()));
//平均完成时长 学生观看课程视频的全部时长/总人数
int
avg
=
MathUtil
.
intDivCeil
(
totalStudyLength
,
classMemberMappingDOS
.
size
());
...
...
@@ -305,7 +311,7 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
//该学生完成了多少个
int
i
=
0
;
int
playLength
=
0
;
//该成员完成了几个视频
for
(
VodDictDO
vodDictDO
:
vodDictDOS
)
{
List
<
VodPlayHistoryDO
>
vodPlayHistoryDOS
=
vodPlayHistoryMapper
.
selectList
(
new
QueryWrapper
<
VodPlayHistoryDO
>()
...
...
@@ -314,24 +320,37 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
.
eq
(
VodPlayHistoryDO:
:
getVodId
,
vodDictDO
.
getId
())
.
orderByDesc
(
VodPlayHistoryDO:
:
getPlayRecord
));
if
(
vodPlayHistoryDOS
.
size
()
>
0
)
{
if
(
vodPlayHistoryDOS
.
get
(
0
).
getPlayRecord
()
>
vodDictDO
.
getVodLength
()
*
0.8
)
{
i
++;
}
}
for
(
VodPlayHistoryDO
vodPlayHistoryDO
:
vodPlayHistoryDOS
){
playLength
+=
vodPlayHistoryDO
.
getPlayLength
();
}
}
classDetailVO
.
setStudyVodCounts
(
i
);
//学生测试完成情况
ExerciseDoneResultDO
exerciseDoneResultDO
=
exerciseDoneResultMapper
.
selectOne
(
new
QueryWrapper
<
ExerciseDoneResultDO
>()
.
lambda
()
.
eq
(
ExerciseDoneResultDO:
:
getC
ourseId
,
classDictDO
.
getCourse
Id
())
.
eq
(
ExerciseDoneResultDO:
:
getC
lassId
,
classDictDO
.
get
Id
())
.
eq
(
ExerciseDoneResultDO:
:
getMemberId
,
classDetailVO
.
getId
()));
if
(
null
!=
exerciseDoneResultDO
)
{
classDetailVO
.
setRightCounts
(
exerciseDoneResultDO
.
getRightCounts
());
classDetailVO
.
setTotalExeCounts
(
exerciseDoneResultDO
.
getTotalCounts
());
classDetailVO
.
setScore
(
MathUtil
.
intDivFloorPercent
(
exerciseDoneResultDO
.
getRightCounts
(),
exerciseDoneResultDO
.
getTotalCounts
()));
if
(
classDetailVO
.
getScore
()>=
60
){
classDetailVO
.
setResult
(
"合格"
);
}
else
{
classDetailVO
.
setResult
(
"不合格"
);
}
}
classDetailVO
.
setClassProcess
(
i
+
"/"
+
vodDictDOS
.
size
());
...
...
@@ -350,7 +369,7 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
classDetailVO
.
setSignCounts
(
signCount
);
//培训时长
classDetailVO
.
setTrainingLength
(
i
);
classDetailVO
.
setTrainingLength
(
playLength
);
}
classDetailVOIPage
.
setRecords
(
classDetailVOS
);
return
classDetailVOIPage
;
...
...
@@ -375,7 +394,7 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
//该学生完成了多少个
int
i
=
0
;
int
playLength
=
0
;
//该成员完成了几个视频
for
(
VodDictDO
vodDictDO
:
vodDictDOS
)
{
List
<
VodPlayHistoryDO
>
vodPlayHistoryDOS
=
vodPlayHistoryMapper
.
selectList
(
new
QueryWrapper
<
VodPlayHistoryDO
>()
...
...
@@ -389,17 +408,22 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
i
++;
}
}
for
(
VodPlayHistoryDO
vodPlayHistoryDO
:
vodPlayHistoryDOS
){
playLength
+=
vodPlayHistoryDO
.
getPlayLength
();
}
}
//classDetailVO.setStudyVodCounts(i);
classDetailVO
.
setClassProcess
(
i
+
"/"
+
vodDictDOS
.
size
());
//学生测试完成情况
ExerciseDoneResultDO
exerciseDoneResultDO
=
exerciseDoneResultMapper
.
selectOne
(
new
QueryWrapper
<
ExerciseDoneResultDO
>()
.
lambda
()
.
eq
(
ExerciseDoneResultDO:
:
getC
ourseId
,
classDictDO
.
getCourse
Id
())
.
eq
(
ExerciseDoneResultDO:
:
getC
lassId
,
classDictDO
.
get
Id
())
.
eq
(
ExerciseDoneResultDO:
:
getMemberId
,
classDetailVO
.
getId
()));
if
(
null
!=
exerciseDoneResultDO
)
{
classDetailVO
.
setScore
(
MathUtil
.
intDiv
Ceil
(
exerciseDoneResultDO
.
getRightCounts
(),
exerciseDoneResultDO
.
getTotalCounts
()));
classDetailVO
.
setScore
(
MathUtil
.
intDiv
FloorPercent
(
exerciseDoneResultDO
.
getRightCounts
(),
exerciseDoneResultDO
.
getTotalCounts
()));
}
else
{
classDetailVO
.
setScore
(
0
);
}
...
...
@@ -419,14 +443,14 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
classDetailVO
.
setSignCounts
(
signCount
);
//培训时长
classDetailVO
.
setTrainingLength
(
i
);
classDetailVO
.
setTrainingLength
(
playLength
);
classDetailVO
.
setTrainingLengthStr
(
MathUtil
.
secToTime
(
playLength
));
}
if
(
classDetailDTO
.
getFlag
())
{
CourseDictDO
courseDictDO
=
courseDictMapper
.
selectById
(
classDictDO
.
getCourseId
());
List
<
String
>
memberList
=
Arrays
.
asList
(
new
String
[]{
"序号"
,
"成员名称"
,
"身份证号码"
,
"账号"
,
"联系方式"
,
"签到次数"
,
"课程进度"
,
"培训时长"
,
"答疑数"
,
"测试成绩"
,
"总评价"
});
String
studyDate
=
classDictDO
.
getStartDate
()
+
" 至 "
+
classDictDO
.
getEndDate
();
ExcelUtil
.
writeMemberExcel
(
companyDictDO
.
getCompanyName
(),
studyDate
,
courseDictDO
.
getCourseName
(),
"授课记录汇总表"
,
classDetailVOS
,
memberList
);
ExcelUtil
.
writeMemberExcel
(
companyDictDO
.
getCompanyName
(),
studyDate
,
courseDictDO
.
getCourseName
(),
"授课记录汇总表"
,
classDetailVOS
,
ExcelFormatUtils
.
memberList
);
}
return
classDetailVOS
;
}
...
...
@@ -449,7 +473,7 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
//该学生完成了多少个
int
i
=
0
;
int
playLength
=
0
;
//该成员完成了几个视频
for
(
VodDictDO
vodDictDO
:
vodDictDOS
)
{
List
<
VodPlayHistoryDO
>
vodPlayHistoryDOS
=
vodPlayHistoryMapper
.
selectList
(
new
QueryWrapper
<
VodPlayHistoryDO
>()
...
...
@@ -463,6 +487,9 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
i
++;
}
}
for
(
VodPlayHistoryDO
vodPlayHistoryDO
:
vodPlayHistoryDOS
){
playLength
+=
vodPlayHistoryDO
.
getPlayLength
();
}
}
classSignVO
.
setStudyVodCounts
(
i
);
classSignVO
.
setClassProcess
(
i
+
"/"
+
vodDictDOS
.
size
());
...
...
@@ -489,7 +516,7 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
}
//培训时长
classSignVO
.
setTrainingLength
(
i
);
classSignVO
.
setTrainingLength
(
playLength
);
}
classSignVOIPage
.
setRecords
(
classSignVOS
);
return
classSignVOIPage
;
...
...
@@ -511,7 +538,7 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
//该学生完成了多少个
int
i
=
0
;
int
playLength
=
0
;
//该成员完成了几个视频
for
(
VodDictDO
vodDictDO
:
vodDictDOS
)
{
List
<
VodPlayHistoryDO
>
vodPlayHistoryDOS
=
vodPlayHistoryMapper
.
selectList
(
new
QueryWrapper
<
VodPlayHistoryDO
>()
...
...
@@ -525,6 +552,9 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
i
++;
}
}
for
(
VodPlayHistoryDO
vodPlayHistoryDO
:
vodPlayHistoryDOS
){
playLength
+=
vodPlayHistoryDO
.
getPlayLength
();
}
}
//classSignVO.setStudyVodCounts(i);
classSignVO
.
setClassProcess
(
i
+
"/"
+
vodDictDOS
.
size
());
...
...
@@ -551,16 +581,16 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
}
//培训时长
classSignVO
.
setTrainingLength
(
i
);
classSignVO
.
setTrainingLength
(
playLength
);
classSignVO
.
setTrainingLengthStr
(
MathUtil
.
secToTime
(
playLength
));
}
if
(
classDetailDTO
.
getFlag
())
{
ClassDictDO
classDictDO
=
classDictMapper
.
selectById
(
classDetailDTO
.
getId
());
CompanyDictDO
companyDictDO
=
companyDictMapper
.
selectById
(
classDictDO
.
getCompanyId
());
CourseDictDO
courseDictDO
=
courseDictMapper
.
selectById
(
classDictDO
.
getCourseId
());
List
<
String
>
signList
=
Arrays
.
asList
(
new
String
[]{
"序号"
,
"成员名称"
,
"身份证号码"
,
"手机号码"
,
"培训时长"
,
"课程进度"
,
"完成率"
,
"签到次数"
,
"签到日期"
});
String
studyDate
=
classDictDO
.
getStartDate
()
+
" 至 "
+
classDictDO
.
getEndDate
();
ExcelUtil
.
writeSignExcel
(
companyDictDO
.
getCompanyName
(),
studyDate
,
courseDictDO
.
getCourseName
(),
"注册签到表"
,
classSignVOS
,
signList
);
ExcelUtil
.
writeSignExcel
(
companyDictDO
.
getCompanyName
(),
studyDate
,
courseDictDO
.
getCourseName
(),
"注册签到表"
,
classSignVOS
,
ExcelFormatUtils
.
signList
);
}
return
classSignVOS
;
...
...
@@ -582,7 +612,7 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
//学生测试完成情况
ExerciseDoneResultDO
exerciseDoneResultDO
=
exerciseDoneResultMapper
.
selectOne
(
new
QueryWrapper
<
ExerciseDoneResultDO
>()
.
lambda
()
.
eq
(
ExerciseDoneResultDO:
:
getC
ourseId
,
classDictDO
.
getCourse
Id
())
.
eq
(
ExerciseDoneResultDO:
:
getC
lassId
,
classDictDO
.
get
Id
())
.
eq
(
ExerciseDoneResultDO:
:
getMemberId
,
exerciseTestVO
.
getId
()));
if
(
null
!=
exerciseDoneResultDO
)
{
...
...
@@ -595,9 +625,12 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
}
else
{
exerciseTestVO
.
setResult
(
"不合格"
);
}
exerciseTestVO
.
setCount
(
1
);
}
else
{
exerciseTestVO
.
setScore
(
0
);
exerciseTestVO
.
setResult
(
"未通过"
);
exerciseTestVO
.
setResult
(
"不合格"
);
exerciseTestVO
.
setCount
(
0
);
}
}
exerciseTestVOIPage
.
setRecords
(
classSignVOS
);
...
...
@@ -618,13 +651,13 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
//学生测试完成情况
ExerciseDoneResultDO
exerciseDoneResultDO
=
exerciseDoneResultMapper
.
selectOne
(
new
QueryWrapper
<
ExerciseDoneResultDO
>()
.
lambda
()
.
eq
(
ExerciseDoneResultDO:
:
getC
ourseId
,
classDictDO
.
getCourse
Id
())
.
eq
(
ExerciseDoneResultDO:
:
getC
lassId
,
classDictDO
.
get
Id
())
.
eq
(
ExerciseDoneResultDO:
:
getMemberId
,
exerciseTestVO
.
getId
()));
if
(
null
!=
exerciseDoneResultDO
)
{
int
rights
=
exerciseDoneResultDO
.
getRightCounts
();
int
total
=
exerciseDoneResultDO
.
getTotalCounts
();
int
score
=
MathUtil
.
intDiv
Ceil
(
rights
,
total
);
int
score
=
MathUtil
.
intDiv
FloorPercent
(
rights
,
total
);
exerciseTestVO
.
setScore
(
score
);
if
(
score
>=
60
)
{
exerciseTestVO
.
setResult
(
"合格"
);
...
...
@@ -633,16 +666,15 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
}
}
else
{
exerciseTestVO
.
setScore
(
0
);
exerciseTestVO
.
setResult
(
"
未通过
"
);
exerciseTestVO
.
setResult
(
"
不合格
"
);
}
}
if
(
classDetailDTO
.
getFlag
())
{
CompanyDictDO
companyDictDO
=
companyDictMapper
.
selectById
(
classDictDO
.
getCompanyId
());
CourseDictDO
courseDictDO
=
courseDictMapper
.
selectById
(
classDictDO
.
getCourseId
());
List
<
String
>
testList
=
Arrays
.
asList
(
new
String
[]{
"序号"
,
"成员名称"
,
"身份证号码"
,
"手机号码"
,
"测试最高成绩"
,
"测试次数"
,
"总评价"
});
String
studyDate
=
classDictDO
.
getStartDate
()
+
" 至 "
+
classDictDO
.
getEndDate
();
ExcelUtil
.
writeTestExcel
(
companyDictDO
.
getCompanyName
(),
studyDate
,
courseDictDO
.
getCourseName
(),
"测试成绩表"
,
exerciseTestVOS
,
test
List
);
ExcelUtil
.
writeTestExcel
(
companyDictDO
.
getCompanyName
(),
studyDate
,
courseDictDO
.
getCourseName
(),
"测试成绩表"
,
exerciseTestVOS
,
ExcelFormatUtils
.
score
List
);
}
return
exerciseTestVOS
;
...
...
@@ -662,9 +694,8 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
ClassDictDO
classDictDO
=
classDictMapper
.
selectById
(
classDetailDTO
.
getId
());
CompanyDictDO
companyDictDO
=
companyDictMapper
.
selectById
(
classDictDO
.
getCompanyId
());
CourseDictDO
courseDictDO
=
courseDictMapper
.
selectById
(
classDictDO
.
getCourseId
());
List
<
String
>
answersList
=
Arrays
.
asList
(
new
String
[]{
"序号"
,
"提问"
,
"答疑"
,
"提问时间"
,
"提问成员"
,
"答疑时间"
});
String
studyDate
=
classDictDO
.
getStartDate
()
+
" 至 "
+
classDictDO
.
getEndDate
();
ExcelUtil
.
writeAnswerExcel
(
companyDictDO
.
getCompanyName
(),
studyDate
,
courseDictDO
.
getCourseName
(),
"答疑记录表"
,
answerRecordVOS
,
answersList
);
ExcelUtil
.
writeAnswerExcel
(
companyDictDO
.
getCompanyName
(),
studyDate
,
courseDictDO
.
getCourseName
(),
"答疑记录表"
,
answerRecordVOS
,
ExcelFormatUtils
.
answersList
);
}
return
answerRecordVOS
;
}
...
...
@@ -689,21 +720,19 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
* 班级成员
*/
ByteArrayOutputStream
baos
=
new
ByteArrayOutputStream
();
List
<
String
>
memberList
=
Arrays
.
asList
(
new
String
[]{
"序号"
,
"成员名称"
,
"身份证号码"
,
"账号"
,
"联系方式"
,
"签到次数"
,
"课程进度"
,
"培训时长"
,
"答疑数"
,
"测试成绩"
,
"总评价"
});
classDetailDTO
.
setFlag
(
false
);
List
<
ClassDetailVO
>
classDetailVOS
=
exportClassDetail
(
classDetailDTO
);
String
studyDate
=
classDictDO
.
getStartDate
()
+
" 至 "
+
classDictDO
.
getEndDate
();
membersListExcel
(
companyDictDO
.
getCompanyName
(),
studyDate
,
courseDictDO
.
getCourseName
(),
"授课记录汇总表"
,
memberList
,
classDetailVOS
,
null
,
0
,
baos
);
membersListExcel
(
companyDictDO
.
getCompanyName
(),
studyDate
,
courseDictDO
.
getCourseName
(),
"授课记录汇总表"
,
ExcelFormatUtils
.
memberList
,
classDetailVOS
,
null
,
0
,
baos
);
compressFileToZipStream
(
zipOutputStream
,
baos
,
"member.xlsx"
);
/**
* 注册签到
*/
ByteArrayOutputStream
baos1
=
new
ByteArrayOutputStream
();
List
<
String
>
signList
=
Arrays
.
asList
(
new
String
[]{
"序号"
,
"成员名称"
,
"身份证号码"
,
"手机号码"
,
"培训时长"
,
"课程进度"
,
"完成率"
,
"签到次数"
,
"签到日期"
});
classDetailDTO
.
setFlag
(
false
);
List
<
ClassSignVO
>
classSignVOS
=
exportSignDetail
(
classDetailDTO
);
signListExcel
(
companyDictDO
.
getCompanyName
(),
studyDate
,
courseDictDO
.
getCourseName
(),
"注册签到"
,
signList
,
classSignVOS
,
null
,
0
,
baos1
);
signListExcel
(
companyDictDO
.
getCompanyName
(),
studyDate
,
courseDictDO
.
getCourseName
(),
"注册签到"
,
ExcelFormatUtils
.
signList
,
classSignVOS
,
null
,
0
,
baos1
);
compressFileToZipStream
(
zipOutputStream
,
baos1
,
"sign.xlsx"
);
...
...
@@ -711,10 +740,9 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
// * 测试成绩
// */
ByteArrayOutputStream
baos2
=
new
ByteArrayOutputStream
();
List
<
String
>
scoreList
=
Arrays
.
asList
(
new
String
[]{
"序号"
,
"成员名称"
,
"身份证号码"
,
"手机号码"
,
"测试最高成绩"
,
"测试次数"
,
"总评价"
});
classDetailDTO
.
setFlag
(
false
);
List
<
ExerciseTestVO
>
exerciseTestVOS
=
exportExerciseTest
(
classDetailDTO
);
testListExcel
(
companyDictDO
.
getCompanyName
(),
studyDate
,
courseDictDO
.
getCourseName
(),
"测试成绩"
,
scoreList
,
exerciseTestVOS
,
null
,
0
,
baos2
);
testListExcel
(
companyDictDO
.
getCompanyName
(),
studyDate
,
courseDictDO
.
getCourseName
(),
"测试成绩"
,
ExcelFormatUtils
.
scoreList
,
exerciseTestVOS
,
null
,
0
,
baos2
);
compressFileToZipStream
(
zipOutputStream
,
baos2
,
"test.xlsx"
);
...
...
@@ -722,9 +750,8 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
* 答疑记录
*/
ByteArrayOutputStream
baos3
=
new
ByteArrayOutputStream
();
List
<
String
>
answerList
=
Arrays
.
asList
(
new
String
[]{
"序号"
,
"提问"
,
"答疑"
,
"提问时间"
,
"提问成员"
,
"答疑时间"
});
List
<
AnswerRecordVO
>
answerRecordVOS
=
exportAnswerRecord
(
classDetailDTO
);
askListExcel
(
companyDictDO
.
getCompanyName
(),
studyDate
,
courseDictDO
.
getCourseName
(),
"答疑记录"
,
answer
List
,
answerRecordVOS
,
null
,
0
,
baos3
);
askListExcel
(
companyDictDO
.
getCompanyName
(),
studyDate
,
courseDictDO
.
getCourseName
(),
"答疑记录"
,
ExcelFormatUtils
.
answers
List
,
answerRecordVOS
,
null
,
0
,
baos3
);
compressFileToZipStream
(
zipOutputStream
,
baos3
,
"answer.xlsx"
);
zipOutputStream
.
flush
();
...
...
@@ -748,7 +775,11 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
try
{
List
<
MemberDO
>
memberDOS
=
new
ArrayList
<>();
HanyuPinyinOutputFormat
format
=
new
HanyuPinyinOutputFormat
();
//拼音小写
format
.
setCaseType
(
HanyuPinyinCaseType
.
LOWERCASE
);
//不带声调
format
.
setToneType
(
HanyuPinyinToneType
.
WITHOUT_TONE
);
ExcelUtil
.
readExcel
(
null
,
ImportMemberDTO
.
class
,
multipartFile
).
forEach
(
s
->
{
...
...
@@ -757,15 +788,32 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
.
eq
(
MemberDO:
:
getTelephone
,
s
.
getTelephone
()));
if
(
null
!=
memberDO
)
{
memberDOS
.
add
(
memberDO
);
//
memberDOS.add(memberDO);
}
else
{
MemberDO
memberDO1
=
new
MemberDO
();
memberDO1
.
setUserName
(
s
.
getUserName
());
memberDO1
.
setGender
(
s
.
getGender
());
memberDO1
.
setAccountName
(
s
.
getAccountName
());
try
{
String
accountName
=
PinyinHelper
.
toHanYuPinyinString
(
s
.
getUserName
(),
format
,
""
,
true
);
//List<MemberDO> memberDOS1 = memberMapper.selectList(new QueryWrapper<MemberDO>()
//.lambda()
//.like(MemberDO::getAccountName,accountName)
//.orderByDesc(MemberDO::getCreateDate));
//if (memberDOS1.size()>0){
// MemberDO mem = memberDOS1.get(0);
// Integer num = Integer.valueOf(mem.getAccountName().substring(mem.getAccountName().length()-4))+1;
// memberDO1.setAccountName(accountName+num);
//}else {
memberDO1
.
setAccountName
(
accountName
);
//}
}
catch
(
BadHanyuPinyinOutputFormatCombination
ex
)
{
}
//memberDO1.setAccountName(s.getAccountName());
memberDO1
.
setTelephone
(
s
.
getTelephone
());
memberDO1
.
setIdCard
(
s
.
getIdCard
());
memberDO1
.
setStatus
(
"启用"
);
memberDO1
.
setPassword
(
"123456"
);
memberMapper
.
insert
(
memberDO1
);
//找到该公司最大的部门
...
...
@@ -977,7 +1025,7 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
newCell
=
dataRow
.
createCell
(
7
);
newCell
.
setCellStyle
(
cellStyle
);
newCell
.
setCellValue
(
classDetailVO
.
getTrainingLength
());
newCell
.
setCellValue
(
classDetailVO
.
getTrainingLength
Str
());
newCell
=
dataRow
.
createCell
(
8
);
newCell
.
setCellStyle
(
cellStyle
);
...
...
@@ -1186,7 +1234,7 @@ public class AdministerServiceImpl extends ServiceImpl<AdministerMapper, Adminis
newCell
=
dataRow
.
createCell
(
4
);
newCell
.
setCellStyle
(
cellStyle
);
newCell
.
setCellValue
(
classSignVO
.
getTrainingLength
());
newCell
.
setCellValue
(
classSignVO
.
getTrainingLength
Str
());
newCell
=
dataRow
.
createCell
(
5
);
newCell
.
setCellStyle
(
cellStyle
);
...
...
src/main/java/com/subsidy/service/impl/ClassDictServiceImpl.java
View file @
301a3dc
package
com
.
subsidy
.
service
.
impl
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.subsidy.dto.classDict.AddClassDTO
;
import
com.subsidy.dto.classDict.AddMemberToClassDTO
;
import
com.subsidy.dto.classDict.GetAllClassesDTO
;
import
com.subsidy.dto.classDict.GetSpareMembersDTO
;
import
com.subsidy.mapper.AdministerMapper
;
import
com.subsidy.mapper.ClassMemberMappingMapper
;
import
com.subsidy.mapper.RoleAdministerMappingMapper
;
import
com.subsidy.mapper.*
;
import
com.subsidy.model.*
;
import
com.subsidy.mapper.ClassDictMapper
;
import
com.subsidy.service.ClassDictService
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.subsidy.util.ConstantUtils
;
import
com.subsidy.util.SMSUtils
;
import
com.subsidy.vo.classdict.GetAllClassesVO
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.BeanFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
...
...
@@ -35,6 +36,15 @@ public class ClassDictServiceImpl extends ServiceImpl<ClassDictMapper, ClassDict
@Autowired
private
ClassMemberMappingMapper
classMemberMappingMapper
;
@Autowired
private
RoleAdministerMappingMapper
roleAdministerMappingMapper
;
@Autowired
private
CourseDictMapper
courseDictMapper
;
@Autowired
private
CompanyDictMapper
companyDictMapper
;
public
List
<
GetAllClassesVO
>
getAllClasses
(
ClassDictDO
classDictDO
)
{
return
this
.
baseMapper
.
getAllClasses
(
classDictDO
);
...
...
@@ -50,7 +60,23 @@ public class ClassDictServiceImpl extends ServiceImpl<ClassDictMapper, ClassDict
return
ConstantUtils
.
DELETE_SUCCESS
;
}
public
String
addClass
(
ClassDictDO
classDictDO
)
{
public
String
addClass
(
AddClassDTO
addClassDTO
)
{
//查看当前登录人的角色
int
count
=
roleAdministerMappingMapper
.
selectCount
(
new
QueryWrapper
<
RoleAdministerMappingDO
>()
.
lambda
()
.
eq
(
RoleAdministerMappingDO:
:
getAdministerId
,
addClassDTO
.
getUserId
())
.
eq
(
RoleAdministerMappingDO:
:
getRoleId
,
1
));
ClassDictDO
classDictDO
=
new
ClassDictDO
();
BeanUtils
.
copyProperties
(
addClassDTO
,
classDictDO
);
if
(
count
>
0
){
classDictDO
.
setClassType
(
"平台支持"
);
}
else
{
classDictDO
.
setClassType
(
"企业自建"
);
}
this
.
baseMapper
.
insert
(
classDictDO
);
return
ConstantUtils
.
ADD_SUCCESS
;
}
...
...
@@ -89,4 +115,27 @@ public class ClassDictServiceImpl extends ServiceImpl<ClassDictMapper, ClassDict
return
ConstantUtils
.
ADD_SUCCESS
;
}
public
String
batchSms
(
ClassDictDO
classDictDO
){
ClassDictDO
classDictDO1
=
this
.
baseMapper
.
selectById
(
classDictDO
.
getId
());
CourseDictDO
courseDictDO
=
courseDictMapper
.
selectById
(
classDictDO1
.
getCourseId
());
CompanyDictDO
companyDictDO
=
companyDictMapper
.
selectById
(
classDictDO
.
getCompanyId
());
//查找这个班级里的学员的手机号
List
<
MemberDO
>
memberDOS
=
this
.
baseMapper
.
classMembers
(
classDictDO
.
getId
());
StringBuilder
telephone
=
new
StringBuilder
();
String
param
=
"{\"company\":\""
+
companyDictDO
.
getCompanyName
()+
"\",course\":\""
+
courseDictDO
.
getCourseName
()+
"\",\"startDate\":\""
+
classDictDO1
.
getStartDate
()
+
"\",\"endDate\":\""
+
classDictDO1
.
getEndDate
()
+
"\"}"
;
if
(
memberDOS
.
size
()>
0
){
for
(
int
i
=
0
;
i
<
memberDOS
.
size
();
i
++){
telephone
.
append
(
memberDOS
.
get
(
i
).
getTelephone
());
if
(
i
!=
memberDOS
.
size
()-
1
){
telephone
.
append
(
","
);
}
}
SMSUtils
.
sendNoticeSMS
(
"SMS_228117919"
,
telephone
.
toString
(),
param
);
}
return
ConstantUtils
.
SUCCESS_SEND_OUT
;
}
}
src/main/java/com/subsidy/service/impl/CourseDictServiceImpl.java
View file @
301a3dc
...
...
@@ -8,15 +8,13 @@ import com.subsidy.dto.course.QueryCoursesDTO;
import
com.subsidy.mapper.AdministerMapper
;
import
com.subsidy.mapper.CompanyDictMapper
;
import
com.subsidy.mapper.RoleAdministerMappingMapper
;
import
com.subsidy.model.AdministerDO
;
import
com.subsidy.model.CompanyDictDO
;
import
com.subsidy.model.CourseDictDO
;
import
com.subsidy.model.*
;
import
com.subsidy.mapper.CourseDictMapper
;
import
com.subsidy.model.RoleAdministerMappingDO
;
import
com.subsidy.service.CompanyDictService
;
import
com.subsidy.service.CourseDictService
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.subsidy.util.ConstantUtils
;
import
com.subsidy.util.SMSUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
...
...
@@ -37,12 +35,6 @@ public class CourseDictServiceImpl extends ServiceImpl<CourseDictMapper, CourseD
@Autowired
private
RoleAdministerMappingMapper
roleAdministerMappingMapper
;
@Autowired
private
AdministerMapper
administerMapper
;
@Autowired
private
CompanyDictMapper
companyDictMapper
;
public
String
addCourse
(
CourseDictDO
courseDictDO
)
{
int
count
=
0
;
...
...
@@ -147,4 +139,5 @@ public class CourseDictServiceImpl extends ServiceImpl<CourseDictMapper, CourseD
}
}
src/main/java/com/subsidy/service/impl/MemberServiceImpl.java
View file @
301a3dc
...
...
@@ -372,9 +372,11 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, MemberDO> imple
if
(
vodPlayHistoryDOS
.
size
()>
0
){
VodPlayHistoryDO
vodPlayHistoryDO
=
vodPlayHistoryDOS
.
get
(
0
);
VodDictDO
vodDictDO
=
vodDictMapper
.
selectById
(
vodPlayHistoryDO
.
getVodId
());
if
(
null
!=
vodDictDO
){
BeanUtils
.
copyProperties
(
vodDictDO
,
contentVodNewVO
);
contentVodNewVO
.
setPlayRecord
(
vodPlayHistoryDO
.
getPlayRecord
());
}
}
return
contentVodNewVO
;
}
...
...
@@ -435,12 +437,21 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, MemberDO> imple
ExerciseDoneResultDO
exerciseDoneResultDO
=
exerciseDoneResultMapper
.
selectOne
(
new
QueryWrapper
<
ExerciseDoneResultDO
>()
.
lambda
()
.
eq
(
ExerciseDoneResultDO:
:
getC
ourseId
,
course
DictDO
.
getId
())
.
eq
(
ExerciseDoneResultDO:
:
getC
lassId
,
class
DictDO
.
getId
())
.
eq
(
ExerciseDoneResultDO:
:
getMemberId
,
contentMemberDTO
.
getMemberId
()));
if
(
null
!=
exerciseDoneResultDO
)
{
getCourseTestVO
.
setRightCount
(
String
.
valueOf
(
exerciseDoneResultDO
.
getRightCounts
()));
getCourseTestVO
.
setTotalCount
(
String
.
valueOf
(
exerciseDoneResultDO
.
getTotalCounts
()));
//正确率
Integer
percent
=
MathUtil
.
intDivFloorPercent
(
exerciseDoneResultDO
.
getRightCounts
(),
exerciseDoneResultDO
.
getTotalCounts
());
if
(
percent
>=
60
){
getCourseTestVO
.
setResult
(
"合格"
);
}
else
{
getCourseTestVO
.
setResult
(
"不合格"
);
}
getCourseTestVO
.
setPercent
(
String
.
valueOf
(
percent
));
}
else
{
getCourseTestVO
.
setRightCount
(
"-"
);
//该课程下有多少习题
...
...
@@ -448,6 +459,8 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, MemberDO> imple
.
lambda
()
.
eq
(
ExerciseDictDO:
:
getCourseId
,
courseDictDO
.
getId
()));
getCourseTestVO
.
setTotalCount
(
String
.
valueOf
(
count
));
getCourseTestVO
.
setPercent
(
"-"
);
getCourseTestVO
.
setResult
(
"不合格"
);
}
return
getCourseTestVO
;
}
...
...
@@ -459,7 +472,7 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, MemberDO> imple
MemberDO
memberDO1
=
this
.
baseMapper
.
selectById
(
memberDO
.
getId
());
//第几天
long
diff
=
Duration
.
between
(
LocalDateTime
.
now
(),
memberDO1
.
getCreateDate
()).
toDays
();
long
diff
=
Duration
.
between
(
memberDO1
.
getCreateDate
(),
LocalDateTime
.
now
()).
toDays
();
getStudyInfoVO
.
setDiff
(
diff
);
//已学课程
...
...
src/main/java/com/subsidy/service/impl/SignInRecordServiceImpl.java
View file @
301a3dc
...
...
@@ -66,10 +66,10 @@ public class SignInRecordServiceImpl extends ServiceImpl<SignInRecordMapper, Sig
this
.
baseMapper
.
delete
(
new
QueryWrapper
<
SignInRecordDO
>()
.
lambda
()
.
eq
(
SignInRecordDO:
:
getMemberId
,
signInRecordDO
.
getMemberId
())
.
eq
(
SignInRecordDO:
:
getMemberId
,
signInRecordDO
.
getMemberId
())
.
gt
(
SignInRecordDO:
:
getSignInDate
,
LocalDate
.
now
()));
for
(
ClassDictDO
classDictDO
:
classDictDOS
){
for
(
ClassDictDO
classDictDO
:
classDictDOS
)
{
SignInRecordDO
signInRecordDO1
=
new
SignInRecordDO
();
signInRecordDO1
.
setClassId
(
classDictDO
.
getId
());
signInRecordDO1
.
setMemberId
(
signInRecordDO
.
getMemberId
());
...
...
@@ -84,15 +84,15 @@ public class SignInRecordServiceImpl extends ServiceImpl<SignInRecordMapper, Sig
Page
pager
=
new
Page
(
classSignInfoDTO
.
getPageNum
(),
classSignInfoDTO
.
getPageSize
());
IPage
<
ClassSignInfoVO
>
classSignInfoVOIPage
=
this
.
baseMapper
.
classSignInfo
(
pager
,
classSignInfoDTO
.
getClassName
(),
classSignInfoDTO
.
getCourseName
(),
classSignInfoDTO
.
getCompanyId
());
IPage
<
ClassSignInfoVO
>
classSignInfoVOIPage
=
this
.
baseMapper
.
classSignInfo
(
pager
,
classSignInfoDTO
.
getClassName
(),
classSignInfoDTO
.
getCourseName
(),
classSignInfoDTO
.
getCompanyId
());
List
<
ClassSignInfoVO
>
classSignInfoVOS
=
classSignInfoVOIPage
.
getRecords
();
for
(
ClassSignInfoVO
classSignInfoVO
:
classSignInfoVOS
){
for
(
ClassSignInfoVO
classSignInfoVO
:
classSignInfoVOS
)
{
//班级人数
List
<
ClassMemberMappingDO
>
classMemberMappingDOS
=
classMemberMappingMapper
.
selectList
(
new
QueryWrapper
<
ClassMemberMappingDO
>()
.
lambda
()
.
eq
(
ClassMemberMappingDO:
:
getClassId
,
classSignInfoVO
.
getClassId
()));
.
eq
(
ClassMemberMappingDO:
:
getClassId
,
classSignInfoVO
.
getClassId
()));
classSignInfoVO
.
setMemberCount
(
classMemberMappingDOS
.
size
());
...
...
@@ -103,29 +103,29 @@ public class SignInRecordServiceImpl extends ServiceImpl<SignInRecordMapper, Sig
int
totalStudyVods
=
0
;
int
totalStudyLength
=
0
;
int
totalStudyLength
=
0
;
//学生总共学习课时数
for
(
VodDictDO
vodDictDO
:
vodDictDOS
)
{
for
(
ClassMemberMappingDO
classMemberMappingDO
:
classMemberMappingDOS
)
{
List
<
VodPlayHistoryDO
>
vodPlayHistoryDOS
=
vodPlayHistoryMapper
.
selectList
(
new
QueryWrapper
<
VodPlayHistoryDO
>()
.
lambda
()
.
eq
(
VodPlayHistoryDO:
:
getMemberId
,
classMemberMappingDO
.
getId
())
.
eq
(
VodPlayHistoryDO:
:
getMemberId
,
classMemberMappingDO
.
get
Member
Id
())
.
eq
(
VodPlayHistoryDO:
:
getVodId
,
vodDictDO
.
getId
())
.
orderByDesc
(
VodPlayHistoryDO:
:
getPlayRecord
));
for
(
VodPlayHistoryDO
vodPlayHistoryDO
:
vodPlayHistoryDOS
){
totalStudyLength
+=
vodPlayHistoryDO
.
getPlayLength
();
for
(
VodPlayHistoryDO
vodPlayHistoryDO
:
vodPlayHistoryDOS
)
{
totalStudyLength
+=
vodPlayHistoryDO
.
getPlayLength
();
}
if
(
vodPlayHistoryDOS
.
size
()
>
0
)
{
if
(
vodPlayHistoryDOS
.
get
(
0
).
getPlayRecord
()
>
vodDictDO
.
getVodLength
()
*
0.8
)
{
if
(
vodPlayHistoryDOS
.
get
(
0
).
getPlayRecord
()
>
=
vodDictDO
.
getVodLength
()
*
0.8
)
{
totalStudyVods
++;
}
}
}
}
classSignInfoVO
.
setStudyVodCounts
(
MathUtil
.
intDiv
FloorPercent
(
totalStudyVods
,
vodDictDOS
.
size
()
));
classSignInfoVO
.
setStudyVodCounts
(
MathUtil
.
intDiv
Ceil
(
totalStudyVods
,
classMemberMappingDOS
.
size
()
));
//平均完成时长 学生观看课程视频的全部时长/总人数
int
avg
=
MathUtil
.
intDivCeil
(
totalStudyLength
,
classMemberMappingDOS
.
size
());
int
avg
=
MathUtil
.
intDivCeil
(
totalStudyLength
,
classMemberMappingDOS
.
size
());
classSignInfoVO
.
setAvgVodPlayLength
(
avg
);
//测试通过率
...
...
@@ -136,19 +136,19 @@ public class SignInRecordServiceImpl extends ServiceImpl<SignInRecordMapper, Sig
int
passNum
=
0
;
for
(
ExerciseDoneResultDO
exerciseDoneResultDO
:
exerciseDoneResultDOS
)
{
if
(
exerciseDoneResultDO
.
getRightCounts
()
>
exerciseDoneResultDO
.
getTotalCounts
()
*
0.6
)
{
if
(
exerciseDoneResultDO
.
getRightCounts
()
>
exerciseDoneResultDO
.
getTotalCounts
()
*
0.6
)
{
passNum
++;
}
}
classSignInfoVO
.
setPassRate
(
MathUtil
.
intDivFloorPercent
(
passNum
,
classMemberMappingDOS
.
size
()));
classSignInfoVO
.
setPassRate
(
MathUtil
.
intDivFloorPercent
(
passNum
,
classMemberMappingDOS
.
size
()));
//平均签到数 向上取整
//签到总次数
Integer
signCount
=
this
.
baseMapper
.
selectCount
(
new
QueryWrapper
<
SignInRecordDO
>()
.
lambda
()
.
eq
(
SignInRecordDO:
:
getClassId
,
classSignInfoVO
.
getClassId
()));
classSignInfoVO
.
setAvgSignCount
(
MathUtil
.
intDivCeil
(
signCount
,
classMemberMappingDOS
.
size
()));
.
eq
(
SignInRecordDO:
:
getClassId
,
classSignInfoVO
.
getClassId
()));
classSignInfoVO
.
setAvgSignCount
(
MathUtil
.
intDivCeil
(
signCount
,
classMemberMappingDOS
.
size
()));
//答疑数
Integer
count
=
answeringQuestionMapper
.
selectCount
(
new
QueryWrapper
<
AnsweringQuestionDO
>()
...
...
@@ -162,7 +162,7 @@ public class SignInRecordServiceImpl extends ServiceImpl<SignInRecordMapper, Sig
}
public
SignInStatusVO
signInStatus
(
SignInRecordDO
signInRecordDO
){
public
SignInStatusVO
signInStatus
(
SignInRecordDO
signInRecordDO
)
{
SignInStatusVO
signInStatusVO
=
new
SignInStatusVO
();
...
...
@@ -172,15 +172,14 @@ public class SignInRecordServiceImpl extends ServiceImpl<SignInRecordMapper, Sig
List
<
ClassDictDO
>
classDictDOS
=
classMemberMappingMapper
.
getMemberClass
(
signInRecordDO
.
getMemberId
());
for
(
ClassDictDO
classDictDO
:
classDictDOS
){
for
(
ClassDictDO
classDictDO
:
classDictDOS
)
{
Integer
count
=
this
.
baseMapper
.
selectCount
(
new
QueryWrapper
<
SignInRecordDO
>()
.
lambda
()
.
eq
(
SignInRecordDO:
:
getClassId
,
classDictDO
.
getId
())
.
eq
(
SignInRecordDO:
:
getMemberId
,
signInRecordDO
.
getMemberId
())
.
gt
(
SignInRecordDO:
:
getSignInDate
,
LocalDate
.
now
()));
.
eq
(
SignInRecordDO:
:
getClassId
,
classDictDO
.
getId
())
.
eq
(
SignInRecordDO:
:
getMemberId
,
signInRecordDO
.
getMemberId
())
.
gt
(
SignInRecordDO:
:
getSignInDate
,
LocalDate
.
now
()));
if
(
count
==
0
)
{
if
(
count
==
0
)
{
flag
=
false
;
}
...
...
src/main/java/com/subsidy/util/ConstantUtils.java
View file @
301a3dc
...
...
@@ -44,6 +44,8 @@ public class ConstantUtils {
public
static
final
String
NOTICE_NAME
=
"有课进度通知"
;
public
static
final
String
TECH_NAME
=
"有课互联科技"
;
public
static
final
String
PUBLISH_SUCCESS
=
"发布成功"
;
public
static
final
String
LOGIN_OUT
=
"登出成功"
;
...
...
src/main/java/com/subsidy/util/ExcelFormatUtils.java
0 → 100644
View file @
301a3dc
package
com
.
subsidy
.
util
;
import
java.util.Arrays
;
import
java.util.List
;
public
class
ExcelFormatUtils
{
public
static
final
List
<
String
>
memberList
=
Arrays
.
asList
(
new
String
[]{
"序号"
,
"成员名称"
,
"身份证号码"
,
"账号"
,
"联系方式"
,
"签到次数"
,
"课程进度"
,
"培训时长"
,
"答疑数"
,
"测试成绩"
,
"总评价"
});
public
static
final
List
<
String
>
signList
=
Arrays
.
asList
(
new
String
[]{
"序号"
,
"成员名称"
,
"身份证号码"
,
"手机号码"
,
"培训时长"
,
"课程进度"
,
"完成率"
,
"签到次数"
,
"签到日期"
});
public
static
final
List
<
String
>
scoreList
=
Arrays
.
asList
(
new
String
[]{
"序号"
,
"成员名称"
,
"身份证号码"
,
"手机号码"
,
"测试最高成绩"
,
"测试次数"
,
"总评价"
});
public
static
final
List
<
String
>
answersList
=
Arrays
.
asList
(
new
String
[]{
"序号"
,
"提问"
,
"答疑"
,
"提问时间"
,
"提问成员"
,
"答疑时间"
});
}
src/main/java/com/subsidy/util/MathUtil.java
View file @
301a3dc
...
...
@@ -89,12 +89,13 @@ public class MathUtil {
return
counts
.
multiply
(
new
BigDecimal
(
100
)).
divide
(
total
,
RoundingMode
.
CEILING
).
stripTrailingZeros
().
toPlainString
()
+
"%"
;
}
}
//百分比 不带%输出
public
static
String
getPercentAvgIndexWithPercent
(
BigDecimal
counts
,
BigDecimal
total
)
{
if
(
BigDecimal
.
ZERO
.
equals
(
total
)
||
BigDecimal
.
ZERO
.
equals
(
counts
))
{
return
"0"
;
}
else
{
return
counts
.
multiply
(
new
BigDecimal
(
100
)).
divide
(
total
,
2
,
BigDecimal
.
ROUND_HALF_UP
).
stripTrailingZeros
().
toPlainString
();
return
counts
.
multiply
(
new
BigDecimal
(
100
)).
divide
(
total
,
2
,
BigDecimal
.
ROUND_HALF_UP
).
stripTrailingZeros
().
toPlainString
();
}
}
...
...
@@ -103,7 +104,7 @@ public class MathUtil {
if
(
BigDecimal
.
ZERO
.
equals
(
total
)
||
BigDecimal
.
ZERO
.
equals
(
counts
))
{
return
"0"
;
}
else
{
return
counts
.
multiply
(
new
BigDecimal
(
100
)).
divide
(
total
,
2
,
BigDecimal
.
ROUND_CEILING
).
stripTrailingZeros
().
toPlainString
();
return
counts
.
multiply
(
new
BigDecimal
(
100
)).
divide
(
total
,
2
,
BigDecimal
.
ROUND_CEILING
).
stripTrailingZeros
().
toPlainString
();
}
}
...
...
@@ -124,7 +125,7 @@ public class MathUtil {
return
(
int
)
Math
.
floor
((
double
)
a
*
100
/
b
);
}
public
static
Integer
getRandomNum
(
Integer
i
){
public
static
Integer
getRandomNum
(
Integer
i
)
{
Random
random
=
new
Random
();
return
random
.
nextInt
(
i
);
}
...
...
@@ -134,4 +135,36 @@ public class MathUtil {
// System.out.println(getRandomNum(2));
// }
// }
public
static
String
secToTime
(
int
time
)
{
String
timeStr
=
null
;
int
hour
=
0
;
int
minute
=
0
;
int
second
=
0
;
if
(
time
<=
0
)
{
return
"00:00"
;
}
else
{
minute
=
time
/
60
;
if
(
minute
<
60
)
{
second
=
time
%
60
;
timeStr
=
unitFormat
(
minute
)
+
":"
+
unitFormat
(
second
);
}
else
{
hour
=
minute
/
60
;
minute
=
minute
%
60
;
second
=
time
-
hour
*
3600
-
minute
*
60
;
timeStr
=
unitFormat
(
hour
)
+
":"
+
unitFormat
(
minute
)
+
":"
+
unitFormat
(
second
);
}
}
return
timeStr
;
}
public
static
String
unitFormat
(
int
i
)
{
String
retStr
=
null
;
if
(
i
>=
0
&&
i
<
10
)
{
retStr
=
"0"
+
Integer
.
toString
(
i
);
}
else
{
retStr
=
""
+
i
;
}
return
retStr
;
}
}
src/main/java/com/subsidy/util/SMSUtils.java
View file @
301a3dc
...
...
@@ -11,6 +11,11 @@ import com.aliyuncs.profile.DefaultProfile;
import
com.aliyuncs.profile.IClientProfile
;
import
com.subsidy.common.configure.AliyunSmsProperties
;
import
com.subsidy.common.exception.HttpException
;
import
net.sourceforge.pinyin4j.PinyinHelper
;
import
net.sourceforge.pinyin4j.format.HanyuPinyinCaseType
;
import
net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat
;
import
net.sourceforge.pinyin4j.format.HanyuPinyinToneType
;
import
net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
...
...
@@ -110,7 +115,7 @@ public class SMSUtils {
request
.
setSysAction
(
"SendSms"
);
request
.
putQueryParameter
(
"RegionId"
,
ConstantUtils
.
REGION_ID
);
request
.
putQueryParameter
(
"PhoneNumbers"
,
telephone
);
request
.
putQueryParameter
(
"SignName"
,
ConstantUtils
.
NOTICE
_NAME
);
request
.
putQueryParameter
(
"SignName"
,
ConstantUtils
.
TECH
_NAME
);
request
.
putQueryParameter
(
"TemplateCode"
,
templateId
);
// if (StringUtils.isEmpty(param)){
// request.putQueryParameter("TemplateParam","{ \"code\":\""+verifyCode +"\"}");
...
...
@@ -131,9 +136,22 @@ public class SMSUtils {
}
}
public
static
void
main
(
String
[]
args
)
{
String
param
=
"{ \"company\":\""
+
"基金会"
+
"\",\"time\":\""
+
"2020-01-02"
+
"\",\"address\":\""
+
"上海市"
+
"\"}"
;
sendNoticeSMS
(
"SMS_215336604"
,
"15201936167"
,
param
);
//public static void main(String[] args) {
// String param = "{ \"course\":\""+"语文课"+ "\",\"time\":\""+"2020-01-02" +"\",\"address\":\""+"上海市" +"\"}";
// sendNoticeSMS("SMS_215336604","15201936167,18201963812",param);
//}
public
static
void
main
(
String
[]
args
)
throws
BadHanyuPinyinOutputFormatCombination
{
HanyuPinyinOutputFormat
format
=
new
HanyuPinyinOutputFormat
();
//拼音小写
format
.
setCaseType
(
HanyuPinyinCaseType
.
LOWERCASE
);
//不带声调
format
.
setToneType
(
HanyuPinyinToneType
.
WITHOUT_TONE
);
//format.setVCharType();
//要转换的中文,格式,转换之后的拼音的分隔符,遇到不能转换的是否保留 wo,shi,zhong,guo,ren,,hello
System
.
out
.
println
(
PinyinHelper
.
toHanYuPinyinString
(
"我是中国人"
,
format
,
""
,
false
));
}
}
src/main/java/com/subsidy/util/excel/ExcelUtil.java
View file @
301a3dc
...
...
@@ -267,7 +267,7 @@ public class ExcelUtil {
titleFont
.
setBoldweight
((
short
)
700
);
titleStyle
.
setFont
(
titleFont
);
//第二行
//第二行
/第三行样式
CellStyle
secondStyle
=
workbook
.
createCellStyle
();
secondStyle
.
setBorderBottom
(
HSSFCellStyle
.
BORDER_THIN
);
//下边框
secondStyle
.
setBorderLeft
(
HSSFCellStyle
.
BORDER_THIN
);
//左边框
...
...
@@ -277,16 +277,6 @@ public class ExcelUtil {
Font
secondFont
=
workbook
.
createFont
();
secondStyle
.
setFont
(
secondFont
);
//第三行
CellStyle
thirdStyle
=
workbook
.
createCellStyle
();
thirdStyle
.
setBorderBottom
(
HSSFCellStyle
.
BORDER_THIN
);
//下边框
thirdStyle
.
setBorderLeft
(
HSSFCellStyle
.
BORDER_THIN
);
//左边框
thirdStyle
.
setBorderTop
(
HSSFCellStyle
.
BORDER_THIN
);
//上边框
thirdStyle
.
setBorderRight
(
HSSFCellStyle
.
BORDER_THIN
);
//右边框
secondStyle
.
setAlignment
(
HSSFCellStyle
.
ALIGN_LEFT
);
Font
thirdFont
=
workbook
.
createFont
();
thirdStyle
.
setFont
(
thirdFont
);
// 列头样式
CellStyle
headerStyle
=
workbook
.
createCellStyle
();
setStyle
(
headerStyle
);
...
...
@@ -384,10 +374,10 @@ public class ExcelUtil {
sheet
.
addMergedRegion
(
cellRangeAddress32
);
setBorderStyle
(
HSSFCellStyle
.
BORDER_THIN
,
cellRangeAddress32
,
sheet
,
workbook
);
//给合并过的单元格加边框
thirdRow
.
createCell
(
0
).
setCellValue
(
thirdHead
[
0
]);
thirdRow
.
getCell
(
0
).
setCellStyle
(
thir
dStyle
);
thirdRow
.
getCell
(
0
).
setCellStyle
(
secon
dStyle
);
thirdRow
.
createCell
(
5
).
setCellValue
(
thirdHead
[
1
]);
thirdRow
.
getCell
(
5
).
setCellStyle
(
thir
dStyle
);
thirdRow
.
getCell
(
5
).
setCellStyle
(
secon
dStyle
);
//标题 3
SXSSFRow
headerRow
=
sheet
.
createRow
(
3
);
//列头 rowIndex =1
...
...
@@ -444,7 +434,7 @@ public class ExcelUtil {
newCell
=
dataRow
.
createCell
(
7
);
newCell
.
setCellStyle
(
cellStyle
);
newCell
.
setCellValue
(
classDetailVO
.
getTrainingLength
());
newCell
.
setCellValue
(
classDetailVO
.
getTrainingLength
Str
());
newCell
=
dataRow
.
createCell
(
8
);
newCell
.
setCellStyle
(
cellStyle
);
...
...
@@ -660,7 +650,7 @@ public class ExcelUtil {
newCell
=
dataRow
.
createCell
(
4
);
newCell
.
setCellStyle
(
cellStyle
);
newCell
.
setCellValue
(
classSignVO
.
getTrainingLength
());
newCell
.
setCellValue
(
classSignVO
.
getTrainingLength
Str
());
newCell
=
dataRow
.
createCell
(
5
);
newCell
.
setCellStyle
(
cellStyle
);
...
...
src/main/java/com/subsidy/vo/administer/ExerciseTestVO.java
View file @
301a3dc
...
...
@@ -24,4 +24,5 @@ public class ExerciseTestVO {
private
String
telephone
;
private
Integer
count
;
}
src/main/java/com/subsidy/vo/classdict/ClassDetailVO.java
View file @
301a3dc
...
...
@@ -4,7 +4,7 @@ import com.subsidy.util.excel.ExcelColumn;
import
lombok.Data
;
@Data
public
class
ClassDetailVO
<
T
>
{
public
class
ClassDetailVO
{
private
Long
id
;
...
...
@@ -40,9 +40,12 @@ public class ClassDetailVO <T>{
@ExcelColumn
(
col
=
6
,
value
=
"课程进度"
)
private
String
classProcess
;
@ExcelColumn
(
col
=
7
,
value
=
"培训时长"
)
private
Integer
trainingLength
;
@ExcelColumn
(
col
=
7
,
value
=
"培训时长"
)
private
String
trainingLengthStr
;
/**
* 作对个数
*/
...
...
@@ -66,7 +69,7 @@ public class ClassDetailVO <T>{
private
Integer
askCounts
;
private
String
result
;
...
...
src/main/java/com/subsidy/vo/classdict/GetAllClassesVO.java
View file @
301a3dc
...
...
@@ -19,4 +19,6 @@ public class GetAllClassesVO {
private
Integer
cnt
;
private
String
classType
;
}
src/main/java/com/subsidy/vo/member/ClassSignVO.java
View file @
301a3dc
...
...
@@ -29,9 +29,11 @@ public class ClassSignVO {
/**
* 培训时长
*/
@ExcelColumn
(
col
=
4
,
value
=
"培训时长"
)
private
Integer
trainingLength
;
@ExcelColumn
(
col
=
4
,
value
=
"培训时长"
)
private
String
trainingLengthStr
;
/**
* 已看视频
*/
...
...
src/main/java/com/subsidy/vo/member/GetCourseTestVO.java
View file @
301a3dc
...
...
@@ -15,4 +15,8 @@ public class GetCourseTestVO {
private
String
deadline
;
private
String
result
;
private
String
percent
;
}
src/main/java/com/subsidy/vo/sign/ClassSignInfoVO.java
View file @
301a3dc
...
...
@@ -53,5 +53,8 @@ public class ClassSignInfoVO {
*/
private
Integer
answerCount
;
private
String
classType
;
}
src/main/resources/mapper/AnsweringQuestionMapper.xml
View file @
301a3dc
...
...
@@ -41,7 +41,7 @@
<if
test=
"memberId != null "
>
and t.ask_id = #{memberId}
</if>
order by t.create_date
order by t.create_date
desc
</select>
</mapper>
src/main/resources/mapper/ClassDictMapper.xml
View file @
301a3dc
...
...
@@ -30,7 +30,8 @@
t2.course_name,
t.start_date,
t.end_date,
t4.cnt
t4.cnt,
t.class_type
FROM
class_dict t
LEFT JOIN course_dict t2 ON t.course_id = t2.id
...
...
@@ -76,7 +77,7 @@
AND t3.company_id = #{companyId}
AND t2.id NOT IN (
SELECT
t3.id
t3.
member_
id
FROM
class_member_mapping t3
WHERE
...
...
@@ -84,4 +85,16 @@
AND t3.class_id = #{classId})
</select>
<select
id=
"classMembers"
parameterType=
"long"
resultType=
"com.subsidy.model.MemberDO"
>
SELECT
t2.*
FROM
class_member_mapping t
LEFT JOIN member t2 ON t.member_id = t2.id
WHERE
t.delete_date IS NULL
AND t2.delete_date IS NULL
AND t.class_id = #{classId}
</select>
</mapper>
src/main/resources/mapper/CourseDictMapper.xml
View file @
301a3dc
...
...
@@ -115,4 +115,7 @@
AND t.company_id = #{companyId}
</if>
</select>
</mapper>
src/main/resources/mapper/SignInRecordMapper.xml
View file @
301a3dc
...
...
@@ -23,15 +23,16 @@
<select
id=
"classSignInfo"
resultType=
"com.subsidy.vo.sign.ClassSignInfoVO"
>
SELECT
t.id
as
classId,
t2.id
as
courseId,
t.id
AS
classId,
t2.id
AS
courseId,
t.class_name,
t2.course_name,
t.start_date,
t.end_date
t.end_date,
t.class_type
FROM
c
ompany_dict t3
left join class_dict t on
t3.id = t.company_id
c
lass_dict t
LEFT JOIN company_dict t3 ON
t3.id = t.company_id
LEFT JOIN course_dict t2 ON t.course_id = t2.id
WHERE
t.delete_date IS NULL
...
...
src/main/resources/mapper/VodPlayHistoryMapper.xml
View file @
301a3dc
...
...
@@ -31,7 +31,8 @@
t2.vod_url,
t2.vod_name,
t3.play_record,
round( t3.play_record * 100 / t2.vod_length, 0 ) AS percent
round( t3.play_record * 100 / t2.vod_length, 0 ) AS percent,
t.playDate
FROM
(
SELECT
...
...
@@ -53,6 +54,7 @@
LEFT JOIN vod_dict t2 ON t.vod_id = t2.id
WHERE
t2.delete_date IS NULL
order by t.playDate desc
</select>
</mapper>
Write
Preview
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment