Selaa lähdekoodia

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

yonge 2 vuotta sitten
vanhempi
commit
47aaf7d6d3
31 muutettua tiedostoa jossa 624 lisäystä ja 20 poistoa
  1. 9 2
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/NewsController.java
  2. 1 1
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/queryinfo/NewsInformationQueryInfo.java
  3. 1 1
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dal/entity/SysNewsInformation.java
  4. 12 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dto/AppHomeDto.java
  5. 1 1
      cooleshow-cms/src/main/resources/config/mybatis/SysNewsInformationMapper.xml
  6. 18 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicTagController.java
  7. 68 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/music/MusicCompareRecordStatController.java
  8. 107 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/music/MusicCompareVo.java
  9. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/MusicTagSaveDto.java
  10. 19 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImUserFriend.java
  11. 71 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicCompareRecordStat.java
  12. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicTag.java
  13. 16 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/MusicCompareRecordStatMapper.java
  14. 24 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicCompareRecordStatService.java
  15. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseHomeworkServiceImpl.java
  16. 13 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  17. 32 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicCompareRecordStatServiceImp.java
  18. 0 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  19. 5 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicTagServiceImpl.java
  20. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseHomeworkVo.java
  21. 101 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/music/MusicCompareWrapper.java
  22. 24 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicCompareRecordStatMapper.xml
  23. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  24. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetPracticeRecordMapper.xml
  25. 3 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicTagMapper.xml
  26. 1 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/config/ResourceServerConfig.java
  27. 13 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/CourseHomeworkController.java
  28. 11 2
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/ImUserFriendController.java
  29. 1 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java
  30. 14 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseHomeworkController.java
  31. 10 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ImUserFriendController.java

+ 9 - 2
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/NewsController.java

@@ -113,7 +113,7 @@ public class NewsController extends BaseController {
 				}
 			}
 		}
