Przeglądaj źródła

Merge branch 'feature/1219_opt' of http://git.dayaedu.com/yonge/cooleshow into feature/1219_opt

刘俊驰 6 miesięcy temu
rodzic
commit
1f5d9ccd22
16 zmienionych plików z 414 dodań i 100 usunięć
  1. 134 35
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java
  2. 7 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/CourseHomeworkController.java
  3. 38 6
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/task/TaskController.java
  4. 6 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/CourseHomeworkController.java
  5. 1 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseScheduleController.java
  6. 30 9
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherHomeController.java
  7. 95 8
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/task/TaskController.java
  8. 3 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/website/controller/WebCourseScheduleController.java
  9. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  10. 20 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseHomeworkServiceImpl.java
  11. 0 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/HomeServiceImpl.java
  12. 15 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountRecordServiceImpl.java
  13. 59 25
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java
  14. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  15. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TeacherIndexWrapper.java
  16. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml

+ 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);
     }
 }

+ 7 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/CourseHomeworkController.java

@@ -22,6 +22,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 
@@ -95,6 +96,12 @@ public class CourseHomeworkController extends BaseController {
         query.setStudentId(sysUserService.getUserId());
         query.setClientType("STUDENT");
         query.setCourseStatus(CourseScheduleEnum.COMPLETE);
+        List<CourseScheduleEnum> list = new ArrayList<>();
+        list.add(CourseScheduleEnum.PIANO_ROOM_CLASS);
+        list.add(CourseScheduleEnum.PRACTICE);
+        list.add(CourseScheduleEnum.VIP);
+        list.add(CourseScheduleEnum.GROUP);
+        query.setCourseType(list);
 
         IPage<CourseHomeworkVo> page = courseHomeworkService.selectPage(PageUtil.getPage(query), query);
         List<CourseHomeworkVo> records = page.getRecords();

+ 38 - 6
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
@@ -50,10 +59,17 @@ 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();
     }
 }

+ 6 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/CourseHomeworkController.java

