Bladeren bron

Merge branch 'master_saas' of http://git.dayaedu.com/yonge/mec into master_saas

liujunchi 3 jaren geleden
bovenliggende
commit
cefc77796d
57 gewijzigde bestanden met toevoegingen van 1677 en 411 verwijderingen
  1. 4 0
      audio-analysis/src/main/java/com/yonge/netty/server/service/AudioCompareHandler.java
  2. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperDao.java
  3. 3 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupDao.java
  4. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LiveGoodsDao.java
  5. 6 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LiveGoodsMapperDao.java
  6. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicCompareRecordDao.java
  7. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TempBuyFreeLiveTheoryCourseDao.java
  8. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TempLittleArtistTrainingCampDao.java
  9. 29 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MemberPayParamDto.java
  10. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/RedisKeyConstant.java
  11. 100 45
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ActivityUserMapper.java
  12. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroup.java
  13. 63 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TempBuyFreeLiveTheoryCourse.java
  14. 12 6
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TempLittleArtistTrainingCamp.java
  15. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/LiveGoodsMapperQueryInfo.java
  16. 30 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/LiveGoodsQueryInfo.java
  17. 34 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomDetailVo.java
  18. 74 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/TempCampUserQualificationsVo.java
  19. 58 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/TempCampUserTrainingPlayTimeVo.java
  20. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperService.java
  21. 0 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupMemberService.java
  22. 15 4
      mec-biz/src/main/java/com/ym/mec/biz/service/LiveGoodsMapperService.java
  23. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/service/LiveGoodsService.java
  24. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/PracticeGroupService.java
  25. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicCompareRecordService.java
  26. 27 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TempLittleArtistTrainingCampService.java
  27. 13 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TempLittleArtistTrainingCampUserRelationService.java
  28. 37 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperServiceImpl.java
  29. 35 28
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  30. 3 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java
  31. 126 67
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java
  32. 70 18
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/LiveGoodsMapperServiceImpl.java
  33. 132 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/LiveGoodsServiceImpl.java
  34. 71 18
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java
  35. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  36. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java
  37. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java
  38. 179 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TempLittleArtistTrainingCampServiceImpl.java
  39. 78 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TempLittleArtistTrainingCampUserRelationServiceImpl.java
  40. 30 5
      mec-biz/src/main/resources/config/mybatis/ActivityUserMapperMapper.xml
  41. 4 1
      mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomDataMapper.xml
  42. 21 3
      mec-biz/src/main/resources/config/mybatis/LiveGoodsMapper.xml
  43. 31 20
      mec-biz/src/main/resources/config/mybatis/LiveGoodsMapperMapper.xml
  44. 4 0
      mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  45. 60 0
      mec-biz/src/main/resources/config/mybatis/TempBuyFreeLiveTheoryCourseMapper.xml
  46. 9 0
      mec-biz/src/main/resources/config/mybatis/TempLittleArtistTrainingCampMapper.xml
  47. 0 2
      mec-im/src/main/java/com/ym/service/MessageService.java
  48. 32 0
      mec-student/src/main/java/com/ym/mec/student/controller/ActivityUserMapperController.java
  49. 24 2
      mec-student/src/main/java/com/ym/mec/student/controller/LiveGoodsMapperController.java
  50. 4 3
      mec-student/src/main/java/com/ym/mec/student/controller/MemberRankController.java
  51. 31 89
      mec-student/src/main/java/com/ym/mec/student/controller/PracticeGroupController.java
  52. 10 1
      mec-student/src/main/java/com/ym/mec/student/controller/SysMusicCompareRecordController.java
  53. 35 40
      mec-student/src/main/java/com/ym/mec/student/controller/TempLittleArtistTrainingCampController.java
  54. 4 1
      mec-web/src/main/java/com/ym/mec/web/controller/ImSendGroupMessageController.java
  55. 12 8
      mec-web/src/main/java/com/ym/mec/web/controller/LiveGoodsController.java
  56. 20 7
      mec-web/src/main/java/com/ym/mec/web/controller/LiveGoodsMapperController.java
  57. 52 5
      mec-web/src/main/java/com/ym/mec/web/controller/TempLittleArtistTrainingCampController.java

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

@@ -232,6 +232,10 @@ public class AudioCompareHandler implements MessageHandler {
 					sysMusicCompareRecordService.saveMusicCompareData(sysMusicCompareRecord);
 				}
 				
+				int totalPlayTimeOfCurrentDate = sysMusicCompareRecordService.queryCurrentDatePlayTimeByUserId(sysMusicCompareRecord.getUserId());
+				
+				params.put("totalPlayTimeOfCurrentDate", totalPlayTimeOfCurrentDate);
+				
 				WebSocketResponse<Map<String, Object>> resp = new WebSocketResponse<Map<String, Object>>("overall", params);
 
 				nettyChannelManager.sendTextMessage(user, resp);

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ActivityUserMapperDao.java

@@ -105,4 +105,8 @@ public interface ActivityUserMapperDao extends BaseDAO<Integer, ActivityUserMapp
      * @date 2021/11/15 16:38
      */
     List<ActivityStudentDto> queryActivityUserMapper(Map<String, Object> params);
+
+    //获取学员未排课资格
+    Integer getStudentNoMapperInfo(@Param("userId") Integer userId,
+                                  @Param("activityId") Integer activityId);
 }

+ 3 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupDao.java

@@ -1,12 +1,11 @@
 package com.ym.mec.biz.dal.dao;
 
