wangliang пре 2 година
родитељ
комит
05c0ac4e54

+ 3 - 0
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamActivityController.java

@@ -3,6 +3,7 @@ package com.qmth.themis.admin.api;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.themis.business.annotation.Logs;
 import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.constant.SystemConstant;
@@ -12,6 +13,7 @@ import com.qmth.themis.business.entity.TEAudio;
 import com.qmth.themis.business.entity.TEExamActivity;
 import com.qmth.themis.business.enums.ExamModeEnum;
 import com.qmth.themis.business.enums.FieldUniqueEnum;
+import com.qmth.themis.business.enums.LogEnum;
 import com.qmth.themis.business.enums.MonitorVideoSourceEnum;
 import com.qmth.themis.business.service.*;
 import com.qmth.themis.business.service.impl.TEExamActivityServiceImpl;
@@ -86,6 +88,7 @@ public class TEExamActivityController {
     @RequestMapping(value = "/save", method = RequestMethod.POST)
     @Transactional
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    @Logs(value = LogEnum.EXAM_ACTIVITY)
     public Result save(
             @ApiParam(value = "考试场次信息", required = true) @RequestBody List<TEExamActivity> teExamActivityList) {
         teExamActivityService.saveExamActivity(teExamActivityList);

+ 32 - 39
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamController.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.themis.business.annotation.ApiJsonObject;
 import com.qmth.themis.business.annotation.ApiJsonProperty;
+import com.qmth.themis.business.annotation.Logs;
 import com.qmth.themis.business.bean.admin.CountStopBean;
 import com.qmth.themis.business.cache.ExamingDataCacheUtil;
 import com.qmth.themis.business.cache.RedisKeyHelper;
@@ -87,9 +88,6 @@ public class TEExamController {
     @Resource
     ThemisCacheService themisCacheService;
 
-    @Resource
-    TSLogService tsLogService;
-
     @Resource
     TEExamCourseService teExamCourseService;
 
@@ -103,6 +101,7 @@ public class TEExamController {
     @RequestMapping(value = "/save", method = RequestMethod.POST)
     @Transactional
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    @Logs(value = LogEnum.EXAM)
     public Result save(@ApiParam(value = "考试批次信息", required = true) @RequestBody TEExamDto teExamDto) {
         if (Objects.isNull(teExamDto) || Objects.equals(teExamDto, "")) {
             throw new BusinessException(ExceptionResultEnum.EXAM_INFO_IS_NULL);
@@ -161,44 +160,38 @@ public class TEExamController {
             }
             teExamDto.setMonitorStatus(Objects.nonNull(oldTeExam) ? oldTeExam.getMonitorStatus() : InvigilateMonitorStatusEnum.NOT_START);
             teExam = new TEExam(teExamDto);
-            if (Objects.nonNull(oldTeExam) && !teExam.equals(oldTeExam)) {//不一样则日志记录
-                if (teExam.getEndTime().longValue() < System.currentTimeMillis()) {
-                    throw new BusinessException("修改的批次结束时间只能大于当前时间");
-                }
-                if (Objects.nonNull(oldTeExam) && Objects.nonNull(teExam)
-                        && oldTeExam.getForceFinish().intValue() != teExam.getForceFinish().intValue()
-                        && teExam.getMode() == oldTeExam.getMode()) {
-                    QueryWrapper<TEExamActivity> teExamActivityQueryWrapper = new QueryWrapper<>();
-                    teExamActivityQueryWrapper.lambda().eq(TEExamActivity::getExamId, oldId);
-                    List<TEExamActivity> teExamActivityList = teExamActivityService.list(teExamActivityQueryWrapper);
-                    if (!CollectionUtils.isEmpty(teExamActivityList)) {
-                        if (teExam.getForceFinish().intValue() == 1) {//从非强制交卷改成强制交卷,这时需生成场次定时任务
-                            //新增quartz任务,发送mq消息start
-                            Map<String, Object> prop = new HashMap<>();
-                            prop.put(SystemConstant.OPER, SystemConstant.INSERT);
-                            prop.put(SystemConstant.EXAM, teExam);
-                            MqDto mqDto = new MqDto(mqUtil.getTopic(), MqTagEnum.EXAM_ACTIVITY.name(),
-                                    JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY,
-                                    String.valueOf(teExam.getId()), prop, tbUser.getName());
-                            mqDtoService.assembleSendOneOrderMsg(mqDto);
-                            //新增quartz任务,发送mq消息end
-                        } else {//否则删除场次定时任务
-                            //删除quartz任务,发送mq消息start
-                            Map<String, Object> prop = new HashMap<>();
-                            prop.put(SystemConstant.OPER, SystemConstant.DELETE);
-                            prop.put(SystemConstant.EXAM, teExam);
-                            MqDto mqDto = new MqDto(mqUtil.getTopic(), MqTagEnum.EXAM_ACTIVITY.name(),
-                                    JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY,
-                                    String.valueOf(teExam.getId()), prop, tbUser.getName());
-                            mqDtoService.assembleSendOneOrderMsg(mqDto);
-                            //删除quartz任务,发送mq消息end
-                        }
+            if (Objects.nonNull(teExam.getEndTime()) && teExam.getEndTime().longValue() < System.currentTimeMillis()) {
+                throw new BusinessException("修改的批次结束时间只能大于当前时间");
+            }
+            if (Objects.nonNull(oldTeExam) && Objects.nonNull(teExam)
+                    && oldTeExam.getForceFinish().intValue() != teExam.getForceFinish().intValue()
+                    && teExam.getMode() == oldTeExam.getMode()) {
+                QueryWrapper<TEExamActivity> teExamActivityQueryWrapper = new QueryWrapper<>();
+                teExamActivityQueryWrapper.lambda().eq(TEExamActivity::getExamId, oldId);
+                List<TEExamActivity> teExamActivityList = teExamActivityService.list(teExamActivityQueryWrapper);
+                if (!CollectionUtils.isEmpty(teExamActivityList)) {
+                    if (teExam.getForceFinish().intValue() == 1) {//从非强制交卷改成强制交卷,这时需生成场次定时任务
+                        //新增quartz任务,发送mq消息start
+                        Map<String, Object> prop = new HashMap<>();
+                        prop.put(SystemConstant.OPER, SystemConstant.INSERT);
+                        prop.put(SystemConstant.EXAM, teExam);
+                        MqDto mqDto = new MqDto(mqUtil.getTopic(), MqTagEnum.EXAM_ACTIVITY.name(),
+                                JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY,
+                                String.valueOf(teExam.getId()), prop, tbUser.getName());
+                        mqDtoService.assembleSendOneOrderMsg(mqDto);
+                        //新增quartz任务,发送mq消息end
+                    } else {//否则删除场次定时任务
+                        //删除quartz任务,发送mq消息start
+                        Map<String, Object> prop = new HashMap<>();
+                        prop.put(SystemConstant.OPER, SystemConstant.DELETE);
+                        prop.put(SystemConstant.EXAM, teExam);
+                        MqDto mqDto = new MqDto(mqUtil.getTopic(), MqTagEnum.EXAM_ACTIVITY.name(),
+                                JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY,
+                                String.valueOf(teExam.getId()), prop, tbUser.getName());
+                        mqDtoService.assembleSendOneOrderMsg(mqDto);
+                        //删除quartz任务,发送mq消息end
                     }
                 }
-                tsLogService.save(new TSLog(LogEnum.EXAM, teExam.getName(),
-                        JacksonUtil.parseJson(oldTeExam),
-                        JacksonUtil.parseJson(teExam),
-                        tbUser.getId(), teExam.getId()));
             }
             List<String> monitorRecordList = teExamDto.getMonitorRecord();
             if (Objects.nonNull(monitorRecordList) && monitorRecordList.size() > 1) {

+ 2 - 34
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamCourseController.java

@@ -1,17 +1,14 @@
 package com.qmth.themis.admin.api;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.themis.business.annotation.Logs;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.entity.TBUser;
 import com.qmth.themis.business.entity.TEExamCourse;
-import com.qmth.themis.business.entity.TSLog;
 import com.qmth.themis.business.enums.FieldUniqueEnum;
 import com.qmth.themis.business.enums.LogEnum;
 import com.qmth.themis.business.service.TEExamCourseService;
-import com.qmth.themis.business.service.TSLogService;
-import com.qmth.themis.business.util.JacksonUtil;
 import com.qmth.themis.business.util.ServletUtil;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
@@ -20,17 +17,14 @@ import com.qmth.themis.common.util.ResultUtil;
 import io.swagger.annotations.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
-import java.util.List;
 import java.util.Objects;
 
 /**
@@ -50,43 +44,17 @@ public class TEExamCourseController {
     @Resource
     TEExamCourseService teExamCourseService;
 
-    @Resource
-    TSLogService tsLogService;
-
     @ApiOperation(value = "考试科目修改接口")
     @RequestMapping(value = "/course/save", method = RequestMethod.POST)
     @Transactional
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    @Logs(value = LogEnum.EXAM_COURSE)
     public Result save(@ApiParam(value = "考试科目信息", required = true) @RequestBody TEExamCourse teExamCourse) {
         if (Objects.isNull(teExamCourse) || Objects.equals(teExamCourse, "")) {
             throw new BusinessException(ExceptionResultEnum.COURSE_INFO_IS_NULL);
         }
         try {
             TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
-            QueryWrapper<TEExamCourse> teExamCourseQueryWrapper = new QueryWrapper<>();
-            teExamCourseQueryWrapper.lambda()
-                    .eq(TEExamCourse::getExamId, teExamCourse.getExamId())
-                    .eq(TEExamCourse::getCourseCode, teExamCourse.getCourseCode());
-            List<TEExamCourse> teExamCourseDbList = teExamCourseService.list(teExamCourseQueryWrapper);
-
-            if (!CollectionUtils.isEmpty(teExamCourseDbList)) {
-                teExamCourseDbList.forEach(s -> {
-                    TEExamCourse teExamCourseNew = new TEExamCourse();
-                    BeanUtils.copyProperties(s, teExamCourseNew);
-                    teExamCourseNew.setObjectiveShuffle(teExamCourse.getObjectiveShuffle());
-                    teExamCourseNew.setOptionShuffle(teExamCourse.getOptionShuffle());
-                    teExamCourseNew.setMobilePhotoUpload(teExamCourse.getMobilePhotoUpload());
-                    teExamCourseNew.setUpdateId(tbUser.getId());
-                    teExamCourseNew.setUpdateTime(System.currentTimeMillis());
-                    if (Objects.nonNull(s) && !teExamCourseNew.equals(s)) {//不一样则日志记录
-                        tsLogService.save(new TSLog(LogEnum.EXAM_COURSE, teExamCourseNew.getCourseCode(),
-                                JacksonUtil.parseJson(s),
-                                JacksonUtil.parseJson(teExamCourseNew),
-                                tbUser.getId(), teExamCourseNew.getId()));
-                    }
-                });
-            }
-
             UpdateWrapper<TEExamCourse> teExamCourseUpdateWrapper = new UpdateWrapper<>();
             teExamCourseUpdateWrapper.lambda().set(TEExamCourse::getObjectiveShuffle, teExamCourse.getObjectiveShuffle())
                     .set(TEExamCourse::getOptionShuffle, teExamCourse.getOptionShuffle())

+ 6 - 17
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamPaperController.java

@@ -1,6 +1,7 @@
 package com.qmth.themis.admin.api;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qmth.themis.business.annotation.Logs;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCourseCacheBean;
 import com.qmth.themis.business.cache.bean.ExamPaperCacheBean;
@@ -9,7 +10,10 @@ import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.entity.*;
 import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.service.*;
-import com.qmth.themis.business.util.*;
+import com.qmth.themis.business.util.MqUtil;
+import com.qmth.themis.business.util.OssUtil;
+import com.qmth.themis.business.util.ServletUtil;
+import com.qmth.themis.business.util.UidUtil;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.GsonUtil;
@@ -18,7 +22,6 @@ import com.qmth.themis.common.util.ResultUtil;
 import io.swagger.annotations.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
@@ -68,9 +71,6 @@ public class TEExamPaperController {
     @Resource
     TOeExamRecordService tOeExamRecordService;
 
-    @Resource
-    TSLogService tsLogService;
-
     @ApiOperation(value = "考试试卷查询接口")
     @RequestMapping(value = "/query", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "考试科目信息", response = TEExamPaper.class)})
@@ -91,6 +91,7 @@ public class TEExamPaperController {
     @RequestMapping(value = "/save", method = RequestMethod.POST)
     @Transactional
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    @Logs(value = LogEnum.EXAM_PAPER)
     public Result save(@ApiParam(value = "考试试卷信息", required = true) @RequestBody List<TEExamPaper> teExamPaperList) {
         if (Objects.isNull(teExamPaperList) || teExamPaperList.size() == 0) {
             throw new BusinessException(ExceptionResultEnum.PAPER_INFO_IS_NULL);
@@ -101,18 +102,6 @@ public class TEExamPaperController {
                 if (Objects.isNull(s.getId())) {
                     s.setId(UidUtil.nextId());
                     s.setCreateTime(System.currentTimeMillis());
-                } else {
-                    TEExamPaper teExamPaperDb = teExamPaperService.getById(s.getId());
-                    TEExamPaper teExamPaper = new TEExamPaper();
-                    BeanUtils.copyProperties(teExamPaperDb, teExamPaper);
-                    teExamPaper.setWeight(s.getWeight());
-                    teExamPaper.setAudioPlayCount(s.getAudioPlayCount());
-                    if (Objects.nonNull(teExamPaperDb) && !teExamPaper.equals(teExamPaperDb)) {//不一样则日志记录
-                        tsLogService.save(new TSLog(LogEnum.EXAM_PAPER, teExamPaper.getName(),
-                                JacksonUtil.parseJson(teExamPaperDb),
-                                JacksonUtil.parseJson(teExamPaper),
-                                tbUser.getId(), teExamPaper.getId()));
-                    }
                 }
                 s.setUpdateId(tbUser.getId());
                 s.setUpdateTime(System.currentTimeMillis());

+ 20 - 0
themis-business/src/main/java/com/qmth/themis/business/annotation/Logs.java

@@ -0,0 +1,20 @@
+package com.qmth.themis.business.annotation;
+
+import com.qmth.themis.business.enums.LogEnum;
+
+import java.lang.annotation.*;
+
+/**
+ * @Description: 日志注解
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2023/2/27
+ */
+@Documented
+@Target({ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Logs {
+
+    LogEnum value() default LogEnum.JOB;
+}

+ 242 - 0
themis-business/src/main/java/com/qmth/themis/business/aspect/LogsAspect.java

@@ -0,0 +1,242 @@
+package com.qmth.themis.business.aspect;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.google.common.reflect.TypeToken;
+import com.qmth.themis.business.annotation.Logs;
+import com.qmth.themis.business.cache.bean.ExamCacheBean;
+import com.qmth.themis.business.constant.SystemConstant;
+import com.qmth.themis.business.dto.request.TEExamDto;
+import com.qmth.themis.business.entity.*;
+import com.qmth.themis.business.enums.InvigilateMonitorStatusEnum;
+import com.qmth.themis.business.enums.LogEnum;
+import com.qmth.themis.business.service.*;
+import com.qmth.themis.business.util.JacksonUtil;
+import com.qmth.themis.business.util.ServletUtil;
+import com.qmth.themis.common.exception.BusinessException;
+import com.qmth.themis.common.util.GsonUtil;
+import com.qmth.themis.common.util.ResultUtil;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import org.springframework.validation.BeanPropertyBindingResult;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+/**
+ * @Description: 日志切入点
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2023/2/27
+ */
+@Aspect
+@Component
+public class LogsAspect {
+    private final static Logger log = LoggerFactory.getLogger(LogsAspect.class);
+
+    @Resource
+    TEExamPaperService teExamPaperService;
+
+    @Resource
+    TSLogService tsLogService;
+
+    @Resource
+    TEExamService teExamService;
+
+    @Resource
+    TEExamActivityService teExamActivityService;
+
+    @Resource
+    TEExamCourseService teExamCourseService;
+
+    /**
+     * api切入点
+     */
+    @Pointcut("@annotation(com.qmth.themis.business.annotation.Logs)")
+    public void logAspect() {
+    }
+
+    /**
+     * 后置通知
+     *
+     * @param joinPoint
+     */
+    @Around(value = "logAspect()")
+    public Object afterReturnAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
+        long start = System.currentTimeMillis();
+        StringJoiner stringJoiner = new StringJoiner("");
+        try {
+            MethodSignature msig = (MethodSignature) joinPoint.getSignature();
+            String className = msig.getDeclaringTypeName();
+            String methodName = msig.getName();
+            Object[] args = joinPoint.getArgs();
+            String[] paramsName = msig.getParameterNames();
+            Logs logs = msig.getMethod().getAnnotation(Logs.class);
+            HttpServletRequest request = ServletUtil.getRequest();
+            stringJoiner.add("============logs 请求地址============:").add(request.getServletPath()).add("\r\n");
+            stringJoiner.add("============logs 类============:").add(className).add("\r\n");
+            stringJoiner.add("============logs 方法============:").add(methodName).add("\r\n");
+            stringJoiner.add("============logs 注解============:").add(logs.value().name()).add("|").add(logs.value().getTitle()).add("|").add(logs.value().getObject().toString()).add("\r\n");
+
+            List<Map> list = (List<Map>) getArgsData(args, paramsName, stringJoiner);
+            List<Object> objectDbList = null, objectList = null;
+            List<String> nameList = null;
+            List<Long> objIdList = null;
+            TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
+            if (!CollectionUtils.isEmpty(list)) {
+                objectDbList = new ArrayList<>(list.size());
+                objectList = new ArrayList<>(list.size());
+                nameList = new ArrayList<>(list.size());
+                objIdList = new ArrayList<>(list.size());
+                for (int i = 0; i < list.size(); i++) {
+                    Class c = (Class) logs.value().getObject();
+                    Object objectDb = null;
+                    Object object = null;
+                    if (c == TEExamPaper.class) {//考试试卷
+                        TEExamPaper argParam = (TEExamPaper) GsonUtil.fromJson(GsonUtil.toJson(list.get(i)), c);
+                        if (Objects.nonNull(argParam.getId())) {
+                            objectDb = teExamPaperService.getById(argParam.getId());
+                        } else {
+                            continue;
+                        }
+                        object = new TEExamPaper();
+                        BeanUtils.copyProperties(objectDb, object);
+                        ((TEExamPaper) object).setWeight(argParam.getWeight());
+                        ((TEExamPaper) object).setAudioPlayCount(argParam.getAudioPlayCount());
+                        nameList.add(((TEExamPaper) object).getName());
+                        objIdList.add(((TEExamPaper) object).getId());
+                    } else if (c == TEExam.class) {//考试批次
+                        TEExamDto argParam = (TEExamDto) GsonUtil.fromJson(GsonUtil.toJson(list.get(i)), TEExamDto.class);
+                        argParam.setOrgId(tbUser.getOrgId());
+                        if (Objects.nonNull(argParam.getId())) {
+                            ExamCacheBean examCacheBean = teExamService.getExamCacheBean(argParam.getId());
+                            objectDb = teExamService.cacheConvert(examCacheBean);
+                        } else {
+                            continue;
+                        }
+                        argParam.setMonitorStatus(Objects.nonNull(objectDb) ? ((TEExam) objectDb).getMonitorStatus() : InvigilateMonitorStatusEnum.NOT_START);
+                        object = new TEExam(argParam);
+                        nameList.add(((TEExam) object).getName());
+                        objIdList.add(((TEExam) object).getId());
+                    } else if (c == TEExamActivity.class) {//考试场次
+                        TEExamActivity argParam = (TEExamActivity) GsonUtil.fromJson(GsonUtil.toJson(list.get(i)), c);
+                        if (Objects.nonNull(argParam.getId())) {
+                            objectDb = teExamActivityService.getById(argParam.getId());
+                        } else {
+                            continue;
+                        }
+                        argParam.setCode(((TEExamActivity) objectDb).getCode());
+                        object = new TEExamActivity();
+                        BeanUtils.copyProperties(argParam, object);
+                        nameList.add(((TEExamActivity) object).getCode());
+                        objIdList.add(((TEExamActivity) object).getId());
+                    } else if (c == TEExamCourse.class) {//考试科目
+                        TEExamCourse argParam = (TEExamCourse) GsonUtil.fromJson(GsonUtil.toJson(list.get(i)), c);
+                        QueryWrapper<TEExamCourse> teExamCourseQueryWrapper = new QueryWrapper<>();
+                        teExamCourseQueryWrapper.lambda()
+                                .eq(TEExamCourse::getExamId, argParam.getExamId())
+                                .eq(TEExamCourse::getCourseCode, argParam.getCourseCode());
+                        List<TEExamCourse> teExamCourseDbList = teExamCourseService.list(teExamCourseQueryWrapper);
+                        if (!CollectionUtils.isEmpty(teExamCourseDbList)) {
+                            for (int y = 0; y < teExamCourseDbList.size(); y++) {
+                                objectDb = teExamCourseDbList.get(y);
+                                object = new TEExamCourse();
+                                BeanUtils.copyProperties(objectDb, object);
+                                ((TEExamCourse) object).setObjectiveShuffle(argParam.getObjectiveShuffle());
+                                ((TEExamCourse) object).setOptionShuffle(argParam.getOptionShuffle());
+                                ((TEExamCourse) object).setMobilePhotoUpload(argParam.getMobilePhotoUpload());
+                                ((TEExamCourse) object).setUpdateId(tbUser.getId());
+                                ((TEExamCourse) object).setUpdateTime(System.currentTimeMillis());
+                                saveLogs(objectDb, object, logs.value(), Objects.nonNull(tbUser) ? tbUser.getId() : 1L, ((TEExamCourse) object).getCourseCode(), ((TEExamCourse) object).getId());
+                            }
+                        }
+                    }
+                    objectDbList.add(objectDb);
+                    objectList.add(object);
+                }
+            }
+            if (!CollectionUtils.isEmpty(objectDbList) && !CollectionUtils.isEmpty(nameList) && objectDbList.size() == nameList.size()) {
+                for (int i = 0; i < objectDbList.size(); i++) {
+                    saveLogs(objectDbList.get(i), objectList.get(i), logs.value(), Objects.nonNull(tbUser) ? tbUser.getId() : 1L, nameList.get(i), objIdList.get(i));
+                }
+            }
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            if (e instanceof BusinessException) {
+                return ResultUtil.error((BusinessException) e, e.getMessage());
+            } else {
+                return ResultUtil.error(e.getMessage());
+            }
+        } finally {
+            long end = System.currentTimeMillis();
+            stringJoiner.add("============logs 耗时============:").add((end - start) / 1000 + "").add("秒");
+            log.info("logs request:{}", stringJoiner.toString());
+        }
+        return joinPoint.proceed();
+    }
+
+    /**
+     * 获取参数
+     *
+     * @param args
+     * @param paramsName
+     * @param stringJoiner
+     * @return
+     */
+    protected Object getArgsData(Object[] args, String[] paramsName, StringJoiner stringJoiner) {
+        List<Map> list = null;
+        Map map = null;
+        if (Objects.nonNull(args) && args.length > 0) {
+            for (int i = 0; i < args.length; i++) {
+                if (Objects.nonNull(args[i]) && (args[i] instanceof HttpServletRequest || args[i] instanceof HttpServletResponse || args[i] instanceof CommonsMultipartFile || args[i] instanceof MultipartFile || args[i] instanceof BeanPropertyBindingResult)) {
+                    continue;
+                } else {
+                    stringJoiner.add("参数key:").add(JacksonUtil.parseJson(paramsName[i])).add(",参数value:").add(JacksonUtil.parseJson(args[i])).add("\r\n");
+                }
+                if (args[i] instanceof ArrayList) {
+                    list = GsonUtil.fromJson(GsonUtil.toJson(args[i]), new TypeToken<List<Map>>() {
+                    }.getType());
+                } else {
+                    map = GsonUtil.fromJson(GsonUtil.toJson(args[i]), Map.class);
+                }
+            }
+            if (!CollectionUtils.isEmpty(list)) {
+                return list;
+            } else {
+                return Arrays.asList(map);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 保存日志
+     *
+     * @param o1
+     * @param o2
+     * @param logEnum
+     * @param userId
+     * @param name
+     * @param objId
+     */
+    protected void saveLogs(Object o1, Object o2, LogEnum logEnum, Long userId, String name, Long objId) {
+        if (Objects.nonNull(o1) && !o1.equals(o2)) {//不一样则日志记录
+            tsLogService.save(new TSLog(logEnum, name,
+                    JacksonUtil.parseJson(o1),
+                    JacksonUtil.parseJson(o2),
+                    userId, objId));
+        }
+    }
+}

+ 17 - 8
themis-business/src/main/java/com/qmth/themis/business/enums/LogEnum.java

@@ -1,5 +1,7 @@
 package com.qmth.themis.business.enums;
 
+import com.qmth.themis.business.entity.*;
+
 /**
  * @Description: 日志枚举
  * @Param:
@@ -9,27 +11,34 @@ package com.qmth.themis.business.enums;
  */
 public enum LogEnum {
 
-    JOB("定时任务"),
+    JOB("定时任务", "job"),
 
-    ORG("机构"),
+    ORG("机构", TBOrg.class),
 
-    STUDENT("学生"),
+    STUDENT("学生", TEStudent.class),
 
-    EXAM("考试批次"),
+    EXAM("考试批次", TEExam.class),
 
-    EXAM_ACTIVITY("考试场次"),
+    EXAM_ACTIVITY("考试场次", TEExamActivity.class),
 
-    EXAM_PAPER("考试试卷"),
+    EXAM_PAPER("考试试卷", TEExamPaper.class),
 
-    EXAM_COURSE("考试科目");
+    EXAM_COURSE("考试科目", TEExamCourse.class);
 
     private String title;
 
-    private LogEnum(String title) {
+    private Object object;
+
+    private LogEnum(String title, Object object) {
         this.title = title;
+        this.object = object;
     }
 
     public String getTitle() {
         return title;
     }
+
+    public Object getObject() {
+        return object;
+    }
 }

+ 18 - 24
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamActivityServiceImpl.java

@@ -15,7 +15,10 @@ import com.qmth.themis.business.dto.response.MonitorStreamDto;
 import com.qmth.themis.business.dto.response.TEExamActivityDto;
 import com.qmth.themis.business.dto.response.TEExamActivityQueryDto;
 import com.qmth.themis.business.dto.response.TEExamActivityWaitDto;
-import com.qmth.themis.business.entity.*;
+import com.qmth.themis.business.entity.TBUser;
+import com.qmth.themis.business.entity.TEAudio;
+import com.qmth.themis.business.entity.TEExam;
+import com.qmth.themis.business.entity.TEExamActivity;
 import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.service.*;
 import com.qmth.themis.business.util.*;
@@ -77,9 +80,6 @@ public class TEExamActivityServiceImpl extends ServiceImpl<TEExamActivityMapper,
     @Resource
     TEAudioService teAudioService;
 
-    @Resource
-    TSLogService tsLogService;
-
     @Resource
     TOeExamRecordService tOeExamRecordService;
 
@@ -378,26 +378,20 @@ public class TEExamActivityServiceImpl extends ServiceImpl<TEExamActivityMapper,
                             TEExamActivity teExamActivityDb = teExamActivityService.getById(s.getId());
                             if (Objects.nonNull(teExamActivityDb)) {
                                 s.setCode(teExamActivityDb.getCode());
-                                if (!s.equals(teExamActivityDb)) {//不一样则日志记录
-                                    if (s.getFinishTime().longValue() < System.currentTimeMillis()) {
-                                        throw new BusinessException("修改的场次结束时间只能大于当前时间");
-                                    }
-                                    if (Objects.nonNull(teExam.getForceFinish()) && teExam.getForceFinish().intValue() == 1
-                                            && s.getFinishTime().longValue() != teExamActivityDb.getFinishTime().longValue()) {
-                                        //删除再新增quartz任务,发送mq消息start
-                                        Map<String, Object> prop = new HashMap<>();
-                                        prop.put(SystemConstant.OPER, SystemConstant.INSERT);
-                                        prop.put(SystemConstant.EXAM, teExam);
-                                        MqDto mqDto = new MqDto(mqUtil.getTopic(), MqTagEnum.EXAM_ACTIVITY.name(),
-                                                JacksonUtil.parseJson(Arrays.asList(s)), MqTagEnum.EXAM_ACTIVITY,
-                                                String.valueOf(teExam.getId()), prop, tbUser.getName());
-                                        mqDtoService.assembleSendOneOrderMsg(mqDto);
-                                        //删除再新增quartz任务,发送mq消息end
-                                    }
-                                    tsLogService.save(new TSLog(LogEnum.EXAM_ACTIVITY, s.getCode(),
-                                            JacksonUtil.parseJson(teExamActivityDb),
-                                            JacksonUtil.parseJson(s),
-                                            tbUser.getId(), s.getId()));
+                                if (s.getFinishTime().longValue() < System.currentTimeMillis()) {
+                                    throw new BusinessException("修改的场次结束时间只能大于当前时间");
+                                }
+                                if (Objects.nonNull(teExam.getForceFinish()) && teExam.getForceFinish().intValue() == 1
+                                        && s.getFinishTime().longValue() != teExamActivityDb.getFinishTime().longValue()) {
+                                    //删除再新增quartz任务,发送mq消息start
+                                    Map<String, Object> prop = new HashMap<>();
+                                    prop.put(SystemConstant.OPER, SystemConstant.INSERT);
+                                    prop.put(SystemConstant.EXAM, teExam);
+                                    MqDto mqDto = new MqDto(mqUtil.getTopic(), MqTagEnum.EXAM_ACTIVITY.name(),
+                                            JacksonUtil.parseJson(Arrays.asList(s)), MqTagEnum.EXAM_ACTIVITY,
+                                            String.valueOf(teExam.getId()), prop, tbUser.getName());
+                                    mqDtoService.assembleSendOneOrderMsg(mqDto);
+                                    //删除再新增quartz任务,发送mq消息end
                                 }
                             }
                         }

+ 4 - 4
themis-task/src/main/java/com/qmth/themis/task/enums/QuartzTaskEnum.java

@@ -17,7 +17,7 @@ public enum QuartzTaskEnum {
 
     EXAM_STUDENT_JOB_GROUP_NAME("考生一次性延时job group"),
 
-    EXAM_AUDIO_JOB_GROUP_NAME("考试语音播报一次性延时job group"),
+//    EXAM_AUDIO_JOB_GROUP_NAME("考试语音播报一次性延时job group"),
 
     MQ_ACTIVITY_JOB_NAME("mq_activity_job"),
 
@@ -25,11 +25,11 @@ public enum QuartzTaskEnum {
 
     OBJECTIVE_ANSWER_CACHE_LOAD_JOB_NAME("客观题缓存加载"),
 
-    OBJECTIVE_ANSWER_CACHE_LOAD_JOB_GROUP_NAME("客观题缓存加载"),
+    OBJECTIVE_ANSWER_CACHE_LOAD_JOB_GROUP_NAME("客观题缓存加载");
 
-    REPAIR_JOB_NAME("repair_job"),
+//    REPAIR_JOB_NAME("repair_job"),
 
-    REPAIR_JOB_GROUP_NAME("repair_job group");
+//    REPAIR_JOB_GROUP_NAME("repair_job group");
 
     private QuartzTaskEnum(String code) {
         this.code = code;

+ 1 - 1
themis-task/src/main/java/com/qmth/themis/task/listener/MyJobListener.java

@@ -49,7 +49,7 @@ public class MyJobListener implements JobListener {
             case EXAM_ACTIVITY_JOB_GROUP_NAME:
             case EXAM_STUDENT_JOB_GROUP_NAME:
             case MQ_ACTIVITY_JOB_GROUP_NAME:
-            case EXAM_AUDIO_JOB_GROUP_NAME:
+//            case EXAM_AUDIO_JOB_GROUP_NAME:
                 try {
                     TSLogService tsLogService = SpringContextHolder.getBean(TSLogService.class);
                     tsLogService.save(new TSLog(LogEnum.JOB, JacksonUtil.parseJson(context.getTrigger().getJobKey()),