@@ -142,6 +142,12 @@ public class CourseHomeworkController extends BaseController {
         query.setTeacherId(sysUserService.getUserId());
         query.setCourseStatus(CourseScheduleEnum.COMPLETE);
         query.setClientType("TEACHER");
+        List<CourseScheduleEnum> list = new ArrayList<>();
+        list.add(CourseScheduleEnum.PIANO_ROOM_CLASS);
+        list.add(CourseScheduleEnum.PRACTICE);
+        list.add(CourseScheduleEnum.VIP);
+        list.add(CourseScheduleEnum.GROUP);
+        query.setCourseType(list);
 
         IPage<CourseHomeworkVo> page = courseHomeworkService.selectPage(PageUtil.getPage(query), query);
         if (CollectionUtils.isNotEmpty(page.getRecords())) {

+ 1 - 1
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseScheduleController.java

@@ -105,7 +105,7 @@ public class TeacherCourseScheduleController extends BaseController {
     public HttpResponseResult<PageInfo<MyCourseVo>> queryTeacherPracticeCourse(@RequestBody MyCourseSearch search) {
         search.setTeacherId(sysUserService.getUserId());
         if(StringUtils.isEmpty(search.getCourseType())){
-            search.setCourseType("VIP,PRACTICE,GROUP");
+            search.setCourseType("VIP,PRACTICE");
         }
         IPage<MyCourseVo> pages = courseScheduleService.queryTeacherPracticeCourse(PageUtil.getPage(search), search);
         return succeed(PageUtil.pageInfo(pages));

+ 30 - 9
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherHomeController.java

@@ -1,28 +1,33 @@
 package com.yonge.cooleshow.teacher.controller;
 
+import com.alibaba.excel.EasyExcel;
 import com.alibaba.fastjson.JSON;
-import com.yonge.cooleshow.biz.dal.dto.excel.UserWithdrawalExport;
-import com.yonge.cooleshow.biz.dal.dto.search.TeacherWithdrawalSearch;
+import com.microsvc.toolkit.middleware.oss.OssPluginContext;
+import com.microsvc.toolkit.middleware.oss.impl.TencentOssPlugin;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.PianoRoomTimeVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherHomeStatisticalVo;
-import com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo;
 import com.yonge.cooleshow.biz.dal.wrapper.TeacherIndexWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherHomeWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
+import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.easyexcel.ExcelUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.BeanUtils;
-import org.springframework.security.access.prepost.PreAuthorize;
+import lombok.Data;
+import org.apache.commons.io.FileUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.io.File;
 import java.math.BigDecimal;
-import java.util.ArrayList;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -48,6 +53,8 @@ public class TeacherHomeController extends BaseController {
     private UserAccountRecordService userAccountRecordService;
     @Resource
     private HomeService homeService;
+    @Resource
+    private OssPluginContext ossPluginContext;
 
     @ApiOperation(value = "首页统计数据")
     @GetMapping(value="/count")
@@ -148,14 +155,28 @@ public class TeacherHomeController extends BaseController {
 
     @PostMapping("/exportStudentPractice")
     @ApiOperation(value = "查询导出首页练习数据学员列表")
-    public void exportExcel(@RequestBody TeacherIndexWrapper.StudentSearch studentSearch) {
+    public HttpResponseResult<String> exportExcel(@RequestBody TeacherIndexWrapper.StudentSearch studentSearch) {
         studentSearch.setTeacherId(sysUserService.getUserId());
         studentSearch.setLimit(10000);
         List<TeacherIndexWrapper.StudentPracticeSummaryDto> teacherHomeStudent = homeService.getTeacherHomeStudent(studentSearch);
         List<TeacherIndexWrapper.StudentPracticeSummaryExportDto> list =
                 JSON.parseArray(JSON.toJSONString(teacherHomeStudent), TeacherIndexWrapper.StudentPracticeSummaryExportDto.class);
-        ExcelUtils.exportExcel(list, "学员练习统计" + System.currentTimeMillis(),
-                "列表数据");
+        DateFormat dateFormat1 = new SimpleDateFormat("yyMMddHHmmss");
+        Date date = new Date();
+        String filePath = "/tmp/klx/studentPractice/" + dateFormat1.format(date) + "/"  + studentSearch.getTeacherId() + "_" + System.currentTimeMillis() + ".xlsx";
+        File srcFile = new File(filePath);
+        File directory = new File(filePath).getParentFile();
+        if (!directory.exists()) {
+            directory.mkdirs(); // 创建目录
+        }
+        EasyExcel.write(filePath,TeacherIndexWrapper.StudentPracticeSummaryExportDto.class).sheet("学员练习统计").doWrite(list);
+        //上传到oss
+        DateFormat dateFormatOss = new SimpleDateFormat("yyyy/MM/dd");
+        String dateStrOss = dateFormatOss.format(date);
+        dateStrOss = "klx/studentPractice/" + dateStrOss + "/" + DateUtil.getHour(date);
+        String excelFilePath = ossPluginContext.getPluginService(TencentOssPlugin.PLUGIN_NAME).uploadFile(dateStrOss, srcFile);
+        FileUtils.deleteQuietly(srcFile);
+        return HttpResponseResult.succeed(excelFilePath);
     }
 
 }

+ 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();
     }
 }

+ 3 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/website/controller/WebCourseScheduleController.java

@@ -116,6 +116,9 @@ public class WebCourseScheduleController extends BaseController {
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
+        if(StringUtils.isEmpty(search.getCourseType())){
+            search.setCourseType("VIP,PRACTICE");
+        }
         search.setTeacherId(user.getId());
         IPage<MyCourseVo> pages = courseScheduleService.queryTeacherPracticeCourse(PageUtil.getPage(search), search);
         return succeed(PageUtil.pageInfo(pages));

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java

@@ -589,7 +589,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                         vo.setSubjectName(subjectList.stream().map(Subject::getName).collect(Collectors.joining(",")));
                     }
                 }
-                vo.setImUserId(imGroupService.getImUserId(String.valueOf(e),
+                vo.setImUserId(imGroupService.getImUserId(String.valueOf(e.getUserId()),
                         ClientEnum.STUDENT.name()));
                 result.add(vo);
             });

+ 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);
 

+ 0 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/HomeServiceImpl.java

@@ -49,8 +49,6 @@ public class HomeServiceImpl implements HomeService {
     @Resource
     private CourseScheduleService courseScheduleService;
     @Resource
-    private CourseGroupService courseGroupService;
-    @Resource
     private MusicSheetService musicSheetService;
     @Resource
     private UserAccountRecordDao userAccountRecordDao;

+ 15 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountRecordServiceImpl.java

@@ -210,6 +210,21 @@ public class UserAccountRecordServiceImpl extends ServiceImpl<UserAccountRecordD
                 bizIds.add(userOrderDetailVo.getBizId());
             }
             records.addAll(baseMapper.selectRecordByOrderDetail(userOrderDetailVo.getOrderNo(),AccountBizTypeEnum.LIVE, bizIds));
+        }else if(GoodTypeEnum.GROUP.equals(userOrderDetailVo.getGoodType())){
+
+            List<Long> groupId = Arrays.asList(userOrderDetailVo.getBizId());
+            records.addAll(baseMapper.selectRecordByOrderDetail(userOrderDetailVo.getOrderNo(), AccountBizTypeEnum.GROUP_SHARE, groupId));
+
+            if (userOrderDetailVo.getPaymentVersion().equals(EPaymentVersion.V1)  || !tenantFlag) {
+                //查询课程组下所有课程id
+                List<CourseSchedule> cancel = courseScheduleService.list(Wrappers.<CourseSchedule>lambdaQuery()
+                        .eq(CourseSchedule::getCourseGroupId, userOrderDetailVo.getBizId())
+                );
+                cancel.stream().forEach(o -> bizIds.add(o.getId()));
+            } else {
+                bizIds.add(userOrderDetailVo.getBizId());
+            }
+            records.addAll(baseMapper.selectRecordByOrderDetail(userOrderDetailVo.getOrderNo(),AccountBizTypeEnum.GROUP, bizIds));
         }
         return records;
     }

