Browse Source

小小训练营活动
1、后台支持群消息发送
2、定时群消息发送
3、群列表

zouxuan 2 years ago
parent
commit
312c181e57
24 changed files with 821 additions and 103 deletions
  1. 5 0
      mec-biz/pom.xml
  2. 15 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImSendGroupMessageDao.java
  3. 153 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImSendGroupMessage.java
  4. 4 4
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupMemberService.java
  5. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ImSendGroupMessageService.java
  6. 36 1
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMessageService.java
  7. 4 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupMemberServiceImpl.java
  8. 100 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImSendGroupMessageServiceImpl.java
  9. 59 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java
  10. 106 0
      mec-biz/src/main/resources/config/mybatis/ImSendGroupMessageMapper.xml
  11. 1 1
      mec-client-api/src/main/java/com/ym/mec/im/ImFeignService.java
  12. 1 1
      mec-client-api/src/main/java/com/ym/mec/im/fallback/ImFeignServiceFallback.java
  13. 60 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImFileMessage.java
  14. 85 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImMessageDto.java
  15. 4 4
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImMessageModel.java
  16. 58 11
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImTxtMessage.java
  17. 11 1
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/UploadReturnBean.java
  18. 16 10
      mec-im/src/main/java/com/ym/controller/GroupController.java
  19. 2 2
      mec-im/src/main/java/com/ym/controller/PrivateController.java
  20. 2 2
      mec-im/src/main/java/com/ym/controller/SystemController.java
  21. 26 31
      mec-web/src/main/java/com/ym/mec/web/controller/ImGroupController.java
  22. 36 0
      mec-web/src/main/java/com/ym/mec/web/controller/ImSendGroupMessageController.java
  23. 19 21
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
  24. 1 0
      mec-web/src/main/java/com/ym/mec/web/controller/UploadFileController.java

+ 5 - 0
mec-biz/pom.xml

@@ -46,5 +46,10 @@
             <artifactId>redisson-spring-boot-starter</artifactId>
             <version>${redisson.version}</version>
         </dependency>
+        <dependency>
+            <groupId>net.coobird</groupId>
+            <artifactId>thumbnailator</artifactId>
+            <version>0.4.11</version>
+        </dependency>
     </dependencies>
 </project>

+ 15 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImSendGroupMessageDao.java

@@ -0,0 +1,15 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.biz.dal.entity.ImSendGroupMessage;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface ImSendGroupMessageDao extends BaseDAO<Long, ImSendGroupMessage> {
+
+	List<ImSendGroupMessage> findBySendFlag(@Param("sendFlag") Boolean sendFlag, @Param("sendTime") Date sendTime);
+
+	void batchUpdateSendFlag(@Param("sendGroupMessages") List<ImSendGroupMessage> sendGroupMessages);
+}

+ 153 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImSendGroupMessage.java

