Browse Source

add:公告消息发送

liujunchi 2 years ago
parent
commit
be012a3332
22 changed files with 363 additions and 38 deletions
  1. 35 2
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/HelpCenterContentController.java
  2. 25 2
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dal/dao/HelpCenterContentDao.java
  3. 22 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dal/entity/HelpCenterContent.java
  4. 17 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/service/HelpCenterContentService.java
  5. 3 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/service/impl/HelpCenterCatalogServiceImpl.java
  6. 33 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/service/impl/HelpCenterContentServiceImpl.java
  7. 4 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/service/impl/SysNewsInformationServiceImpl.java
  8. 59 0
      cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/task/NoticeReleaseTask.java
  9. 63 4
      cooleshow-cms/src/main/resources/config/mybatis/HelpCenterContentMapper.xml
  10. 25 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/feign/CmsFeignService.java
  11. 17 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/feign/fallback/CmsFeignServiceFallback.java
  12. 23 0
      cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/NoticeReleaseTask.java
  13. 6 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/SysMessageQueryInfo.java
  14. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysMessage.java
  15. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageSendMode.java
  16. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/SendStatusEnum.java
  17. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseHomeworkServiceImpl.java
  18. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMessageServiceImpl.java
  19. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml
  20. 3 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMessageMapper.xml
  21. 8 9
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/SysMessageController.java
  22. 8 9
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/SysMessageController.java

+ 35 - 2
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/controller/HelpCenterContentController.java

