Browse Source

Merge remote-tracking branch 'origin/master'

weifanli 2 years ago
parent
commit
1ab911ff42
28 changed files with 580 additions and 78 deletions
  1. 126 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/MusicTheoryController.java
  2. 57 5
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/NewsController.java
  3. 1 1
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/queryinfo/NewsInformationQueryInfo.java
  4. 4 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dal/dao/SysNewsTypeDao.java
  5. 6 5
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dal/entity/SysNewsInformation.java
  6. 16 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dal/entity/SysNewsType.java
  7. 1 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dto/SysNewsInformationDto.java
  8. 29 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dto/SysNewsTypeDto.java
  9. 37 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dto/search/MusicTheorySearch.java
  10. 5 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/service/SysNewsTypeService.java
  11. 30 1
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/service/impl/SysNewsTypeServiceImpl.java
  12. 6 3
      cooleshow-cms/src/main/resources/config/mybatis/SysNewsInformationMapper.xml
  13. 76 4
      cooleshow-cms/src/main/resources/config/mybatis/SysNewsTypeMapper.xml
  14. 42 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/AdminStatisticalController.java
  15. 3 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dao/OmsOrderDao.java
  16. 47 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dto/search/UserStatisticalSearch.java
  17. 8 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/OmsOrderService.java
  18. 6 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderServiceImpl.java
  19. 4 0
      cooleshow-mall/mall-admin/src/main/resources/config/mybatis/OmsOrderDao.xml
  20. 2 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/config/ResourceServerConfig.java
  21. 1 22
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/PracticeTeacherSearch.java
  22. 5 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/ImGroupMemberAuditQueryInfo.java
  23. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseScheduleService.java
  24. 21 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  25. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/support/WrapperUtil.java
  26. 17 18
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  27. 24 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentCourseScheduleController.java
  28. 2 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseScheduleController.java

+ 126 - 0
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/MusicTheoryController.java

@@ -0,0 +1,126 @@
+package com.yonge.cooleshow.cms.controller;
+
+import com.yonge.cooleshow.cms.dal.entity.SysNewsType;
+import com.yonge.cooleshow.cms.dto.SysNewsTypeDto;
+import com.yonge.cooleshow.cms.dto.search.MusicTheorySearch;
+import com.yonge.cooleshow.cms.service.SysNewsTypeService;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.page.PageInfo;
+import com.yonge.cooleshow.common.page.QueryInfo;
+import com.yonge.toolset.utils.string.StringUtil;
+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.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.Date;
+
+import static com.yonge.cooleshow.common.entity.HttpResponseResult.failed;
+import static com.yonge.cooleshow.common.entity.HttpResponseResult.succeed;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-04-26
+ */
+@RestController
+@RequestMapping("music/theory")
+@Api(tags = "乐理管理")
+public class MusicTheoryController {
+
+    @Autowired
+    private SysNewsTypeService newsTypeService;
+
+
+    /**
+     * 查询单条
+     */
+    @GetMapping("/detail/{id}")
+    @ApiOperation(value = "乐理章节详情", notes = "传入id")
+    public HttpResponseResult<SysNewsType> detail(@ApiParam(value = "编号", required = true) @PathVariable("id") Long id) {
+        return succeed(newsTypeService.get(id));
+    }
+
+    @PostMapping(value = "/page", consumes="application/json", produces="application/json")
+    @ApiOperation(value = "乐理章节详情查询分页", httpMethod="POST", consumes="application/json", produces="application/json")
+    public HttpResponseResult<PageInfo<SysNewsType>> page(@Valid @RequestBody MusicTheorySearch query) {
+        query.setParentId(6L);
+        PageInfo<SysNewsType> pages = newsTypeService.queryPage( query);
+        return succeed(pages);
+    }
+
+
+    /**
+     * 新增
+     */
+    @PostMapping(value = "/save",  consumes="application/json", produces="application/json")
+    @ApiOperation(value = "乐理章节详情新增", httpMethod="POST", consumes="application/json", produces="application/json")
+    public HttpResponseResult<Boolean> save( @RequestBody SysNewsType newsType) {
+        if (newsType.getOrder() == null) {
+            return failed("排序不能为空");
+        }
+        if (StringUtil.isEmpty(newsType.getName())) {
+            return failed("章节名称不能为空");
+        }
+        newsType.setDelFlag(false);
+        newsType.setParentId(6L);
+        newsType.setCreateTime(new Date());
+        newsType.setUpdateTime(new Date());
+
+        return succeed(newsTypeService.insert(newsType) > 0);
+    }
+
+    /**
+     * 修改
+     */
+    @PostMapping(value =  "/update",  consumes="application/json", produces="application/json")
+    @ApiOperation(value = "乐理章节详情修改", httpMethod="POST", consumes="application/json", produces="application/json")
+    public HttpResponseResult<Boolean> update(  @RequestBody SysNewsType newsType) {
+        if (newsType.getOrder() == null) {
+            return failed("排序不能为空");
+        }
+        if (StringUtil.isEmpty(newsType.getName())) {
+            return failed("章节名称不能为空");
+        }
+        if (newsType.getId() == null) {
+            return failed("章节id不能为空");
+        }
+        newsType.setDelFlag(false);
+        newsType.setParentId(6L);
+        newsType.setUpdateTime(new Date());
+        return succeed(newsTypeService.update(newsType)>0);
+    }
+
+    /**
+     * 删除
+     */
+    @PostMapping("/remove/{id}")
+    @ApiOperation(value = "乐理章节详情逻辑删除", notes = "传入id")
+    public HttpResponseResult<Boolean> remove(@ApiParam(value = "编号", required = true) @PathVariable Long id) {
+        if (StringUtil.isEmpty(id)) {
+            return failed("参数不能为空");
+        }
+        SysNewsType sysNewsType = newsTypeService.get(id);
+        if (sysNewsType == null || sysNewsType.getParentId() != 6) {
+            return failed("未找到乐理章节");
+        }
+
+        return succeed(newsTypeService.delete(id) > 0);
+    }
+
+
+    /**
+     * 删除
+     */
+    @PostMapping("/app/page")
+    @ApiOperation(value = "app乐理知识")
+    public HttpResponseResult<PageInfo<SysNewsTypeDto>> appPage(@RequestBody QueryInfo query) {
+
+        return succeed(newsTypeService.appPage(query));
+    }
+
+
+}

