浏览代码

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

zouxuan 3 年之前
父节点
当前提交
8fc0f2ec80
共有 34 个文件被更改,包括 2395 次插入38 次删除
  1. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LiveGoodsDao.java
  2. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LiveGoodsMapperDao.java
  3. 30 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TempLittleArtistTrainingCampDao.java
  4. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TempLittleArtistTrainingCampUserRelationDao.java
  5. 139 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LiveGoodsMapperDto.java
  6. 93 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TempLittleArtistTrainingCampDto.java
  7. 266 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/LiveGoods.java
  8. 103 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/LiveGoodsMapper.java
  9. 203 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TempLittleArtistTrainingCamp.java
  10. 100 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TempLittleArtistTrainingCampUserRelation.java
  11. 65 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/TempCampUserVo.java
  12. 58 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/TempUserTrainingTimeDetailVo.java
  13. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/vo/TempUserTrainingTimeVo.java
  14. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/service/LiveGoodsMapperService.java
  15. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/service/LiveGoodsService.java
  16. 9 1
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMessageService.java
  17. 75 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TempLittleArtistTrainingCampService.java
  18. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TempLittleArtistTrainingCampUserRelationService.java
  19. 57 37
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java
  20. 98 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/LiveGoodsMapperServiceImpl.java
  21. 52 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/LiveGoodsServiceImpl.java
  22. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java
  23. 207 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TempLittleArtistTrainingCampServiceImpl.java
  24. 28 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TempLittleArtistTrainingCampUserRelationServiceImpl.java
  25. 129 0
      mec-biz/src/main/resources/config/mybatis/LiveGoodsMapper.xml
  26. 106 0
      mec-biz/src/main/resources/config/mybatis/LiveGoodsMapperMapper.xml
  27. 100 0
      mec-biz/src/main/resources/config/mybatis/TempLittleArtistTrainingCampMapper.xml
  28. 28 0
      mec-biz/src/main/resources/config/mybatis/TempLittleArtistTrainingCampUserRelationMapper.xml
  29. 57 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImRoomMessage.java
  30. 4 0
      mec-common/common-core/src/main/java/com/ym/mec/common/page/WrapperUtil.java
  31. 107 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/ImSendGroupMessageController.java
  32. 48 0
      mec-web/src/main/java/com/ym/mec/web/controller/LiveGoodsController.java
  33. 31 0
      mec-web/src/main/java/com/ym/mec/web/controller/LiveGoodsMapperController.java
  34. 94 0
      mec-web/src/main/java/com/ym/mec/web/controller/TempLittleArtistTrainingCampController.java

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LiveGoodsDao.java

@@ -0,0 +1,9 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.biz.dal.entity.LiveGoods;
+
+public interface LiveGoodsDao extends BaseDAO<Integer, LiveGoods> {
+
+	
+}

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LiveGoodsMapperDao.java

@@ -0,0 +1,20 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.dto.LiveGoodsMapperDto;
+import com.ym.mec.biz.dal.entity.LiveGoods;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.biz.dal.entity.LiveGoodsMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+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);
+
+    LiveGoodsMapper findByLiveIdAndGoodsId(@Param("liveId") String liveId, @Param("liveGoodsId") Integer liveGoodsId);
+
+    List<LiveGoodsMapperDto> getLiveGoodsList(@Param("liveId") String liveId);
+}

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

@@ -0,0 +1,30 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCamp;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 小小艺术家训练营活动(TempLittleArtistTrainingCamp)表数据库访问层
+ *
+ * @author hgw
+ * @since 2022-05-17 20:56:22
+ */
+public interface TempLittleArtistTrainingCampDao extends BaseMapper<TempLittleArtistTrainingCamp> {
+
+    int insertBatch(@Param("entities") List<TempLittleArtistTrainingCamp> entities);
+
+    <T> IPage<T> queryUserTrainingTime(Page<T> page, @Param("param") Map<String, Object> param);
+
+    <T> List<T> queryUserTrainingTime(@Param("param") Map<String, Object> param);
+
+    List<Integer> queryAllUserId();
+
+    <T> IPage<T> queryCampUser(Page<T> page, @Param("param") Map<String, Object> param);
+}
+

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TempLittleArtistTrainingCampUserRelationDao.java

@@ -0,0 +1,20 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCampUserRelation;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 训练营与学生关系表(TempLittleArtistTrainingCampUserRelation)表数据库访问层
+ *
+ * @author hgw
+ * @since 2022-05-18 15:48:00
+ */
+public interface TempLittleArtistTrainingCampUserRelationDao extends BaseMapper<TempLittleArtistTrainingCampUserRelation> {
+
+    int insertBatch(@Param("entities") List<TempLittleArtistTrainingCampUserRelation> entities);
+
+}
+

+ 139 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LiveGoodsMapperDto.java

@@ -0,0 +1,139 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+public class LiveGoodsMapperDto {
+    @ApiModelProperty(value = "商品编号",required = false)
+    private Integer id;
+
+    @ApiModelProperty(value = "商品名称",required = true)
+    private String name;
+
+    @ApiModelProperty(value = "展示图片的地址",required = true)
+    private String image;
+
+    @ApiModelProperty(value = "库存",required = true)
+    private Integer stockCount;
+
+    @ApiModelProperty(value = "销量",required = false)
+    private Integer sellCount = 0;
+
+    @ApiModelProperty(value = "现价",required = true)
+    private java.math.BigDecimal currentPrice;
+
+    @ApiModelProperty(value = "原价",required = true)
+    private java.math.BigDecimal originalPrice;
+
+    @ApiModelProperty(value = "页面简介",required = false)
+    private String brief;
+
+    @ApiModelProperty(value = "商品的详细描述",required = false)
+    private String desc;
+
+    @ApiModelProperty(value = "备注",required = false)
+    private String memo;
+
+    @ApiModelProperty(value = "状态(1,上下架  0,下架)",required = false)
+    private Boolean status = false;
+
+    @ApiModelProperty(value = "直播间销售价",required = false)
+    private BigDecimal livePrice;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getImage() {
+        return image;
+    }
+
+    public void setImage(String image) {
+        this.image = image;
+    }
+
+    public Integer getStockCount() {
+        return stockCount;
+    }
+
+    public void setStockCount(Integer stockCount) {
+        this.stockCount = stockCount;
+    }
+
+    public Integer getSellCount() {
+        return sellCount;
+    }
+
+    public void setSellCount(Integer sellCount) {
+        this.sellCount = sellCount;
+    }
+
+    public BigDecimal getCurrentPrice() {
+        return currentPrice;
+    }
+
+    public void setCurrentPrice(BigDecimal currentPrice) {
+        this.currentPrice = currentPrice;
+    }
+
+    public BigDecimal getOriginalPrice() {
+        return originalPrice;
+    }
+
+    public void setOriginalPrice(BigDecimal originalPrice) {
+        this.originalPrice = originalPrice;
+    }
+
+    public String getBrief() {
+        return brief;
+    }
+
+    public void setBrief(String brief) {
+        this.brief = brief;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+    public String getMemo() {
+        return memo;
+    }
+
+    public void setMemo(String memo) {
+        this.memo = memo;
+    }
+
+    public Boolean getStatus() {
+        return status;
+    }
+
+    public void setStatus(Boolean status) {
+        this.status = status;
+    }
+
+    public BigDecimal getLivePrice() {
+        return livePrice;
+    }
+
+    public void setLivePrice(BigDecimal livePrice) {
+        this.livePrice = livePrice;
+    }
+}

+ 93 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TempLittleArtistTrainingCampDto.java

@@ -0,0 +1,93 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+
+public class TempLittleArtistTrainingCampDto implements Serializable {
+
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @ApiModelProperty(value = "活动名称")
+    private String name;
+
+    @NotNull(message = "报名开始日期不能为空")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @ApiModelProperty(value = "申请报名登记开始日期")
+    private Date applyStartDate;
+
+    @NotNull(message = "报名结束日期不能为空")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @ApiModelProperty(value = "申请报名登记结束日期")
+    private Date applyEndDate;
+
+    @NotNull(message = "训练开始日期不能为空")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @ApiModelProperty(value = "训练开始日期")
+    private Date trainStartDate;
+
+    @NotNull(message = "训练结束日期不能为空")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @ApiModelProperty(value = "训练结束日期")
+    private Date trainEndDate;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Date getApplyStartDate() {
+        return applyStartDate;
+    }
+
+    public void setApplyStartDate(Date applyStartDate) {
+        this.applyStartDate = applyStartDate;
+    }
+
+    public Date getApplyEndDate() {
+        return applyEndDate;
+    }
+
+    public void setApplyEndDate(Date applyEndDate) {
+        this.applyEndDate = applyEndDate;
+    }
+
+    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;
+    }
+}

+ 266 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/LiveGoods.java

