Sfoglia il codice sorgente

Merge branch 'master' of http://git.dayaedu.com/yonge/cooleshow

yonge 3 anni fa
parent
commit
d9710b65d5
75 ha cambiato i file con 1797 aggiunte e 419 eliminazioni
  1. 7 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/TeacherFeignService.java
  2. 5 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/TeacherFeignServiceFallback.java
  3. 9 1
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java
  4. 2 2
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java
  5. 1 1
      cooleshow-cms/src/main/resources/config/mybatis/HelpCenterContentMapper.xml
  6. 50 4
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderReturnApplyController.java
  7. 24 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/OmsOrderReturnApplyDao.java
  8. 24 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/OmsOrderReturnApplyResult.java
  9. 72 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/OmsReturnApplyQueryParam.java
  10. 17 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsOrderReturnReasonService.java
  11. 15 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderReturnApplyService.java
  12. 32 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsOrderReturnReasonServiceimpl.java
  13. 33 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderReturnApplyServiceImpl.java
  14. 8 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UmsMemberReceiveAddressServiceImpl.java
  15. 59 0
      cooleshow-mall/mall-portal/src/main/resources/config/mybatis/OmsOrderReturnApplyDao.xml
  16. 21 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/CourseRemindTask.java
  17. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java
  18. 6 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  19. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicAlbumDao.java
  20. 20 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherAttendanceDao.java
  21. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDao.java
  22. 14 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderPayReq.java
  23. 2 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderSearch.java
  24. 21 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentMusicSheetSearch.java
  25. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/RoomInfoCache.java
  26. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/StudentAttendance.java
  27. 132 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TeacherAttendance.java
  28. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderPayment.java
  29. 6 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  30. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/PayChannelEnum.java
  31. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  32. 7 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleStudentPaymentService.java
  33. 17 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherAttendanceService.java
  34. 42 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderPaymentService.java
  35. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderService.java
  36. 136 39
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  37. 32 25
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseRepliedServiceImpl.java
  38. 140 62
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  39. 13 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  40. 137 21
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java
  41. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  42. 4 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicAlbumServiceImpl.java
  43. 28 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherAttendanceServiceImpl.java
  44. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  45. 99 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java
  46. 65 154
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  47. 21 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonGroupDetailServiceImpl.java
  48. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonGroupServiceImpl.java
  49. 40 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java
  50. 37 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/AlbumAndSheetVo.java
  51. 23 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/AlbumDetailVo.java
  52. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CountVo.java
  53. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupVo.java
  54. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/LiveCourseInfoVo.java
  55. 20 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentHomePage.java
  56. 5 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml
  57. 45 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  58. 10 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  59. 1 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MemberPriceSettingsMapper.xml
  60. 12 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicAlbumMapper.xml
  61. 33 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml
  62. 44 26
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml
  63. 2 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml
  64. 7 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupMapper.xml
  65. 4 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VipCardRecordMapper.xml
  66. 37 3
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java
  67. 5 4
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/PaymentController.java
  68. 0 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentCourseGroupController.java
  69. 1 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentCourseScheduleController.java
  70. 1 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  71. 29 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherAttendanceController.java
  72. 0 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseGroupController.java
  73. 12 4
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseScheduleController.java
  74. 3 2
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/VideoLessonGroupController.java
  75. 9 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/task/TaskController.java

+ 7 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/TeacherFeignService.java

@@ -25,4 +25,11 @@ public interface TeacherFeignService {
     @GetMapping(value = "/task/opsCourseGroup")
     HttpResponseResult<Object> opsCourseGroup();
 
+    /**
+     * @Description: 课程提醒(每晚9点)
+     * @Author: cy
+     * @Date: 2022/5/6
+     */
+    @GetMapping("/task/courseRemind")
+    HttpResponseResult<Object> courseRemind();
 }

+ 5 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/TeacherFeignServiceFallback.java

@@ -16,4 +16,9 @@ public class TeacherFeignServiceFallback implements TeacherFeignService {
     public HttpResponseResult<Object> opsCourseGroup() {
         return null;
     }
+
+    @Override
+    public HttpResponseResult<Object> courseRemind() {
+        return null;
+    }
 }

+ 9 - 1
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java

@@ -101,7 +101,7 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
         SysUser user = get(id);
 
         if (user == null) {
-            throw new BizException("户不存在");
+            throw new BizException("户不存在");
         }
 
         user.setUpdateTime(new Date());
@@ -158,11 +158,19 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
             sysUserDao.saveTeacher(sysUser.getId());
             //创建老师账户
             sysUserDao.createUserAccount(sysUser.getId());
+
+            //用户默认昵称
+            sysUser.setUsername("游客"+sysUser.getId());
+            sysUserDao.update(sysUser);
             return queryUserInfoByPhone(phone);
         } else if (StringUtils.equalsIgnoreCase(clientId, "STUDENT")) {
             sysUser.setUserType("STUDENT");
             sysUserDao.insert(sysUser);
             saveStudent(sysUser);
+
+            //用户默认昵称
+            sysUser.setUsername("游客"+sysUser.getId());
+            sysUserDao.update(sysUser);
             return queryUserInfoByPhone(phone);
         }
         return null;

+ 2 - 2
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java

