Browse Source

Merge remote-tracking branch 'origin/zx_online_update_1218' into zx_online_update_1218

zouxuan 3 months ago
parent
commit
30bea4a389
25 changed files with 261 additions and 28 deletions
  1. 1 1
      audio-analysis/src/main/java/com/yonge/netty/server/service/AudioCompareHandler.java
  2. 1 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java
  3. 10 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
  4. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderRefundBillDao.java
  5. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserOrderRefundDao.java
  6. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysMusicCompareRecord.java
  7. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AccountBizTypeEnum.java
  8. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/GoodTypeEnum.java
  9. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  10. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/OrderTypeEnum.java
  11. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/coupon/CouponCategoryEnum.java
  12. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseGroupService.java
  13. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundBillService.java
  14. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java
  15. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserPaymentCoreService.java
  16. 87 13
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  17. 13 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PaymentDivMemberRecordServiceImpl.java
  18. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundBillServiceImpl.java
  19. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  20. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  21. 83 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserPaymentCoreServiceImpl.java
  22. 6 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/MusicPracticeRecordWrapper.java
  23. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  24. 6 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderRefundBillMapper.xml
  25. 8 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderRefundMapper.xml

+ 1 - 1
audio-analysis/src/main/java/com/yonge/netty/server/service/AudioCompareHandler.java

@@ -150,7 +150,7 @@ public class AudioCompareHandler implements MessageHandler {
 				sysMusicCompareRecord.setBehaviorId(musicXmlBasicInfo.getBehaviorId());
 				sysMusicCompareRecord.setClientId(musicXmlBasicInfo.getClientId());
 				sysMusicCompareRecord.setDeviceType(DeviceTypeEnum.valueOf(musicXmlBasicInfo.getPlatform()));
-				sysMusicCompareRecord.setSpeed(musicXmlBasicInfo.getSpeed());
+				sysMusicCompareRecord.setSpeed(String .valueOf(musicXmlBasicInfo.getSpeed()));
 				sysMusicCompareRecord.setPartIndex(musicXmlBasicInfo.getPartIndex());
 				sysMusicCompareRecord.setCustomConfiguration(musicXmlBasicInfo.getCustomConfiguration());
 				

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

+ 10 - 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
@@ -508,4 +513,9 @@ public interface SysConfigConstant {
     String COURSE_SUBJECT_MAP = "course_subject_map";
     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);
 }

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

@@ -76,7 +76,7 @@ public class SysMusicCompareRecord extends BaseEntity {
 
 	private float playTime = 0;
 
-	private int speed = 90;
+	private String speed = "90";
 
 	private String clientId;
 	

+ 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

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

@@ -379,5 +379,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();
 }

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

@@ -361,7 +361,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 +379,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 +549,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 +583,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 +1400,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 +1425,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 +1452,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 +1466,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 +1492,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 +1571,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 +1587,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);
             }
         }
     }

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

+ 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

@@ -1169,6 +1169,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;
     }

+ 83 - 4
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);
@@ -530,6 +534,7 @@ public class UserPaymentCoreServiceImpl implements UserPaymentCoreService {
     @Transactional
     @Override
     public UserPaymentOrderWrapper.PaymentConfig executeOrder(UserPaymentOrderWrapper.UserPaymentOrder orderReq) {
+        log.info("executeOrder orderReq={}", orderReq.jsonString());
 
         // 填充订单基本信息
         String defaultService = paymentServiceContext.defaultService();
@@ -826,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();
@@ -1077,6 +1087,7 @@ DISCOUNT("畅学卡")
     @Transactional
     @Override
     public UserPaymentOrderWrapper.PaymentReq executePayment(UserPaymentOrderWrapper.PaymentOrderReqConfig reqConfig) {
+        log.info("executePayment reqConfig={}", reqConfig.jsonString());
 
         // 查询订单状态
         UserPaymentOrderWrapper.UserPaymentOrder userPaymentOrder = userPaymentOrderService.getUserPaymentOrderByUserId(Long.parseLong(reqConfig.getUserId()),
@@ -1084,7 +1095,22 @@ DISCOUNT("畅学卡")
 
         // 默认支付三方
         if (StringUtils.isNotEmpty(reqConfig.getPaymentVendor())
-                && !reqConfig.getPaymentVendor().equals(userPaymentOrder.getPaymentVendor())) {
+                && (!reqConfig.getPaymentVendor().equals(userPaymentOrder.getPaymentVendor())
+                || !reqConfig.getPaymentChannel().equals(userPaymentOrder.getPaymentChannel()))) {
+            if (EPaymentStatus.PAYING == userPaymentOrder.getStatus()) {
+                String errorMsg = "";
+                if (StringUtils.isNotBlank(userPaymentOrder.getPaymentChannel())) {
+                    if (userPaymentOrder.getPaymentChannel().startsWith("ali")) {
+                        errorMsg = "支付宝";
+                    } else if (userPaymentOrder.getPaymentChannel().startsWith("wx")) {
+                        errorMsg = "微信";
+                    } else {
+                        throw new BizException("该订单已选择支付渠道,若需修改请重新下单");
+                    }
+                }
+
+                throw new BizException("该订单已选择"+errorMsg+"支付,若需修改请重新下单");
+            }
             // 原生支付拉起支付时,可以切换支付渠道
             UserPaymentOrderWrapper.UserPaymentOrder update = UserPaymentOrderWrapper.UserPaymentOrder
                 .builder()
@@ -1672,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);
         // 提交退款申请记录
@@ -1837,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())
@@ -1876,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);
+        }
+
+    }
 }