@@ -0,0 +1,266 @@
+package com.ym.mec.biz.dal.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 对应数据库表(live_goods):
+ */
+public class LiveGoods {
+
+	@ApiModelProperty(value = "商品编号",required = false)
+	private Integer id;
+	
+	@ApiModelProperty(value = "产品分类",required = false)
+	private Integer goodsCategoryId;
+	
+	@ApiModelProperty(value = "商品货号",required = false)
+	private String sn;
+	
+	@ApiModelProperty(value = "商品名称",required = true)
+	@NotBlank(message = "商品名称不可为空")
+	private String name;
+	
+	@ApiModelProperty(value = "品牌",required = false)
+	private String brand;
+	
+	@ApiModelProperty(value = "规格",required = false)
+	private String specification;
+	
+	@ApiModelProperty(value = "展示图片的地址",required = true)
+	@NotBlank(message = "图片地址不可为空")
+	private String image;
+	
+	@ApiModelProperty(value = "库存",required = true)
+	@NotNull(message = "库存不可为空")
+	private Integer stockCount;
+	
+	@ApiModelProperty(value = "总销量数",required = false)
+	private Integer sellCount = 0;
+	
+	@ApiModelProperty(value = "现价",required = true)
+	@NotNull(message = "现价不可为空")
+	private java.math.BigDecimal currentPrice;
+	
+	@ApiModelProperty(value = "原价",required = true)
+	@NotNull(message = "原价不可为空")
+	private java.math.BigDecimal originalPrice;
+	
+	@ApiModelProperty(value = "页面简介",required = false)
+	private String brief;
+	
+	@ApiModelProperty(value = "商品的详细描述",required = false)
+	private String desc;
+	
+	@ApiModelProperty(value = "是否是新品(1,是  0,否)",required = false)
+	private Boolean newFlag = false;
+	
+	@ApiModelProperty(value = "是否置顶(1,置顶   0,不置顶)",required = false)
+	private Boolean topFlag = false;
+	
+	@ApiModelProperty(value = "状态(1,上下架  0,下架)",required = false)
+	private Boolean status = false;
+	
+	@ApiModelProperty(value = "备注",required = false)
+	private String memo;
+	
+	@ApiModelProperty(value = "发布时间",required = false)
+	private java.util.Date publishTime;
+	
+	@ApiModelProperty(value = "创建时间",required = false)
+	private java.util.Date createTime;
+	
+	@ApiModelProperty(value = "修改时间",required = false)
+	private java.util.Date updateTime;
+	
+	@ApiModelProperty(value = "机构",required = false)
+	private Integer tenantId;
+	
+	@ApiModelProperty(value = "附件商品列表编号(用逗号分开)",required = false)
+	private String complementGoodsIdList;
+
+	public Boolean getNewFlag() {
+		return newFlag;
+	}
+
+	public void setNewFlag(Boolean newFlag) {
+		this.newFlag = newFlag;
+	}
+
+	public Boolean getTopFlag() {
+		return topFlag;
+	}
+
+	public void setTopFlag(Boolean topFlag) {
+		this.topFlag = topFlag;
+	}
+
+	public Boolean getStatus() {
+		return status;
+	}
+
+	public void setStatus(Boolean status) {
+		this.status = status;
+	}
+
+	public void setId(Integer id){
+		this.id = id;
+	}
+	
+	public Integer getId(){
+		return this.id;
+	}
+			
+	public void setGoodsCategoryId(Integer goodsCategoryId){
+		this.goodsCategoryId = goodsCategoryId;
+	}
+	
+	public Integer getGoodsCategoryId(){
+		return this.goodsCategoryId;
+	}
+			
+	public void setSn(String sn){
+		this.sn = sn;
+	}
+	
+	public String getSn(){
+		return this.sn;
+	}
+			
+	public void setName(String name){
+		this.name = name;
+	}
+	
+	public String getName(){
+		return this.name;
+	}
+			
+	public void setBrand(String brand){
+		this.brand = brand;
+	}
+	
+	public String getBrand(){
+		return this.brand;
+	}
+			
+	public void setSpecification(String specification){
+		this.specification = specification;
+	}
+	
+	public String getSpecification(){
+		return this.specification;
+	}
+			
+	public void setImage(String image){
+		this.image = image;
+	}
+	
+	public String getImage(){
+		return this.image;
+	}
+			
+	public void setStockCount(Integer stockCount){
+		this.stockCount = stockCount;
+	}
+	
+	public Integer getStockCount(){
+		return this.stockCount;
+	}
+			
+	public void setSellCount(Integer sellCount){
+		this.sellCount = sellCount;
+	}
+	
+	public Integer getSellCount(){
+		return this.sellCount;
+	}
+			
+	public void setCurrentPrice(java.math.BigDecimal currentPrice){
+		this.currentPrice = currentPrice;
+	}
+	
+	public java.math.BigDecimal getCurrentPrice(){
+		return this.currentPrice;
+	}
+			
+	public void setOriginalPrice(java.math.BigDecimal originalPrice){
+		this.originalPrice = originalPrice;
+	}
+	
+	public java.math.BigDecimal getOriginalPrice(){
+		return this.originalPrice;
+	}
+			
+	public void setBrief(String brief){
+		this.brief = brief;
+	}
+	
+	public String getBrief(){
+		return this.brief;
+	}
+			
+	public void setDesc(String desc){
+		this.desc = desc;
+	}
+	
+	public String getDesc(){
+		return this.desc;
+	}
+
+	public void setMemo(String memo){
+		this.memo = memo;
+	}
+	
+	public String getMemo(){
+		return this.memo;
+	}
+			
+	public void setPublishTime(java.util.Date publishTime){
+		this.publishTime = publishTime;
+	}
+	
+	public java.util.Date getPublishTime(){
+		return this.publishTime;
+	}
+			
+	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;
+	}
+			
+	public void setTenantId(Integer tenantId){
+		this.tenantId = tenantId;
+	}
+	
+	public Integer getTenantId(){
+		return this.tenantId;
+	}
+			
+	public void setComplementGoodsIdList(String complementGoodsIdList){
+		this.complementGoodsIdList = complementGoodsIdList;
+	}
+	
+	public String getComplementGoodsIdList(){
+		return this.complementGoodsIdList;
+	}
+			
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 103 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/LiveGoodsMapper.java

@@ -0,0 +1,103 @@
+package com.ym.mec.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(live_goods_mapper):
+ */
+public class LiveGoodsMapper {
+
+	/** 主键 */
+	private Integer id;
+	
+	/** 商品编号 */
+	private Integer goodsId;
+	
+	/** 直播间编号 */
+	private String liveId;
+	
+	/** 销量 */
+	private Integer sellCount;
+	
+	/** 直播间销售价 */
+	private java.math.BigDecimal livePrice;
+	
+	/** 状态(1,上架  0,下架) */
+	private Boolean status = false;
+	
+	/** 创建时间 */
+	private java.util.Date createTime;
+	
+	/** 修改时间 */
+	private java.util.Date updateTime;
+	
+	public void setId(Integer id){
+		this.id = id;
+	}
+	
+	public Integer getId(){
+		return this.id;
+	}
+			
+	public void setGoodsId(Integer goodsId){
+		this.goodsId = goodsId;
+	}
+	
+	public Integer getGoodsId(){
+		return this.goodsId;
+	}
+			
+	public void setLiveId(String liveId){
+		this.liveId = liveId;
+	}
+	
+	public String getLiveId(){
+		return this.liveId;
+	}
+			
+	public void setSellCount(Integer sellCount){
+		this.sellCount = sellCount;
+	}
+	
+	public Integer getSellCount(){
+		return this.sellCount;
+	}
+			
+	public void setLivePrice(java.math.BigDecimal livePrice){
+		this.livePrice = livePrice;
+	}
+	
+	public java.math.BigDecimal getLivePrice(){
+		return this.livePrice;
+	}
+
+	public Boolean getStatus() {
+		return status;
+	}
+
+	public void setStatus(Boolean status) {
+		this.status = status;
+	}
+
+	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);
+	}
+
+}

+ 203 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TempLittleArtistTrainingCamp.java