@@ -564,8 +564,8 @@ public class UserController extends BaseController {
         if (user == null || null == user.getId()) {
             return failed("用户不存在");
         }
-        user.setWechatId(
-                StringUtil.isEmpty(param.getWechatId()) ? user.getWxOpenid() : param.getWechatId()
+        user.setWxOpenid(
+                StringUtil.isEmpty(param.getWxOpenid()) ? user.getWxOpenid() : param.getWxOpenid()
         );
         user.setQqOpenid(
                 StringUtil.isEmpty(param.getQqOpenid()) ? user.getQqOpenid() : param.getQqOpenid()

+ 1 - 1
cooleshow-cms/src/main/resources/config/mybatis/HelpCenterContentMapper.xml

@@ -72,7 +72,7 @@
 		left join help_center_catalog catalog on content.catalog_id_=catalog.id_
 		left join sys_user su on content.update_by_ = su.id_
 		<include refid="queryConditionUnion" />
-		order by content.order_ asc
+		order by content.order_ asc,content.id_ desc
 		<include refid="global.limit" />
 	</select>
 

+ 50 - 4
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderReturnApplyController.java

@@ -1,16 +1,21 @@
 package com.yonge.cooleshow.portal.controller;
 
+import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
+import com.yonge.cooleshow.mbg.model.OmsOrderReturnApply;
+import com.yonge.cooleshow.mbg.model.OmsOrderReturnReason;
 import com.yonge.cooleshow.portal.domain.OmsOrderReturnApplyParam;
+import com.yonge.cooleshow.portal.dto.OmsOrderReturnApplyResult;
+import com.yonge.cooleshow.portal.dto.OmsReturnApplyQueryParam;
+import com.yonge.cooleshow.portal.service.OmsOrderReturnReasonService;
 import com.yonge.cooleshow.portal.service.OmsPortalOrderReturnApplyService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
 
 /**
  * 退货申请管理Controller
@@ -23,6 +28,9 @@ public class OmsPortalOrderReturnApplyController {
     @Autowired
     private OmsPortalOrderReturnApplyService returnApplyService;
 
+    @Autowired
+    private OmsOrderReturnReasonService orderReturnReasonService;
+
     @ApiOperation("申请退货")
     @RequestMapping(value = "/create", method = RequestMethod.POST)
     @ResponseBody
@@ -33,4 +41,42 @@ public class OmsPortalOrderReturnApplyController {
         }
         return CommonResult.failed();
     }
+
+    @ApiOperation("分页查询退货原因")
+    @RequestMapping(value = "/reason/list", method = RequestMethod.GET)
+    @ResponseBody
+    public CommonResult<CommonPage<OmsOrderReturnReason>> list(@RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
+                                                               @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum) {
+        List<OmsOrderReturnReason> reasonList = orderReturnReasonService.list(pageSize, pageNum);
+        return CommonResult.success(CommonPage.restPage(reasonList));
+    }
+
+    @ApiOperation("分页查询退货申请")
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    @ResponseBody
+    public CommonResult<CommonPage<OmsOrderReturnApply>> list(OmsReturnApplyQueryParam queryParam,
+                                                              @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
+                                                              @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum) {
+        List<OmsOrderReturnApply> returnApplyList = returnApplyService.list(queryParam, pageSize, pageNum);
+        return CommonResult.success(CommonPage.restPage(returnApplyList));
+    }
+
+    @ApiOperation("撤销申请")
+    @RequestMapping(value = "/delete/{id}", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult delete(@PathVariable Long id) {
+        int count = returnApplyService.delete(id);
+        if (count > 0) {
+            return CommonResult.success(count);
+        }
+        return CommonResult.failed();
+    }
+
+    @ApiOperation("获取退货申请详情")
+    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+    @ResponseBody
+    public CommonResult getItem(@PathVariable Long id) {
+        OmsOrderReturnApplyResult result = returnApplyService.getItem(id);
+        return CommonResult.success(result);
+    }
 }

+ 24 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/OmsOrderReturnApplyDao.java

@@ -0,0 +1,24 @@
+package com.yonge.cooleshow.portal.dao;
+
+import com.yonge.cooleshow.mbg.model.OmsOrderReturnApply;
+import com.yonge.cooleshow.portal.dto.OmsOrderReturnApplyResult;
+import com.yonge.cooleshow.portal.dto.OmsReturnApplyQueryParam;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 订单退货申请自定义Dao
+ * Created by macro on 2018/10/18.
+ */
+public interface OmsOrderReturnApplyDao {
+    /**
+     * 查询申请列表
+     */
+    List<OmsOrderReturnApply> getList(@Param("queryParam") OmsReturnApplyQueryParam queryParam);
+
+    /**
+     * 获取申请详情
+     */
+    OmsOrderReturnApplyResult getDetail(@Param("id")Long id);
+}

+ 24 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/OmsOrderReturnApplyResult.java

@@ -0,0 +1,24 @@
+package com.yonge.cooleshow.portal.dto;
+
+import com.yonge.cooleshow.mbg.model.OmsCompanyAddress;
+import com.yonge.cooleshow.mbg.model.OmsOrderReturnApply;
+import io.swagger.annotations.ApiModelProperty;
+
+
+/**
+ * 申请信息封装
+ * Created by macro on 2018/10/18.
+ */
+public class OmsOrderReturnApplyResult extends OmsOrderReturnApply {
+
+    @ApiModelProperty(value = "公司收货地址")
+    private OmsCompanyAddress companyAddress;
+
+    public OmsCompanyAddress getCompanyAddress() {
+        return companyAddress;
+    }
+
+    public void setCompanyAddress(OmsCompanyAddress companyAddress) {
+        this.companyAddress = companyAddress;
+    }
+}

+ 72 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/OmsReturnApplyQueryParam.java

@@ -0,0 +1,72 @@
+package com.yonge.cooleshow.portal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+
+/**
+ * 订单退货申请查询参数
+ * Created by macro on 2018/10/18.
+ */
+
+public class OmsReturnApplyQueryParam {
+    @ApiModelProperty("服务单号")
+    private Long id;
+    @ApiModelProperty(value = "收货人姓名/号码")
+    private String receiverKeyword;
+    @ApiModelProperty(value = "申请状态:0->待处理;1->退货中;2->已完成;3->已拒绝")
+    private Integer status;
+    @ApiModelProperty(value = "申请时间")
+    private String createTime;
+    @ApiModelProperty(value = "处理人员")
+    private String handleMan;
+    @ApiModelProperty(value = "处理时间")
+    private String handleTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getReceiverKeyword() {
+        return receiverKeyword;
+    }
+
+    public void setReceiverKeyword(String receiverKeyword) {
+        this.receiverKeyword = receiverKeyword;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getHandleMan() {
+        return handleMan;
+    }
+
+    public void setHandleMan(String handleMan) {
+        this.handleMan = handleMan;
+    }
+
+    public String getHandleTime() {
+        return handleTime;
+    }
+
+    public void setHandleTime(String handleTime) {
+        this.handleTime = handleTime;
+    }
+}

+ 17 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsOrderReturnReasonService.java

@@ -0,0 +1,17 @@
+package com.yonge.cooleshow.portal.service;
+
+import com.yonge.cooleshow.mbg.model.OmsOrderReturnReason;
+
+import java.util.List;
+
+/**
+ * 退货原因管理Service
+ * Created by macro on 2018/10/17.
+ */
+public interface OmsOrderReturnReasonService {
+
+    /**
+     * 分页获取退货原因
+     */
+    List<OmsOrderReturnReason> list(Integer pageSize, Integer pageNum);
+}

+ 15 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderReturnApplyService.java

@@ -1,6 +1,11 @@
 package com.yonge.cooleshow.portal.service;
 
+import com.yonge.cooleshow.mbg.model.OmsOrderReturnApply;
 import com.yonge.cooleshow.portal.domain.OmsOrderReturnApplyParam;
+import com.yonge.cooleshow.portal.dto.OmsOrderReturnApplyResult;
+import com.yonge.cooleshow.portal.dto.OmsReturnApplyQueryParam;
+
+import java.util.List;
 
 /**
  * 前台订单退货管理Service
@@ -11,4 +16,14 @@ public interface OmsPortalOrderReturnApplyService {
      * 提交申请
      */
     int create(OmsOrderReturnApplyParam returnApply);
+
+    /**
+     * 取消申请
+     *
+     */
+    int delete(Long id);
+
+    OmsOrderReturnApplyResult getItem(Long id);
+
+    List<OmsOrderReturnApply> list(OmsReturnApplyQueryParam queryParam, Integer pageSize, Integer pageNum);
 }

+ 32 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsOrderReturnReasonServiceimpl.java

@@ -0,0 +1,32 @@
+package com.yonge.cooleshow.portal.service.impl;
+
+import com.github.pagehelper.PageHelper;
+import com.yonge.cooleshow.mbg.mapper.OmsOrderReturnReasonMapper;
+import com.yonge.cooleshow.mbg.model.OmsOrderReturnReason;
+import com.yonge.cooleshow.mbg.model.OmsOrderReturnReasonExample;
+import com.yonge.cooleshow.portal.service.OmsOrderReturnReasonService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-05-06
+ */
+@Service
+public class OmsOrderReturnReasonServiceimpl implements OmsOrderReturnReasonService {
+
+    @Autowired
+    private OmsOrderReturnReasonMapper returnReasonMapper;
+
+    @Override
+    public List<OmsOrderReturnReason> list(Integer pageSize, Integer pageNum) {
+        PageHelper.startPage(pageNum, pageSize);
+        OmsOrderReturnReasonExample example = new OmsOrderReturnReasonExample();
+        example.setOrderByClause("sort desc");
+        return returnReasonMapper.selectByExample(example);
+    }
+}

+ 33 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderReturnApplyServiceImpl.java

@@ -1,14 +1,21 @@
 package com.yonge.cooleshow.portal.service.impl;
 
+import com.github.pagehelper.PageHelper;
 import com.yonge.cooleshow.mbg.mapper.OmsOrderReturnApplyMapper;
 import com.yonge.cooleshow.mbg.model.OmsOrderReturnApply;
+import com.yonge.cooleshow.mbg.model.OmsOrderReturnApplyExample;
+import com.yonge.cooleshow.portal.dao.OmsOrderReturnApplyDao;
 import com.yonge.cooleshow.portal.domain.OmsOrderReturnApplyParam;
+import com.yonge.cooleshow.portal.dto.OmsOrderReturnApplyResult;
+import com.yonge.cooleshow.portal.dto.OmsReturnApplyQueryParam;
 import com.yonge.cooleshow.portal.service.OmsPortalOrderReturnApplyService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 订单退货管理Service实现类
@@ -18,6 +25,10 @@ import java.util.Date;
 public class OmsPortalOrderReturnApplyServiceImpl implements OmsPortalOrderReturnApplyService {
     @Autowired
     private OmsOrderReturnApplyMapper returnApplyMapper;
+
+    @Autowired
+    private OmsOrderReturnApplyDao returnApplyDao;
+
     @Override
     public int create(OmsOrderReturnApplyParam returnApply) {
         OmsOrderReturnApply realApply = new OmsOrderReturnApply();
@@ -26,4 +37,26 @@ public class OmsPortalOrderReturnApplyServiceImpl implements OmsPortalOrderRetur
         realApply.setStatus(0);
         return returnApplyMapper.insert(realApply);
     }
+
+    @Override
+    public int delete(Long id) {
+        List<Integer> status  = new ArrayList<>();
+        status.add(0);
+        status.add(1);
+        OmsOrderReturnApplyExample example = new OmsOrderReturnApplyExample();
+        example.createCriteria().andIdEqualTo(id).andStatusIn(status);
+        return returnApplyMapper.deleteByExample(example);
+
+    }
+
+    @Override
+    public OmsOrderReturnApplyResult getItem(Long id) {
+        return returnApplyDao.getDetail(id);
+    }
+
+    @Override
+    public List<OmsOrderReturnApply> list(OmsReturnApplyQueryParam queryParam, Integer pageSize, Integer pageNum) {
+        PageHelper.startPage(pageNum, pageSize);
+        return returnApplyDao.getList(queryParam);
+    }
 }

+ 8 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UmsMemberReceiveAddressServiceImpl.java

@@ -26,6 +26,14 @@ public class UmsMemberReceiveAddressServiceImpl implements UmsMemberReceiveAddre
     public int add(UmsMemberReceiveAddress address) {
         UmsMember currentMember = memberService.getCurrentMember();
         address.setMemberId(currentMember.getId());
+        if (address.getDefaultStatus() == 1) {
+            UmsMemberReceiveAddressExample example = new UmsMemberReceiveAddressExample();
+            example.createCriteria().andDefaultStatusEqualTo(1)
+                    .andMemberIdEqualTo(currentMember.getId());
+            UmsMemberReceiveAddress umsMemberReceiveAddress = new UmsMemberReceiveAddress();
+            umsMemberReceiveAddress.setDefaultStatus(0);
+            addressMapper.updateByExampleSelective(umsMemberReceiveAddress,example);
+        }
         return addressMapper.insert(address);
     }
 

+ 59 - 0
cooleshow-mall/mall-portal/src/main/resources/config/mybatis/OmsOrderReturnApplyDao.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yonge.cooleshow.portal.dao.OmsOrderReturnApplyDao">
+    <resultMap id="returnApplyDetailResultMap" type="com.yonge.cooleshow.portal.dto.OmsOrderReturnApplyResult" extends="com.yonge.cooleshow.mbg.mapper.OmsOrderReturnApplyMapper.BaseResultMap">
+        <association property="companyAddress" resultMap="com.yonge.cooleshow.mbg.mapper.OmsCompanyAddressMapper.BaseResultMap" columnPrefix="ca_"/>
+    </resultMap>
+    <select id="getList" resultMap="com.yonge.cooleshow.mbg.mapper.OmsOrderReturnApplyMapper.BaseResultMap">
+        SELECT
+        id,
+        create_time,
+        member_username,
+        product_real_price,
+        product_count,
+        return_name,
+        status,
+        handle_time
+        FROM
+        oms_order_return_apply
+        WHERE
+        1 = 1
+        <if test="queryParam.id!=null">
+            AND id = #{queryParam.id}
+        </if>
+        <if test="queryParam.status!=null">
+            AND status = #{queryParam.status}
+        </if>
+        <if test="queryParam.status!=null">
+            AND status = #{queryParam.status}
+        </if>
+        <if test="queryParam.handleMan!=null and queryParam.handleMan!=''">
+            AND handle_man = #{queryParam.handleMan}
+        </if>
+        <if test="queryParam.createTime!=null and queryParam.createTime!=''">
+            AND create_time LIKE CONCAT(#{queryParam.createTime}, '%')
+        </if>
+        <if test="queryParam.handleTime!=null and queryParam.handleTime!=''">
+            AND handle_time LIKE CONCAT(#{queryParam.handleTime}, '%')
+        </if>
+        <if test="queryParam.receiverKeyword!=null and queryParam.receiverKeyword!=''">
+            AND (return_name LIKE concat("%",#{queryParam.receiverKeyword},"%")
+            OR return_phone LIKE concat("%",#{queryParam.receiverKeyword},"%"))
+        </if>
+    </select>
+    <select id="getDetail" resultMap="returnApplyDetailResultMap">
+        SELECT
+            ra.*, ca.id ca_id,
+                  ca.address_name ca_address_name,
+                  ca.`name` ca_name,
+                  ca.phone ca_phone,
+                  ca.province ca_province,
+                  ca.city ca_city,
+                  ca.region ca_region,
+                  ca.detail_address ca_detail_address
+        FROM
+            oms_order_return_apply ra
+            LEFT JOIN oms_company_address ca ON ra.company_address_id = ca.id
+        WHERE ra.id=#{id};
+    </select>
+</mapper>

+ 21 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/CourseRemindTask.java

@@ -0,0 +1,21 @@
+package com.yonge.cooleshow.task.jobs;
+
+import com.yonge.cooleshow.api.feign.TeacherFeignService;
+import com.yonge.cooleshow.task.core.BaseTask;
+import com.yonge.cooleshow.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * @Author: cy
+ * @Date: 2022/5/6
+ */
+public class CourseRemindTask extends BaseTask {
+
+    @Autowired
+    private TeacherFeignService teacherFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        teacherFeignService.courseRemind();
+    }
+}

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.PracticeScheduleDto;
 import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
@@ -48,6 +49,7 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
      * @param param 传入参数
      *              <p> - studentId 学生id
      *              <p> - status 课程状态 NOT_START未开始 ING进行中 COMPLETE已完成
+     *              <p> - statusList 课程状态集合 NOT_START未开始 ING进行中 COMPLETE已完成
      *              <p> - classDate  年月日
      *              <p> - startClassDate 开始时间-年月日
      *              <p> - endClassDate 结束时间-年月日
@@ -131,6 +133,9 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
     //学生端-首页-最近一堂课
     StudentHomePage.RecentCourses selectRecentCourses(Long studentId);
 
+    //老师端-首页-最近一堂课
+    StudentHomePage.RecentCourses selectRecentCoursesTeacher(Long teacherId);
+
     /**
      * 本周剩余的课时
      *
@@ -165,5 +170,11 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
 
     //根据订单号查询开课时间
     List<String> selectStartTime(String orderNo);
+
+    //查询明天有课的老师
+    List<SysUser> selectTeacher(String tomorrow);
+
+    //根据老师id统计明日课程
+    List<CountVo> selectTypeCount(@Param("teacherId")Long teacherId,@Param("tomorrow") String tomorrow);
 }
 

+ 6 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -2,12 +2,12 @@ package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yonge.cooleshow.biz.dal.entity.CourseScheduleStudentPayment;
-import com.yonge.cooleshow.biz.dal.entity.CourseScheduleTeacherSalary;
 import com.yonge.cooleshow.biz.dal.vo.CourseScheduleStudentPaymentVo;
 import com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -34,9 +34,12 @@ public interface CourseScheduleStudentPaymentDao extends BaseMapper<CourseSchedu
     /**
      * 根据课程组id查询学员信息
      *
-     * @param groupId 课程组id
+     * @param param 参数
+     *              <p> groupId    课程组id
+     *              <p> orderState 订单状态
+     *              <p> userId     学员id
      */
-    List<LiveCourseInfoVo.CourseBuyStudentVo> queryStudentInfoByGroupId(@Param("groupId") Long groupId);
+    List<LiveCourseInfoVo.CourseBuyStudentVo> queryStudentInfoByGroupId(@Param("param") Map<String, Object> param);
 
     //查询所有购买陪练课用户id
     List<Long> selectAll();

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicAlbumDao.java

@@ -45,4 +45,6 @@ public interface MusicAlbumDao extends BaseMapper<MusicAlbum> {
      * @return
      */
     List<MusicAlbumVo> selectFavoriteNumAndMusicNum(@Param("records") List<MusicAlbumVo> records);
+
+    MusicAlbumVo selectMusicAlbumById(@Param("musicAlbumId") Long musicAlbumId);
 }

+ 20 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherAttendanceDao.java

@@ -0,0 +1,20 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.entity.TeacherAttendance;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 老师考勤表(TeacherAttendance)表数据库访问层
+ *
+ * @author hgw
+ * @since 2022-05-05 13:51:21
+ */
+public interface TeacherAttendanceDao extends BaseMapper<TeacherAttendance> {
+
+    int insertBatch(@Param("entities") List<TeacherAttendance> entities);
+
+}
+

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderDao.java

@@ -25,7 +25,7 @@ public interface UserOrderDao extends BaseMapper<UserOrder>{
 	 * @date 2022-03-30 13:53:51
 	 * @return: com.yonge.cooleshow.biz.dal.vo.OrderVo
 	 */
-	UserOrderVo detailByOrderNo(@Param("orderNo") String orderNo);
+	UserOrderVo detailByOrderNo(@Param("param") UserOrder param);
 	/***
 	 * app查询
 	 * @author liweifan

+ 14 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderPayReq.java

@@ -19,17 +19,18 @@ public class OrderPayReq {
     @ApiModelProperty(value = "订单号 ", required = true)
     private String orderNo;
     @NotNull(message = "支付渠道不能为空")
-    @ApiModelProperty(value = "支付渠道:  alipay 支付宝  wx_lite 微信 ", required = true)
+    @ApiModelProperty(value = "支付渠道:  alipay 支付宝APP支付 alipay_lite 支付宝小程序支付  wx_lite 微信小程序支付 ", required = true)
     private PayChannelEnum payChannel;
-    @ApiModelProperty(value = "用户id ")
-    private Long userId;
-    @ApiModelProperty(value = "用户端公网ip ")
-    private String ipAddress;
     @ApiModelProperty(value = "微信用户openId(微信支付必传)")
     private String openId;
+    @ApiModelProperty(value = "买家的支付宝用户 id(支付宝小程序支付必传)")
+    private String buyerId;
     @ApiModelProperty(value = "用户说明 ")
     private String reason;
 
+    private Long userId;
+    private String ipAddress;
+
     public String getOrderNo() {
         return orderNo;
     }
@@ -77,4 +78,12 @@ public class OrderPayReq {
     public void setReason(String reason) {
         this.reason = reason;
     }
+
+    public String getBuyerId() {
+        return buyerId;
+    }
+
+    public void setBuyerId(String buyerId) {
+        this.buyerId = buyerId;
+    }
 }

+ 2 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/OrderSearch.java

@@ -13,10 +13,9 @@ import java.time.LocalDateTime;
  */
 @ApiModel(value = "OrderSearch对象", description = "平台订单表查询对象")
 public class OrderSearch extends QueryInfo{
-	private static final long serialVersionUID = 1L;
-	@ApiModelProperty("交易流水号/订单号")
+    @ApiModelProperty("交易流水号/订单号")
 	private String searchNo;
-	@ApiModelProperty("订单类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 (多选用,分割)")
+	@ApiModelProperty("交易类型:  VIP、开通会员  PRACTICE、陪练课购买  LIVE、直播课购买 VIDEO、视频课购买 MUSIC、单曲点播 (多选用,分割)")
 	private String orderType;
 	@ApiModelProperty("订单状态 WAIT_PAY 待支付 PAYING 支付中  PAID 已付款 CLOSE 已关闭 FAIL 支付失败 (多选用,分割)")
 	private String status;

+ 21 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentMusicSheetSearch.java

@@ -14,6 +14,27 @@ public class StudentMusicSheetSearch  extends MusicSheetSearch{
     @ApiModelProperty(value = "登录学生id",hidden = true)
     private Long studentId;
 
+    @ApiModelProperty("曲目分页参数")
+    private Integer sheetRow = 10;
+
+    @ApiModelProperty("专辑分页参数")
+    private Integer albumRow = 3;
+
+    public Integer getSheetRow() {
+        return sheetRow;
+    }
+
+    public void setSheetRow(Integer sheetRow) {
+        this.sheetRow = sheetRow;
+    }
+
+    public Integer getAlbumRow() {
+        return albumRow;
+    }
+
+    public void setAlbumRow(Integer albumRow) {
+        this.albumRow = albumRow;
+    }
 
     public Long getStudentId() {
         return studentId;

+ 23 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/RoomInfoCache.java

@@ -11,6 +11,13 @@ import java.util.Date;
  * Created by 2022年3月24日
  */
 public class RoomInfoCache implements Serializable {
+
+    @ApiModelProperty(value = "课程id")
+    private Long courseId;
+
+    @ApiModelProperty(value = "课程组id")
+    private Long courseGroupId;
+
     @ApiModelProperty(value = "主讲人id")
     private Long speakerId;
 
@@ -56,6 +63,22 @@ public class RoomInfoCache implements Serializable {
     @ApiModelProperty(value = "当前观看人数")
     private Integer lookNum;
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public Long getCourseGroupId() {
+        return courseGroupId;
+    }
+
+    public void setCourseGroupId(Long courseGroupId) {
+        this.courseGroupId = courseGroupId;
+    }
+
     public Long getSpeakerId() {
         return speakerId;
     }

+ 0 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/StudentAttendance.java

@@ -18,7 +18,6 @@ import org.springframework.format.annotation.DateTimeFormat;
 @TableName("student_attendance")
 @ApiModel(value = "StudentAttendance对象", description = "学生考勤表")
 public class StudentAttendance implements Serializable {
-	private static final long serialVersionUID = 1L;
     @ApiModelProperty("主键; ")
     @TableId(value = "id_", type = IdType.AUTO)
     private Long id;

+ 132 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TeacherAttendance.java

@@ -0,0 +1,132 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+
+/**
+ * 老师考勤表(TeacherAttendance)表实体类
+ *
+ * @author hgw
+ * @since 2022-05-05 13:51:23
+ */
+@ApiModel(value = "teacher_attendance-老师考勤表")
+public class TeacherAttendance implements Serializable {
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键;")
+    private Long id;
+
+    @TableField("teacher_id_")
+    @ApiModelProperty(value = "老师编号;")
+    private Long teacherId;
+
+    @TableField("course_group_type_")
+    @ApiModelProperty(value = "课程组类型PRACTICE、LIVE;")
+    private String courseGroupType;
+
+    @TableField("course_group_id_")
+    @ApiModelProperty(value = "课程组编号;")
+    private Long courseGroupId;
+
+    @TableField("course_schedule_id_")
+    @ApiModelProperty(value = "课程编号;")
+    private Long courseScheduleId;
+
+    @TableField("sign_in_time_")
+    @ApiModelProperty(value = "签到时间")
+    private Date signInTime;
+
+    @TableField("sign_out_time_")
+    @ApiModelProperty(value = "签退时间")
+    private Date signOutTime;
+
+    @TableField("create_time_")
+    @ApiModelProperty(value = "创建时间;")
+    private Date createTime;
+
+    @TableField("update_time_")
+    @ApiModelProperty(value = "修改时间")
+    private Date updateTime;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getCourseGroupType() {
+        return courseGroupType;
+    }
+
+    public void setCourseGroupType(String courseGroupType) {
+        this.courseGroupType = courseGroupType;
+    }
+
+    public Long getCourseGroupId() {
+        return courseGroupId;
+    }
+
+    public void setCourseGroupId(Long courseGroupId) {
+        this.courseGroupId = courseGroupId;
+    }
+
+    public Long getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Long courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public Date getSignInTime() {
+        return signInTime;
+    }
+
+    public void setSignInTime(Date signInTime) {
+        this.signInTime = signInTime;
+    }
+
+    public Date getSignOutTime() {
+        return signOutTime;
+    }
+
+    public void setSignOutTime(Date signOutTime) {
+        this.signOutTime = signOutTime;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+}
+

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderPayment.java

@@ -36,6 +36,9 @@ public class UserOrderPayment implements Serializable {
     @ApiModelProperty("交易金额,必须大于0,保留两位小数点,如0.10、100.05等 ")
 	@TableField(value = "pay_amt_")
     private BigDecimal payAmt;
+    @ApiModelProperty("回调交易金额 ")
+    @TableField(value = "back_pay_amt_")
+    private BigDecimal backPayAmt;
     @ApiModelProperty("汇付收取的服务费 ")
     @TableField(value = "fee_amt_")
     private BigDecimal feeAmt;
@@ -181,4 +184,12 @@ public class UserOrderPayment implements Serializable {
     public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
+
+    public BigDecimal getBackPayAmt() {
+        return backPayAmt;
+    }
+
+    public void setBackPayAmt(BigDecimal backPayAmt) {
+        this.backPayAmt = backPayAmt;
+    }
 }

+ 6 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java

@@ -46,6 +46,8 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
 
     //------短信模板------
     SMS_BUY_LIVE("SMS_BUY_LIVE","直播课购买成功"),
+    SMS_LIVE_BUY("SMS_LIVE_BUY","直播课购买"),
+    SMS_LIVE_COMPLETION_SUCCESS("SMS_LIVE_COMPLETION_SUCCESS","直播课成课"),
 
     SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS("SMS_STUDENT_BUY_MUSIC_SHEET_SUCCESS","学员购买乐谱(短信)"),
 
@@ -57,7 +59,10 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     SMS_VIP_EXPIRE_THIRTY_DAY("SMS_VIP_EXPIRE_THIRTY_DAY","会员到期前30天(短信)"),
     SMS_VIP_EXPIRE("SMS_VIP_EXPIRE","会员到期(短信)"),
 
-    ;
+    SMS_VIDEO_BUY("SMS_VIDEO_BUY","视频课购买(短信)"),
+    SMS_STUDENT_BUY_PRACTICE("SMS_STUDENT_BUY_PRACTICE","学员购买陪练课(短信)"),
+    SMS_PRACTICE_BUY("SMS_PRACTICE_BUY", "陪练课购买(短信)"),
+    SMS_TOMORROW_COURSE_REMINDER("SMS_TOMORROW_COURSE_REMINDER", "明日课程提醒(每晚9点)(短信)");
 
     MessageTypeEnum(String code, String msg) {
         this.code = code;

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/PayChannelEnum.java

@@ -10,7 +10,8 @@ import com.yonge.toolset.base.enums.BaseEnum;
  */
 public enum PayChannelEnum implements BaseEnum<String, PayChannelEnum> {
     alipay("alipay","支付宝APP支付"),
-    wx_lite("wx_lite","微信APP支付")
+    alipay_lite("alipay_lite","支付宝小程序支付"),
+    wx_lite("wx_lite","微信小程序支付")
     ;
     @EnumValue
     private String code;

+ 3 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java

@@ -185,7 +185,7 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
 
     void courseAdjust(CourseAdjustVo adjustVo);
 
-    StudentHomePage queryLiveAndVideo(Long studentId);
+    StudentHomePage queryLiveAndVideo(Long studentId,Long teacherId);
 
     List<TeacherSubjectPrice> teacherSubjectPrice(Long teacherId);
 
@@ -220,5 +220,7 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
      * @return 老师本周收到的评价
      */
     Integer getWeekStudentRepliedCourseSchedule(Long userId);
+
+    void courseRemind();
 }
 

+ 7 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleStudentPaymentService.java

@@ -3,10 +3,12 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleStudentPaymentDao;
 import com.yonge.cooleshow.biz.dal.entity.CourseScheduleStudentPayment;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 import com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 课程学生缴费表(CourseScheduleStudentPayment)表服务接口
@@ -21,9 +23,12 @@ public interface CourseScheduleStudentPaymentService extends IService<CourseSche
     /**
      * 根据课程组id查询学员信息
      *
-     * @param groupId 课程组id
+     * @param param 参数
+     *              <p> groupId    课程组id
+     *              <p> orderState 订单状态
+     *              <p> userId     学员id
      */
-    List<LiveCourseInfoVo.CourseBuyStudentVo> queryStudentInfoByGroupId(@Param("groupId") Long groupId);
+    List<LiveCourseInfoVo.CourseBuyStudentVo> queryStudentInfoByGroupId(Map<String, Object> param);
 
     /**
      * 根据陪练课 课程id查看购买记录

+ 17 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherAttendanceService.java

@@ -0,0 +1,17 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.dao.TeacherAttendanceDao;
+import com.yonge.cooleshow.biz.dal.entity.TeacherAttendance;
+
+/**
+ * 老师考勤表(TeacherAttendance)表服务接口
+ *
+ * @author hgw
+ * @since 2022-05-05 13:51:23
+ */
+public interface TeacherAttendanceService extends IService<TeacherAttendance> {
+
+    TeacherAttendanceDao getDao();
+}
+

+ 42 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderPaymentService.java

@@ -1,7 +1,12 @@
 package com.yonge.cooleshow.biz.dal.service;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+
+import java.util.Map;
 
 /**
  * 平台订单支付表 服务类
@@ -26,4 +31,41 @@ public interface UserOrderPaymentService extends IService<UserOrderPayment> {
      * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
      */
     UserOrderPayment detailByTransNo(String transNo);
+
+    /***
+     * 请求惠付接口后插入订单付款表
+     * @author liweifan
+     * @param: responseResult
+     * @param: payReq
+     * @updateTime 2022/5/6 15:13
+     * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
+     */
+    UserOrderPayment insertOrderPayment(HttpResponseResult<Map<String, Object>> responseResult, OrderPayReq payReq);
+
+    /***
+     * 关闭付款单
+     * @author liweifan
+     * @param: orderNo
+     * @param: reason
+     * @updateTime 2022/5/6 14:49
+     * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
+     */
+    UserOrderPayment closePayment(String orderNo,String reason);
+
+    /***
+     * 支付关单成功
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:33
+     */
+    void paymentCloseSucceededHandle(JSONObject hfRes);
+
+    /***
+     * 支付关单失败
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:33
+     */
+    void paymentCloseFailedHandle(JSONObject hfRes);
+
 }

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

@@ -35,7 +35,7 @@ public interface UserOrderService extends IService<UserOrder> {
      * @author liweifan
      * @date 2022-03-30
      */
-    UserOrderVo detail(String orderNo);
+    UserOrderVo detail(String orderNo, Long userId);
 
     /**
      * 分页查询

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

@@ -16,6 +16,7 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentCourseSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.LiveCourseGroupStudentSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
@@ -27,6 +28,7 @@ import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.date.DateUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -81,6 +83,10 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
     private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
     @Autowired
     private ImGroupService imGroupService;
+    @Autowired
+    private UserOrderService userOrderService;
+    @Autowired
+    private SysMessageService sysMessageService;
 
     @Override
     public CourseGroupDao getDao() {
@@ -114,21 +120,32 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         result.setMixStudentNum(group.getMixStudentNum());
         result.setImGroupId(group.getImGroupId());
         Optional.ofNullable(group.getTeacherId()).map(this::getSysUser)
-                .ifPresent(sysUser -> result.setTeacherName(sysUser.getRealName()));
+                .ifPresent(sysUser -> {
+                    result.setTeacherName(sysUser.getRealName());
+                    result.setUserName(sysUser.getUsername());
+                });
         Optional.ofNullable(group.getSubjectId()).map(subjectService::get)
                 .ifPresent(subject -> result.setSubjectName(subject.getName()));
         //课程组计划
         result.setPlanList(coursePlanService.queryCoursePlanByGroupId(groupId));
-        //课程组学员信息
-        result.setStudentList(courseScheduleStudentPaymentService.queryStudentInfoByGroupId(groupId));
+        //课程组已经购买成功的学员信息
+        Map<String, Object> param = new HashMap<>();
+        param.put("groupId", groupId);
+        param.put("orderState", OrderStatusEnum.PAID.getCode());
+        result.setStudentList(courseScheduleStudentPaymentService.queryStudentInfoByGroupId(param));
         //查询是否购买过该课程组
         Long id = getSysUser().getId();
-        List<CourseScheduleStudentPayment> paymentList = courseScheduleStudentPaymentService.list(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
-                .eq(CourseScheduleStudentPayment::getUserId, id)
-                .eq(CourseScheduleStudentPayment::getCourseGroupId, groupId)
-        );
+
+        //这里修改为,订单完成后才算购买过,待支付和支付中订单不算
+        //因为页面再点击购买按钮时,会请求/userOrder/getPendingOrder接口,如果有支付中的订单,用户选择继续支付或取消订单
+        OrderSearch query = new OrderSearch();
+        query.setUserId(id);
+        query.setGoodType(GoodTypeEnum.LIVE.getCode());
+        query.setBizId(groupId);
+        query.setStatus(OrderStatusEnum.PAID.getCode());
+        List<UserOrderVo> userOrderVos = userOrderService.selectList(query);
         result.setExistBuy(0);
-        if (CollectionUtils.isNotEmpty(paymentList)) {
+        if (CollectionUtils.isNotEmpty(userOrderVos)) {
             result.setExistBuy(1);
         }
         return result;
@@ -145,32 +162,11 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
      *              <p> - search 模糊搜索关键字
      */
     public PageInfo<CourseGroupVo> queryPageLiveCourseGroup(Map<String, Object> param) {
-        //查询该月的所有课程
+        //查询该月的所有直播课程
         param.put("type", CourseScheduleEnum.LIVE.getCode());
         Page<CourseGroupVo> pageInfo = PageUtil.getPageInfo(param);
         pageInfo.setAsc("b.created_time_");
         IPage<CourseGroupVo> page = baseMapper.queryTeacherCourseGroup(pageInfo, param);
-        //学生端查询报名中的课程组需要标明该学生是否已经购买过该课程组
-        String os = WrapperUtil.toStr(param, "os");
-        if ("student".equals(os) && CollectionUtils.isNotEmpty(page.getRecords())) {
-            //获取当前课程组Id
-            List<CourseGroupVo> records = page.getRecords();
-            List<Long> groupId = records.stream().map(CourseGroupVo::getCourseGroupId).collect(Collectors.toList());
-            //根据学生id 及 课程组id集合查询购买记录
-            List<CourseScheduleStudentPayment> paymentList = courseScheduleStudentPaymentService.list(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
-                    .eq(CourseScheduleStudentPayment::getUserId, getSysUser().getId())
-                    .in(CourseScheduleStudentPayment::getCourseGroupId, groupId)
-            );
-            if (CollectionUtils.isNotEmpty(paymentList)) {
-                Map<Long, List<CourseScheduleStudentPayment>> payMap = WrapperUtil.groupList(paymentList, CourseScheduleStudentPayment::getCourseGroupId);
-                records.forEach(o -> {
-                    o.setExistBuy(0);
-                    if (payMap.containsKey(o.getCourseGroupId())) {
-                        o.setExistBuy(1);
-                    }
-                });
-            }
-        }
         return PageUtil.pageInfo(page);
     }
 
@@ -261,9 +257,11 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         if (courseStateFunc.test(CourseGroupEnum.ING)) {
             throw new BizException("课程组进行中,无法下架/取消课程组!");
         } else if (courseStateFunc.test(CourseGroupEnum.APPLY)) {
-            //已上架没人买的课程可以下架
-            if (group.getPreStudentNum() > 0) {
-                throw new BizException("课程组已有学生购买,无法下架/取消课程组!");
+            //查询订单有人已经在支付中则无法下架
+            List<CourseScheduleStudentPayment> list = courseScheduleStudentPaymentService.list(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
+                    .eq(CourseScheduleStudentPayment::getCourseGroupId, groupId));
+            if (CollectionUtils.isNotEmpty(list)) {
+                throw new BizException("该课程组已有学生付款或支付中无法下架或取消!");
             }
         } else if (courseStateFunc.test(CourseGroupEnum.COMPLETE)) {
             throw new BizException("课程组已完结!");
@@ -592,6 +590,10 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                 .eq(CourseGroup::getId, groupId)
                 .eq(CourseGroup::getType, CourseScheduleEnum.LIVE.getCode())
         );
+        //只要不是销售中的课程组都提示无法购买
+        if(!courseGroup.getStatus().equals(CourseGroupEnum.APPLY.getCode())){
+            throw new BizException("课程已结束销售!");
+        }
         if (Objects.isNull(courseGroup)) {
             throw new BizException("课程组不存在!");
         }
@@ -664,17 +666,25 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         log.info("buyLiveCourseSuccess param :{}", JSON.toJSONString(orderParam));
         String orderNo = orderParam.getOrderNo();
         //更新课程组的购买人数+1
-        CourseScheduleStudentPayment studentPayment = courseScheduleStudentPaymentService.getOne(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
+        List<CourseScheduleStudentPayment> studentPaymentList = courseScheduleStudentPaymentService.list(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
                 .eq(CourseScheduleStudentPayment::getOrderNo, orderNo)
         );
-        if (Objects.isNull(studentPayment)) {
-            throw new BizException("订单不存在!");
+        CourseScheduleStudentPayment studentPayment;
+        if (CollectionUtils.isEmpty(studentPaymentList)) {
+            log.info("buyLiveCourseSuccess >>> 订单不存在!orderParam: {}", JSON.toJSONString(orderParam));
+            throw new BizException("订单不存在");
+        } else {
+            studentPayment = studentPaymentList.get(0);
         }
-        //更新课程组的购买人数+1
-        this.baseMapper.opsPreStudentNum(studentPayment.getCourseGroupId(), 1);
         //课程组信息
         CourseGroup courseGroup = this.getOne(Wrappers.<CourseGroup>lambdaQuery()
                 .eq(CourseGroup::getId, studentPayment.getCourseGroupId()));
+        if (Objects.isNull(courseGroup)) {
+            log.info("buyLiveCourseSuccess >>> 课程组不存在!orderParam: {}", JSON.toJSONString(orderParam));
+            throw new BizException("课程组不存在");
+        }
+        //更新课程组的购买人数+1
+        this.baseMapper.opsPreStudentNum(studentPayment.getCourseGroupId(), 1);
         //课程信息
         List<CourseSchedule> courseList = courseScheduleService.list(Wrappers.<CourseSchedule>lambdaQuery()
                 .eq(CourseSchedule::getCourseGroupId, studentPayment.getCourseGroupId()));
@@ -706,6 +716,85 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         });
         courseScheduleTeacherSalaryService.getDao().insertBatch(teacherSalaryList);
         log.info("buyLiveCourseSuccess ok");
+        //课程购买成功后进行消息推送
+        buyLiveSendMessage(studentPayment, courseGroup);
+    }
+
+    /**
+     * 课程购买成功后进行消息推送
+     *
+     * @param studentPayment 学生购买信息
+     * @param courseGroup    课程组信息
+     */
+    private void buyLiveSendMessage(CourseScheduleStudentPayment studentPayment, CourseGroup courseGroup) {
+        //查询老师信息
+        SysUser teacherInfo = getSysUser(courseGroup.getTeacherId());
+        //查询学生信息
+        SysUser studentInfo = getSysUser(studentPayment.getUserId());
+        try {
+            //极光-消息推送-学生端-通知学生购买成功-跳转到APP
+            MessageTypeEnum liveBuy = MessageTypeEnum.LIVE_BUY;
+            //查询推送跳转的url
+            String liveBuyUrl = sysMessageService.selectConfigUrl(liveBuy.getCode());
+            Map<Long, String> studentReceivers = new HashMap<>();
+            studentReceivers.put(studentInfo.getId(), studentInfo.getPhone());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, liveBuy,
+                    studentReceivers, null, 0, null, ClientEnum.STUDENT.getCode(),
+                    teacherInfo.getUsername(), courseGroup.getName(), liveBuyUrl);
+            log.info("buyLiveCourseSuccess buyLiveSendMessage LIVE_BUY ok");
+
+            //短信-消息推送-学生端-通知学生购买成功-跳转到APP
+            MessageTypeEnum smsLiveBuy = MessageTypeEnum.SMS_LIVE_BUY;
+            //查询推送跳转的url
+            String smsLiveBuyUrl = sysMessageService.selectConfigUrl(smsLiveBuy.getCode());
+            Map<Long, String> smsStudentReceivers = new HashMap<>();
+            smsStudentReceivers.put(studentInfo.getId(), studentInfo.getPhone());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, smsLiveBuy,
+                    smsStudentReceivers, null, 0, null, null,
+                    teacherInfo.getUsername(), courseGroup.getName(), smsLiveBuyUrl);
+            log.info("buyLiveCourseSuccess buyLiveSendMessage SMS_BUY_LIVE ok");
+
+            //极光-消息推送-老师端-通知老师有学生购买课程-跳转到APP
+            MessageTypeEnum studentBuyLive = MessageTypeEnum.STUDENT_BUY_LIVE;
+            //查询推送跳转的url
+            String studentBuyLiveUrl = sysMessageService.selectConfigUrl(studentBuyLive.getCode());
+            Map<Long, String> teacherReceivers = new HashMap<>();
+            teacherReceivers.put(teacherInfo.getId(), teacherInfo.getPhone());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, studentBuyLive,
+                    teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
+                    studentInfo.getUsername(), courseGroup.getName(), studentBuyLiveUrl);
+            log.info("buyLiveCourseSuccess buyLiveSendMessage STUDENT_BUY_LIVE ok");
+
+            //短信-消息推送-老师端-通知老师有学生购买课程-无需跳转到APP
+            Map<Long, String> smsTeacherReceivers = new HashMap<>();
+            smsTeacherReceivers.put(teacherInfo.getId(), teacherInfo.getPhone());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_BUY_LIVE,
+                    smsTeacherReceivers, null, 0, null, null,
+                    studentInfo.getUsername(), courseGroup.getName());
+            log.info("buyLiveCourseSuccess buyLiveSendMessage SMS_BUY_LIVE ok");
+
+            //判断是否到达最低成课人数
+            if (Objects.equals(courseGroup.getPreStudentNum(), courseGroup.getMixStudentNum())) {
+                //极光-消息推送-老师端-通知老师课程最小开课人数已达标
+                MessageTypeEnum liveCompletionSuccess = MessageTypeEnum.LIVE_COMPLETION_SUCCESS;
+                Map<Long, String> liveCompletionSuccessReceivers = new HashMap<>();
+                liveCompletionSuccessReceivers.put(teacherInfo.getId(), teacherInfo.getPhone());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, liveCompletionSuccess,
+                        liveCompletionSuccessReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
+                        courseGroup.getName());
+                log.info("buyLiveCourseSuccess buyLiveSendMessage LIVE_COMPLETION_SUCCESS ok");
+
+                //短信-消息推送-老师端-通知老师课程最小开课人数已达标
+                Map<Long, String> smsLiveCompletionSuccessReceivers = new HashMap<>();
+                smsLiveCompletionSuccessReceivers.put(teacherInfo.getId(), teacherInfo.getPhone());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_LIVE_COMPLETION_SUCCESS,
+                        smsLiveCompletionSuccessReceivers, null, 0, null, null,
+                        courseGroup.getName());
+                log.info("buyLiveCourseSuccess buyLiveSendMessage SMS_LIVE_COMPLETION_SUCCESS ok");
+            }
+        } catch (Exception ex) {
+            log.error("buyLiveCourseSuccess buyLiveSendMessage error", ex.getCause());
+        }
     }
 
     @Override
@@ -738,10 +827,13 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
      * 定时将符合开售日期的未开售的直播课课程组修改为报名中状态
      */
     private void openCourseGroup() {
+        LocalDate today = LocalDate.now();
+        LocalDate yesterday = today.plusDays(-1L);
         //查询今天未开售的课程组
         List<CourseGroup> courseGroupList = this.list(Wrappers.<CourseGroup>lambdaQuery()
                 .eq(CourseGroup::getType, CourseScheduleEnum.LIVE.getCode())
-                .eq(CourseGroup::getSalesStartDate, LocalDate.now())
+                .ge(CourseGroup::getSalesStartDate, yesterday)
+                .le(CourseGroup::getSalesStartDate, today)
                 .eq(CourseGroup::getStatus, CourseGroupEnum.NOT_SALE.getCode()));
         if (CollectionUtils.isEmpty(courseGroupList)) {
             return;
@@ -779,6 +871,11 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                 } else {
                     //人数未达标则修改课程组为取消状态
                     courseGroup.setStatus(CourseGroupEnum.CANCEL.getCode());
+                    //更新课程组下课程状态为取消
+                    courseScheduleService.update(Wrappers.<CourseSchedule>lambdaUpdate()
+                            .eq(CourseSchedule::getCourseGroupId, courseGroup.getId())
+                            .set(CourseSchedule::getStatus, CourseScheduleEnum.CANCEL.getCode())
+                    );
                 }
                 this.updateById(courseGroup);
             } catch (Exception ignored) {

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

@@ -98,28 +98,37 @@ public class CourseRepliedServiceImpl extends ServiceImpl<CourseScheduleRepliedD
         }
         repliedDao.insert(replied);
 
+        repliedSend(courseSchedule.getTeacherId(), userId);
+    }
+
+    /**
+     * @Description: 陪练课评价消息推送
+     * @Author: cy
+     * @Date: 2022/5/6
+     */
+    public void repliedSend(Long teacherId, Long studentId) {
         try {
-            repliedSend(userId);
+            SysUser student = sysUserFeignService.queryUserById(studentId);
+            SysUser teacher = sysUserFeignService.queryUserById(teacherId);
+
+            Map<Long, String> teacherReceivers = new HashMap<>();
+            teacherReceivers.put(teacherId, teacher.getPhone());
+
+            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.STUDENT_EVALUATE_TEACHER_PRACTICE.getCode());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_EVALUATE_TEACHER_PRACTICE,
+                    teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
+                    student.getUsername(), url);
+            log.info("send success {}", MessageTypeEnum.STUDENT_EVALUATE_TEACHER_PRACTICE);
         } catch (Exception e) {
-            log.error("视频课消息推送失败");
+            log.error("send fail {}", MessageTypeEnum.STUDENT_EVALUATE_TEACHER_PRACTICE);
+            e.printStackTrace();
         }
     }
 
-    public void repliedSend(Long studentId){
-        //消息推送
-        SysUser student = sysUserFeignService.queryUserById(studentId);
-        Map<Long, String> studentReceivers = new HashMap<>();
-        studentReceivers.put(studentId, student.getPhone());
-        String url = sysMessageService.selectConfigUrl(MessageTypeEnum.STUDENT_EVALUATE_TEACHER_PRACTICE.getCode());
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_EVALUATE_TEACHER_PRACTICE,
-                studentReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
-                student.getUsername(), url);
-    }
-
     /**
-     * 判断评论是否存在
-     * @param replied
-     * @return
+     * @Description: 判断评论是否存在
+     * @Author: cy
+     * @Date: 2022/5/6
      */
     public boolean repliedIsNull(CourseScheduleReplied replied) {
         QueryWrapper<CourseScheduleReplied> queryWrapper = new QueryWrapper<>();
@@ -132,9 +141,9 @@ public class CourseRepliedServiceImpl extends ServiceImpl<CourseScheduleRepliedD
     }
 
     /**
-     * 校验当前用户是否购买课程
-     * @param userId     学员id
-     * @param scheduleId 课程id
+     * @Description: 校验当前用户是否购买课程
+     * @Author: cy
+     * @Date: 2022/5/6
      */
     public void isPayment(Long userId, Long scheduleId) {
         QueryWrapper<CourseScheduleStudentPayment> wrapper = new QueryWrapper<>();
@@ -154,12 +163,7 @@ public class CourseRepliedServiceImpl extends ServiceImpl<CourseScheduleRepliedD
      */
     @Override
     public CourseRepliedVo selectReplied(CourseScheduleReplied replied) {
-//        QueryWrapper<CourseScheduleReplied> wrapper = new QueryWrapper<>();
-//        wrapper.eq("course_group_type_", CourseScheduleEnum.PRACTICE);
-//        wrapper.eq("student_id_", replied.getStudentId());
-//        wrapper.eq("course_schedule_id_", replied.getCourseScheduleId());
-//        wrapper.eq("course_group_id_", replied.getCourseGroupId());
-        CourseRepliedVo repliedVo=repliedDao.selectReplied(replied);
+        CourseRepliedVo repliedVo = repliedDao.selectReplied(replied);
         return repliedVo;
     }
 
@@ -173,4 +177,7 @@ public class CourseRepliedServiceImpl extends ServiceImpl<CourseScheduleRepliedD
         return page.setRecords(repliedDao.myReplied(page, search));
     }
 
+    public void noRepliedTeacher(){
+
+    }
 }

+ 140 - 62
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.Lists;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleDao;
@@ -43,8 +44,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.text.DateFormat;
-import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.temporal.TemporalAdjusters;
@@ -269,6 +268,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                 calendarEntity.setFullCourse(0);//  0:未满 1满
             } else {
                 //将日历时间与课程时间进行对比,如果有交集则将日历的时间数据删除
+                if (CollectionUtils.isEmpty(calendarEntity.getCourseTime())) {
+                    return;
+                }
                 Iterator<CourseTimeEntity> iterator = calendarEntity.getCourseTime().iterator();
                 while (iterator.hasNext()) {
                     CourseTimeEntity next = iterator.next();
@@ -344,12 +346,10 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         int addDay = 0;
         //获取每日日期数据
         while (firstDay.isBefore(lastDay) || firstDay.isEqual(lastDay)) {
-            CourseCalendarEntity entity = new CourseCalendarEntity();
-            List<CourseTimeEntity> times = new ArrayList<>();
+            //将每日上课时间时间添加到日历中
+            CourseCalendarEntity entity = opsCourseDayTime(addDay, dayTime);
             //获取当前日期
             entity.setDate(firstDay.toString());
-            //将每日上课时间时间添加到日历中
-            opsCourseDayTime(addDay, entity, times, dayTime);
             list.add(entity);
             firstDay = firstDay.plusDays(1L);
             addDay++;
@@ -462,7 +462,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             //获取当前日期周几
             int weekNum = firstDay.getDayOfWeek().getValue();
             JSONArray jsonArray = teacherPracticeTime.get(weekNum);
-            if (Objects.nonNull(jsonArray)){
+            if (Objects.nonNull(jsonArray)) {
                 List<CourseTimeEntity> timeEntities = jsonArray.stream()
                         .map(t -> getCourseTimeEntity(entity, (JSONObject) t))
                         .collect(Collectors.toList());
@@ -487,11 +487,11 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * 将每日上课时间时间添加到日历中
      *
      * @param addDay       添加的天数
-     * @param entity       实体数据
-     * @param times        课程数据集合
      * @param timeEntities 每日上课时间集合
      */
-    private void opsCourseDayTime(int addDay, CourseCalendarEntity entity, List<CourseTimeEntity> times, List<CourseTimeEntity> timeEntities) {
+    private CourseCalendarEntity opsCourseDayTime(int addDay, List<CourseTimeEntity> timeEntities) {
+        CourseCalendarEntity entity = new CourseCalendarEntity();
+        List<CourseTimeEntity> times = new ArrayList<>();
         timeEntities.forEach(time -> {
             CourseTimeEntity courseTimeEntity = new CourseTimeEntity();
             courseTimeEntity.setStartTime(DateUtil.addDays(time.getStartTime(), addDay));
@@ -499,6 +499,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             times.add(courseTimeEntity);
         });
         entity.setCourseTime(times);
+        return entity;
     }
 
     /**
@@ -510,13 +511,10 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         Map<Integer, JSONArray> teacherPracticeTime = new HashMap<>();
         //将老师设置的陪练课时间放入map中
         BiConsumer<String, Integer> timeCon = (timeStr, weekNum) -> {
-            if (StringUtils.isBlank(timeStr)) {
-                return;
-            }
-            JSONArray objects = JSONObject.parseArray(timeStr);
-            if (CollectionUtils.isNotEmpty(objects)) {
-                teacherPracticeTime.put(weekNum, objects);
-            }
+            Optional.ofNullable(timeStr)
+                    .map(JSONObject::parseArray)
+                    .filter(CollectionUtils::isNotEmpty)
+                    .ifPresent(objects -> teacherPracticeTime.put(weekNum, objects));
         };
         timeCon.accept(teacherTime.getMonday(), 1);
         timeCon.accept(teacherTime.getTuesday(), 2);
@@ -535,9 +533,12 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * @param studentId 学员id
      */
     private Map<String, List<CourseTimeEntity>> getAllPracticeCourseTime(Long teacherId, Long studentId, String startDate, String endDate) {
+        //未开始、进行中的课程
+        List<String> statusList = Lists.newArrayList(CourseScheduleEnum.NOT_START.getCode(), CourseScheduleEnum.ING.getCode());
         //查询该老师指定时间段的课程
         List<CourseSchedule> courseList = this.list(Wrappers.<CourseSchedule>lambdaQuery()
                 .eq(CourseSchedule::getTeacherId, teacherId)
+                .in(CourseSchedule::getStatus, statusList)
                 .ge(CourseSchedule::getClassDate, startDate)
                 .le(CourseSchedule::getClassDate, endDate)
         );
@@ -549,6 +550,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         param.put("studentId", studentId);
         param.put("startClassDate", startDate);
         param.put("endClassDate", endDate);
+        param.put("statusList", statusList);
         List<CourseSchedule> studentCourse = baseMapper.queryStudentCourse(param);
         //将数据合并
         if (CollectionUtils.isNotEmpty(studentCourse)) {
@@ -647,7 +649,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                 List<Long> userList = paymentDao.selectAll();
                 //取差集
                 userList.removeAll(studentList);
-                if (userList.isEmpty()) {
+                if (CollectionUtils.isEmpty(userList)) {
                     return page.setRecords(new ArrayList<>());
                 }
                 search.setRepliedIds(userList);
@@ -908,7 +910,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         log.info("buyPracticeCourseSuccess  param:{}", JSON.toJSONString(orderParam));
         String orderNo = orderParam.getOrderNo();
         List<CourseScheduleStudentPaymentVo> paymentList = paymentDao.selectPaymentList(orderNo);
-        if (paymentList.isEmpty()) {
+        if (CollectionUtils.isEmpty(paymentList)) {
             throw new BizException("订单不存在!");
         }
 
@@ -947,47 +949,12 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 
         //消息推送
         try {
-            practiceSend(paymentList.get(0).getTeacherId(), orderParam.getUserId(),paymentList.size() + "",orderNo);
-        }catch (Exception e){
+            practiceSend(paymentList.get(0).getTeacherId(), orderParam.getUserId(), paymentList.size() + "", orderNo);
+        } catch (Exception e) {
             log.error("陪练课消息推送失败");
         }
     }
 
-    public void practiceSend(Long teacherId, Long studentId,String courseNum,String orderNo) {
-        //查询老师&学生信息
-        SysUser teacher = sysUserFeignService.queryUserById(teacherId);
-        SysUser student = sysUserFeignService.queryUserById(studentId);
-
-        //消息接收者(Key:用户编号 value:消息接收对象)
-        Map<Long, String> teacherReceivers = new HashMap<>();
-        teacherReceivers.put(teacherId, teacher.getPhone());
-        Map<Long, String> studentReceivers = new HashMap<>();
-        studentReceivers.put(studentId, student.getPhone());
-
-        //老师端-学生买陪练课
-        String teacherUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.STUDENT_BUY_PRACTICE.getCode());
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_BUY_PRACTICE,
-                teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
-                student.getUsername(),courseNum, teacherUrl);
-
-        //学生端-买陪练课
-        String studentUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.PRACTICE_BUY.getCode());
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_BUY,
-                studentReceivers, null, 0, null, ClientEnum.STUDENT.getCode(),
-                teacher.getUsername(), courseNum, studentUrl);
-
-        //陪练课开课提醒
-        List<String> startTimeList = baseMapper.selectStartTime(orderNo);
-        for (String startTime : startTimeList) {
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PRACTICE_REMINDER,
-                    teacherReceivers, DateUtil.offsetMinute(startTime, -20), 0, null, ClientEnum.TEACHER.getCode(),
-                    student.getUsername());
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_REMIND,
-                    studentReceivers, DateUtil.offsetMinute(startTime, -20), 0, null, ClientEnum.STUDENT.getCode(),
-                    teacher.getUsername());
-        }
-    }
-
     /**
      * 学生购买陪练课-失败-回调
      */
@@ -996,7 +963,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         String orderNo = orderParam.getOrderNo();
         List<CourseScheduleStudentPayment> paymentList = paymentDao.selectList(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
                 .eq(CourseScheduleStudentPayment::getOrderNo, orderNo));
-        if (paymentList.isEmpty()) {
+        if (CollectionUtils.isEmpty(paymentList)) {
             throw new BizException("订单不存在!");
         }
 
@@ -1024,16 +991,21 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     }
 
     /**
-     * @Description: 学生-首页-直播课&视频课
+     * @Description: 首页-直播课&视频课
      * @Author: cy
      * @Date: 2022/4/22
      */
     @Override
-    public StudentHomePage queryLiveAndVideo(Long studentId) {
+    public StudentHomePage queryLiveAndVideo(Long studentId, Long teacherId) {
         StudentHomePage homePage = new StudentHomePage();
-        homePage.setLiveList(baseMapper.selectLive());
-        homePage.setVideoList(baseMapper.selectVideo());
-        homePage.setRecentCourses(baseMapper.selectRecentCourses(studentId));
+        if (teacherId == null) {
+            homePage.setLiveList(baseMapper.selectLive());
+            homePage.setVideoList(baseMapper.selectVideo());
+            homePage.setRecentCourses(baseMapper.selectRecentCourses(studentId));
+        }
+        if (studentId == null) {
+            homePage.setRecentCourses(baseMapper.selectRecentCoursesTeacher(teacherId));
+        }
         return homePage;
     }
 
@@ -1065,4 +1037,110 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     public Integer getWeekStudentRepliedCourseSchedule(Long userId) {
         return baseMapper.selectWeekStudentRepliedCourseSchedule(userId);
     }
+
+    /**
+     * @Description: 购买陪练课消息推送
+     * @Author: cy
+     * @Date: 2022/5/6
+     */
+    public void practiceSend(Long teacherId, Long studentId, String courseNum, String orderNo) {
+        //查询老师&学生信息
+        SysUser teacher = sysUserFeignService.queryUserById(teacherId);
+        SysUser student = sysUserFeignService.queryUserById(studentId);
+
+        //消息接收者(Key:用户编号 value:消息接收对象)
+        Map<Long, String> teacherReceivers = new HashMap<>();
+        teacherReceivers.put(teacherId, teacher.getPhone());
+        Map<Long, String> studentReceivers = new HashMap<>();
+        studentReceivers.put(studentId, student.getPhone());
+        Map<Long, String> teacherSms = new HashMap<>();
+        teacherSms.put(teacherId, teacher.getPhone());
+        Map<Long, String> studentSms = new HashMap<>();
+        studentSms.put(studentId, student.getPhone());
+
+        //老师端-学生买陪练课
+        String teacherUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.STUDENT_BUY_PRACTICE.getCode());
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_BUY_PRACTICE,
+                teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
+                student.getUsername(), courseNum, teacherUrl);
+        log.info("send success {}", MessageTypeEnum.STUDENT_BUY_PRACTICE);
+
+        //老师端-学生买陪练课(短信)
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_STUDENT_BUY_PRACTICE,
+                teacherSms, null, 0, null, null,
+                student.getUsername(), courseNum);
+        log.info("send success {}", MessageTypeEnum.SMS_STUDENT_BUY_PRACTICE);
+
+        //学生端-买陪练课
+        String studentUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.PRACTICE_BUY.getCode());
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_BUY,
+                studentReceivers, null, 0, null, ClientEnum.STUDENT.getCode(),
+                teacher.getUsername(), courseNum, studentUrl);
+        log.info("send success {}", MessageTypeEnum.PRACTICE_BUY);
+
+        //学生端-买陪练课(短信)
+        String studentSmsUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.SMS_PRACTICE_BUY.getCode());
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.SMS_PRACTICE_BUY,
+                studentSms, null, 0, null, null,
+                teacher.getUsername(), courseNum, studentSmsUrl);
+        log.info("send success {}", MessageTypeEnum.SMS_PRACTICE_BUY);
+
+        List<String> startTimeList = baseMapper.selectStartTime(orderNo);
+        for (String startTime : startTimeList) {
+            //老师端-陪练课开课提醒
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PRACTICE_REMINDER,
+                    teacherReceivers, DateUtil.offsetMinute(startTime, -20), 0, null, ClientEnum.TEACHER.getCode(),
+                    student.getUsername());
+
+            //学生端-陪练课开课提醒
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_REMIND,
+                    studentReceivers, DateUtil.offsetMinute(startTime, -20), 0, null, ClientEnum.STUDENT.getCode(),
+                    teacher.getUsername());
+        }
+        log.info("send success {}", MessageTypeEnum.PRACTICE_REMIND);
+    }
+
+    /**
+     * @Description: 明日课程提醒(每晚9点)
+     * @Author: cy
+     * @Date: 2022/5/6
+     */
+    public void courseRemind() {
+        String tomorrow = new SimpleDateFormat("yyyy-MM-dd").format(DateUtil.addDays1(new Date(), 1));
+        //查询明天有课的老师
+        List<SysUser> userList = baseMapper.selectTeacher(tomorrow);
+        if (CollectionUtils.isNotEmpty(userList)) {
+            for (SysUser sysUser : userList) {
+                Map<Long, String> teacherReceivers = new HashMap<>();
+                teacherReceivers.put(sysUser.getId(), sysUser.getPhone());
+                Map<Long, String> teacherSms = new HashMap<>();
+                teacherSms.put(sysUser.getId(), sysUser.getPhone());
+
+                Integer liveCount=0;
+                Integer practiceCount=0;
+                List<CountVo> typeCount=baseMapper.selectTypeCount(sysUser.getId(),tomorrow);
+                for (CountVo countVo : typeCount) {
+                    if (countVo.getType().equals(CourseScheduleEnum.LIVE.getCode())) {
+                        liveCount=countVo.getCount();
+                    }
+                    if (countVo.getType().equals(CourseScheduleEnum.PRACTICE.getCode())) {
+                        practiceCount=countVo.getCount();
+                    }
+                }
+
+                //老师端-明日课程提醒
+                String teacherUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.SMS_TOMORROW_COURSE_REMINDER.getCode());
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TOMORROW_COURSE_REMINDER,
+                        teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
+                        practiceCount.toString(),liveCount.toString(),teacherUrl);
+                log.info("send success {}",MessageTypeEnum.TOMORROW_COURSE_REMINDER);
+
+                //老师端-明日课程提醒(短信)
+                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_TOMORROW_COURSE_REMINDER,
+                        teacherSms, null, 0, null, null,
+                        practiceCount, liveCount);
+                log.info("send success {}",MessageTypeEnum.SMS_STUDENT_BUY_PRACTICE);
+            }
+        }
+    }
 }

