浏览代码

Merge branch 'zx_online_update_1218' of http://git.dayaedu.com/yonge/cooleshow into develop-new

# Conflicts:
#	cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
#	cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysUserServiceImpl.java
zouxuan 6 月之前
父节点
当前提交
7e3be7e667
共有 28 个文件被更改,包括 398 次插入114 次删除
  1. 1 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java
  2. 8 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/StudentCourseGroupController.java
  3. 7 6
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseGroupController.java
  4. 10 17
      cooleshow-app/src/main/java/com/yonge/cooleshow/website/controller/CourseGroupController.java
  5. 11 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
  6. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderRefundBillDao.java
  7. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderRefundDao.java
  8. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AccountBizTypeEnum.java
  9. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/GoodTypeEnum.java
  10. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  11. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/OrderTypeEnum.java
  12. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/coupon/CouponCategoryEnum.java
  13. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java
  14. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundBillService.java
  15. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java
  16. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserPaymentCoreService.java
  17. 151 13
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  18. 5 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  19. 3 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupServiceImpl.java
  20. 13 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentDivMemberRecordServiceImpl.java
  21. 34 62
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysUserServiceImpl.java
  22. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundBillServiceImpl.java
  23. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  24. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  25. 65 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java
  26. 25 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseInfoVo.java
  27. 6 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderRefundBillMapper.xml
  28. 8 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderRefundMapper.xml

+ 1 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java