-import java.util.List;
-
-import org.apache.ibatis.annotations.Param;
-
 import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
 import com.ym.mec.biz.dal.entity.ImGroup;
 import com.ym.mec.common.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface ImGroupDao extends BaseDAO<Long, ImGroup> {
 

+ 8 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LiveGoodsDao.java

@@ -2,8 +2,15 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.biz.dal.entity.LiveGoods;
+import org.apache.ibatis.annotations.Param;
 
 public interface LiveGoodsDao extends BaseDAO<Integer, LiveGoods> {
 
-	
+    LiveGoods getLock(Integer liveGoodsId);
+
+    int reduceStock(@Param("liveGoodsId") Integer liveGoodsId);
+
+    void addStock(@Param("liveGoodsId") Integer liveGoodsId);
+
+    LiveGoods getByName(@Param("goodsName") String goodsName);
 }

+ 6 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LiveGoodsMapperDao.java

@@ -13,15 +13,17 @@ public interface LiveGoodsMapperDao extends BaseDAO<Integer, LiveGoodsMapper> {
 
     List<LiveGoodsMapper> findByLiveGoodsIdAndStatus(@Param("liveGoodsId") Integer liveGoodsId, @Param("status") Boolean status);
 
-    void updateStatus(@Param("liveId") String liveId, @Param("liveGoodsId") Integer liveGoodsId, @Param("status") boolean status);
+    int updateStatus(@Param("liveId") String liveId, @Param("liveGoodsId") Integer liveGoodsId, @Param("status") boolean status);
 
     LiveGoodsMapper findByLiveIdAndGoodsId(@Param("liveId") String liveId, @Param("liveGoodsId") Integer liveGoodsId);
 
-    List<LiveGoodsMapperDto> getLiveGoodsList(@Param("liveId") String liveId);
+    List<LiveGoodsMapperDto> getLiveGoodsList(@Param("liveId") String liveId, @Param("liveGoodsId") Integer liveGoodsId, @Param("status") Boolean status);
 
-    void batchInsert(@Param("liveGoodsMappers") List<LiveGoodsMapper> liveGoodsMappers);
+    void batchInsert(@Param("liveId") String liveId, @Param("liveGoodsIds") String[] liveGoodsIds);
 
     int countLiveGoods(Map<String, Object> params);
 
-    List<LiveGoods> queryGoodsPage(Map<String, Object> params);
+    List<LiveGoodsMapperDto> queryGoodsPage(Map<String, Object> params);
+
+    List<Integer> queryGoodsIdsByLiveId(@Param("liveId") String liveId);
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicCompareRecordDao.java

@@ -99,4 +99,6 @@ public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareR
     Integer getUserWeekMaxMusicScoreId(@Param("userId") Integer userId,
                                        @Param("monday") String monday,
                                         @Param("heardLevel") HeardLevelEnum heardLevel);
+    
+    int queryCurrentDatePlayTimeByUserId(Integer userId);
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TempBuyFreeLiveTheoryCourseDao.java

@@ -0,0 +1,11 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.biz.dal.entity.TempBuyFreeLiveTheoryCourse;
+import org.apache.ibatis.annotations.Param;
+
+public interface TempBuyFreeLiveTheoryCourseDao extends BaseDAO<Integer, TempBuyFreeLiveTheoryCourse> {
+
+
+    int countByUserId(@Param("userId") Integer userId);
+}

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TempLittleArtistTrainingCampDao.java

@@ -34,6 +34,10 @@ public interface TempLittleArtistTrainingCampDao extends BaseMapper<TempLittleAr
      */
     <T> IPage<T> queryUserTrainingDetail(Page<T> page, @Param("param") Map<String, Object> param);
 
+    <T> List<T> queryUserTrainingDetail(@Param("param") Map<String, Object> param);
+
     List<ImGroup> queryCampImGroup(String imGroupIds);
+
+    Integer queryUserTrainingPlayTime(@Param("param") Map<String, Object> param);
 }
 

+ 29 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MemberPayParamDto.java

@@ -1,25 +1,52 @@
 package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.biz.dal.enums.PeriodEnum;
+import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
 
 public class MemberPayParamDto extends PayParamBasicDto implements Serializable {
 
-    //前端录入实际缴费金额
+    @ApiModelProperty(value = "前端录入实际缴费金额",required = false)
     private BigDecimal amount;
 
+    @ApiModelProperty(value = "用于后台创建的团练宝订单购买",required = false)
     private Long paymentId;
 
-    //购买数量
+    @ApiModelProperty(value = "购买数量",required = false)
     private Integer val;
 
     //如果isRepeatPay = true 则需要传入订单号
     private String orderNo;
 
+    @ApiModelProperty(value = "年月日",required = false)
     private PeriodEnum periodEnum;
 
+    //直播房间号
+    @ApiModelProperty(value = "直播房间号(用于直播间商品购买)",required = false)
+    private String liveId;
+
+    //商品编号
+    @ApiModelProperty(value = "直播间商品编号(用于直播间商品购买,目前只支持1和2,1代表免费的云课堂,2代表云教练(送网管课))",required = false)
+    private Integer liveGoodsId;
+
+    public String getLiveId() {
+        return liveId;
+    }
+
+    public void setLiveId(String liveId) {
+        this.liveId = liveId;
+    }
+
+    public Integer getLiveGoodsId() {
+        return liveGoodsId;
+    }
+
+    public void setLiveGoodsId(Integer liveGoodsId) {
+        this.liveGoodsId = liveGoodsId;
+    }
+
     public PeriodEnum getPeriodEnum() {
         return periodEnum;
     }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/RedisKeyConstant.java

@@ -0,0 +1,11 @@
+package com.ym.mec.biz.dal.dto;
+
+public interface RedisKeyConstant {
+
+    //直播间商品库存缓存key
+    String LIVE_GOODS_STOCK_CACHE_KEY = "live_goods_stock:";
+    //直播间商品冻结库存缓存key
+    String LIVE_GOODS_FROZEN_CACHE_KEY = "live_goods_frozen_stock:";
+    //购买了0元直播课的学员
+    String LIVE_GOODS_ZERO_CACHE_KEY = "live_goods_zero:";
+}

+ 100 - 45
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ActivityUserMapper.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.entity;
 
 import com.ym.mec.common.entity.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import java.math.BigDecimal;
@@ -10,56 +11,78 @@ import java.math.BigDecimal;
  */
 public class ActivityUserMapper extends BaseEntity {
 
-	/**  */
 	private Integer id;
 	
-	/**  */
+	@ApiModelProperty(value = "活动编号")
 	private Integer activityId;
 	
-	/**  */
+	@ApiModelProperty(value = "学员编号")
 	private Integer userId;
 
-	/**  */
+	@ApiModelProperty(value = "指导老师编号")
 	private Integer teacherId;
 	
-	/** vip课排课标记0没有排课资格1未排课2已排课 */
+	@ApiModelProperty(value = "vip课排课标记0没有排课资格1未排课2已排课")
 	private Integer vipFlag = 0;
 	
-	/**  */
+	@ApiModelProperty(value = "赠送vip课次数")
 	private Integer giveVipFlag = 0;
-	
-	/**  */
+
+	@ApiModelProperty(value = "网管课次数")
 	private Integer practiceFlag = 0;
-	
-	/**  */
+
+	@ApiModelProperty(value = "赠送网管课次数")
 	private Integer givePracticeFlag = 0;
 
-	/**  */
+	@ApiModelProperty(value = "购买会员标识")
 	private Integer memberFlag = 0;
 
-	/**  */
+	@ApiModelProperty(value = "赠送会员标识")
 	private Integer giveMemberFlag = 0;
 
+	@ApiModelProperty(value = "购买的总课时数")
+	private Integer totalCourseNum;
+
+	@ApiModelProperty(value = "赠送的总课时数")
+	private Integer totalGiveCourseNum;
+
+	@ApiModelProperty(value = "剩余的总课时数")
+	private Integer subCourseNum;
+
+	@ApiModelProperty(value = "剩余的赠送课时数")
+	private Integer subGiveCourseNum;
+
+	@ApiModelProperty(value = "缴费编号")
 	private Long paymentOrderId;
 
+	@ApiModelProperty(value = "已排课的vip课程组编号")
 	private Long vipGroupId;
 
+	@ApiModelProperty(value = "已排课的赠送的vip课程组编号")
 	private Long giveVipGroupId;
 
+	@ApiModelProperty(value = "会员订单号")
 	private Long memberOrderId;
 
+	@ApiModelProperty(value = "赠送的会员订单号")
 	private Long giveMemberOrderId;
 
+	@ApiModelProperty(value = "已排课的陪练课课程组编号")
 	private Long practiceGroupId;
 
+	@ApiModelProperty(value = "已排课的陪练课课程组编号")
 	private Long givePracticeGroupId;
 
+	@ApiModelProperty(value = "是否退费")
 	private Boolean returnFee = false;
 
+	@ApiModelProperty(value = "实际支付金额")
 	private BigDecimal actualPrice = BigDecimal.ZERO;
 
+	@ApiModelProperty(value = "添加资格时的备注")
 	private String addMemo;
 
+	@ApiModelProperty(value = "减少资格时的备注")
 	private String cutMemo;
 	
 	/**  */
@@ -68,9 +91,73 @@ public class ActivityUserMapper extends BaseEntity {
 	/**  */
 	private java.util.Date updateTime;
 
-	//赠送的优惠券编号
+	@ApiModelProperty(value = "赠送的优惠券编号")
 	private Integer giveCouponId;
 
+	public Integer getTotalCourseNum() {
+		return totalCourseNum;
+	}
+
+	public void setTotalCourseNum(Integer totalCourseNum) {
+		this.totalCourseNum = totalCourseNum;
+	}
+
+	public Integer getTotalGiveCourseNum() {
+		return totalGiveCourseNum;
+	}
+
+	public void setTotalGiveCourseNum(Integer totalGiveCourseNum) {
+		this.totalGiveCourseNum = totalGiveCourseNum;
+	}
+
+	public Integer getSubCourseNum() {
+		return subCourseNum;
+	}
+
+	public void setSubCourseNum(Integer subCourseNum) {
+		this.subCourseNum = subCourseNum;
+	}
+
+	public Integer getSubGiveCourseNum() {
+		return subGiveCourseNum;
+	}
+
+	public void setSubGiveCourseNum(Integer subGiveCourseNum) {
+		this.subGiveCourseNum = subGiveCourseNum;
+	}
+
+	public Long getVipGroupId() {
+		return vipGroupId;
+	}
+
+	public void setVipGroupId(Long vipGroupId) {
+		this.vipGroupId = vipGroupId;
+	}
+
+	public Long getGiveVipGroupId() {
+		return giveVipGroupId;
+	}
+
+	public void setGiveVipGroupId(Long giveVipGroupId) {
+		this.giveVipGroupId = giveVipGroupId;
+	}
+
+	public Long getPracticeGroupId() {
+		return practiceGroupId;
+	}
+
+	public void setPracticeGroupId(Long practiceGroupId) {
+		this.practiceGroupId = practiceGroupId;
+	}
+
+	public Long getGivePracticeGroupId() {
+		return givePracticeGroupId;
+	}
+
+	public void setGivePracticeGroupId(Long givePracticeGroupId) {
+		this.givePracticeGroupId = givePracticeGroupId;
+	}
+
 	public Integer getGiveCouponId() {
 		return giveCouponId;
 	}
@@ -151,38 +238,6 @@ public class ActivityUserMapper extends BaseEntity {
 		this.returnFee = returnFee;
 	}
 
-	public Long getVipGroupId() {
-		return vipGroupId;
-	}
-
-	public void setVipGroupId(Long vipGroupId) {
-		this.vipGroupId = vipGroupId;
-	}
-
-	public Long getGiveVipGroupId() {
-		return giveVipGroupId;
-	}
-
-	public void setGiveVipGroupId(Long giveVipGroupId) {
-		this.giveVipGroupId = giveVipGroupId;
-	}
-
-	public Long getPracticeGroupId() {
-		return practiceGroupId;
-	}
-
-	public void setPracticeGroupId(Long practiceGroupId) {
-		this.practiceGroupId = practiceGroupId;
-	}
-
-	public Long getGivePracticeGroupId() {
-		return givePracticeGroupId;
-	}
-
-	public void setGivePracticeGroupId(Long givePracticeGroupId) {
-		this.givePracticeGroupId = givePracticeGroupId;
-	}
-
 	public Long getPaymentOrderId() {
 		return paymentOrderId;
 	}

+ 3 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroup.java

@@ -10,7 +10,7 @@ import com.ym.mec.common.entity.BaseEntity;
 public class ImGroup extends BaseEntity {
 
 	/**  */
-	private Long id;
+	private String id;
 	
 	/** 群名称 */
 	private String name;
@@ -37,11 +37,11 @@ public class ImGroup extends BaseEntity {
 	/**  */
 	private java.util.Date updateTime;
 	
-	public void setId(Long id){
+	public void setId(String id){
 		this.id = id;
 	}
 	
-	public Long getId(){
+	public String getId(){
 		return this.id;
 	}
 			

+ 63 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TempBuyFreeLiveTheoryCourse.java

@@ -0,0 +1,63 @@
+package com.ym.mec.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(temp_buy_free_live_theory_course):
+ */
+public class TempBuyFreeLiveTheoryCourse {
+
+	/**  */
+	private Integer id;
+	
+	/**  */
+	private Integer userId;
+	
+	/**  */
+	private java.util.Date createTime;
+	
+	/**  */
+	private java.util.Date updateTime;
+
+	public TempBuyFreeLiveTheoryCourse(Integer userId) {
+		this.userId = userId;
+	}
+
+	public void setId(Integer id){
+		this.id = id;
+	}
+	
+	public Integer getId(){
+		return this.id;
+	}
+			
+	public void setUserId(Integer userId){
+		this.userId = userId;
+	}
+	
+	public Integer getUserId(){
+		return this.userId;
+	}
+			
+	public void setCreateTime(java.util.Date createTime){
+		this.createTime = createTime;
+	}
+	
+	public java.util.Date getCreateTime(){
+		return this.createTime;
+	}
+			
+	public void setUpdateTime(java.util.Date updateTime){
+		this.updateTime = updateTime;
+	}
+	
+	public java.util.Date getUpdateTime(){
+		return this.updateTime;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 12 - 6
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TempLittleArtistTrainingCamp.java

@@ -19,13 +19,13 @@ import java.io.Serializable;
  */
 @ApiModel(value = "temp_little_artist_training_camp-小小艺术家训练营活动")
 public class TempLittleArtistTrainingCamp implements Serializable {
-    //筹备中
-    public static final String READY = "READY";
+    //未开始-未到报名时间
+    public static final String NOT_START = "NOT_START";
     //报名中
     public static final String APPLY = "APPLY";
-    //未开始
-    public static final String NOT_START = "NOT_START";
-    //进行中
+    //筹备中 - 报名结束-还未到训练时间
+    public static final String READY = "READY";
+    //进行中 - 训练周期内
     public static final String ING = "ING";
     //已结束
     public static final String END = "END";
@@ -59,7 +59,7 @@ public class TempLittleArtistTrainingCamp implements Serializable {
     private Date trainEndDate;
 
     @TableField("state_")
-    @ApiModelProperty(value = "筹备中 READY,报名中 APPLY,未开始 NOT_START,进行中 ING,已结束 END")
+    @ApiModelProperty(value = "未开始 NOT_START,报名中 APPLY,筹备中 READY,进行中 ING,已结束 END")
     private String state;
 
     @TableField("im_group_ids_")
@@ -143,10 +143,16 @@ public class TempLittleArtistTrainingCamp implements Serializable {
         this.trainEndDate = trainEndDate;
     }
 
+    /**
+     * 未开始 NOT_START,报名中 APPLY,筹备中 READY,进行中 ING,已结束 END
+     */
     public String getState() {
         return state;
     }
 
+    /**
+     * 未开始 NOT_START,报名中 APPLY,筹备中 READY,进行中 ING,已结束 END
+     */
     public void setState(String state) {
         this.state = state;
     }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/LiveGoodsMapperQueryInfo.java

@@ -11,6 +11,17 @@ public class LiveGoodsMapperQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "直播房间号",required = false)
     private String liveId;
 
+    @ApiModelProperty(value = "商品编号",required = false)
+    private Integer liveGoodsId;
+
+    public Integer getLiveGoodsId() {
+        return liveGoodsId;
+    }
+
+    public void setLiveGoodsId(Integer liveGoodsId) {
+        this.liveGoodsId = liveGoodsId;
+    }
+
     public String getLiveId() {
         return liveId;
     }

+ 30 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/LiveGoodsQueryInfo.java

@@ -0,0 +1,30 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+public class LiveGoodsQueryInfo extends QueryInfo {
+
+    @ApiModelProperty(value = "直播房间号(需要排出当前直播间的商品)",required = false)
+    private String liveId;
+
+    private List<Integer> ignoreGoodsIds;
+
+    public List<Integer> getIgnoreGoodsIds() {
+        return ignoreGoodsIds;
+    }
+
+    public void setIgnoreGoodsIds(List<Integer> ignoreGoodsIds) {
+        this.ignoreGoodsIds = ignoreGoodsIds;
+    }
+
+    public String getLiveId() {
+        return liveId;
+    }
+
+    public void setLiveId(String liveId) {
+        this.liveId = liveId;
+    }
+}

+ 34 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomDetailVo.java

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.entity.ImLiveRoomVideo;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -33,8 +34,41 @@ public class ImLiveBroadcastRoomDetailVo implements Serializable {
     @ApiModelProperty(value = "直播时长")
     private Integer totalLiveTime;
 
+    @ApiModelProperty(value = "直播开始时间")
+    private Date liveStartTime;
+
+    @ApiModelProperty(value = "直播结束时间")
+    private Date liveEndTime;
+
+    @ApiModelProperty(value = "直播状态 0未开始 1开始 2已结束")
+    private Integer liveState;
+
     private List<ImLiveRoomVideo> videoList;
 
+    public Date getLiveStartTime() {
+        return liveStartTime;
+    }
+
+    public void setLiveStartTime(Date liveStartTime) {
+        this.liveStartTime = liveStartTime;
+    }
+
+    public Date getLiveEndTime() {
+        return liveEndTime;
+    }
+
+    public void setLiveEndTime(Date liveEndTime) {
+        this.liveEndTime = liveEndTime;
+    }
+
+    public Integer getLiveState() {
+        return liveState;
+    }
+
+    public void setLiveState(Integer liveState) {
+        this.liveState = liveState;
+    }
+
     public String getRoomUid() {
         return roomUid;
     }

+ 74 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/TempCampUserQualificationsVo.java

@@ -0,0 +1,74 @@
+package com.ym.mec.biz.dal.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel(value = "训练营资格信息")
+public class TempCampUserQualificationsVo {
+
+    @ApiModelProperty(value = "训练营资格 有资格0  无资格1")
+    private Integer qualifications;
+
+    @ApiModelProperty(value = "训练营标题")
+    private String campTitle;
+
+    @ApiModelProperty(value = "用户名称")
+    private String userName;
+
+    @ApiModelProperty(value = "训练营内容文案")
+    private String content;
+
+    @ApiModelProperty(value = "训练营id")
+    private Integer campId;
+
+    @ApiModelProperty(value = "训练营url")
+    private String url;
+
+    public Integer getQualifications() {
+        return qualifications;
+    }
+
+    public void setQualifications(Integer qualifications) {
+        this.qualifications = qualifications;
+    }
+
+    public String getCampTitle() {
+        return campTitle;
+    }
+
+    public void setCampTitle(String campTitle) {
+        this.campTitle = campTitle;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getCampId() {
+        return campId;
+    }
+
+    public void setCampId(Integer campId) {
+        this.campId = campId;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+}

+ 58 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/TempCampUserTrainingPlayTimeVo.java

@@ -0,0 +1,58 @@
+package com.ym.mec.biz.dal.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+@ApiModel(value = "训练营-用户训练信息")
+public class TempCampUserTrainingPlayTimeVo {
+
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @ApiModelProperty(value = "训练开始日期")
+    private Date trainStartDate;
+
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @ApiModelProperty(value = "训练结束日期")
+    private Date trainEndDate;
+
+    @ApiModelProperty(value = "训练时长")
+    private Integer playTime;
+
+    @ApiModelProperty(value = "是否完成 0完成 1未完成")
+    private Integer isFinish;
+
+    public Date getTrainStartDate() {
+        return trainStartDate;
+    }
+
+    public void setTrainStartDate(Date trainStartDate) {
+        this.trainStartDate = trainStartDate;
+    }
+
+    public Date getTrainEndDate() {
+        return trainEndDate;
+    }
+
+    public void setTrainEndDate(Date trainEndDate) {
+        this.trainEndDate = trainEndDate;
+    }
+
+    public Integer getPlayTime() {
+        return playTime;
+    }
+
+    public void setPlayTime(Integer playTime) {
+        this.playTime = playTime;
+    }
+
+    public Integer getIsFinish() {
+        return isFinish;
+    }
+
+    public void setIsFinish(Integer isFinish) {
+        this.isFinish = isFinish;
+    }
+}

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ActivityUserMapperService.java

@@ -14,6 +14,7 @@ import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 public interface ActivityUserMapperService extends BaseService<Integer, ActivityUserMapper> {
 
@@ -115,4 +116,7 @@ public interface ActivityUserMapperService extends BaseService<Integer, Activity
     * @date 2021/12/29 17:28
     */
     void addOrderDetail2Activity(StudentPaymentOrder studentPaymentOrder, List<StudentPaymentOrderDetail> activity);
+
+    //获取学员未排课资格
+    Map<String,Object> getStudentNoMapperInfo();
 }

+ 0 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupMemberService.java

@@ -3,7 +3,6 @@ package com.ym.mec.biz.service;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.ImGroup;
 import com.ym.mec.biz.dal.entity.ImGroupMember;
-import com.ym.mec.biz.dal.entity.ImSendGroupMessage;
 import com.ym.mec.common.service.BaseService;
 
 import java.util.List;

+ 15 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/LiveGoodsMapperService.java

@@ -1,25 +1,36 @@
 package com.ym.mec.biz.service;
 
-import com.ym.mec.biz.dal.entity.LiveGoods;
+import com.ym.mec.biz.dal.dto.LiveGoodsMapperDto;
 import com.ym.mec.biz.dal.entity.LiveGoodsMapper;
 import com.ym.mec.biz.dal.page.LiveGoodsMapperQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
-import java.util.Collection;
 import java.util.List;
 
 public interface LiveGoodsMapperService extends BaseService<Integer, LiveGoodsMapper> {
 
-    void add(List<LiveGoodsMapper> liveGoodsMappers);
+    //新增直播间商品
+    void add(String liveId, String liveGoodsIds);
 
+    //商品下架
     void downGoods(Integer liveGoodsId);
 
+    //商品下架
     void downGoods(Integer liveGoodsId, String liveId);
 
+    //商品下架
+    void downGoods(String liveId);
+
+    //商品上架
     void upGoods(Integer liveGoodsId, String liveId);
 
     List<LiveGoodsMapper> findByLiveGoodsIdAndStatus(Integer goodsId, Boolean status);
 
-    PageInfo<LiveGoods> queryGoodsPage(LiveGoodsMapperQueryInfo queryInfo);
+    //分页查询
+    PageInfo<LiveGoodsMapperDto> queryGoodsPage(LiveGoodsMapperQueryInfo queryInfo);
+
+    List<LiveGoodsMapperDto> getLiveGoodsList(String liveId, Integer liveGoodsId, Boolean status);
+
+    List<Integer> queryGoodsIdsByLiveId(String liveId);
 }

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/LiveGoodsService.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.entity.LiveGoods;
+import com.ym.mec.biz.dal.page.LiveGoodsQueryInfo;
 import com.ym.mec.common.service.BaseService;
 
 public interface LiveGoodsService extends BaseService<Integer, LiveGoods> {
@@ -8,4 +9,23 @@ public interface LiveGoodsService extends BaseService<Integer, LiveGoods> {
     void updateLiveGoods(LiveGoods liveGoods);
 
     void deleteLiveGoods(Integer goodsId);
+
+    //初始化商品缓存
+    void initGoodsStockCache(Integer liveGoodsId, String liveId);
+
+    //商品库存+1
+    void addGoodsStock(Integer liveGoodsId, String liveId);
+
+    //商品库存-1
+    void reduceGoodsStock(Integer liveGoodsId, String liveId);
+
+    //商品冻结库存+1
+    void addGoodsFreezeStock(Integer liveGoodsId, String liveId);
+
+    //商品冻结库存-1
+    void reduceGoodsFreezeStock(Integer liveGoodsId, String liveId);
+
+    Object queryGoodsPage(LiveGoodsQueryInfo queryInfo);
+
+    void add(LiveGoods liveGoods);
 }

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/PracticeGroupService.java

@@ -394,4 +394,7 @@ public interface PracticeGroupService extends BaseService<Long, PracticeGroup> {
 	* @date 2021/11/2 18:07
 	*/
 	Map<String,BigDecimal> getStudentSurplusCourseFee(Long practiceGroupId);
+
+	//学生端网管课活动排课
+	HttpResponseResult studentCreateActivityPracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams);
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicCompareRecordService.java

@@ -90,4 +90,6 @@ public interface SysMusicCompareRecordService extends BaseService<Long, SysMusic
      * @return
      */
     PageInfo<CountStudentTrainDataDto> countStudentTrain(SysMusicCompareRecordQueryInfo queryInfo);
+    
+    int queryCurrentDatePlayTimeByUserId(Integer userId);
 }

+ 27 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TempLittleArtistTrainingCampService.java

@@ -6,10 +6,13 @@ import com.ym.mec.biz.dal.dto.TempLittleArtistTrainingCampDto;
 import com.ym.mec.biz.dal.entity.ImGroup;
 import com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCamp;
 import com.ym.mec.biz.dal.vo.TempCampUserTrainingDetailVo;
+import com.ym.mec.biz.dal.vo.TempCampUserTrainingPlayTimeVo;
 import com.ym.mec.biz.dal.vo.TempCampUserVo;
 import com.ym.mec.biz.dal.vo.TempUserTrainingTimeDetailVo;
 import com.ym.mec.common.page.PageInfo;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
@@ -89,6 +92,30 @@ public interface TempLittleArtistTrainingCampService extends IService<TempLittle
      * @param imGroupIds 群组id,多个用逗号隔开
      */
     List<ImGroup> queryCampImGroup(String imGroupIds);
+
+    /**
+     * 查询训练营周期表
+     *
+     * @return result:
+     * <p>user 学员信息
+     * <p>campList 训练营信息
+     */
+    Map<String, Object> queryCampCycle();
+
+    /**
+     * 定时任务-修改训练营状态
+     */
+    void checkCampState();
+
+    /**
+     * 云教练训练是否达标
+     */
+    TempCampUserTrainingPlayTimeVo queryUserTrainingPlayTime();
+
+    /**
+     * 导出小小训练营想详情
+     */
+    void exportUserTrainingDetail(Map<String, Object> param, HttpServletResponse response) throws IOException;
 }
 
 

+ 13 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TempLittleArtistTrainingCampUserRelationService.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ym.mec.biz.dal.dao.TempLittleArtistTrainingCampUserRelationDao;
 import com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCampUserRelation;
+import com.ym.mec.biz.dal.vo.TempCampUserQualificationsVo;
 
 /**
  * 训练营与学生关系表(TempLittleArtistTrainingCampUserRelation)表服务接口
@@ -13,5 +14,17 @@ import com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCampUserRelation;
 public interface TempLittleArtistTrainingCampUserRelationService extends IService<TempLittleArtistTrainingCampUserRelation> {
 
     TempLittleArtistTrainingCampUserRelationDao getDao();
+
+    /**
+     * 参与训练营
+     *
+     * @param campId 训练营id
+     */
+    void add(Integer campId);
+
+    /**
+     * 查询当前登录学生有没有资格参加训练营
+     */
+    TempCampUserQualificationsVo checkCampQualifications();
 }
 

+ 37 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ActivityUserMapperServiceImpl.java

@@ -1,12 +1,10 @@
 package com.ym.mec.biz.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.ActivityQueryDto;
-import com.ym.mec.biz.dal.dto.ActivityStudentAdjustDto;
-import com.ym.mec.biz.dal.dto.ActivityStudentDto;
-import com.ym.mec.biz.dal.dto.ActivityUserMapperAddDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
 import com.ym.mec.biz.dal.enums.ReturnFeeEnum;
@@ -19,15 +17,14 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import static com.ym.mec.biz.dal.enums.GroupType.*;
@@ -49,6 +46,10 @@ public class ActivityUserMapperServiceImpl extends BaseServiceImpl<Integer, Acti
 	private SysUserCashAccountLogService sysUserCashAccountLogService;
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
+	@Autowired
+	private SysConfigDao sysConfigDao;
+	@Autowired
+	private SubjectDao subjectDao;
 
 	@Override
 	public BaseDAO<Integer, ActivityUserMapper> getDAO() {
@@ -265,4 +266,32 @@ public class ActivityUserMapperServiceImpl extends BaseServiceImpl<Integer, Acti
 		}
 		activityUserMapperDao.batchInsert(activityUserMapperList);
     }
+
+    @Override
+    public Map<String,Object> getStudentNoMapperInfo() {
+		HashMap<String, Object> map = new HashMap<>();
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		map.put("userId",sysUser.getId());
+		map.put("username",sysUser.getUsername());
+		map.put("avatar",sysUser.getAvatar());
+		Student student = studentDao.get(sysUser.getId());
+		if(StringUtils.isNotEmpty(student.getSubjectIdList())){
+			Subject subject = subjectDao.get(Integer.parseInt(student.getSubjectIdList()));
+			if (subject != null) {
+				map.put("subjectName",subject.getName());
+			}
+		}
+		String activeConfig = sysConfigDao.findConfigValue("cloud_teacher_active_config");
+		List<Cloud2022ActivityDto> cloud2022ActivityDtos = JSONArray.parseArray(activeConfig, Cloud2022ActivityDto.class);
+		List<Cloud2022ActivityDto> activityDtos = cloud2022ActivityDtos.stream().filter(e -> e.getOrganId().contains(sysUser.getOrganId().toString())).collect(Collectors.toList());
+		if(CollectionUtils.isEmpty(activityDtos)){
+			map.put("courseNum",0);
+			return map;
+		}
+		//是否还有购买资格
+		Integer activityId = Integer.parseInt(activityDtos.get(0).getActivityId());
+		Integer noCourseNum = activityUserMapperDao.getStudentNoMapperInfo(sysUser.getId(), activityId);
+		map.put("courseNum",noCourseNum == null?0:noCourseNum);
+		return map;
+    }
 }

+ 35 - 28
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -1808,11 +1808,13 @@ public class ExportServiceImpl implements ExportService {
             //专业
             if (row.getGroupType().equals(GroupType.VIP)) {
                 row.setVipCourseFee(row.getActualAmount());
-                VipGroup vipGroupInfo = vipGroupDao.findVipGroupInfo(Integer.parseInt(row.getMusicGroupId()), row.getClassGroupId());
-                if (vipGroupInfo != null) {
-                    row.setSchoolName(vipGroupInfo.getSchoolName());
-                    row.setSubjectName(vipGroupInfo.getSubjectName());
-                    row.setEduTeacher(vipGroupInfo.getEducationalTeacherName());
+                if(StringUtils.isNotEmpty(row.getMusicGroupId()) && row.getClassGroupId() != null){
+                    VipGroup vipGroupInfo = vipGroupDao.findVipGroupInfo(Integer.parseInt(row.getMusicGroupId()), row.getClassGroupId());
+                    if (vipGroupInfo != null) {
+                        row.setSchoolName(vipGroupInfo.getSchoolName());
+                        row.setSubjectName(vipGroupInfo.getSubjectName());
+                        row.setEduTeacher(vipGroupInfo.getEducationalTeacherName());
+                    }
                 }
                 if(row.getTypeDesc() == null){
                     //学员没有历史VIP课程则导出为【VIP课新增】
@@ -2166,25 +2168,28 @@ public class ExportServiceImpl implements ExportService {
             } else if (row.getGroupType().equals(GroupType.SPORADIC)) {
                 //考级报名
                 if (row.getType().equals(OrderTypeEnum.DEGREE_REGISTRATION)) {
-                    String[] feeTypes = row.getMemo().split(";");
-                    List<String> feeTypeList = Arrays.asList(feeTypes);
-                    for (String feeTypeStr : feeTypeList) {
-                        int index = feeTypeStr.lastIndexOf(":");
-                        if (index < 0) {
-                            continue;
-                        }
-                        BigDecimal typeFee = new BigDecimal(feeTypeStr.substring(index + 1));
-                        if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
-                            typeFee = typeFee.multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
-                        }
-                        if (feeTypeStr.contains("VIP")) {
-                            row.setVipCourseFee(typeFee);
-                        } else if (feeTypeStr.contains("网管课")) {
-                            row.setPracticeCourseFee(typeFee);
-                        } else if (feeTypeStr.contains("乐理课")) {
-                            row.setTheoryCourseFee(typeFee);
+                	
+                	if(StringUtils.isNotBlank(row.getMemo())){
+                        String[] feeTypes = row.getMemo().split(";");
+                        List<String> feeTypeList = Arrays.asList(feeTypes);
+                        for (String feeTypeStr : feeTypeList) {
+                            int index = feeTypeStr.lastIndexOf(":");
+                            if (index < 0) {
+                                continue;
+                            }
+                            BigDecimal typeFee = new BigDecimal(feeTypeStr.substring(index + 1));
+                            if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                typeFee = typeFee.multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                            }
+                            if (feeTypeStr.contains("VIP")) {
+                                row.setVipCourseFee(typeFee);
+                            } else if (feeTypeStr.contains("网管课")) {
+                                row.setPracticeCourseFee(typeFee);
+                            } else if (feeTypeStr.contains("乐理课")) {
+                                row.setTheoryCourseFee(typeFee);
+                            }
                         }
-                    }
+                	}
                     row.setDegreeFee(row.getActualAmount().subtract(row.getVipCourseFee()).subtract(row.getPracticeCourseFee()).subtract(row.getTheoryCourseFee()));
                 } else {
                     if (row.getChargeType() != null && SporadicChargeTypeEnum.LEVEL.getCode().equals(row.getChargeType())) {
@@ -2518,11 +2523,13 @@ public class ExportServiceImpl implements ExportService {
             //专业
             if (row.getGroupType().equals(GroupType.VIP)) {
                 row.setVipCourseFee(row.getActualAmount());
-                VipGroup vipGroupInfo = vipGroupDao.findVipGroupInfo(Integer.parseInt(row.getMusicGroupId()), row.getClassGroupId());
-                if (vipGroupInfo != null) {
-                    row.setSchoolName(vipGroupInfo.getSchoolName());
-                    row.setSubjectName(vipGroupInfo.getSubjectName());
-                    row.setEduTeacher(vipGroupInfo.getEducationalTeacherName());
+                if(StringUtils.isNotEmpty(row.getMusicGroupId()) && row.getClassGroupId() != null) {
+                    VipGroup vipGroupInfo = vipGroupDao.findVipGroupInfo(Integer.parseInt(row.getMusicGroupId()), row.getClassGroupId());
+                    if (vipGroupInfo != null) {
+                        row.setSchoolName(vipGroupInfo.getSchoolName());
+                        row.setSubjectName(vipGroupInfo.getSubjectName());
+                        row.setEduTeacher(vipGroupInfo.getEducationalTeacherName());
+                    }
                 }
                 if(row.getTypeDesc() == null){
                     //学员没有历史VIP课程则导出为【VIP课新增】

+ 3 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java

@@ -5,7 +5,6 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.ImGroupDao;
 import com.ym.mec.biz.dal.dao.ImGroupMemberDao;
 import com.ym.mec.biz.dal.dao.ImGroupNoticeDao;
-import com.ym.mec.biz.dal.dao.ImSendGroupMessageDao;
 import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
 import com.ym.mec.biz.dal.entity.ImGroup;
 import com.ym.mec.biz.service.ImGroupMemberService;
@@ -43,8 +42,6 @@ public class ImGroupServiceImpl extends BaseServiceImpl<Long, ImGroup> implement
 
 	@Autowired
 	private SysUserFeignService sysUserFeignService;
-	@Autowired
-	private ImSendGroupMessageDao imSendGroupMessageDao;
 
 	@Override
 	public BaseDAO<Long, ImGroup> getDAO() {
@@ -63,7 +60,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<Long, ImGroup> implement
 
 		Date date = new Date();
 
-		imGroup.setId(id);
+		imGroup.setId(id.toString());
 		imGroup.setCreateTime(date);
 		imGroup.setIntroduce(introduce);
 		
@@ -80,10 +77,10 @@ public class ImGroupServiceImpl extends BaseServiceImpl<Long, ImGroup> implement
 		imGroup.setUpdateTime(date);
 		imGroupDao.insert(imGroup);
 
-		String groupId = imGroup.getId().toString();
+		String groupId = imGroup.getId();
 		
 		if(userId != null){
-			imGroupMemberService.join(imGroup.getId(), userId, null, true);
+			imGroupMemberService.join(id, userId, null, true);
 
 			GroupMember groupMember = new GroupMember(userId.toString(), groupId);
 

+ 126 - 67
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -79,6 +79,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     private ImLiveBroadcastRoomMemberService liveBroadcastRoomMemberService;
     @Autowired
     private ImLiveBroadcastRoomDataService liveBroadcastRoomDataService;
+    @Autowired
+    private LiveGoodsMapperService liveGoodsMapperService;
 
     //待替换的变量
     public static final String USER_ID = "${userId}";
@@ -132,6 +134,12 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             throw new BizException(DateUtil.format(liveStartTime, "yyyy年MM月dd日 HH点mm分") + " 可进入直播间准备");
         }
         if (room.getLiveState() == 2) {
+            //如果直播结束了还是推广状态则将推广修改为取消
+            if (room.getPopularize() == 1) {
+                this.update(Wrappers.<ImLiveBroadcastRoom>lambdaUpdate()
+                        .set(ImLiveBroadcastRoom::getPopularize, 0)
+                        .eq(ImLiveBroadcastRoom::getId, room.getId()));
+            }
             throw new BizException("直播已结束!");
         }
         return room;
@@ -295,6 +303,16 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      */
     @Override
     public ImLiveBroadcastRoomVo queryPopularizeRoom() {
+        //查询该学生信息-获取分部
+        SysUser user = getSysUser();
+        //查询哪些分部无法推广直播间
+        String popularizeOrgan = sysConfigDao.findConfigValue("live_popularize_organ");
+        if (StringUtils.isNotBlank(popularizeOrgan)) {
+            List<String> organList = WrapperUtil.toList(popularizeOrgan);
+            if (organList.contains(user.getOrganId().toString())) {
+                return null;
+            }
+        }
         Map<String, Object> param = new HashMap<>();
         param.put("tenantId", TenantContextHolder.getTenantId());
         param.put("popularize", 1);
@@ -421,9 +439,13 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         room.setPopularize(0);//销毁直播间后要关闭推广
         this.updateById(room);
 
+        //下架商品
+        liveGoodsMapperService.downGoods(room.getRoomUid());
+
         //向聊天室发自定义消息踢出所有人
         try {
             ImRoomMessage message = new ImRoomMessage();
+            message.setIsIncludeSender(1);
             message.setFromUserId(speakerId.toString());
             message.setToChatroomId(roomUid);
             message.setObjectName(ImRoomMessage.FORCED_OFFLINE);
@@ -443,9 +465,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         //总观看人数
         List<ImLiveBroadcastRoomMember> memberList = new ArrayList<>();
         //获取直播间所有人数据写入 im_live_broadcast_room_member
-        RMap<Integer, RoomUserInfoVo> roomTotalUserCache = getTotalUserCache(roomUid);
+        RMap<Integer, String> roomTotalUserCache = getTotalUserCache(roomUid);
         if (roomTotalUserCache.isExists()) {
-            List<RoomUserInfoVo> roomTotalUser = new ArrayList<>(roomTotalUserCache.values());
+            List<RoomUserInfoVo> roomTotalUser = roomTotalUserCache.values().parallelStream()
+                    .map(a -> JSONObject.toJavaObject(JSONObject.parseObject(a), RoomUserInfoVo.class))
+                    .collect(Collectors.toList());
             for (RoomUserInfoVo v : roomTotalUser) {
                 ImLiveBroadcastRoomMember member = new ImLiveBroadcastRoomMember();
                 member.setTenantId(v.getTenantId());
@@ -563,75 +587,87 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             Integer userId = Integer.valueOf(userid);
 
             //从房间累计用户信息中查询该用户的信息
-            RMap<Integer, RoomUserInfoVo> roomTotalUser = getTotalUserCache(roomUid);
+            RMap<Integer, String> roomTotalUser = getTotalUserCache(roomUid);
             //该房间未查询到用户数据则不处理
             if (!roomTotalUser.isExists() && !roomTotalUser.containsKey(userId)) {
                 return;
             }
             //查询用户数据
-            RoomUserInfoVo userInfo = roomTotalUser.get(userId);
+            RoomUserInfoVo userInfo = JSONObject.toJavaObject(JSONObject.parseObject(roomTotalUser.get(userId)), RoomUserInfoVo.class);
             //如果有动态观看时间则证明主播开播过,需要计算当前用户观看时长
             if (Objects.nonNull(userInfo.getDynamicLookTime())) {
                 userInfo.setTotalViewTime(getLookMinutes(userInfo.getDynamicLookTime(), userInfo.getTotalViewTime()));
                 userInfo.setDynamicLookTime(null);
             }
-            roomTotalUser.fastPut(userId, userInfo);
-
+            roomTotalUser.fastPut(userId, JSONObject.toJSONString(userInfo));
             //查询在线人员列表
-            RMap<Integer, BaseRoomUserVo> onlineUserInfo = getOnlineUserCache(roomUid);
+            RMap<Integer, String> onlineUserInfo = getOnlineUserCache(roomUid);
             if (!onlineUserInfo.isExists()) {
                 return;
             }
-            //发消息给主播 告知现在人数
-            int size = 0;
-            ImRoomMessage message = new ImRoomMessage();
-            message.setIsIncludeSender(1);
-            message.setObjectName(ImRoomMessage.MEMBER_COUNT);
-            message.setToChatroomId(roomUid);
-            //大于1就发送实际人数,如果是最后一个人离开房间则发送一条0人数消息给主播
-            if (onlineUserInfo.size() > 1) {
-                size = onlineUserInfo.size();
-            }
-            HashMap<String, Integer> sendMap = new HashMap<>();
-            sendMap.put("count", size);
-            message.setFromUserId(userId.toString());
-            message.setContent(sendMap);
-            //发送消息
-            try {
-                imFeignService.publishRoomMsg(message);
-                log.info("opsRoom>>>> sendLiveOnlineNum>>>> speakerId  room:{}", JSONObject.toJSONString(message));
-            } catch (Exception e) {
-                log.error("opsRoom>>>> sendLiveOnlineNum>>>>  speakerId error {}", e.getMessage());
-                log.error("opsRoom>>>> sendLiveOnlineNum>>>>  speakerId sendMessage {} :", JSONObject.toJSONString(message));
-            }
             //从在线人员列表删除该人员
             onlineUserInfo.fastRemove(userId);
+            //向直播间发送当前在线人数消息
+            this.sendOnlineUserCount(roomUid, userId, onlineUserInfo.size());
             log.info("opsRoom>>>> looker userInfo: {}", JSONObject.toJSONString(userInfo));
         });
     }
 
     /**
+     * 向直播间发送当前在线人数消息
+     *
+     * @param roomUid    房间uid
+     * @param fromUserId 发送人id
+     * @param count      人数
+     */
+    private void sendOnlineUserCount(String roomUid, Integer fromUserId, Integer count) {
+        //校验传入参数,房间uid和发送人id不能为空
+        if (!WrapperUtil.checkObj(roomUid, fromUserId, count)) {
+            log.info(" sendOnlineUserCount>>>> param is null   roomUid: {}  fromUserId:{}  count:{}", roomUid, fromUserId, count);
+            return;
+        }
+        ImRoomMessage message = new ImRoomMessage();
+        message.setIsIncludeSender(1);
+        message.setObjectName(ImRoomMessage.MEMBER_COUNT);
+        message.setToChatroomId(roomUid);
+        HashMap<String, Integer> sendMap = new HashMap<>();
+        sendMap.put("count", count);
+        message.setFromUserId(fromUserId.toString());
+        message.setContent(sendMap);
+        //发送消息
+        try {
+            imFeignService.publishRoomMsg(message);
+            log.info(" sendOnlineUserCount>>>> message: {}", JSONObject.toJSONString(message));
+        } catch (Exception e) {
+            log.error("sendOnlineUserCount>>>> error {}", e.getMessage());
+            log.error("sendOnlineUserCount>>>> sendMessage {} :", JSONObject.toJSONString(message));
+        }
+    }
+
+    /**
      * 查询userId是不是主讲人
+     *
+     * @return true 是主讲人 false 不是主讲人
      */
     private boolean isSpeaker(ImUserState user, Date now, String userid) {
         RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userid));
-        if (speakerCache.isExists()) {
-            RoomSpeakerInfo speakerInfo = speakerCache.get();
-            //主讲人进入房间
-            if (user.getStatus().equals("0")) {
-                speakerInfo.setJoinRoomTime(now);
-                log.info("opsRoom>>>> join speakerCache {}", JSONObject.toJSONString(speakerInfo));
-                speakerCache.set(speakerInfo);
-                return true;
-            }
-            //主讲人退出房间关闭录像
-            closeLive(speakerInfo);
-            speakerInfo.setExitRoomTime(now);
-            log.info("opsRoom>>>> exit speakerCache {}", JSONObject.toJSONString(speakerInfo));
+        if (!speakerCache.isExists()) {
+            return false;
+        }
+        RoomSpeakerInfo speakerInfo = speakerCache.get();
+        //主讲人进入房间
+        if (user.getStatus().equals("0")) {
+            speakerInfo.setJoinRoomTime(now);
+            log.info("opsRoom>>>> join speakerCache {}", JSONObject.toJSONString(speakerInfo));
             speakerCache.set(speakerInfo);
             return true;
         }
-        return false;
+        //主讲人退出房间关闭录像
+        closeLive(speakerInfo);
+        speakerInfo.setExitRoomTime(now);
+        log.info("opsRoom>>>> exit speakerCache {}", JSONObject.toJSONString(speakerInfo));
+        speakerCache.set(speakerInfo);
+        return true;
     }
 
     /**
@@ -675,16 +711,14 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         }
         //记录用户当前房间uid
         redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userId.toString())).set(roomUid, 12L, TimeUnit.HOURS);
-        //在线人员列表
-        RMap<Integer, BaseRoomUserVo> onlineUserInfo = getOnlineUserCache(roomUid);
         //房间累计用户信息-指只要进入到该房间的用户都要记录
-        RMap<Integer, RoomUserInfoVo> roomTotalUser = getTotalUserCache(roomUid);
+        RMap<Integer, String> roomTotalUser = getTotalUserCache(roomUid);
         //判断是否第一次进房间
         RoomUserInfoVo userInfo;
         Date now = new Date();
         if (roomTotalUser.containsKey(userId)) {
             //多次进入更新动态进入时间
-            userInfo = roomTotalUser.get(userId);
+            userInfo = JSONObject.toJavaObject(JSONObject.parseObject(roomTotalUser.get(userId)), RoomUserInfoVo.class);
         } else {
             //第一次进该房间 写入用户首次进入时间
             userInfo = getUserInfo(userId);
@@ -700,9 +734,13 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                 userInfo.setDynamicLookTime(now);
             }
         }
-        roomTotalUser.fastPut(userId, userInfo);
+        roomTotalUser.fastPut(userId, JSONObject.toJSONString(userInfo));
+        //在线人员列表
+        RMap<Integer, String> onlineUserInfo = getOnlineUserCache(roomUid);
         //进入房间写如在线人员列表
-        onlineUserInfo.fastPut(userId, userInfo);
+        onlineUserInfo.fastPut(userId, JSONObject.toJSONString(userInfo));
+        //向直播间发送当前在线人数消息
+        this.sendOnlineUserCount(roomUid, userId, onlineUserInfo.size());
         log.info("joinRoom>>>> userInfo: {}", JSONObject.toJSONString(userInfo));
     }
 
@@ -807,15 +845,17 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         //加锁-避免快速点击开启直播和关闭直后异步执行后直播数据错误
         boolean b = this.runIfLockCanGet(LIVE_LOOK_LOCK.replace(ROOM_UID, roomUid), () -> {
             //查询所有在直播间的用户并计算观看时长
-            RMap<Integer, RoomUserInfoVo> roomTotalUser = getTotalUserCache(roomUid);
+            RMap<Integer, String> roomTotalUser = getTotalUserCache(roomUid);
             if (!roomTotalUser.isExists()) {
                 return;
             }
             //查询在线人员列表
-            RMap<Integer, BaseRoomUserVo> onlineUserInfo = getOnlineUserCache(roomUid);
-            roomTotalUser.forEach((id, userInfo) -> {
+            RMap<Integer, String> onlineUserInfo = getOnlineUserCache(roomUid);
+            boolean onlineUserInfoExists = onlineUserInfo.isExists();
+            roomTotalUser.forEach((id, userInfoStr) -> {
+                RoomUserInfoVo userInfo = JSONObject.toJavaObject(JSONObject.parseObject(userInfoStr), RoomUserInfoVo.class);
                 //获取当前用户是否在房间状态 true在 false不在
-                if (onlineUserInfo.isExists() && onlineUserInfo.containsKey(id)) {
+                if (onlineUserInfoExists && onlineUserInfo.containsKey(id)) {
                     if (type.equals(1)) {
                         //开启直播后对当前在房间的用户写入观看时间
                         userInfo.setDynamicLookTime(new Date());
@@ -825,7 +865,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                     } else {
                         return;
                     }
-                    roomTotalUser.fastPut(id, userInfo);
+                    roomTotalUser.fastPut(id, JSONObject.toJSONString(userInfo));
                 }
             });
         }, 2, 1, TimeUnit.MINUTES);
@@ -953,6 +993,13 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      * 测试
      */
     public Map<String, Object> test(String roomUid) {
+        List<ImUserState> userStateList = new ArrayList<>();
+        ImUserState userState1 = new ImUserState();
+        userState1.setStatus("3");
+        userState1.setUserid("100071");
+        userStateList.add(userState1);
+        opsRoom(userStateList);
+
         //test
         Map<String, Object> result = new HashMap<>();
         //点赞数
@@ -1020,11 +1067,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      */
     @Override
     public List<BaseRoomUserVo> queryRoomLimitOnlineUserInfo(String roomUid) {
-        RMap<Integer, BaseRoomUserVo> onlineUserCache = getOnlineUserCache(roomUid);
-        return onlineUserCache.values().stream()
-                .filter(Objects::nonNull)
-                .limit(200)
-                .collect(Collectors.toList());
+        RMap<Integer, String> onlineUserCache = getOnlineUserCache(roomUid);
+        return onlineUserCache.values().parallelStream()
+                        .map(a -> JSONObject.toJavaObject(JSONObject.parseObject(a), BaseRoomUserVo.class))
+                        .limit(200)
+                        .collect(Collectors.toList());
     }
 
     /**
@@ -1034,9 +1081,9 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      */
     @Override
     public List<BaseRoomUserVo> queryRoomOnlineUserInfo(String roomUid) {
-        RMap<Integer, BaseRoomUserVo> onlineUserInfo = getOnlineUserCache(roomUid);
-        return onlineUserInfo.values().stream()
-                .filter(Objects::nonNull)
+        RMap<Integer, String> onlineUserInfo = getOnlineUserCache(roomUid);
+        return onlineUserInfo.values().parallelStream()
+                .map(a -> JSONObject.toJavaObject(JSONObject.parseObject(a), BaseRoomUserVo.class))
                 .collect(Collectors.toList());
     }
 
@@ -1046,17 +1093,29 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      * @param roomUid 直播间uid
      */
     private List<RoomUserInfoVo> queryTotalRoomUserInfo(String roomUid) {
-        RMap<Integer, RoomUserInfoVo> roomTotalUser = getTotalUserCache(roomUid);
-        return roomTotalUser.values().stream()
-                .filter(Objects::nonNull)
+        RMap<Integer, String> roomTotalUser = getTotalUserCache(roomUid);
+        return roomTotalUser.values().parallelStream()
+                .map(a -> JSONObject.toJavaObject(JSONObject.parseObject(a), RoomUserInfoVo.class))
                 .collect(Collectors.toList());
     }
 
-    private RMap<Integer, BaseRoomUserVo> getOnlineUserCache(String roomUid) {
+    /**
+     * 获取直播间在线用户信息缓存
+     *
+     * @param roomUid 直播间uid
+     * @return RMap key:userId value:BaseRoomUserVo -> jsonToString
+     */
+    private RMap<Integer, String> getOnlineUserCache(String roomUid) {
         return redissonClient.getMap(LIVE_ROOM_ONLINE_USER_LIST.replace(ROOM_UID, roomUid));
     }
 
-    private RMap<Integer, RoomUserInfoVo> getTotalUserCache(String roomUid) {
+    /**
+     * 获取直播间所有用户信息缓存
+     *
+     * @param roomUid 直播间uid
+     * @return RMap key:userId value:RoomUserInfoVo -> jsonToString
+     */
+    private RMap<Integer, String> getTotalUserCache(String roomUid) {
         return redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid));
     }
 

+ 70 - 18
mec-biz/src/main/java/com/ym/mec/biz/service/impl/LiveGoodsMapperServiceImpl.java

@@ -2,12 +2,14 @@ package com.ym.mec.biz.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ym.mec.biz.dal.dao.LiveGoodsMapperDao;
+import com.ym.mec.biz.dal.dto.LiveGoodsMapperDto;
+import com.ym.mec.biz.dal.dto.RedisKeyConstant;
 import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
-import com.ym.mec.biz.dal.entity.LiveGoods;
 import com.ym.mec.biz.dal.entity.LiveGoodsMapper;
 import com.ym.mec.biz.dal.page.LiveGoodsMapperQueryInfo;
 import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
 import com.ym.mec.biz.service.LiveGoodsMapperService;
+import com.ym.mec.biz.service.LiveGoodsService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImRoomMessage;
 import com.ym.mec.common.exception.BizException;
@@ -15,21 +17,29 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.util.collection.MapUtil;
+import org.apache.commons.collections.CollectionUtils;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 public class LiveGoodsMapperServiceImpl extends BaseServiceImpl<Integer, LiveGoodsMapper>  implements LiveGoodsMapperService {
 	
 	@Autowired
+	private LiveGoodsService liveGoodsService;
+	@Autowired
 	private LiveGoodsMapperDao liveGoodsMapperDao;
 	@Autowired
 	private ImFeignService imFeignService;
 	@Autowired
 	private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
+	@Autowired
+	private RedissonClient redissonClient;
+
 
 	@Override
 	public BaseDAO<Integer, LiveGoodsMapper> getDAO() {
@@ -38,22 +48,24 @@ public class LiveGoodsMapperServiceImpl extends BaseServiceImpl<Integer, LiveGoo
 
     @Override
 	@Transactional(rollbackFor = Exception.class)
-    public void add(List<LiveGoodsMapper> liveGoodsMappers) {
-		liveGoodsMapperDao.batchInsert(liveGoodsMappers);
-//		liveGoodsMapperDao.insert(liveGoodsMapper);
-//		通知上架
-//		if (liveGoodsMapper.getStatus()) this.upGoods(liveGoodsMapper.getGoodsId(),liveGoodsMapper.getLiveId());
+    public void add(String liveId, String liveGoodsIds) {
+		liveGoodsMapperDao.batchInsert(liveId,liveGoodsIds.split(","));
     }
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void upGoods(Integer liveGoodsId, String liveId) {
-		liveGoodsMapperDao.updateStatus(liveId,liveGoodsId,true);
+		int i = liveGoodsMapperDao.updateStatus(liveId, liveGoodsId, true);
+		if (i == 0) {
+			return;
+		}
 		ImLiveBroadcastRoom imLiveBroadcastRoom = Optional
 				.of(imLiveBroadcastRoomService.getBaseMapper().selectOne(new QueryWrapper<ImLiveBroadcastRoom>().eq("room_uid_",liveId))).
 				orElseThrow(() -> new RuntimeException("直播间不存在"));
-		//通知直播间商品上架
+		//通知直播间商品信息变更
 		this.publishRoomMsg(imLiveBroadcastRoom);
+		//商品上架,更新缓存
+		liveGoodsService.initGoodsStockCache(liveGoodsId,liveId);
 	}
 
 	@Override
@@ -62,12 +74,12 @@ public class LiveGoodsMapperServiceImpl extends BaseServiceImpl<Integer, LiveGoo
 	}
 
     @Override
-    public PageInfo<LiveGoods> queryGoodsPage(LiveGoodsMapperQueryInfo queryInfo) {
-		PageInfo<LiveGoods> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+    public PageInfo<LiveGoodsMapperDto> queryGoodsPage(LiveGoodsMapperQueryInfo queryInfo) {
+		PageInfo<LiveGoodsMapperDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
 		Map<String, Object> params = new HashMap<String, Object>();
 		MapUtil.populateMap(params, queryInfo);
 
-		List<LiveGoods> dataList = null;
+		List<LiveGoodsMapperDto> dataList = null;
 		int count = liveGoodsMapperDao.countLiveGoods(params);
 		if (count > 0) {
 			pageInfo.setTotal(count);
@@ -81,18 +93,42 @@ public class LiveGoodsMapperServiceImpl extends BaseServiceImpl<Integer, LiveGoo
 		return pageInfo;
     }
 
-    private void publishRoomMsg(ImLiveBroadcastRoom imLiveBroadcastRoom) {
+	@Override
+	public List<LiveGoodsMapperDto> getLiveGoodsList(String liveId, Integer liveGoodsId, Boolean status) {
+		return liveGoodsMapperDao.getLiveGoodsList(liveId,liveGoodsId,status);
+	}
+
+	@Override
+	public List<Integer> queryGoodsIdsByLiveId(String liveId) {
+		return liveGoodsMapperDao.queryGoodsIdsByLiveId(liveId);
+	}
+
+	private void publishRoomMsg(ImLiveBroadcastRoom imLiveBroadcastRoom) {
 		ImRoomMessage message = new ImRoomMessage();
 		message.setIsIncludeSender(1);
 		message.setObjectName(ImRoomMessage.LIVE_GOODS_CHANGE);
 		message.setToChatroomId(imLiveBroadcastRoom.getRoomUid());
 		message.setFromUserId(imLiveBroadcastRoom.getSpeakerId().toString());
-		message.setContent(liveGoodsMapperDao.getLiveGoodsList(imLiveBroadcastRoom.getRoomUid()));
+		message.setContent(liveGoodsMapperDao.getLiveGoodsList(imLiveBroadcastRoom.getRoomUid(),null,true));
 		imFeignService.publishRoomMsg(message);
 	}
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
+	public void downGoods(String liveId){
+		ImLiveBroadcastRoom imLiveBroadcastRoom = Optional
+				.of(imLiveBroadcastRoomService.getBaseMapper().selectOne(new QueryWrapper<ImLiveBroadcastRoom>().eq("room_uid_",liveId))).
+				orElseThrow(() -> new RuntimeException("直播间不存在"));
+		List<LiveGoodsMapperDto> liveGoodsList = liveGoodsMapperDao.getLiveGoodsList(liveId, null, true);
+		if (CollectionUtils.isEmpty(liveGoodsList)) {
+			return;
+		}
+		for (LiveGoodsMapperDto liveGoodsMapperDto : liveGoodsList) {
+			this.down(liveGoodsMapperDto.getId(), liveId,imLiveBroadcastRoom);
+		}
+	}
+	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public void downGoods(Integer liveGoodsId, String liveId){
 		ImLiveBroadcastRoom imLiveBroadcastRoom = Optional
 				.of(imLiveBroadcastRoomService.getBaseMapper().selectOne(new QueryWrapper<ImLiveBroadcastRoom>().eq("room_uid_",liveId))).
@@ -102,10 +138,23 @@ public class LiveGoodsMapperServiceImpl extends BaseServiceImpl<Integer, LiveGoo
 		if(!liveGoodsMapper.getStatus()){
 			throw new BizException("该商品已下架");
 		}
-		//下架直播间商品
-		liveGoodsMapperDao.updateStatus(liveId,liveGoodsId,false);
-		//通知直播间,商品下架
+		this.down(liveGoodsId, liveId,imLiveBroadcastRoom);
+	}
+
+	private void down(Integer liveGoodsId, String liveId,ImLiveBroadcastRoom imLiveBroadcastRoom){
+		int i = liveGoodsMapperDao.updateStatus(liveId, liveGoodsId, false);
+		if (i == 0) {
+			return;
+		}
+		//通知直播间,商品信息变更
 		this.publishRoomMsg(imLiveBroadcastRoom);
+		//商品下架后,将缓存的库存设置为0
+		redissonClient.getBucket(RedisKeyConstant.LIVE_GOODS_STOCK_CACHE_KEY + liveId + liveGoodsId).set(0);
+		//如果下架的是免费的直播课商品,清空购买的学员的缓存记录
+		if(liveGoodsId.equals(2)){
+			//删除当前直播间免费直播课的购买记录缓存
+			redissonClient.getBucket(RedisKeyConstant.LIVE_GOODS_ZERO_CACHE_KEY + liveId).delete();
+		}
 	}
 
 	@Override
@@ -114,8 +163,11 @@ public class LiveGoodsMapperServiceImpl extends BaseServiceImpl<Integer, LiveGoo
 		List<LiveGoodsMapper> liveGoodsMappers = liveGoodsMapperDao.findByLiveGoodsIdAndStatus(liveGoodsId,true);
 		if(liveGoodsMappers.size()>0){
 			//下架直播间商品
-			liveGoodsMapperDao.updateStatus(null,liveGoodsId,false);
-			//通知直播间,商品下架
+			int i = liveGoodsMapperDao.updateStatus(null, liveGoodsId, false);
+			if (i == 0) {
+				return;
+			}
+			//通知直播间,商品信息变更
 			for (LiveGoodsMapper liveGoodsMapper : liveGoodsMappers) {
 				ImLiveBroadcastRoom imLiveBroadcastRoom = Optional
 						.of(imLiveBroadcastRoomService.getBaseMapper().selectOne(new QueryWrapper<ImLiveBroadcastRoom>().eq("room_uid_",liveGoodsMapper.getLiveId()))).

+ 132 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/LiveGoodsServiceImpl.java

@@ -1,16 +1,27 @@
 package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.biz.dal.dao.LiveGoodsDao;
+import com.ym.mec.biz.dal.dto.RedisKeyConstant;
 import com.ym.mec.biz.dal.entity.LiveGoods;
+import com.ym.mec.biz.dal.page.LiveGoodsQueryInfo;
 import com.ym.mec.biz.service.LiveGoodsMapperService;
 import com.ym.mec.biz.service.LiveGoodsService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.redisson.api.RBucket;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Date;
+import java.util.List;
 import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+import java.util.function.BiConsumer;
 
 @Service
 public class LiveGoodsServiceImpl extends BaseServiceImpl<Integer, LiveGoods>  implements LiveGoodsService {
@@ -19,6 +30,8 @@ public class LiveGoodsServiceImpl extends BaseServiceImpl<Integer, LiveGoods>  i
 	private LiveGoodsDao liveGoodsDao;
 	@Autowired
 	private LiveGoodsMapperService liveGoodsMapperService;
+	@Autowired
+	private RedissonClient redissonClient;
 
 	@Override
 	public BaseDAO<Integer, LiveGoods> getDAO() {
@@ -29,12 +42,16 @@ public class LiveGoodsServiceImpl extends BaseServiceImpl<Integer, LiveGoods>  i
 	@Transactional(rollbackFor = Exception.class)
     public void updateLiveGoods(LiveGoods liveGoods) {
 		Optional.of(liveGoodsDao.get(liveGoods.getId())).orElseThrow(() -> new RuntimeException("商品信息不存在"));
+		//如果商品已在直播间上架,那么不允许变更商品信息
+		if (liveGoodsMapperService.findByLiveGoodsIdAndStatus(liveGoods.getId(),true).size() > 0) {
+			throw new BizException("商品已在直播间上架,不能修改");
+		}
 		//下架直播间商品,并通知直播间
 //		if (!liveGoods.getStatus()) liveGoodsMapperService.downGoods(liveGoods.getId());
 		//更新商品信息
 		liveGoodsDao.update(liveGoods);
 		//通知直播间
-		liveGoodsMapperService.downGoods(liveGoods.getId());
+//		liveGoodsMapperService.downGoods(liveGoods.getId());
 	}
 
 	@Override
@@ -42,8 +59,121 @@ public class LiveGoodsServiceImpl extends BaseServiceImpl<Integer, LiveGoods>  i
 	public void deleteLiveGoods(Integer goodsId) {
 		//如果商品没有被直播间使用,则删除商品
 		if (liveGoodsMapperService.findByLiveGoodsIdAndStatus(goodsId,null).size() > 0) {
-			throw new RuntimeException("商品已被直播间使用,不能删除");
+			throw new BizException("商品已被直播间使用,不能删除");
 		}
 		liveGoodsDao.delete(goodsId);
 	}
+
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void initGoodsStockCache(Integer liveGoodsId, String liveId) {
+		//更新缓存
+		LiveGoods liveGoods = liveGoodsDao.getLock(liveGoodsId);
+		if (liveGoods == null) throw new BizException("商品不存在");
+		redissonClient.getBucket(RedisKeyConstant.LIVE_GOODS_STOCK_CACHE_KEY + liveId + liveGoodsId).set(liveGoods.getStockCount(),1, TimeUnit.DAYS);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void addGoodsStock(Integer liveGoodsId, String liveId) {
+		liveGoodsDao.addStock(liveGoodsId);
+//		RBucket<Integer> bucket = redissonClient.getBucket(RedisKeyConstant.LIVE_GOODS_STOCK_CACHE_KEY + liveId + liveGoodsId);
+//		boolean exists = bucket.isExists();
+//		if (exists) {
+//			Integer frozenStock = bucket.get();
+//			bucket.set(++frozenStock);
+//		}else {
+//			bucket.set(1);
+//		}
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void reduceGoodsStock(Integer liveGoodsId, String liveId) {
+		int i = liveGoodsDao.reduceStock(liveGoodsId);
+		if (i == 0) throw new BizException("商品已售罄");
+//		RBucket<Integer> bucket = redissonClient.getBucket(RedisKeyConstant.LIVE_GOODS_STOCK_CACHE_KEY + liveId + liveGoodsId);
+//		boolean exists = bucket.isExists();
+//		if (exists) {
+//			Integer stock = bucket.get() - 1;
+//			if (stock < 0) {
+//				throw new BizException("哎呀,手慢了,商品已经卖完了");
+//			}else if(stock == 0){
+//				//如果库存为0,则定时删除缓存
+//				bucket.set(stock,1,TimeUnit.HOURS);
+//			}else {
+//				bucket.set(stock);
+//			}
+//		}else {
+//			LiveGoods liveGoods = liveGoodsDao.getLock(liveGoodsId);
+//			redissonClient.getBucket(RedisKeyConstant.LIVE_GOODS_STOCK_CACHE_KEY + liveId + liveGoodsId).set(liveGoods.getStockCount(),1, TimeUnit.DAYS);
+//		}
+//		//增加冻结库存
+//		this.addGoodsFreezeStock(liveGoodsId,liveId);
+	}
+
+	@Override
+	public void addGoodsFreezeStock(Integer liveGoodsId, String liveId) {
+		RBucket<Integer> bucket = redissonClient.getBucket(RedisKeyConstant.LIVE_GOODS_FROZEN_CACHE_KEY + liveId + liveGoodsId);
+		boolean exists = bucket.isExists();
+		if (exists) {
+			Integer frozenStock = bucket.get();
+			bucket.set(++frozenStock);
+		}else {
+			bucket.set(1);
+		}
+	}
+
+	@Override
+	public void reduceGoodsFreezeStock(Integer liveGoodsId, String liveId) {
+		RBucket<Integer> bucket = redissonClient.getBucket(RedisKeyConstant.LIVE_GOODS_FROZEN_CACHE_KEY + liveId + liveGoodsId);
+		boolean exists = bucket.isExists();
+		if (exists) {
+			Integer frozenStock = bucket.get() - 1;
+			if (frozenStock < 0) {
+				throw new BizException("订单库存扣减失败");
+			}else if(frozenStock == 0){
+				//如果冻结库存为0,则定时删除缓存
+				bucket.set(frozenStock,1,TimeUnit.HOURS);
+			}else {
+				bucket.set(frozenStock);
+			}
+		}else {
+			throw new BizException("订单库存扣减失败");
+		}
+	}
+
+	@Override
+	public Object queryGoodsPage(LiveGoodsQueryInfo queryInfo) {
+		if(StringUtils.isNotEmpty(queryInfo.getLiveId())){
+			//获取直播间关联的商品列表
+			List<Integer> goodsIds = liveGoodsMapperService.queryGoodsIdsByLiveId(queryInfo.getLiveId());
+			queryInfo.setIgnoreGoodsIds(goodsIds);
+		}
+		return queryPage(queryInfo);
+	}
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public void add(LiveGoods liveGoods) {
+		//商品名称不能重复
+		LiveGoods goods = liveGoodsDao.getByName(liveGoods.getName());
+		if (goods != null) throw new BizException("商品名称已存在");
+		liveGoodsDao.insert(liveGoods);
+    }
+
+    public void stockLock(String lockKey, BiConsumer<Integer,String> consumer, Integer liveGoodsId, String liveId) {
+		RLock lock = redissonClient.getLock(lockKey);
+		try{
+			lock.lock();
+			consumer.accept(liveGoodsId,liveId);
+		}catch(Exception e){
+			e.printStackTrace();
+		}finally {
+			lock.unlock();
+		}
+
+	}
+
 }

+ 71 - 18
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MemberRankSettingServiceImpl.java

@@ -6,6 +6,7 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.Cloud2022ActivityDto;
 import com.ym.mec.biz.dal.dto.MemberPayParamDto;
+import com.ym.mec.biz.dal.dto.RedisKeyConstant;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.service.*;
@@ -84,6 +85,12 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
     private MemberFeeSettingService memberFeeSettingService;
     @Autowired
     private TeacherDao teacherDao;
+    @Autowired
+    private LiveGoodsService liveGoodsService;
+    @Autowired
+    private TempBuyFreeLiveTheoryCourseDao tempBuyFreeLiveTheoryCourseDao;
+    @Autowired
+    private TempLittleArtistTrainingCampUserRelationDao tempLittleArtistTrainingCampUserRelationDao;
 
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
@@ -228,22 +235,6 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
     @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
     public HttpResponseResult activeBuy(MemberPayParamDto memberPayParamDto) throws Exception {
         SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(()-> new BizException("请登录"));
-        String activeConfig = sysConfigDao.findConfigValue("cloud_teacher_active_config");
-        List<Cloud2022ActivityDto> cloud2022ActivityDtos = JSONArray.parseArray(activeConfig, Cloud2022ActivityDto.class);
-        Cloud2022ActivityDto activityDto = cloud2022ActivityDtos.stream().filter(e -> e.getOrganId().contains(sysUser.getOrganId().toString())).findFirst().get();
-        if(Objects.isNull(activityDto)){
-            throw new BizException("当前分部暂未开通活动");
-        }
-        //是否还有购买资格
-        Integer activityId = Integer.parseInt(activityDto.getActivityId());
-        VipGroupActivity vipGroupActivity = Optional.of(vipGroupActivityDao.get(activityId)).orElseThrow(()-> new BizException("活动不存在"));
-        if(vipGroupActivity.getStudentMaxUsedTimes() != -1){
-            //获取活动购买次数
-            int activityBuyNum = activityUserMapperDao.countActivityBuyNum(vipGroupActivity.getId(),sysUser.getId());
-            if(activityBuyNum >= vipGroupActivity.getStudentMaxUsedTimes()){
-                throw new BizException("您已达到购买次数上限");
-            }
-        }
         //判断用户是否已存在订单
         List<StudentPaymentOrder> memberIngOrders = studentPaymentOrderService.queryByCondition(GroupType.ACTIVITY,null,sysUser.getId(), DealStatusEnum.ING,OrderTypeEnum.MEMBER);
         if (CollectionUtils.isNotEmpty(memberIngOrders)) {
@@ -251,15 +242,67 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
             if (result.getCode() != 200) {
                 return result;
             }
+            //还原库存
+            liveGoodsService.addGoodsStock(memberPayParamDto.getLiveGoodsId(),memberPayParamDto.getLiveId());
+        }
+        BigDecimal amount = BigDecimal.ZERO;
+        Integer activityId = null;
+        //判断当前商品是否可以购买(库存、上架状态、是否购买过)
+        //如果是云教练商品,那么只能购买一次、如果是免费直播课,那么每次上架只能买一次,总共只能买2次
+        if(memberPayParamDto.getLiveGoodsId() == 1){
+            String activeConfig = sysConfigDao.findConfigValue("cloud_teacher_active_config");
+            List<Cloud2022ActivityDto> cloud2022ActivityDtos = JSONArray.parseArray(activeConfig, Cloud2022ActivityDto.class);
+            List<Cloud2022ActivityDto> activityDtos = cloud2022ActivityDtos.stream().filter(e -> e.getOrganId().contains(sysUser.getOrganId().toString())).collect(Collectors.toList());
+            if(CollectionUtils.isEmpty(activityDtos)){
+                throw new BizException("当前分部暂未开通活动");
+            }
+            //是否还有购买资格
+            activityId = Integer.parseInt(activityDtos.get(0).getActivityId());
+            VipGroupActivity vipGroupActivity = Optional.of(vipGroupActivityDao.get(activityId)).orElseThrow(()-> new BizException("活动不存在"));
+            if(vipGroupActivity.getStudentMaxUsedTimes() != -1){
+                //获取活动购买次数
+                int activityBuyNum = activityUserMapperDao.countActivityBuyNum(vipGroupActivity.getId(),sysUser.getId());
+                if(activityBuyNum >= vipGroupActivity.getStudentMaxUsedTimes()){
+                    throw new BizException("您已达到购买次数上限");
+                }
+            }
+            amount = vipGroupActivity.getMarketPrice();
+            //扣减库存
+            liveGoodsService.reduceGoodsStock(memberPayParamDto.getLiveGoodsId(),memberPayParamDto.getLiveId());
+        } else if (memberPayParamDto.getLiveGoodsId() == 2){
+            RBucket<List<Integer>> bucket = redissonClient.getBucket(RedisKeyConstant.LIVE_GOODS_ZERO_CACHE_KEY + memberPayParamDto.getLiveId());
+            List<Integer> list = bucket.get();
+            if(CollectionUtils.isEmpty(list)){
+                list = new ArrayList<>();
+            }
+            //当前用户是否购买过免费直播课
+            if(list.contains(sysUser.getId())){
+                throw new BizException("您已购买过本轮免费直播课");
+            }
+            //购买次数是否超过2次
+            int count = tempBuyFreeLiveTheoryCourseDao.countByUserId(sysUser.getId());
+            if(count >= 2){
+                throw new BizException("免费直播课已达到购买次数上限");
+            }
+            //保存购买记录
+            tempBuyFreeLiveTheoryCourseDao.insert(new TempBuyFreeLiveTheoryCourse(sysUser.getId()));
+            //扣减库存
+            liveGoodsService.reduceGoodsStock(memberPayParamDto.getLiveGoodsId(),memberPayParamDto.getLiveId());
+            list.add(sysUser.getId());
+            bucket.set(list);
+            return BaseController.succeed();
+        }else {
+            throw new BizException("当前商品不可购买");
         }
         //优惠券使用范围
         String[] checkCoupon = CouponDetailTypeEnum.getAllowType(MEMBER);
         //校验优惠券
-        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(memberPayParamDto.getCouponIdList(), vipGroupActivity.getMarketPrice(), true, checkCoupon);
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(memberPayParamDto.getCouponIdList(),amount, true, checkCoupon);
         studentPaymentOrder.setUserId(sysUser.getId());
         studentPaymentOrder.setOrganId(sysUser.getOrganId());
-        studentPaymentOrder.setMemo("小小训练营活动购买");
+        studentPaymentOrder.setMemo("小小训练营云教练购买");
         studentPaymentOrder.setGroupType(GroupType.ACTIVITY);
+        studentPaymentOrder.setActivityId(activityId.toString());
         Map<String, Object> result = getMap(memberPayParamDto.getAmount(), memberPayParamDto.getUseBalancePayment(),studentPaymentOrder);
         return BaseController.succeed(result);
     }
@@ -502,6 +545,10 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
         if (studentPaymentOrder.getStatus() == DealStatusEnum.CLOSE || studentPaymentOrder.getStatus() == DealStatusEnum.FAILED) {
             //退还优惠券和余额
             studentPaymentOrderService.returnBalanceAndCoupon(studentPaymentOrder, "购买会员支付失败");
+            if(Objects.nonNull(studentPaymentOrder.getActivityId())){
+                //还原库存
+                liveGoodsService.addGoodsStock(1,null);
+            }
             return true;
         }
         SysUser sysUser = teacherDao.getUser(userId);
@@ -526,6 +573,7 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
                 cloudTeacherOrder.setOrganId(studentPaymentOrder.getOrganId());
                 cloudTeacherOrder.setAmount(studentPaymentOrder.getExpectAmount());
                 cloudTeacherOrderService.save(cloudTeacherOrder,tenantConfigService.autoActivationFlag(cloudTeacherOrder.getTenantId()));
+                //赠送陪练课
                 ActivityUserMapper activityUserMapper = new ActivityUserMapper();
                 activityUserMapper.setPaymentOrderId(studentPaymentOrder.getId());
                 activityUserMapper.setUserId(studentPaymentOrder.getUserId());
@@ -534,6 +582,11 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
                 activityUserMapper.setGivePracticeFlag(1);
                 activityUserMapper.setReturnFee(false);
                 activityUserMapperDao.insert(activityUserMapper);
+                //赠送训练营
+                TempLittleArtistTrainingCampUserRelation tempLittleArtistTrainingCamp = new TempLittleArtistTrainingCampUserRelation();
+                tempLittleArtistTrainingCamp.setUserId(studentPaymentOrder.getUserId());
+                tempLittleArtistTrainingCamp.setState("NOT_APPLY");
+                tempLittleArtistTrainingCampUserRelationDao.insert(tempLittleArtistTrainingCamp);
                 //赠送优惠券
 //                Integer giveCouponId = activity.getGiveCouponId();
 //                Integer giveCouponNum = activity.getGiveCouponNum();

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java

@@ -4981,4 +4981,10 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         result.put("suplusCourseFee", bigDecimal);
         return result;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResponseResult studentCreateActivityPracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams) {
+        return null;
+    }
 }

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java

@@ -452,4 +452,9 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		pageInfo.setRows(dataList);
 		return pageInfo;
     }
+
+	@Override
+	public int queryCurrentDatePlayTimeByUserId(Integer userId) {
+		return sysMusicCompareRecordDao.queryCurrentDatePlayTimeByUserId(userId);
+	}
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherAttendanceServiceImpl.java

@@ -106,7 +106,7 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA
 	}
 
 	public void sendMessage(List<Integer> studentIds,CourseSchedule.CourseScheduleType type,String courseDate,MessageTypeEnum messageTypeEnum){
-		Map<Integer, String> receivers = studentIds.stream().collect(Collectors.toMap(e -> e, e -> e.toString()));
+		Map<Integer, String> receivers = studentIds.stream().collect(Collectors.toMap(e -> e, e -> e.toString(), (k1, k2) -> k1));
 		sendMessageSource.batchSendMessage(MessageSender.JIGUANG,messageTypeEnum,
 				receivers,null,"STUDENT",courseDate,type.getMsg());
 	}

+ 179 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TempLittleArtistTrainingCampServiceImpl.java

@@ -12,6 +12,7 @@ import com.ym.mec.biz.dal.entity.ImGroup;
 import com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCamp;
 import com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCampUserRelation;
 import com.ym.mec.biz.dal.vo.TempCampUserTrainingDetailVo;
+import com.ym.mec.biz.dal.vo.TempCampUserTrainingPlayTimeVo;
 import com.ym.mec.biz.dal.vo.TempCampUserVo;
 import com.ym.mec.biz.dal.vo.TempUserTrainingTimeDetailVo;
 import com.ym.mec.biz.service.TempLittleArtistTrainingCampService;
@@ -21,16 +22,23 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageUtil;
 import com.ym.mec.common.page.WrapperUtil;
 import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.util.excel.POIUtil;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -56,20 +64,31 @@ public class TempLittleArtistTrainingCampServiceImpl extends ServiceImpl<TempLit
     /**
      * 新建训练营
      */
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void add(TempLittleArtistTrainingCampDto dto) {
         SysUser user = getUser();
         TempLittleArtistTrainingCamp entity = new TempLittleArtistTrainingCamp();
         BeanUtils.copyProperties(dto, entity);
-        entity.setState(TempLittleArtistTrainingCamp.READY);
+        Date now = new Date();
+        //训练时间必需大于报名时间
+        if (dto.getApplyStartDate().getTime() > dto.getTrainStartDate().getTime()) {
+            throw new BizException("训练时间必需大于报名时间");
+        }
+        entity.setState(TempLittleArtistTrainingCamp.NOT_START);
+        //当前时间大于等于报名开始时间  当前时间小于等于报名结束时间
+        if (now.getTime() >= dto.getApplyStartDate().getTime() && now.getTime() <= dto.getApplyEndDate().getTime()) {
+            entity.setState(TempLittleArtistTrainingCamp.APPLY);
+        }
         entity.setCreateBy(user.getId());
-        entity.setCreateTime(new Date());
+        entity.setCreateTime(now);
         this.save(entity);
     }
 
     /**
      * 修改训练营
      */
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void update(TempLittleArtistTrainingCampDto dto) {
         SysUser user = getUser();
@@ -90,12 +109,13 @@ public class TempLittleArtistTrainingCampServiceImpl extends ServiceImpl<TempLit
     /**
      * 删除训练营
      */
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void delete(Integer id) {
         TempLittleArtistTrainingCamp entity = Optional.ofNullable(id)
                 .map(this::getById)
                 .orElseThrow(() -> new BizException("训练营不存在"));
-        entity.setDelFlag(0);
+        entity.setDelFlag(1);
         this.updateById(entity);
     }
 
@@ -171,7 +191,7 @@ public class TempLittleArtistTrainingCampServiceImpl extends ServiceImpl<TempLit
             }
             TempUserTrainingTimeDetailVo tempUserTrainingTimeDetailVo = new TempUserTrainingTimeDetailVo();
             tempUserTrainingTimeDetailVo.setUserId(userId);
-            tempUserTrainingTimeDetailVo.setTrainingDate(camp.getTrainStartDate());
+            tempUserTrainingTimeDetailVo.setTrainingDate(DateUtil.toDate(generateDate.toString()));
             tempUserTrainingTimeDetailVo.setPlayTime(BigDecimal.ZERO);
             tempUserTrainingTimeDetailVo.setIsFinish(0);
             resultList.add(tempUserTrainingTimeDetailVo);
@@ -211,12 +231,27 @@ public class TempLittleArtistTrainingCampServiceImpl extends ServiceImpl<TempLit
      */
     @Override
     public PageInfo<TempCampUserTrainingDetailVo> queryUserTrainingDetail(Map<String, Object> param) {
+        //训练营详情-查询条件时间设置
+        queryUserTrainingDetailOpsParam(param);
         Page<TempCampUserTrainingDetailVo> page = PageUtil.getPageInfo(param);
         page.setDesc("b.playDay");
         return PageUtil.pageInfo(baseMapper.queryUserTrainingDetail(page, param));
     }
 
     /**
+     * 训练营详情-查询条件时间设置
+     */
+    private void queryUserTrainingDetailOpsParam(Map<String, Object> param) {
+        Integer campId = WrapperUtil.toInt(param, "campId", "训练营id不能为空");
+        TempLittleArtistTrainingCamp camp = this.getOne(Wrappers.<TempLittleArtistTrainingCamp>lambdaQuery()
+                .eq(TempLittleArtistTrainingCamp::getId, campId)
+                .eq(TempLittleArtistTrainingCamp::getDelFlag, 0));
+        param.put("startTime", camp.getTrainStartDate());
+        param.put("endTime", camp.getTrainEndDate());
+        param.put("state", TempLittleArtistTrainingCampUserRelation.APPLY);
+    }
+
+    /**
      * 根据群组Id查询群组信息
      *
      * @param imGroupIds 群组id,多个用逗号隔开
@@ -226,12 +261,150 @@ public class TempLittleArtistTrainingCampServiceImpl extends ServiceImpl<TempLit
         return baseMapper.queryCampImGroup(imGroupIds);
     }
 
+    /**
+     * 查询训练营周期表
+     *
+     * @return result:
+     * <p>user 学员信息
+     * <p>campList 训练营信息
+     */
+    @Override
+    public Map<String, Object> queryCampCycle() {
+        SysUser user = getUser();
+        //查询未删除的训练营
+        List<TempLittleArtistTrainingCamp> campList = this.list(Wrappers.<TempLittleArtistTrainingCamp>lambdaQuery()
+                .eq(TempLittleArtistTrainingCamp::getDelFlag, 0));
+        //查询该学员是否购买过该训练营
+        TempLittleArtistTrainingCampUserRelation userRelation = tempLittleArtistTrainingCampUserRelationService.getOne(Wrappers.<TempLittleArtistTrainingCampUserRelation>lambdaQuery()
+                .eq(TempLittleArtistTrainingCampUserRelation::getUserId, user.getId()));
+        Map<String, Object> result = new HashMap<>();
+        result.put("user", userRelation);
+        if (CollectionUtils.isNotEmpty(campList)) {
+            campList.sort(Comparator.comparing(TempLittleArtistTrainingCamp::getApplyStartDate));
+        }
+        result.put("campList", campList);
+        return result;
+    }
+
+    /**
+     * 定时任务-修改训练营状态
+     */
+    @Override
+    public void checkCampState() {
+        //查询未结束 并 未删除的训练营
+        List<TempLittleArtistTrainingCamp> campList = this.list(Wrappers.<TempLittleArtistTrainingCamp>lambdaQuery()
+                .eq(TempLittleArtistTrainingCamp::getDelFlag, 0)
+                .ne(TempLittleArtistTrainingCamp::getState, TempLittleArtistTrainingCamp.END));
+        if (CollectionUtils.isEmpty(campList)) {
+            return;
+        }
+        Date now = DateUtil.stringToDate(LocalDate.now() + " 00:00:00");
+        //将训练营数据根据状态分组,未开始 NOT_START,报名中 APPLY,筹备中 READY,进行中 ING,已结束 END
+        Map<String, List<TempLittleArtistTrainingCamp>> stateMap = WrapperUtil.groupList(campList, TempLittleArtistTrainingCamp::getState);
+        //未开始 NOT_START 修改为 报名中 APPLY
+        opsState(now, stateMap, TempLittleArtistTrainingCamp.NOT_START, TempLittleArtistTrainingCamp::getApplyStartDate, TempLittleArtistTrainingCamp.APPLY);
+        //报名中 APPLY 修改为 筹备中 READY
+        opsState(now, stateMap, TempLittleArtistTrainingCamp.APPLY, TempLittleArtistTrainingCamp::getApplyEndDate, TempLittleArtistTrainingCamp.READY);
+        //筹备中 READY 修改为 进行中 ING
+        opsState(now, stateMap, TempLittleArtistTrainingCamp.READY, TempLittleArtistTrainingCamp::getTrainStartDate, TempLittleArtistTrainingCamp.ING);
+        //进行中 ING 修改为 已结束 END
+        opsState(now, stateMap, TempLittleArtistTrainingCamp.ING, TempLittleArtistTrainingCamp::getTrainEndDate, TempLittleArtistTrainingCamp.END);
+        //修改数据
+        campList.forEach(this::updateById);
+    }
+
+    /**
+     * 修改训练营状态
+     *
+     * @param now       当前时间
+     * @param stateMap  训练营状态分组
+     * @param oldState  原状态
+     * @param dateField 时间字段
+     * @param newState  新状态
+     */
+    private void opsState(Date now, Map<String, List<TempLittleArtistTrainingCamp>> stateMap, String oldState,
+                          Function<TempLittleArtistTrainingCamp, Date> dateField, String newState) {
+        List<TempLittleArtistTrainingCamp> list = stateMap.get(oldState);
+        if (CollectionUtils.isNotEmpty(list)) {
+            list.forEach(camp -> {
+                if (now.getTime() >= dateField.apply(camp).getTime()) {
+                    camp.setState(newState);
+                }
+            });
+        }
+    }
+
+    /**
+     * 云教练训练是否达标
+     */
+    @Override
+    public TempCampUserTrainingPlayTimeVo queryUserTrainingPlayTime() {
+        SysUser user = getUser();
+        //查询训练营人员关系
+        TempLittleArtistTrainingCampUserRelation campUser = tempLittleArtistTrainingCampUserRelationService.getOne(Wrappers.<TempLittleArtistTrainingCampUserRelation>lambdaQuery()
+                .eq(TempLittleArtistTrainingCampUserRelation::getUserId, user.getId()));
+        if (Objects.isNull(campUser)) {
+            return null;
+        }
+        //查询训练营
+        TempLittleArtistTrainingCamp camp = this.getOne(Wrappers.<TempLittleArtistTrainingCamp>lambdaQuery()
+                .eq(TempLittleArtistTrainingCamp::getId, campUser.getActivityId())
+                .eq(TempLittleArtistTrainingCamp::getDelFlag, 0));
+        if (Objects.isNull(camp)) {
+            return null;
+        }
+
+        TempCampUserTrainingPlayTimeVo vo = new TempCampUserTrainingPlayTimeVo();
+        Map<String, Object> param = new HashMap<>();
+        param.put("userId", user.getId());
+        param.put("startTime", DateUtil.dateToString(camp.getTrainStartDate()) + " 00:00:00");
+        param.put("endTime", DateUtil.dateToString(camp.getTrainEndDate()) + " 23:59:59");
+        Integer playTime = baseMapper.queryUserTrainingPlayTime(param);
+        vo.setPlayTime(playTime);
+        vo.setTrainStartDate(camp.getTrainStartDate());
+        vo.setTrainEndDate(camp.getTrainEndDate());
+        vo.setIsFinish(playTime >= 1200 ? 0 : 1);
+        return vo;
+    }
+
+    /**
+     * 导出小小训练营想详情
+     */
+    public void exportUserTrainingDetail(Map<String, Object> param, HttpServletResponse response) throws IOException {
+        //训练营详情-查询条件时间设置
+        queryUserTrainingDetailOpsParam(param);
+        List<TempCampUserTrainingDetailVo> list = baseMapper.queryUserTrainingDetail(param);
+        OutputStream outputStream = response.getOutputStream();
+        HSSFWorkbook workbook = null;
+        try {
+            String[] header = {"学员编号", "学员姓名", "手机号", "群组", "打卡天数", "训练时长(分钟)"};
+            String[] body = {"id", "username", "phone", "imGroupName", "playDay", "playTime"};
+            workbook = POIUtil.exportExcel(header, body, list);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=replacement-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+            workbook.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    workbook.close();
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
     private SysUser getUser() {
-        //修改机构基础信息
         return Optional.ofNullable(sysUserFeignService.queryUserInfo())
                 .orElseThrow(() -> new BizException("用户信息获取失败,请刷新页面或者重新登录!"));
     }
 
-
 }
 

+ 78 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TempLittleArtistTrainingCampUserRelationServiceImpl.java

@@ -1,13 +1,26 @@
 package com.ym.mec.biz.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.TempLittleArtistTrainingCampUserRelationDao;
+import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
 import com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCampUserRelation;
+import com.ym.mec.biz.dal.vo.TempCampUserQualificationsVo;
+import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.biz.service.TempLittleArtistTrainingCampUserRelationService;
+import com.ym.mec.common.exception.BizException;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Objects;
+import java.util.Optional;
+import java.util.function.Consumer;
+
 /**
  * 训练营与学生关系表(TempLittleArtistTrainingCampUserRelation)表服务实现类
  *
@@ -18,11 +31,76 @@ import org.springframework.stereotype.Service;
 public class TempLittleArtistTrainingCampUserRelationServiceImpl extends ServiceImpl<TempLittleArtistTrainingCampUserRelationDao, TempLittleArtistTrainingCampUserRelation> implements TempLittleArtistTrainingCampUserRelationService {
 
     private final static Logger log = LoggerFactory.getLogger(TempLittleArtistTrainingCampUserRelationServiceImpl.class);
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private SysConfigService sysConfigService;
 
     @Override
     public TempLittleArtistTrainingCampUserRelationDao getDao() {
         return this.baseMapper;
     }
 
+    /**
+     * 参与训练营
+     *
+     * @param campId 训练营id
+     */
+    public void add(Integer campId) {
+        SysUser user = getUser();
+        this.update(Wrappers.<TempLittleArtistTrainingCampUserRelation>lambdaUpdate()
+                .set(TempLittleArtistTrainingCampUserRelation::getActivityId, campId)
+                .set(TempLittleArtistTrainingCampUserRelation::getState, TempLittleArtistTrainingCampUserRelation.APPLY)
+                .eq(TempLittleArtistTrainingCampUserRelation::getUserId, user.getId()));
+    }
+
+    /**
+     * 查询当前登录学生有没有资格参加训练营
+     */
+    @Override
+    public TempCampUserQualificationsVo checkCampQualifications() {
+        TempCampUserQualificationsVo vo = new TempCampUserQualificationsVo();
+        vo.setQualifications(1);//训练营资格 有资格0  无资格1
+        SysUser user = getUser();
+        if (!user.getUserType().contains("STUDENT")) {
+            return vo;
+        }
+        TempLittleArtistTrainingCampUserRelation relation = this.getOne(Wrappers.<TempLittleArtistTrainingCampUserRelation>lambdaQuery()
+                .eq(TempLittleArtistTrainingCampUserRelation::getUserId, user.getId()));
+        //该学员未购买
+        if (Objects.isNull(relation)) {
+            return vo;
+        }
+        //已报名
+        if (relation.getState().equals(TempLittleArtistTrainingCampUserRelation.APPLY)) {
+            return vo;
+        }
+
+        //小小训训练营文案及标题-默认
+        vo.setContent("小小艺术家好习惯养成训练营邀请函");
+        vo.setCampTitle("恭喜你获得小小艺术家好习惯养成训练营体验资格,请及时通过训练营登记界面选择您要参加的训练营周期,不要浪费资格哦!");
+        //取配置中的文案及标题
+        this.setValue("temp_little_artist_training_camp_content", vo::setContent);
+        this.setValue("temp_little_artist_training_camp_title", vo::setCampTitle);
+        this.setValue("temp_little_artist_training_camp_url", vo::setUrl);
+
+        vo.setCampId(relation.getActivityId());
+        vo.setUserName(user.getUsername());
+        vo.setQualifications(0);//训练营资格 有资格0  无资格1
+        return vo;
+    }
+
+    private void setValue(String key, Consumer<String> consumer) {
+        Optional.of(key)
+                .map(sysConfigService::findByParamName)
+                .filter(s -> StringUtils.isNotBlank(s.getParanValue()))
+                .ifPresent(sysConfig -> consumer.accept(sysConfig.getParanValue()));
+    }
+
+    private SysUser getUser() {
+        return Optional.ofNullable(sysUserFeignService.queryUserInfo())
+                .orElseThrow(() -> new BizException("用户信息获取失败,请刷新页面或者重新登录!"));
+    }
+
 }
 

+ 30 - 5
mec-biz/src/main/resources/config/mybatis/ActivityUserMapperMapper.xml

@@ -19,6 +19,10 @@
 		<result column="give_member_flag_" property="giveMemberFlag" />
 		<result column="payment_order_id_" property="paymentOrderId" />
 		<result column="vip_group_id_" property="vipGroupId" />
+		<result column="total_course_num_" property="totalCourseNum" />
+		<result column="total_give_course_num_" property="totalGiveCourseNum" />
+		<result column="sub_course_num_" property="subCourseNum" />
+		<result column="sub_give_course_num_" property="subGiveCourseNum" />
 		<result column="give_vip_group_id_" property="giveVipGroupId" />
 		<result column="member_order_id_" property="memberOrderId" />
 		<result column="give_member_order_id_" property="giveMemberOrderId" />
@@ -49,31 +53,45 @@
 		INSERT INTO activity_user_mapper (activity_id_,user_id_,vip_flag_,give_vip_flag_,
 		                                  practice_flag_,give_practice_flag_,member_flag_,give_member_flag_,create_time_,update_time_,payment_order_id_,
 										  vip_group_id_,give_vip_group_id_,practice_group_id_,give_practice_group_id_,return_fee_,
-		                                  member_order_id_,give_member_order_id_,teacher_id_,actual_price_,add_memo_,cut_memo_,tenant_id_,give_coupon_id_)
+		                                  member_order_id_,give_member_order_id_,teacher_id_,actual_price_,add_memo_,cut_memo_,tenant_id_,give_coupon_id_,
+										  total_course_num_,total_give_course_num_,sub_course_num_,sub_give_course_num_)
 		                                  VALUES(#{activityId},#{userId},#{vipFlag},#{giveVipFlag},#{practiceFlag},
 		                                         #{givePracticeFlag},#{memberFlag},#{giveMemberFlag},NOW(),NOW(),#{paymentOrderId},#{vipGroupId},
 		                                         #{giveVipGroupId},#{practiceGroupId},#{givePracticeGroupId},#{returnFee},
-		                                         #{memberOrderId},#{giveMemberOrderId},#{teacherId},#{actualPrice},#{addMemo},#{cutMemo},#{tenantId},#{giveCouponId})
+		                                         #{memberOrderId},#{giveMemberOrderId},#{teacherId},#{actualPrice},#{addMemo},#{cutMemo},#{tenantId},#{giveCouponId},
+		                                         #{totalCourseNum},#{totalGiveCourseNum},#{subCourseNum},#{subGiveCourseNum})
 	</insert>
     <insert id="batchInsert">
 		INSERT INTO activity_user_mapper (activity_id_,user_id_,vip_flag_,give_vip_flag_,
 		practice_flag_,give_practice_flag_,member_flag_,give_member_flag_,create_time_,update_time_,payment_order_id_,
 		vip_group_id_,give_vip_group_id_,practice_group_id_,give_practice_group_id_,return_fee_,member_order_id_,
-		                                  give_member_order_id_,teacher_id_,actual_price_,add_memo_,cut_memo_,tenant_id_,give_coupon_id_)
+		                                  give_member_order_id_,teacher_id_,actual_price_,add_memo_,cut_memo_,tenant_id_,give_coupon_id_,
+		total_course_num_,total_give_course_num_,sub_course_num_,sub_give_course_num_)
 		VALUES
 		<foreach collection="activityUserMappers" item="item" separator=",">
 			(#{item.activityId},#{item.userId},#{item.vipFlag},#{item.giveVipFlag},#{item.practiceFlag},
 			#{item.givePracticeFlag},#{item.memberFlag},#{item.giveMemberFlag},NOW(),NOW(),#{item.paymentOrderId},#{item.vipGroupId},
 			#{item.giveVipGroupId},#{item.practiceGroupId},#{item.givePracticeGroupId},#{item.returnFee},
 			 #{item.memberOrderId},#{item.giveMemberOrderId},#{item.teacherId},#{item.actualPrice},#{item.addMemo},#{item.cutMemo},
-			 #{item.tenantId},#{item.giveCouponId})
+			 #{item.tenantId},#{item.giveCouponId},#{item.totalCourseNum},#{item.totalGiveCourseNum},#{item.subCourseNum},#{item.subGiveCourseNum})
 		</foreach>
 	</insert>
-
     <!-- 根据主键查询一条记录 -->
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.ActivityUserMapper">
 		UPDATE activity_user_mapper
 		<set>
+			<if test="totalCourseNum != null">
+				total_course_num_ = #{totalCourseNum},
+			</if>
+			<if test="totalGiveCourseNum != null">
+				total_give_course_num_ = #{totalGiveCourseNum},
+			</if>
+			<if test="subCourseNum != null">
+				sub_course_num_ = #{subCourseNum},
+			</if>
+			<if test="subGiveCourseNum != null">
+				sub_give_course_num_ = #{subGiveCourseNum},
+			</if>
 			<if test="giveCouponId != null">
 				give_coupon_id_ = #{giveCouponId},
 			</if>
@@ -280,4 +298,11 @@
 		GROUP BY aum.user_id_
 		<include refid="global.limit"/>
 	</select>
+    <select id="getStudentNoMapperInfo" resultType="Integer">
+		SELECT CASE WHEN aum.give_practice_flag_ = 1 THEN vga.give_course_num_ ELSE 0 END total_num_
+		FROM activity_user_mapper aum
+		LEFT JOIN vip_group_activity vga ON vga.id_ = aum.activity_id_
+		WHERE aum.return_fee_ = 0 AND aum.user_id_ = #{userId} AND aum.activity_id_ = #{activityId}
+		GROUP BY aum.user_id_
+	</select>
 </mapper>

+ 4 - 1
mec-biz/src/main/resources/config/mybatis/ImLiveBroadcastRoomDataMapper.xml

@@ -35,7 +35,10 @@
                r.live_remark_              AS liveRemark,
                ifnull(a.total_user_num_, 0) AS totalLookNum,
                ifnull(a.like_num_, 0)      as totalLikeNum,
-               ifnull(a.live_time_, 0)     as totalLiveTime
+               ifnull(a.live_time_, 0)     as totalLiveTime,
+               r.live_start_time_      as liveStartTime,
+               r.live_end_time_      as liveEndTime,
+               r.live_state_      as liveState
         from im_live_broadcast_room_data as a
                  left join im_live_broadcast_room AS r on a.room_uid_ = r.room_uid_
                  left join sys_user AS b on r.speaker_id_ = b.id_

+ 21 - 3
mec-biz/src/main/resources/config/mybatis/LiveGoodsMapper.xml

@@ -40,7 +40,10 @@
 		VALUES(#{name},#{image},#{stockCount},#{sellCount},#{currentPrice},
 		       #{originalPrice},#{goodsDetailUrl},#{desc},NOW(),NOW(),#{tenantId})
 	</insert>
-	
+	<insert id="addStock">
+		UPDATE live_goods SET stock_count_ = stock_count_ + 1 WHERE id_ = #{liveGoodsId}
+	</insert>
+
 	<!-- 根据主键查询一条记录 -->
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.LiveGoods">
 		UPDATE live_goods <set>
@@ -74,7 +77,10 @@
 		update_time_ = NOW()
 	</set> WHERE id_ = #{id}
 	</update>
-	
+	<update id="reduceStock">
+		UPDATE live_goods SET stock_count_ = stock_count_ - 1 WHERE id_ = #{liveGoodsId} AND stock_count_ > 0
+	</update>
+
 	<!-- 根据主键删除一条记录 -->
 	<delete id="delete" >
 		DELETE FROM live_goods WHERE id_ = #{id} 
@@ -82,7 +88,13 @@
 	<sql id="queryPageSql">
 		<where>
 			<if test="search != null and search != ''">
-				(name_ like '%${search}%' OR id_ = #{search})
+				AND (name_ like '%${search}%' OR id_ = #{search})
+			</if>
+			<if test="ignoreGoodsIds != null and ignoreGoodsIds.size > 0">
+				AND id_ NOT IN
+				<foreach collection="ignoreGoodsIds" item="ignoreGoodsId" open="(" separator="," close=")">
+					#{ignoreGoodsId}
+				</foreach>
 			</if>
 		</where>
 	</sql>
@@ -100,4 +112,10 @@
 		SELECT COUNT(*) FROM live_goods
 		<include refid="queryPageSql" />
 	</select>
+	<select id="getLock" resultMap="LiveGoods">
+		SELECT * FROM live_goods WHERE id_ = #{id} LIMIT 1 FOR UPDATE
+	</select>
+	<select id="getByName" resultMap="LiveGoods">
+		SELECT * FROM live_goods WHERE name_ = #{name} LIMIT 1
+	</select>
 </mapper>

+ 31 - 20
mec-biz/src/main/resources/config/mybatis/LiveGoodsMapperMapper.xml

@@ -34,8 +34,8 @@
 	<insert id="batchInsert">
 		INSERT INTO live_goods_mapper (goods_id_,live_id_,create_time_,update_time_)
 		VALUES
-		<foreach collection="liveGoodsMappers" item="item" index="index" separator=",">
-			(#{item.goodsId},#{item.liveId},NOW(),NOW())
+		<foreach collection="liveGoodsIds" item="goodsId" index="index" separator=",">
+			(#{goodsId},#{liveId},NOW(),NOW())
 		</foreach>
 		ON DUPLICATE KEY UPDATE
 		goods_id_ = VALUES(goods_id_),
@@ -78,11 +78,14 @@
 				AND lgm.live_id_ = #{liveId}
 			</if>
 			<if test="search != null and search != ''">
-				AND (lg.name_ LIKE '%${search}%' OR lg.id_ = ${search})
+				AND (lg.name_ LIKE CONCAT('%',#{search},'%') OR lg.id_ = #{search})
 			</if>
 			<if test="status != null">
 				AND lgm.status_ = #{status}
 			</if>
+			<if test="liveGoodsId != null">
+				AND lg.id_ = #{liveGoodsId}
+			</if>
 		</where>
 	</sql>
 	<!-- 分页查询 -->
@@ -100,13 +103,30 @@
 		LEFT JOIN live_goods lg ON lgm.goods_id_ = lg.id_
 		<include refid="queryPageSql" />
 	</select>
+
 	<select id="findByLiveGoodsIdAndStatus" resultMap="LiveGoodsMapper">
-		SELECT * FROM live_goods_mapper WHERE goods_id_ = #{liveGoodsId} AND status_ = #{status}
+		SELECT * FROM live_goods_mapper WHERE goods_id_ = #{liveGoodsId}
+		<if test="status != null">
+			AND status_ = #{status}
+		</if>
 	</select>
 	<select id="findByLiveIdAndGoodsId" resultMap="LiveGoodsMapper">
 		SELECT * FROM live_goods_mapper WHERE live_id_ = #{liveId} AND goods_id_ = #{liveGoodsId}
 	</select>
 
+	<sql id="queryGoodsPageSql">
+		<where>
+			<if test="liveId != null and liveId != ''">
+				AND lgm.live_id_ = #{liveId}
+			</if>
+			<if test="status != null">
+				AND lgm.status_ = #{status}
+			</if>
+			<if test="liveGoodsId != null">
+				AND lg.id_ = #{liveGoodsId}
+			</if>
+		</where>
+	</sql>
 	<resultMap id="LiveGoodsMapperDto" type="com.ym.mec.biz.dal.dto.LiveGoodsMapperDto">
 		<result column="id_" property="id" />
 		<result column="image_" property="image" />
@@ -122,32 +142,23 @@
 		SELECT lg.*,lgm.status_
 		FROM live_goods_mapper lgm
 		LEFT JOIN live_goods lg ON lgm.goods_id_ = lg.id_
-		WHERE lgm.live_id_ = #{liveId}
+		<include refid="queryGoodsPageSql"/>
 	</select>
-	<sql id="queryPageSqlForGoods">
-		<where>
-			<if test="liveId != null and liveId != ''">
-				AND lgm.live_id_ = #{liveId}
-			</if>
-			<if test="search != null and search != ''">
-				AND (lg.name_ LIKE '%${search}%' OR lg.id_ = ${search})
-			</if>
-			<if test="status != null">
-				AND lgm.status_ = #{status}
-			</if>
-		</where>
-	</sql>
 	<select id="countLiveGoods" resultType="java.lang.Integer">
 		SELECT COUNT(lgm.id_) FROM live_goods_mapper lgm
 		LEFT JOIN live_goods lg ON lgm.goods_id_ = lg.id_
-		<include refid="queryPageSqlForGoods" />
+		<include refid="queryPageSql" />
 	</select>
 	<select id="queryGoodsPage" resultMap="LiveGoodsMapperDto">
 		SELECT lg.*,lgm.status_
 		FROM live_goods_mapper lgm
 		LEFT JOIN live_goods lg ON lgm.goods_id_ = lg.id_
-		<include refid="queryPageSqlForGoods" />
+		<include refid="queryPageSql" />
 		ORDER BY lgm.id_
 		<include refid="global.limit"/>
 	</select>
+	<select id="queryGoodsIdsByLiveId" resultType="java.lang.Integer">
+		SELECT DISTINCT lgm.goods_id_ FROM live_goods_mapper lgm
+		WHERE lgm.live_id_ = #{liveId}
+	</select>
 </mapper>

+ 4 - 0
mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml

@@ -429,4 +429,8 @@
 		WHERE user_id_=#{userId} AND monday_ = #{monday} AND heard_level_ = #{heardLevel, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
 		ORDER BY score_ DESC LIMIT 1
 	</select>
+
+	<select id="queryCurrentDatePlayTimeByUserId" resultType="int">
+		SELECT sum(ifnull(cr.`play_time_`,0))  FROM `sys_music_compare_record` cr WHERE date(cr.`create_time_`) = CURDATE() AND cr.`user_id_` = #{userId}
+	</select>
 </mapper>

+ 60 - 0
mec-biz/src/main/resources/config/mybatis/TempBuyFreeLiveTheoryCourseMapper.xml

@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.biz.dal.dao.TempBuyFreeLiveTheoryCourseDao">
+	
+	<resultMap type="com.ym.mec.biz.dal.entity.TempBuyFreeLiveTheoryCourse" id="TempBuyFreeLiveTheoryCourse">
+		<result column="id_" property="id" />
+		<result column="user_id_" property="userId" />
+		<result column="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="TempBuyFreeLiveTheoryCourse" >
+		SELECT * FROM temp_buy_free_live_theory_course WHERE id_ = #{id} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="TempBuyFreeLiveTheoryCourse">
+		SELECT * FROM temp_buy_free_live_theory_course ORDER BY id_
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.TempBuyFreeLiveTheoryCourse" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO temp_buy_free_live_theory_course (user_id_,create_time_,update_time_) VALUES(#{userId},NOW(),NOW())
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.TempBuyFreeLiveTheoryCourse">
+		UPDATE temp_buy_free_live_theory_course <set>
+		<if test="userId != null">
+		user_id_ = #{userId},
+		</if>
+		<if test="updateTime != null">
+		update_time_ = #{updateTime},
+		</if>
+		</set> WHERE id_ = #{id}
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM temp_buy_free_live_theory_course WHERE id_ = #{id} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="TempBuyFreeLiveTheoryCourse" parameterType="map">
+		SELECT * FROM temp_buy_free_live_theory_course ORDER BY id_ <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM temp_buy_free_live_theory_course
+	</select>
+	<select id="countByUserId" resultType="java.lang.Integer">
+		SELECT COUNT(user_id_) FROM temp_buy_free_live_theory_course WHERE user_id_ = #{userId}
+	</select>
+</mapper>

+ 9 - 0
mec-biz/src/main/resources/config/mybatis/TempLittleArtistTrainingCampMapper.xml

@@ -124,6 +124,7 @@
         left join sys_user as d on d.id_ = a.user_id_
         left join im_group as e on a.im_group_id_ = e.id_
         <where>
+            a.activity_id_ = #{param.campId} and a.state_ = #{param.state}
             <if test="param.imGroupId != null">
                 AND e.im_group_id_ = #{param.imGroupId}
             </if>
@@ -144,4 +145,12 @@
         where find_in_set(id_, #{imGroupIds})
     </select>
 
+    <select id="queryUserTrainingPlayTime"  resultType="int" parameterType="java.util.Map">
+        SELECT ifnull(sum(`play_time_`), 0) as playTime
+        FROM `sys_music_compare_record`
+        WHERE user_id_ = #{param.userId}
+          and create_time_ &gt;= #{param.startTime}
+          AND create_time_ &lt;= #{param.endTime}
+    </select>
+
 </mapper>

+ 0 - 2
mec-im/src/main/java/com/ym/service/MessageService.java

@@ -12,8 +12,6 @@ public interface MessageService {
     Result privateRecall(RecallMessage recallMessage) throws Exception;
 
     Result privateSendTemplate(TemplateMessage templateMessage) throws Exception;
-
-
     //群组消息
     Result groupSend(GroupMessage groupMessage) throws Exception;
 

+ 32 - 0
mec-student/src/main/java/com/ym/mec/student/controller/ActivityUserMapperController.java

@@ -0,0 +1,32 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.service.ActivityUserMapperService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Optional;
+
+@RequestMapping("activityUserMapper")
+@Api(tags = "活动排课服务")
+@RestController
+public class ActivityUserMapperController extends BaseController {
+
+    @Autowired
+    private ActivityUserMapperService activityUserMapperService;
+
+    @ApiOperation(value = "获取学员未排课信息")
+    @GetMapping("getStudentNoCourseInfo")
+    public HttpResponseResult getStudentNoCourseInfo() {
+        return succeed(activityUserMapperService.getStudentNoMapperInfo());
+    }
+
+}

+ 24 - 2
mec-student/src/main/java/com/ym/mec/student/controller/LiveGoodsMapperController.java

@@ -1,16 +1,24 @@
 package com.ym.mec.student.controller;
 
+import com.ym.mec.biz.dal.dto.LiveGoodsMapperDto;
+import com.ym.mec.biz.dal.entity.LiveGoods;
 import com.ym.mec.biz.dal.page.LiveGoodsMapperQueryInfo;
 import com.ym.mec.biz.service.LiveGoodsMapperService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 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.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 @Api(tags = "直播商品关联管理")
 @RequestMapping("liveGoodsMapper")
 @RestController
@@ -21,7 +29,21 @@ public class LiveGoodsMapperController extends BaseController {
 
     @ApiOperation("分页查询直播间商品")
     @PostMapping("/page")
-    public HttpResponseResult page(LiveGoodsMapperQueryInfo queryInfo) {
-        return succeed(liveGoodsMapperService.queryPage(queryInfo));
+    public HttpResponseResult<PageInfo<LiveGoodsMapperDto>> page(LiveGoodsMapperQueryInfo queryInfo) {
+        return succeed(liveGoodsMapperService.queryGoodsPage(queryInfo));
+    }
+
+    @ApiOperation("获取直播间商品详情")
+    @GetMapping(value = "/getGoodsDetail")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "liveGoodsId", value = "商品编号", required = true, dataType = "long"),
+            @ApiImplicitParam(name = "liveId", value = "房间号", required = true,dataType = "String")
+    })
+    public HttpResponseResult<LiveGoodsMapperDto> getGoodsDetail(Integer liveGoodsId, String liveId) {
+        List<LiveGoodsMapperDto> liveGoodsList = liveGoodsMapperService.getLiveGoodsList(liveId, liveGoodsId, null);
+        if (liveGoodsList.size() > 0) {
+            return succeed(liveGoodsList.get(0));
+        }
+        return failed("商品不存在");
     }
 }

+ 4 - 3
mec-student/src/main/java/com/ym/mec/student/controller/MemberRankController.java

@@ -114,9 +114,10 @@ public class MemberRankController extends BaseController {
     @ApiOperation(value = "2022小小训练营活动购买会员")
     @PostMapping("/activeBuy")
     public HttpResponseResult ActiveBuy(@RequestBody MemberPayParamDto memberPayParamDto) throws Exception {
-		String startTimeStr = sysConfigDao.findConfigValue("cloud_teacher_active_start_time");
-		String endTimeStr = sysConfigDao.findConfigValue("cloud_teacher_active_end_time");
-        SysConfigService.checkActivityDate(startTimeStr,endTimeStr);
+//		String startTimeStr = sysConfigDao.findConfigValue("cloud_teacher_active_start_time");
+//		String endTimeStr = sysConfigDao.findConfigValue("cloud_teacher_active_end_time");
+//        SysConfigService.checkActivityDate(startTimeStr,endTimeStr);
+
 		return memberRankSettingService.activeBuy(memberPayParamDto);
     }
 

+ 31 - 89
mec-student/src/main/java/com/ym/mec/student/controller/PracticeGroupController.java

@@ -26,7 +26,6 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalTime;
@@ -63,20 +62,14 @@ public class PracticeGroupController extends BaseController {
     @ApiOperation("获取学生的陪练课")
     @GetMapping(value = "/findUserPracticeCourses")
     public Object findUserPracticeCourses(){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         return succeed(practiceGroupService.findUserPracticeCourses(sysUser.getId()));
     }
 
     @ApiOperation("检测用户是否能够申请免费陪练课")
     @GetMapping(value = "/checkCanApplyFreePracticeGroup")
     private HttpResponseResult checkCanApplyFreePracticeGroup(){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         Map<String,Object> result=practiceGroupService.checkCanApplyFreePracticeGroup(sysUser.getId());
         Integer applyTimes = practiceGroupDao.countUserPracticeApplyRecord(sysUser.getId());
         result.put("canApply", applyTimes < 1 ? 1 : 0);
@@ -87,10 +80,7 @@ public class PracticeGroupController extends BaseController {
     @ApiOperation("获取陪练课预约参数")
     @GetMapping(value = "/getPracticeApplyParams")
     public Object getPracticeApplyParams(){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         if (sysUser.getTenantId() == null) {
             return failed( "用户机构信息异常");
         }
@@ -103,40 +93,28 @@ public class PracticeGroupController extends BaseController {
     @ApiOperation("获取可以预约的教师")
     @GetMapping(value = "/getEnableApplyTeachers")
     public Object getEnableApplyTeachers(Integer subjectId){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         return succeed(practiceGroupService.getEnableApplyTeachers(sysUser.getId(), subjectId));
     }
 
     @ApiOperation("获取可以预约的教师--付费")
     @GetMapping(value = "/getEnableApplyTeachersWithPay")
     public Object getEnableApplyTeachersWithPay(Integer subjectId){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         return succeed(practiceGroupService.getEnableApplyTeachersWithPay(sysUser.getId(), subjectId));
     }
 
     @ApiOperation("获取指定学员所在分部下的教师空闲时间")
     @GetMapping(value = "/getTeacherFreeTimes")
     public Object getTeacherFreeTimes(Integer teacherId, Date firstClassTime){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         return succeed(practiceGroupService.getTeacherFreeTimes(sysUser.getId(),teacherId,firstClassTime));
     }
 
     @ApiOperation("获取指定学员所在分部下的教师空闲时间")
     @GetMapping(value = "/getTeachersFreeTimes")
     public Object getTeachersFreeTimes(Integer subjectId, Date firstClassTime){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         return succeed(practiceGroupService.getTeachersFreeTimes(sysUser.getId(),subjectId,firstClassTime));
     }
 
@@ -144,10 +122,7 @@ public class PracticeGroupController extends BaseController {
     @PostMapping(value = "/practiceApply")
     @AuditLogAnnotation(operateName = "陪练课预约")
     public Object practiceApply(PracticeGroup practiceGroup){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         if(excludeOrganIds.contains(sysUser.getOrganId())){
             throw new BizException("请联系老师确认您的所属分部");
         }
@@ -162,10 +137,7 @@ public class PracticeGroupController extends BaseController {
     @ApiOperation("获取陪练课预约参数——付费")
     @GetMapping(value = "/getPayPracticeApplyParams")
     public Object getPayPracticeApplyParams(Integer organId){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         if(sysUser.getTenantId() == null){
             throw new BizException("请联系老师确认您的所属机构");
         }
@@ -175,10 +147,7 @@ public class PracticeGroupController extends BaseController {
     @ApiOperation("获取指定教师的空闲时间——付费")
     @GetMapping(value = "/getPayPracticeTeacherFreeTimes")
     public Object getPayPracticeTeacherFreeTimes(Integer teacherId,Integer buyMonths, boolean renew, Long groupId, PracticeGroupType type){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         Map payPracticeTeacherFreeTimes = practiceGroupService.getPayPracticeTeacherFreeTimes(sysUser.getId(),teacherId, buyMonths,renew,groupId);
         if(Objects.nonNull(type)&&PracticeGroupType.COME_ON_PACKAGE.equals(type)){
             Map<Integer, List<String>> weekNumApplyTimesMap = (Map<Integer, List<String>>) payPracticeTeacherFreeTimes.get("teacherFreeDays");
@@ -213,20 +182,14 @@ public class PracticeGroupController extends BaseController {
     @ApiOperation("获取学生上一次的购买信息--付费")
     @GetMapping(value = "/findUserLatestPracticeGroup")
     public HttpResponseResult findUserLatestPracticeGroup(Long groupId){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         return succeed(practiceGroupService.findUserLatestPracticeGroup(sysUser.getId(),groupId));
     }
 
     @ApiOperation("检测学生是否是新用户")
     @GetMapping(value = "/isNewStudent")
     public HttpResponseResult isNewStudent(){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         int studentExitChargePractices = practiceGroupDao.checkStudentExitChargePractice(sysUser.getId(),"2021-03-09 00:00:00");
         Student student = studentDao.get(sysUser.getId());
         if(student == null){
@@ -247,10 +210,7 @@ public class PracticeGroupController extends BaseController {
     @PostMapping(value = "/buyPracticeGroup")
     @AuditLogAnnotation(operateName = "陪练课购买")
     public HttpResponseResult buyPracticeGroup(@RequestBody PracticeGroupBuyDto practiceGroupBuyParams){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         if(excludeOrganIds.contains(sysUser.getOrganId())){
             throw new BizException("请联系老师确认您的所属分部");
         }
@@ -262,13 +222,19 @@ public class PracticeGroupController extends BaseController {
         }
     }
 
+    @ApiOperation("学生主动排课")
+    @PostMapping(value = "/createActivityPracticeGroup")
+    @AuditLogAnnotation(operateName = "陪练课购买")
+    public HttpResponseResult createActivityPracticeGroup(@RequestBody PracticeGroupBuyDto practiceGroupBuyParams){
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
+        practiceGroupBuyParams.setStudentId(sysUser.getId());
+        return practiceGroupService.studentCreateActivityPracticeGroup(practiceGroupBuyParams);
+    }
+
     @ApiOperation(value = "获取网管课购买信息")
     @PostMapping("/getPracticeGroupPayInfo")
     public Object getPracticeGroupPayInfo(Long vipGroupId){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (null == sysUser) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         return succeed(practiceGroupService.getPracticeGroupPayInfo(vipGroupId,sysUser.getId()));
     }
 
@@ -279,10 +245,7 @@ public class PracticeGroupController extends BaseController {
 //        if(CollectionUtils.isNotEmpty(practiceGroupBuyParams.getCouponIdList())){
 //            throw new BizException("当前活动不支持优惠券");
 //        }
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (null == sysUser) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         practiceGroupBuyParams.setUserId(sysUser.getId());
         practiceGroupBuyParams.setOrganId(sysUser.getOrganId());
         return succeed(practiceGroupService.buyActivityPracticeGroup(practiceGroupBuyParams));
@@ -298,10 +261,7 @@ public class PracticeGroupController extends BaseController {
     @ApiOperation("获取用户历史购买的陪练课")
     @GetMapping(value = "/findUserHistoryBuyPracticeGroups")
     public HttpResponseResult findUserHistoryBuyPracticeGroups(Long groupId, PracticeGroupType type){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         return succeed(practiceGroupService.findUserHistoryBuyPracticeGroups(sysUser.getId(), groupId, type));
     }
 
@@ -315,20 +275,14 @@ public class PracticeGroupController extends BaseController {
     @PostMapping(value = "/repay")
     @AuditLogAnnotation(operateName = "重新支付")
     public HttpResponseResult repay(Integer groupId, boolean useBalancePayment) throws Exception {
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         return practiceGroupService.repay(sysUser.getId(),groupId,useBalancePayment);
     }
 
     @ApiOperation("免费陪练课定点推送")
     @GetMapping(value = "/freePush")
     public HttpResponseResult freePush(Integer userId, String pushType){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
 
         String pushUrl = baseApiUrl + "/#/auditionbanner/id";
@@ -357,10 +311,7 @@ public class PracticeGroupController extends BaseController {
     @ApiOperation("陪练课完成报告推送")
     @GetMapping(value = "/reportPush")
     public HttpResponseResult reportPush(Integer userId, String pushType){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
         PracticeGroup userFreePracticeGroup = practiceGroupDao.getUserFreePracticeGroup(userId);
         ClassGroup classGroup = classGroupDao.findByMusicGroupAndType(userFreePracticeGroup.getId().toString(), GroupType.PRACTICE.getCode());
@@ -396,10 +347,7 @@ public class PracticeGroupController extends BaseController {
     @ApiOperation("陪练课完成报告推送")
     @GetMapping(value = "/pushStudyReport")
     public HttpResponseResult pushStudyReport(Date expiredDate, String pushType){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         practiceGroupService.pushStudyReport(expiredDate,pushType);
         return succeed();
     }
@@ -407,10 +355,7 @@ public class PracticeGroupController extends BaseController {
     @ApiOperation("检测用户是否存在待支付的课程组订单")
     @GetMapping(value = "/checkExistWaitPayOrder")
     public HttpResponseResult checkExistWaitPayOrder(Long groupId){
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         return succeed(practiceGroupService.checkExistWaitPayOrder(sysUser.getId(),groupId));
     }
 
@@ -418,10 +363,7 @@ public class PracticeGroupController extends BaseController {
     @PostMapping(value = "/cancelWaitPayOrder")
     @AuditLogAnnotation(operateName = "取消待支付的订单")
     public HttpResponseResult cancelWaitPayOrder(Integer groupId) throws Exception{
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("请登录"));
         return practiceGroupService.cancelWaitPayOrder(sysUser.getId(), groupId);
     }
 }

+ 10 - 1
mec-student/src/main/java/com/ym/mec/student/controller/SysMusicCompareRecordController.java

@@ -8,9 +8,12 @@ import com.ym.mec.biz.service.SysMusicCompareRecordService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -45,7 +48,13 @@ public class SysMusicCompareRecordController extends BaseController {
         }
         record.setUserId(sysUser.getId());
         record.setClientId("student");
-        return succeed(sysMusicCompareRecordService.insert(record));
+        
+        sysMusicCompareRecordService.insert(record);
+        
+        ModelMap model = new ModelMap();
+        model.put("totalPlayTimeOfCurrentDate", sysMusicCompareRecordService.queryCurrentDatePlayTimeByUserId(sysUser.getId()));
+        
+        return succeed(model);
     }
 
     @ApiOperation(value = "用户最后一次评测数据")

+ 35 - 40
mec-student/src/main/java/com/ym/mec/student/controller/TempLittleArtistTrainingCampController.java

@@ -3,10 +3,9 @@ package com.ym.mec.student.controller;
 import com.ym.mec.biz.dal.dto.TempLittleArtistTrainingCampDto;
 import com.ym.mec.biz.dal.entity.ImGroup;
 import com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCamp;
-import com.ym.mec.biz.dal.vo.TempCampUserTrainingDetailVo;
-import com.ym.mec.biz.dal.vo.TempCampUserVo;
-import com.ym.mec.biz.dal.vo.TempUserTrainingTimeDetailVo;
+import com.ym.mec.biz.dal.vo.*;
 import com.ym.mec.biz.service.TempLittleArtistTrainingCampService;
+import com.ym.mec.biz.service.TempLittleArtistTrainingCampUserRelationService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
@@ -33,27 +32,8 @@ public class TempLittleArtistTrainingCampController extends BaseController {
      */
     @Resource
     private TempLittleArtistTrainingCampService tempLittleArtistTrainingCampService;
-
-    @ApiOperation("添加训练营")
-    @PostMapping(value = "/add")
-    public HttpResponseResult<Object> add(@Valid @RequestBody TempLittleArtistTrainingCampDto dto) {
-        tempLittleArtistTrainingCampService.add(dto);
-        return succeed();
-    }
-
-    @ApiOperation("修改训练营")
-    @PostMapping(value = "/update")
-    public HttpResponseResult<Object> update(@Valid @RequestBody TempLittleArtistTrainingCampDto dto) {
-        tempLittleArtistTrainingCampService.update(dto);
-        return succeed();
-    }
-
-    @ApiOperation("修改机构启用停用状态")
-    @GetMapping(value = "/delete/{id}")
-    public HttpResponseResult<Object> opsState(@ApiParam(value = "训练营ID", required = true) @PathVariable("id") Integer id) {
-        tempLittleArtistTrainingCampService.delete(id);
-        return succeed();
-    }
+    @Resource
+    private TempLittleArtistTrainingCampUserRelationService tempLittleArtistTrainingCampUserRelationService;
 
     @ApiImplicitParams({
             @ApiImplicitParam(name = "name", dataType = "String", value = "训练营标题-模糊搜索"),
@@ -72,18 +52,6 @@ public class TempLittleArtistTrainingCampController extends BaseController {
     }
 
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "search", dataType = "String", value = "学员姓名/手机号/编号-模糊搜索"),
-            @ApiImplicitParam(name = "state", dataType = "String", value = "状态:未报名NOT_APPLY ,已报名 APPLY"),
-            @ApiImplicitParam(name = "page", dataType = "Integer", required = true, value = "页数"),
-            @ApiImplicitParam(name = "rows", dataType = "Integer", required = true, value = "每页数量"),
-    })
-    @ApiOperation("分页查询-参与名单")
-    @PostMapping(value = "/queryPageTrainingCampUser")
-    public HttpResponseResult<PageInfo<TempCampUserVo>> queryPageTrainingCampUser(@RequestBody Map<String, Object> param) {
-        return succeed(tempLittleArtistTrainingCampService.queryPageTrainingCampUser(param));
-    }
-
-    @ApiImplicitParams({
             @ApiImplicitParam(name = "userId", dataType = "Integer", required = true, value = "用户id"),
     })
     @ApiOperation("查询指定学生-训练营每日训练时长")
@@ -95,6 +63,7 @@ public class TempLittleArtistTrainingCampController extends BaseController {
     @ApiImplicitParams({
             @ApiImplicitParam(name = "search", dataType = "String", value = "学员姓名/手机号/编号-模糊搜索"),
             @ApiImplicitParam(name = "imGroupId", dataType = "Integer", value = "所在群组Id"),
+            @ApiImplicitParam(name = "campId", dataType = "Integer", value = "训练营id"),
             @ApiImplicitParam(name = "page", dataType = "Integer", required = true, value = "页数"),
             @ApiImplicitParam(name = "rows", dataType = "Integer", required = true, value = "每页数量"),
     })
@@ -104,10 +73,36 @@ public class TempLittleArtistTrainingCampController extends BaseController {
         return succeed(tempLittleArtistTrainingCampService.queryUserTrainingDetail(param));
     }
 
-    @ApiOperation("根据群组Id查询群组信息")
-    @GetMapping(value = "/queryCampImGroup")
-    public HttpResponseResult<List<ImGroup>> queryCampImGroup(@ApiParam(value = "群组id,多个用逗号隔开 imGroupIds", required = true) String imGroupIds){
-        return succeed(tempLittleArtistTrainingCampService.queryCampImGroup(imGroupIds));
+    /**
+     * 查询训练营周期表
+     *
+     * @return result:
+     * <p>user 学员信息
+     * <p>campList 训练营信息
+     */
+    @ApiOperation(value="查询训练营周期表", notes="user 学员信息,campList 训练营信息")
+    @GetMapping(value = "/queryCampCycle")
+    public HttpResponseResult<Map<String, Object>> queryCampCycle(){
+        return succeed(tempLittleArtistTrainingCampService.queryCampCycle());
+    }
+
+    @ApiOperation(value="云教练训练是否达标数据查询")
+    @GetMapping(value = "/queryUserTrainingPlayTime")
+    public HttpResponseResult<TempCampUserTrainingPlayTimeVo> queryUserTrainingPlayTime(){
+        return succeed(tempLittleArtistTrainingCampService.queryUserTrainingPlayTime());
+    }
+
+    @ApiOperation(value="查询当前登录学生有没有资格参加训练营")
+    @GetMapping(value = "/checkCampQualifications")
+    public HttpResponseResult<TempCampUserQualificationsVo> checkCampQualifications(){
+        return succeed(tempLittleArtistTrainingCampUserRelationService.checkCampQualifications());
+    }
+
+    @ApiOperation(value="参与训练营")
+    @GetMapping(value = "/addCamp")
+    public HttpResponseResult<Object> addCamp(Integer campId){
+        tempLittleArtistTrainingCampUserRelationService.add(campId);
+        return succeed();
     }
 
 }

+ 4 - 1
mec-web/src/main/java/com/ym/mec/web/controller/ImSendGroupMessageController.java

@@ -15,7 +15,10 @@ import com.ym.mec.common.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import java.util.Optional;
 

+ 12 - 8
mec-web/src/main/java/com/ym/mec/web/controller/LiveGoodsController.java

@@ -1,18 +1,15 @@
 package com.ym.mec.web.controller;
 
 import com.ym.mec.biz.dal.entity.LiveGoods;
+import com.ym.mec.biz.dal.page.LiveGoodsQueryInfo;
 import com.ym.mec.biz.service.LiveGoodsService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
-import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 @Api(tags = "直播间商品管理")
 @RequestMapping("liveGoods")
@@ -22,18 +19,25 @@ public class LiveGoodsController extends BaseController {
     @Autowired
     private LiveGoodsService liveGoodsService;
 
+    @ApiOperation("获取商品详情")
+    @GetMapping(value = "/get")
+    @PreAuthorize("@pcs.hasPermissions('liveGoods/get')")
+    public HttpResponseResult get(Integer goodsId) {
+        return succeed(liveGoodsService.get(goodsId));
+    }
+
     @ApiOperation("分页查询直播间商品")
     @PostMapping(value = "/page")
     @PreAuthorize("@pcs.hasPermissions('liveGoods/page')")
-    public HttpResponseResult page(QueryInfo queryInfo) {
-        return succeed(liveGoodsService.queryPage(queryInfo));
+    public HttpResponseResult page(LiveGoodsQueryInfo queryInfo) {
+        return succeed(liveGoodsService.queryGoodsPage(queryInfo));
     }
 
     @ApiOperation("新增直播间商品")
     @PostMapping("/add")
     @PreAuthorize("@pcs.hasPermissions('liveGoods/add')")
     public HttpResponseResult add(@RequestBody LiveGoods liveGoods) {
-        liveGoodsService.insert(liveGoods);
+        liveGoodsService.add(liveGoods);
         return succeed();
     }
 

+ 20 - 7
mec-web/src/main/java/com/ym/mec/web/controller/LiveGoodsMapperController.java

@@ -1,5 +1,6 @@
 package com.ym.mec.web.controller;
 
+import com.ym.mec.biz.dal.dto.LiveGoodsMapperDto;
 import com.ym.mec.biz.dal.entity.LiveGoods;
 import com.ym.mec.biz.dal.entity.LiveGoodsMapper;
 import com.ym.mec.biz.dal.page.LiveGoodsMapperQueryInfo;
@@ -15,10 +16,7 @@ import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -33,18 +31,33 @@ public class LiveGoodsMapperController extends BaseController {
     @ApiOperation("分页查询直播间商品")
     @PostMapping("/page")
     @PreAuthorize("@pcs.hasPermissions('liveGoodsMapper/page')")
-    public HttpResponseResult<PageInfo<LiveGoods>> page(LiveGoodsMapperQueryInfo queryInfo) {
+    public HttpResponseResult<PageInfo<LiveGoodsMapperDto>> page(LiveGoodsMapperQueryInfo queryInfo) {
         return succeed(liveGoodsMapperService.queryGoodsPage(queryInfo));
     }
 
     @ApiOperation("新增直播间商品关联")
     @PostMapping("/add")
     @PreAuthorize("@pcs.hasPermissions('liveGoodsMapper/add')")
-    public HttpResponseResult add(@RequestBody List<LiveGoodsMapper> liveGoodsMappers) {
-        liveGoodsMapperService.add(liveGoodsMappers);
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "liveGoodsIds", value = "商品编号列表", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "liveId", value = "房间号", required = true,dataType = "String")
+    })
+    public HttpResponseResult add(String liveId, String liveGoodsIds) {
+        liveGoodsMapperService.add(liveId,liveGoodsIds);
         return succeed();
     }
 
+    @ApiOperation("获取直播间商品详情")
+    @GetMapping(value = "/getGoodsDetail")
+    @PreAuthorize("@pcs.hasPermissions('liveGoodsMapper/getGoodsDetail')")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "liveGoodsId", value = "商品编号", required = true, dataType = "long"),
+            @ApiImplicitParam(name = "liveId", value = "房间号", required = true,dataType = "String")
+    })
+    public HttpResponseResult<LiveGoodsMapperDto> getGoodsDetail(Integer liveGoodsId, String liveId) {
+        return succeed(liveGoodsMapperService.getLiveGoodsList(liveId,liveGoodsId,null).get(0));
+    }
+
     @ApiOperation("上架、下架直播间商品")
     @PostMapping("/updateStatus")
     @PreAuthorize("@pcs.hasPermissions('liveGoodsMapper/updateStatus')")

+ 52 - 5
mec-web/src/main/java/com/ym/mec/web/controller/TempLittleArtistTrainingCampController.java

@@ -3,10 +3,9 @@ package com.ym.mec.web.controller;
 import com.ym.mec.biz.dal.dto.TempLittleArtistTrainingCampDto;
 import com.ym.mec.biz.dal.entity.ImGroup;
 import com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCamp;
-import com.ym.mec.biz.dal.vo.TempCampUserTrainingDetailVo;
-import com.ym.mec.biz.dal.vo.TempCampUserVo;
-import com.ym.mec.biz.dal.vo.TempUserTrainingTimeDetailVo;
+import com.ym.mec.biz.dal.vo.*;
 import com.ym.mec.biz.service.TempLittleArtistTrainingCampService;
+import com.ym.mec.biz.service.TempLittleArtistTrainingCampUserRelationService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
@@ -14,7 +13,9 @@ import io.swagger.annotations.*;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
@@ -33,6 +34,8 @@ public class TempLittleArtistTrainingCampController extends BaseController {
      */
     @Resource
     private TempLittleArtistTrainingCampService tempLittleArtistTrainingCampService;
+    @Resource
+    private TempLittleArtistTrainingCampUserRelationService tempLittleArtistTrainingCampUserRelationService;
 
     @ApiOperation("添加训练营")
     @PostMapping(value = "/add")
@@ -95,20 +98,64 @@ public class TempLittleArtistTrainingCampController extends BaseController {
     @ApiImplicitParams({
             @ApiImplicitParam(name = "search", dataType = "String", value = "学员姓名/手机号/编号-模糊搜索"),
             @ApiImplicitParam(name = "imGroupId", dataType = "Integer", value = "所在群组Id"),
+            @ApiImplicitParam(name = "campId", dataType = "Integer", value = "训练营id"),
             @ApiImplicitParam(name = "page", dataType = "Integer", required = true, value = "页数"),
             @ApiImplicitParam(name = "rows", dataType = "Integer", required = true, value = "每页数量"),
     })
     @ApiOperation("分页查询-训练营详情")
     @PostMapping(value = "/queryUserTrainingDetail")
-    public HttpResponseResult<PageInfo<TempCampUserTrainingDetailVo>> queryUserTrainingDetail(@RequestBody Map<String, Object> param){
+    public HttpResponseResult<PageInfo<TempCampUserTrainingDetailVo>> queryUserTrainingDetail(@RequestBody Map<String, Object> param) {
         return succeed(tempLittleArtistTrainingCampService.queryUserTrainingDetail(param));
     }
 
     @ApiOperation("根据群组Id查询群组信息")
     @GetMapping(value = "/queryCampImGroup")
-    public HttpResponseResult<List<ImGroup>> queryCampImGroup(@ApiParam(value = "群组id,多个用逗号隔开", required = true) String imGroupIds){
+    public HttpResponseResult<List<ImGroup>> queryCampImGroup(@ApiParam(value = "群组id,多个用逗号隔开", required = true) String imGroupIds) {
         return succeed(tempLittleArtistTrainingCampService.queryCampImGroup(imGroupIds));
     }
 
+    /**
+     * 查询训练营周期表
+     *
+     * @return result:
+     * <p>user 学员信息
+     * <p>campList 训练营信息
+     */
+    @ApiOperation(value = "查询训练营周期表", notes = "user 学员信息,campList 训练营信息")
+    @GetMapping(value = "/queryCampCycle")
+    public HttpResponseResult<Map<String, Object>> queryCampCycle() {
+        return succeed(tempLittleArtistTrainingCampService.queryCampCycle());
+    }
+
+    @ApiOperation(value = "云教练训练是否达标数据查询")
+    @GetMapping(value = "/queryUserTrainingPlayTime")
+    public HttpResponseResult<TempCampUserTrainingPlayTimeVo> queryUserTrainingPlayTime() {
+        return succeed(tempLittleArtistTrainingCampService.queryUserTrainingPlayTime());
+    }
+
+    @ApiOperation(value = "查询当前登录学生有没有资格参加训练营")
+    @GetMapping(value = "/checkCampQualifications")
+    public HttpResponseResult<TempCampUserQualificationsVo> checkCampQualifications() {
+        return succeed(tempLittleArtistTrainingCampUserRelationService.checkCampQualifications());
+    }
+
+    @ApiOperation(value="参与训练营")
+    @GetMapping(value = "/addCamp")
+    public HttpResponseResult<Object> addCamp(Integer campId){
+        tempLittleArtistTrainingCampUserRelationService.add(campId);
+        return succeed();
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "search", dataType = "String", value = "学员姓名/手机号/编号-模糊搜索"),
+            @ApiImplicitParam(name = "imGroupId", dataType = "Integer", value = "所在群组Id"),
+            @ApiImplicitParam(name = "campId", dataType = "Integer", value = "训练营id"),
+    })
+    @ApiOperation(value="导出训练营详情")
+    @PostMapping(value = "/exportUserTrainingDetail")
+    public void exportUserTrainingDetail(@RequestBody Map<String, Object> param, HttpServletResponse response) throws IOException{
+        tempLittleArtistTrainingCampService.exportUserTrainingDetail(param, response);
+    }
+
 }