+ 13 - 14
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -6,15 +6,13 @@ import com.yonge.cooleshow.biz.dal.entity.CourseScheduleStudentPayment;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleStudentPaymentService;
 import com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 课程学生缴费表(CourseScheduleStudentPayment)表服务实现类
@@ -35,28 +33,29 @@ public class CourseScheduleStudentPaymentServiceImpl extends ServiceImpl<CourseS
     /**
      * 根据课程组id查询学员信息
      *
-     * @param groupId 课程组id
+     * @param param 参数
+     *              <p> groupId    课程组id
+     *              <p> orderState 订单状态
+     *              <p> userId     学员id
      */
     @Override
-    public List<LiveCourseInfoVo.CourseBuyStudentVo> queryStudentInfoByGroupId(Long groupId) {
-        return baseMapper.queryStudentInfoByGroupId(groupId);
+    public List<LiveCourseInfoVo.CourseBuyStudentVo> queryStudentInfoByGroupId(Map<String, Object> param) {
+        return baseMapper.queryStudentInfoByGroupId(param);
     }
 
     @Override
     public CourseScheduleStudentPayment getByCourseId(Long courseId) {
         List<CourseScheduleStudentPayment> list = this.lambdaQuery()
-                                                      .eq(CourseScheduleStudentPayment::getCourseId, courseId)
-                                                      .eq(CourseScheduleStudentPayment::getCourseType,
-                                                          CourseScheduleEnum.PRACTICE.getCode())
-                                                      .isNotNull(CourseScheduleStudentPayment::getUserId)
-                                                      .list();
+                .eq(CourseScheduleStudentPayment::getCourseId, courseId)
+                .eq(CourseScheduleStudentPayment::getCourseType,
+                        CourseScheduleEnum.PRACTICE.getCode())
+                .isNotNull(CourseScheduleStudentPayment::getUserId)
+                .list();
         if (CollectionUtils.isEmpty(list)) {
             return null;
         }
         return list.get(0);
-
     }
 
-
 }
 