@@ -0,0 +1,153 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+public class ImSendGroupMessage {
+
+    private Long id;
+
+    @ApiModelProperty(value = "消息内容")
+    private String messageContent;
+
+    @ApiModelProperty(value = "发送人")
+    @NotBlank(message = "发送人不能为空")
+    private String senderId;
+
+    @ApiModelProperty(value = "附加字段")
+    private String extra;
+
+    @ApiModelProperty(value = "目标用户(群组)")
+    @NotNull(message = "目标用户(群组)不能为空")
+    private String targetIds;
+
+    @ApiModelProperty(value = "文件地址")
+    private String fileUrl;
+
+    @ApiModelProperty(value = "文件名称")
+    private String fileName;
+
+    @ApiModelProperty(value = "文件大小")
+    private Long fileSize;
+
+    @ApiModelProperty(value = "消息类型(IMG,FILE)")
+    private ImSendTypeEnum messageType;
+
+    @ApiModelProperty(value = "是否发送")
+    private Boolean sendFlag = false;
+
+    @ApiModelProperty(value = "定时发送时间")
+    private Date sendTime;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Boolean getSendFlag() {
+        return sendFlag;
+    }
+
+    public void setSendFlag(Boolean sendFlag) {
+        this.sendFlag = sendFlag;
+    }
+
+    public Date getSendTime() {
+        return sendTime;
+    }
+
+    public void setSendTime(Date sendTime) {
+        this.sendTime = sendTime;
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public ImSendTypeEnum getMessageType() {
+        return messageType;
+    }
+
+    public void setMessageType(ImSendTypeEnum messageType) {
+        this.messageType = messageType;
+    }
+
+    public String getMessageContent() {
+        return messageContent;
+    }
+
+    public void setMessageContent(String messageContent) {
+        this.messageContent = messageContent;
+    }
+
+    public String getSenderId() {
+        return senderId;
+    }
+
+    public void setSenderId(String senderId) {
+        this.senderId = senderId;
+    }
+
+    public String getExtra() {
+        return extra;
+    }
+
+    public void setExtra(String extra) {
+        this.extra = extra;
+    }
+
+    public String getTargetIds() {
+        return targetIds;
+    }
+
+    public void setTargetIds(String targetIds) {
+        this.targetIds = targetIds;
+    }
+
+    public String getFileUrl() {
+        return fileUrl;
+    }
+
+    public void setFileUrl(String fileUrl) {
+        this.fileUrl = fileUrl;
+    }
+
+    public Long getFileSize() {
+        return fileSize;
+    }
+
+    public void setFileSize(Long fileSize) {
+        this.fileSize = fileSize;
+    }
+}

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

@@ -1,14 +1,14 @@
 package com.ym.mec.biz.service;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.ImGroup;
 import com.ym.mec.biz.dal.entity.ImGroupMember;
+import com.ym.mec.biz.dal.entity.ImSendGroupMessage;
 import com.ym.mec.common.service.BaseService;
 
+import java.util.List;
+import java.util.Map;
+
 public interface ImGroupMemberService extends BaseService<Long, ImGroupMember> {
 
 	/**

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

@@ -0,0 +1,17 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.entity.ImSendGroupMessage;
+import com.ym.mec.common.service.BaseService;
+import org.springframework.transaction.annotation.Transactional;
+
+public interface ImSendGroupMessageService extends BaseService<Long, ImSendGroupMessage> {
+
+    @Transactional(rollbackFor = Exception.class)
+    void sendTimedMessages() throws Exception;
+
+    //发送群消息
+    void sendGroupMessage(ImSendGroupMessage imSendGroupMessage) throws Exception;
+
+    //修改未发送的群消息
+    void updateGroupMessage(ImSendGroupMessage imSendGroupMessage);
+}

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

@@ -42,7 +42,7 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 	void batchSendImMessage(MessageTypeEnum messageType,String senderId,String extra, String[] targetIds,String url, Object... args);
 
 	/**
-	 * 推送im文本消息,包含跳转链接
+	 * 推送im 模板文本消息,包含跳转链接
 	 * @param senderId
 	 * @param messageType
 	 * @return
@@ -50,6 +50,41 @@ public interface SysMessageService extends BaseService<Long, SysMessage> {
 	void batchSendImGroupMessage(MessageTypeEnum messageType,String senderId,String extra, String[] targetIds,String url, Object... args);
 
 	/**
+	 * 发送自定义消息
+	 * @param senderId
+	 * @param messageContent
+	 * @return
+	 */
+	void batchSendImGroupMessage(String messageContent,String senderId,String extra, String[] targetIds);
+
+
+	/**
+	* @description: 发送图片消息
+	 * @param senderId
+	 * @param extra
+	 * @param imgUrl
+	 * @param targetIds
+	* @return void
+	* @author zx
+	* @date 2022/5/17 10:05
+	*/
+	void batchSendImGroupMessage(String messageContent,String senderId,String extra,String imgUrl, String[] targetIds);
+
+	/**
+	* @description: 发送文件消息
+	 * @param senderId 发送者编号
+	 * @param extra 扩展字段
+	 * @param name	文件名称
+	 * @param targetIds	接收者编号
+	 * @param fileUrl	文件地址
+	 * @param size	文件大小
+	* @return void
+	* @author zx
+	* @date 2022/5/17 10:05
+	*/
+	void batchSendImGroupMessage(String senderId,String extra,String name, String[] targetIds, String fileUrl,Long size);
+
+	/**
 	 * 发送消息
 	 * @param senderTenantId 消息发送者所在的机构编号
 	 * @param messageSender 消息发送者

+ 4 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupMemberServiceImpl.java

@@ -4,8 +4,10 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
 import com.ym.mec.biz.service.ImGroupMemberService;
 import com.ym.mec.biz.service.ImGroupService;
+import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
@@ -15,7 +17,6 @@ import com.ym.mec.im.entity.GroupModel;
 import com.ym.mec.util.collection.MapUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -47,6 +48,8 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 	private ClassGroupStudentMapperDao classGroupStudentMapperDao;
 	@Autowired
 	private ImFeignService imFeignService;
+	@Autowired
+	private SysMessageService sysMessageService;
 	@Override
 	public BaseDAO<Long, ImGroupMember> getDAO() {
 		return imGroupMemberDao;
@@ -362,5 +365,4 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 	public void delRepeat() {
 		imGroupMemberDao.delRepeat();
 	}
-
 }

+ 100 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImSendGroupMessageServiceImpl.java

@@ -0,0 +1,100 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.dao.ImSendGroupMessageDao;
+import com.ym.mec.biz.dal.entity.ImSendGroupMessage;
+import com.ym.mec.biz.dal.enums.ImSendTypeEnum;
+import com.ym.mec.biz.service.ImSendGroupMessageService;
+import com.ym.mec.biz.service.SysMessageService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import net.coobird.thumbnailator.Thumbnails;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+@Service
+public class ImSendGroupMessageServiceImpl extends BaseServiceImpl<Long, ImSendGroupMessage>  implements ImSendGroupMessageService {
+	
+	@Autowired
+	private ImSendGroupMessageDao imSendGroupMessageDao;
+	@Autowired
+	private SysMessageService sysMessageService;
+
+	@Override
+	public BaseDAO<Long, ImSendGroupMessage> getDAO() {
+		return imSendGroupMessageDao;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void sendTimedMessages() throws Exception {
+		List<ImSendGroupMessage> sendGroupMessages = imSendGroupMessageDao.findBySendFlag(false, new Date());
+		if(sendGroupMessages.size() > 0){
+			for(ImSendGroupMessage messageDto : sendGroupMessages){
+				messageDto.setSendFlag(true);
+				send(messageDto);
+			}
+			imSendGroupMessageDao.batchUpdateSendFlag(sendGroupMessages);
+		}
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void sendGroupMessage(ImSendGroupMessage messageDto) throws Exception {
+		if(Objects.isNull(messageDto.getSendTime())){
+			messageDto.setSendFlag(true);
+			send(messageDto);
+		}
+		imSendGroupMessageDao.insert(messageDto);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void updateGroupMessage(ImSendGroupMessage imSendGroupMessage) {
+		ImSendGroupMessage message = imSendGroupMessageDao.get(imSendGroupMessage.getId());
+		if(Objects.isNull(message)){
+			throw new BizException("消息不存在");
+		}
+		if(message.getSendFlag()){
+			throw new BizException("消息已发送");
+		}
+		imSendGroupMessageDao.update(imSendGroupMessage);
+	}
+
+	private void send(ImSendGroupMessage messageDto) throws Exception {
+		if (Objects.equals(messageDto.getMessageType(), ImSendTypeEnum.IMG)) {
+			String content = imageToBase64(Thumbnails.of(new URL(messageDto.getFileUrl())).scale(0.5f).outputQuality(0.25f).asBufferedImage());
+			sysMessageService.batchSendImGroupMessage(content,messageDto.getSenderId(),
+					messageDto.getExtra(),messageDto.getFileUrl(),messageDto.getTargetIds().split(","));
+		} else if (Objects.equals(messageDto.getMessageType(),ImSendTypeEnum.FILE)) {
+			sysMessageService.batchSendImGroupMessage(messageDto.getSenderId(),
+					messageDto.getExtra(),messageDto.getFileName(),messageDto.getTargetIds().split(","),messageDto.getFileUrl(),messageDto.getFileSize());
+		}
+		if(StringUtils.isNotEmpty(messageDto.getMessageContent())){
+			sysMessageService.batchSendImGroupMessage(messageDto.getMessageContent(),messageDto.getSenderId(),messageDto.getExtra(),messageDto.getTargetIds().split(","));
+		}
+	}
+
+	public static String imageToBase64(BufferedImage bufferedImage) {
+		Base64 encoder = new Base64();
+		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		try {
+			ImageIO.write(bufferedImage, "jpg", baos);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return new String(encoder.encode((baos.toByteArray())));
+	}
+}

+ 59 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMessageServiceImpl.java

@@ -16,6 +16,7 @@ import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
+import com.ym.mec.common.entity.*;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -44,9 +45,6 @@ import com.ym.mec.biz.dal.enums.SendStatusEnum;
 import com.ym.mec.biz.service.SysMessageConfigService;
 import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
-import com.ym.mec.common.entity.ImGroupMessage;
-import com.ym.mec.common.entity.ImPrivateMessage;
-import com.ym.mec.common.entity.ImTxtMessage;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
@@ -246,24 +244,73 @@ public class SysMessageServiceImpl extends BaseServiceImpl<Long, SysMessage> imp
 	}
 
 	@Override
-	@Async
 	public void batchSendImGroupMessage(MessageTypeEnum type, String senderId,String extra, String[] targetIds, String url, Object... args) {
+		String messageContent = checkMessageConfig(type);
+		String content = getContent(messageContent,url, args);
+		ExecutorService executor = Executors.newCachedThreadPool();
+		CompletableFuture.runAsync(()->{
+			imFeignService.groupSend(getImGroupMessage("RC:TxtMsg",senderId,targetIds,content,extra));
+		},executor);
+	}
+
+	@Override
+	public void batchSendImGroupMessage(String messageContent, String senderId,String extra, String[] targetIds) {
+		ExecutorService executor = Executors.newCachedThreadPool();
+		CompletableFuture.runAsync(()->{
+			imFeignService.groupSend(getImGroupMessage("RC:TxtMsg",senderId,targetIds,messageContent,extra));
+		},executor);
+	}
+
+	@Override
+	public void batchSendImGroupMessage(String messageContent,String senderId,String extra,String imgUrl, String[] targetIds) {
+		ImMessageDto imMessageDto =
+				getImGroupMessage("RC:ImgMsg",senderId,targetIds,messageContent,extra);
+		imMessageDto.setFileUrl(imgUrl);
+		ExecutorService executor = Executors.newCachedThreadPool();
+		CompletableFuture.runAsync(()->{
+			imFeignService.groupSend(imMessageDto);
+		},executor);
+	}
+
+	@Override
+	public void batchSendImGroupMessage(String senderId,String extra,String name, String[] targetIds, String fileUrl,Long size) {
+		ImMessageDto imMessageDto =
+				getImGroupMessage("RC:FileMsg",senderId,targetIds,"",extra);
+		imMessageDto.setFileUrl(fileUrl);
+		imMessageDto.setFileSize(size);
+		imMessageDto.setFileName(name);
+		ExecutorService executor = Executors.newCachedThreadPool();
+		CompletableFuture.runAsync(()->{
+			imFeignService.groupSend(imMessageDto);
+		},executor);
+	}
+
+	private String checkMessageConfig(MessageTypeEnum type){
 		SysMessageConfig messageConfig = sysMessageConfigService.queryByType(type);
 		if (messageConfig == null) {
 			throw new BizException("消息类型错误");
 		}else if(messageConfig.getSendFlag() == null || messageConfig.getSendFlag() == 0){
-			return;
+			throw new BizException("消息类型未开启");
 		}
-		String content = MessageFormatter.arrayFormat(messageConfig.getContent(), args);
+		return messageConfig.getContent();
+	}
+
+	private String getContent(String messageContent, String url, Object... args) {
+		String content = MessageFormatter.arrayFormat(messageContent, args);
 		if(StringUtils.isNotEmpty(url)){
 			content += url;
 		}
-		ImGroupMessage groupMessage = new ImGroupMessage();
-		groupMessage.setObjectName("RC:TxtMsg");
-		groupMessage.setTargetId(targetIds);
-		groupMessage.setSenderId(senderId);
-		groupMessage.setContent(new ImTxtMessage(content,extra));
-		imFeignService.groupSend(groupMessage);
+		return content;
+	}
+
+	private ImMessageDto getImGroupMessage(String objectName, String senderId, String[] targetIds, String content, String extra) {
+		ImMessageDto imMessageDto = new ImMessageDto();
+		imMessageDto.setObjectName(objectName);
+		imMessageDto.setTargetIds(targetIds);
+		imMessageDto.setSenderId(senderId);
+		imMessageDto.setExtra(extra);
+		imMessageDto.setMessageContent(content);
+		return imMessageDto;
 	}
 
 	@Override

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

@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.biz.dal.dao.ImSendGroupMessageDao">
+	
+	<resultMap type="com.ym.mec.biz.dal.entity.ImSendGroupMessage" id="ImSendGroupMessage">
+		<result column="id_" property="id" />
+		<result column="message_content_" property="messageContent" />
+		<result column="sender_id_" property="senderId" />
+		<result column="extra" property="extra" />
+		<result column="target_ids_" property="targetIds" />
+		<result column="file_url_" property="fileUrl" />
+		<result column="file_name_" property="fileName" />
+		<result column="file_size_" property="fileSize" />
+		<result column="message_type_" property="messageType" />
+		<result column="send_flag_" property="sendFlag" />
+		<result column="send_time_" property="sendTime" />
+		<result column="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+	</resultMap>
+	
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="ImSendGroupMessage" >
+		SELECT * FROM im_send_group_message WHERE id_ = #{id} 
+	</select>
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="ImSendGroupMessage">
+		SELECT * FROM im_send_group_message ORDER BY id_
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.ImSendGroupMessage" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		INSERT INTO im_send_group_message (message_content_,sender_id_,extra,target_ids_,file_url_,file_name_,file_size_,message_type_,send_flag_,send_time_,create_time_,update_time_)
+		VALUES(#{messageContent},#{senderId},#{extra},#{targetIds},#{fileUrl},#{fileName},#{fileSize},#{messageType},#{sendFlag},#{sendTime},NOW(),NOW())
+	</insert>
+	
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.ImSendGroupMessage">
+		UPDATE im_send_group_message <set>
+			<if test="senderId != null">
+			sender_id_ = #{senderId},
+			</if>
+			<if test="messageType != null">
+			message_type_ = #{messageType},
+			</if>
+			<if test="sendTime != null">
+			send_time_ = #{sendTime},
+			</if>
+			<if test="sendFlag != null">
+			send_flag_ = #{sendFlag},
+			</if>
+			<if test="targetIds != null">
+			target_ids_ = #{targetIds},
+			</if>
+			<if test="fileName != null">
+			file_name_ = #{fileName},
+			</if>
+			<if test="fileSize != null">
+			file_size_ = #{fileSize},
+			</if>
+			<if test="messageContent != null">
+			message_content_ = #{messageContent},
+			</if>
+			<if test="extra != null">
+			extra = #{extra},
+			</if>
+			<if test="updateTime != null">
+			update_time_ = #{updateTime},
+			</if>
+			<if test="fileUrl != null">
+			file_url_ = #{fileUrl},
+			</if>
+			</set> WHERE id_ = #{id}
+	</update>
+	<update id="batchUpdateSendFlag">
+		<foreach collection="sendGroupMessages" item="item" separator=";">
+			UPDATE im_send_group_message SET send_flag_ = #{item.sendFlag},update_time_ = NOW() WHERE id_ = #{item.id}
+		</foreach>
+	</update>
+
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete" >
+		DELETE FROM im_send_group_message WHERE id_ = #{id} 
+	</delete>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="ImSendGroupMessage" parameterType="map">
+		SELECT * FROM im_send_group_message ORDER BY id_
+		<include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM im_send_group_message
+	</select>
+    <select id="findBySendFlag" resultMap="ImSendGroupMessage">
+		SELECT * FROM im_send_group_message WHERE send_flag_ = #{sendFlag}
+		<if test="sendTime != null">
+		AND send_time_ &lt;= #{sendTime}
+		</if>
+	</select>
+</mapper>

+ 1 - 1
mec-client-api/src/main/java/com/ym/mec/im/ImFeignService.java

@@ -115,7 +115,7 @@ public interface ImFeignService {
     Object privateSend(@RequestBody ImPrivateMessage privateMessage);
 
     @PostMapping(value = "group/send")
-    Object groupSend(@RequestBody ImGroupMessage imGroupMessage);
+    Object groupSend(@RequestBody ImMessageDto imMessageDto);
 
     /**
      * 获取历史消息记录

+ 1 - 1
mec-client-api/src/main/java/com/ym/mec/im/fallback/ImFeignServiceFallback.java

@@ -68,7 +68,7 @@ public class ImFeignServiceFallback implements ImFeignService {
     }
 
     @Override
-    public Object groupSend(ImGroupMessage imGroupMessage) {
+    public Object groupSend(ImMessageDto imMessageDto) {
         return null;
     }
 

+ 60 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImFileMessage.java

@@ -0,0 +1,60 @@
+package com.ym.mec.common.entity;
+
+import com.alibaba.fastjson.JSONObject;
+
+public class ImFileMessage extends ImBaseMessage {
+    private String name;
+    private Long size;
+    private String fileUrl;
+    private String extra;
+
+    private static final transient String TYPE = "RC:FileMsg";
+
+    public ImFileMessage(String name, Long size, String fileUrl, String extra) {
+        this.name = name;
+        this.size = size;
+        this.fileUrl = fileUrl;
+        this.extra = extra;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Long getSize() {
+        return size;
+    }
+
+    public void setSize(Long size) {
+        this.size = size;
+    }
+
+    public String getFileUrl() {
+        return fileUrl;
+    }
+
+    public void setFileUrl(String fileUrl) {
+        this.fileUrl = fileUrl;
+    }
+
+    public String getExtra() {
+        return extra;
+    }
+
+    public void setExtra(String extra) {
+        this.extra = extra;
+    }
+
+    @Override
+    public String getType() {
+        return TYPE;
+    }
+
+    public String toString() {
+        return JSONObject.toJSONString(this);
+    }
+}

+ 85 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImMessageDto.java

@@ -0,0 +1,85 @@
+package com.ym.mec.common.entity;
+
+import com.alibaba.fastjson.JSONObject;
+
+public class ImMessageDto {
+    private String objectName;
+
+    private String messageContent;
+
+    private String extra;
+
+    private String fileUrl;
+
+    private Long fileSize;
+
+    private String fileName;
+
+    private String[] targetIds;
+
+    private String senderId;
+
+    public String getObjectName() {
+        return objectName;
+    }
+
+    public void setObjectName(String objectName) {
+        this.objectName = objectName;
+    }
+
+    public String getMessageContent() {
+        return messageContent;
+    }
+
+    public void setMessageContent(String messageContent) {
+        this.messageContent = messageContent;
+    }
+
+    public String getExtra() {
+        return extra;
+    }
+
+    public void setExtra(String extra) {
+        this.extra = extra;
+    }
+
+    public String getFileUrl() {
+        return fileUrl;
+    }
+
+    public void setFileUrl(String fileUrl) {
+        this.fileUrl = fileUrl;
+    }
+
+    public Long getFileSize() {
+        return fileSize;
+    }
+
+    public void setFileSize(Long fileSize) {
+        this.fileSize = fileSize;
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public String[] getTargetIds() {
+        return targetIds;
+    }
+
+    public void setTargetIds(String[] targetIds) {
+        this.targetIds = targetIds;
+    }
+
+    public String getSenderId() {
+        return senderId;
+    }
+
+    public void setSenderId(String senderId) {
+        this.senderId = senderId;
+    }
+}

+ 4 - 4
mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImMessageModel.java

@@ -8,7 +8,7 @@ public class ImMessageModel {
     //消息类型, 分为两类: 内置消息类型 、自定义消息类型  RC:TxtMsg,RC:ImgMsg,RC:VcMsg,RC:ImgTextMsg,RC:FileMsg,RC:LBSMsg  必填
     private String objectName;
     //消息内容  必填
-    private ImBaseMessage content;
+    private ImTxtMessage content;
     //push 内容, 分为两类 内置消息 Push 、自定义消息 Push  RC:TxtMsg,RC:ImgMsg,RC:VcMsg,RC:ImgTextMsg,RC:FileMsg,RC:LBSMsg
     private String pushContent;
     private String pushData;
@@ -16,7 +16,7 @@ public class ImMessageModel {
     public ImMessageModel() {
     }
 
-    public ImMessageModel(String senderId, String[] targetId, String objectName, ImBaseMessage content, String pushContent, String pushData) {
+    public ImMessageModel(String senderId, String[] targetId, String objectName, ImTxtMessage content, String pushContent, String pushData) {
         this.senderId = senderId;
         this.targetId = targetId;
         this.objectName = objectName;
@@ -43,11 +43,11 @@ public class ImMessageModel {
         return this;
     }
 
-    public ImBaseMessage getContent() {
+    public ImTxtMessage getContent() {
         return this.content;
     }
 
-    public ImMessageModel setContent(ImBaseMessage content) {
+    public ImMessageModel setContent(ImTxtMessage content) {
         this.content = content;
         return this;
     }

+ 58 - 11
mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImTxtMessage.java

@@ -2,26 +2,73 @@ package com.ym.mec.common.entity;
 
 import com.alibaba.fastjson.JSONObject;
 
-public class ImTxtMessage extends ImBaseMessage {
-    private String content = "";
-    private String extra = "";
-    private static final transient String TYPE = "RC:TxtMsg";
+public class ImTxtMessage{
+    private String messageContent;
+    private String extra;
+    private String name;
+    private Long size;
+    private String fileUrl;
+    private String type;
 
-    public ImTxtMessage(String content, String extra) {
-        this.content = content;
+    public ImTxtMessage(String messageContent, String extra) {
+        this.type = "RC:TxtMsg";
+        this.messageContent = messageContent;
+        this.extra = extra;
+    }
+
+    public ImTxtMessage(String messageContent, String extra, String fileUrl) {
+        this.type = "RC:ImgMsg";
+        this.messageContent = messageContent;
+        this.extra = extra;
+        this.fileUrl = fileUrl;
+    }
+
+    public ImTxtMessage(String name, Long size, String fileUrl, String extra) {
+        this.type = "RC:FileMsg";
+        this.name = name;
+        this.size = size;
+        this.fileUrl = fileUrl;
         this.extra = extra;
     }
 
     public String getType() {
-        return TYPE;
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Long getSize() {
+        return size;
+    }
+
+    public void setSize(Long size) {
+        this.size = size;
+    }
+
+    public String getFileUrl() {
+        return fileUrl;
+    }
+
+    public void setFileUrl(String fileUrl) {
+        this.fileUrl = fileUrl;
     }
 
-    public String getContent() {
-        return this.content;
+    public String getMessageContent() {
+        return messageContent;
     }
 
-    public void setContent(String content) {
-        this.content = content;
+    public void setMessageContent(String messageContent) {
+        this.messageContent = messageContent;
     }
 
     public String getExtra() {

+ 11 - 1
mec-common/common-core/src/main/java/com/ym/mec/common/entity/UploadReturnBean.java

@@ -20,7 +20,17 @@ public class UploadReturnBean {
 
 	private String message;// 上传失败 返回原因
 
-	private String name;
+	private String name;// 上传文件名
+
+	private Long size;//文件大小
+
+	public Long getSize() {
+		return size;
+	}
+
+	public void setSize(Long size) {
+		this.size = size;
+	}
 
 	public String getName() {
 		return name;

+ 16 - 10
mec-im/src/main/java/com/ym/controller/GroupController.java

@@ -1,10 +1,11 @@
 package com.ym.controller;
 
-import com.ym.mec.common.entity.ImGroupMessage;
-import com.ym.mec.common.entity.ImTxtMessage;
+import com.ym.mec.common.entity.ImMessageDto;
 import com.ym.pojo.NoticeMessage;
 import com.ym.service.GroupService;
 import com.ym.service.MessageService;
+import io.rong.messages.FileMessage;
+import io.rong.messages.ImgMessage;
 import io.rong.messages.TxtMessage;
 import io.rong.models.group.GroupMember;
 import io.rong.models.group.GroupModel;
@@ -33,20 +34,25 @@ public class GroupController{
     GroupService groupService;
 
     @RequestMapping(value = "/send", method = RequestMethod.POST)
-    public Object send(@RequestBody ImGroupMessage imGroupMessage) throws Exception {
+    public Object send(@RequestBody ImMessageDto imMessageDto) throws Exception {
         GroupMessage groupMessage = new GroupMessage();
-        ImTxtMessage imTxtMessage = (ImTxtMessage) imGroupMessage.getContent();
-        String objectName = imGroupMessage.getObjectName();
+        String objectName = imMessageDto.getObjectName();
         if("DY:NoticeMsg".equals(objectName)){
-            NoticeMessage noticeMessage = new NoticeMessage(imTxtMessage.getContent(),imTxtMessage.getExtra());
+            NoticeMessage noticeMessage = new NoticeMessage(imMessageDto.getMessageContent(),imMessageDto.getExtra());
             groupMessage.setContent(noticeMessage);
+        }else if("RC:ImgMsg".equals(objectName)){
+            ImgMessage imgMessage = new ImgMessage(imMessageDto.getMessageContent(),imMessageDto.getExtra(),imMessageDto.getFileUrl());
+            groupMessage.setContent(imgMessage);
+        }else if("RC:FileMsg".equals(objectName)){
+            FileMessage imgMessage = new FileMessage(imMessageDto.getFileName(),imMessageDto.getFileSize(),imMessageDto.getFileUrl(),imMessageDto.getExtra());
+            groupMessage.setContent(imgMessage);
         }else {
-            TxtMessage txtMessage = new TxtMessage(imTxtMessage.getContent(),imTxtMessage.getExtra());
+            TxtMessage txtMessage = new TxtMessage(imMessageDto.getMessageContent(),imMessageDto.getExtra());
             groupMessage.setContent(txtMessage);
         }
-        groupMessage.setTargetId(imGroupMessage.getTargetId());
-        groupMessage.setSenderId(imGroupMessage.getSenderId());
-        groupMessage.setObjectName(imGroupMessage.getObjectName());
+        groupMessage.setTargetId(imMessageDto.getTargetIds());
+        groupMessage.setSenderId(imMessageDto.getSenderId());
+        groupMessage.setObjectName(imMessageDto.getObjectName());
         groupMessage.setIsIncludeSender(1);
         return messageService.groupSend(groupMessage);
     }

+ 2 - 2
mec-im/src/main/java/com/ym/controller/PrivateController.java

@@ -26,8 +26,8 @@ public class PrivateController {
     @RequestMapping(value = "/send", method = RequestMethod.POST)
     public Object send(@RequestBody ImPrivateMessage imPrivateMessage) throws Exception {
         PrivateMessage privateMessage = new PrivateMessage();
-        ImTxtMessage content = (ImTxtMessage)imPrivateMessage.getContent();
-        TxtMessage txtMessage = new TxtMessage(content.getContent(),content.getExtra());
+        ImTxtMessage content = imPrivateMessage.getContent();
+        TxtMessage txtMessage = new TxtMessage(content.getMessageContent(),content.getExtra());
         privateMessage.setContent(txtMessage);
         privateMessage.setTargetId(imPrivateMessage.getTargetId());
         privateMessage.setSenderId(imPrivateMessage.getSenderId());

+ 2 - 2
mec-im/src/main/java/com/ym/controller/SystemController.java

@@ -30,8 +30,8 @@ public class SystemController {
     @RequestMapping(value = "/send", method = RequestMethod.POST)
     public Object send(@RequestBody ImSystemMessage imSystemMessage) throws Exception {
         SystemMessage systemMessage = new SystemMessage();
-        ImTxtMessage content = (ImTxtMessage)imSystemMessage.getContent();
-        TxtMessage txtMessage = new TxtMessage(content.getContent(),content.getExtra());
+        ImTxtMessage content = imSystemMessage.getContent();
+        TxtMessage txtMessage = new TxtMessage(content.getMessageContent(),content.getExtra());
         systemMessage.setContent(txtMessage);
         systemMessage.setSenderId(imSystemMessage.getSenderId());
         systemMessage.setObjectName(imSystemMessage.getObjectName());

+ 26 - 31
mec-web/src/main/java/com/ym/mec/web/controller/ImGroupController.java

@@ -1,11 +1,27 @@
 package com.ym.mec.web.controller;
 
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
+import com.ym.mec.biz.dal.dto.ImUserFriendDto;
+import com.ym.mec.biz.dal.entity.ImGroup;
+import com.ym.mec.biz.dal.entity.ImSendGroupMessage;
+import com.ym.mec.biz.dal.page.ImGroupNoticeQueryInfo;
 import com.ym.mec.biz.service.ImGroupMemberService;
+import com.ym.mec.biz.service.ImGroupNoticeService;
+import com.ym.mec.biz.service.ImGroupService;
+import com.ym.mec.biz.service.ImUserFriendService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
 import com.yonge.log.model.AuditLogAnnotation;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 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.*;
 
 import java.util.Arrays;
 import java.util.Date;
@@ -13,25 +29,6 @@ import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
-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.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import com.ym.mec.auth.api.client.SysUserFeignService;
-import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dto.ImUserFriendDto;
-import com.ym.mec.biz.dal.entity.ImGroup;
-import com.ym.mec.biz.dal.page.ImGroupNoticeQueryInfo;
-import com.ym.mec.biz.service.ImGroupNoticeService;
-import com.ym.mec.biz.service.ImGroupService;
-import com.ym.mec.biz.service.ImUserFriendService;
-import com.ym.mec.common.controller.BaseController;
-
 @RequestMapping("imGroup")
 @Api(tags = "IM群服务")
 @RestController
@@ -54,7 +51,7 @@ public class ImGroupController extends BaseController {
 
 	@ApiOperation("查询群列表")
 	@GetMapping(value = "/queryGroupList")
-	public Object queryGroupList(String search) {
+	public HttpResponseResult<List<ImGroup>> queryGroupList(String search) {
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if (Objects.isNull(sysUser)) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");
@@ -65,7 +62,7 @@ public class ImGroupController extends BaseController {
 
 	@ApiOperation("查询群详情")
 	@GetMapping(value = "/queryGroupDetail")
-	public Object queryGroupDetail(String imGroupId) {
+	public HttpResponseResult<ImGroup> queryGroupDetail(String imGroupId) {
 		if (imGroupId.contains("S") || imGroupId.contains("I")){
 			imGroupId = imGroupId.substring(1);
 		}
@@ -74,41 +71,39 @@ public class ImGroupController extends BaseController {
 
 	@ApiOperation("修改群信息")
 	@PostMapping(value = "/updateImGroup")
-	public Object updateImGroup(@RequestBody ImGroup imGroup) {
+	public HttpResponseResult<Integer> updateImGroup(@RequestBody ImGroup imGroup) {
 		imGroup.setUpdateTime(new Date());
 		return succeed(imGroupService.update(imGroup));
 	}
 
 	@ApiOperation("修改群成员信息")
 	@PostMapping(value = "/updateNickName")
-	public Object updateNickName(Integer userId,String nickName) {
+	public HttpResponseResult updateNickName(Integer userId,String nickName) {
 		imGroupService.updateNickName1(userId,nickName);
 		return succeed();
 	}
 
 	@ApiOperation("查询群成员列表")
 	@GetMapping(value = "/queryGroupMemberList")
-	public Object queryGroupMemberList(Long imGroupId) {
-
+	public HttpResponseResult<List<ImGroupMemberDto>> queryGroupMemberList(Long imGroupId) {
 		return succeed(imGroupService.queryMemberById(imGroupId));
 	}
 
 	@ApiOperation("查询群学生列表")
 	@GetMapping(value = "/queryGroupStudentList")
-	public Object queryGroupStudentList(Long imGroupId) {
-
+	public HttpResponseResult<List<ImGroupMemberDto>> queryGroupStudentList(Long imGroupId) {
 		return succeed(imGroupService.queryMemberById(imGroupId).stream().filter(e -> StringUtils.isBlank(e.getRoleType())).collect(Collectors.toList()));
 	}
 
 	@ApiOperation("查询群成员详情")
 	@GetMapping(value = "/queryGroupMemberDetail")
-	public Object queryGroupMemberDetail(Long imGroupId, Integer userId) {
+	public HttpResponseResult<ImGroupMemberDto> queryGroupMemberDetail(Long imGroupId, Integer userId) {
 		return succeed(imGroupService.queryMember(imGroupId, userId));
 	}
 
 	@ApiOperation("查询好友详情")
 	@GetMapping(value = "/queryFriendDetail")
-	public Object queryFriendDetail(Integer userId) {
+	public HttpResponseResult<ImUserFriendDto> queryFriendDetail(Integer userId) {
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if (Objects.isNull(sysUser)) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");
@@ -132,7 +127,7 @@ public class ImGroupController extends BaseController {
 
 	@ApiOperation("查询好友列表")
 	@GetMapping(value = "/queryFriendList")
-	public Object queryFriendList(String search) {
+	public HttpResponseResult<List<ImUserFriendDto>> queryFriendList(String search) {
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if (Objects.isNull(sysUser)) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");
@@ -143,7 +138,7 @@ public class ImGroupController extends BaseController {
 
 	@ApiOperation("查询好友中的学生列表")
 	@GetMapping(value = "/queryFriendStudentList")
-	public Object queryFriendStudentList(String search) {
+	public HttpResponseResult<List<ImUserFriendDto>> queryFriendStudentList(String search) {
 		SysUser sysUser = sysUserFeignService.queryUserInfo();
 		if (Objects.isNull(sysUser)) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");

+ 36 - 0
mec-web/src/main/java/com/ym/mec/web/controller/ImSendGroupMessageController.java

@@ -0,0 +1,36 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.biz.dal.entity.ImSendGroupMessage;
+import com.ym.mec.biz.service.ImSendGroupMessageService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Api(tags = "群消息定时发送")
+@RequestMapping("imSendGroupMessage")
+@RestController
+public class ImSendGroupMessageController extends BaseController {
+
+    @Autowired
+    private ImSendGroupMessageService imSendGroupMessageService;
+
+    @ApiOperation("发送群聊消息")
+    @PostMapping(value = "/send")
+    public HttpResponseResult send(@RequestBody ImSendGroupMessage imSendGroupMessage) throws Exception {
+        imSendGroupMessageService.sendGroupMessage(imSendGroupMessage);
+        return succeed();
+    }
+
+    @ApiOperation("修改未发送的群消息")
+    @PostMapping(value = "/update")
+    public HttpResponseResult update(@RequestBody ImSendGroupMessage imSendGroupMessage) throws Exception {
+        imSendGroupMessageService.updateGroupMessage(imSendGroupMessage);
+        return succeed();
+    }
+}

+ 19 - 21
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -1,25 +1,5 @@
 package com.ym.mec.web.controller;
 
-import com.ym.mec.biz.service.*;
-import io.swagger.annotations.ApiOperation;
-
-import java.io.File;
-import java.net.URL;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang3.StringUtils;
-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 com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ym.mec.biz.dal.dao.MusicGroupSchoolTermCourseDetailDao;
@@ -27,12 +7,26 @@ import com.ym.mec.biz.dal.entity.MusicGroupSchoolTermCourseDetail;
 import com.ym.mec.biz.dal.entity.TenantInfo;
 import com.ym.mec.biz.dal.enums.IndexDataType;
 import com.ym.mec.biz.event.source.CourseEventSource;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.redis.service.RedisCache;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.im.ImFeignService;
 import com.ym.mec.util.date.DateUtil;
 import com.yonge.log.service.HistoryMessageService;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+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.io.File;
+import java.net.URL;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 @RequestMapping("task")
 @RestController
@@ -122,6 +116,8 @@ public class TaskController extends BaseController {
     private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
 	@Autowired
 	private StudentStatisticsService studentStatisticsService;
+	@Autowired
+	private ImSendGroupMessageService imSendGroupMessageService;
 
 	@GetMapping(value = "/syncImHistoryMessageTask")
 	// 同步即时通讯聊天记录
@@ -233,11 +229,13 @@ public class TaskController extends BaseController {
 
 	@GetMapping("/updateCourseScheduleToOverStatus")
 	// 更新课程状态至已结束
-	public void updateCourseScheduleToOverStatus() {
+	public void updateCourseScheduleToOverStatus() throws Exception {
 		List<Long> courseIds = courseScheduleService.updateCourseScheduleToOverStatus();
 		courseEventSource.courseStatusChange(courseIds);
 		courseIds = courseScheduleService.updateCourseScheduleToUnderway();
 		courseEventSource.courseStatusChange(courseIds);
+		//发送定时群消息
+		imSendGroupMessageService.sendTimedMessages();
 		//更新乐团课统计信息
 		courseScheduleStatisticsService.courseScheduleStatistics();
 	}

+ 1 - 0
mec-web/src/main/java/com/ym/mec/web/controller/UploadFileController.java

@@ -44,6 +44,7 @@ public class UploadFileController extends BaseController {
 		try {
 			if (file != null && StringUtils.isNotBlank(file.getOriginalFilename())) {
 				UploadReturnBean bean = uploadFileService.uploadFile(file.getInputStream(), UploadUtil.getExtension(file.getOriginalFilename()));
+				bean.setSize(file.getSize());
 				bean.setName(file.getOriginalFilename());
 				if (bean.isStatus()) {
 					return succeed(bean);