+ 6 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/MusicPracticeRecordWrapper.java

@@ -483,6 +483,8 @@ public class MusicPracticeRecordWrapper {
         private Boolean delFlag;
 
 
+        @ApiModelProperty("是否隐藏评测记录 0:不隐藏 1:隐藏")
+        private Boolean hiddenFlag;
         @ApiModelProperty("曲目评测来源 TENANT 机构 PLATFORM 平台")
         private String providerType;
 
@@ -507,7 +509,7 @@ public class MusicPracticeRecordWrapper {
                 .sourceTime(record.getSourceTime())
                 .playTime(record.getPlayTime())
                 .playRate(record.getPlayRate())
-                .speed(String.valueOf(OptionalInt.of(record.getSpeed()).orElse(0)))
+                .speed(record.getSpeed())
                 .monday(record.getMonday())
                 .feature(record.getFeature()!=null?record.getFeature().toCbs():null)
                 .heardLevel(record.getHeardLevel() !=null?record.getHeardLevel().getCode():null)
@@ -521,6 +523,7 @@ public class MusicPracticeRecordWrapper {
                 .updateTime(record.getCreateTime())
                 .createTime(record.getCreateTime())
                 .delFlag(record.getDelFlag())
+                .hiddenFlag(record.getHiddenFlag())
                 .providerType(record.getProviderType())
                 .build();
         }
@@ -543,7 +546,7 @@ public class MusicPracticeRecordWrapper {
             sysMusicCompareRecord.setDeviceType(DeviceTypeEnum.valueOf(this.deviceType));
             sysMusicCompareRecord.setSourceTime(this.sourceTime);
             sysMusicCompareRecord.setPlayTime(this.playTime);
-            sysMusicCompareRecord.setSpeed(this.speed!=null?Integer.parseInt(this.speed):90);
+            sysMusicCompareRecord.setSpeed(this.speed);
             sysMusicCompareRecord.setMonday(this.monday);
             sysMusicCompareRecord.setFeature(this.feature!=null? FeatureType.format(this.feature):null);
             sysMusicCompareRecord.setHeardLevel(this.heardLevel!=null? HeardLevelEnum.valueOf(this.heardLevel):null);
@@ -558,6 +561,7 @@ public class MusicPracticeRecordWrapper {
             sysMusicCompareRecord.setDelFlag(this.delFlag);
             sysMusicCompareRecord.setPlayRate(this.playRate);
             sysMusicCompareRecord.setProviderType(this.providerType ==null?"PLATFORM":this.providerType);
+            sysMusicCompareRecord.setHiddenFlag(this.hiddenFlag);
 
             return sysMusicCompareRecord;
 

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

@@ -63,7 +63,7 @@
 		       #{score},#{intonation},#{cadence},#{integrity},
 		       #{recordFilePath},#{videoFilePath},#{deviceType,typeHandler=com.yonge.toolset.mybatis.dal.CustomEnumTypeHandler},#{clientId},#{playTime},#{speed},#{monday},
 		       #{sourceTime},#{feature,typeHandler=com.yonge.toolset.mybatis.dal.CustomEnumTypeHandler}, NOW(), NOW(),#{partIndex},#{customConfiguration},#{tenantId},
-        #{practiceTime},#{practiceSource},#{resultAnalyze},#{headphoneFlag},#{instrumentId},#{hiddenFlag},#{delFlag},#{playRate},#{providerType})
+        #{practiceTime},#{practiceSource},#{resultAnalyze},#{headphoneFlag},#{instrumentId},ifnull(#{hiddenFlag},0),ifnull(#{delFlag},0),#{playRate},#{providerType})
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->

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