+ 137 - 21
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java

@@ -6,14 +6,10 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.LiveRoomDao;
-import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
+import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
-import com.yonge.cooleshow.biz.dal.enums.RoomTypeEnum;
-import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
-import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
-import com.yonge.cooleshow.biz.dal.service.LiveRoomService;
-import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.biz.dal.enums.*;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.support.IMHelper;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.RoomVo;
@@ -62,6 +58,16 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     private CourseScheduleService courseScheduleService;
     @Autowired
     private SysConfigService sysConfigService;
+    @Autowired
+    private UserAccountService userAccountService;
+    @Autowired
+    private CourseScheduleTeacherSalaryService courseScheduleTeacherSalaryService;
+    @Autowired
+    private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
+    @Autowired
+    private StudentAttendanceService studentAttendanceService;
+    @Autowired
+    private TeacherAttendanceService teacherAttendanceService;
 
     //生成房间UID
     public static BiFunction<Long, RoomTypeEnum, String> GenRoomUid = (userId, en) -> String.join("-", COOLESHOW, en.getCode(), userId.toString(), new Date().getTime() + "");
@@ -204,7 +210,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         Boolean check = WrapperUtil.inInterSection(now, now, course.getStartTime(), course.getEndTime(), false);
         if (check) {
             //如果当前时间和课程时间有交集则不能开启临时直播
-            throw new BizException("当前有陪练课无法开启直播");
+            throw new BizException("当前有课无法开启直播");
         }
     }
 