-		if(newsInfo.getType() == 4 ||newsInfo.getType() == 5) {
+		if(newsInfo.getType() == 4 ||newsInfo.getType() == 5||newsInfo.getType() == 7) {
 			if (StringUtil.isEmpty(newsInfo.getClientType() )) {
 				return failed("平台不能为空");
 			}
@@ -133,7 +133,7 @@ public class NewsController extends BaseController {
 			}
 		}
 		// 2 3 4
-		if (newsInfo.getType() == 2 ||newsInfo.getType() == 3 ||newsInfo.getType() == 4 ) {
+		if (newsInfo.getType() == 2 ||newsInfo.getType() == 3 ||newsInfo.getType() == 4||newsInfo.getType() == 7 ) {
 			if (newsInfo.getOnlineTime() == null || newsInfo.getOfflineTime() == null) {
 				return failed("生效时间不能为空");
 			}
@@ -273,6 +273,13 @@ public class NewsController extends BaseController {
 		params = new HashMap<>();
 		MapUtil.populateMap(params, queryInfo);
 		appHomeDto.setBanner(sysNewsInformationService.selectPage(queryInfo).getRows());
+
+		// 悬浮框
+		queryInfo.setType(7);
+		params = new HashMap<>();
+		MapUtil.populateMap(params, queryInfo);
+		appHomeDto.setSuspension(sysNewsInformationService.selectPage(queryInfo).getRows());
+
 		// 闪页
 		queryInfo.setType(3);
 		params = new HashMap<>();

+ 1 - 1
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/queryinfo/NewsInformationQueryInfo.java

@@ -10,7 +10,7 @@ import java.util.List;
 
 public class NewsInformationQueryInfo extends QueryInfo {
 
-	@ApiModelProperty(value = "类型,1热门资讯,2开屏广告,3闪页管理,4轮播图管理 5按钮管理 6 乐理章节", required = true)
+	@ApiModelProperty(value = "类型,1热门资讯,2开屏广告,3闪页管理,4轮播图管理 5按钮管理 6 乐理章节 7 悬浮窗设置 ", required = true)
 	@NotNull(message = "类型不能为空")
 	private Integer type;
 

+ 1 - 1
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dal/entity/SysNewsInformation.java

@@ -35,7 +35,7 @@ public class SysNewsInformation {
 	private String videoCoverImage;
 
 	/** 类型 */
-	@ApiModelProperty(value = "类型,1热门资讯,2开屏广告,3闪页管理,4轮播图管理 5app按钮管理 6:乐理章节", required = true)
+	@ApiModelProperty(value = "类型,1热门资讯,2开屏广告,3闪页管理,4轮播图管理 5app按钮管理 6:乐理章节 7 悬浮窗设置", required = true)
 	@NotNull(message = "类型不能为空")
 	private Integer type;
 	

+ 12 - 0
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dto/AppHomeDto.java

@@ -21,12 +21,24 @@ public class AppHomeDto {
     @ApiModelProperty("banner")
     private List<SysNewsInformationDto> banner;
 
+
+    @ApiModelProperty("悬浮框")
+    private List<SysNewsInformationDto> suspension;
+
     @ApiModelProperty("闪页")
     private List<SysNewsInformationDto> flashPage;
 
     @ApiModelProperty("app按钮")
     private List<SysNewsInformationDto> appMenu;
 
+    public List<SysNewsInformationDto> getSuspension() {
+        return suspension;
+    }
+
+    public void setSuspension(List<SysNewsInformationDto> suspension) {
+        this.suspension = suspension;
+    }
+
     public List<SysNewsInformationDto> getInformation() {
         return information;
     }

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

@@ -69,7 +69,7 @@
 						and if(sni.online_time_ is not null,sni.online_time_ &lt;= now(),1=1)
 						and if(sni.offline_time_ is not null,sni.offline_time_ &gt;= now(),1=1)
 					</if>
-					<if test="type == 4 or type == 5">
+					<if test="type == 4 or type == 5  or type == 7">
 						<choose>
 							<when test="platformType == 'WEBSITE'">
 								and sni.client_type_ = #{platformType}

+ 18 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicTagController.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.admin.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dto.AdjustModel;
 import com.yonge.cooleshow.biz.dal.dto.MusicTagSaveDto;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicTagSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicTag;
@@ -108,4 +109,21 @@ public class MusicTagController extends BaseController {
 		}
 		return status(musicTagService.state(id));
 	}
+
+
+	/**
+	 * 设置排序值 和加精
+	 */
+	@PostMapping("/adjust")
+	@ApiOperation(value = "标签调整设置")
+	public HttpResponseResult<Boolean> adjust(@RequestBody @Valid AdjustModel model) {
+
+		MusicTag musicTag = new MusicTag();
+		musicTag.setId(model.getId());
+		musicTag.setSortNumber(model.getSort());
+
+		musicTagService.updateById(musicTag);
+
+		return succeed();
+	}
 }

+ 68 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/music/MusicCompareRecordStatController.java

@@ -0,0 +1,68 @@
+package com.yonge.cooleshow.admin.controller.music;
+
+
+import com.yonge.cooleshow.admin.io.request.music.MusicCompareVo;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.service.MusicCompareRecordStatService;
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
+import com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 曲目练习统计表 前端控制器
+ * </p>
+ *
+ * @author Eric
+ * @since 2022-10-17
+ */
+@Controller
+@RequestMapping("/music/compare")
+@Api(tags = "曲目练习统计表 API接口")
+public class MusicCompareRecordStatController extends BaseController {
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private MusicCompareRecordStatService musicCompareRecordStatService;
+
+    /**
+     * 查询曲目统计汇总信息
+     */
+    @ApiOperation(value = "曲目统计汇总信息", notes = "传入id")
+    @PostMapping(value = "/record/stat", consumes="application/json", produces="application/json")
+    public HttpResponseResult<MusicCompareVo.RecordStat> detail(@RequestBody MusicCompareVo.StatQueryRequest info) {
+
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+
+        if (info.invalidParam()) {
+            return failed("无效的请求参数");
+        }
+
+        MusicCompareWrapper.RecordStat records = musicCompareRecordStatService.findMusicCompareRecordStatInfo(sysUser.getId(),
+                MusicCompareWrapper.StatQueryInfo.from(info.jsonString()));
+
+        return succeed(MusicCompareVo.RecordStat.from(records.jsonString()));
+    }
+
+}

+ 107 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/music/MusicCompareVo.java

@@ -0,0 +1,107 @@
+package com.yonge.cooleshow.admin.io.request.music;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Created by Eric.Shang on 2022/10/17.
+ */
+public class MusicCompareVo implements Serializable {
+
+    /**
+     * 统计汇总查询条件
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class StatQueryRequest extends QueryInfo {
+
+        @ApiModelProperty("客户端类型 TEACHER(老师端) STUDENT(学生端)")
+        private ClientEnum clientType;
+
+
+        public boolean invalidParam() {
+
+            return Objects.isNull(getClientType())
+                    || ClientEnum.invalid(getClientType().getCode());
+        }
+
+        public String jsonString() {
+
+            return JSON.toJSONString(this);
+        }
+    }
+
+    /**
+     * 曲目统计汇总信息
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class RecordStat implements Serializable {
+
+        @ApiModelProperty("曲目总数")
+        private Long musicNums;
+
+        @ApiModelProperty("使用时长")
+        private Long trainDuration;
+
+        @ApiModelProperty("使用次数")
+        private Long trainFrequency;
+
+        @ApiModelProperty("评测时长")
+        private Long evaluateDuration;
+
+        @ApiModelProperty("评测次数")
+        private Long evaluateFrequency;
+
+        @ApiModelProperty("最近使用时间")
+        private Long recentTime;
+
+        private List<RecordInfo> recordInfos;
+
+        public static RecordStat from(String recv) {
+
+            return JSON.parseObject(recv, RecordStat.class);
+        }
+    }
+
+    /**
+     * 曲目统计信息
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class RecordInfo implements Serializable {
+
+        @ApiModelProperty("曲目ID")
+        private Long musicSheetId;
+
+        @ApiModelProperty("曲目名称")
+        private String musicName;
+
+        @ApiModelProperty("使用时长")
+        private Long trainDuration;
+
+        @ApiModelProperty("使用次数")
+        private Long trainFrequency;
+
+        @ApiModelProperty("评测时长")
+        private Long evaluateDuration;
+
+        @ApiModelProperty("评测次数")
+        private Long evaluateFrequency;
+
+        @ApiModelProperty("最近使用时间")
+        private Long recentTime;
+    }
+}

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/MusicTagSaveDto.java

@@ -34,6 +34,18 @@ public class MusicTagSaveDto {
     @ApiModelProperty("标签类型 MUSIC:曲目 ALBUM:专辑")
     private String type;
 
+
+    @ApiModelProperty("标签排序")
+    private Integer sortNumber = 0;
+
+    public Integer getSortNumber() {
+        return sortNumber;
+    }
+
+    public void setSortNumber(Integer sortNumber) {
+        this.sortNumber = sortNumber;
+    }
+
     public String getType() {
         return type;
     }

+ 19 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImUserFriend.java

@@ -5,6 +5,7 @@ import java.util.Date;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -35,6 +36,10 @@ public class ImUserFriend implements Serializable {
     @ApiModelProperty(value = "融云好友编号")
     private String imFriendId;
 
+    @TableField(exist = false)
+    @ApiModelProperty(value = "好友用户身份")
+    private ClientEnum clientType;
+
     @TableField("friend_avatar_")
     @ApiModelProperty(value = "好友头像")
     private String friendAvatar;
@@ -126,5 +131,19 @@ public class ImUserFriend implements Serializable {
     public void setImFriendId(String imFriendId) {
         this.imFriendId = imFriendId;
     }
+
+    public ClientEnum getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(ClientEnum clientType) {
+        this.clientType = clientType;
+    }
+
+
+    public ImUserFriend clientType(ClientEnum clientType) {
+        this.clientType = clientType;
+        return this;
+    }
 }
 

+ 71 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicCompareRecordStat.java

@@ -0,0 +1,71 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 曲目练习统计表
+ * </p>
+ *
+ * @author Eric
+ * @since 2022-10-17
+ */
+@Getter
+@Setter
+@TableName("music_compare_record_stat")
+@ApiModel(value = "MusicCompareRecordStat对象", description = "曲目练习统计表")
+public class MusicCompareRecordStat implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键ID")
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("曲目编号")
+    @TableField("music_sheet_id_")
+    private Long musicSheetId;
+
+    @ApiModelProperty("客户端标识")
+    @TableField("client_id_")
+    private String clientId;
+
+    @ApiModelProperty("用户编号")
+    @TableField("user_id_")
+    private Long userId;
+
+    @ApiModelProperty("使用时长")
+    @TableField("train_duration_")
+    private Long trainDuration;
+
+    @ApiModelProperty("使用次数")
+    @TableField("train_frequency_")
+    private Long trainFrequency;
+
+    @ApiModelProperty("评测时长")
+    @TableField("evaluate_duration_")
+    private Long evaluateDuration;
+
+    @ApiModelProperty("评测次数")
+    @TableField("evaluate_frequency_")
+    private Long evaluateFrequency;
+
+    @ApiModelProperty("最近使用时间")
+    @TableField("recent_time_")
+    private Long recentTime;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time_")
+    private Date createTime;
+
+
+}

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicTag.java

@@ -39,6 +39,11 @@ public class MusicTag implements Serializable {
     @ApiModelProperty("标签类型 MUSIC:曲目 ALBUM:专辑")
     private String type;
 
+
+    @TableField(value = "sort_number_")
+    @ApiModelProperty("标签排序")
+    private Integer sortNumber;
+
 	@TableField(value = "del_flag_")
     @ApiModelProperty(value = "假删标识(0:正常,1:删除)")
     private Boolean delFlag= false;
@@ -63,6 +68,13 @@ public class MusicTag implements Serializable {
     @ApiModelProperty(value = "更新人(后台平台用户)")
     private Long updateBy;  //更新人(老师或者是后台平台用户)
 
+    public Integer getSortNumber() {
+        return sortNumber;
+    }
+
+    public void setSortNumber(Integer sortNumber) {
+        this.sortNumber = sortNumber;
+    }
 
     public String getType() {
         return type;

+ 16 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/MusicCompareRecordStatMapper.java

@@ -0,0 +1,16 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import com.yonge.cooleshow.biz.dal.entity.MusicCompareRecordStat;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 曲目练习统计表 Mapper 接口
+ * </p>
+ *
+ * @author Eric
+ * @since 2022-10-17
+ */
+public interface MusicCompareRecordStatMapper extends BaseMapper<MusicCompareRecordStat> {
+
+}

+ 24 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicCompareRecordStatService.java

@@ -0,0 +1,24 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.yonge.cooleshow.biz.dal.entity.MusicCompareRecordStat;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper;
+
+/**
+ * <p>
+ * 曲目练习统计表 服务类
+ * </p>
+ *
+ * @author Eric
+ * @since 2022-10-17
+ */
+public interface MusicCompareRecordStatService extends IService<MusicCompareRecordStat> {
+
+    /**
+     * 曲目统计汇总信息
+     * @param sysUserId 用户ID
+     * @param info MusicCompareWrapper.StatQueryInfo
+     * @return MusicCompareWrapper.RecordStat
+     */
+    MusicCompareWrapper.RecordStat findMusicCompareRecordStatInfo(Long sysUserId, MusicCompareWrapper.StatQueryInfo info);
+}

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

@@ -104,6 +104,12 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
         if (CollectionUtils.isEmpty(studentInfoList)) {
             studentInfoList = new ArrayList<>();
         }
+
+        for (CourseHomeworkVo item : studentInfoList) {
+
+            item.setImUserId(MessageFormat.format("{0}:{1}", String.valueOf(item.getStudentId()), ClientEnum.STUDENT.name()));
+        }
+
         Map<Long, List<CourseHomeworkVo>> studentCollect = studentInfoList.stream()
                 .collect(Collectors.groupingBy( CourseHomeworkVo::getCourseId));
 
@@ -112,6 +118,12 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
         if (CollectionUtils.isEmpty(teacherInfoList)) {
             teacherInfoList = new ArrayList<>();
         }
+
+        for (CourseHomeworkVo item : teacherInfoList) {
+
+            item.setImUserId(String.valueOf(item.getTeacherId()));
+        }
+
         Map<Long, List<CourseHomeworkVo>> teacherCollect = teacherInfoList.stream()
                       .collect(Collectors.groupingBy( CourseHomeworkVo::getCourseId));
 

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

@@ -707,6 +707,12 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         if (replied != null) {
             search.setStatus(CourseScheduleEnum.COMPLETE.getCode());
             List<MyCourseVo> list = baseMapper.queryTeacherPracticeCourse(page, monthToDate(search));
+
+            for (MyCourseVo item : list) {
+
+                item.setImUserId(MessageFormat.format("{0}:{1}", String.valueOf(item.getUserId()), ClientEnum.STUDENT.name()));
+            }
+
             if (replied == 0) {//未评价
                 return page.setRecords(list.stream().filter(s -> {
                     return s.getTeacherReplied() == 0;
@@ -720,7 +726,13 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             }
         }
 
-        return page.setRecords(baseMapper.queryTeacherPracticeCourse(page, monthToDate(search)));
+        List<MyCourseVo> records = baseMapper.queryTeacherPracticeCourse(page, monthToDate(search));
+        for (MyCourseVo item : records) {
+
+            item.setImUserId(MessageFormat.format("{0}:{1}", String.valueOf(item.getUserId()), ClientEnum.STUDENT.name()));
+        }
+
+        return page.setRecords(records);
     }
 
     @Override

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

@@ -0,0 +1,32 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.yonge.cooleshow.biz.dal.entity.MusicCompareRecordStat;
+import com.yonge.cooleshow.biz.dal.mapper.MusicCompareRecordStatMapper;
+import com.yonge.cooleshow.biz.dal.service.MusicCompareRecordStatService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 曲目练习统计表 服务实现类
+ * </p>
+ *
+ * @author Eric
+ * @since 2022-10-17
+ */
+@Service
+public class MusicCompareRecordStatServiceImp extends ServiceImpl<MusicCompareRecordStatMapper, MusicCompareRecordStat> implements MusicCompareRecordStatService {
+
+    /**
+     * 曲目统计汇总信息
+     *
+     * @param sysUserId 用户ID
+     * @param info      MusicCompareWrapper.StatQueryInfo
+     * @return MusicCompareWrapper.RecordStat
+     */
+    @Override
+    public MusicCompareWrapper.RecordStat findMusicCompareRecordStatInfo(Long sysUserId, MusicCompareWrapper.StatQueryInfo info) {
+        return null;
+    }
+}

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

@@ -284,10 +284,6 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         } else {
             detail.setPlay(YesOrNoEnum.YES);
         }
-        if (ClientEnum.STUDENT.getCode().equals(userType.getCode())) {
-            // 学生进入小酷Ai练习,添加一条练习记录
-            musicSheetPracticeRecordService.addRecord(id, sysUser.getId());
-        }
         return detail;
     }
 

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

@@ -57,7 +57,7 @@ public class MusicTagServiceImpl extends ServiceImpl<MusicTagDao, MusicTag> impl
 
          // 根据父级id, 将子集分类
          Map<String, List<MusicTagVo>> musicTagMap = musicTagVoList.stream()
-                                                                   .collect(Collectors.groupingBy( vo -> vo.getParentTagId().toString()));
+                                                                   .collect(Collectors.groupingBy( vo -> vo.getId().toString()));
          musicTagVoIPage.getRecords()
                         .forEach(musicTagVo -> {
                             List<MusicTagVo> childrenList = musicTagMap.get(musicTagVo.getId().toString());
@@ -118,7 +118,7 @@ public class MusicTagServiceImpl extends ServiceImpl<MusicTagDao, MusicTag> impl
         }
         MusicTag musicTag = new MusicTag();
         musicTag.setId(musicTagId);
-        musicTag.setState(YesOrNoEnum.YES);
+        musicTag.setState(tag.getState().equals(YesOrNoEnum.YES)?YesOrNoEnum.NO:YesOrNoEnum.YES);
         return this.updateById(musicTag);
 
     }
@@ -141,6 +141,7 @@ public class MusicTagServiceImpl extends ServiceImpl<MusicTagDao, MusicTag> impl
         } else {
             musicTag.setParentTagId(musicTagSaveDto.getParentTagId());
         }
+        musicTag.setSortNumber(musicTagSaveDto.getSortNumber());
         musicTag.setName(musicTagSaveDto.getName());
         musicTag.setCreateTime(new Date());
         musicTag.setUpdateTime(new Date());
@@ -184,6 +185,7 @@ public class MusicTagServiceImpl extends ServiceImpl<MusicTagDao, MusicTag> impl
         MusicTag musicTag = new MusicTag();
         musicTag.setDelFlag(false);
         musicTag.setId(musicTagSaveDto.getId());
+        musicTag.setSortNumber(musicTagSaveDto.getSortNumber());
         musicTag.setType(musicTagSaveDto.getType());
         if (musicTagSaveDto.getParentTagId() == null) {
             musicTag.setParentTagId(0L);
@@ -205,6 +207,7 @@ public class MusicTagServiceImpl extends ServiceImpl<MusicTagDao, MusicTag> impl
                 .eq(MusicTag::getDelFlag,YesOrNoEnum.NO.getCode())
                 .eq(MusicTag::getState,YesOrNoEnum.YES.getCode())
                 .eq(MusicTag::getType,type)
+                .orderByDesc(MusicTag::getSortNumber)
                 .list();
         if (list == null) {
             return new ArrayList<>();

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

@@ -92,6 +92,9 @@ public class CourseHomeworkVo{
 	@ApiModelProperty("作业提交时间")
 	private Date submitTime;
 
+	@ApiModelProperty("IM用户ID")
+	private String imUserId;
+
 	public String getImGroupId() {
 		return imGroupId;
 	}
@@ -267,4 +270,12 @@ public class CourseHomeworkVo{
 	public void setBackgroundPic(String backgroundPic) {
 		this.backgroundPic = backgroundPic;
 	}
+
+	public String getImUserId() {
+		return imUserId;
+	}
+
+	public void setImUserId(String imUserId) {
+		this.imUserId = imUserId;
+	}
 }

+ 101 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/music/MusicCompareWrapper.java

@@ -0,0 +1,101 @@
+package com.yonge.cooleshow.biz.dal.wrapper.music;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Created by Eric.Shang on 2022/10/17.
+ */
+public class MusicCompareWrapper {
+
+    /**
+     * 统计汇总查询条件
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class StatQueryInfo extends QueryInfo {
+
+        @ApiModelProperty("客户端类型 TEACHER(老师端) STUDENT(学生端)")
+        private ClientEnum clientType;
+
+
+        public static StatQueryInfo from(String recv) {
+
+            return JSON.parseObject(recv, StatQueryInfo.class);
+        }
+
+    }
+
+    /**
+     * 曲目统计汇总信息
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class RecordStat implements Serializable {
+
+        @ApiModelProperty("曲目总数")
+        private Long musicNums;
+
+        @ApiModelProperty("使用时长")
+        private Long trainDuration;
+
+        @ApiModelProperty("使用次数")
+        private Long trainFrequency;
+
+        @ApiModelProperty("评测时长")
+        private Long evaluateDuration;
+
+        @ApiModelProperty("评测次数")
+        private Long evaluateFrequency;
+
+        @ApiModelProperty("最近使用时间")
+        private Long recentTime;
+
+        private List<RecordInfo> recordInfos;
+
+        public String jsonString() {
+
+            return JSON.toJSONString(this);
+        }
+    }
+
+    /**
+     * 曲目统计信息
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class RecordInfo implements Serializable {
+
+        @ApiModelProperty("曲目ID")
+        private Long musicSheetId;
+
+        @ApiModelProperty("曲目名称")
+        private String musicName;
+
+        @ApiModelProperty("使用时长")
+        private Long trainDuration;
+
+        @ApiModelProperty("使用次数")
+        private Long trainFrequency;
+
+        @ApiModelProperty("评测时长")
+        private Long evaluateDuration;
+
+        @ApiModelProperty("评测次数")
+        private Long evaluateFrequency;
+
+        @ApiModelProperty("最近使用时间")
+        private Long recentTime;
+    }
+}

+ 24 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicCompareRecordStatMapper.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yonge.cooleshow.biz.dal.mapper.MusicCompareRecordStatMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.MusicCompareRecordStat">
+        <id column="id_" property="id" />
+        <result column="music_sheet_id_" property="musicSheetId" />
+        <result column="client_id_" property="clientId" />
+        <result column="user_id_" property="userId" />
+        <result column="train_duration_" property="trainDuration" />
+        <result column="train_frequency_" property="trainFrequency" />
+        <result column="evaluate_duration_" property="evaluateDuration" />
+        <result column="evaluate_frequency_" property="evaluateFrequency" />
+        <result column="recent_time_" property="recentTime" />
+        <result column="create_time_" property="createTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id_, music_sheet_id_, client_id_, user_id_, train_duration_, train_frequency_, evaluate_duration_, evaluate_frequency_, recent_time_, create_time_
+    </sql>
+
+</mapper>

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

@@ -410,7 +410,7 @@
         where find_in_set(mt.id_,t.music_tag_) and mt.del_flag_ = 0  and mt.state_ = 1) as musicTagNames
         ,(select group_concat(s.name_) from subject s where find_in_set(s.id_,t.music_subject_) ) as subjectNames
         ,if(mf.id_ is not null,1,0) as favorite
-        from music_sheet_practice_record mspr
+        from sys_music_compare_record mspr
         left join music_sheet t on mspr.music_sheet_id_ = t.id_
         left join sys_user su on t.create_by_ = su.id_
         left join music_favorite mf on (t.id_ = mf.music_sheet_id_ and mspr.user_id_ = mf.user_id_ <if test="param.clientType != null"> AND mf.client_type_ = #{param.clientType}</if> )

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

@@ -19,7 +19,7 @@
 	<select id="selectPracticeMusicIdPage" resultType="java.lang.Long">
         select t.id_ from  (select
         max(mspr.id_) as id_
-        from music_sheet_practice_record mspr
+        from sys_music_compare_record mspr
         left join music_sheet ms on mspr.music_sheet_id_ = ms.id_
         <where>
             <if test="param.auditStatus !=null">

+ 3 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicTagMapper.xml

@@ -6,6 +6,7 @@
         <result column="parent_tag_id_" property="parentTagId" />
         <result column="name_" property="name" />
         <result column="state_" property="state" />
+        <result column="sort_number_" property="sortNumber" />
         <result column="type_" property="type" />
         <result column="del_flag_" property="delFlag" />
         <result column="create_time_" property="createTime" />
@@ -21,6 +22,7 @@
         , t.name_ as name
         , t.state_ as state
         , t.type_ as type
+        , t.sort_number_ as sortNumber
         , t.del_flag_ as delFlag
         , t.create_time_ as createTime
         , t.update_time_ as updateTime
@@ -59,6 +61,7 @@
                     )
             </if>
         </where>
+        order by  t.sort_number_ desc
 	</select>
 
 	<select id="getChildren" resultType="com.yonge.cooleshow.biz.dal.vo.MusicTagVo">

+ 1 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/config/ResourceServerConfig.java

@@ -28,7 +28,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                 .authorizeRequests()
                 .antMatchers("/task/**")
                 .hasIpAddress("0.0.0.0/0")
-                .antMatchers("/wechat/*", "/v2/api-docs", "/code/*","/open/**")
+                .antMatchers("/wechat/*", "/v2/api-docs", "/code/*","/open/**","/sysMusicRecord/getLastEvaluationMusicalNotesPlayStats","/music/sheet/detail/**")
                 .permitAll().anyRequest().authenticated().and().httpBasic();
     }
 

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.student.controller;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.CourseHomeworkSubmitDto;
@@ -17,6 +18,7 @@ import com.yonge.toolset.base.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -91,7 +93,17 @@ public class CourseHomeworkController extends BaseController {
         list.add(CourseScheduleEnum.PIANO_ROOM_CLASS);
         list.add(CourseScheduleEnum.PRACTICE);
         query.setCourseType(list);
-        return succeed(PageUtil.pageInfo(courseHomeworkService.selectPage(PageUtil.getPage(query),query)));
+
+        IPage<CourseHomeworkVo> page = courseHomeworkService.selectPage(PageUtil.getPage(query), query);
+        if (CollectionUtils.isNotEmpty(page.getRecords())) {
+
+            for (CourseHomeworkVo item : page.getRecords()) {
+
+                item.setImUserId(String.valueOf(item.getTeacherId()));
+            }
+        }
+
+        return succeed(PageUtil.pageInfo(page));
     }
 
 

+ 11 - 2
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/ImUserFriendController.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.ImUserFriend;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.MK;
 import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
 import com.yonge.cooleshow.biz.dal.vo.im.ImUserFriendVO;
@@ -16,6 +17,7 @@ import io.swagger.annotations.*;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.text.MessageFormat;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -46,12 +48,19 @@ public class ImUserFriendController extends BaseController {
     public HttpResponseResult<List<ImUserFriend>> queryAll(@RequestBody Map<String,Object> params) throws Exception {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         Object search = params.get("search");
-        List<ImUserFriend> iPage = imUserFriendService.getBaseMapper().selectList(Wrappers.<ImUserFriend>query().lambda()
+        List<ImUserFriend> userFriends = imUserFriendService.getBaseMapper().selectList(Wrappers.<ImUserFriend>query().lambda()
                 .and(Objects.nonNull(search) && StringUtils.isNotEmpty(search.toString()),
                         e->e.eq(ImUserFriend::getFriendId, search).or()
                         .like(ImUserFriend::getFriendNickname, search))
                 .eq(ImUserFriend::getUserId,sysUser.getId()).orderByDesc(ImUserFriend::getId));
-        return succeed(iPage);
+
+        for (ImUserFriend item : userFriends) {
+            // 学生目前添加好友都为老师
+            item.clientType(ClientEnum.TEACHER)
+                    .setImFriendId(MessageFormat.format("{0}", String.valueOf(item.getFriendId())));
+        }
+
+        return succeed(userFriends);
     }
 
     @ApiOperation("获取好友详情")

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

@@ -79,7 +79,7 @@ public class MusicSheetController extends BaseController {
     public HttpResponseResult<MusicSheetDetailVo> detail(@ApiParam(value = "曲谱编号", required = true) @PathVariable("id") Long id) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
-            return failed("用户信息获取失败");
+            sysUser = null;
         }
         return succeed(musicSheetService.detail(id, sysUser, ClientEnum.STUDENT));
     }

+ 14 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseHomeworkController.java

@@ -1,11 +1,13 @@
 package com.yonge.cooleshow.teacher.controller;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.CourseHomeworkReviewDto;
 import com.yonge.cooleshow.biz.dal.dto.CourseHomeworkSaveDto;
 import com.yonge.cooleshow.biz.dal.dto.CourseScheduleHomeworkSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.service.CourseHomeworkService;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
@@ -21,10 +23,12 @@ import com.yonge.toolset.base.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -137,7 +141,16 @@ public class CourseHomeworkController extends BaseController {
         list.add(CourseScheduleEnum.PRACTICE);
         query.setCourseType(list);
 
-        return succeed(PageUtil.pageInfo(courseHomeworkService.selectPage(PageUtil.getPage(query),query)));
+        IPage<CourseHomeworkVo> page = courseHomeworkService.selectPage(PageUtil.getPage(query), query);
+        if (CollectionUtils.isNotEmpty(page.getRecords())) {
+
+            for (CourseHomeworkVo item : page.getRecords()) {
+
+                item.setImUserId(MessageFormat.format("{0}:{1}", String.valueOf(item.getStudentId()), ClientEnum.STUDENT.name()));
+            }
+        }
+
+        return succeed(PageUtil.pageInfo(page));
     }
 
 

+ 10 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ImUserFriendController.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.yonge.cooleshow.biz.dal.entity.ImUserFriend;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.MK;
 import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
@@ -15,6 +16,7 @@ import io.swagger.annotations.*;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.text.MessageFormat;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -51,6 +53,14 @@ public class ImUserFriendController extends BaseController {
                         e -> e.eq(ImUserFriend::getFriendId, search)
                                 .or().like(ImUserFriend::getFriendNickname, search))
                 .orderByDesc(ImUserFriend::getId));
+
+        for (ImUserFriend item : record) {
+
+            // 老师端添加好友,可能为老师客服或者学生
+            item.clientType(ClientEnum.STUDENT)
+                    .setImFriendId(MessageFormat.format("{0}:{1}", String.valueOf(item.getFriendId()), ClientEnum.STUDENT.name()));
+        }
+
         return succeed(record);
     }