+ 59 - 25
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserAccountServiceImpl.java

@@ -341,81 +341,115 @@ public class UserAccountServiceImpl extends ServiceImpl<UserAccountDao, UserAcco
         if (total.getTotalInAmount().doubleValue() > 0) {
             total.setPracticeAmount(practiceAmount);
             total.setPracticeRate(total.getPracticeAmount()
-                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.DOWN)
                     .multiply(new BigDecimal("100")));
 
             total.setVipCourseAmount(vipCourseAmount);
             total.setVipCourseRate(total.getVipCourseAmount()
-                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.DOWN)
                     .multiply(new BigDecimal("100")));
 
             total.setLiveAmount(liveAmount);
             total.setLiveRate(total.getLiveAmount()
-                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.DOWN)
                     .multiply(new BigDecimal("100")));
 
 
             total.setGroupAmount(groupAmount);
             total.setGroupRate(total.getGroupAmount()
-                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.DOWN)
                     .multiply(new BigDecimal("100")));
 
             total.setVideoAmount(videoAmount);
             total.setVideoRate(total.getVideoAmount()
-                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.DOWN)
                     .multiply(new BigDecimal("100")));
 
             total.setMusicAmount(musicAmount);
             total.setMusicRate(total.getMusicAmount()
-                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.DOWN)
                     .multiply(new BigDecimal("100")));
 
             total.setLiveShareAmount(liveShareAmount);
             total.setLiveShareRate(total.getLiveShareAmount()
-                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.DOWN)
                     .multiply(new BigDecimal("100")));
 
             total.setVideoShareAmount(videoShareAmount);
             total.setVideoShareRate(total.getVideoShareAmount()
-                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.DOWN)
                     .multiply(new BigDecimal("100")));
 
             total.setMusicShareAmount(musicShareAmount);
             total.setMusicShareRate(total.getMusicShareAmount()
-                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.DOWN)
                     .multiply(new BigDecimal("100")));
 
             total.setAlbumShareAmount(albumShareAmount);
             total.setAlbumShareRate(total.getAlbumShareAmount()
-                                         .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                                         .divide(total.getTotalInAmount(), 4, RoundingMode.DOWN)
                                          .multiply(new BigDecimal("100")));
 
             total.setVipShareAmount(vipShareAmount);
             total.setVipShareRate(total.getVipShareAmount()
-                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.DOWN)
                     .multiply(new BigDecimal("100")));
 
             total.setMallShareAmount(mallShareAmount);
             total.setMallShareRate(total.getMallShareAmount()
-                    .divide(total.getTotalInAmount(), 4, RoundingMode.HALF_UP)
+                    .divide(total.getTotalInAmount(), 4, RoundingMode.DOWN)
                     .multiply(new BigDecimal("100")));
 
             total.setActiRegistShareAmount(actiRegistShareAmount);
             total.setActiRegistShareRate(
-                    BigDecimal.valueOf(100)
-                            .subtract(total.getPracticeRate())
-                            .subtract(total.getVipCourseRate())
-                            .subtract(total.getLiveRate())
-                            .subtract(total.getGroupRate())
-                            .subtract(total.getVideoRate())
-                            .subtract(total.getMusicRate())
-                            .subtract(total.getMusicShareRate())
-                            .subtract(total.getLiveShareRate())
-                            .subtract(total.getVideoShareRate())
-                            .subtract(total.getAlbumShareRate())
-                            .subtract(total.getVipShareRate())
-                            .subtract(total.getMallShareRate())
+                    total.getActiRegistShareAmount()
+                            .divide(total.getTotalInAmount(), 4, RoundingMode.DOWN)
+                            .multiply(new BigDecimal("100"))
             );