@@ -57,16 +57,27 @@ public class HelpCenterContentController extends BaseController {
 		if (helpContent == null) {
 			return failed("参数输入有误");
 		}
+		if (helpContent.getCatalogId() == 2 &&helpContent.getReleaseTime() == null) {
+			return failed("发布时间不能为空");
+		}
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if (sysUser == null || sysUser.getId() == null) {
 			return failed("用户信息获取失败");
 		}
+		helpContent.setReleaseStatus(0);
 		if (helpContent.getId() != null && helpContent.getId() > 0) {
 
 			HelpCenterContent helpCenterContent = helpCenterContentService.get(helpContent.getId());
 			if (helpCenterContent == null) {
 				return failed("未找到相关信息");
 			}
+
+			if (helpCenterContent.getCatalogId() ==2) {
+				if (helpCenterContent.getReleaseStatus() == 1) {
+					return failed("公告已发布不能修改");
+				}
+			}
+
 			if (helpCenterContent.getStatus() == 1) {
 				return failed("启用状态下,不能修改");
 			}
@@ -77,10 +88,10 @@ public class HelpCenterContentController extends BaseController {
 			return helpCenterContentService.update(helpContent) > 0 ? succeed() : failed("修改失败");
 		} else {
 			if (StringUtils.isBlank(helpContent.getContent())) {
-				return failed("帮助内容不能为空");
+				return failed("内容不能为空");
 			}
 			if (StringUtils.isBlank(helpContent.getTitle())) {
-				return failed("帮助中心标题不能为空");
+				return failed("标题不能为空");
 			}
 			if (helpContent.getCatalogId() < 0) {
 				return failed("请设置分类");
@@ -104,6 +115,11 @@ public class HelpCenterContentController extends BaseController {
 		if (helpCenterContent == null) {
 			return failed("未找到相关信息");
 		}
+		if (helpCenterContent.getCatalogId() ==2) {
+			if (helpCenterContent.getReleaseStatus() == 1) {
+				return failed("公告已发布不能修改");
+			}
+		}
 		if (helpCenterContent.getStatus() == 1) {
 			return failed("启用状态下,不能删除");
 		}
@@ -120,6 +136,23 @@ public class HelpCenterContentController extends BaseController {
 		if (helpCenterContent == null) {
 			return failed("未找到相关信息");
 		}
+		if (helpCenterContent.getCatalogId() == 2) {
+			return failed("公告不可禁用");
+		}
 		return succeed(helpCenterContentService.status(id));
 	}
+
+
+	@ApiOperation("发布公告")
+	@PostMapping(value = "release/{id}")
+	@ApiImplicitParam(name = "id", value = "编号", required = true, dataType = "Integer", paramType = "path")
+	public Object releaseNotice(@PathVariable("id") Long id) {
+		if (id == null || id <= 0)
+			return failed("ID解析失败");
+		HelpCenterContent helpCenterContent = helpCenterContentService.get(id);
+		if (helpCenterContent == null) {
+			return failed("未找到相关信息");
+		}
+		return succeed(helpCenterContentService.noticeRelease(helpCenterContent));
+	}
 }

+ 25 - 2
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dal/dao/HelpCenterContentDao.java

@@ -1,15 +1,38 @@
 package com.yonge.cooleshow.cms.dal.dao;
 
+import java.util.List;
 import java.util.Map;
 
 import com.yonge.cooleshow.cms.dal.entity.HelpCenterContent;
 import com.yonge.toolset.mybatis.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
 
 public interface HelpCenterContentDao extends BaseDAO<Long, HelpCenterContent> {
 
-	public int updateContentByCatalog(Map<String, Object> map);
+    public int updateContentByCatalog(Map<String, Object> map);
 
-	public int deleteContentByCatalog(Long catalogId);
+    public int deleteContentByCatalog(Long catalogId);
 
     void status(Long id);
+
+    /**
+     * 发送公告到老师
+     *
+     * @param helpCenterContent
+     */
+    void noticeReleaseToTeacher(@Param("param") HelpCenterContent helpCenterContent);
+
+    /**
+     * 发送公告到学生
+     *
+     * @param helpCenterContent
+     */
+    void noticeReleaseToStudent(@Param("param") HelpCenterContent helpCenterContent);
+
+    /**
+     * 查询将要发布的公告 (0 ~ 当前时间 + 5 min 的未发布的公告) 循环发布
+     *
+     * @return
+     */
+    List<HelpCenterContent> selectNeedReleaseNotice();
 }

+ 22 - 0
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/dal/entity/HelpCenterContent.java

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
+import java.util.Date;
 
 public class HelpCenterContent {
 
@@ -18,6 +19,12 @@ public class HelpCenterContent {
 	@NotBlank(message = "正文不能为空")
 	private String content = "";
 
+	@ApiModelProperty("发布时间")
+	private Date releaseTime;
+
+	@ApiModelProperty("发布状态 0:未发布 1:已发布")
+	private Integer releaseStatus;
+
 	@ApiModelProperty(value = "父分类ID,1:帮助中心,2:公告管理",required = true)
 	@NotNull(message = "分类不能为空 ")
 	private Long catalogId;
@@ -158,4 +165,19 @@ public class HelpCenterContent {
 		return buf.toString();
 	}
 
+	public Date getReleaseTime() {
+		return releaseTime;
+	}
+
+	public void setReleaseTime(Date releaseTime) {
+		this.releaseTime = releaseTime;
+	}
+
+	public Integer getReleaseStatus() {
+		return releaseStatus;
+	}
+
+	public void setReleaseStatus(Integer releaseStatus) {
+		this.releaseStatus = releaseStatus;
+	}
 }

+ 17 - 0
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/service/HelpCenterContentService.java

@@ -3,6 +3,8 @@ package com.yonge.cooleshow.cms.service;
 import com.yonge.cooleshow.cms.dal.entity.HelpCenterContent;
 import com.yonge.toolset.mybatis.service.BaseService;
 
+import java.util.List;
+
 public interface HelpCenterContentService extends BaseService<Long,HelpCenterContent> {
 	
 	public boolean updateContentByCatalog(Long catalogId,Integer status);
@@ -10,4 +12,19 @@ public interface HelpCenterContentService extends BaseService<Long,HelpCenterCon
 	public boolean deleteContentByCatalog(Long catalogId);
 
     boolean status(Long id);
+
+    /**
+     * 发布公告
+     *
+     * @param helpCenterContent
+     * @return
+     */
+    boolean noticeRelease(HelpCenterContent helpCenterContent);
+
+    /**
+     * 查询将要发布的公告 (0 ~ 当前时间 + 5 min 的未发布的公告) 循环发布
+     *
+     * @return
+     */
+    List<HelpCenterContent> getNeedReleaseNotice();
 }

+ 3 - 0
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/service/impl/HelpCenterCatalogServiceImpl.java

@@ -11,6 +11,7 @@ import com.yonge.cooleshow.cms.dal.entity.HelpCenterCatalog;
 import com.yonge.cooleshow.cms.service.HelpCenterCatalogService;
 import com.yonge.cooleshow.cms.service.HelpCenterContentService;
 import com.yonge.toolset.mybatis.dal.BaseDAO;
+import org.springframework.transaction.annotation.Transactional;
 
 @Service
 public class HelpCenterCatalogServiceImpl extends BaseServiceImpl<Long, HelpCenterCatalog> implements HelpCenterCatalogService {
@@ -39,11 +40,13 @@ public class HelpCenterCatalogServiceImpl extends BaseServiceImpl<Long, HelpCent
 		return dataList;
 	}
 
+	@Transactional
 	public boolean updateCatalog(HelpCenterCatalog catalog) {
 		return helpCenterCatalogDao.update(catalog) > 0 && helpCenterContentService.updateContentByCatalog(catalog.getId(), catalog.getStatus());
 	}
 
 	@Override
+	@Transactional
 	public boolean deleteCatalog(Long id) {
 		return helpCenterCatalogDao.delete(id) > 0 && helpCenterContentService.deleteContentByCatalog(id);
 	}

+ 33 - 0
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/service/impl/HelpCenterContentServiceImpl.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.cms.service.impl;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import com.yonge.toolset.mybatis.service.impl.BaseServiceImpl;
@@ -11,6 +12,7 @@ import com.yonge.cooleshow.cms.dal.dao.HelpCenterContentDao;
 import com.yonge.cooleshow.cms.dal.entity.HelpCenterContent;
 import com.yonge.cooleshow.cms.service.HelpCenterContentService;
 import com.yonge.toolset.mybatis.dal.BaseDAO;
+import org.springframework.transaction.annotation.Transactional;
 
 @Service
 public class HelpCenterContentServiceImpl extends BaseServiceImpl<Long, HelpCenterContent> implements HelpCenterContentService {
@@ -24,6 +26,7 @@ public class HelpCenterContentServiceImpl extends BaseServiceImpl<Long, HelpCent
 	}
 
 	@Override
+	@Transactional
 	public boolean updateContentByCatalog(Long catalogId, Integer status) {
 		Map<String, Object> map = new HashMap<String, Object>();
 		map.put("catalogId", catalogId);
@@ -33,16 +36,46 @@ public class HelpCenterContentServiceImpl extends BaseServiceImpl<Long, HelpCent
 	}
 
 	@Override
+	@Transactional
 	public boolean deleteContentByCatalog(Long catalogId) {
 		contentCenterDao.deleteContentByCatalog(catalogId);
 		return true;
 	}
 
     @Override
+	@Transactional
     public boolean status(Long id) {
 
 		contentCenterDao.status(id);
 		return true;
     }
 
+    @Override
+	@Transactional
+    public boolean noticeRelease(HelpCenterContent helpCenterContent) {
+        if (helpCenterContent.getCatalogId() == 1 || helpCenterContent.getReleaseStatus() == 1) {
+			return false;
+		}
+
+		HelpCenterContent centerContent = contentCenterDao.get(helpCenterContent.getId());
+		if (centerContent.getReleaseTime().compareTo(helpCenterContent.getReleaseTime()) > 0) {
+			return false;
+		}
+
+		// 发送老师端
+		if ("TEACHER".equals(helpCenterContent.getCatalogType())) {
+			contentCenterDao.noticeReleaseToTeacher(helpCenterContent);
+		} else if ("STUDENT".equals(helpCenterContent.getCatalogType())) {
+			// 发送学生端
+			contentCenterDao.noticeReleaseToStudent(helpCenterContent);
+		}
+		helpCenterContent.setReleaseStatus(1);
+		return contentCenterDao.update(helpCenterContent)>0;
+    }
+
+	@Override
+	public List<HelpCenterContent> getNeedReleaseNotice() {
+		return contentCenterDao.selectNeedReleaseNotice();
+	}
+
 }

+ 4 - 0
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/service/impl/SysNewsInformationServiceImpl.java

@@ -14,6 +14,7 @@ import com.yonge.toolset.mybatis.service.impl.BaseServiceImpl;
 import com.yonge.toolset.utils.collection.MapUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 
@@ -34,6 +35,7 @@ public class SysNewsInformationServiceImpl extends BaseServiceImpl<Long, SysNews
 	}
 
 	@Override
+	@Transactional
 	public boolean deleteWithLogical(Long id) {
 		sysNewsInformationDao.deleteWithLogical(id);
 		return true;
@@ -134,6 +136,7 @@ public class SysNewsInformationServiceImpl extends BaseServiceImpl<Long, SysNews
 	}
 
 	@Override
+	@Transactional
 	public boolean autoUpdateStatus() {
 		List<SysNewsInformation> list = sysNewsInformationDao.queryNeedUpdateStatusList();
 		if(list != null && list.size() > 0){
@@ -171,6 +174,7 @@ public class SysNewsInformationServiceImpl extends BaseServiceImpl<Long, SysNews
     }
 
     @Override
+	@Transactional
     public boolean updateStatus(Long id) {
 		sysNewsInformationDao.updateStatus(id);
 

+ 59 - 0
cooleshow-cms/src/main/java/com/yonge/cooleshow/cms/task/NoticeReleaseTask.java

@@ -0,0 +1,59 @@
+package com.yonge.cooleshow.cms.task;
+
+import com.yonge.cooleshow.cms.dal.entity.HelpCenterContent;
+import com.yonge.cooleshow.cms.service.HelpCenterContentService;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import io.swagger.models.auth.In;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.Instant;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description 公告发布轮询
+ *
+ * @author liujunchi
+ * @date 2022-04-29
+ */
+@RestController
+@RequestMapping("/task")
+public class NoticeReleaseTask {
+    private Logger LOGGER = LoggerFactory.getLogger(NoticeReleaseTask.class);
+    @Autowired
+    private HelpCenterContentService helpCenterContentService;
+
+    /**
+     * 公告发布轮询
+     */
+    @GetMapping("/noticeRelease")
+    public HttpResponseResult noticeRelease(){
+        // 查询将要发布的公告 (0 ~ 当前时间 + 5 min 的未发布的公告) 循环发布
+        List<HelpCenterContent> helpCenterContents = helpCenterContentService.getNeedReleaseNotice();
+        for (HelpCenterContent helpCenterContent : helpCenterContents) {
+            if (helpCenterContent.getReleaseTime().compareTo(new Date()) <= 0) {
+                helpCenterContentService.noticeRelease(helpCenterContent);
+            } else {
+                // 休眠到时间后,发送消息
+                new Thread(()->{
+                    long time = helpCenterContent.getReleaseTime().toInstant().getEpochSecond()
+                            - Instant.now().getEpochSecond();
+                    try {
+                        Thread.sleep(time * 1000);
+                        helpCenterContentService.noticeRelease(helpCenterContent);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                        LOGGER.warn(e.getMessage());
+                    }
+                }).start();
+            }
+        }
+        return HttpResponseResult.succeed();
+    }
+
+}

+ 63 - 4
cooleshow-cms/src/main/resources/config/mybatis/HelpCenterContentMapper.xml

@@ -6,6 +6,8 @@
 		<result column="title_" property="title" jdbcType="VARCHAR" />
 		<result column="create_on_" property="createOn" jdbcType="TIMESTAMP" />
 		<result column="modify_on_" property="modifyOn" jdbcType="TIMESTAMP" />
+		<result column="release_time_" property="releaseTime" jdbcType="INTEGER" />
+		<result column="release_status_" property="releaseStatus" jdbcType="INTEGER" />
 		<result column="status_" property="status" jdbcType="INTEGER" />
 		<result column="order_" property="order" jdbcType="INTEGER" />
 		<result column="catalog_id_" property="catalogId" jdbcType="BIGINT" />
@@ -38,12 +40,12 @@
 	</sql>
 	
 	<sql id="Base_Column_List">
-		id_, title_, catalog_id_, create_on_, modify_on_,status_,order_
+		id_, title_, catalog_id_, create_on_, modify_on_,status_,order_,release_time_,release_status_
 	</sql>
 
 	<sql id="Base_Column_List_union">
 		content.id_, content.title_, content.catalog_id_,
-		content.create_on_,
+		content.create_on_,content.release_time_,content.release_status_,
 		content.modify_on_,content.status_,content.content_,content.order_,
 		catalog.id_,
 		catalog.name_, catalog.parent_id_,content.catalog_type_,content.create_by_,content.update_by_
@@ -93,13 +95,13 @@
 	<insert id="insert" parameterType="com.yonge.cooleshow.cms.dal.entity.HelpCenterContent">
 		insert into help_center_content
 		(id_, title_, catalog_id_,
-		create_on_, modify_on_, content_,status_,order_,update_by_,create_by_,catalog_type_
+		create_on_, modify_on_, content_,status_,order_,update_by_,create_by_,catalog_type_,release_time_,release_status_
 		)
 		values
 		(#{id,jdbcType=INTEGER}, #{title,jdbcType=VARCHAR},
 		#{catalogId,jdbcType=INTEGER},
 		#{createOn,jdbcType=TIMESTAMP},
-		#{modifyOn,jdbcType=TIMESTAMP}, #{content,jdbcType=LONGVARCHAR},#{status,jdbcType=INTEGER},#{order,jdbcType=INTEGER},#{createBy},#{updateBy},#{catalogType}
+		#{modifyOn,jdbcType=TIMESTAMP}, #{content,jdbcType=LONGVARCHAR},#{status,jdbcType=INTEGER},#{order,jdbcType=INTEGER},#{createBy},#{updateBy},#{catalogType},#{releaseTime},#{releaseStatus}
 		)
 	</insert>
 
@@ -133,6 +135,12 @@
 			<if test="createBy != null">
 				create_by_ = #{createBy},
 			</if>
+			<if test="releaseStatus != null">
+				release_status_ = #{releaseStatus},
+			</if>
+			<if test="releaseTime != null">
+				release_time_ = #{releaseTime},
+			</if>
 			<if test="catalogType != null and catalogType != ''">
 				catalog_type_ = #{catalogType}
 			</if>
@@ -152,6 +160,8 @@
 		content_ =
 		#{content,jdbcType=LONGVARCHAR},
 		status_= #{status,jdbcType=INTEGER},
+		release_status_= #{releaseStatus,jdbcType=INTEGER},
+		release_time_= #{releaseTime,jdbcType=INTEGER},
 		order_= #{order,jdbcType=INTEGER}
 		where id_ = #{id,jdbcType=INTEGER}
 	</update>
@@ -167,6 +177,8 @@
 		#{modifyOn,jdbcType=TIMESTAMP},
 		status_ = #{status,jdbcType=INTEGER},
 		order_ = #{order,jdbcType=INTEGER},
+		release_time_ = #{releaseTime,jdbcType=INTEGER},
+		release_status_ = #{releaseStatus,jdbcType=INTEGER}
 		where id_ = #{id,jdbcType=INTEGER}
 	</update>
 	
@@ -178,4 +190,51 @@
 		update help_center_content set status_=if(status_ =0,1,0) where id_=#{catalogId}
 
 	</update>
+
+	<insert id="noticeReleaseToTeacher">
+		insert into sys_message
+			(
+		user_id_,type_, title_, content_,status_, receiver_, send_time_,  create_on_, modify_on_,  group_, client_id_
+			)
+		SELECT
+			t.user_id_,
+			3,
+			#{param.title},
+			#{param.content},
+			2,
+			su.phone_,
+			#{param.releaseTime},
+			now(),now(),'NOTICE','TEACHER'
+		from teacher t
+		left join sys_user su on su.id_ = t.user_id_
+	</insert>
+
+	<insert id="noticeReleaseToStudent">
+		insert into sys_message
+		(
+		user_id_,type_, title_, content_,status_, receiver_, send_time_,  create_on_, modify_on_,  group_, client_id_
+		)
+		SELECT
+		t.user_id_,
+		3,
+		#{param.title},
+		#{param.content},
+		2,
+		su.phone_,
+		#{param.releaseTime},
+		now(),now(),'NOTICE','STUDENT'
+		from student t
+		left join sys_user su on su.id_ = t.user_id_
+	</insert>
+
+	<select id="selectNeedReleaseNotice" resultMap="HelpCenterContent">
+		select
+		<include refid="Base_Column_List_union" />
+		from help_center_content content
+		left join help_center_catalog catalog on
+		content.catalog_id_=catalog.id_
+		where content.status_ = 0
+		and content.release_time_ &lt;= date_add(now(),interval 5 MINUTE)
+		and content.catalog_id_ = 2
+	</select>
 </mapper>

+ 25 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/feign/CmsFeignService.java

@@ -0,0 +1,25 @@
+package com.yonge.cooleshow.task.feign;
+
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.task.feign.fallback.CmsFeignServiceFallback;
+import com.yonge.toolset.feign.config.FeignConfiguration;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-04-29
+ */
+
+@FeignClient(name = "cms-server", configuration = FeignConfiguration.class, fallback = CmsFeignServiceFallback.class)
+public interface CmsFeignService {
+
+    /**
+     * 公告发布轮询
+     */
+    @GetMapping("/task/noticeRelease")
+    HttpResponseResult noticeRelease();
+
+}

+ 17 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/feign/fallback/CmsFeignServiceFallback.java

@@ -0,0 +1,17 @@
+package com.yonge.cooleshow.task.feign.fallback;
+
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.task.feign.CmsFeignService;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-04-29
+ */
+public class CmsFeignServiceFallback implements CmsFeignService {
+    @Override
+    public HttpResponseResult noticeRelease() {
+        return null;
+    }
+}

+ 23 - 0
cooleshow-task/src/main/java/com/yonge/cooleshow/task/jobs/NoticeReleaseTask.java

@@ -0,0 +1,23 @@
+package com.yonge.cooleshow.task.jobs;
+
+import com.yonge.cooleshow.task.core.BaseTask;
+import com.yonge.cooleshow.task.core.TaskException;
+import com.yonge.cooleshow.task.feign.CmsFeignService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-04-29
+ */
+public class NoticeReleaseTask  extends BaseTask {
+
+    @Autowired
+    private CmsFeignService cmsFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        cmsFeignService.noticeRelease();
+    }
+}

+ 6 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/SysMessageQueryInfo.java

@@ -21,21 +21,21 @@ public class SysMessageQueryInfo extends QueryInfo {
 	@ApiModelProperty(value = "消息类型;1,表示短信;2,表示邮件; 3,app推送消息",required = false)
 	private Integer type;
 
-	@ApiModelProperty("消息组 SYSTEM:系统消息  COURSE:课程信息")
+	@ApiModelProperty("消息组 SYSTEM:系统消息  COURSE:课程信息 NOTICE:公告")
 	private String group;
 
 	@ApiModelProperty("客户端STUDENT,TEACHER,SYSTEM")
-	private String jpushType;
+	private String clientId;
 
 	@ApiModelProperty("0:未读,1:已读")
 	private Integer readStatus;
 
-	public String getJpushType() {
-		return jpushType;
+	public String getClientId() {
+		return clientId;
 	}
 
-	public void setJpushType(String jpushType) {
-		this.jpushType = jpushType;
+	public void setClientId(String clientId) {
+		this.clientId = clientId;
 	}
 
 	public Integer getStatus() {

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysMessage.java

@@ -25,11 +25,11 @@ public class SysMessage extends BaseEntity {
 	private String content;
 	
 	/** 消息类型;1,表示短信;2,表示邮件; 3,app推送消息 */
-	@ApiModelProperty(value = "消息类型",required = false)
+	@ApiModelProperty(value = "消息类型;1,表示短信;2,表示邮件; 3,app推送消息",required = false)
 	private MessageSendMode type;
 	
 	/** 状态,-1,发送失败;0,待发送;1,发送中;2,发送完成 */
-	@ApiModelProperty(value = "状态",required = false)
+	@ApiModelProperty(value = "状态,-1,发送失败;0,待发送;1,发送中;2,发送完成",required = false)
 	private SendStatusEnum status;
 	
 	/** 接收人(多个人用逗号分隔) */

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageSendMode.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.enums;
 
+import com.baomidou.mybatisplus.annotation.EnumValue;
 import com.yonge.toolset.base.enums.BaseEnum;
 
 /**
@@ -8,6 +9,7 @@ import com.yonge.toolset.base.enums.BaseEnum;
 public enum MessageSendMode implements BaseEnum<Integer, MessageSendMode> {
 	SMS(1, "短信"), EMAIL(2, "邮件"), PUSH(3, "app推送消息"), SEO(4, "站内推送消息");
 
+	@EnumValue
 	private Integer code;
 
 	private String msg;

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/SendStatusEnum.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.enums;
 
+import com.baomidou.mybatisplus.annotation.EnumValue;
 import com.yonge.toolset.base.enums.BaseEnum;
 
 /**
@@ -8,6 +9,7 @@ import com.yonge.toolset.base.enums.BaseEnum;
 public enum SendStatusEnum implements BaseEnum<Integer, SendStatusEnum> {
 	FAILED(-1, "发送失败"), WAIT(0, "待发送"), SENDING(1, "发送中"), SUCCESSED(2, "发送完成");
 
+	@EnumValue
 	private Integer code;
 
 	private String msg;

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

@@ -239,7 +239,7 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
             Map<Long,String> receivers = new HashMap<>();
             receivers.put(teacher.getId(), teacher.getPhone());
             // todo url设置
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SUBMIT_HOMEWORK, receivers, null, 0,null , ClientEnum.STUDENT.getCode(),student.getUsername(),"url");
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_SUBMIT_HOMEWORK, receivers, null, 0,null , ClientEnum.TEACHER.getCode(),student.getUsername(),"url");
             return true;
 
         } else {

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

@@ -43,6 +43,7 @@ import com.yonge.cooleshow.common.redis.service.RedisCache;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext.MessageSender;
 import com.yonge.toolset.utils.collection.MapUtil;
+import org.springframework.transaction.annotation.Transactional;
 
 @Service
 public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> implements SysMessageService {
@@ -154,6 +155,7 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	}
 
 	@Override
+	@Transactional
 	public int updateMessage(SysMessage message) {
 		return sysMessageDao.update(message);
 	}
@@ -392,11 +394,13 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	 * @return 修改的条数
 	 */
 	@Override
+	@Transactional
 	public int updateStatus(Long userId, int status,String jpushType) {
 		return sysMessageDao.updateStatus(userId, status,jpushType);
 	}
 
 	@Override
+	@Transactional
 	public int updateOneStatus(Long id, int status) {
 		return sysMessageDao.updateOneStatus(id, status);
 	}

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

@@ -152,7 +152,7 @@
         ,sch.teacher_replied_ as teacherReplied
         ,sch.submit_time_ as submitTime
         ,sch.id_ as studentHomeworkId
-        ,sch.student_id_ as studendId
+        ,sch.student_id_ as studentId
         ,cs.teacher_id_ as teacherId
         ,cs.id_ as courseGroupId
         ,ch.create_time_ as decorateTime

+ 3 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMessageMapper.xml

@@ -35,6 +35,7 @@
 
 	<sql id="queryCondition">
 		<where>
+			m.send_time_ &lt;= now()
 			<if test="clientId != null and clientId != ''">
 				and (m.client_id_ = #{clientId} OR m.client_id_ IS NULL)
 			</if>
@@ -157,7 +158,7 @@
 
     <update id="updateOneStatus">
        update sys_message set read_status_=#{status}
-		where id_ =#{id}
+		where id_ =#{id} and send_time_ &gt;= now()
     </update>
 
     <select id="queryCount" parameterType="map" resultType="int">
@@ -189,7 +190,7 @@
 	<select id="queryCountOfUnread" resultMap="Mapper" parameterType="map">
 		SELECT group_ key_,COUNT(*) value_ FROM sys_message
 		WHERE user_id_ = #{userId} AND read_status_ = 0 and status_ = 2
-		AND (client_id_ = #{jpushType} OR client_id_ IS NULL)
+		AND (client_id_ = #{jpushType} OR client_id_ IS NULL)  and send_time_ &gt;= now()
 		<if test="type != null">
 		and type_ = #{type}
 		</if>

+ 8 - 9
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/SysMessageController.java

@@ -4,12 +4,14 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.AppVersionInfoDao;
 import com.yonge.cooleshow.biz.dal.dto.search.SysMessageQueryInfo;
+import com.yonge.cooleshow.biz.dal.entity.SysMessage;
 import com.yonge.cooleshow.biz.dal.enums.MessageSendMode;
 import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.entity.Mapper;
 import com.yonge.cooleshow.common.exception.BizException;
+import com.yonge.toolset.mybatis.page.PageInfo;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.validator.CommonValidator;
 import io.swagger.annotations.Api;
@@ -17,10 +19,7 @@ import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -39,15 +38,15 @@ public class SysMessageController extends BaseController {
 	private AppVersionInfoDao appVersionInfoDao;
 
 	@ApiOperation("获取所有消息列表")
-	@GetMapping(value = "list")
-	public Object list(SysMessageQueryInfo queryInfo){
+	@PostMapping(value = "list")
+	public HttpResponseResult<PageInfo<SysMessage>> list(@RequestBody SysMessageQueryInfo queryInfo){
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if (sysUser == null) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");
 		}
 		queryInfo.setUserId(sysUser.getId());
 		queryInfo.setType(MessageSendMode.PUSH.getCode());
-		queryInfo.setJpushType("STUDENT");
+		queryInfo.setClientId("STUDENT");
 		return succeed(sysMessageService.queryPage(queryInfo));
 	}
 
@@ -86,8 +85,8 @@ public class SysMessageController extends BaseController {
 	}
 
 	@ApiOperation("设置已读")
-	@PostMapping("setRead")
-	public Object setRead(Long id) {
+	@PostMapping("setRead/{id}")
+	public Object setRead(@PathVariable Long id) {
 		int status = 1;
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if (sysUser == null) {

+ 8 - 9
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/SysMessageController.java

@@ -4,12 +4,14 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.AppVersionInfoDao;
 import com.yonge.cooleshow.biz.dal.dto.search.SysMessageQueryInfo;
+import com.yonge.cooleshow.biz.dal.entity.SysMessage;
 import com.yonge.cooleshow.biz.dal.enums.MessageSendMode;
 import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.entity.Mapper;
 import com.yonge.cooleshow.common.exception.BizException;
+import com.yonge.toolset.mybatis.page.PageInfo;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.validator.CommonValidator;
 import io.swagger.annotations.Api;
@@ -17,10 +19,7 @@ import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -39,15 +38,15 @@ public class SysMessageController extends BaseController {
 	private AppVersionInfoDao appVersionInfoDao;
 
 	@ApiOperation("获取所有消息列表")
-	@GetMapping(value = "list")
-	public Object list(SysMessageQueryInfo queryInfo){
+	@PostMapping(value = "list")
+	public HttpResponseResult<PageInfo<SysMessage>> list(@RequestBody SysMessageQueryInfo queryInfo){
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if (sysUser == null) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");
 		}
 		queryInfo.setUserId(sysUser.getId());
 		queryInfo.setType(MessageSendMode.PUSH.getCode());
-		queryInfo.setJpushType("TEACHER");
+		queryInfo.setClientId("TEACHER");
 		return succeed(sysMessageService.queryPage(queryInfo));
 	}
 
@@ -86,8 +85,8 @@ public class SysMessageController extends BaseController {
 	}
 
 	@ApiOperation("设置已读")
-	@PostMapping("setRead")
-	public Object setRead(Long id) {
+	@PostMapping("setRead/{id}")
+	public Object setRead(@PathVariable Long id) {
 		int status = 1;
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if (sysUser == null) {