+ 57 - 5
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/NewsController.java

@@ -6,6 +6,7 @@ import com.yonge.cooleshow.cms.dto.AppParam;
 import com.yonge.cooleshow.cms.dto.SysNewsInformationDto;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.page.PageInfo;
+import com.yonge.toolset.utils.string.StringUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
@@ -16,18 +17,13 @@ import java.util.List;
 import java.util.Map;
 
 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.*;
 
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.cms.controller.queryinfo.NewsInformationQueryInfo;
-import com.yonge.cooleshow.cms.dal.dao.StudentRegistrationDao;
-import com.yonge.cooleshow.cms.dal.dao.SysNewsInformationDao;
 import com.yonge.cooleshow.cms.dal.entity.SysNewsInformation;
 import com.yonge.cooleshow.cms.service.SysNewsInformationService;
-import com.yonge.cooleshow.cms.service.SysNewsTypeService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.toolset.log.model.AuditLogAnnotation;
 import com.yonge.toolset.utils.collection.MapUtil;
@@ -72,6 +68,10 @@ public class NewsController extends BaseController {
 		if (sysUser == null || sysUser.getId() == null) {
 			return failed("用户信息获取失败");
 		}
+		HttpResponseResult<Object> check = check(newsInfo);
+		if (!check.getStatus()) {
+			return check;
+		}
 		newsInfo.setStatus(NewsStatusEnum.HIDDEN);
 		newsInfo.setCreateTime(new Date());
 		newsInfo.setCreateBy(sysUser.getId());
@@ -80,6 +80,54 @@ public class NewsController extends BaseController {
 		return succeed(sysNewsInformationService.insert(newsInfo));
 	}
 
+	HttpResponseResult<Object> check(SysNewsInformation newsInfo) {
+
+		// 1 2 3 4 5 6
+		if (StringUtil.isEmpty(newsInfo.getTitle())) {
+			return failed("标题不能为空");
+		}
+		// 6
+		if (newsInfo.getSubType() == null && newsInfo.getType() == 6) {
+			return failed("章节不能为空");
+		}
+		// 1 2 3 4 5 6
+		if (StringUtil.isEmpty(newsInfo.getCoverImage())) {
+			return failed("封面不能为空");
+		}
+		// 1 4 6
+		if (newsInfo.getType() == 1 ||newsInfo.getType() == 4 || newsInfo.getType() == 6) {
+			if (newsInfo.getOrder() == null) {
+				return failed("排序值不能为空");
+			}
+		}
+
+		// 1 6
+		if (newsInfo.getType() == 1  || newsInfo.getType() == 6) {
+			if (StringUtil.isEmpty(newsInfo.getContent())) {
+				return failed("内容不能为空");
+			}
+		}
+		// 2 3 4
+		if (newsInfo.getType() == 2 ||newsInfo.getType() == 3 ||newsInfo.getType() == 4 ) {
+			if (newsInfo.getOnlineTime() == null || newsInfo.getOfflineTime() == null) {
+				return failed("生效时间不能为空");
+			}
+		}
+		// 2
+		if (newsInfo.getType() == 2) {
+			if (StringUtil.isEmpty(newsInfo.getAttribute2())) {
+				return failed("广告类型不能为空");
+			}
+			// 2
+			if (newsInfo.getShowTime() == null || newsInfo.getShowTime() < 1) {
+				return failed("显示时长不能为空且不能小于1秒");
+			}
+		}
+
+
+		return succeed();
+	}
+
 	@ApiOperation(value = "更新资讯/广告/闪页/轮播图 ", httpMethod="POST", consumes="application/json", produces="application/json")
 	@PostMapping(value = "/update",  consumes="application/json", produces="application/json")
 	@AuditLogAnnotation(operateName = "资讯更新",interfaceURL = "news/update")
@@ -97,6 +145,10 @@ public class NewsController extends BaseController {
 		if(NewsStatusEnum.SHOW.getCode().equals(sysNewsInformationDto.getStatus().getCode())) {
 			return failed("启用状态下,不可修改");
 		}
+		HttpResponseResult<Object> check = check(newsInfo);
+		if (!check.getStatus()) {
+			return check;
+		}
 		newsInfo.setUpdateTime(new Date());
 		newsInfo.setUpdateBy(sysUser.getId());
 

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

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

+ 4 - 0
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dal/dao/SysNewsTypeDao.java

@@ -1,13 +1,17 @@
 package com.yonge.cooleshow.cms.dal.dao;
 
 import java.util.List;
+import java.util.Map;
 
 import com.yonge.cooleshow.cms.dal.entity.SysNewsType;
 import com.yonge.cooleshow.cms.dal.entity.SysNewsTypeTree;
+import com.yonge.cooleshow.cms.dto.SysNewsTypeDto;
 import com.yonge.cooleshow.common.dal.BaseDAO;
 
 public interface SysNewsTypeDao extends BaseDAO<Long, SysNewsType> {
 
 	// 根据父级查询子集
 	List<SysNewsTypeTree> queryByParentId(Long parentId);
+
+    List<SysNewsTypeDto> queryAppPage(Map<String, Object> params);
 }

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

@@ -39,8 +39,8 @@ public class SysNewsInformation {
 	@NotNull(message = "类型不能为空")
 	private Integer type;
 	
-	@ApiModelProperty(value = "子类型  IMAGE:图片,VIDEO:视频 ", required = false)
-	private String subType;
+	@ApiModelProperty(value = "子类型  章节id ", required = false)
+	private Integer subType;
 
 	/** 状态(1-可见 0-不可见) */
 	@ApiModelProperty(value = "状态(1-启用 0-禁用)")
@@ -83,7 +83,8 @@ public class SysNewsInformation {
 
 	@ApiModelProperty("版本号")
 	private String attribute1;
-	
+
+	@ApiModelProperty("广告类型  IMAGE:图片,VIDEO:视频")
 	private String attribute2;
 	
 	private String subjectIdList;
@@ -226,11 +227,11 @@ public class SysNewsInformation {
 		this.delFlag = delFlag;
 	}
 
-	public String getSubType() {
+	public Integer getSubType() {
 		return subType;
 	}
 
-	public void setSubType(String subType) {
+	public void setSubType(Integer subType) {
 		this.subType = subType;
 	}
 

+ 16 - 0
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dal/entity/SysNewsType.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.cms.dal.entity;
 
+import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 /**
@@ -8,16 +9,24 @@ import org.apache.commons.lang3.builder.ToStringBuilder;
 public class SysNewsType {
 
 	/**  */
+	@ApiModelProperty("id")
 	private Long id;
 	
+
 	/**  */
+	@ApiModelProperty("名称")
 	private String name;
 	
 	/**  */
+	@ApiModelProperty("上级id")
 	private Long parentId;
 	
 	/**  */
+
 	private Boolean delFlag= false;
+
+	@ApiModelProperty("排序")
+	private Integer order;
 	
 	/**  */
 	private java.util.Date createTime;
@@ -78,4 +87,11 @@ public class SysNewsType {
 		return ToStringBuilder.reflectionToString(this);
 	}
 
+	public Integer getOrder() {
+		return order;
+	}
+
+	public void setOrder(Integer order) {
+		this.order = order;
+	}
 }

+ 1 - 0
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dto/SysNewsInformationDto.java

@@ -7,6 +7,7 @@ public class SysNewsInformationDto extends SysNewsInformation {
 
 	private String typeName;
 
+	@ApiModelProperty("子类型名称")
 	private String subTypeName;
 
 	@ApiModelProperty("更新人姓名")

+ 29 - 0
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dto/SysNewsTypeDto.java

@@ -0,0 +1,29 @@
+package com.yonge.cooleshow.cms.dto;
+
+import com.yonge.cooleshow.cms.dal.entity.SysNewsInformation;
+import com.yonge.cooleshow.cms.dal.entity.SysNewsType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-04-26
+ */
+@ApiModel("app乐理知识")
+public class SysNewsTypeDto extends SysNewsType {
+
+    @ApiModelProperty("乐理知识")
+    private List<SysNewsInformation> newsInformationList;
+
+    public List<SysNewsInformation> getNewsInformationList() {
+        return newsInformationList;
+    }
+
+    public void setNewsInformationList(List<SysNewsInformation> newsInformationList) {
+        this.newsInformationList = newsInformationList;
+    }
+}

+ 37 - 0
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dto/search/MusicTheorySearch.java

@@ -0,0 +1,37 @@
+package com.yonge.cooleshow.cms.dto.search;
+
+import com.yonge.cooleshow.common.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-04-26
+ */
+@ApiModel("乐理章节查询")
+public class MusicTheorySearch extends QueryInfo {
+
+    @ApiModelProperty("章节编号/名称")
+    private String search;
+
+    @ApiModelProperty("上级id")
+    private Long parentId;
+
+    public String getSearch() {
+        return search;
+    }
+
+    public void setSearch(String search) {
+        this.search = search;
+    }
+
+    public Long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+}

+ 5 - 0
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/service/SysNewsTypeService.java

@@ -4,6 +4,9 @@ import java.util.List;
 
 import com.yonge.cooleshow.cms.dal.entity.SysNewsType;
 import com.yonge.cooleshow.cms.dal.entity.SysNewsTypeTree;
+import com.yonge.cooleshow.cms.dto.SysNewsTypeDto;
+import com.yonge.cooleshow.common.page.PageInfo;
+import com.yonge.cooleshow.common.page.QueryInfo;
 import com.yonge.cooleshow.common.service.BaseService;
 
 public interface SysNewsTypeService extends BaseService<Long, SysNewsType> {
@@ -12,4 +15,6 @@ public interface SysNewsTypeService extends BaseService<Long, SysNewsType> {
 
 	//根据父级查询子集
 	List<SysNewsTypeTree> queryByParentId(Long parentId);
+
+	PageInfo<SysNewsTypeDto> appPage(QueryInfo query);
 }

+ 30 - 1
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/service/impl/SysNewsTypeServiceImpl.java

@@ -1,7 +1,15 @@
 package com.yonge.cooleshow.cms.service.impl;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
+import com.yonge.cooleshow.cms.dal.entity.SysNewsInformation;
+import com.yonge.cooleshow.cms.dto.SysNewsTypeDto;
+import com.yonge.cooleshow.common.page.PageInfo;
+import com.yonge.cooleshow.common.page.QueryInfo;
+import com.yonge.toolset.utils.collection.MapUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -45,5 +53,26 @@ public class SysNewsTypeServiceImpl extends BaseServiceImpl<Long, SysNewsType>
 		}
 		return sysNewsTypeDao.queryByParentId(parentId);
 	}
-	
+
+    @Override
+    public PageInfo<SysNewsTypeDto> appPage(QueryInfo query) {
+		PageInfo<SysNewsTypeDto> pageInfo = new PageInfo<>(query.getPage(), query.getRows());
+		Map<String, Object> params = new HashMap<>();
+		MapUtil.populateMap(params, query);
+
+		List<SysNewsTypeDto> dataList = null;
+		int count = sysNewsTypeDao.queryCount(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = sysNewsTypeDao.queryAppPage(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+
+    }
+
 }

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

@@ -33,6 +33,7 @@
 	
 	<resultMap type="com.yonge.cooleshow.cms.dto.SysNewsInformationDto" id="SysNewsInformationDto" extends="SysNewsInformation">
 		<result column="updateName" property="updateName" />
+		<result column="subTypeName" property="subTypeName" />
 	</resultMap>
 	
 	<sql id="queryCondition">
@@ -41,7 +42,7 @@
 			<if test="type != null">
 				and sni.type_ = #{type}
 			</if>
-			<if test="subType != null and subType != ''">
+			<if test="subType != null">
 				and sni.sub_type_ = #{subType}
 			</if>
 			<if test="status != null">
@@ -168,10 +169,12 @@
 	<select id="selectPage" resultMap="SysNewsInformationDto" parameterType="map">
 		SELECT sni.*
 		, su.username_ as updateName
+		, snt.name_ as subTypeName
 		FROM sys_news_information sni
+		left join sys_news_type snt on snt.id_ = sni.sub_type_
 		left join sys_user su on sni.update_by_ = su.id_
 		<include refid="queryCondition" />
-		order by sni.status_ desc,sni.order_ desc,sni.update_time_ desc
+		order by sni.status_ desc,sni.order_,sni.update_time_ desc
 		<include refid="global.limit"/>
 	</select>
 	
@@ -227,7 +230,7 @@
 				and find_in_set(#{subjectId},sni.subject_id_list_)
 			</if>
 		group by sni.id_
-		order by sni.status_ desc,sni.order_ desc,sni.update_time_ desc
+		order by sni.status_ desc,sni.order_,sni.update_time_ desc
 		<include refid="global.limit" />
 	</select>
 

+ 76 - 4
cooleshow-cms/src/main/resources/config/mybatis/SysNewsTypeMapper.xml

@@ -8,6 +8,7 @@
 		<result column="name_" property="name" />
 		<result column="parent_id_" property="parentId" />
 		<result column="del_flag_" property="delFlag" />
+		<result column="order_" property="order" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
 	</resultMap>
@@ -31,8 +32,8 @@
 	<insert id="insert" parameterType="com.yonge.cooleshow.cms.dal.entity.SysNewsType"
 		useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO sys_news_type
-		(id_,name_,parent_id_,del_flag_,create_time_,update_time_)
-		VALUES(#{id},#{name},#{parentId},#{delFlag},#{createTime},#{updateTime})
+		(id_,name_,parent_id_,del_flag_,create_time_,update_time_,order_)
+		VALUES(#{id},#{name},#{parentId},#{delFlag},#{createTime},#{updateTime},#{order})
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->
@@ -57,27 +58,98 @@
 			<if test="createTime != null">
 				create_time_ = #{createTime},
 			</if>
+			<if test="order != null">
+				order_ = #{order}
+			</if>
 		</set>
 		WHERE id_ = #{id}
 	</update>
 
 	<!-- 根据主键删除一条记录 -->
 	<delete id="delete">
-		DELETE FROM sys_news_type WHERE id_ = #{id}
+		update sys_news_type set del_flag_ = 1 WHERE id_ = #{id}
 	</delete>
 
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="SysNewsType" parameterType="map">
-		SELECT * FROM sys_news_type ORDER BY id_
+		SELECT * FROM sys_news_type
+
+		<include refid="queryCondition" />
+		ORDER BY order_ , id_
 		<include refid="global.limit" />
 	</select>
 
 	<!-- 查询当前表的总记录数 -->
 	<select id="queryCount" resultType="int">
 		SELECT COUNT(*) FROM sys_news_type
+		<include refid="queryCondition" />
 	</select>
 	
 	<select id="queryByParentId" resultMap="SysNewsTypeTree">
 		SELECT * FROM sys_news_type where parent_id_ = #{parentId}
 	</select>
+
+	<sql id="queryCondition">
+		<where>
+			del_flag_ = 0
+			<if test="search != null and searcer != ''">
+				and (id_ like concat('%',#{search},'%') or name_ like concat('%',#{search},'%'))
+			</if>
+			<if test="parentId != null">
+				and parent_id_ = #{parentId}
+			</if>
+		</where>
+	</sql>
+
+	<select id="queryAppPage" resultMap="SysNewsTypeDto">
+		SELECT snt.id_ as sntId
+		,snt.name_ as name,
+		snt.parent_id_ as parentId,
+		snt.order_ as sntOrder,
+		snt.del_flag_ as sntDelFlag,
+		snt.create_time_ as createTime,
+		snt.update_time_ as updateTime,
+		sni.*
+		FROM sys_news_type snt
+		left join sys_news_information sni on sni.sub_type_ = snt.id_
+		where snt.del_flag_ = 0 and snt.parent_id_ = 6 and sni.del_flag_ = 0 and sni.status_ = 1
+		ORDER BY snt.order_ , sni.order_
+		<include refid="global.limit" />
+	</select>
+
+	<resultMap type="com.yonge.cooleshow.cms.dto.SysNewsTypeDto" id="SysNewsTypeDto">
+
+		<result column="sntId" property="id" />
+		<result column="name" property="name" />
+		<result column="parentId" property="parentId" />
+		<result column="sntOrder" property="order" />
+		<result column="sntDelFlag" property="delFlag" />
+		<result column="createTime" property="createTime" />
+		<result column="updateTime" property="updateTime" />
+
+		<collection property="newsInformationList"  ofType="com.yonge.cooleshow.cms.dal.entity.SysNewsInformation">
+			<result column="id_" property="id" />
+			<result column="title_" property="title" />
+			<result column="content_" property="content" />
+			<result column="cover_image_" property="coverImage" />
+			<result column="video_cover_image_" property="videoCoverImage" />
+			<result column="link_url_" property="linkUrl"/>
+			<result column="type_" property="type"/>
+			<result column="online_time_" property="onlineTime"/>
+			<result column="offline_time_" property="offlineTime"/>
+			<result column="sub_type_" property="subType"/>
+			<result column="status_" property="status" typeHandler="com.yonge.cooleshow.common.dal.CustomEnumTypeHandler" />
+			<result column="create_time_" property="createTime" />
+			<result column="update_time_" property="updateTime" />
+			<result column="del_flag_" property="delFlag" />
+			<result column="href_target_" property="hrefTarget" />
+			<result column="order_" property="order" />
+			<result column="memo_" property="memo" />
+			<result column="attribute1_" property="attribute1" />
+			<result column="attribute2_" property="attribute2" />
+			<result column="show_time_" property="showTime" />
+			<result column="update_by_" property="updateBy" />
+			<result column="create_by_" property="createBy" />
+		</collection>
+	</resultMap>
 </mapper>

+ 42 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/AdminStatisticalController.java

@@ -0,0 +1,42 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.yonge.cooleshow.admin.dto.search.UserStatisticalSearch;
+import com.yonge.cooleshow.admin.service.OmsOrderService;
+import com.yonge.cooleshow.mall.common.api.CommonResult;
+import com.yonge.cooleshow.mbg.model.CmsPrefrenceArea;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-04-26
+ */
+@Controller
+@Api(tags = "首页商城统计")
+@RequestMapping("/statistical")
+public class AdminStatisticalController {
+
+    @Autowired
+    private OmsOrderService orderService;
+
+
+    @ApiOperation("商城用户统计")
+    @RequestMapping(value = "/user", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult<List<CmsPrefrenceArea>> userStatistical(@RequestBody UserStatisticalSearch search) {
+
+        orderService.userStatistical(search);
+        return CommonResult.failed();
+
+    }
+}

+ 3 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dao/OmsOrderDao.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.admin.dao;
 import com.yonge.cooleshow.admin.dto.OmsOrderDeliveryParam;
 import com.yonge.cooleshow.admin.dto.OmsOrderDetail;
 import com.yonge.cooleshow.admin.dto.OmsOrderQueryParam;
+import com.yonge.cooleshow.admin.dto.search.UserStatisticalSearch;
 import com.yonge.cooleshow.mbg.model.OmsOrder;
 import org.apache.ibatis.annotations.Param;
 
@@ -27,4 +28,6 @@ public interface OmsOrderDao {
      * 获取订单详情
      */
     OmsOrderDetail getDetail(@Param("id") Long id);
+
+    void userStatistical(@Param("search") UserStatisticalSearch search);
 }

+ 47 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dto/search/UserStatisticalSearch.java

@@ -0,0 +1,47 @@
+package com.yonge.cooleshow.admin.dto.search;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-04-26
+ */
+@ApiModel("admin首页商城用户统计查询参数")
+public class UserStatisticalSearch {
+
+    @ApiModelProperty("类型 YEAR:年度 MONTH:月度")
+    private String type;
+
+    @ApiModelProperty("年")
+    private Integer year;
+
+    @ApiModelProperty("月")
+    private Integer month;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Integer getYear() {
+        return year;
+    }
+
+    public void setYear(Integer year) {
+        this.year = year;
+    }
+
+    public Integer getMonth() {
+        return month;
+    }
+
+    public void setMonth(Integer month) {
+        this.month = month;
+    }
+}

+ 8 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/OmsOrderService.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.admin.service;
 
 import com.yonge.cooleshow.admin.dto.*;
+import com.yonge.cooleshow.admin.dto.search.UserStatisticalSearch;
 import com.yonge.cooleshow.mbg.model.OmsOrder;
 import com.yonge.cooleshow.admin.dto.*;
 import org.springframework.transaction.annotation.Transactional;
@@ -56,4 +57,11 @@ public interface OmsOrderService {
      */
     @Transactional
     int updateNote(Long id, String note, Integer status);
+
+    /**
+     * 商城用户统计
+     *
+     * @param search 参数
+     */
+    void userStatistical(UserStatisticalSearch search);
 }

+ 6 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderServiceImpl.java

@@ -4,6 +4,7 @@ import com.github.pagehelper.PageHelper;
 import com.yonge.cooleshow.admin.dao.OmsOrderDao;
 import com.yonge.cooleshow.admin.dao.OmsOrderOperateHistoryDao;
 import com.yonge.cooleshow.admin.dto.*;
+import com.yonge.cooleshow.admin.dto.search.UserStatisticalSearch;
 import com.yonge.cooleshow.mbg.mapper.OmsOrderMapper;
 import com.yonge.cooleshow.mbg.mapper.OmsOrderOperateHistoryMapper;
 import com.yonge.cooleshow.mbg.model.OmsOrder;
@@ -151,4 +152,9 @@ public class OmsOrderServiceImpl implements OmsOrderService {
         orderOperateHistoryMapper.insert(history);
         return count;
     }
+
+    @Override
+    public void userStatistical(UserStatisticalSearch search) {
+        orderDao.userStatistical(search);
+    }
 }

+ 4 - 0
cooleshow-mall/mall-admin/src/main/resources/config/mybatis/OmsOrderDao.xml

@@ -87,4 +87,8 @@
             o.id = #{id}
         ORDER BY oi.id ASC,oh.create_time DESC
     </select>
+
+    <select id="userStatistical" resultType="void">
+
+    </select>
 </mapper>

+ 2 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/config/ResourceServerConfig.java

@@ -24,6 +24,8 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
     @Override
     public void configure(HttpSecurity http) throws Exception {
         http.csrf().disable().exceptionHandling().accessDeniedHandler(baseAccessDeniedHandler).authenticationEntryPoint(baseAuthenticationEntryPoint).and()
+            .authorizeRequests().antMatchers("/task/**").hasIpAddress("0.0.0.0/0")
+                .and()
                 .authorizeRequests().antMatchers("/wechat/*","/v2/api-docs", "/code/*").permitAll().anyRequest().permitAll().and().httpBasic();
     }
 

+ 1 - 22
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/PracticeTeacherSearch.java

@@ -16,12 +16,7 @@ public class PracticeTeacherSearch extends QueryInfo {
     @ApiModelProperty(value = "老师名称")
     private String search;
 
-    @ApiModelProperty(value = "排序字段(starGrade,expTime,subjectPrice)")
-    private String sortField;
-
-    @ApiModelProperty(value = "排序规则(升序:ASC 降序:DESC)")
-    private String collation;
-
+    @ApiModelProperty(value = "排序字段(starGrade,expTime,subjectPrice) 排序规则(升序:ASC 降序:DESC)")
     private String sort;
 
     @Override
@@ -51,20 +46,4 @@ public class PracticeTeacherSearch extends QueryInfo {
     public void setSearch(String search) {
         this.search = search;
     }
-
-    public String getSortField() {
-        return sortField;
-    }
-
-    public void setSortField(String sortField) {
-        this.sortField = sortField;
-    }
-
-    public String getCollation() {
-        return collation;
-    }
-
-    public void setCollation(String collation) {
-        this.collation = collation;
-    }
 }

+ 5 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/ImGroupMemberAuditQueryInfo.java

@@ -4,6 +4,7 @@ import com.yonge.cooleshow.biz.dal.enums.AuditStatusEnum;
 import com.yonge.cooleshow.common.page.QueryInfo;
 import io.swagger.annotations.ApiModelProperty;
 
+import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 
 public class ImGroupMemberAuditQueryInfo extends QueryInfo {
@@ -14,15 +15,15 @@ public class ImGroupMemberAuditQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "用户编号")
     private Long userId;
 
-    @NotNull(message = "群编号不可为空")
+    @NotBlank(message = "群编号不可为空")
     @ApiModelProperty(value = "群编号")
-    private Long groupId;
+    private String groupId;
 
-    public Long getGroupId() {
+    public String getGroupId() {
         return groupId;
     }
 
-    public void setGroupId(Long groupId) {
+    public void setGroupId(String groupId) {
         this.groupId = groupId;
     }
 

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

@@ -9,6 +9,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseCalendarEntity;
 import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
+import com.yonge.cooleshow.biz.dal.entity.TeacherSubjectPrice;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -185,5 +186,7 @@ public interface CourseScheduleService extends IService<CourseSchedule> {
     void courseAdjust(CourseAdjustVo adjustVo);
 
     StudentHomePage queryLiveAndVideo();
+
+    TeacherSubjectPrice teacherSubjectPrice(Long teacherId, Long subjectId);
 }
 

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

@@ -32,6 +32,7 @@ import com.yonge.cooleshow.common.page.PageInfo;
 import com.yonge.toolset.utils.date.DateUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.annotations.Param;
 import org.redisson.api.RMap;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -216,7 +217,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      *              <p> - teacherId 老师id
      *              <p> - year 年
      *              <p> - month 月
-     *              <p> - singleCourseMinutes 单课时时长(包含休息时间)
+     *              <p> - singleCourseMinutes 单课时时长(不包含休息时间)
+     *              <p> - freeCourseMinutes 单课时休息时长
      * @return 返回传入时间当月每日的剩余时间段
      */
     public List<CourseCalendarEntity> createLiveCourseCalendar(Map<String, Object> param) {
@@ -225,6 +227,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         Integer year = WrapperUtil.toInt(param, "year", "日历的时间年份不能为空!");
         Integer month = WrapperUtil.toInt(param, "month", "日历的时间月份不能为空!");
         Integer singleCourseMinutes = WrapperUtil.toInt(param, "singleCourseMinutes", "单课时时长不能为空!");
+        Integer freeCourseMinutes = WrapperUtil.toInt(param, "freeCourseMinutes");
         if (singleCourseMinutes < 25) {
             throw new BizException("单课时时长不能小于25分钟!");
         }
@@ -235,7 +238,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         //获取老师的课程  key:日期-年月日 value:课程时间-开始时间,结束时间
         Map<String, List<CourseTimeEntity>> nowCourseMap = getTeacherCourseTime(teacherId, firstDay.toString(), lastDay.toString());
         //生成日历数据
-        List<CourseCalendarEntity> courseCalendarEntities = generateCourseData(firstDay, lastDay, singleCourseMinutes);
+        List<CourseCalendarEntity> courseCalendarEntities = generateCourseData(firstDay, lastDay, singleCourseMinutes, freeCourseMinutes);
         //对比课程数据,筛选出空余的课程时间
         opsCourseCalendarData(nowCourseMap, courseCalendarEntities, 0);
         return courseCalendarEntities;
@@ -314,8 +317,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * @param firstDay            开始日期年月日
      * @param lastDay             最后一天的日期年月日
      * @param singleCourseMinutes 单结课时长
+     * @param freeCourseMinutes   单课时休息时长
      */
-    public List<CourseCalendarEntity> generateCourseData(LocalDate firstDay, LocalDate lastDay, Integer singleCourseMinutes) {
+    public List<CourseCalendarEntity> generateCourseData(LocalDate firstDay, LocalDate lastDay, Integer singleCourseMinutes, Integer freeCourseMinutes) {
         //获取上课的最早时间和最晚时间,将每日时间切片
         String sysStartTime = sysConfigService.findConfigValue(SysConfigConstant.COURSE_START_SETTING);
         String sysEndTime = sysConfigService.findConfigValue(SysConfigConstant.COURSE_END_SETTING);
@@ -329,7 +333,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         //每日日期数据
         List<CourseCalendarEntity> list = new ArrayList<>();
         //生成每日课程时间段 -根据单节课时长 及每日最早最晚时间 生成一天的时间切片
-        List<CourseTimeEntity> dayTime = generateDayTime(singleCourseMinutes, dayStartTime, dayEndTime);
+        List<CourseTimeEntity> dayTime = generateDayTime(singleCourseMinutes, freeCourseMinutes, dayStartTime, dayEndTime);
         int addDay = 0;
         //获取每日日期数据
         while (firstDay.isBefore(lastDay) || firstDay.isEqual(lastDay)) {
@@ -352,10 +356,11 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      * <p>根据单节课时长 及每日最早最晚时间 生成一天的时间切片
      *
      * @param singleCourseMinutes 单节课时长
+     * @param freeCourseMinutes   单课时休息时长
      * @param startTime           每日最早上课时间
      * @param endTime             每日最晚下课时间
      */
-    public List<CourseTimeEntity> generateDayTime(Integer singleCourseMinutes, Date startTime, Date endTime) {
+    public List<CourseTimeEntity> generateDayTime(Integer singleCourseMinutes, Integer freeCourseMinutes, Date startTime, Date endTime) {
         List<CourseTimeEntity> result = new ArrayList<>();
         //划分每日课程时间
         Date edate = startTime;
@@ -369,6 +374,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
                 //加时间得到课程结束时间
                 edate = DateUtil.addMinutes(edate, singleCourseMinutes);
                 timeEntity.setEndTime(edate);
+                //再加上单节课休息时间
+                edate = DateUtil.addMinutes(edate, freeCourseMinutes);
                 result.add(timeEntity);
             }
         }
@@ -741,13 +748,6 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
      */
     @Override
     public IPage<PracticeTeacherVo> teacherList(IPage<PracticeTeacherVo> page, PracticeTeacherSearch search) {
-        String collation = search.getCollation();//排序规则
-        String sortField = search.getSortField();//排序字段
-        if (StringUtils.isNotBlank(sortField)) {
-            if (StringUtils.isNotBlank(collation)) {
-                search.setSort(sortField + " " + collation);
-            } else search.setSort(sortField);
-        }
         return page.setRecords(baseMapper.teacherList(page, search));
     }
 
@@ -976,4 +976,13 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         homePage.setVideoList(baseMapper.selectVideo());
         return homePage;
     }
+
+    /**
+     * @Description: 查询老师陪练课配置
+     * @Author: cy
+     * @Date: 2022/4/26
+     */
+    public TeacherSubjectPrice teacherSubjectPrice(Long teacherId,Long subjectId){
+        return teacherFreeTimeDao.selectSubjectPrice(teacherId,subjectId);
+    }
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/support/WrapperUtil.java

@@ -35,7 +35,7 @@ public class WrapperUtil {
         Optional<O> o = Optional.ofNullable(map)
                 .map(m -> m.get(str));
         return intOptional(o)
-                .orElse(null);
+                .orElse(0);
     }
 
     public static <S, O> Long toLong(Map<S, O> map, S str, String exMsg) {

+ 17 - 18
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -322,28 +322,27 @@
     </select>
     <select id="teacherList" resultType="com.yonge.cooleshow.biz.dal.vo.PracticeTeacherVo">
         SELECT
-            cs.teacher_id_ AS teacherId,
-            u.username_ AS userName,
-            u.avatar_ AS avatar,
+        t.user_id_ AS teacherId,
+        u.username_ AS userName,
+        u.avatar_ AS avatar,
 
-            tt.star_grade_ AS starGrade,
-            tt.exp_time_ AS expTime,
-            t.graduate_school_ AS school,
-            t.subject_ AS schoolSubject,
+        tt.star_grade_ AS starGrade,
+        tt.exp_time_ AS expTime,
+        t.graduate_school_ AS school,
+        t.subject_ AS schoolSubject,
 
-            (SELECT group_concat(p.subject_name_) FROM teacher_subject_price p WHERE find_in_set(cs.teacher_id_,p.teacher_id_)) AS configSubject,
-            sp.subject_id_ AS subjectId,
-            sp.subject_name_ AS subjectName,
-            sp.subject_price_ AS subjectPrice,
-            sp.course_minutes_ AS courseMinutes
+        (SELECT group_concat(p.subject_name_) FROM teacher_subject_price p WHERE find_in_set(t.user_id_,p.teacher_id_)) AS configSubject,
+        sp.subject_id_ AS subjectId,
+        sp.subject_name_ AS subjectName,
+        sp.subject_price_ AS subjectPrice,
+        sp.course_minutes_ AS courseMinutes
 
-        FROM course_schedule cs
-        LEFT JOIN sys_user u ON cs.teacher_id_ = u.id_
-        LEFT JOIN teacher_total tt ON cs.teacher_id_=tt.user_id_
-        LEFT JOIN teacher t ON cs.teacher_id_=t.user_id_
-        LEFT JOIN teacher_subject_price sp ON cs.teacher_id_=sp.teacher_id_
+        FROM teacher t
+        LEFT JOIN sys_user u ON t.user_id_ = u.id_
+        LEFT JOIN teacher_total tt ON t.user_id_=tt.user_id_
+        LEFT JOIN teacher_subject_price sp ON t.user_id_=sp.teacher_id_
 
-        WHERE cs.type_='PRACTICE'
+        WHERE t.user_id_ IN (SELECT teacher_id_ FROM teacher_free_time GROUP BY teacher_id_)
         <if test="param.subjectId !=null">
             AND sp.subject_id_=#{param.subjectId}
         </if>

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

@@ -5,7 +5,9 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
+import com.yonge.cooleshow.biz.dal.entity.CourseCalendarEntity;
 import com.yonge.cooleshow.biz.dal.entity.CourseScheduleReplied;
+import com.yonge.cooleshow.biz.dal.entity.TeacherSubjectPrice;
 import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 import com.yonge.cooleshow.biz.dal.service.CourseRepliedService;
 import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
@@ -23,6 +25,8 @@ import org.springframework.http.HttpStatus;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.validation.constraints.NotNull;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -91,7 +95,7 @@ public class StudentCourseScheduleController extends BaseController {
         return succeed(courseScheduleService.queryCourseScheduleStudent(search));
     }
 
-    @ApiOperation("学生端-首页-陪练课老师列表")
+    @ApiOperation(value = "学生端-首页-陪练课老师列表", notes = "search:{\"subjectId\":null,\"search\":\"\",\"sort\":\"starGrade ASC,expTime DESC,subjectPrice DESC\"}")
     @PostMapping("/teacherList")
     public HttpResponseResult<PageInfo<PracticeTeacherVo>> teacherList(@RequestBody PracticeTeacherSearch search) {
         IPage<PracticeTeacherVo> pages = courseScheduleService.teacherList(PageUtil.getPage(search), search);
@@ -128,5 +132,24 @@ public class StudentCourseScheduleController extends BaseController {
     public HttpResponseResult<StudentHomePage> queryLiveAndVideo() {
         return succeed(courseScheduleService.queryLiveAndVideo());
     }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "teacherId", dataType = "Long", value = "老师id"),
+            @ApiImplicitParam(name = "studentId", dataType = "Long", value = "学生id"),
+            @ApiImplicitParam(name = "year", dataType = "Integer", value = "年"),
+            @ApiImplicitParam(name = "month", dataType = "Integer", value = "月"),
+            @ApiImplicitParam(name = "day", dataType = "Integer", value = "日"),
+    })
+    @ApiOperation("陪练课日历-用于学生购买指定老师陪练课")
+    @PostMapping("/createPracticeCourseCalendar")
+    public HttpResponseResult<List<CourseCalendarEntity>> generatePracticeCourseCalender(@RequestBody Map<String, Object> param) {
+        return succeed(courseScheduleService.createPracticeCourseCalender(param));
+    }
+
+    @ApiOperation("查询老师陪练课配置")
+    @GetMapping("/getTeacherSubjectPrice")
+    public HttpResponseResult<TeacherSubjectPrice> getTeacherSubjectPrice(@NotNull Long teacherId, @NotNull Long subjectId) {
+        return succeed(courseScheduleService.teacherSubjectPrice(teacherId, subjectId));
+    }
 }
 

+ 2 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherCourseScheduleController.java

@@ -64,7 +64,8 @@ public class TeacherCourseScheduleController extends BaseController {
             @ApiImplicitParam(name = "year", dataType = "Integer", value = "年"),
             @ApiImplicitParam(name = "month", dataType = "Integer", value = "月"),
             @ApiImplicitParam(name = "day", dataType = "Integer", value = "日"),
-            @ApiImplicitParam(name = "singleCourseMinutes", dataType = "Integer", value = "单课时时长(包含休息时间)"),
+            @ApiImplicitParam(name = "singleCourseMinutes", dataType = "Integer", value = "单课时时长(不包含休息时间)"),
+            @ApiImplicitParam(name = "freeCourseMinutes", dataType = "Integer", value = "单课时休息时长)"),
             @ApiImplicitParam(name = "teacherId", dataType = "Long", value = "老师id"),
     })
     @ApiOperation("直播课创建时的日历数据")