@@ -242,6 +248,8 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         String configValue = sysConfigService.findConfigValue(PRE_CREATE_LIVE_ROOM_MINUTE);
         roomCache.setExpiredMinute(Integer.parseInt(configValue));
         roomCache.setRoomType(room.getType());
+        roomCache.setCourseId(room.getCourseId());
+        roomCache.setCourseGroupId(room.getCourseGroupId());
 
         //写入房间信息
         redissonClient.getBucket(LIVE_ROOM_INFO.replace(ROOM_UID, room.getRoomUid()))
@@ -299,6 +307,34 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             if (now.getTime() >= expiredDate.getTime()) {
                 //删除房间
                 destroyLiveRoom(room.getRoomUid());
+                //查询老师分润表
+                CourseScheduleTeacherSalary salary = courseScheduleTeacherSalaryService.getOne(Wrappers.<CourseScheduleTeacherSalary>lambdaQuery()
+                        .eq(CourseScheduleTeacherSalary::getCourseScheduleId, room.getCourseId())
+                );
+                if (Objects.isNull(salary)) {
+                    return;
+                }
+                //查询该学生及课程id 对应的支付订单号
+                CourseScheduleStudentPayment payment = courseScheduleStudentPaymentService.getOne(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
+                        .eq(CourseScheduleStudentPayment::getCourseId, room.getCourseId())
+                        .eq(CourseScheduleStudentPayment::getUserId, salary.getStudentId())
+                );
+                if (Objects.isNull(payment)) {
+                    return;
+                }
+                //获取教师课酬写入到金额变更表
+                UserAccountRecordDto userAccountRecord = new UserAccountRecordDto();
+                userAccountRecord.setUserId(room.getSpeakerId());
+                userAccountRecord.setInOrOut(InOrOutEnum.IN);
+                userAccountRecord.setBizType(AccountBizTypeEnum.LIVE);
+                userAccountRecord.setBizId(room.getCourseId());
+                userAccountRecord.setBizName(room.getRoomTitle());
+                userAccountRecord.setTransAmount(salary.getExpectSalary());//扣除手续费后所得金额
+                userAccountRecord.setOrderNo(payment.getOrderNo());
+                userAccountService.accountChange(userAccountRecord);
+                //修改老师课酬表
+                salary.setStatus(TeacherSalaryEnum.COMPLETE.getCode());
+                courseScheduleTeacherSalaryService.updateById(salary);
             }
         });
     }
@@ -325,7 +361,6 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         log.info("destroyLiveRoom success: {}", roomId);
     }
 
-
     /**
      * <p>主讲人处理进入和退出房间数据
      * <p>观看者只处理退出房间数据
@@ -369,28 +404,52 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
                 return;
             }
             RoomInfoCache roomInfo = roomInfoCache.get();
+            //用户id
+            Long userId = Long.valueOf(userIdStr);
             //主讲人
             if (roomInfo.getSpeakerId().toString().equals(userIdStr)) {
+                //进退房间写老师考勤表
+                TeacherAttendance teacherAttendance = teacherAttendanceService.getOne(Wrappers.<TeacherAttendance>lambdaQuery()
+                        .eq(TeacherAttendance::getTeacherId, userId)
+                        .eq(TeacherAttendance::getCourseScheduleId, roomInfo.getCourseId()));
                 //主讲人进入房间
                 if (user.getStatus().equals("0")) {
                     roomInfo.setSpeakerState(0);
                     roomInfo.setJoinRoomTime(now);
                     log.info("opsRoom>>>> join roomInfo {}", JSONObject.toJSONString(roomInfo));
                     roomInfoCache.set(roomInfo);
+                    //查询老师是否有进入过,没有则写老师考勤表的进入时间
+                    if (Objects.isNull(teacherAttendance)) {
+                        setTeacherAttendance(userId, roomInfo.getCourseGroupId(), roomInfo.getCourseId());
+                    }
                     return;
                 }
                 roomInfo.setSpeakerState(1);
                 roomInfo.setExitRoomTime(now);
                 log.info("opsRoom>>>> exit roomInfo {}", JSONObject.toJSONString(roomInfo));
                 roomInfoCache.set(roomInfo);
+                if (Objects.isNull(teacherAttendance)) {
+                    teacherAttendance = new TeacherAttendance();
+                    teacherAttendance.setTeacherId(userId);
+                    teacherAttendance.setCourseGroupType(CourseScheduleEnum.LIVE.getCode());
+                    teacherAttendance.setCourseGroupId(roomInfo.getCourseGroupId());
+                    teacherAttendance.setCourseScheduleId(roomInfo.getCourseId());
+                    teacherAttendance.setSignInTime(now);
+                    teacherAttendance.setSignOutTime(now);
+                    teacherAttendance.setCreateTime(now);
+                    teacherAttendanceService.save(teacherAttendance);
+                } else {
+                    //修改老师考勤表
+                    teacherAttendance.setSignOutTime(now);
+                    teacherAttendance.setUpdateTime(now);
+                    teacherAttendanceService.updateById(teacherAttendance);
+                }
                 return;
             }
-            //观看者只接受退出消息 status=0 是进入房间
+            //观看者只需要接收退出房间的消息 status=0进入房间
             if (user.getStatus().equals("0")) {
                 return;
             }
-            //观看者
-            Long userId = Long.valueOf(userIdStr);
             //从房间累计用户信息中查询该用户的信息
             RMap<Long, RoomUserInfoCache> roomTotalUser = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid));
             //该房间未查询到用户数据则不处理
@@ -418,6 +477,8 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             userInfo.setLastOutTime(now);
             userInfo.setState(1);
             roomTotalUser.fastPut(userId, userInfo);
+            //todo 写学生考勤表
+
             log.info("opsRoom>>>> looker userInfo: {}", JSONObject.toJSONString(userInfo));
         });
 
@@ -459,8 +520,13 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             roomInfo.setSpeakerState(0);
             roomInfo.setJoinRoomTime(now);
             roomInfoCache.set(roomInfo);
+            //查询老师是否有进入过,没有则写老师考勤表的进入时间
+            setTeacherAttendance(userId, roomInfo.getCourseGroupId(), roomInfo.getCourseId());
             return roomInfo;
         }
+        //todo 查询是否是临时直播间,临时直播间可以直接进入教师
+        //todo 校验观看者是否可以进入该房间,查询该学员购买成功则有权限进入该房间
+
 
         //房间累计用户信息-指只要进入到该房间的用户都要记录
         RMap<Long, RoomUserInfoCache> roomTotalUser = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid));
@@ -476,6 +542,8 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             userInfo.setUserId(sysUser.getId());
             userInfo.setUserName(sysUser.getRealName());
             userInfo.setFirstJoinTime(now);
+            //查询学生是否有进入过,没有则写学生考勤表的进入时间
+            setStudentAttendance(userId, roomInfo.getCourseGroupId(), roomInfo.getCourseId());
         }
         userInfo.setState(0);//0:在房间 1:不在房间
         userInfo.setDynamicJoinTime(now);
@@ -485,6 +553,55 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     }
 
     /**
+     * 查询学生是否有进入过,没有则写学生考勤表的进入时间
+     *
+     * @param studentId     学生id
+     * @param courseGroupId 课程组id
+     * @param courseId      课程id
+     */
+    private void setStudentAttendance(Long studentId, Long courseGroupId, Long courseId) {
+        Date now = new Date();
+        //写学生第一次进入时间
+        StudentAttendance studentAttendance = studentAttendanceService.getOne(Wrappers.<StudentAttendance>lambdaQuery()
+                .eq(StudentAttendance::getStudentId, studentId)
+                .eq(StudentAttendance::getCourseScheduleId, courseId));
+        if (Objects.isNull(studentAttendance)) {
+            studentAttendance = new StudentAttendance();
+            studentAttendance.setCourseGroupType(CourseScheduleEnum.LIVE.getCode());
+            studentAttendance.setCourseGroupId(courseGroupId);
+            studentAttendance.setCourseScheduleId(courseId);
+            studentAttendance.setStudentId(studentId);
+            studentAttendance.setSignInTime(now);
+            studentAttendance.setCreateTime(now);
+            studentAttendanceService.save(studentAttendance);
+        }
+    }
+
+    /**
+     * 查询老师是否有进入过,没有则写老师考勤表的进入时间
+     *
+     * @param teacherId     老师id
+     * @param courseGroupId 课程组id
+     * @param courseId      课程id
+     */
+    private void setTeacherAttendance(Long teacherId, Long courseGroupId, Long courseId) {
+        TeacherAttendance teacherAttendance = teacherAttendanceService.getOne(Wrappers.<TeacherAttendance>lambdaQuery()
+                .eq(TeacherAttendance::getTeacherId, teacherId)
+                .eq(TeacherAttendance::getCourseScheduleId, courseId));
+        if (Objects.isNull(teacherAttendance)) {
+            Date now = new Date();
+            teacherAttendance = new TeacherAttendance();
+            teacherAttendance.setTeacherId(teacherId);
+            teacherAttendance.setCourseGroupType(CourseScheduleEnum.LIVE.getCode());
+            teacherAttendance.setCourseGroupId(courseGroupId);
+            teacherAttendance.setCourseScheduleId(courseId);
+            teacherAttendance.setSignInTime(now);
+            teacherAttendance.setCreateTime(now);
+            teacherAttendanceService.save(teacherAttendance);
+        }
+    }
+
+    /**
      * 发送消息
      *
      * @param message
@@ -575,16 +692,15 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
     public Map<String, Object> test(String roomUid) {
         //result
         Map<String, Object> result = new HashMap<>();
-        //{"day":"01","month":"05","year":"2022","singleCourseMinutes":60,"teacherId":4}
-        Map<String, Object> param = new HashMap<>();
-        param.put("day", "05");
-        param.put("month", "05");
-        param.put("year", "2022");
-        param.put("teacherId", "174");
-        param.put("studentId", 164);
-        List<CourseCalendarEntity> courseTimeEntities = courseScheduleService.createPracticeCourseCalender(param);
+//        Map<String, Object> param = new HashMap<>();
+//        param.put("day", "05");
+//        param.put("month", "06");
+//        param.put("year", "2022");
+//        param.put("teacherId", "174");
+//        param.put("studentId", 164);
+//        List<CourseCalendarEntity> courseTimeEntities = courseScheduleService.createPracticeCourseCalender(param);
 //        List<CourseCalendarEntity> courseTimeEntities = courseScheduleService.createLiveCourseCalendar(param);
-        result.put("自动生成课时", courseTimeEntities);
+//        result.put("自动生成课时", courseTimeEntities);
 
         //获取房间信息
         RBucket<RoomInfoCache> speakerCache = redissonClient.getBucket(LIVE_ROOM_INFO.replace(ROOM_UID, roomUid));

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

@@ -61,7 +61,6 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         if (null == detail) {
             return HttpResponseResult.failed("未找到会员卡信息");
         }
-        //插入会员卡信息到会员卡记录表
         OrderCreateRes orderCreateRes = new OrderCreateRes();
         orderCreateRes.setRes(true);
         orderCreateRes.setBizId(detail.getId());

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

@@ -81,7 +81,7 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
 
     @Override
     public AlbumDetailVo detail(IPage<MusicSheetVo> page, MusicAlbumDetailSearch query) {
-        MusicAlbum musicAlbum = this.getById(query.getId());
+        MusicAlbumVo musicAlbum = baseMapper.selectMusicAlbumById(query.getId());
         if (musicAlbum == null) {
             throw  new BizException("未找到专辑信息");
         }
@@ -90,7 +90,10 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
         albumDetailVo.setAlbumName(musicAlbum.getAlbumName());
         albumDetailVo.setAlbumDesc(musicAlbum.getAlbumDesc());
         albumDetailVo.setAlbumTag(musicAlbum.getAlbumTag());
+        albumDetailVo.setAlbumCoverUrl(musicAlbum.getAlbumCoverUrl());
         albumDetailVo.setAlbumStatue(musicAlbum.getAlbumStatus());
+        albumDetailVo.setAlbumFavoriteCount(musicAlbum.getAlbumFavoriteCount());
+        albumDetailVo.setMusicSheetCount(musicAlbum.getMusicSheetCount());
         albumDetailVo.setMusicTagNames(musicTagService.getMusicTagNames(StringUtil.toLongList(musicAlbum.getAlbumTag())));
 
         IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectAlbumDetailPage(page,query);

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

@@ -0,0 +1,28 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dao.TeacherAttendanceDao;
+import com.yonge.cooleshow.biz.dal.entity.TeacherAttendance;
+import com.yonge.cooleshow.biz.dal.service.TeacherAttendanceService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * 老师考勤表(TeacherAttendance)表服务实现类
+ *
+ * @author hgw
+ * @since 2022-05-05 13:51:24
+ */
+@Service("teacherAttendanceService")
+public class TeacherAttendanceServiceImpl extends ServiceImpl<TeacherAttendanceDao, TeacherAttendance> implements TeacherAttendanceService {
+
+    private final static Logger log = LoggerFactory.getLogger(TeacherAttendanceServiceImpl.class);
+
+    @Override
+    public TeacherAttendanceDao getDao() {
+        return this.baseMapper;
+    }
+
+}
+

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

@@ -58,6 +58,8 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
     private LiveRoomService liveRoomService;
     @Autowired
     private StudentStarService studentStarService;
+    @Autowired
+    private UserAccountService userAccountService;
 
     @Override
     public TeacherVo detail(Long userId) {
@@ -190,11 +192,18 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         if (num <= 0) {
             throw new BizException("插入用户信息失败");
         }
+        //设置昵称
+        sysUser.setUsername("游客" + sysUser.getId());
+        employeeDao.updateSysUser(sysUser);
         //插入老师表
         Teacher teacher = new Teacher();
         teacher.setUserId(sysUser.getId());
         teacher = getTeacherDetil(teacher, teacherSubmitReq);
         baseMapper.insert(teacher);
+        //插入老师账户表
+        UserAccount userAccount = new UserAccount();
+        userAccount.setUserId(sysUser.getId());
+        userAccountService.save(userAccount);
         return HttpResponseResult.succeed(true);
     }
 

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

@@ -1,16 +1,31 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
+import com.yonge.cooleshow.biz.dal.enums.TradeStatusEnum;
+import com.yonge.cooleshow.biz.dal.sdk.PaymentSdk;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.utils.string.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderPayment;
 import com.yonge.cooleshow.biz.dal.dao.UserOrderPaymentDao;
 import com.yonge.cooleshow.biz.dal.service.UserOrderPaymentService;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Date;
+import java.util.Map;
+
 
 @Service
 public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao, UserOrderPayment> implements UserOrderPaymentService {
 
+    @Autowired
+    private PaymentSdk paymentSdk;
+
     @Override
     public UserOrderPayment detailByOrderNo(String orderNo) {
         return baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery()
@@ -22,4 +37,88 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
         return baseMapper.selectOne(Wrappers.<UserOrderPayment>lambdaQuery()
                 .eq(UserOrderPayment::getTransNo, transNo));
     }
+
+
+    @Override
+    public UserOrderPayment insertOrderPayment(HttpResponseResult<Map<String, Object>> responseResult, OrderPayReq payReq) {
+        UserOrderPayment orderPayment = new UserOrderPayment();
+        orderPayment.setOrderNo(payReq.getOrderNo());
+        orderPayment.setPayChannel(payReq.getPayChannel());
+        if (responseResult.getStatus()) {
+            Map<String, Object> res = responseResult.getData();
+            orderPayment.setTransNo(res.get("id").toString());
+            orderPayment.setPayAmt(
+                    new BigDecimal(res.get("pay_amt").toString()).setScale(2, RoundingMode.HALF_UP)
+            );
+            String pay_info = ((JSONObject) res.get("expend")).getString("pay_info");
+            orderPayment.setPayInfo(pay_info);
+            orderPayment.setStatus(TradeStatusEnum.pending);
+        } else {
+            orderPayment.setPayFailMsg(responseResult.getMsg());
+            orderPayment.setStatus(TradeStatusEnum.failed);
+        }
+        save(orderPayment);
+        return orderPayment;
+    }
+
+    @Override
+    public UserOrderPayment closePayment(String orderNo, String reason) {
+        UserOrderPayment orderPayment = detailByOrderNo(orderNo);
+        //未创建付款单,直接创建付款单
+        if(null == orderPayment){
+            orderPayment = new UserOrderPayment();
+            orderPayment.setOrderNo(orderNo);
+            orderPayment.setStatus(TradeStatusEnum.failed);
+            orderPayment.setPayFailMsg(StringUtil.isEmpty(reason) ? "交易取消" : reason);
+            orderPayment.setUpdateTime(new Date());
+            save(orderPayment);
+            return orderPayment;
+        }
+        //更新
+        if (!TradeStatusEnum.pending.equals(orderPayment.getStatus())) {
+            return orderPayment;
+        }
+
+        //更新付款单
+        orderPayment.setStatus(TradeStatusEnum.failed);
+        orderPayment.setPayFailMsg(StringUtil.isEmpty(reason) ? "交易取消" : reason);
+        orderPayment.setUpdateTime(new Date());
+
+        //发送支付关单请求
+        if(!StringUtil.isEmpty(orderPayment.getTransNo())){
+            HttpResponseResult<Map<String, Object>> responseResult = paymentSdk.closePayment(orderPayment.getTransNo(), reason, "");
+            if (!responseResult.getStatus()) {
+                orderPayment.setCloseStatus(TradeStatusEnum.failed);
+                orderPayment.setCloseFailMsg(responseResult.getMsg());
+            } else {
+                orderPayment.setCloseStatus(TradeStatusEnum.pending);
+            }
+        }
+        updateById(orderPayment);
+        return orderPayment;
+    }
+
+    @Override
+    public void paymentCloseSucceededHandle(JSONObject hfRes) {
+        UserOrderPayment orderPayment = detailByTransNo(hfRes.getString("payment_id"));
+        if (null == orderPayment) {
+            return;
+        }
+        orderPayment.setCloseStatus(TradeStatusEnum.succeeded);
+        orderPayment.setUpdateTime(new Date());
+        updateById(orderPayment);
+    }
+
+
+    @Override
+    public void paymentCloseFailedHandle(JSONObject hfRes) {
+        UserOrderPayment orderPayment = detailByTransNo(hfRes.getString("payment_id"));
+        if (null == orderPayment) {
+            return;
+        }
+        orderPayment.setStatus(TradeStatusEnum.failed);
+        orderPayment.setPayFailMsg("支付关单回调失败-" + hfRes.getString("error_msg"));
+        orderPayment.setUpdateTime(new Date());
+        updateById(orderPayment);
+    }
 }