@@ -0,0 +1,203 @@
+package com.ym.mec.biz.dal.entity;
+
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+
+/**
+ * 小小艺术家训练营活动(TempLittleArtistTrainingCamp)表实体类
+ *
+ * @author hgw
+ * @since 2022-05-17 20:56:22
+ */
+@ApiModel(value = "temp_little_artist_training_camp-小小艺术家训练营活动")
+public class TempLittleArtistTrainingCamp implements Serializable {
+    //筹备中
+    public static final String READY = "READY";
+    //报名中
+    public static final String APPLY = "APPLY";
+    //未开始
+    public static final String NOT_START = "NOT_START";
+    //进行中
+    public static final String ING = "ING";
+    //已结束
+    public static final String END = "END";
+
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @TableField("name_")
+    @ApiModelProperty(value = "活动名称")
+    private String name;
+
+    @TableField("num_")
+    @ApiModelProperty(value = "报名人数")
+    private Integer num;
+
+    @TableField("apply_start_date_")
+    @ApiModelProperty(value = "申请报名登记开始日期")
+    private Date applyStartDate;
+
+    @TableField("apply_end_date_")
+    @ApiModelProperty(value = "申请报名登记结束日期")
+    private Date applyEndDate;
+
+    @TableField("train_start_date_")
+    @ApiModelProperty(value = "训练开始日期")
+    private Date trainStartDate;
+
+    @TableField("train_end_date_")
+    @ApiModelProperty(value = "训练结束日期")
+    private Date trainEndDate;
+
+    @TableField("state_")
+    @ApiModelProperty(value = "筹备中 READY,报名中 APPLY,未开始 NOT_START,进行中 ING,已结束 END")
+    private String state;
+
+    @TableField("im_group_ids_")
+    @ApiModelProperty(value = "聊天群组id多个用逗号隔开")
+    private String imGroupIds;
+
+    @TableField("del_flag_")
+    @ApiModelProperty(value = "删除标识 0未删除 1已删除' ")
+    private Integer delFlag;
+
+    @TableField("create_by_")
+    @ApiModelProperty(value = "创建人")
+    private Integer createBy;
+
+    @TableField("create_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @TableField("update_by_")
+    @ApiModelProperty(value = "修改人")
+    private Integer updateBy;
+
+    @TableField("update_time_")
+    @ApiModelProperty(value = "修改时间")
+    private Date updateTime;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public Date getApplyStartDate() {
+        return applyStartDate;
+    }
+
+    public void setApplyStartDate(Date applyStartDate) {
+        this.applyStartDate = applyStartDate;
+    }
+
+    public Date getApplyEndDate() {
+        return applyEndDate;
+    }
+
+    public void setApplyEndDate(Date applyEndDate) {
+        this.applyEndDate = applyEndDate;
+    }
+
+    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 String getState() {
+        return state;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    public String getImGroupIds() {
+        return imGroupIds;
+    }
+
+    public void setImGroupIds(String imGroupIds) {
+        this.imGroupIds = imGroupIds;
+    }
+
+    public Integer getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(Integer delFlag) {
+        this.delFlag = delFlag;
+    }
+
+    public Integer getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(Integer createBy) {
+        this.createBy = createBy;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Integer getUpdateBy() {
+        return updateBy;
+    }
+
+    public void setUpdateBy(Integer updateBy) {
+        this.updateBy = updateBy;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+}
+

+ 100 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TempLittleArtistTrainingCampUserRelation.java

@@ -0,0 +1,100 @@
+package com.ym.mec.biz.dal.entity;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 训练营与学生关系表(TempLittleArtistTrainingCampUserRelation)表实体类
+ *
+ * @author hgw
+ * @since 2022-05-18 15:48:00
+ */
+@ApiModel(value = "temp_little_artist_training_camp_user_relation-训练营与学生关系表")
+public class TempLittleArtistTrainingCampUserRelation implements Serializable {
+
+    //已报名 APPLY
+    public static final String APPLY = "APPLY";
+    //未报名NOT_APPLY
+    public static final String NOT_APPLY = "NOT_APPLY";
+
+    @TableId(value = "id_", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @TableField("activity_id_")
+    @ApiModelProperty(value = "训练营id")
+    private Integer activityId;
+
+    @TableField("user_id_")
+    @ApiModelProperty(value = "用户id")
+    private Integer userId;
+
+    @TableField("im_group_id_")
+    @ApiModelProperty(value = "im群id")
+    private Integer imGroupId;
+
+    @TableField("state_")
+    @ApiModelProperty(value = "状态:未报名NOT_APPLY ,已报名 APPLY")
+    private String state;
+
+    @TableField("create_time_")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getActivityId() {
+        return activityId;
+    }
+
+    public void setActivityId(Integer activityId) {
+        this.activityId = activityId;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getImGroupId() {
+        return imGroupId;
+    }
+
+    public void setImGroupId(Integer imGroupId) {
+        this.imGroupId = imGroupId;
+    }
+
+    public String getState() {
+        return state;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+}
+

+ 65 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/TempCampUserVo.java

@@ -0,0 +1,65 @@
+package com.ym.mec.biz.dal.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @author hgw
+ * Created by 2022-03-02
+ */
+@ApiModel(value = "分页查询机构信息")
+public class TempCampUserVo implements Serializable {
+
+    @ApiModelProperty(value = "用户id")
+    private Integer id;
+    @ApiModelProperty(value = "用户名称")
+    private String username;
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+    @ApiModelProperty(value = "状态:未报名NOT_APPLY ,已报名 APPLY")
+    private String state;
+    @ApiModelProperty(value = "训练营名称")
+    private String campName;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getState() {
+        return state;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    public String getCampName() {
+        return campName;
+    }
+
+    public void setCampName(String campName) {
+        this.campName = campName;
+    }
+}

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

@@ -0,0 +1,58 @@
+package com.ym.mec.biz.dal.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class TempUserTrainingTimeDetailVo implements Serializable {
+
+    @ApiModelProperty(value = "用户id")
+    private Integer userId;
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd", iso = DateTimeFormat.ISO.DATE)
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @ApiModelProperty(value = "训练日期")
+    private Date trainingDate;
+
+    @ApiModelProperty(value = "训练时长/秒-保留2位")
+    private BigDecimal playTime;
+
+    @ApiModelProperty(value = "是否完成训练  0-未完成 1-已完成")
+    private Integer isFinish;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Date getTrainingDate() {
+        return trainingDate;
+    }
+
+    public void setTrainingDate(Date trainingDate) {
+        this.trainingDate = trainingDate;
+    }
+
+    public BigDecimal getPlayTime() {
+        return playTime;
+    }
+
+    public void setPlayTime(BigDecimal playTime) {
+        this.playTime = playTime;
+    }
+
+    public Integer getIsFinish() {
+        return isFinish;
+    }
+
+    public void setIsFinish(Integer isFinish) {
+        this.isFinish = isFinish;
+    }
+}

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/TempUserTrainingTimeVo.java

@@ -0,0 +1,7 @@
+package com.ym.mec.biz.dal.vo;
+
+import java.io.Serializable;
+
+public class TempUserTrainingTimeVo implements Serializable {
+
+}

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/LiveGoodsMapperService.java

@@ -0,0 +1,16 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.LiveGoodsMapper;
+import com.ym.mec.common.service.BaseService;
+
+public interface LiveGoodsMapperService extends BaseService<Integer, LiveGoodsMapper> {
+
+    void add(LiveGoodsMapper liveGoodsMapper);
+
+    void downGoods(Integer liveGoodsId);
+
+    void downGoods(Integer liveGoodsId, String liveId);
+
+    void upGoods(Integer liveGoodsId, String liveId);
+
+}

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

@@ -0,0 +1,11 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.LiveGoods;
+import com.ym.mec.common.service.BaseService;
+
+public interface LiveGoodsService extends BaseService<Integer, LiveGoods> {
+
+    void updateLiveGoods(LiveGoods liveGoods);
+
+    void updateStatus(Integer liveGoodsId, Boolean status);
+}

+ 9 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/SysMessageService.java

@@ -50,13 +50,21 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 	void batchSendImGroupMessage(MessageTypeEnum messageType,String senderId,String extra, String[] targetIds,String url, Object... args);
 
 	/**
-	 * 发送自定义消息
+	 * 发送文本消息
 	 * @param senderId
 	 * @param messageContent
 	 * @return
 	 */
 	void batchSendImGroupMessage(String messageContent,String senderId,String extra, String[] targetIds);
 
+	/**
+	 * 发送自定义文本消息
+	 * @param senderId
+	 * @param messageContent
+	 * @return
+	 */
+	void batchSendImGroupMessage(String messageContent,String senderId,String extra, String[] targetIds,String objectName);
+
 
 	/**
 	* @description: 发送图片消息

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

@@ -0,0 +1,75 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.dao.TempLittleArtistTrainingCampDao;
+import com.ym.mec.biz.dal.dto.TempLittleArtistTrainingCampDto;
+import com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCamp;
+import com.ym.mec.biz.dal.vo.TempCampUserVo;
+import com.ym.mec.biz.dal.vo.TempUserTrainingTimeDetailVo;
+import com.ym.mec.common.page.PageInfo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 小小艺术家训练营活动(TempLittleArtistTrainingCamp)表服务接口
+ *
+ * @author hgw
+ * @since 2022-05-17 20:56:22
+ */
+public interface TempLittleArtistTrainingCampService extends IService<TempLittleArtistTrainingCamp> {
+
+    TempLittleArtistTrainingCampDao getDao();
+
+    /**
+     * 新建训练营
+     */
+    void add(TempLittleArtistTrainingCampDto dto);
+
+    /**
+     * 修改训练营
+     */
+    void update(TempLittleArtistTrainingCampDto dto);
+
+    /**
+     * 删除训练营
+     */
+    void delete(Integer id);
+
+    /**
+     * 分页查询-训练营列表
+     *
+     * @param param 条件
+     *              <p> - row 条数
+     *              <p> - page 页数
+     *              <p> - name 训练营标题-模糊搜索
+     *              <p> - state 筹备中 READY,报名中 APPLY,未开始 NOT_START,进行中 ING,已结束 END
+     *              <p> - applyStartDate 申请报名登记开始日期-年月日
+     *              <p> - applyEndDate 申请报名登记结束日期-年月日
+     *              <p> - trainStartDate 训练开始日期-年月日
+     *              <p> - trainEndDate 训练结束日期-年月日
+     */
+    PageInfo<TempLittleArtistTrainingCamp> queryPageTrainingCamp(Map<String, Object> param);
+
+    /**
+     * 参与名单
+     *
+     * @param param 条件
+     *              <p> - row 条数
+     *              <p> - page 页数
+     *              <p> - state 状态:未报名NOT_APPLY ,已报名 APPLY
+     *              <p> - search 学员姓名/手机号/编号
+     */
+    PageInfo<TempCampUserVo> queryPageTrainingCampUser(Map<String, Object> param);
+
+    /**
+     * 查询指定学生-训练营每日训练时长
+     *
+     * @param param 参数
+     *              <p> - userId 用户id
+     */
+    List<TempUserTrainingTimeDetailVo> queryUserTrainingTime(Map<String, Object> param);
+
+}
+
+

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

@@ -0,0 +1,17 @@
+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;
+
+/**
+ * 训练营与学生关系表(TempLittleArtistTrainingCampUserRelation)表服务接口
+ *
+ * @author hgw
+ * @since 2022-05-18 15:48:00
+ */
+public interface TempLittleArtistTrainingCampUserRelationService extends IService<TempLittleArtistTrainingCampUserRelation> {
+
+    TempLittleArtistTrainingCampUserRelationDao getDao();
+}
+

+ 57 - 37
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -546,25 +546,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             }
             //将最新的时间写入缓存
             userStateTimeCache.set(userStateTime, 5L, TimeUnit.MINUTES);
-            //查询主讲人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;
-                }
-                //主讲人退出房间关闭录像
-                closeLive(speakerInfo);
-                speakerInfo.setExitRoomTime(now);
-                log.info("opsRoom>>>> exit speakerCache {}", JSONObject.toJSONString(speakerInfo));
-                speakerCache.set(speakerInfo);
+            //查询userId是不是主讲人 ,如果是主讲人则返回
+            if (isSpeaker(user, now, userid)) {
                 return;
             }
-            //未查询到主讲人信息,观看者只接受退出消息 status=0 是进入房间
+            //这里开始只处理观看者的数据,观看者只接受退出消息 status=0 是进入房间
             if (user.getStatus().equals("0")) {
                 return;
             }
@@ -582,32 +568,42 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             if (!roomTotalUser.isExists() && !roomTotalUser.containsKey(userId)) {
                 return;
             }
-            //查询用户数据
+            //查询用户数据
             RoomUserInfoVo userInfo = roomTotalUser.get(userId);
-            //查询在线人员列表
-            RMap<Integer, BaseRoomUserVo> onlineUserInfo = getOnlineUserCache(roomUid);
-            //获取当前用户是否在房间状态 true在 false不在
-            boolean userOnline = onlineUserInfo.isExists() && onlineUserInfo.containsKey(userId);
-            //用户是在房间的状态 并且 突然离线 - 那么融云会发送用户离线消息-此刻就发送退出房间消息给主讲人
-            if (userOnline && user.getStatus().equals("1")) {
-                ImRoomMessage message = new ImRoomMessage();
-                message.setFromUserId(userId.toString());
-                message.setToChatroomId(roomUid);
-                message.setObjectName(ImRoomMessage.LOOKER_LOGIN_OUT);
-                try {
-                    imFeignService.publishRoomMsg(message);
-                } catch (Exception e) {
-                    log.error("opsRoom>>>>  looker error {}", e.getMessage());
-                    log.error("opsRoom>>>>  looker error sendMessage {} : LOOKER_LOGIN_OUT : {}", message, JSONObject.toJSONString(userInfo));
-                }
-                log.info("opsRoom>>>> looker LOOKER_LOGIN_OUT : {}", JSONObject.toJSONString(userInfo));
-            }
-            //只有在主播开播后用户才有观看时间,才需要计算当前用户观看时长
+            //如果有动态观看时间则证明主播开播过,需要计算当前用户观看时长
             if (Objects.nonNull(userInfo.getDynamicLookTime())) {
                 userInfo.setTotalViewTime(getLookMinutes(userInfo.getDynamicLookTime(), userInfo.getTotalViewTime()));
                 userInfo.setDynamicLookTime(null);
             }
             roomTotalUser.fastPut(userId, userInfo);
+
+            //查询在线人员列表
+            RMap<Integer, BaseRoomUserVo> 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);
             log.info("opsRoom>>>> looker userInfo: {}", JSONObject.toJSONString(userInfo));
@@ -615,6 +611,30 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     }
 
     /**
+     * 查询userId是不是主讲人
+     */
+    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));
+            speakerCache.set(speakerInfo);
+            return true;
+        }
+        return false;
+    }
+
+    /**
      * 主讲人登录专用
      *
      * @param roomUid

+ 98 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/LiveGoodsMapperServiceImpl.java

@@ -0,0 +1,98 @@
+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.entity.ImLiveBroadcastRoom;
+import com.ym.mec.biz.dal.entity.LiveGoodsMapper;
+import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
+import com.ym.mec.biz.service.LiveGoodsMapperService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.entity.ImRoomMessage;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.im.ImFeignService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class LiveGoodsMapperServiceImpl extends BaseServiceImpl<Integer, LiveGoodsMapper>  implements LiveGoodsMapperService {
+	
+	@Autowired
+	private LiveGoodsMapperDao liveGoodsMapperDao;
+	@Autowired
+	private ImFeignService imFeignService;
+	@Autowired
+	private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
+
+	@Override
+	public BaseDAO<Integer, LiveGoodsMapper> getDAO() {
+		return liveGoodsMapperDao;
+	}
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public void add(LiveGoodsMapper liveGoodsMapper) {
+		liveGoodsMapperDao.insert(liveGoodsMapper);
+		//通知上架
+		if (liveGoodsMapper.getStatus()) this.upGoods(liveGoodsMapper.getGoodsId(),liveGoodsMapper.getLiveId());
+    }
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void upGoods(Integer liveGoodsId, String liveId) {
+		liveGoodsMapperDao.updateStatus(liveId,liveGoodsId,true);
+		ImLiveBroadcastRoom imLiveBroadcastRoom = Optional
+				.of(imLiveBroadcastRoomService.getBaseMapper().selectOne(new QueryWrapper<ImLiveBroadcastRoom>().eq("room_uid_",liveId))).
+				orElseThrow(() -> new RuntimeException("直播间不存在"));
+		//通知直播间商品上架
+		this.publishRoomMsg(imLiveBroadcastRoom,ImRoomMessage.LIVE_GOODS_UP);
+	}
+
+	private void publishRoomMsg(ImLiveBroadcastRoom imLiveBroadcastRoom,String msgType) {
+		ImRoomMessage message = new ImRoomMessage();
+		message.setIsIncludeSender(1);
+		message.setObjectName(msgType);
+		message.setToChatroomId(imLiveBroadcastRoom.getRoomUid());
+		message.setFromUserId(imLiveBroadcastRoom.getSpeakerId().toString());
+		message.setContent(liveGoodsMapperDao.getLiveGoodsList(imLiveBroadcastRoom.getRoomUid()));
+		imFeignService.publishRoomMsg(message);
+	}
+
+	@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))).
+				orElseThrow(() -> new RuntimeException("直播间不存在"));
+		LiveGoodsMapper liveGoodsMapper = Optional.of(liveGoodsMapperDao.findByLiveIdAndGoodsId(liveId, liveGoodsId)).
+				orElseThrow(() -> new RuntimeException("直播间不存在该商品"));
+		if(!liveGoodsMapper.getStatus()){
+			throw new BizException("该商品已下架");
+		}
+		//下架直播间商品
+		liveGoodsMapperDao.updateStatus(liveId,liveGoodsId,false);
+		//通知直播间,商品下架
+		this.publishRoomMsg(imLiveBroadcastRoom,ImRoomMessage.LIVE_GOODS_DOWN);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void downGoods(Integer liveGoodsId){
+		List<LiveGoodsMapper> liveGoodsMappers = liveGoodsMapperDao.findByLiveGoodsIdAndStatus(liveGoodsId,true);
+		if(liveGoodsMappers.size()>0){
+			//下架直播间商品
+			liveGoodsMapperDao.updateStatus(null,liveGoodsId,false);
+			//通知直播间,商品下架
+			for (LiveGoodsMapper liveGoodsMapper : liveGoodsMappers) {
+				ImLiveBroadcastRoom imLiveBroadcastRoom = Optional
+						.of(imLiveBroadcastRoomService.getBaseMapper().selectOne(new QueryWrapper<ImLiveBroadcastRoom>().eq("room_uid_",liveGoodsMapper.getLiveId()))).
+						orElseThrow(() -> new RuntimeException("直播间不存在"));
+				this.publishRoomMsg(imLiveBroadcastRoom,ImRoomMessage.LIVE_GOODS_DOWN);
+			}
+		}
+	}
+}

+ 52 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/LiveGoodsServiceImpl.java

@@ -0,0 +1,52 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.dao.LiveGoodsMapperDao;
+import com.ym.mec.biz.dal.entity.LiveGoodsMapper;
+import com.ym.mec.biz.service.LiveGoodsMapperService;
+import com.ym.mec.common.dal.BaseDAO;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.biz.dal.entity.LiveGoods;
+import com.ym.mec.biz.service.LiveGoodsService;
+import com.ym.mec.biz.dal.dao.LiveGoodsDao;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+@Service
+public class LiveGoodsServiceImpl extends BaseServiceImpl<Integer, LiveGoods>  implements LiveGoodsService {
+	
+	@Autowired
+	private LiveGoodsDao liveGoodsDao;
+	@Autowired
+	private LiveGoodsMapperService liveGoodsMapperService;
+
+	@Override
+	public BaseDAO<Integer, LiveGoods> getDAO() {
+		return liveGoodsDao;
+	}
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public void updateLiveGoods(LiveGoods liveGoods) {
+		Optional.of(liveGoodsDao.get(liveGoods.getId())).orElseThrow(() -> new RuntimeException("商品信息不存在"));
+		//下架直播间商品,并通知直播间
+		if (!liveGoods.getStatus()) liveGoodsMapperService.downGoods(liveGoods.getId());
+		//更新商品信息
+		liveGoodsDao.update(liveGoods);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void updateStatus(Integer liveGoodsId, Boolean status) {
+		LiveGoods liveGoods = Optional.of(liveGoodsDao.get(liveGoodsId)).
+				orElseThrow(() -> new RuntimeException("商品信息不存在"));
+		//下架直播间商品,并通知直播间
+		if (!status) liveGoodsMapperService.downGoods(liveGoodsId);
+		liveGoods.setStatus(status);
+		liveGoodsDao.update(liveGoods);
+	}
+}

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java

@@ -262,6 +262,14 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	}
 
 	@Override
+	public void batchSendImGroupMessage(String messageContent, String senderId,String extra, String[] targetIds,String objectName) {
+		ExecutorService executor = Executors.newCachedThreadPool();
+		CompletableFuture.runAsync(()->{
+			imFeignService.groupSend(getImGroupMessage(objectName,senderId,targetIds,messageContent,extra));
+		},executor);
+	}
+
+	@Override
 	public void batchSendImGroupMessage(String messageContent,String senderId,String extra,String imgUrl, String[] targetIds) {
 		ImMessageDto imMessageDto =
 				getImGroupMessage("RC:ImgMsg",senderId,targetIds,messageContent,extra);

+ 207 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TempLittleArtistTrainingCampServiceImpl.java

@@ -0,0 +1,207 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.TempLittleArtistTrainingCampDao;
+import com.ym.mec.biz.dal.dto.TempLittleArtistTrainingCampDto;
+import com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCamp;
+import com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCampUserRelation;
+import com.ym.mec.biz.dal.vo.TempCampUserVo;
+import com.ym.mec.biz.dal.vo.TempUserTrainingTimeDetailVo;
+import com.ym.mec.biz.service.TempLittleArtistTrainingCampService;
+import com.ym.mec.biz.service.TempLittleArtistTrainingCampUserRelationService;
+import com.ym.mec.common.exception.BizException;
+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 org.apache.commons.collections.CollectionUtils;
+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 java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 小小艺术家训练营活动(TempLittleArtistTrainingCamp)表服务实现类
+ *
+ * @author hgw
+ * @since 2022-05-17 20:56:23
+ */
+@Service("tempLittleArtistTrainingCampService")
+public class TempLittleArtistTrainingCampServiceImpl extends ServiceImpl<TempLittleArtistTrainingCampDao, TempLittleArtistTrainingCamp> implements TempLittleArtistTrainingCampService {
+
+    private final static Logger log = LoggerFactory.getLogger(TempLittleArtistTrainingCampServiceImpl.class);
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private TempLittleArtistTrainingCampUserRelationService tempLittleArtistTrainingCampUserRelationService;
+
+    @Override
+    public TempLittleArtistTrainingCampDao getDao() {
+        return this.baseMapper;
+    }
+
+    /**
+     * 新建训练营
+     */
+    @Override
+    public void add(TempLittleArtistTrainingCampDto dto) {
+        SysUser user = getUser();
+        TempLittleArtistTrainingCamp entity = new TempLittleArtistTrainingCamp();
+        BeanUtils.copyProperties(dto, entity);
+        entity.setState(TempLittleArtistTrainingCamp.READY);
+        entity.setCreateBy(user.getId());
+        entity.setCreateTime(new Date());
+        this.save(entity);
+    }
+
+    /**
+     * 修改训练营
+     */
+    @Override
+    public void update(TempLittleArtistTrainingCampDto dto) {
+        SysUser user = getUser();
+        TempLittleArtistTrainingCamp entity = Optional.ofNullable(dto.getId())
+                .map(this::getById)
+                .orElseThrow(() -> new BizException("训练营不存在"));
+        entity.setName(dto.getName());
+        entity.setApplyStartDate(dto.getApplyStartDate());
+        entity.setApplyEndDate(dto.getApplyEndDate());
+        entity.setTrainStartDate(dto.getTrainStartDate());
+        entity.setTrainEndDate(dto.getTrainEndDate());
+        entity.setState(TempLittleArtistTrainingCamp.READY);
+        entity.setUpdateBy(user.getId());
+        entity.setUpdateTime(new Date());
+        this.updateById(entity);
+    }
+
+    /**
+     * 删除训练营
+     */
+    @Override
+    public void delete(Integer id) {
+        TempLittleArtistTrainingCamp entity = Optional.ofNullable(id)
+                .map(this::getById)
+                .orElseThrow(() -> new BizException("训练营不存在"));
+        entity.setDelFlag(0);
+        this.updateById(entity);
+    }
+
+    /**
+     * 分页查询-训练营列表
+     *
+     * @param param 条件
+     *              <p> - row 条数
+     *              <p> - page 页数
+     *              <p> - name 训练营标题-模糊搜索
+     *              <p> - state 筹备中 READY,报名中 APPLY,未开始 NOT_START,进行中 ING,已结束 END
+     *              <p> - applyStartDate 申请报名登记开始日期
+     *              <p> - applyEndDate 申请报名登记结束日期
+     *              <p> - trainStartDate 训练开始日期
+     *              <p> - trainEndDate 训练结束日期
+     */
+    @Override
+    public PageInfo<TempLittleArtistTrainingCamp> queryPageTrainingCamp(Map<String, Object> param) {
+        Page<TempLittleArtistTrainingCamp> page = PageUtil.getPageInfo(param);
+        page.setAsc("apply_start_date_");
+        IPage<TempLittleArtistTrainingCamp> pageList = this.page(page, Wrappers.<TempLittleArtistTrainingCamp>lambdaQuery()
+                .eq(WrapperUtil.strParamIsNull(param, "name"), TempLittleArtistTrainingCamp::getName, WrapperUtil.toStr(param, "name"))
+                .eq(WrapperUtil.strParamIsNull(param, "state"), TempLittleArtistTrainingCamp::getState, WrapperUtil.toStr(param, "state"))
+                .ge(Objects.nonNull(param.get("applyStartDate")), TempLittleArtistTrainingCamp::getApplyStartDate, param.get("applyStartDate"))
+                .le(Objects.nonNull(param.get("applyEndDate")), TempLittleArtistTrainingCamp::getApplyEndDate, param.get("applyEndDate"))
+                .ge(Objects.nonNull(param.get("trainStartDate")), TempLittleArtistTrainingCamp::getTrainStartDate, param.get("trainStartDate"))
+                .le(Objects.nonNull(param.get("trainEndDate")), TempLittleArtistTrainingCamp::getTrainEndDate, param.get("trainEndDate")));
+        return PageUtil.pageInfo(pageList);
+    }
+
+    /**
+     * 参与名单
+     *
+     * @param param 条件
+     *              <p> - row 条数
+     *              <p> - page 页数
+     *              <p> - state 状态:未报名NOT_APPLY ,已报名 APPLY
+     *              <p> - search 学员姓名/手机号/编号
+     */
+    @Override
+    public PageInfo<TempCampUserVo> queryPageTrainingCampUser(Map<String, Object> param) {
+        Page<TempCampUserVo> pageInfo = PageUtil.getPageInfo(param);
+        pageInfo.setDesc("a.create_time_");
+        return PageUtil.pageInfo(baseMapper.queryCampUser(pageInfo, param));
+    }
+
+    /**
+     * 查询指定学生-训练营每日训练时长
+     *
+     * @param param 参数
+     *              <p> - userId 用户id
+     */
+    public List<TempUserTrainingTimeDetailVo> queryUserTrainingTime(Map<String, Object> param) {
+        Integer userId = WrapperUtil.toInt(param, "userId", "学员id不能为空");
+        //查询训练营的训练时间段
+        TempLittleArtistTrainingCampUserRelation campUser = tempLittleArtistTrainingCampUserRelationService.getOne(Wrappers.<TempLittleArtistTrainingCampUserRelation>lambdaQuery()
+                .eq(TempLittleArtistTrainingCampUserRelation::getUserId, userId));
+        TempLittleArtistTrainingCamp camp = this.getOne(Wrappers.<TempLittleArtistTrainingCamp>lambdaQuery()
+                .eq(TempLittleArtistTrainingCamp::getId, campUser.getActivityId())
+                .eq(TempLittleArtistTrainingCamp::getDelFlag, 0));
+        String startDateStr = DateUtil.dateToString(camp.getTrainStartDate());
+        String endDateStr = DateUtil.dateToString(camp.getTrainEndDate());
+
+        //生成训练时间集合
+        List<TempUserTrainingTimeDetailVo> resultList = new ArrayList<>();
+        LocalDate generateDate = LocalDate.parse(startDateStr);
+        boolean flag = true;
+        while (flag) {
+            if (generateDate.toString().equals(endDateStr)) {
+                flag = false;
+            }
+            TempUserTrainingTimeDetailVo tempUserTrainingTimeDetailVo = new TempUserTrainingTimeDetailVo();
+            tempUserTrainingTimeDetailVo.setUserId(userId);
+            tempUserTrainingTimeDetailVo.setTrainingDate(camp.getTrainStartDate());
+            tempUserTrainingTimeDetailVo.setPlayTime(BigDecimal.ZERO);
+            tempUserTrainingTimeDetailVo.setIsFinish(0);
+            resultList.add(tempUserTrainingTimeDetailVo);
+            generateDate = generateDate.plusDays(1);
+        }
+        //查询每日训练时长
+        param.put("startTime", startDateStr + " 00:00:00");
+        param.put("endTime", endDateStr + " 23:59:59");
+        List<TempUserTrainingTimeDetailVo> userTrainingTimeList = baseMapper.queryUserTrainingTime(param);
+        //拼接数据
+        if (CollectionUtils.isNotEmpty(userTrainingTimeList)) {
+            Map<String, BigDecimal> nowTrainingTime = userTrainingTimeList.stream()
+                    .collect(Collectors.toMap(k -> DateUtil.dateToString(k.getTrainingDate()), TempUserTrainingTimeDetailVo::getPlayTime));
+            resultList.forEach(vo -> {
+                String s = DateUtil.dateToString(vo.getTrainingDate());
+                BigDecimal t = nowTrainingTime.get(s);
+                if (Objects.nonNull(t)) {
+                    vo.setPlayTime(t);
+                    //大于1200秒
+                    if (t.intValue() > 1200) {
+                        vo.setIsFinish(1);
+                    }
+                }
+            });
+        }
+        return resultList;
+    }
+
+    private SysUser getUser() {
+        //修改机构基础信息
+        return Optional.ofNullable(sysUserFeignService.queryUserInfo())
+                .orElseThrow(() -> new BizException("用户信息获取失败,请刷新页面或者重新登录!"));
+    }
+
+
+}
+

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