+
+            BigDecimal subtract = BigDecimal.valueOf(100)
+                    .subtract(total.getPracticeRate())
+                    .subtract(total.getVipCourseRate())
+                    .subtract(total.getLiveRate())
+                    .subtract(total.getGroupRate())
+                    .subtract(total.getVideoRate())
+                    .subtract(total.getMusicRate())
+                    .subtract(total.getMusicShareRate())
+                    .subtract(total.getLiveShareRate())
+                    .subtract(total.getVideoShareRate())
+                    .subtract(total.getAlbumShareRate())
+                    .subtract(total.getVipShareRate())
+                    .subtract(total.getMallShareRate())
+                    .subtract(total.getActiRegistShareAmount());
+            if (subtract.compareTo(BigDecimal.ZERO) > 0) {
+                if (total.getVipCourseAmount().compareTo(BigDecimal.ZERO) >0) {
+                    total.setVipCourseRate(total.getVipCourseRate().add(subtract));
+                } else if (total.getPracticeAmount().compareTo(BigDecimal.ZERO) >0) {
+                    total.setPracticeRate(total.getPracticeRate().add(subtract));
+                } else if (total.getLiveAmount().compareTo(BigDecimal.ZERO) >0) {
+                    total.setLiveRate(total.getLiveRate().add(subtract));
+                } else if (total.getGroupAmount().compareTo(BigDecimal.ZERO) >0) {
+                    total.setGroupRate(total.getGroupRate().add(subtract));
+                } else if (total.getVideoAmount().compareTo(BigDecimal.ZERO) >0) {
+                    total.setVideoRate(total.getVideoRate().add(subtract));
+                } else if (total.getMusicAmount().compareTo(BigDecimal.ZERO) >0) {
+                    total.setMusicRate(total.getMusicRate().add(subtract));
+                } else if (total.getMusicShareAmount().compareTo(BigDecimal.ZERO) >0) {
+                    total.setMusicShareRate(total.getMusicShareRate().add(subtract));
+                } else if (total.getLiveShareAmount().compareTo(BigDecimal.ZERO) >0) {
+                    total.setLiveShareRate(total.getLiveShareRate().add(subtract));
+                } else if (total.getVideoShareAmount().compareTo(BigDecimal.ZERO) >0) {
+                    total.setVideoShareRate(total.getVideoShareRate().add(subtract));
+                } else if (total.getAlbumShareAmount().compareTo(BigDecimal.ZERO) >0) {
+                    total.setAlbumShareRate(total.getAlbumShareRate().add(subtract));
+                } else if (total.getVipShareAmount().compareTo(BigDecimal.ZERO) >0) {
+                    total.setVipShareRate(total.getVipShareRate().add(subtract));
+                } else if (total.getMallShareAmount().compareTo(BigDecimal.ZERO) >0) {
+                    total.setMallShareRate(total.getMallShareRate().add(subtract));
+                } else if (total.getActiRegistShareAmount().compareTo(BigDecimal.ZERO) >0) {
+                    total.setActiRegistShareRate(total.getActiRegistShareRate().add(subtract));
+                }
+            }
         }
         total.setInfoList(infoList);
         return HttpResponseResult.succeed(total);

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java

@@ -97,6 +97,7 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
     private void init() {
         /**********退费单生成前******************/
         refundSuccess.put(GoodTypeEnum.LIVE, courseGroupService::refundSuccess);
+        refundSuccess.put(GoodTypeEnum.GROUP, courseGroupService::refundSuccess);
     }
 
     @Override

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TeacherIndexWrapper.java

@@ -109,6 +109,9 @@ public class TeacherIndexWrapper {
     @AllArgsConstructor
     public static class StudentPracticeSummaryDto{
 
+        @ApiModelProperty("学员编号")
+        private Long userId;
+
         @ApiModelProperty("学员姓名")
         private String studentName;
 

+ 1 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml

@@ -635,7 +635,7 @@
 	</select>
 	<select id="getStudentTrainOverViewList"
 			resultType="com.yonge.cooleshow.biz.dal.wrapper.TeacherIndexWrapper$StudentPracticeSummaryDto">
-		select su.username_ studentName,su.avatar_ avatar,sb.name_ subjectName,SUM(smcr.play_time_) totalPracticeTime,
+		select smcr.user_id_ userId,su.username_ studentName,su.avatar_ avatar,sb.name_ subjectName,SUM(smcr.play_time_) totalPracticeTime,
 		       COUNT(DISTINCT DATE_FORMAT(smcr.create_time_, '%Y-%m-%d')) practiceDays,
 		       SUM(smcr.play_time_) / COUNT(DISTINCT DATE_FORMAT(smcr.create_time_, '%Y-%m-%d')) averagePracticeTime
 		from sys_music_compare_record smcr