+ 65 - 154
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java

@@ -140,8 +140,11 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     @Override
-    public UserOrderVo detail(String orderNo) {
-        UserOrderVo userOrderVo = baseMapper.detailByOrderNo(orderNo);
+    public UserOrderVo detail(String orderNo, Long userId) {
+        UserOrder param = new UserOrder();
+        param.setUserId(userId);
+        param.setOrderNo(orderNo);
+        UserOrderVo userOrderVo = baseMapper.detailByOrderNo(param);
         if (null != userOrderVo) {
             userOrderVo.setOrderDetailList(orderDetailService.getOrderDetilListByOrderNo(userOrderVo.getOrderNo()));
         }
@@ -167,10 +170,14 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<Boolean> orderCancel(OrderPayReq payReq) {
-        UserOrderVo detail = detail(payReq.getOrderNo());
+        UserOrderVo detail = detail(payReq.getOrderNo(), payReq.getUserId());
         if (null == detail) {
             return HttpResponseResult.failed("未找到订单信息");
         }
+        if (!OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())
+                && !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
+            return HttpResponseResult.failed("订单已完成");
+        }
         if (!StringUtil.isEmpty(detail.getTransNo())) {
             try {
                 Map<String, Object> resMap = paymentSdk.queryPayment(detail.getTransNo());
@@ -179,14 +186,14 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                     orderSuccess(detail);
                     return HttpResponseResult.failed("订单已经交易完成");
                 }
-                //关闭订单
-                doOrderCancel(detail, OrderStatusEnum.CLOSE, StringUtil.isEmpty(payReq.getReason()) ? "用户取消订单" : payReq.getReason());
             } catch (Exception e) {
                 e.printStackTrace();
                 log.error("轮询处理支付中订单异常,异常参数: {}", JSONObject.toJSONString(payReq));
                 return HttpResponseResult.failed("取消订单失败");
             }
         }
+        //关闭订单
+        doOrderCancel(detail, OrderStatusEnum.CLOSE, StringUtil.isEmpty(payReq.getReason()) ? "用户取消订单" : payReq.getReason());
         return HttpResponseResult.succeed(true);
 
     }