@@ -92,6 +92,7 @@ public class TaskController extends BaseController {
     public HttpResponseResult pollingOrder() {
         userOrderService.pollingOrder();
         userPaymentCoreService.scanPaymentTimeoutOrderRecord();
+        userPaymentCoreService.scanRefundOrderRecord();
         return succeed();
     }
 

+ 8 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/StudentCourseGroupController.java

@@ -8,6 +8,7 @@ import com.yonge.cooleshow.biz.dal.service.AppVersionInfoService;
 import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
 import com.yonge.cooleshow.biz.dal.vo.CourseGroupVo;
+import com.yonge.cooleshow.biz.dal.vo.CourseInfoVo;
 import com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo;
 import com.yonge.cooleshow.biz.dal.wrapper.course.CourseGroupWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -46,12 +47,19 @@ public class StudentCourseGroupController extends BaseController {
         return succeed(courseGroupService.queryLiveCourseInfo(groupId));
     }
 
+    @ApiOperation("课程组详情")
+    @GetMapping("/queryCourseInfo")
+    public HttpResponseResult<CourseInfoVo> queryCourseInfo(@ApiParam(value = "课程组id", required = true) @RequestParam(value = "groupId") Long groupId) {
+        return succeed(courseGroupService.queryCourseInfo(groupId));
+    }
+
     @ApiImplicitParams({
             @ApiImplicitParam(name = "teacherId", dataType = "Long", value = "老师id"),
             @ApiImplicitParam(name = "search", dataType = "String", value = "关键字"),
             @ApiImplicitParam(name = "groupStatus", dataType = "String", value = "课程组状态  ING(进行中)  NOT_SALE(未开售,未上架) APPLY(报名中,销售中) COMPLETE(已完成)"),
             @ApiImplicitParam(name = "page", dataType = "Integer", value = "页数"),
             @ApiImplicitParam(name = "subjectId", dataType = "Integer", value = "声部id"),
+            @ApiImplicitParam(name = "courseType", dataType = "String", value = "课程类型"),
             @ApiImplicitParam(name = "rows", dataType = "Integer", value = "每页数量"),
             @ApiImplicitParam(name = "version", dataType = "String", value = "版本"),
             @ApiImplicitParam(name = "platform", dataType = "Integer", value = "平台"),

+ 7 - 6
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseGroupController.java

@@ -2,29 +2,24 @@ package com.yonge.cooleshow.teacher.controller;
 
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
 import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
 import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
-import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
-import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.AppVersionInfoService;
 import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
-import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.CourseGroupVo;
+import com.yonge.cooleshow.biz.dal.vo.CourseInfoVo;
 import com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo;
-import com.yonge.cooleshow.biz.dal.vo.MyCourseVo;
 import com.yonge.cooleshow.biz.dal.wrapper.course.CourseGroupWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
-import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import io.swagger.annotations.*;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -60,6 +55,12 @@ public class TeacherCourseGroupController extends BaseController {
         return succeed(courseGroupService.queryLiveCourseInfo(groupId));
     }
 
+    @ApiOperation("课程组详情")
+    @GetMapping("/queryCourseInfo")
+    public HttpResponseResult<CourseInfoVo> queryCourseInfo(@ApiParam(value = "课程组id", required = true) @RequestParam(value = "groupId") Long groupId) {
+        return succeed(courseGroupService.queryCourseInfo(groupId));
+    }
+
     @ApiImplicitParams({
             @ApiImplicitParam(name = "teacherId", dataType = "Long", value = "老师id"),
             @ApiImplicitParam(name = "search", dataType = "String", value = "关键字"),

+ 10 - 17
cooleshow-app/src/main/java/com/yonge/cooleshow/website/controller/CourseGroupController.java

@@ -5,27 +5,16 @@ import com.yonge.cooleshow.biz.dal.dto.CheckCourseTimeDto;
 import com.yonge.cooleshow.biz.dal.dto.LiveCourseGroupDto;
 import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
-import com.yonge.cooleshow.biz.dal.service.AppVersionInfoService;
 import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
 import com.yonge.cooleshow.biz.dal.vo.CourseGroupVo;
+import com.yonge.cooleshow.biz.dal.vo.CourseInfoVo;
 import com.yonge.cooleshow.biz.dal.vo.LiveCourseInfoVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
-import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.PageInfo;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.*;
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-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.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
@@ -45,17 +34,21 @@ public class CourseGroupController extends BaseController {
     /**
      * 服务对象
      */
-    @Autowired
+    @Resource
     private CourseGroupService courseGroupService;
 
-    @Resource
-    private AppVersionInfoService appVersionInfoService;
     @ApiOperation("直播课详情")
     @GetMapping("/queryLiveCourseInfo")
     public HttpResponseResult<LiveCourseInfoVo> queryLiveCourseInfo(@ApiParam(value = "课程组id", required = true) @RequestParam(value = "groupId") Long groupId) {
         return succeed(courseGroupService.queryLiveCourseInfo(groupId));
     }
 
+    @ApiOperation("课程组详情")
+    @GetMapping("/queryCourseInfo")
+    public HttpResponseResult<CourseInfoVo> queryCourseInfo(@ApiParam(value = "课程组id", required = true) @RequestParam(value = "groupId") Long groupId) {
+        return succeed(courseGroupService.queryCourseInfo(groupId));
+    }
+
     @ApiImplicitParams({
             @ApiImplicitParam(name = "teacherId", dataType = "Long", value = "老师id"),
             @ApiImplicitParam(name = "search", dataType = "String", value = "关键字"),

+ 11 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java

@@ -37,6 +37,10 @@ public interface SysConfigConstant {
      */
     String LIVE_SERVICE_RATE = "live_service_rate";
     /**
+     * 小组课服务费
+     */
+    String GROUP_SERVICE_RATE = "group_service_rate";
+    /**
      * 视频课服务费
      */
     String VIDEO_LESSON_SERVICE_FEE = "video_lesson_service_fee";
@@ -145,6 +149,7 @@ public interface SysConfigConstant {
      */
     String GOOD_LOGO_PRACTICE = "good_logo_practice";
     String GOOD_LOGO_VIP_COURSE = "good_logo_vip_course";
+    String GOOD_LOGO_GROUP = "good_logo_group";
     /***
      * 商品直播课图片
      * @author liweifan
@@ -518,4 +523,10 @@ public interface SysConfigConstant {
     String COURSE_SUBJECT_MAP = "course_subject_map";
     String LOGOFF_IMG = "logoff_img";
     String ADAPAY_CLOSE_ORDER_NOTIFY = "adapay_close_order_notify";
+    String LOGOFF_IMG = "logoff_img";
+
+    /**
+     *小组课最大成课人数
+     */
+    String GROUP_MAX_STUDENT_NUM = "group_max_student_num";
 }

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

@@ -28,4 +28,6 @@ public interface UserOrderRefundBillDao extends BaseMapper<UserOrderRefundBill>{
 	List<UserOrderRefundBillVo> selectPage(@Param("page") IPage page, @Param("param") UserOrderRefundPaymentSearch userOrderRefundPayment);
 
     UserOrderRefundBill getByTransNoOrOrderNo(@Param("transNo") String transNo, @Param("refundOrderNo") String refundOrderNo);
+
+    List<UserOrderRefundBill> getPendingList();
 }

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

@@ -38,4 +38,6 @@ public interface UserOrderRefundDao extends BaseMapper<UserOrderRefund> {
      * @return: java.util.List<com.yonge.cooleshow.biz.dal.entity.UserOrderDetail>
      */
     List<UserOrderDetail> selectOrderRefundDetils(@Param("orderId") Long orderId);
+
+    List<UserOrderRefund> getByOrderNo(@Param("orderNo") String orderNo, @Param("orderDetailIds") List<Long> orderDetailIds);
 }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AccountBizTypeEnum.java

@@ -25,9 +25,11 @@ public enum AccountBizTypeEnum implements BaseEnum<String, AccountBizTypeEnum> {
     TENANT_ALBUM("训练教程"),
     VIP_COURSE("VIP定制课"),
     DISCOUNT("畅学卡"),
+    GROUP("小组课"),
 
 
     LIVE_SHARE("直播课分润"),
+    GROUP_SHARE("小组课"),
     VIDEO_SHARE("视频课分润"),
     MUSIC_SHARE("乐谱分润"),
     ALBUM_SHARE("专辑分润"),

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

@@ -21,7 +21,8 @@ public enum GoodTypeEnum implements BaseEnum<String, GoodTypeEnum> {
     PIANO_ROOM("琴房时长"),
     ACTI_REGIST("活动报名"),
     VIP_COURSE("VIP定制课购买"),
-    DISCOUNT("畅学卡")
+    DISCOUNT("畅学卡"),
+    GROUP("小组课")
     ;
 
     @EnumValue

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java

@@ -90,6 +90,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     SMS_PRACTICE_BUY("趣纠课购买(短信)"),
 
     LIVE_BUY("直播课购买"),
+    GROUP_BUY("小组课购买"),
     SMS_LIVE_BUY("直播课购买"),
 
 
@@ -171,6 +172,10 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     TEACHER_UPDATE_COURSE_PLAN("老师修改课程规划"),
     TEACHER_UPDATE_COURSE_PLAN_VIP("老师修改课程规划"),
     TEACHER_UPDATE_COURSE_PLAN_PIANO_ROOM_CLASS("老师修改课程规划"),
+    GROUP_SUCCESS_STUDENT("小组课已成课"),
+    GROUP_SUCCESS_TEACHER("小组课已成课"),
+    GROUP_FAIL_STUDENT("小组课成课失败"),
+    GROUP_FAIL_TEACHER("小组课成课失败"),
     ;
 
     MessageTypeEnum(String msg) {

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

@@ -21,7 +21,8 @@ public enum OrderTypeEnum implements BaseEnum<String, OrderTypeEnum> {
     ALBUM("专辑购买"),
     TENANT_ALBUM("平台专辑"),
     VIP_COURSE("VIP定制课"),
-    DISCOUNT("畅学卡")
+    DISCOUNT("畅学卡"),
+    GROUP("小组课")
     ;
     @EnumValue
     private String code;

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/coupon/CouponCategoryEnum.java

@@ -26,6 +26,7 @@ public enum CouponCategoryEnum implements BaseEnum<String, CouponCategoryEnum> {
     VIDEO("视频课购买券", "VIDEO"),
     VIP_COURSE("VIP定制课购买券", "VIP_COURSE"),
     DISCOUNT("畅学卡","DISCOUNT"),
+    GROUP("小组课优惠券","GROUP"),
     ;
 
     @EnumValue

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

@@ -44,6 +44,13 @@ public interface CourseGroupService extends IService<CourseGroup> {
     LiveCourseInfoVo queryLiveCourseInfo(Long groupId);
 
     /**
+     * 查询课程组详情
+     *
+     * @param groupId 课程组id
+     */
+    CourseInfoVo queryCourseInfo(Long groupId);
+
+    /**
      * 分页查询课程组列表
      *
      * @param param 传入参数
@@ -379,5 +386,7 @@ public interface CourseGroupService extends IService<CourseGroup> {
     List<CourseGroupWrapper.CourseStudentVo> queryStudentByGroupId(Long groupId);
 
     void updateCoursePlan(Long groupId, String coursePlan);
+
+    void buyGroupSendMessage(CourseScheduleStudentPayment studentPayment, CourseGroup courseGroup);
 }
 

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundBillService.java

@@ -6,6 +6,8 @@ import com.yonge.cooleshow.biz.dal.vo.UserOrderRefundBillVo;
 import com.yonge.cooleshow.biz.dal.dto.search.UserOrderRefundPaymentSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserOrderRefundBill;
 
+import java.util.List;
+
 /**
  * 退款单表 服务类
  * @author liweifan
@@ -28,4 +30,6 @@ public interface UserOrderRefundBillService extends IService<UserOrderRefundBill
     IPage<UserOrderRefundBillVo> selectPage(IPage<UserOrderRefundBillVo> page, UserOrderRefundPaymentSearch query);
 
     UserOrderRefundBill getByTransNoOrOrderNo(String transNo, String refundOrderNo);
+
+    List<UserOrderRefundBill> getPendingList();
 }

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java

@@ -11,6 +11,7 @@ import com.yonge.cooleshow.biz.dal.entity.UserOrderRefundBill;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderRefundVo;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
+import org.jetbrains.annotations.NotNull;
 
 import java.util.List;
 
@@ -87,4 +88,6 @@ public interface UserOrderRefundService extends IService<UserOrderRefund>  {
 	void orderRefundSuccessBizHandle(Long refundId);
 
     void orderRefundSuccessBizHandleByOrderNo(String orderNo, List<Long> orderDetailIds);
+
+	List<UserOrderRefund> getByOrderNo(String orderNo, @NotNull List<Long> orderDetailIds);
 }

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

@@ -112,4 +112,6 @@ public interface UserPaymentCoreService {
      * @param orderNo 订单编号
      */
     void paymentStatus(String orderNo);
+
+    void scanRefundOrderRecord();
 }

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

@@ -132,6 +132,11 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         return queryLiveCourseInfo(groupId, sysUserService.getUser());
     }
 
+    @Override
+    public CourseInfoVo queryCourseInfo(Long groupId) {
+        return queryCourseInfo(groupId, sysUserService.getUser());
+    }
+
     /**
      * 查询课程组详情-直播课详情
      *
@@ -212,6 +217,65 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         }
         return result;
     }
+    private CourseInfoVo queryCourseInfo(Long groupId, SysUser sysUser) {
+        CourseGroup group = Optional.ofNullable(groupId).map(this::getById)
+                .orElseThrow(() -> new BizException("课程组信息不存在"));
+
+        CourseInfoVo result = new CourseInfoVo();
+        result.setCourseGroupId(group.getId());
+        result.setCourseGroupName(group.getName());
+        result.setCourseStartTime(group.getCourseStartTime());
+        result.setSingleCourseMinutes(group.getSingleCourseMinutes());
+        result.setStatus(group.getStatus());
+        result.setStudentCount(group.getPreStudentNum());
+        result.setBackgroundPic(group.getBackgroundPic());
+        result.setTeacherId(group.getTeacherId());
+        result.setCoursePrice(group.getCoursePrice());
+        result.setCourseNum(group.getCourseNum());
+        result.setCourseIntroduce(group.getCourseIntroduce());
+        result.setSalesStartDate(group.getSalesStartDate());
+        result.setSalesEndDate(group.getSalesEndDate());
+        result.setMixStudentNum(group.getMixStudentNum());
+        result.setImGroupId(group.getImGroupId());
+        result.setAuditVersion(group.getAuditVersion());
+        SysUser teacherUser = sysUserService.getByUserId(group.getTeacherId());
+        if (teacherUser == null) {
+            throw new BizException("用户不存在");
+        }
+        if (sysUser.getId().equals(teacherUser.getId())) {
+            result.setMyself(true);
+        } else {
+            result.setMyself(false);
+        }
+        Teacher teacher = teacherService.getById(teacherUser.getId());
+
+        if (teacher != null) {
+            result.setDegreeFlag(teacher.getDegreeFlag());
+            result.setTeacherFlag(teacher.getTeacherFlag());
+
+        }
+        result.setTeacherName(teacherUser.getRealName());
+        result.setUserName(teacherUser.getUsername());
+        result.setAvatar(teacherUser.getAvatar());
+        Optional.ofNullable(group.getSubjectId()).map(subjectService::get)
+                .ifPresent(subject -> result.setSubjectName(subject.getName()));
+        //查询是否购买过该课程组
+        Long id = sysUser.getId();
+
+        //这里修改为,订单完成后才算购买过,待支付和支付中订单不算
+        //因为页面再点击购买按钮时,会请求/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.selectAllList(query);
+        result.setExistBuy(0);
+        if (CollectionUtils.isNotEmpty(userOrderVos)) {
+            result.setExistBuy(1);
+        }
+        return result;
+    }
 
     /**
      * 分页查询课程组列表
@@ -361,7 +425,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         //课程组信息
         CourseGroup courseGroup = this.getOne(Wrappers.<CourseGroup>lambdaQuery()
                 .eq(CourseGroup::getId, groupId)
-                .eq(CourseGroup::getType, CourseScheduleEnum.LIVE.getCode())
+                .eq(CourseGroup::getType, orderGoodsInfo.getGoodType().name())
         );
         if (Objects.isNull(courseGroup)) {
             throw new BizException("课程组不存在!");
@@ -379,6 +443,14 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         //校验购买的课程组每节课时间是否和自己的课时冲突
         batchCheckStudentCourseTime(studentId, courseList, CourseSchedule::getStartTime, CourseSchedule::getEndTime);
 
+        // 小组课判断购买人数
+        if (orderGoodsInfo.getGoodType() == GoodTypeEnum.GROUP) {
+            String configValue = sysConfigService.findConfigValue(SysConfigConstant.GROUP_MAX_STUDENT_NUM);
+            if (StringUtils.isNotBlank(configValue)) {
+                int maxStudentNum = Integer.parseInt(configValue);
+
+            }
+        }
 
 
         UserOrderDetail userOrderDetail = JSON.parseObject(JSON.toJSONString(orderGoodsInfo), UserOrderDetail.class);
@@ -541,6 +613,26 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         }
     }
 
+    @Override
+    public void buyGroupSendMessage(CourseScheduleStudentPayment studentPayment, CourseGroup courseGroup) {
+        //查询老师信息
+        SysUser teacherInfo = sysUserService.findUserById(courseGroup.getTeacherId());
+        //查询学生信息
+        SysUser studentInfo = sysUserService.findUserById(studentPayment.getUserId());
+        try {
+
+            //极光-消息推送-学生端-通知学生购买成功-跳转到APP
+            MessageTypeEnum liveBuy = MessageTypeEnum.GROUP_BUY;
+            Map<Long, String> studentReceivers = new HashMap<>();
+            studentReceivers.put(studentInfo.getId(), studentInfo.getPhone());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, liveBuy,
+                    studentReceivers, null, 0, "", ClientEnum.STUDENT.getCode(),
+                    teacherInfo.getUsername(), courseGroup.getName());
+        } catch (Exception ex) {
+            log.error("buyGroupSendMessage error", ex.getCause());
+        }
+    }
+
     /**
      *
      * 直播课购买后数据写入
@@ -555,7 +647,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         //课程组信息
         CourseGroup courseGroup = this.getOne(Wrappers.<CourseGroup>lambdaQuery()
                 .eq(CourseGroup::getId, groupId)
-                .eq(CourseGroup::getType, CourseScheduleEnum.LIVE.getCode())
+                .eq(CourseGroup::getType, orderGoodsInfo.getGoodType().name())
         );
         if (Objects.isNull(courseGroup)) {
             throw new BizException("课程组不存在!");
@@ -1372,7 +1464,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         LocalDate yesterday = today.plusDays(-1L);
         //查询今天未开售的课程组
         List<CourseGroup> courseGroupList = this.list(Wrappers.<CourseGroup>lambdaQuery()
-                .eq(CourseGroup::getType, CourseScheduleEnum.LIVE.getCode())
+                .in(CourseGroup::getType, CourseScheduleEnum.LIVE.getCode(),CourseScheduleEnum.GROUP.getCode())
                 .ge(CourseGroup::getSalesStartDate, yesterday)
                 .le(CourseGroup::getSalesStartDate, today)
                 .eq(CourseGroup::getStatus, CourseGroupEnum.NOT_SALE.getCode()));
@@ -1397,7 +1489,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
     private void closeCourseGroup() {
         //查询昨天要结束售卖的课程组
         List<CourseGroup> courseGroupList = this.list(Wrappers.<CourseGroup>lambdaQuery()
-                .eq(CourseGroup::getType, CourseScheduleEnum.LIVE.getCode())
+                .in(CourseGroup::getType, CourseScheduleEnum.LIVE.getCode(),CourseScheduleEnum.GROUP.getCode())
                 .eq(CourseGroup::getSalesEndDate, LocalDate.now().plusDays(-1))
                 .in(CourseGroup::getStatus, CourseGroupEnum.APPLY.getCode(),CourseGroupEnum.OUT_SALE.getCode()));
         if (CollectionUtils.isEmpty(courseGroupList)) {
@@ -1424,6 +1516,12 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                     //添加老师进群
                     imGroupMemberService.initGroupMembers(imGroupId, Collections.singleton(courseGroup.getTeacherId()), ImGroupMemberRoleType.TEACHER);
                     courseGroup.setImGroupId(imGroupId);
+
+                    // 小组课成课推送
+                    if (courseGroup.getType().equals(CourseScheduleEnum.GROUP.getCode())) {
+                        // 极光-消息推送-老师端-通知老师小组课程组成课
+                        sendGroupSuccessMessage(courseGroup,true);
+                    }
                 } else {
                     //人数未达标则修改课程组为取消状态
                     courseGroup.setStatus(CourseGroupEnum.CANCEL.getCode());
@@ -1432,11 +1530,19 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                             .eq(CourseSchedule::getCourseGroupId, courseGroup.getId())
                             .set(CourseSchedule::getStatus, CourseScheduleEnum.CANCEL.getCode())
                     );
-                    // 老师直播课成课失败发送消息
-                    this.sendMessage(courseGroup);
 
-                    // 学生直播课成课失败发送消息
-                    this.sendStudentMessage(userIds,courseGroup);
+                    // 小组课成课推送
+                    if (courseGroup.getType().equals(CourseScheduleEnum.GROUP.getCode())) {
+
+                        // 极光-消息推送-老师端-通知老师小组课程组成课
+                        sendGroupSuccessMessage(courseGroup,false);
+                    } else {
+                        // 老师直播课成课失败发送消息
+                        this.sendMessage(courseGroup);
+
+                        // 学生直播课成课失败发送消息
+                        this.sendStudentMessage(userIds, courseGroup);
+                    }
 
                     //退款
                     this.refund(courseGroup);
@@ -1450,6 +1556,37 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         });
     }
 
+    private void sendGroupSuccessMessage(CourseGroup courseGroup,boolean success) {
+        // 老师
+        SysUser sysUser = sysUserService.getByUserId(courseGroup.getTeacherId());
+        try {
+            Map<Long, String> receivers = new HashMap<>();
+            receivers.put(sysUser.getId(), sysUser.getPhone());
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, success?MessageTypeEnum.GROUP_SUCCESS_TEACHER:MessageTypeEnum.GROUP_FAIL_TEACHER,
+                    receivers, null, 0, null, ClientEnum.TEACHER.getCode(), courseGroup.getName());
+        } catch (Exception e) {
+            log.warn("小组课成课成功推送发送失败,{}", e.getMessage());
+        }
+
+
+        List<CourseScheduleStudentPayment> list = courseScheduleStudentPaymentService.list(Wrappers.<CourseScheduleStudentPayment>lambdaQuery()
+                .eq(CourseScheduleStudentPayment::getCourseGroupId, courseGroup.getId()));
+        Set<Long> userIds = list.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toSet());
+        // 学生
+        Map<Long, com.yonge.cooleshow.biz.dal.entity.SysUser> mapByIds = sysUserService.getMapByIds((List<Long>) userIds);
+
+        Map<Long, String> receivers = new HashMap<>();
+        for (com.yonge.cooleshow.biz.dal.entity.SysUser value : mapByIds.values()) {
+            receivers.put(value.getId(), value.getPhone());
+        }
+        try {
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, success?MessageTypeEnum.GROUP_SUCCESS_STUDENT:MessageTypeEnum.GROUP_FAIL_STUDENT,
+                    receivers, null, 0, null, ClientEnum.STUDENT.getCode(), courseGroup.getName());
+        } catch (Exception e) {
+            log.warn("小组课成课成功推送发送失败,{}", e.getMessage());
+        }
+    }
+
     private void sendStudentMessage(Set<Long> userIds, CourseGroup courseGroup) {
         for (Long userId : userIds) {
 
@@ -1498,14 +1635,15 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
 
                 List<Long> orderDetailIds = new ArrayList<>();
                 if (CollectionUtils.isNotEmpty(detail.getOrderDetailList())) {
-                    detail.getOrderDetailList().stream().filter(orderDetail -> orderDetail.getGoodType() == GoodTypeEnum.LIVE)
+                    detail.getOrderDetailList().stream()
+                            .filter(orderDetail -> orderDetail.getGoodType() == GoodTypeEnum.LIVE || orderDetail.getGoodType() == GoodTypeEnum.GROUP)
                             .filter(orderDetail -> orderDetail.getBizId().equals(courseGroup.getId()))
                             .forEach(orderDetail -> orderDetailIds.add(orderDetail.getId()));
                 }
                 if (order.getPaymentVersion().equals(EPaymentVersion.V1)) {
-                    userOrderRefundService.orderRefund(order.getOrderNo(), "直播课成课失败退款");
+                    userOrderRefundService.orderRefund(order.getOrderNo(), CourseScheduleEnum.valueOf(courseGroup.getType()).name() +"成课失败退款");
                 } else {
-                    userPaymentCoreService.refundPayment(order.getOrderNo(),"直播课成课失败退款", orderDetailIds);
+                    userPaymentCoreService.refundPayment(order.getOrderNo(),CourseScheduleEnum.valueOf(courseGroup.getType()).name() +"成课失败退款", orderDetailIds);
                 }
 
                 //退还优惠券
@@ -1513,8 +1651,8 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                     couponInfoService.updateUserOrderCouponInfo(CouponOrderWrapper.builder().orderNo(order.getOrderNo()).reset(true).build());
                 }
             } catch (Exception e) {
-                log.warn("直播课成课失败退款 退款失败,退款订单号 {}", order);
-                log.error("直播课成课失败退款 退款失败", e);
+                log.warn("成课失败退款 退款失败,退款订单号 {}", order);
+                log.error("成课失败退款 退款失败", e);
             }
         }
     }

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

@@ -1967,7 +1967,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         List<CourseSchedule> liveStart = baseMapper.selectList(Wrappers.<CourseSchedule>lambdaQuery()
                 .eq(CourseSchedule::getLock, 0)
                 .eq(CourseSchedule::getStatus, CourseScheduleEnum.NOT_START)
-                .eq(CourseSchedule::getType, CourseScheduleEnum.LIVE)
+                .in(CourseSchedule::getType, CourseScheduleEnum.LIVE, CourseScheduleEnum.GROUP)
                 .le(CourseSchedule::getStartTime, liveMinute)
                 .ge(CourseSchedule::getEndTime, LocalDateTime.now()));
         List<CourseSchedule> practiceStart = baseMapper.selectList(Wrappers.<CourseSchedule>lambdaQuery()
@@ -2068,7 +2068,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             }
 
             List<CourseScheduleStudentVo> courseList = userList.stream()
-                    .filter(s -> Lists.newArrayList(CourseScheduleEnum.PRACTICE.getCode(),CourseScheduleEnum.VIP.getCode(),CourseScheduleEnum.PIANO_ROOM_CLASS.getCode()).contains(s.getType()))
+                    .filter(s -> Lists.newArrayList(CourseScheduleEnum.PRACTICE.getCode(),
+                            CourseScheduleEnum.VIP.getCode(),
+                            CourseScheduleEnum.PIANO_ROOM_CLASS.getCode()).contains(s.getType()))
                     .collect(Collectors.toList());
 
             //清除缓存
@@ -2091,9 +2093,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         if (CollectionUtils.isNotEmpty(completeList)) {
             List<Long> ids = completeList.stream().filter(s -> {
                 return s.getCourseCount().equals(s.getCourseNum());
-            }).map(s -> {
-                return s.getId();
-            }).collect(Collectors.toList());
+            }).map(CourseGroup::getId).collect(Collectors.toList());
             if (CollectionUtils.isNotEmpty(ids)) {
                 //同步课程组状态
                 courseGroupService.getDao().updateBatch(ids);

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

@@ -419,9 +419,10 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         //imUserFriendService.refreshCustomer(teacherId, ClientEnum.TEACHER, new ArrayList<>(studentIds), ClientEnum.STUDENT);
 
 
-        // 直播课、琴房课校验群成员人数限制
+        // 直播课、琴房课、小组课校验群成员人数限制
         if (CourseScheduleEnum.PIANO_ROOM_CLASS.getCode().equals(courseGroupType)
-            || CourseScheduleEnum.LIVE.getCode().equals(courseGroupType)) {
+            || CourseScheduleEnum.LIVE.getCode().equals(courseGroupType)
+            || CourseScheduleEnum.GROUP.getCode().equals(courseGroupType)) {
 
             // 增加群成员人数限制,若超过限制则不添加到群组
             SysConfig config = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);

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

@@ -570,7 +570,12 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         //课程总金额
         BigDecimal totalExpectPrice = WrapperUtil.sumList(studentPaymentList, CourseScheduleStudentPayment::getActualPrice);
         //查询直播课服务费
-        String liveServiceRateStr = sysConfigService.findConfigValue(SysConfigConstant.LIVE_SERVICE_RATE);
+        String liveServiceRateStr = "20";
+        if (userPaymentOrder.getGoodType() == GoodTypeEnum.LIVE) {
+            liveServiceRateStr = sysConfigService.findConfigValue(SysConfigConstant.LIVE_SERVICE_RATE);
+        } else if (userPaymentOrder.getGoodType() == GoodTypeEnum.GROUP) {
+            liveServiceRateStr = sysConfigService.findConfigValue(SysConfigConstant.GROUP_SERVICE_RATE);
+        }
         BigDecimal liveServiceRate = new BigDecimal(liveServiceRateStr).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
         //总课酬  1 - (1 * 手续费率)
         BigDecimal totalRatePrice = totalExpectPrice.subtract(totalExpectPrice.multiply(liveServiceRate)).setScale(2, RoundingMode.HALF_UP);
@@ -600,7 +605,7 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
             //预计课酬-实际课酬 = 扣除费用
             teacherSalary.setReduceSalary(ex.subtract(ac));
             //备注是为直播课手续费
-            teacherSalary.setReduceSalaryRemark(SysConfigConstant.LIVE_SERVICE_RATE);
+            teacherSalary.setReduceSalaryRemark(userPaymentOrder.getGoodType() == GoodTypeEnum.LIVE? SysConfigConstant.LIVE_SERVICE_RATE:SysConfigConstant.GROUP_SERVICE_RATE);
             if (teacherSalary.getExpectSalary().compareTo(BigDecimal.ZERO) > 0) {
                 teacherSalaryList.add(teacherSalary);
             }
@@ -639,8 +644,12 @@ public class PaymentDivMemberRecordServiceImpl extends ServiceImpl<PaymentDivMem
         //课程购买成功后进行消息推送
 
         // 平台学生 发送推送
-        if(checkSendMessage(userPaymentOrder.getUserId(),userPaymentOrder.getOrderClient())) {
-            courseGroupService.buyLiveSendMessage(studentPayment, courseGroup);
+        if(checkSendMessage(userPaymentOrder.getUserId(),userPaymentOrder.getOrderClient()) ) {
+            if (userPaymentOrder.getGoodType() == GoodTypeEnum.LIVE) {
+                courseGroupService.buyLiveSendMessage(studentPayment, courseGroup);
+            } else if (userPaymentOrder.getGoodType() == GoodTypeEnum.GROUP) {
+                courseGroupService.buyGroupSendMessage(studentPayment, courseGroup);
+            }
         }
 
     }

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

@@ -14,32 +14,22 @@ import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetAuthRecordDao;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetDao;
-import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
-import com.yonge.cooleshow.biz.dal.entity.ImGroup;
-import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
-import com.yonge.cooleshow.biz.dal.entity.Student;
-import com.yonge.cooleshow.biz.dal.entity.Teacher;
-import com.yonge.cooleshow.biz.dal.entity.UserOrder;
-import com.yonge.cooleshow.biz.dal.entity.UserOrderRefund;
-import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
+import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.enums.im.EImGroupMemberRoleType;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.service.*;
-import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
 import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
 import com.yonge.cooleshow.biz.dal.wrapper.UserInfoWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.ContractTemplateTypeEnum;
 import com.yonge.cooleshow.common.enums.SysUserType;
 import com.yonge.toolset.base.exception.BizException;
-import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.thirdparty.user.realname.RealnameAuthenticationPlugin;
 import com.yonge.toolset.utils.idcard.IdcardInfoExtractor;
 import com.yonge.toolset.utils.idcard.IdcardValidator;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import com.yonge.cooleshow.biz.dal.entity.ImUserFriend;
@@ -67,44 +57,27 @@ public class SysUserServiceImpl implements SysUserService {
     @Resource
     private TeacherService teacherService;
     @Resource
-    private MessageSenderPluginContext messageSenderPluginContext;
-
-    @Autowired
     private UserOrderService userOrderService;
-
-    @Autowired
+    @Resource
     private UserOrderRefundService userOrderRefundService;
-
-    @Autowired
+    @Resource
     private ImGroupMemberService imGroupMemberService;
-
-    @Autowired
+    @Resource
     private ImGroupService imGroupService;
-
-    @Autowired
-    private ImGroupCoreService imGroupCoreService;
-
-    @Autowired
+    @Resource
     private CourseGroupService courseGroupService;
-
-    @Autowired
+    @Resource
     private VideoLessonGroupService videoLessonGroupService;
-
-    @Autowired
+    @Resource
     private UserAccountService userAccountService;
-
-    @Autowired
+    @Resource
     private MallPortalFeignService mallPortalFeignService;
-
-    @Autowired
+    @Resource
     private ImUserFriendService imUserFriendService;
-
-    @Autowired
+    @Resource
     private MusicSheetDao musicSheetDao;
-
-    @Autowired
+    @Resource
     private MusicSheetAuthRecordDao musicSheetAuthRecordDao;
-
     @Resource
     private MessageFeignClientService messageFeignClientService;
     @Override
@@ -279,29 +252,19 @@ public class SysUserServiceImpl implements SysUserService {
             // 趣纠课
             List<CourseGroup> list = courseGroupService.lambdaQuery()
                 .eq(CourseGroup::getTeacherId, userId)
-                .in(CourseGroup::getType, Arrays.asList("PRACTICE", "LIVE", "PIANO_ROOM_CLASS"))
+                .in(CourseGroup::getType, Arrays.asList("PRACTICE", "LIVE", "PIANO_ROOM_CLASS", "GROUP","VIP"))
                 .in(CourseGroup::getStatus, Arrays.asList("ING", "APPLY", "NOT_SALE"))
                 .list();
-            String courseMsg ="";
+            StringBuffer courseMsg = new StringBuffer();
             if (!CollectionUtils.isEmpty(list)) {
-                List<String> courseTypes = list.stream().map(o -> o.getType()).distinct().collect(Collectors.toList());
-                if (courseTypes.contains(CourseScheduleEnum.LIVE.name())) {
-                    courseMsg += "直播课";
-                }
-                if (courseTypes.contains(CourseScheduleEnum.PRACTICE.name())){
-                    if (courseMsg.length() > 0) {
-                        courseMsg+="/";
-                    }
-                    courseMsg += "趣纠课";
-                }
-                if (courseTypes.contains(CourseScheduleEnum.PIANO_ROOM_CLASS.name())){
-                    if (courseMsg.length() > 0) {
-                        courseMsg+="/";
-                    }
-                    courseMsg += "琴房课";
-                }
+                List<String> courseTypes = list.stream().map(CourseGroup::getType).distinct().collect(Collectors.toList());
+                this.appendErrMsg(courseMsg,courseTypes,CourseScheduleEnum.LIVE);
+                this.appendErrMsg(courseMsg,courseTypes,CourseScheduleEnum.PRACTICE);
+                this.appendErrMsg(courseMsg,courseTypes,CourseScheduleEnum.PIANO_ROOM_CLASS);
+                this.appendErrMsg(courseMsg,courseTypes,CourseScheduleEnum.VIP);
+                this.appendErrMsg(courseMsg,courseTypes,CourseScheduleEnum.GROUP);
                 if (courseMsg.length() > 0) {
-                    courseMsg="账号存在未开始/进行中的" + courseMsg;
+                    courseMsg.insert(0,"账号存在未开始/进行中的");
                 }
             }
             // 视频课
@@ -312,9 +275,9 @@ public class SysUserServiceImpl implements SysUserService {
 
             if (videoCourse > 0) {
                 if (courseMsg.length() > 0) {
-                    courseMsg+="和未下架的视频课";
+                    courseMsg.append("和未下架的视频课");
                 } else {
-                    courseMsg="账号存在未下架的视频课";
+                    courseMsg.append("账号存在未下架的视频课");
                 }
             } else {
                 // 判断审核中的视频课
@@ -325,15 +288,15 @@ public class SysUserServiceImpl implements SysUserService {
                     .count();
                 if (videoCourse > 0) {
                     if (courseMsg.length() > 0) {
-                        courseMsg+="和未下架的视频课";
+                        courseMsg.append("和未下架的视频课");
                     } else {
-                        courseMsg="账号存在未下架的视频课";
+                        courseMsg.append("账号存在未下架的视频课");
                     }
                 }
 
             }
             if (courseMsg.length() > 0) {
-                errMsg.add(courseMsg);
+                errMsg.add(courseMsg.toString());
             }
 
             // 存在未提现的金额
@@ -380,6 +343,15 @@ public class SysUserServiceImpl implements SysUserService {
         return logOffs;
     }
 
+    private void appendErrMsg(StringBuffer courseMsg,List<String> courseTypes,CourseScheduleEnum courseScheduleEnum) {
+        if (courseTypes.contains(courseScheduleEnum.name())) {
+            if (courseMsg.length() > 0) {
+                courseMsg.append("/");
+            }
+            courseMsg.append(courseScheduleEnum.getMsg());
+        }
+    }
+
     private Map<String, String> hasUnfinishedOrder(Long userId) {
         // 商城订单 0->待付款;1->待发货;2->已发货
         HttpResponseResult<Map<String, Set<CheckStatus>>> httpResponseResult = mallPortalFeignService.checkOrderStatus(userId);

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

@@ -11,6 +11,9 @@ import com.yonge.cooleshow.biz.dal.dto.search.UserOrderRefundPaymentSearch;
 import com.yonge.cooleshow.biz.dal.dao.UserOrderRefundBillDao;
 import com.yonge.cooleshow.biz.dal.service.UserOrderRefundBillService;
 
+import java.util.Collections;
+import java.util.List;
+
 
 @Service
 public class UserOrderRefundBillServiceImpl extends ServiceImpl<UserOrderRefundBillDao, UserOrderRefundBill> implements UserOrderRefundBillService {
@@ -32,4 +35,10 @@ public class UserOrderRefundBillServiceImpl extends ServiceImpl<UserOrderRefundB
         return baseMapper.getByTransNoOrOrderNo(transNo, refundOrderNo);
     }
 
+    @Override
+    public List<UserOrderRefundBill> getPendingList() {
+        return baseMapper.getPendingList();
+
+    }
+
 }

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

@@ -34,6 +34,7 @@ import com.yonge.toolset.payment.base.model.RefundBill;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 import com.yonge.toolset.payment.base.model.callback.RefundPaymentCallBack;
 import com.yonge.toolset.payment.core.service.PaymentClient;
+import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -664,6 +665,11 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         }
     }
 
+    @Override
+    public List<UserOrderRefund> getByOrderNo(String orderNo, @NotNull List<Long> orderDetailIds) {
+        return baseMapper.getByOrderNo(orderNo, orderDetailIds);
+    }
+
     /**
      * 处理退款后账户
      *

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

@@ -1186,6 +1186,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             configValue = sysConfigService.findConfigValue(SysConfigConstant.GOOD_LOGO_DISCOUNT);
         } else if (GoodTypeEnum.VIP_COURSE.equals(goodTypeEnum)) {
             configValue = sysConfigService.findConfigValue(SysConfigConstant.GOOD_LOGO_VIP_COURSE);
+        } else if (GoodTypeEnum.GROUP.equals(goodTypeEnum)) {
+            configValue = sysConfigService.findConfigValue(SysConfigConstant.GOOD_LOGO_GROUP);
         }
         return configValue;
     }

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

@@ -47,6 +47,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.PostConstruct;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.MessageFormat;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
@@ -179,6 +180,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
         orderGoodsCreate.put(GoodTypeEnum.DISCOUNT, memberPriceSettingsService::discountCreate);
         //直播课程购买
         orderGoodsCreate.put(GoodTypeEnum.LIVE, courseGroupService::buyLiveCourse);
+        orderGoodsCreate.put(GoodTypeEnum.GROUP, courseGroupService::buyLiveCourse);
         //趣纠课购买
         orderGoodsCreate.put(GoodTypeEnum.PRACTICE, scheduleService::buyPracticeCourse);
         //视频课购买
@@ -207,6 +209,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
 
         //直播课程购买
         orderSuccessAfter.put(GoodTypeEnum.LIVE, courseGroupService::buyLiveCourseAfter);
+        orderSuccessAfter.put(GoodTypeEnum.GROUP, courseGroupService::buyLiveCourseAfter);
         //趣纠课购买
         orderSuccessAfter.put(GoodTypeEnum.PRACTICE, scheduleService::buyPracticeCourseAfter);
         orderSuccessAfter.put(GoodTypeEnum.VIP_COURSE, scheduleService::buyPracticeCourseAfter);
@@ -222,6 +225,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
         paymentSuccess.put(GoodTypeEnum.PRACTICE, paymentDivMemberRecordService::practiceCourse);
         paymentSuccess.put(GoodTypeEnum.VIP_COURSE, paymentDivMemberRecordService::practiceCourse);
         paymentSuccess.put(GoodTypeEnum.LIVE, paymentDivMemberRecordService::liveCourse);
+        paymentSuccess.put(GoodTypeEnum.GROUP, paymentDivMemberRecordService::liveCourse);
         paymentSuccess.put(GoodTypeEnum.VIDEO, paymentDivMemberRecordService::videoCourse);
         paymentSuccess.put(GoodTypeEnum.ALBUM, paymentDivMemberRecordService::musicSheet);
         paymentSuccess.put(GoodTypeEnum.VIP, paymentDivMemberRecordService::vip);
@@ -827,6 +831,11 @@ DISCOUNT("畅学卡")
                         actualPrice = goodsInfo.getUserOrderDetail().getActualPrice();
                     }
                     break;
+                case GROUP:
+                    if (goodsInfo.getGoodType().equals(GoodTypeEnum.GROUP)) {
+                        actualPrice = goodsInfo.getUserOrderDetail().getActualPrice();
+                    }
+                    break;
                 case VIDEO:
                     if (goodsInfo.getGoodType().equals(GoodTypeEnum.VIDEO)) {
                         actualPrice = goodsInfo.getUserOrderDetail().getActualPrice();
@@ -1689,6 +1698,16 @@ DISCOUNT("畅学卡")
         if (orderDetailIds != null) {
             collect = detail.getOrderDetailList().stream().filter(o -> orderDetailIds.contains(o.getId())).collect(Collectors.toList());
         }
+        if (CollectionUtils.isEmpty(collect)) {
+            throw new BizException("订单明细不存在");
+        }
+
+        // 判断当前商品是否已退款
+        List<UserOrderRefund> userOrderRefunds = userOrderRefundService.getByOrderNo(orderNo,collect.stream().map(o -> o.getId()).collect(Collectors.toList()));
+        if (CollectionUtils.isNotEmpty(userOrderRefunds)) {
+            throw new BizException("订单商品已退款");
+        }
+
 
         BigDecimal reduce = collect.stream().map(o -> o.getActualPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
         // 提交退款申请记录
@@ -1854,9 +1873,9 @@ DISCOUNT("畅学卡")
             // 已产生三方交易流水号,先判断三方订单支付状态若在支付中,则重复返回相同支付配置参数;避免用户重复支付
             // 原生支付(微信,支付宝)流水号后产品,需要查询三方支付订单状态
             if (StringUtils.isNotBlank(paymentOrder.getTransNo())
-                || EPaymentVendor.ORIGINAL.name().equalsIgnoreCase(paymentOrder.getPaymentVendor())
-                || EPaymentVendor.WXPAY.name().equalsIgnoreCase(paymentOrder.getPaymentVendor())
-                || EPaymentVendor.ALIPAY.name().equalsIgnoreCase(paymentOrder.getPaymentVendor())) {
+                || paymentOrder.getPaymentVendor().startsWith(EPayerType.ORIGINAL.name().toLowerCase())
+                || paymentOrder.getPaymentVendor().startsWith(EPaymentVendor.WXPAY.name().toLowerCase())
+                || paymentOrder.getPaymentVendor().startsWith(EPaymentVendor.ALIPAY.name().toLowerCase())) {
 
                 // 获取三方支付订单信息,根据订单状处理
                 PaymentResp paymentResp = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVendor())
@@ -1893,4 +1912,47 @@ DISCOUNT("畅学卡")
         },10L,TimeUnit.SECONDS);
 
     }
+
+    @Override
+    public void scanRefundOrderRecord() {
+        List<UserOrderRefundBill> pendingList = userOrderRefundBillService.getPendingList();
+        for (UserOrderRefundBill userOrderRefundBill : pendingList) {
+            UserOrderRefund refund = userOrderRefundService.getById(userOrderRefundBill.getRefundId());
+            if (Objects.isNull(refund)) {
+                continue;
+            }
+            UserPaymentOrderWrapper.UserPaymentOrder paymentOrder = userPaymentOrderService.getUserPaymentOrderByOrderNo(refund.getOrderNo());
+            if (Objects.isNull(paymentOrder)) {
+                continue;
+            }
+            // 查询退款状态
+            // 查询订单退款状态
+
+            try {
+                RefundResp refundResp = paymentServiceContext.getPaymentService(paymentOrder.getPaymentVendor())
+                        .queryRefund(userOrderRefundBill.getTransNo(), userOrderRefundBill.getBillNo(), paymentOrder.getOrderNo());
+
+                log.info("refundConfirm REFUND refundResp={}, paymentStatus={},", JSON.toJSONString(refundResp), paymentOrder.getStatus());
+                // 退款申请处理中
+                if (PaymentStatus.PENDDING == refundResp.getPaymentStatus()) {
+                    continue;
+                }
+                // 申请请求失败
+                if (PaymentStatus.FAILED == refundResp.getPaymentStatus()) {
+                    userOrderRefundBill.setStatus(TradeStatusEnum.failed);
+                    userOrderRefundBill.setPayFailMsg(refundResp.getMsg());
+                } else  if (PaymentStatus.SUCCESSED == refundResp.getPaymentStatus()) {
+                    // 更新退款订单状态
+                    userOrderRefundBill.setStatus(TradeStatusEnum.succeeded);
+                    userOrderRefundBill.setPayFailMsg("");
+                }
+            } catch (Exception e) {
+                userOrderRefundBill.setStatus(TradeStatusEnum.failed);
+                userOrderRefundBill.setPayFailMsg(e.getMessage());
+                log.error("refundOnly orderNo={}", userOrderRefundBill.getBillNo(), e);
+            }
+            userOrderRefundBillService.updateById(userOrderRefundBill);
+        }
+
+    }
 }

+ 25 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseInfoVo.java

@@ -0,0 +1,25 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "CourseInfoVo", description = "课程组详情")
+public class CourseInfoVo extends CourseGroupVo implements Serializable {
+
+    @ApiModelProperty(value = "true 自己的课,false 其他老师的课程")
+    private Boolean myself;
+
+    @ApiModelProperty(value = "是否审核时可见 (0:否  1:是)")
+    private YesOrNoEnum auditVersion = YesOrNoEnum.NO;
+
+    @ApiModelProperty("学位认证 0:未认证 1:已认证 ")
+    private YesOrNoEnum degreeFlag;
+
+    @ApiModelProperty("教师资格认证 0:未认证 1:已认证 ")
+    private YesOrNoEnum teacherFlag;
+}

+ 6 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderRefundBillMapper.xml

@@ -55,4 +55,10 @@
             </if>
         </where>
     </select>
+
+    <select id="getPendingList" resultMap="BaseResultMap">
+        select t.*
+        from user_order_refund_bill t
+        where t.status_ = 'pending'
+    </select>
 </mapper>

+ 8 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderRefundMapper.xml

@@ -77,4 +77,12 @@
                   and FIND_IN_SET(d.id_,r.oredr_detil_ids_)
           )
     </select>
+
+    <select id="getByOrderNo" resultMap="BaseResultMap">
+        SELECT <include refid="baseColumns" /> FROM user_order_refund t
+        WHERE t.order_no_ = #{orderNo} and
+        <foreach collection="orderDetailIds" item="item" open="(" separator="," close=")">
+            FIND_IN_SET(#{item}, t.oredr_detil_ids_)
+        </foreach>
+    </select>
 </mapper>