@@ -0,0 +1,28 @@
+package com.ym.mec.biz.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ym.mec.biz.dal.dao.TempLittleArtistTrainingCampUserRelationDao;
+import com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCampUserRelation;
+import com.ym.mec.biz.service.TempLittleArtistTrainingCampUserRelationService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+/**
+ * 训练营与学生关系表(TempLittleArtistTrainingCampUserRelation)表服务实现类
+ *
+ * @author hgw
+ * @since 2022-05-18 15:48:00
+ */
+@Service("tempLittleArtistTrainingCampUserRelationService")
+public class TempLittleArtistTrainingCampUserRelationServiceImpl extends ServiceImpl<TempLittleArtistTrainingCampUserRelationDao, TempLittleArtistTrainingCampUserRelation> implements TempLittleArtistTrainingCampUserRelationService {
+
+    private final static Logger log = LoggerFactory.getLogger(TempLittleArtistTrainingCampUserRelationServiceImpl.class);
+
+    @Override
+    public TempLittleArtistTrainingCampUserRelationDao getDao() {
+        return this.baseMapper;
+    }
+
+}
+

+ 129 - 0
mec-biz/src/main/resources/config/mybatis/LiveGoodsMapper.xml

@@ -0,0 +1,129 @@
+<?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.LiveGoodsDao">
+	
+	<resultMap type="com.ym.mec.biz.dal.entity.LiveGoods" id="LiveGoods">
+		<result column="id_" property="id" />
+		<result column="goods_category_id_" property="goodsCategoryId" />
+		<result column="sn_" property="sn" />
+		<result column="name_" property="name" />
+		<result column="brand_" property="brand" />
+		<result column="specification_" property="specification" />
+		<result column="image_" property="image" />
+		<result column="stock_count_" property="stockCount" />
+		<result column="sell_count_" property="sellCount" />
+		<result column="current_price_" property="currentPrice" />
+		<result column="original_price_" property="originalPrice" />
+		<result column="brief_" property="brief" />
+		<result column="desc_" property="desc" />
+		<result column="new_flag_" property="newFlag" />
+		<result column="top_flag_" property="topFlag" />
+		<result column="status_" property="status" />
+		<result column="memo_" property="memo" />
+		<result column="publish_time_" property="publishTime" />
+		<result column="complement_goods_id_list_" property="complementGoodsIdList" />
+		<result column="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+		<result column="tenant_id_" property="tenantId" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="LiveGoods" >
+		SELECT * FROM live_goods WHERE id_ = #{id} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="LiveGoods">
+		SELECT * FROM live_goods ORDER BY id_
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.LiveGoods" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO live_goods (goods_category_id_,sn_,name_,brand_,specification_,image_,stock_count_,sell_count_,current_price_,
+		                        original_price_,brief_,desc_,new_flag_,top_flag_,status_,memo_,publish_time_,complement_goods_id_list_,
+		                        create_time_,update_time_,tenant_id_)
+		VALUES(#{id},#{goodsCategoryId},#{sn},#{name},#{brand},#{specification},#{image},#{stockCount},#{sellCount},#{currentPrice},
+		       #{originalPrice},#{brief},#{desc},#{newFlag},#{topFlag},#{status},#{memo},NOW(),#{complementGoodsIdList},
+		       NOW(),NOW(),#{tenantId})
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.LiveGoods">
+		UPDATE live_goods <set>
+		<if test="specification != null">
+		specification_ = #{specification},
+		</if>
+		<if test="status != null">
+		status_ = #{status},
+		</if>
+		<if test="topFlag != null">
+		top_flag_ = #{topFlag},
+		</if>
+		<if test="newFlag != null">
+		new_flag_ = #{newFlag},
+		</if>
+		<if test="sn != null">
+		sn_ = #{sn},
+		</if>
+		<if test="tenantId != null">
+		tenant_id_ = #{tenantId},
+		</if>
+		<if test="originalPrice != null">
+		original_price_ = #{originalPrice},
+		</if>
+		<if test="memo != null">
+		memo_ = #{memo},
+		</if>
+		<if test="name != null">
+		name_ = #{name},
+		</if>
+		<if test="complementGoodsIdList != null">
+		complement_goods_id_list_ = #{complementGoodsIdList},
+		</if>
+		<if test="stockCount != null">
+		stock_count_ = #{stockCount},
+		</if>
+		<if test="currentPrice != null">
+		current_price_ = #{currentPrice},
+		</if>
+		<if test="goodsCategoryId != null">
+		goods_category_id_ = #{goodsCategoryId},
+		</if>
+		<if test="brand != null">
+		brand_ = #{brand},
+		</if>
+		<if test="brief != null">
+		brief_ = #{brief},
+		</if>
+		<if test="sellCount != null">
+		sell_count_ = #{sellCount},
+		</if>
+		<if test="image != null">
+		image_ = #{image},
+		</if>
+		<if test="desc != null">
+		desc_ = #{desc},
+		</if>
+		update_time_ = NOW()
+	</set> WHERE id_ = #{id}
+	</update>
+	
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM live_goods WHERE id_ = #{id} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="LiveGoods" parameterType="map">
+		SELECT * FROM live_goods ORDER BY id_ <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM live_goods
+	</select>
+</mapper>

+ 106 - 0
mec-biz/src/main/resources/config/mybatis/LiveGoodsMapperMapper.xml

@@ -0,0 +1,106 @@
+<?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.LiveGoodsMapperDao">
+	
+	<resultMap type="com.ym.mec.biz.dal.entity.LiveGoodsMapper" id="LiveGoodsMapper">
+		<result column="id_" property="id" />
+		<result column="goods_id_" property="goodsId" />
+		<result column="live_id_" property="liveId" />
+		<result column="sell_count_" property="sellCount" />
+		<result column="live_price_" property="livePrice" />
+		<result column="status_" property="status" />
+		<result column="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="LiveGoodsMapper" >
+		SELECT * FROM live_goods_mapper WHERE id_ = #{id} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="LiveGoodsMapper">
+		SELECT * FROM live_goods_mapper ORDER BY id_
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.LiveGoodsMapper" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO live_goods_mapper (goods_id_,live_id_,sell_count_,live_price_,status_,create_time_,update_time_)
+		VALUES(#{goodsId},#{liveId},#{sellCount},#{livePrice},#{status},NOW(),NOW())
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.LiveGoodsMapper">
+		UPDATE live_goods_mapper <set>
+		<if test="status != null">
+		status_ = #{status},
+		</if>
+		<if test="liveId != null">
+		live_id_ = #{liveId},
+		</if>
+		<if test="livePrice != null">
+		live_price_ = #{livePrice},
+		</if>
+		<if test="sellCount != null">
+		sell_count_ = #{sellCount},
+		</if>
+		<if test="goodsId != null">
+		goods_id_ = #{goodsId},
+		</if>
+		update_time_ = NOW()
+	</set> WHERE id_ = #{id}
+	</update>
+	<update id="updateStatus">
+		UPDATE live_goods_mapper SET status_ = #{status},update_time_ = NOW()
+		WHERE id_ = #{liveGoodsId}
+		<if test="liveId != null and liveId != ''">
+		AND live_id_ = #{liveId}
+		</if>
+	</update>
+
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM live_goods_mapper WHERE id_ = #{id} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="LiveGoodsMapper" parameterType="map">
+		SELECT * FROM live_goods_mapper ORDER BY id_ <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM live_goods_mapper
+	</select>
+	<select id="findByLiveGoodsIdAndStatus" resultMap="LiveGoodsMapper">
+		SELECT * FROM live_goods_mapper WHERE goods_id_ = #{goodsId} AND status_ = #{status}
+	</select>
+	<select id="findByLiveIdAndGoodsId" resultMap="LiveGoodsMapper">
+		SELECT * FROM live_goods_mapper WHERE live_id_ = #{liveId} AND goods_id_ = #{goodsId}
+	</select>
+
+	<resultMap id="LiveGoodsMapperDto" type="com.ym.mec.biz.dal.dto.LiveGoodsMapperDto">
+		<result column="id_" property="id" />
+		<result column="image_" property="image" />
+		<result column="sell_count_" property="sellCount" />
+		<result column="live_price_" property="livePrice" />
+		<result column="status_" property="status" />
+		<result column="name_" property="name" />
+		<result column="original_price_" property="originalPrice" />
+		<result column="current_price_" property="currentPrice" />
+		<result column="brief_" property="brief" />
+		<result column="desc_" property="desc" />
+		<result column="memo_" property="memo" />
+	</resultMap>
+	<select id="getLiveGoodsList" resultMap="LiveGoodsMapperDto">
+		SELECT lg.id_,lg.image_,lgm.sell_count_,lgm.live_price_,
+		       lgm.status_,lg.name_,lg.original_price_,lg.current_price_,lg.brief_,lg.desc_,lg.memo_
+		FROM live_goods_mapper lgm
+		LEFT JOIN live_goods lg ON lgm.goods_id_ = lg.id_
+		WHERE lgm.live_id_ = #{liveId}
+	</select>
+</mapper>

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

@@ -0,0 +1,100 @@
+<?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.TempLittleArtistTrainingCampDao">
+    <resultMap id="BaseResultMap" type="com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCamp">
+        <id column="id_" jdbcType="INTEGER" property="id"/>
+        <result column="name_" jdbcType="VARCHAR" property="name"/>
+        <result column="num_" jdbcType="INTEGER" property="num"/>
+        <result column="apply_start_date_" jdbcType="TIMESTAMP" property="applyStartDate"/>
+        <result column="apply_end_date_" jdbcType="TIMESTAMP" property="applyEndDate"/>
+        <result column="train_start_date_" jdbcType="TIMESTAMP" property="trainStartDate"/>
+        <result column="train_end_date_" jdbcType="TIMESTAMP" property="trainEndDate"/>
+        <result column="state_" jdbcType="VARCHAR" property="state"/>
+        <result column="im_group_ids_" jdbcType="VARCHAR" property="imGroupIds"/>
+        <result column="del_flag_" jdbcType="INTEGER" property="delFlag"/>
+        <result column="create_by_" jdbcType="INTEGER" property="createBy"/>
+        <result column="create_time_" jdbcType="TIMESTAMP" property="createTime"/>
+        <result column="update_by_" jdbcType="INTEGER" property="updateBy"/>
+        <result column="update_time_" jdbcType="TIMESTAMP" property="updateTime"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id_
+        , name_, num_, apply_start_date_, apply_end_date_, train_start_date_, train_end_date_, state_, im_group_ids_, create_by_, create_time_, update_by_, update_time_
+    </sql>
+
+    <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
+            parameterType="com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCamp">
+        insert into temp_little_artist_training_camp(name_, num_, apply_start_date_, apply_end_date_, train_start_date_,
+        train_end_date_, state_, im_group_ids_, del_flag_,create_by_, create_time_, update_by_, update_time_)
+        values
+        <foreach collection="entities" item="entity" separator=",">
+            (#{entity.name}, #{entity.num}, #{entity.applyStartDate}, #{entity.applyEndDate}, #{entity.trainStartDate},
+            #{entity.trainEndDate}, #{entity.state}, #{entity.imGroupIds}, #{entity.delFlag},#{entity.createBy}, #{entity.createTime},
+            #{entity.updateBy}, #{entity.updateTime})
+        </foreach>
+    </insert>
+
+    <select id="queryUserTrainingTime" resultType="com.ym.mec.biz.dal.vo.TempUserTrainingTimeDetailVo" parameterType="java.util.Map">
+        SELECT
+        a.user_id_        AS userId,
+        a.create_time_ AS trainingDate,
+        sum(a.play_time_) AS playTime
+        FROM
+        ( SELECT
+              user_id_,
+              ifnull(play_time_, 0) AS play_time_,
+              date_format(create_time_, '%Y-%m-%d') AS create_time_
+        FROM sys_music_compare_record
+        <where>
+            <if test="param.startTime != null">
+                AND create_time_ &gt;= #{param.startTime}
+            </if>
+            <if test="param.endTime != null">
+                AND create_time_ &lt;= #{param.endTime}
+            </if>
+            <if test="param.userId != null">
+                AND user_id_ = #{param.userId}
+            </if>
+            <if test="param.userIdList !=null and param.userIdList.size()>0">
+                AND user_id_ IN
+                <foreach collection="param.userIdList" item="userId" open="(" close=")" separator=",">
+                    #{userId}
+                </foreach>
+            </if>
+        </where>
+        ) AS a
+        GROUP BY a.user_id_, a.create_time_
+    </select>
+
+    <select id="queryAllUserId" resultType="java.lang.Integer">
+        SELECT
+        distinct user_id_
+        FROM
+            temp_little_artist_training_camp_user_relation
+       </select>
+
+    <select id="queryCampUser" resultType="com.ym.mec.biz.dal.vo.TempCampUserVo">
+        select
+        b.id_ as id,
+        b.username_ as username,
+        b.phone_ as phone,
+        a.state_ as state,
+        c.name_ as campName
+        from temp_little_artist_training_camp_user_relation as a
+        left join sys_user as b on a.user_id_ = b.id_
+        left join temp_little_artist_training_camp as c on a.activity_id_ = c.id_
+        <where>
+            <if test="param.state != null ">
+                AND a.state_ = #{param.state}
+            </if>
+            <if test="param.search != null ">
+                AND (
+                b.`id_` LIKE CONCAT('%', #{param.search},'%')
+                OR b.`name_` LIKE CONCAT('%', #{param.search},'%')
+                OR b.`phone_` LIKE CONCAT('%', #{param.search},'%')
+                )
+            </if>
+        </where>
+    </select>
+</mapper>

+ 28 - 0
mec-biz/src/main/resources/config/mybatis/TempLittleArtistTrainingCampUserRelationMapper.xml

@@ -0,0 +1,28 @@
+<?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.TempLittleArtistTrainingCampUserRelationDao">
+    <resultMap id="BaseResultMap" type="com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCampUserRelation">
+        <id column="id_" jdbcType="INTEGER" property="id"/>
+        <result column="activity_id_" jdbcType="INTEGER" property="activityId"/>
+        <result column="user_id_" jdbcType="INTEGER" property="userId"/>
+        <result column="im_group_id_" jdbcType="INTEGER" property="imGroupId"/>
+        <result column="state_" jdbcType="VARCHAR" property="state"/>
+        <result column="create_time_" jdbcType="TIMESTAMP" property="createTime"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id_
+        , activity_id_, user_id_, im_group_id_, state_, create_time_
+    </sql>
+
+    <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
+            parameterType="com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCampUserRelation">
+        insert into temp_little_artist_training_camp_user_relation(activity_id_, user_id_, im_group_id_, state_,
+        create_time_)
+        values
+        <foreach collection="entities" item="entity" separator=",">
+            (#{entity.activityId}, #{entity.userId}, #{entity.imGroupId}, #{entity.state}, #{entity.createTime})
+        </foreach>
+    </insert>
+
+</mapper>

+ 57 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImRoomMessage.java

@@ -12,26 +12,55 @@ public class ImRoomMessage extends BaseMessage {
     //objectName 类型-观看者退出房间
     public static final String LOOKER_LOGIN_OUT = "RC:LookerLoginOut";
 
+    //objectName 类型-观看者数量-该消息只有主播端接
+    public static final String MEMBER_COUNT = "RC:Chatroom:MemberCountUp";
+
+    //objectName 类型-商品上架
+    public static final String LIVE_GOODS_UP = "DY:LIVE_GOODS_UP";
+
+    //objectName 类型-商品下架
+    public static final String LIVE_GOODS_DOWN = "DY:LIVE_GOODS_DOWN";
+
     /**
+     * <p>必传
      * 消息类型
      */
     private String objectName;
 
     /**
+     * <p>必传
      * 消息内容
      */
     private Object content;
 
     /**
+     * <p>必传
      * 发送者id
      */
     private String fromUserId;
 
     /**
+     * <p>必传
      * 发送到的房间uid
      */
     private String toChatroomId;
 
+    /**
+     * <p>非必传
+     * <p>开通“聊天室消息云存储”服务情况下,针对融云服务端历史消息中是否存储此条消息,
+     * <p>0 表示为不存储、 1 表示为存储,默认为 1 存储消息。
+     * <p>客户端发送自定义消息时则根据消息注册的 ISPERSISTED 标识判断是否在服务端存储。
+     */
+    private Integer isPersisted = 1;
+
+    /**
+     * <p>非必传
+     * <p>发送用户自己是否接收消息,0 表示为不接收,1 表示为接收,
+     * <p>默认为 0 不接收,只有向一个聊天室发送消息时此参数有效。
+     * <p>如开通了聊天室消息云存储功能,不为 1 时该消息不会存储到历史消息中。
+     */
+    private Integer isIncludeSender = 0;
+
     @Override
     public String getObjectName() {
         return objectName;
@@ -64,4 +93,32 @@ public class ImRoomMessage extends BaseMessage {
     public void setToChatroomId(String toChatroomId) {
         this.toChatroomId = toChatroomId;
     }
+
+    /**
+     * 0 表示为不存储、 1 表示为存储
+     */
+    public Integer getIsPersisted() {
+        return isPersisted;
+    }
+
+    /**
+     * 0 表示为不存储、 1 表示为存储
+     */
+    public void setIsPersisted(Integer isPersisted) {
+        this.isPersisted = isPersisted;
+    }
+
+    /**
+     * 0 表示为不接收,1 表示为接收
+     */
+    public Integer getIsIncludeSender() {
+        return isIncludeSender;
+    }
+
+    /**
+     * 0 表示为不接收,1 表示为接收
+     */
+    public void setIsIncludeSender(Integer isIncludeSender) {
+        this.isIncludeSender = isIncludeSender;
+    }
 }

+ 4 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/page/WrapperUtil.java

@@ -146,6 +146,10 @@ public class WrapperUtil<T> {
                 .filter(StrPredicate);
     }
 
+    public static <S, O> boolean strParamIsNull(Map<S, O>  map, S str) {
+        return StrPredicate.test(WrapperUtil.toStr(map, str));
+    }
+
     public static List<String> toList(String key) {
         return toList(key, ",");
     }

+ 107 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/ImSendGroupMessageController.java

@@ -0,0 +1,107 @@
+package com.ym.mec.teacher.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.ImGroup;
+import com.ym.mec.biz.dal.entity.ImSendGroupMessage;
+import com.ym.mec.biz.dal.page.ImGroupQueryInfo;
+import com.ym.mec.biz.dal.page.ImSendGroupMessageQueryInfo;
+import com.ym.mec.biz.service.ImGroupService;
+import com.ym.mec.biz.service.ImSendGroupMessageService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+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.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;
+
+@Api(tags = "群消息定时发送")
+@RequestMapping("imSendGroupMessage")
+@RestController
+public class ImSendGroupMessageController extends BaseController {
+
+    @Autowired
+    private ImSendGroupMessageService imSendGroupMessageService;
+    @Autowired
+    private ImGroupService imGroupService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @ApiOperation("获取群消息列表")
+    @PostMapping(value = "/queryPage")
+    public HttpResponseResult<PageInfo<ImSendGroupMessage>> queryPage(ImSendGroupMessageQueryInfo queryInfo) throws Exception {
+        return succeed(imSendGroupMessageService.queryPage(queryInfo));
+    }
+
+    @ApiOperation("发送群聊消息")
+    @PostMapping(value = "/send")
+    public HttpResponseResult send(@RequestBody ImSendGroupMessage imSendGroupMessage) throws Exception {
+        imSendGroupMessageService.sendGroupMessage(imSendGroupMessage);
+        return succeed();
+    }
+
+    @ApiOperation("修改未发送的群消息")
+    @PostMapping(value = "/update")
+    public HttpResponseResult update(@RequestBody ImSendGroupMessage imSendGroupMessage) throws Exception {
+        imSendGroupMessageService.updateGroupMessage(imSendGroupMessage);
+        return succeed();
+    }
+
+    @ApiOperation("删除未发送的群消息")
+    @PostMapping(value = "/delete")
+    public HttpResponseResult delete(Long id) throws Exception {
+        imSendGroupMessageService.deleteGroupMessage(id);
+        return succeed();
+    }
+    @ApiOperation("删除未发送消息的群列表")
+    @PostMapping(value = "/deleteGroupList")
+    public HttpResponseResult deleteGroupList(Long imSendGroupMessageId,String groupIds) throws Exception {
+        Optional.ofNullable(groupIds).orElseThrow(() -> new BizException("群组id不能为空"));
+        Optional.ofNullable(imSendGroupMessageId).orElseThrow(() -> new BizException("群消息id不能为空"));
+        imSendGroupMessageService.deleteGroupList(imSendGroupMessageId,groupIds);
+        return succeed();
+    }
+    @ApiOperation("添加未发送消息的群列表")
+    @PostMapping(value = "/addGroupList")
+    public HttpResponseResult addGroupList(Long imSendGroupMessageId,String groupIds) throws Exception {
+        Optional.ofNullable(groupIds).orElseThrow(() -> new BizException("群组id不能为空"));
+        Optional.ofNullable(imSendGroupMessageId).orElseThrow(() -> new BizException("群消息id不能为空"));
+        imSendGroupMessageService.addGroupList(imSendGroupMessageId,groupIds);
+        return succeed();
+    }
+
+    @ApiOperation("查询群列表(没有在消息列表的)")
+    @PostMapping(value = "/queryGroupPage")
+    public HttpResponseResult<PageInfo<ImGroup>> queryGroupPage(ImGroupQueryInfo imGroupQueryInfo) throws Exception {
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).
+                orElseThrow(() -> new Exception("请登录"));
+        imGroupQueryInfo.setUserId(sysUser.getId());
+        if(imGroupQueryInfo.getImSendGroupMessageId() != null){
+            ImSendGroupMessage imSendGroupMessage = Optional.of(imSendGroupMessageService.get(imGroupQueryInfo.getImSendGroupMessageId())).
+                    orElseThrow(()->new BizException("消息不存在"));
+            imGroupQueryInfo.setIgnoreIds(imSendGroupMessage.getTargetIds());
+        }
+        return succeed(imGroupService.queryPage(imGroupQueryInfo));
+    }
+
+    @ApiOperation("查询群列表(在消息列表的)")
+    @PostMapping(value = "/queryGroupPage1")
+    public HttpResponseResult<PageInfo<ImGroup>> queryGroupPage1(ImGroupQueryInfo imGroupQueryInfo) throws Exception {
+        SysUser sysUser = Optional.of(sysUserFeignService.queryUserInfo()).
+                orElseThrow(() -> new Exception("请登录"));
+        imGroupQueryInfo.setUserId(sysUser.getId());
+        if(imGroupQueryInfo.getImSendGroupMessageId() != null){
+            ImSendGroupMessage imSendGroupMessage = Optional.of(imSendGroupMessageService.get(imGroupQueryInfo.getImSendGroupMessageId())).
+                    orElseThrow(()->new BizException("消息不存在"));
+            imGroupQueryInfo.setTargetIds(imSendGroupMessage.getTargetIds());
+        }
+        return succeed(imGroupService.queryPage(imGroupQueryInfo));
+    }
+}

+ 48 - 0
mec-web/src/main/java/com/ym/mec/web/controller/LiveGoodsController.java

@@ -0,0 +1,48 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.biz.dal.entity.LiveGoods;
+import com.ym.mec.biz.service.LiveGoodsService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+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;
+
+@Api(tags = "直播间商品管理")
+@RequestMapping("liveGoods")
+@RestController
+public class LiveGoodsController extends BaseController {
+
+    @Autowired
+    private LiveGoodsService liveGoodsService;
+
+    @ApiOperation("新增直播间商品")
+    @PostMapping("/add")
+    @PreAuthorize("@pcs.hasPermissions('liveGoods/add')")
+    public HttpResponseResult add(@RequestBody LiveGoods liveGoods) {
+        liveGoodsService.insert(liveGoods);
+        return succeed();
+    }
+
+    @ApiOperation("修改直播间商品")
+    @PostMapping(value = "/update")
+    @PreAuthorize("@pcs.hasPermissions('liveGoods/update')")
+    public HttpResponseResult update(@RequestBody LiveGoods liveGoods) {
+        liveGoodsService.updateLiveGoods(liveGoods);
+        return succeed();
+    }
+
+    @ApiOperation("上架、下架直播间商品")
+    @PostMapping("/updateStatus")
+    @PreAuthorize("@pcs.hasPermissions('liveGoods/updateStatus')")
+    public HttpResponseResult updateStatus(Integer liveGoodsId, Boolean status) {
+        liveGoodsService.updateStatus(liveGoodsId, status);
+        return succeed();
+    }
+}

+ 31 - 0
mec-web/src/main/java/com/ym/mec/web/controller/LiveGoodsMapperController.java

@@ -0,0 +1,31 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.biz.dal.entity.LiveGoodsMapper;
+import com.ym.mec.biz.service.LiveGoodsMapperService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+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;
+
+@Api(tags = "直播商品关联管理")
+@RequestMapping("liveGoodsMapper")
+@RestController
+public class LiveGoodsMapperController extends BaseController {
+
+    @Autowired
+    private LiveGoodsMapperService liveGoodsMapperService;
+
+    @ApiOperation("新增直播间商品关联")
+    @PostMapping("/add")
+    @PreAuthorize("@pcs.hasPermissions('liveGoodsMapper/add')")
+    public HttpResponseResult add(@RequestBody LiveGoodsMapper liveGoodsMapper) {
+        liveGoodsMapperService.add(liveGoodsMapper);
+        return succeed();
+    }
+}

+ 94 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TempLittleArtistTrainingCampController.java

@@ -0,0 +1,94 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.biz.dal.dto.TempLittleArtistTrainingCampDto;
+import com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCamp;
+import com.ym.mec.biz.dal.vo.TempCampUserVo;
+import com.ym.mec.biz.dal.vo.TempUserTrainingTimeDetailVo;
+import com.ym.mec.biz.service.TempLittleArtistTrainingCampService;
+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.*;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 小小艺术家训练营活动(TempLittleArtistTrainingCamp)表控制层
+ *
+ * @author hgw
+ * @since 2022-05-17 20:56:22
+ */
+@Api(tags = "小小艺术家训练营活动")
+@RestController
+@RequestMapping("/tempLittleArtistTrainingCamp")
+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();
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "name", dataType = "String", value = "训练营标题-模糊搜索"),
+            @ApiImplicitParam(name = "state", dataType = "String", value = "筹备中 READY,报名中 APPLY,未开始 NOT_START,进行中 ING,已结束 END"),
+            @ApiImplicitParam(name = "applyStartDate", dataType = "String", value = "申请报名登记开始日期-年月日"),
+            @ApiImplicitParam(name = "applyEndDate", dataType = "String", value = "申请报名登记结束日期-年月日"),
+            @ApiImplicitParam(name = "trainStartDate", dataType = "String", value = "训练开始日期-年月日"),
+            @ApiImplicitParam(name = "trainEndDate", dataType = "String", value = "训练结束日期-年月日"),
+            @ApiImplicitParam(name = "page", dataType = "Integer", required = true, value = "页数"),
+            @ApiImplicitParam(name = "rows", dataType = "Integer", required = true, value = "每页数量"),
+    })
+    @ApiOperation("分页查询-训练营列表")
+    @PostMapping(value = "/queryPageTrainingCamp")
+    public HttpResponseResult<PageInfo<TempLittleArtistTrainingCamp>> queryPageTrainingCamp(@RequestBody Map<String, Object> param) {
+        return succeed(tempLittleArtistTrainingCampService.queryPageTrainingCamp(param));
+    }
+
+    @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("查询指定学生-训练营每日训练时长")
+    @PostMapping(value = "/queryUserTrainingTime")
+    public HttpResponseResult<List<TempUserTrainingTimeDetailVo>> queryUserTrainingTime(@RequestBody Map<String, Object> param) {
+        return succeed(tempLittleArtistTrainingCampService.queryUserTrainingTime(param));
+    }
+
+}
+