@@ -208,17 +215,17 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
     @Override
     public void setOrderStatus(String orderNo, OrderStatusEnum orderStatus) {
-        UserOrderVo detail = detail(orderNo);
-        if(OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())
-            || OrderStatusEnum.PAYING.equals(detail.getStatus())){
+        UserOrderVo detail = detail(orderNo, null);
+        if (OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())
+                || OrderStatusEnum.PAYING.equals(detail.getStatus())) {
 
-            if(OrderStatusEnum.CLOSE.equals(orderStatus)){
-                doOrderCancel(detail,orderStatus,"测试接口-订单关闭");
+            if (OrderStatusEnum.CLOSE.equals(orderStatus)) {
+                doOrderCancel(detail, orderStatus, "测试接口-订单关闭");
             }
-            if(OrderStatusEnum.FAIL.equals(orderStatus)){
-                doOrderCancel(detail,orderStatus,"测试接口-订单交易失败");
+            if (OrderStatusEnum.FAIL.equals(orderStatus)) {
+                doOrderCancel(detail, orderStatus, "测试接口-订单交易失败");
             }
-            if(OrderStatusEnum.PAID.equals(orderStatus)){
+            if (OrderStatusEnum.PAID.equals(orderStatus)) {
                 orderSuccess(detail);
             }
         }
@@ -283,7 +290,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<OrderPayRes> orderPay(OrderPayReq payReq) {
         //查询订单
-        UserOrderVo detail = detail(payReq.getOrderNo());
+        UserOrderVo detail = detail(payReq.getOrderNo(), payReq.getUserId());
         if (null == detail || !payReq.getUserId().equals(detail.getUserId())) {
             return HttpResponseResult.failed("订单不存在");
         }
@@ -309,9 +316,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     @Override
     public HttpResponseResult<OrderPayRes> orderPaytoPaying(OrderPayReq payReq) {
         //查询订单
-        UserOrderVo detail = detail(payReq.getOrderNo());
+        UserOrderVo detail = detail(payReq.getOrderNo(), payReq.getUserId());
         if (OrderStatusEnum.PAYING.equals(detail.getStatus())) {
-            //处于付款中状态,需要拉起付款接口返回信息,并且去到汇付
             return orderPayPaying(payReq, detail);
         }
         return HttpResponseResult.failed("订单状态异常");
@@ -326,9 +332,9 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         } else if (type.equals("payment.failed")) {//支付失败
             paymentFailedHandle(hfRes);
         } else if (type.equals("payment.close.succeeded")) {//支付关单成功
-            paymentCloseSucceededHandle(hfRes);
+            orderPaymentService.paymentCloseSucceededHandle(hfRes);
         } else if (type.equals("payment.close.failed")) {//支付关单失败
-            paymentCloseFailedHandle(hfRes);
+            orderPaymentService.paymentCloseFailedHandle(hfRes);
         }
     }
 
@@ -341,14 +347,13 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      */
     private void paymentSucceededHandle(JSONObject hfRes) {
         //订单完成
-        UserOrderVo detail = detail(hfRes.getString("order_no"));
+        UserOrderVo detail = detail(hfRes.getString("order_no"), null);
         if (null == detail) {
             log.error("汇付支付回调,订单未找到。 req is {}", hfRes.toJSONString());
             return;
         }
-        if (!detail.getStatus().equals(OrderStatusEnum.PAID)
-                && !detail.getStatus().equals(OrderStatusEnum.WAIT_PAY)
-                && !detail.getStatus().equals(OrderStatusEnum.CLOSE)) {
+        if (detail.getStatus().equals(OrderStatusEnum.WAIT_PAY)
+                || detail.getStatus().equals(OrderStatusEnum.PAYING)) {
             orderSuccess(detail, hfRes);
         } else {
             log.error("汇付支付回调,订单状态异常。 req is {}", hfRes.toJSONString());
@@ -362,65 +367,19 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      * @updateTime 2022/4/27 15:09
      */
     private void paymentFailedHandle(JSONObject hfRes) {
-        //订单完成
-        UserOrderVo detail = detail(hfRes.getString("order_no"));
-
+        UserOrderVo detail = detail(hfRes.getString("order_no"), null);
         if (null == detail) {
             log.error("汇付支付回调,订单未找到。 req is {}", hfRes.toJSONString());
             return;
         }
-        if (!detail.getStatus().equals(OrderStatusEnum.PAID)
-                && !detail.getStatus().equals(OrderStatusEnum.WAIT_PAY)
-                && !detail.getStatus().equals(OrderStatusEnum.CLOSE)) {
-
-            doOrderCancel(detail, OrderStatusEnum.FAIL, "支付失败");
-            //查询
-            UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(hfRes.getString("order_no"));
-            if (null == orderPayment) {
-                return;
-            }
-            orderPayment.setPayFailMsg("支付回调失败");
-            orderPayment.setStatus(TradeStatusEnum.failed);
-            orderPayment.setUpdateTime(new Date());
-            orderPaymentService.updateById(orderPayment);
+        if (detail.getStatus().equals(OrderStatusEnum.WAIT_PAY)
+                || detail.getStatus().equals(OrderStatusEnum.PAYING)) {
+            doOrderCancel(detail, OrderStatusEnum.FAIL, "支付回调失败");
         } else {
             log.error("汇付支付回调,订单状态异常。 req is {}", hfRes.toJSONString());
         }
     }
 
-    /***
-     * 支付关单成功
-     * @author liweifan
-     * @param: hfRes
-     * @updateTime 2022/4/27 15:33
-     */
-    private void paymentCloseSucceededHandle(JSONObject hfRes) {
-        UserOrderPayment orderPayment = orderPaymentService.detailByTransNo(hfRes.getString("payment_id"));
-        if (null == orderPayment) {
-            return;
-        }
-        orderPayment.setCloseStatus(TradeStatusEnum.succeeded);
-        orderPayment.setUpdateTime(new Date());
-        orderPaymentService.updateById(orderPayment);
-    }
-
-    /***
-     * 支付关单失败
-     * @author liweifan
-     * @param: hfRes
-     * @updateTime 2022/4/27 15:33
-     */
-    private void paymentCloseFailedHandle(JSONObject hfRes) {
-        UserOrderPayment orderPayment = orderPaymentService.detailByTransNo(hfRes.getString("payment_id"));
-        if (null == orderPayment) {
-            return;
-        }
-        orderPayment.setStatus(TradeStatusEnum.failed);
-        orderPayment.setPayFailMsg("支付关单回调失败-" + hfRes.getString("error_msg"));
-        orderPayment.setUpdateTime(new Date());
-        orderPaymentService.updateById(orderPayment);
-    }
-
     @Override
     public void pollingOrder() {
         //查询半小时前创建的并且还未完成的订单 WAIT_PAY 待支付订单 PAYING 支付中订单
@@ -450,10 +409,14 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
     @Transactional(rollbackFor = Exception.class)
     void pollingCancelOrder(String orderNo) {
-        UserOrderVo detail = detail(orderNo);
+        UserOrderVo detail = detail(orderNo, null);
         if (null == detail) {
             return;
         }
+        if (!OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())
+                && !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
+            return;
+        }
         if (!StringUtil.isEmpty(detail.getTransNo())) {
             try {
                 Map<String, Object> resMap = paymentSdk.queryPayment(detail.getTransNo());
@@ -464,13 +427,13 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                     orderSuccess(detail);
                     return;
                 }
-                //关闭订单
-                doOrderCancel(detail, OrderStatusEnum.CLOSE, "订单超时");
             } catch (Exception e) {
                 e.printStackTrace();
                 return;
             }
         }
+        //关闭订单
+        doOrderCancel(detail, OrderStatusEnum.CLOSE, "订单超时");
     }
 
     /***
@@ -482,6 +445,17 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes>
      */
     private HttpResponseResult<OrderPayRes> orderPayWaitPay(OrderPayReq payReq, UserOrderVo detail) {
+        OrderPayRes orderPayRes = new OrderPayRes();
+
+        UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(payReq.getOrderNo());
+        if (null != orderPayment && TradeStatusEnum.pending.equals(orderPayment.getStatus())
+                && !StringUtil.isEmpty(orderPayment.getPayInfo())) {
+            orderPayRes.setPay_amt(orderPayment.getPayAmt().toString());
+            orderPayRes.setPay_info(orderPayment.getPayInfo());
+            orderPayRes.setPayChannel(orderPayment.getPayChannel());
+            return HttpResponseResult.succeed(orderPayRes);
+        }
+
         PaymentReq paymentReq = new PaymentReq();
         paymentReq.setOrder_no(payReq.getOrderNo());
         paymentReq.setPay_channel(payReq.getPayChannel().getCode());
@@ -496,6 +470,11 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         //异步通知地址
         paymentReq.setNotify_url(HuifuConfiguration.getHuifuProperties().getNotifyUrl());
 
+        if (PayChannelEnum.alipay_lite.equals(payReq.getPayChannel())) {
+            Map<String, Object> expend = new HashMap<>();
+            expend.put("buyer_id", payReq.getBuyerId());
+            paymentReq.setExpend(expend);
+        }
         if (PayChannelEnum.wx_lite.equals(payReq.getPayChannel())) {
             Map<String, Object> expend = new HashMap<>();
             expend.put("open_id", payReq.getOpenId());
@@ -504,76 +483,21 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         //付款请求
         HttpResponseResult<Map<String, Object>> responseResult = paymentSdk.executePayment(paymentReq);
         if (responseResult.getStatus()) {
-            OrderPayRes orderPayRes = new OrderPayRes();
             orderPayRes.setPay_amt(detail.getActualPrice().setScale(2, RoundingMode.HALF_UP).toString());
             String pay_info = ((JSONObject) responseResult.getData().get("expend")).getString("pay_info");
             orderPayRes.setPay_info(pay_info);
             orderPayRes.setPayChannel(payReq.getPayChannel());
 
             //入订单付款表,同时修改订单状态
-            insertOrderPayment(responseResult, payReq);
+            orderPaymentService.insertOrderPayment(responseResult, payReq);
+
             baseMapper.updateStatusByOrderNo(payReq.getOrderNo(), OrderStatusEnum.PAYING.getCode());
             return HttpResponseResult.succeed(orderPayRes);
         } else {
             //入订单付款表,同时修改订单状态
-            doOrderCancel(detail, OrderStatusEnum.FAIL, "订单超时");
-            errOrderPayment(responseResult, payReq);
+            doOrderCancel(detail, OrderStatusEnum.FAIL, responseResult.getMsg());
             return HttpResponseResult.failed(responseResult.getMsg());
         }
-
-    }
-
-    /***
-     * 插入订单付款单
-     * @author liweifan
-     * @param: res
-     * @param: payReq
-     * @updateTime 2022/4/13 17:56
-     * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
-     */
-    private UserOrderPayment insertOrderPayment(HttpResponseResult<Map<String, Object>> responseResult, OrderPayReq payReq) {
-        UserOrderPayment orderPayment = new UserOrderPayment();
-        orderPayment.setOrderNo(payReq.getOrderNo());
-        orderPayment.setPayChannel(payReq.getPayChannel());
-        if (responseResult.getStatus()) {
-            Map<String, Object> res = responseResult.getData();
-            orderPayment.setTransNo(res.get("id").toString());
-            orderPayment.setPayAmt(
-                    new BigDecimal(res.get("pay_amt").toString()).setScale(2, RoundingMode.HALF_UP)
-            );
-            String pay_info = ((JSONObject) res.get("expend")).getString("pay_info");
-            orderPayment.setPayInfo(pay_info);
-            orderPayment.setStatus(TradeStatusEnum.pending);
-        } else {
-            orderPayment.setPayFailMsg(responseResult.getMsg());
-            orderPayment.setStatus(TradeStatusEnum.failed);
-        }
-        orderPaymentService.save(orderPayment);
-        return orderPayment;
-    }
-
-    /***
-     * 处理付款请求失败
-     * @author liweifan
-     * @param: res
-     * @param: payReq
-     * @updateTime 2022/4/13 17:56
-     * @return: com.yonge.cooleshow.biz.dal.entity.UserOrderPayment
-     */
-    private UserOrderPayment errOrderPayment(HttpResponseResult<Map<String, Object>> responseResult, OrderPayReq payReq) {
-        //查询
-        UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(payReq.getOrderNo());
-        if (null == orderPayment) {
-            orderPayment = new UserOrderPayment();
-            orderPayment.setOrderNo(payReq.getOrderNo());
-            orderPayment.setPayChannel(payReq.getPayChannel());
-        }
-        orderPayment.setPayFailMsg(responseResult.getMsg());
-        orderPayment.setStatus(TradeStatusEnum.failed);
-        orderPayment.setUpdateTime(new Date());
-
-        orderPaymentService.saveOrUpdate(orderPayment);
-        return orderPayment;
     }
 
     /***
@@ -754,7 +678,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      */
     @Transactional(rollbackFor = Exception.class)
     void doOrderCancel(UserOrderVo userOrder, OrderStatusEnum orderStatus, String reason) {
-        //已经取消过的订单,不能再取消
+        //已经完成过的订单,不能再取消
         if (!OrderStatusEnum.WAIT_PAY.equals(userOrder.getStatus())
                 && !OrderStatusEnum.PAYING.equals(userOrder.getStatus())) {
             return;
@@ -780,25 +704,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         userOrder.setUpdateTime(new Date());
         baseMapper.updateById(userOrder);
 
-
-        UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(userOrder.getOrderNo());
-        if (null != orderPayment) {
-            //更新付款单
-            orderPayment.setStatus(TradeStatusEnum.failed);
-            orderPayment.setPayFailMsg(StringUtil.isEmpty(reason) ? "交易取消" : reason);
-            orderPayment.setUpdateTime(new Date());
-        }
-        //发送支付关单请求
-        HttpResponseResult<Map<String, Object>> responseResult = paymentSdk.closePayment(userOrder.getTransNo(), reason, "");
-        if (!responseResult.getStatus()) {
-            orderPayment.setCloseStatus(TradeStatusEnum.failed);
-            orderPayment.setCloseFailMsg(responseResult.getMsg());
-            orderPaymentService.updateById(orderPayment);
-            return;
-        } else {
-            orderPayment.setCloseStatus(TradeStatusEnum.pending);
-            orderPaymentService.updateById(orderPayment);
-        }
+        orderPaymentService.closePayment(userOrder.getOrderNo(), reason);
     }
 
     void orderSuccess(UserOrderVo detail) {
@@ -814,6 +720,11 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
      */
     @Transactional(rollbackFor = Exception.class)
     void orderSuccess(UserOrderVo detail, JSONObject hfRes) {
+        //订单已完成
+        if (!OrderStatusEnum.WAIT_PAY.equals(detail.getStatus())
+                && !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
+            return;
+        }
         Date now = new Date();
         detail.setStatus(OrderStatusEnum.PAID);
         detail.setPayTime(now);
@@ -827,7 +738,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             orderPayment.setUpdateTime(now);
             if (null != hfRes) {
                 try {
-                    orderPayment.setPayAmt(new BigDecimal(hfRes.getString("pay_amt")));
+                    orderPayment.setBackPayAmt(new BigDecimal(hfRes.getString("pay_amt")));
                     orderPayment.setFeeAmt(new BigDecimal(hfRes.getString("fee_amt")));
                 } catch (Exception e) {
                     e.printStackTrace();

+ 21 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonGroupDetailServiceImpl.java

@@ -1,10 +1,12 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.VideoLessonGroupDao;
 import com.yonge.cooleshow.biz.dal.dao.VideoLessonPurchaseRecordDao;
+import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonGroupSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.VideoLessonSearch;
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
@@ -13,6 +15,9 @@ import com.yonge.cooleshow.biz.dal.dao.VideoLessonGroupDetailDao;
 
 import com.yonge.cooleshow.biz.dal.entity.VideoLessonPurchaseRecord;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.service.UserOrderService;
 import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupDetailService;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.common.exception.BizException;
@@ -24,10 +29,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 /**
  * VideoLessonGroupDetailService服务实现类
@@ -46,6 +48,8 @@ public class VideoLessonGroupDetailServiceImpl extends ServiceImpl<VideoLessonGr
     private VideoLessonGroupDao videoLessonGroupDao;
     @Autowired
     private VideoLessonPurchaseRecordDao videoLessonPurchaseRecordDao;
+    @Autowired
+    private UserOrderService orderService;
 
     public VideoLessonGroupDetailDao getDao() {
         return videoLessonGroupDetailDao;
@@ -142,10 +146,20 @@ public class VideoLessonGroupDetailServiceImpl extends ServiceImpl<VideoLessonGr
         VideoLessonStudentVo lessonStudentVo = new VideoLessonStudentVo();
 
         //校验课程是否购买
-        VideoLessonPurchaseRecord isAlreadyBuy= videoLessonPurchaseRecordDao.selectOne(Wrappers.<VideoLessonPurchaseRecord>lambdaQuery()
+
+        //这里修改为,订单完成后才算购买过,待支付和支付中订单不算
+        //因为页面再点击购买按钮时,会请求/userOrder/getPendingOrder接口,如果有支付中的订单,用户选择继续支付或取消订单
+        OrderSearch param = new OrderSearch();
+        param.setUserId(userId);
+        param.setGoodType(GoodTypeEnum.VIDEO.getCode());
+        param.setBizId(groupId);
+        param.setStatus(OrderStatusEnum.PAID.getCode());
+        List<UserOrderVo> userOrderVos = orderService.selectList(param);
+
+        /*VideoLessonPurchaseRecord isAlreadyBuy= videoLessonPurchaseRecordDao.selectOne(Wrappers.<VideoLessonPurchaseRecord>lambdaQuery()
                 .eq(VideoLessonPurchaseRecord::getStudentId, userId)
-                .eq(VideoLessonPurchaseRecord::getVideoLessonGroupId, groupId));
-        lessonStudentVo.setAlreadyBuy(!ObjectUtil.isEmpty(isAlreadyBuy));
+                .eq(VideoLessonPurchaseRecord::getVideoLessonGroupId, groupId));*/
+        lessonStudentVo.setAlreadyBuy(!CollectionUtils.isEmpty(userOrderVos));
 
         VideoLessonGroupSearch query = new VideoLessonGroupSearch();
         //筛选已审核的视频课

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

@@ -12,6 +12,7 @@ import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.service.VideoLessonGroupService;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.common.exception.BizException;
+import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -208,7 +209,7 @@ public class VideoLessonGroupServiceImpl extends ServiceImpl<VideoLessonGroupDao
         VideoLessonGroupSearch query = new VideoLessonGroupSearch();
         query.setGroupId(groupId);
         List<VideoLessonGroupVo> lessonGroup = videoLessonGroupDao.selectPage(null, query);
-        if (lessonGroup.isEmpty()) {
+        if (CollectionUtils.isEmpty(lessonGroup)) {
             return lessonStudentVo;
         }
         lessonStudentVo.setLessonGroup(lessonGroup.get(0));

+ 40 - 14
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java

@@ -166,13 +166,14 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         userAccountService.accountChange(userAccountRecord);
         log.info("buyVideoCourseSuccess ok");
 
-        try {
-            videoSend(teacherId, studentId, lessonGroup.getLessonName());
-        } catch (Exception e) {
-            log.error("视频课消息推送失败");
-        }
+        videoSend(teacherId, studentId, lessonGroup.getLessonName());
     }
 
+    /**
+     * @Description: 购买视频课消息推送
+     * @Author: cy
+     * @Date: 2022/5/6
+     */
     public void videoSend(Long teacherId, Long studentId, String lessonName) {
         //查询老师&学生信息
         SysUser teacher = sysUserFeignService.queryUserById(teacherId);
@@ -183,17 +184,42 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         teacherReceivers.put(teacherId, teacher.getPhone());
         Map<Long, String> studentReceivers = new HashMap<>();
         studentReceivers.put(studentId, student.getPhone());
+        Map<Long, String> studentSMS = new HashMap<>();
+        studentSMS.put(studentId, student.getPhone());
+
+        //老师端-学生购买视频课
+        try {
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_BUY_VIDEO,
+                    teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
+                    student.getUsername(), lessonName);
+            log.info("send success {}", MessageTypeEnum.STUDENT_BUY_VIDEO);
+        } catch (Exception e) {
+            log.error("send fail {}", MessageTypeEnum.STUDENT_BUY_VIDEO);
+            e.printStackTrace();
+        }
 
-        //消息推送-老师端
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_BUY_VIDEO,
-                teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
-                student.getUsername(), lessonName);
+        //学生端-购买视频课
+        try {
+            String url = sysMessageService.selectConfigUrl(MessageTypeEnum.VIDEO_BUY.getCode());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIDEO_BUY,
+                    studentReceivers, null, 0, null, ClientEnum.STUDENT.getCode(),
+                    teacher.getUsername(), lessonName, url);
+            log.info("send success {}", MessageTypeEnum.VIDEO_BUY);
+        } catch (Exception e) {
+            log.error("send fail {}", MessageTypeEnum.VIDEO_BUY);
+            e.printStackTrace();
+        }
 
-        //消息推送-学生端
-        String url = sysMessageService.selectConfigUrl(MessageTypeEnum.VIDEO_BUY.getCode());
-        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.VIDEO_BUY,
-                studentReceivers, null, 0, null, ClientEnum.STUDENT.getCode(),
-                teacher.getUsername(), lessonName, url);
+        //学生端-购买视频课(短信)
+        try {
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_VIDEO_BUY,
+                    studentSMS, null, 0, null, null,
+                    teacher.getUsername(), lessonName);
+            log.info("sms send success {}", MessageTypeEnum.SMS_VIDEO_BUY);
+        } catch (Exception e) {
+            log.error("sms send fail {}", MessageTypeEnum.SMS_VIDEO_BUY);
+            e.printStackTrace();
+        }
     }
 
     /**

+ 37 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/AlbumAndSheetVo.java

@@ -0,0 +1,37 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.toolset.base.page.PageInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-05-06
+ */
+@ApiModel("专辑和曲目列表")
+public class AlbumAndSheetVo {
+
+    @ApiModelProperty("曲目信息")
+    private PageInfo<MusicSheetVo> musicSheetList;
+
+    @ApiModelProperty("专辑信息")
+    private PageInfo<MusicAlbumVo> musicAlbumList;
+
+    public PageInfo<MusicSheetVo> getMusicSheetList() {
+        return musicSheetList;
+    }
+
+    public void setMusicSheetList(PageInfo<MusicSheetVo> musicSheetList) {
+        this.musicSheetList = musicSheetList;
+    }
+
+    public PageInfo<MusicAlbumVo> getMusicAlbumList() {
+        return musicAlbumList;
+    }
+
+    public void setMusicAlbumList(PageInfo<MusicAlbumVo> musicAlbumList) {
+        this.musicAlbumList = musicAlbumList;
+    }
+}

+ 23 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/AlbumDetailVo.java

@@ -36,6 +36,29 @@ public class AlbumDetailVo {
     @ApiModelProperty("教材标签")
     private String musicTagNames;
 
+    @ApiModelProperty("曲目数量")
+    private Integer musicSheetCount;
+
+    @ApiModelProperty("收藏数量")
+    private Integer albumFavoriteCount;
+
+
+    public Integer getMusicSheetCount() {
+        return musicSheetCount;
+    }
+
+    public void setMusicSheetCount(Integer musicSheetCount) {
+        this.musicSheetCount = musicSheetCount;
+    }
+
+    public Integer getAlbumFavoriteCount() {
+        return albumFavoriteCount;
+    }
+
+    public void setAlbumFavoriteCount(Integer albumFavoriteCount) {
+        this.albumFavoriteCount = albumFavoriteCount;
+    }
+
     public YesOrNoEnum getAlbumStatue() {
         return albumStatue;
     }

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CountVo.java

@@ -12,6 +12,15 @@ public class CountVo {
 
     @ApiModelProperty("数量")
     private Integer count;
+    private String type;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
 
     public Integer getCount() {
         return count;

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseGroupVo.java

@@ -47,6 +47,9 @@ public class CourseGroupVo implements Serializable {
     @ApiModelProperty(value = "老师名称")
     private String teacherName;
 
+    @ApiModelProperty(value = "昵称")
+    private String userName;
+
     @ApiModelProperty(value = "课程组售价")
     private BigDecimal coursePrice;
 
@@ -156,6 +159,14 @@ public class CourseGroupVo implements Serializable {
         this.teacherName = teacherName;
     }
 
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
     public BigDecimal getCoursePrice() {
         return coursePrice;
     }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/LiveCourseInfoVo.java

@@ -87,6 +87,9 @@ public class LiveCourseInfoVo extends CourseGroupVo implements Serializable {
         @ApiModelProperty(value = "学员名称")
         private String studentName;
 
+        @ApiModelProperty(value = "昵称")
+        private String userName;
+
         @ApiModelProperty(value = "头像")
         private String avatar;
 
@@ -110,6 +113,14 @@ public class LiveCourseInfoVo extends CourseGroupVo implements Serializable {
             this.studentName = studentName;
         }
 
+        public String getUserName() {
+            return userName;
+        }
+
+        public void setUserName(String userName) {
+            this.userName = userName;
+        }
+
         public String getAvatar() {
             return avatar;
         }

+ 20 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentHomePage.java

@@ -147,6 +147,26 @@ public class StudentHomePage implements Serializable {
         private Integer courseNum;
         @ApiModelProperty(value = "购买人数")
         private Integer buyCount;
+        @ApiModelProperty(value = "声部id")
+        private Integer subjectId;
+        @ApiModelProperty(value = "声部名称")
+        private String subjectName;
+
+        public Integer getSubjectId() {
+            return subjectId;
+        }
+
+        public void setSubjectId(Integer subjectId) {
+            this.subjectId = subjectId;
+        }
+
+        public String getSubjectName() {
+            return subjectName;
+        }
+
+        public void setSubjectName(String subjectName) {
+            this.subjectName = subjectName;
+        }
 
         public String getRealName() {
             return realName;

+ 5 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseGroupMapper.xml

@@ -47,7 +47,7 @@
     </insert>
 
     <select id="queryTeacherCourseGroup" resultType="com.yonge.cooleshow.biz.dal.vo.CourseGroupVo">
-        select
+        select distinct
         b.id_                         as courseGroupId,
         b.name_                       as courseGroupName,
         s.name_                       as subjectName,
@@ -64,10 +64,13 @@
         b.sales_start_date_           as salesStartDate,
         b.sales_end_date_             as salesEndDate,
         b.mix_student_num_            as mixStudentNum,
-        b.im_group_id_              as imGroupId
+        b.im_group_id_              as imGroupId,
+        if(o.status_ = 'PAID', 1, 0)  as existBuy
         from course_group as b
         left join subject as s on b.subject_id_ = s.id_
         left join sys_user as u on b.teacher_id_ = u.id_
+        left join user_order_detail as d on b.id_ = d.biz_id_
+        left join user_order as o on d.order_no_ = o.order_no_
         <where>
             <if test="param.teacherId != null">
                 and b.teacher_id_ = #{param.teacherId}

+ 45 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -108,6 +108,12 @@
             <if test="param.status != null">
                 AND b.status_ = #{param.status}
             </if>
+            <if test="param.statusList != null">
+                AND b.status_ IN
+                <foreach collection="param.statusList" item="item" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
         </where>
         order by b.start_time_ desc
     </select>
@@ -491,9 +497,12 @@
             g.course_start_time_ AS courseStartTime,
             g.background_pic_ AS backgroundPic,
             g.course_num_ AS courseNum,
-            g.pre_student_num_ AS buyCount
+            g.pre_student_num_ AS buyCount,
+            g.subject_id_ AS subjectId,
+            s.name_ AS subjectName
         FROM course_group g
         LEFT JOIN sys_user u ON g.teacher_id_=u.id_
+        LEFT JOIN subject s ON g.subject_id_=s.id_
         WHERE type_='LIVE' and g.status_ = 'APPLY'
         ORDER BY courseStartTime DESC LIMIT 4
     </select>
@@ -540,7 +549,26 @@
         ORDER BY ABS(NOW() - s.start_time_) ASC
         limit 1
     </select>
-
+    <select id="selectRecentCoursesTeacher" resultType="com.yonge.cooleshow.biz.dal.vo.StudentHomePage$RecentCourses">
+        SELECT
+            u.id_ AS teacherId,
+            u.username_ AS teacherName,
+            u.real_name_ AS realName,
+            u.avatar_ AS avatar,
+            s.course_group_id_ AS courseGroupId,
+            s.id_ AS courseId,
+            g.name_ AS courseGroupName,
+            s.type_ AS courseType,
+            s.status_ AS `status`,
+            s.start_time_ AS courseStartTime
+        FROM course_schedule s
+        LEFT JOIN sys_user u ON s.teacher_id_=u.id_
+        LEFT JOIN course_group g ON s.course_group_id_=g.id_
+        WHERE s.teacher_id_=#{teacherId}
+        AND s.status_ = 'NOT_START'
+        ORDER BY ABS(NOW() - s.start_time_) ASC
+        limit 1
+    </select>
     <select id="selectWeekNotStartCourseSchedule" resultType="java.lang.Integer">
         select count(1)
         from course_schedule cs
@@ -578,4 +606,19 @@
         LEFT JOIN course_schedule s ON p.course_id_=s.id_
         WHERE p.order_no_=#{orderNo}
     </select>
+    <select id="selectTeacher" resultType="com.yonge.cooleshow.auth.api.entity.SysUser"
+            parameterType="java.lang.String">
+        SELECT s.teacher_id_ AS id,u.phone_ AS phone
+        FROM course_schedule s
+        LEFT JOIN sys_user u ON s.teacher_id_=u.id_
+        WHERE class_date_=#{tomorrow} AND lock_=0
+        GROUP BY s.teacher_id_
+    </select>
+    <select id="selectTypeCount" resultType="com.yonge.cooleshow.biz.dal.vo.CountVo">
+        SELECT type_ AS type, COUNT(1) AS count
+        FROM course_schedule
+        WHERE class_date_=#{tomorrow}
+        AND teacher_id_=#{teacherId} AND lock_=0
+        GROUP BY type_
+    </select>
 </mapper>

+ 10 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml

@@ -44,14 +44,22 @@
         </where>
     </select>
 
-    <select id="queryStudentInfoByGroupId" resultType="com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo$CourseBuyStudentVo">
+    <select id="queryStudentInfoByGroupId" parameterType="map" resultType="com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo$CourseBuyStudentVo">
         select distinct a.user_id_      as studentId,
                b.real_name_    as studentName,
+               b.username_    as userName,
                b.avatar_ as avatar,
                a.created_time_ as createTime
         from course_schedule_student_payment as a
                  left join sys_user as b on a.user_id_ = b.id_
-        where a.course_group_id_ = #{groupId}
+                 left join user_order as o on a.order_no_ = o.order_no_
+        where a.course_group_id_ = #{param.groupId}
+        <if test="param.orderState != null and param.orderState != ''">
+            AND o.status_ = #{param.orderState}
+        </if>
+        <if test="param.userId != null and param.userId != ''">
+            AND a.user_id_ = #{param.userId}
+        </if>
     </select>
     <select id="selectAll" resultType="java.lang.Long">
         SELECT user_id_ FROM course_schedule_student_payment WHERE course_type_ = 'PRACTICE'

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

@@ -29,6 +29,7 @@
 			<include refid="baseColumns"/>,
 			ifnull(u.real_name_,u.username_) modifierName
 		FROM member_price_settings t
+		LEFT JOIN sys_user u on t.update_by_ = u.id_
 		where t.id_ = #{id}
 	</select>
 

+ 12 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicAlbumMapper.xml

@@ -123,4 +123,16 @@
             </foreach>
         </if>
     </select>
+
+    <select id="selectMusicAlbumById" resultType="com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo">
+        select <include refid="Base_Column_List"/>
+        ,(select group_concat(mt.name_) from music_tag mt
+        where find_in_set(mt.id_,t.album_tag_) and mt.del_flag_ = 0) as musicTagNames
+        , t1.num as musicSheetCount
+        ,t2.num as albumFavoriteCount
+        from music_album t
+        left join (select count(1) as num,amr.album_id_ from album_music_relate amr group by amr.album_id_) t1 on t1.album_id_ = t.id_
+        left join (select count(1) as num,af.album_id_ from album_favorite af group by af.album_id_) t2 on t2.album_id_ = t.id_
+        where t.id_ = #{musicAlbumId}
+    </select>
 </mapper>

+ 33 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherAttendanceMapper.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yonge.cooleshow.biz.dal.dao.TeacherAttendanceDao">
+    <resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.TeacherAttendance">
+        <id column="id_" jdbcType="INTEGER" property="id"/>
+        <result column="teacher_id_" jdbcType="INTEGER" property="teacherId"/>
+        <result column="course_group_type_" jdbcType="VARCHAR" property="courseGroupType"/>
+        <result column="course_group_id_" jdbcType="INTEGER" property="courseGroupId"/>
+        <result column="course_schedule_id_" jdbcType="INTEGER" property="courseScheduleId"/>
+        <result column="sign_in_time_" jdbcType="TIMESTAMP" property="signInTime"/>
+        <result column="sign_out_time_" jdbcType="TIMESTAMP" property="signOutTime"/>
+        <result column="create_time_" jdbcType="TIMESTAMP" property="createTime"/>
+        <result column="update_time_" jdbcType="TIMESTAMP" property="updateTime"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id_
+        , teacher_id_, course_group_type_, course_group_id_, course_schedule_id_, sign_in_time_, sign_out_time_,
+        create_time_, update_time_
+    </sql>
+
+    <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
+            parameterType="com.yonge.cooleshow.biz.dal.entity.TeacherAttendance">
+        insert into teacher_attendance(teacher_id_, course_group_type_, course_group_id_, course_schedule_id_,
+        sign_in_time_, sign_out_time_, create_time_, update_time_)
+        values
+        <foreach collection="entities" item="entity" separator=",">
+            (#{entity.teacherId}, #{entity.courseGroupType}, #{entity.courseGroupId}, #{entity.courseScheduleId},
+            #{entity.signInTime}, #{entity.signOutTime}, #{entity.createTime}, #{entity.updateTime})
+        </foreach>
+    </insert>
+
+</mapper>

+ 44 - 26
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml

@@ -44,6 +44,18 @@
 
     <select id="detailById" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
         SELECT
+            <include refid="baseColumns"/>,
+            p.trans_no_ as transNo,
+            p.fee_amt_ as feeAmt,
+            u.username_ as username,
+            u.phone_ as phone
+        FROM user_order t
+        left join user_order_payment p on t.order_no_ = p.order_no_
+        left join sys_user u on t.user_id_ = u.id_
+        where t.id_ = #{id}
+    </select>
+    <select id="detailByOrderNo" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
+        SELECT
         <include refid="baseColumns"/>,
         p.trans_no_ as transNo,
         p.fee_amt_ as feeAmt,
@@ -52,14 +64,17 @@
         FROM user_order t
         left join user_order_payment p on t.order_no_ = p.order_no_
         left join sys_user u on t.user_id_ = u.id_
-        where t.id_ = #{id}
+        where t.order_no_ = #{param.orderNo}
+        <if test="param.userId != null">
+            and t.user_id_ = #{param.userId}
+        </if>
     </select>
 
     <select id="detailApp" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
         SELECT
-        <include refid="baseColumns"/>,
-        p.trans_no_ as transNo,
-        p.pay_channel_ as payChannel
+            <include refid="baseColumns"/>,
+            p.trans_no_ as transNo,
+            p.pay_channel_ as payChannel
         FROM user_order t
         left join user_order_payment p on t.order_no_ = p.order_no_
         where t.user_id_ = #{param.userId}
@@ -71,27 +86,16 @@
         </if>
     </select>
 
-    <select id="detailByOrderNo" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
-        SELECT
-        <include refid="baseColumns"/>,
-        p.trans_no_ as transNo,
-        p.fee_amt_ as feeAmt,
-        u.username_ as username,
-        u.phone_ as phone
-        FROM user_order t
-        left join user_order_payment p on t.order_no_ = p.order_no_
-        left join sys_user u on t.user_id_ = u.id_
-        where t.order_no_ = #{orderNo}
-    </select>
+
 
 
     <sql id="selectSql">
         SELECT
-        <include refid="baseColumns"/>,
-        p.trans_no_ as transNo,
-        p.fee_amt_ as feeAmt,
-        u.username_ as username,
-        u.phone_ as phone
+            <include refid="baseColumns"/>,
+            p.trans_no_ as transNo,
+            p.fee_amt_ as feeAmt,
+            u.username_ as username,
+            u.phone_ as phone
         FROM user_order t
         left join user_order_payment p on t.order_no_ = p.order_no_
         left join sys_user u on t.user_id_ = u.id_
@@ -105,8 +109,8 @@
             </if>
             <if test="null != param.searchNo and '' != param.searchNo">
                 AND (
-                t.order_no_ LIKE CONCAT('%', #{param.search}, '%') or
-                p.trans_no_ LIKE CONCAT('%', #{param.search}, '%')
+                t.order_no_ LIKE CONCAT('%', #{param.searchNo}, '%') or
+                p.trans_no_ LIKE CONCAT('%', #{param.searchNo}, '%')
                 )
             </if>
             <if test="null != param.orderType and '' != param.orderType">
@@ -124,6 +128,20 @@
             <if test="param.userId !=null">
                 AND t.user_id_ = #{param.userId}
             </if>
+            <if test="param.merchId !=null or (param.goodType !=null and param.goodType !='') or param.bizId !=null">
+                AND exists(
+                    select 1 from user_order_detail d where t.order_no_ = d.order_no_
+                    <if test="param.merchId !=null ">
+                        and d.merch_id_ = #{param.merchId}
+                    </if>
+                    <if test="param.goodType !=null and param.goodType !=''">
+                        and d.good_type_ = #{param.goodType}
+                    </if>
+                    <if test="param.bizId !=null">
+                        and d.biz_id_ = #{param.bizId}
+                    </if>
+                )
+            </if>
         </where>
         order by t.create_time_ desc
     </sql>
@@ -146,9 +164,9 @@
     </select>
     <select id="getPendingOrder" resultType="com.yonge.cooleshow.biz.dal.vo.UserOrderVo">
         SELECT
-        <include refid="baseColumns"/>,
-        p.trans_no_ as transNo,
-        p.pay_channel_ as payChannel
+            <include refid="baseColumns"/>,
+            p.trans_no_ as transNo,
+            p.pay_channel_ as payChannel
         FROM user_order t
         left join user_order_payment p on t.order_no_ = p.order_no_
         where t.status_ in ('WAIT_PAY','PAYING')

+ 2 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml

@@ -7,6 +7,7 @@
         <result column="trans_no_" property="transNo" />
         <result column="pay_channel_" property="payChannel" />
         <result column="pay_amt_" property="payAmt" />
+        <result column="back_pay_amt_" property="backPayAmt" />
         <result column="fee_amt_" property="feeAmt" />
         <result column="pay_info_" property="payInfo" />
         <result column="status_" property="status" />
@@ -25,6 +26,7 @@
         , t.trans_no_ as transNo
         , t.pay_channel_ as payChannel
         , t.pay_amt_ as payAmt
+        , t.back_pay_amt_ as backPayAmt
         , t.fee_amt_ as feeAmt
         , t.pay_info_ as payInfo
         , t.status_ as status

+ 7 - 3
cooleshow-user/user-biz/src/main/resources/config/mybatis/VideoLessonGroupMapper.xml

@@ -192,10 +192,11 @@
 			u.real_name_ AS realName,
 			p.pay_money_ AS payMoney,
 			p.order_no_ AS orderNo,
-			p.purchase_time_ AS purchaseTime
+			o.pay_time_ AS purchaseTime
 		FROM video_lesson_purchase_record p
 		LEFT JOIN sys_user u ON p.student_id_ = u.id_
-		<where>
+		LEFT JOIN user_order o ON p.order_no_ = o.order_no_
+		WHERE p.order_status_='PAID'
 			<if test="param.videoLessonGroupId !=null">
 				AND p.video_lesson_group_id_ = #{param.videoLessonGroupId}
 			</if>
@@ -215,7 +216,6 @@
 			<if test="param.endTime !=null">
 				<![CDATA[AND p.purchase_time_ <= #{param.endTime} ]]>
 			</if>
-		</where>
 	</select>
 	<select id="selectLessonGroup" resultType="com.yonge.cooleshow.biz.dal.vo.LessonGroupVo">
 		SELECT
@@ -249,6 +249,9 @@
 				g.id_ IN
 				(SELECT video_lesson_group_id_ FROM video_lesson_purchase_record WHERE student_id_=#{param.studentId} AND order_status_='PAID')
 			</if>
+			<if	test="param.teacherId != null">
+				AND g.teacher_id_ = #{param.teacherId}
+			</if>
 		</where>
 		ORDER BY g.create_time_ DESC
 	</select>
@@ -290,5 +293,6 @@
 				<![CDATA[AND g.create_time_ <= #{param.endTime} ]]>
 			</if>
 		</where>
+		ORDER BY g.create_time_ DESC
 	</select>
 </mapper>

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

@@ -43,7 +43,10 @@
         select
             <include refid="baseColumns"/>,
             u.phone_ as phone
-        from vip_card_record t
+        from (
+            select max(id_) as id_ from vip_card_record group by user_id_
+        ) a
+        left join vip_card_record t on a.id_ = t.id_
         left join sys_user u on t.user_id_ = u.id_
         where t.end_time_ &gt;= now()
         and t.end_time_ &lt; DATE_ADD(now(),INTERVAL 3 DAY)

+ 37 - 3
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java

@@ -5,14 +5,15 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.auth.api.enums.SysUserType;
+import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
+import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
-import com.yonge.cooleshow.biz.dal.vo.CheckVo;
-import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
-import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
+import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
@@ -22,6 +23,7 @@ import com.yonge.toolset.utils.string.StringUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -43,6 +45,8 @@ public class MusicSheetController extends BaseController {
 	@Autowired
 	private MusicSheetService musicSheetService;
 
+    @Autowired
+    private MusicAlbumService musicAlbumService;
 
     /**
      * 查询单条
@@ -73,6 +77,36 @@ public class MusicSheetController extends BaseController {
         return succeed(PageUtil.pageInfo(musicSheetVoIPage));
     }
 
+
+    @ApiOperation(value = "乐谱(专辑和曲目同时查询)分页查询", httpMethod="POST", consumes="application/json", produces="application/json")
+    @PostMapping(value="/albumAndSheetList", consumes="application/json", produces="application/json")
+    public HttpResponseResult<AlbumAndSheetVo> albumAndSheetlist(@RequestBody StudentMusicSheetSearch query) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+
+        // 学生 只能看通过审核 并且 启用的 曲目
+        query.setState(YesOrNoEnum.YES);
+        query.setAuditStatus(AuthStatusEnum.PASS);
+        query.setStudentId(sysUser.getId());
+        query.setRows(query.getSheetRow());
+        IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectStudentPage(PageUtil.getPage(query), query);
+
+        MusicAlbumSearch musicAlbumSearch = new MusicAlbumSearch();
+        musicAlbumSearch.setAlbumStatus(YesOrNoEnum.YES);
+        musicAlbumSearch.setSortBy(1);
+        musicAlbumSearch.setAlbumTagIds(query.getMusicTagIds());
+        musicAlbumSearch.setPage(query.getPage());
+        musicAlbumSearch.setRows(query.getAlbumRow());
+        IPage<MusicAlbumVo> musicAlbumVoIPage = musicAlbumService.selectPage(PageUtil.getPage(musicAlbumSearch), musicAlbumSearch);
+
+        AlbumAndSheetVo albumAndSheetVo = new AlbumAndSheetVo();
+        albumAndSheetVo.setMusicSheetList(PageUtil.pageInfo(musicSheetVoIPage));
+        albumAndSheetVo.setMusicAlbumList(PageUtil.pageInfo(musicAlbumVoIPage));
+        return succeed(albumAndSheetVo);
+    }
+
     /**
      * 曲目收藏
      */

+ 5 - 4
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/PaymentController.java

@@ -78,7 +78,7 @@ public class PaymentController extends BaseController {
             String sign = request.getParameter("sign");
             //回调业务类型
             String type = request.getParameter("type");
-            log.info("汇付回调,type is {}, res is {}", type, data);
+            log.info("汇付回调,type is {},type is {}, res is {}", type, sign, data);
             if (StringUtil.isEmpty(type)) {
                 log.error("汇付回调参数异常");
                 return;
@@ -86,12 +86,13 @@ public class PaymentController extends BaseController {
             //验签传参publicKey
             String publicKey = AdapayCore.PUBLIC_KEY;
             //验签
-            boolean checkSign = AdapaySign.verifySign(data, sign, publicKey);
+            //todo 测试先取消验签
+           /* boolean checkSign = AdapaySign.verifySign(data, sign, publicKey);
             if (checkSign) {
-                //验签成功逻辑
                 log.info("验签成功");
                 userOrderService.orderCallback(data, type);
-            }
+            }*/
+            userOrderService.orderCallback(data, type);
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 0 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentCourseGroupController.java

@@ -47,7 +47,6 @@ public class StudentCourseGroupController extends BaseController {
     @ApiOperation("分页查询直播课课程组列表")
     @PostMapping("/queryPageCourseGroup")
     public HttpResponseResult<PageInfo<CourseGroupVo>> queryPageLiveCourseGroup(@RequestBody Map<String, Object> param) {
-        param.put("os","student");
         return succeed(courseGroupService.queryPageLiveCourseGroup(param));
     }
 

+ 1 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentCourseScheduleController.java

@@ -134,7 +134,7 @@ public class StudentCourseScheduleController extends BaseController {
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        return succeed(courseScheduleService.queryLiveAndVideo(user.getId()));
+        return succeed(courseScheduleService.queryLiveAndVideo(user.getId(),null));
     }
 
     @ApiImplicitParams({

+ 1 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java

@@ -152,7 +152,7 @@ public class UserOrderController extends BaseController {
             return httpResponseResultFuture.get();
         } catch (Exception e) {
             e.printStackTrace();
-            return HttpResponseResult.failed("付款失败");
+            return HttpResponseResult.failed("取消订单失败");
         }
     }
 

+ 29 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherAttendanceController.java

@@ -0,0 +1,29 @@
+package com.yonge.cooleshow.teacher.controller;
+
+
+import com.yonge.cooleshow.biz.dal.service.TeacherAttendanceService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * 老师考勤表(TeacherAttendance)表控制层
+ *
+ * @author hgw
+ * @since 2022-05-05 13:51:02
+ */
+@Api(tags = "老师考勤表")
+@RestController
+@RequestMapping("/teacherAttendance")
+public class TeacherAttendanceController extends BaseController {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private TeacherAttendanceService teacherAttendanceService;
+
+}
+

+ 0 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseGroupController.java

@@ -49,7 +49,6 @@ public class TeacherCourseGroupController extends BaseController {
     @ApiOperation("分页查询直播课课程组列表")
     @PostMapping("/queryPageCourseGroup")
     public HttpResponseResult<PageInfo<CourseGroupVo>> queryPageLiveCourseGroup(@RequestBody Map<String, Object> param) {
-        param.put("os","teacher");
         return succeed(courseGroupService.queryPageLiveCourseGroup(param));
     }
 

+ 12 - 4
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseScheduleController.java

@@ -9,6 +9,7 @@ import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
 import com.yonge.cooleshow.biz.dal.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.CourseAdjustVo;
 import com.yonge.cooleshow.biz.dal.vo.MyCourseVo;
+import com.yonge.cooleshow.biz.dal.vo.StudentHomePage;
 import com.yonge.cooleshow.biz.dal.vo.TeacherLiveCourseInfoVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -19,10 +20,7 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.http.HttpStatus;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.util.List;
@@ -137,5 +135,15 @@ public class TeacherCourseScheduleController extends BaseController {
         courseScheduleService.courseAdjust(adjustVo);
         return succeed();
     }
+
+    @ApiOperation("老师-首页-最近课程")
+    @GetMapping("/queryLiveAndVideo")
+    public HttpResponseResult<StudentHomePage> queryLiveAndVideo() {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return succeed(courseScheduleService.queryLiveAndVideo(null,user.getId()));
+    }
 }
 

+ 3 - 2
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/VideoLessonGroupController.java

@@ -12,6 +12,7 @@ import com.yonge.cooleshow.biz.dal.vo.VideoLessonVo;
 import com.yonge.toolset.base.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.http.HttpStatus;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -115,7 +116,7 @@ public class VideoLessonGroupController extends BaseController {
         if (sysUser == null||sysUser.getId()==null) {
             return failed("用户信息获取失败");
         }
-        if (lessonVo.getLessonList().isEmpty()) {
+        if (CollectionUtils.isEmpty(lessonVo.getLessonList())) {
             return failed("课程不能为空");
         }
         videoLessonGroupService.add(lessonVo,sysUser);
@@ -146,7 +147,7 @@ public class VideoLessonGroupController extends BaseController {
         if (sysUser == null||sysUser.getId()==null) {
             return failed("用户信息获取失败");
         }
-        if (lessonVo.getLessonList().isEmpty()) {
+        if (CollectionUtils.isEmpty(lessonVo.getLessonList())) {
             return failed("课程不能为空");
         }
         videoLessonGroupService.update(lessonVo,sysUser);

+ 9 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/task/TaskController.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.teacher.task;
 
 import com.yonge.cooleshow.biz.dal.entity.TeacherTotal;
 import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
+import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
 import com.yonge.cooleshow.biz.dal.service.TeacherTotalService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -23,6 +24,8 @@ public class TaskController extends BaseController {
     private TeacherTotalService teacherTotalService;
     @Autowired
     private CourseGroupService courseGroupService;
+    @Autowired
+    private CourseScheduleService scheduleService;
 
     /***
      * 查询所有老师统计数据
@@ -49,4 +52,10 @@ public class TaskController extends BaseController {
     public HttpResponseResult<Object> getRedisValueByKey(String key) {
         return succeed(teacherTotalService.getRedisValueByKey(key));
     }
+
+    @GetMapping("/courseRemind")
+    public HttpResponseResult<Object> courseRemind() {
+        scheduleService.courseRemind();
+        return HttpResponseResult.succeed();
+    }
 }