刘俊驰 6 mēneši atpakaļ
vecāks
revīzija
ccce26ee02

+ 134 - 35
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java

@@ -6,7 +6,9 @@ import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.utils.date.DateUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.redisson.api.RBucket;
@@ -32,6 +34,7 @@ import java.util.concurrent.TimeUnit;
 @RestController
 @RequestMapping("${app-config.url.admin:}/task")
 @ApiIgnore
+@Slf4j
 public class TaskController extends BaseController {
     @Autowired
     private UserOrderService userOrderService;
@@ -82,6 +85,7 @@ public class TaskController extends BaseController {
 
     @Autowired
     private UserMusicService userMusicService;
+
     /***
      * 轮询用户订单
      * @author liweifan
@@ -90,9 +94,17 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/pollingOrder")
     public HttpResponseResult pollingOrder() {
-        userOrderService.pollingOrder();
-        userPaymentCoreService.scanPaymentTimeoutOrderRecord();
-        userPaymentCoreService.scanRefundOrderRecord();
+
+        DistributedLock.of(redissonClient).runIfLockCanGet("pollingOrder", () -> {
+            try {
+
+                userOrderService.pollingOrder();
+                userPaymentCoreService.scanPaymentTimeoutOrderRecord();
+                userPaymentCoreService.scanRefundOrderRecord();
+            }catch (Exception e){
+                log.error("pollingOrder error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return succeed();
     }
 
@@ -104,24 +116,48 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/daysTask")
     public HttpResponseResult<Boolean> daysTask() {
-        //超过天数无琴房课的解除绑定关系
-        userBindingTeacherService.unbindTask();
-        //平台老师结算
-        platformCashAccountRecordService.updateWaitRecord();
+
+        DistributedLock.of(redissonClient).runIfLockCanGet("daysTask", () -> {
+            try {
+
+                //超过天数无琴房课的解除绑定关系
+                userBindingTeacherService.unbindTask();
+                //平台老师结算
+                platformCashAccountRecordService.updateWaitRecord();
+            }catch (Exception e){
+                log.error("daysTask error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return succeed(true);
     }
 
     // 老师作业布置
     @PostMapping(value = "/teacherSend")
     public HttpResponseResult<Object> sendTodayNotRepliedAndNotDecorateHomework() {
-        courseScheduleService.sendTodayNotRepliedAndNotDecorateHomework();
+
+        DistributedLock.of(redissonClient).runIfLockCanGet("teacherSend", () -> {
+            try {
+
+                courseScheduleService.sendTodayNotRepliedAndNotDecorateHomework();
+            }catch (Exception e){
+                log.error("teacherSend error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
     //老师课酬
     @PostMapping(value = "/teacherEarning")
     public HttpResponseResult<Object> sendTeacherEarning() {
-        userAccountRecordService.sendTeacherEarning();
+
+        DistributedLock.of(redissonClient).runIfLockCanGet("teacherEarning", () -> {
+            try {
+
+                userAccountRecordService.sendTeacherEarning();
+            }catch (Exception e){
+                log.error("teacherEarning error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
@@ -142,14 +178,30 @@ public class TaskController extends BaseController {
     //营销活动
     @PostMapping(value = "/activityState")
     public HttpResponseResult<Object> activityState() {
-        activityPlanService.activityState();
+
+        DistributedLock.of(redissonClient).runIfLockCanGet("activityState", () -> {
+            try {
+
+                activityPlanService.activityState();
+            }catch (Exception e){
+                log.error("activityState error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
     //活动中定时轮询
     @PostMapping(value = "/activityIng")
     public HttpResponseResult<Object> activityIng() {
-        activityPlanService.activityIng();
+
+        DistributedLock.of(redissonClient).runIfLockCanGet("activityIng", () -> {
+            try {
+
+                activityPlanService.activityIng();
+            }catch (Exception e){
+                log.error("activityIng error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
@@ -161,7 +213,14 @@ public class TaskController extends BaseController {
     @GetMapping("/test")
     public HttpResponseResult<Object> test(@RequestParam("activityId") Long activityId) {
 
-        activityPlanEvaluationService.successActivity(activityId);
+        DistributedLock.of(redissonClient).runIfLockCanGet("test", () -> {
+            try {
+
+                activityPlanEvaluationService.successActivity(activityId);
+            }catch (Exception e){
+                log.error("test error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
@@ -172,15 +231,21 @@ public class TaskController extends BaseController {
     @GetMapping("/virtualNumber")
     public HttpResponseResult<Object> virtualNumber() {
 
-        // 曲目
-        musicSheetService.setVirtualNumber();
-        // 专辑
-        musicAlbumService.setVirtualNumber();
-        // 视频课 暂时不做课程数据
-        // videoLessonGroupService.setVirtualNumber();
-        // 个人风采
-        teacherStyleVideoService.setVirtualNumber();
-
+        DistributedLock.of(redissonClient).runIfLockCanGet("virtualNumber", () -> {
+            try {
+
+                // 曲目
+                musicSheetService.setVirtualNumber();
+                // 专辑
+                musicAlbumService.setVirtualNumber();
+                // 视频课 暂时不做课程数据
+                // videoLessonGroupService.setVirtualNumber();
+                // 个人风采
+                teacherStyleVideoService.setVirtualNumber();
+            }catch (Exception e){
+                log.error("virtualNumber error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
@@ -189,10 +254,15 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/batchSending")
     public HttpResponseResult<Object> batchSending() {
+        DistributedLock.of(redissonClient).runIfLockCanGet("batchSending", () -> {
+            try {
 
-        // 群发消息定时
-        customerServiceBatchSendingService.scheduleSendMessage();
-
+                // 群发消息定时
+                customerServiceBatchSendingService.scheduleSendMessage();
+            }catch (Exception e){
+                log.error("batchSending error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
@@ -202,10 +272,15 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/destroyLiveRoom")
     public HttpResponseResult<Object> destroyLiveRoom() {
+        DistributedLock.of(redissonClient).runIfLockCanGet("destroyLiveRoom", () -> {
+            try {
 
-        // 群发消息定时
-        liveRoomService.destroyLiveRoom();
-
+                // 群发消息定时
+                liveRoomService.destroyLiveRoom();
+            }catch (Exception e){
+                log.error("destroyLiveRoom error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
@@ -231,10 +306,15 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/sendPlatformAuditMessage")
     public HttpResponseResult<Object> sendPlatformAuditMessage() {
+        DistributedLock.of(redissonClient).runIfLockCanGet("sendPlatformAuditMessage", () -> {
+            try {
 
-        // 群发消息定时
-        tenantUnbindRecordService.sendPlatformAuditMessage();
-
+                // 群发消息定时
+                tenantUnbindRecordService.sendPlatformAuditMessage();
+            }catch (Exception e){
+                log.error("sendPlatformAuditMessage error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
@@ -244,10 +324,15 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/sendTenantAlbumMessage")
     public HttpResponseResult<Object> sendTenantAlbumMessage() {
+        DistributedLock.of(redissonClient).runIfLockCanGet("sendTenantAlbumMessage", () -> {
+            try {
 
-        // 群发消息定时
-        userTenantAlbumRecordService.sendTenantAlbumMessage();
-
+                // 群发消息定时
+                userTenantAlbumRecordService.sendTenantAlbumMessage();
+            }catch (Exception e){
+                log.error("sendTenantAlbumMessage error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
@@ -257,12 +342,26 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/workOverdue")
     public void workOverdue(){
-        userMusicService.workOverdue();
+        DistributedLock.of(redissonClient).runIfLockCanGet("workOverdue", () -> {
+            try {
+
+                userMusicService.workOverdue();
+            }catch (Exception e){
+                log.error("workOverdue error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
     }
 
     //课程开始前一20分组提醒
     @GetMapping("/courseStartRemind")
     public void courseStartRemind(){
-        courseScheduleService.courseStartRemind();
+        DistributedLock.of(redissonClient).runIfLockCanGet("courseStartRemind", () -> {
+            try {
+
+                courseScheduleService.courseStartRemind();
+            }catch (Exception e){
+                log.error("courseStartRemind error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
     }
 }

+ 37 - 5
cooleshow-app/src/main/java/com/yonge/cooleshow/student/task/TaskController.java

@@ -4,6 +4,9 @@ import com.yonge.cooleshow.biz.dal.entity.StudentTotal;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.payment.util.DistributedLock;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -12,6 +15,7 @@ import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @Author: liweifan
@@ -20,6 +24,7 @@ import java.util.List;
 @RestController
 @RequestMapping("${app-config.url.student:}/task")
 @ApiIgnore
+@Slf4j
 public class TaskController extends BaseController {
     @Resource
     private StudentTotalService studentTotalService;
@@ -31,6 +36,10 @@ public class TaskController extends BaseController {
     private DiscountCardRecordService discountCardRecordService;
     @Resource
     private CourseRepliedService repliedService;
+
+
+    @Autowired
+    private RedissonClient redissonClient;
     /***
      * 查询所有学生统计数据
      * @author liweifan
@@ -51,9 +60,16 @@ public class TaskController extends BaseController {
     @GetMapping("/halfHourTask")
     public HttpResponseResult<Boolean> halfHourTask() {
         //会员卡到期提醒
-        vipCardRecordService.pollExpireMsg();
-        //畅学卡到期提醒
-        discountCardRecordService.pollExpireMsg();
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("halfHourTask", () -> {
+            try {
+                vipCardRecordService.pollExpireMsg();
+                //畅学卡到期提醒
+                discountCardRecordService.pollExpireMsg();
+            }catch (Exception e){
+                log.error("halfHourTask error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return succeed(true);
     }
 
@@ -67,7 +83,15 @@ public class TaskController extends BaseController {
     @GetMapping("/studentFirstBuy")
     public HttpResponseResult<Boolean> studentFirstBuy() {
         //统计学员第一次购买时间
-        studentTimeService.totalStudentTime();
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("studentFirstBuy", () -> {
+            try {
+
+                studentTimeService.totalStudentTime();
+            }catch (Exception e){
+                log.error("studentFirstBuy error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return succeed(true);
     }
 
@@ -78,7 +102,15 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/noRepliedTeacher")
     public HttpResponseResult noRepliedTeacher() {
-        repliedService.noRepliedTeacher();
+
+        DistributedLock.of(redissonClient).runIfLockCanGet("noRepliedTeacher", () -> {
+            try {
+
+                repliedService.noRepliedTeacher();
+            }catch (Exception e){
+                log.error("noRepliedTeacher error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return succeed();
     }
 }

+ 95 - 8
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/task/TaskController.java

@@ -4,7 +4,10 @@ import com.yonge.cooleshow.biz.dal.entity.TeacherTotal;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.payment.util.DistributedLock;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -12,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @Author: liweifan
@@ -20,6 +24,7 @@ import java.util.List;
 @RestController
 @RequestMapping("${app-config.url.teacher:}/task")
 @ApiIgnore
+@Slf4j
 public class TaskController extends BaseController {
     @Autowired
     private TeacherTotalService teacherTotalService;
@@ -33,6 +38,8 @@ public class TaskController extends BaseController {
     @Autowired
     private DivBackRecordService divBackRecordService;
 
+    @Autowired
+    private RedissonClient redissonClient;
     /***
      * 查询所有老师统计数据
      * @author liweifan
@@ -41,7 +48,19 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/queryTeacherTotal")
     public HttpResponseResult<List<TeacherTotal>> queryTeacherTotal() {
-        return succeed(teacherTotalService.queryTeacherTotal());
+
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("queryTeacherTotal", () -> {
+            try {
+
+                 succeed(teacherTotalService.queryTeacherTotal());
+            }catch (Exception e){
+                log.error("queryTeacherTotal error", e);
+            }
+
+
+        }, 10L, TimeUnit.SECONDS);
+        return succeed();
     }
 
     /**
@@ -50,20 +69,52 @@ public class TaskController extends BaseController {
      */
     @GetMapping("/opsCourseGroup")
     public HttpResponseResult<Object> opsCourseGroup() {
-        courseGroupService.opsCourseGroup();
+
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("opsCourseGroup", () -> {
+            try {
+
+                courseGroupService.opsCourseGroup();
+            }catch (Exception e){
+                log.error("opsCourseGroup error", e);
+            }
+
+
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
     @ApiOperation("定时任务-销毁房间-直播间")
     @GetMapping("/destroyExpiredLiveRoom")
     public void destroyExpiredLiveRoom() {
-        liveRoomService.destroyExpiredLiveRoom();
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("destroyExpiredLiveRoom", () -> {
+            try {
+
+                liveRoomService.destroyExpiredLiveRoom();
+            }catch (Exception e){
+                log.error("destroyExpiredLiveRoom error", e);
+            }
+
+
+        }, 10L, TimeUnit.SECONDS);
     }
 
     @ApiOperation("定时任务-创建房间-直播间")
     @GetMapping("/createCourseLiveRoom")
     public void createCourseLiveRoom() {
-        liveRoomService.createCourseLiveRoom();
+
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("createCourseLiveRoom", () -> {
+            try {
+
+                liveRoomService.createCourseLiveRoom();
+            }catch (Exception e){
+                log.error("createCourseLiveRoom error", e);
+            }
+
+
+        }, 10L, TimeUnit.SECONDS);
     }
 
     @GetMapping("/getRedisValueByKey")
@@ -73,26 +124,62 @@ public class TaskController extends BaseController {
 
     @GetMapping("/courseRemind")
     public HttpResponseResult<Object> courseRemind() {
-        scheduleService.courseRemind();
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("courseRemind", () -> {
+            try {
+
+                scheduleService.courseRemind();
+            }catch (Exception e){
+                log.error("courseRemind error", e);
+            }
+
+
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
     @GetMapping("/courseStatus")
     public HttpResponseResult<Object> courseStatus() {
-        scheduleService.scheduleTask();
+
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("courseStatus", () -> {
+            try {
+
+                scheduleService.scheduleTask();
+            }catch (Exception e){
+                log.error("courseStatus error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
     @GetMapping("/teacherSalary")
     public HttpResponseResult<Object> teacherSalary() {
-        scheduleService.teacherSalaryTask();
+
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("teacherSalary", () -> {
+            try {
+
+                scheduleService.teacherSalaryTask();
+            }catch (Exception e){
+                log.error("teacherSalary error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 
 
     @GetMapping("/divBack")
     public HttpResponseResult<Object> divBack() {
-        divBackRecordService.divBack();
+        // 并发执行锁
+        DistributedLock.of(redissonClient).runIfLockCanGet("divBack", () -> {
+            try {
+
+                divBackRecordService.divBack();
+            }catch (Exception e){
+                log.error("divBack error", e);
+            }
+        }, 10L, TimeUnit.SECONDS);
         return HttpResponseResult.succeed();
     }
 }

+ 20 - 12
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseHomeworkServiceImpl.java

@@ -40,6 +40,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
+import javax.annotation.Resource;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -49,29 +50,29 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
 
     private static final Logger log = LoggerFactory.getLogger(CourseHomeworkServiceImpl.class);
 
-    @Autowired
+    @Resource
     @Lazy
     private CourseScheduleService courseScheduleService;
 
-    @Autowired
+    @Resource
     private StudentCourseHomeworkService studentCourseHomeworkService;
 
-    @Autowired
+    @Resource
     private SysMessageService sysMessageService;
 
-    @Autowired
+    @Resource
     private SysUserFeignService sysUserFeignService;
 
-    @Autowired
+    @Resource
     private ImGroupService imGroupService;
 
-    @Autowired
+    @Resource
     private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
 
-    @Autowired
+    @Resource
     private SysConfigService sysConfigService;
 
-    @Autowired
+    @Resource
     private WordFilter wordFilter;
 
 	@Override
@@ -242,17 +243,24 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
     @Transactional(rollbackFor = Exception.class)
     public boolean decorateCourseHomework(CourseHomeworkSaveDto saveDto) {
         // 检查 老师 趣纠课 课程状态为完成,有学生考勤记录 没有布置作业
-        checkCourseSchedule(saveDto.getCourseScheduleId());
-
+        CourseSchedule courseSchedule = courseScheduleService.getById(saveDto.getCourseScheduleId());
+        // 2. 检查课程结束
+        if (!CourseScheduleEnum.COMPLETE.getCode().equals(courseSchedule.getStatus())) {
+            throw  new BizException("课程未正常完成,不能布置课后作业");
+        }
         // 检查已经布置了课后作业
         CourseHomework homework = checkHasHomework(saveDto.getCourseScheduleId());
         if (homework != null) {
             saveDto.setCourseHomeworkId(homework.getId());
         }
-
-        CourseSchedule courseSchedule = courseScheduleService.getById(saveDto.getCourseScheduleId());
         // 创建课后作业
         CourseHomework courseHomework = getCourseHomework(saveDto, courseSchedule);
+        //获取学生人数
+        List<CourseScheduleStudentPayment> studentPaymentList = courseScheduleStudentPaymentService.getByCourseId(
+                courseSchedule.getId());
+        if (!CollectionUtils.isEmpty(studentPaymentList)) {
+            courseHomework.setExpectNum(studentPaymentList.size());
+        }
 
         boolean flag = this.saveOrUpdate(courseHomework);