Browse Source

消息实体联调完成

wany 1 year ago
parent
commit
c508b35c11

+ 68 - 0
src/main/java/com/kingtom/shengtai/api/controller/MessageController.java

@@ -0,0 +1,68 @@
+package com.kingtom.shengtai.api.controller;
+
+import java.util.List;
+
+import com.kingtom.kirin.api.security.SaSecurityUtils;
+import com.kingtom.kirin.core.common.base.PageInfo;
+import com.kingtom.kirin.core.common.base.Result;
+import com.kingtom.kirin.core.common.utils.CollectionUtils;
+import com.kingtom.shengtai.api.model.MsgSummaryDTO;
+import com.kingtom.shengtai.app.message.model.MsgReceive;
+import com.kingtom.shengtai.app.message.service.IMsgReceiveService;
+import com.kingtom.shengtai.app.message.service.IMsgSummaryService;
+import com.mybatisflex.core.paginate.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 消息接收记录表 控制层。
+ *
+ * @author 86181
+ * @since 2023-12-27
+ */
+@RestController
+@RequestMapping("/message")
+@Tag(name = "MessageController", description = "消息接收记录表 控制层。")
+public class MessageController{
+
+    @Autowired
+    private IMsgSummaryService summaryService;
+
+
+    @Autowired
+    private IMsgReceiveService receiveService;
+
+    /**
+     * 分页查询消息内容表
+     *
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @Operation(description = "分页查询消息内容表")
+    @GetMapping("page")
+    public Result<PageInfo<MsgSummaryDTO>> page(Integer pageNum, Integer pageSize){
+        String userId = SaSecurityUtils.findSessionData().getUserId();
+        Page<MsgReceive> page = receiveService.page(userId, pageNum, pageSize);
+        return Result.ok(CollectionUtils.convertPage(page, MsgSummaryDTO::convert));
+    }
+
+    @Operation(description = "消息已读")
+    @PostMapping("read")
+    public Result<String> read(@RequestBody List<String> msgIds){
+        String userId = SaSecurityUtils.findSessionData().getUserId();
+        receiveService.updateMsgRead(userId, msgIds);
+        return Result.ok(null);
+    }
+
+    @Operation(description = "消息全部已读")
+    @PostMapping("readAll")
+    public Result<String> readAll(){
+        String userId = SaSecurityUtils.findSessionData().getUserId();
+        receiveService.updateMsgRead(userId, null);
+        return Result.ok(null);
+    }
+
+}

+ 31 - 0
src/main/java/com/kingtom/shengtai/api/mapper/MsgMapper.java

@@ -0,0 +1,31 @@
+package com.kingtom.shengtai.api.mapper;
+
+import com.kingtom.shengtai.api.model.MsgSummaryDTO;
+import com.kingtom.shengtai.app.message.model.MsgSummary;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.factory.Mappers;
+
+/**
+ * 应用模块名称</p>
+ * 代码描述</p>
+ * Copyright: Copyright (C) 2023 , Inc. All rights reserved. <p>
+ * Company: 成都诚唐科技有限责任公司</p>
+ *
+ * @author wany
+ * @since 2023/12/27
+ */
+@Mapper
+public interface MsgMapper{
+
+    public static final MsgMapper INSTANCE = Mappers.getMapper(MsgMapper.class);
+
+    @Mapping(target = "gmtCreate", dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @Mapping(target = "gmtModified", dateFormat = "yyyy-MM-dd HH:mm:ss")
+    MsgSummary convert(MsgSummaryDTO dto);
+
+    @Mapping(target = "gmtCreate", dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @Mapping(target = "gmtModified", dateFormat = "yyyy-MM-dd HH:mm:ss")
+    MsgSummaryDTO convert(MsgSummary dto);
+
+}

+ 72 - 0
src/main/java/com/kingtom/shengtai/api/model/MsgSummaryDTO.java

@@ -0,0 +1,72 @@
+package com.kingtom.shengtai.api.model;
+
+import com.kingtom.shengtai.api.mapper.MsgMapper;
+import com.kingtom.shengtai.app.message.model.MsgReceive;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 应用模块名称</p>
+ * 代码描述</p>
+ * Copyright: Copyright (C) 2023 , Inc. All rights reserved. <p>
+ * Company: 成都诚唐科技有限责任公司</p>
+ *
+ * @author wany
+ * @since 2023/12/27
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(description = "消息摘要")
+public class MsgSummaryDTO{
+
+    @Schema(description = "主键")
+    private String id;
+
+    @Schema(description = "消息类型")
+    private String type;
+
+    @Schema(description = "消息标题")
+    private String title;
+
+    @Schema(description = "消息内容")
+    private String content;
+
+    @Schema(description = "发送人")
+    private String sender;
+
+    @Schema(description = "扩展字段1")
+    private String ext1;
+
+    @Schema(description = "扩展字段2")
+    private String ext2;
+
+    @Schema(description = "扩展字段3")
+    private String ext3;
+
+    @Schema(description = "创建时间")
+    private String gmtCreate;
+
+    @Schema(description = "更新时间")
+    private String gmtModified;
+
+    @Schema(description = "系统ID")
+    private String sysId;
+
+    @Schema(description = "阅读状态")
+    private Integer read;
+
+    public static MsgSummaryDTO convert(MsgReceive receive){
+        if(receive == null || receive.getSummary() == null){
+            return null;
+        }
+        MsgSummaryDTO convert = MsgMapper.INSTANCE.convert(receive.getSummary());
+        convert.setRead(receive.getReadState());
+        return convert;
+    }
+
+}

+ 14 - 0
src/main/java/com/kingtom/shengtai/app/message/dao/IMsgReceiveDao.java

@@ -0,0 +1,14 @@
+package com.kingtom.shengtai.app.message.dao;
+
+import com.kingtom.kirin.core.common.base.dao.IBaseDao;
+import com.kingtom.shengtai.app.message.model.MsgReceive;
+
+/**
+ * 消息接收记录表 映射层。
+ *
+ * @author 86181
+ * @since 2023-12-27
+ */
+public interface IMsgReceiveDao extends IBaseDao<MsgReceive> {
+
+}

+ 14 - 0
src/main/java/com/kingtom/shengtai/app/message/dao/IMsgSummaryDao.java

@@ -0,0 +1,14 @@
+package com.kingtom.shengtai.app.message.dao;
+
+import com.kingtom.kirin.core.common.base.dao.IBaseDao;
+import com.kingtom.shengtai.app.message.model.MsgSummary;
+
+/**
+ * 消息内容表 映射层。
+ *
+ * @author 86181
+ * @since 2023-12-27
+ */
+public interface IMsgSummaryDao extends IBaseDao<MsgSummary> {
+
+}

+ 100 - 0
src/main/java/com/kingtom/shengtai/app/message/model/MsgReceive.java

@@ -0,0 +1,100 @@
+package com.kingtom.shengtai.app.message.model;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.RelationOneToOne;
+import com.mybatisflex.annotation.Table;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 消息接收记录表 实体类。
+ *
+ * @author 86181
+ * @since 2023-12-27
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(value = "msg_receive", schema = "public")
+public class MsgReceive implements Serializable{
+
+    @Serial
+    private static final long serialVersionUID = 8105460224771439655L;
+
+    /**
+     * 主键
+     */
+    @Id
+    private String id;
+
+    /**
+     * 消息Id
+     */
+    private String msgId;
+
+    /**
+     * 接收人
+     */
+    private String receiver;
+
+    /**
+     * 接收状态
+     */
+    private Integer receiveState;
+
+    /**
+     * 接收时间
+     */
+    private Date receiveTime;
+
+    /**
+     * 阅读状态
+     */
+    private Integer readState;
+
+    /**
+     * 阅读时间
+     */
+    private Date readTime;
+
+    /**
+     * 扩展字段1
+     */
+    private String ext1;
+
+    /**
+     * 扩展字段2
+     */
+    private String ext2;
+
+    /**
+     * 扩展字段3
+     */
+    private String ext3;
+
+    /**
+     * 创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 更新时间
+     */
+    private Date gmtModified;
+
+    /**
+     * 系统ID
+     */
+    private String sysId;
+
+    @RelationOneToOne(selfField = "msgId", targetField = "id")
+    private MsgSummary summary;
+
+}

+ 88 - 0
src/main/java/com/kingtom/shengtai/app/message/model/MsgSummary.java

@@ -0,0 +1,88 @@
+package com.kingtom.shengtai.app.message.model;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.RelationOneToOne;
+import com.mybatisflex.annotation.Table;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 消息内容表 实体类。
+ *
+ * @author 86181
+ * @since 2023-12-27
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(value = "msg_summary", schema = "public")
+public class MsgSummary implements Serializable{
+
+    @Serial
+    private static final long serialVersionUID = 8534273084950871586L;
+
+    /**
+     * 主键
+     */
+    @Id
+    private String id;
+
+    /**
+     * 消息类型
+     */
+    private String type;
+
+    /**
+     * 消息标题
+     */
+    private String title;
+
+    /**
+     * 消息内容
+     */
+    private String content;
+
+    /**
+     * 发送人
+     */
+    private String sender;
+
+    /**
+     * 扩展字段1
+     */
+    private String ext1;
+
+    /**
+     * 扩展字段2
+     */
+    private String ext2;
+
+    /**
+     * 扩展字段3
+     */
+    private String ext3;
+
+    /**
+     * 创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 更新时间
+     */
+    private Date gmtModified;
+
+    /**
+     * 系统ID
+     */
+    private String sysId;
+
+
+}

+ 103 - 0
src/main/java/com/kingtom/shengtai/app/message/model/table/MsgReceiveTableDef.java

@@ -0,0 +1,103 @@
+package com.kingtom.shengtai.app.message.model.table;
+
+import java.io.Serial;
+
+import com.mybatisflex.core.query.QueryColumn;
+import com.mybatisflex.core.table.TableDef;
+
+/**
+ * 消息接收记录表 表定义层。
+ *
+ * @author 86181
+ * @since 2023-12-27
+ */
+public class MsgReceiveTableDef extends TableDef {
+
+    /**
+     * 消息接收记录表
+     */
+    public static final MsgReceiveTableDef MSG_RECEIVE = new MsgReceiveTableDef();
+
+    @Serial
+    private static final long serialVersionUID = -3011010943831506346L;
+
+    /**
+     * 主键
+     */
+    public final QueryColumn ID = new QueryColumn(this, "id");
+
+    /**
+     * 扩展字段1
+     */
+    public final QueryColumn EXT1 = new QueryColumn(this, "ext1");
+
+    /**
+     * 扩展字段2
+     */
+    public final QueryColumn EXT2 = new QueryColumn(this, "ext2");
+
+    /**
+     * 扩展字段3
+     */
+    public final QueryColumn EXT3 = new QueryColumn(this, "ext3");
+
+    /**
+     * 消息Id
+     */
+    public final QueryColumn MSG_ID = new QueryColumn(this, "msg_id");
+
+    /**
+     * 系统ID
+     */
+    public final QueryColumn SYS_ID = new QueryColumn(this, "sys_id");
+
+    /**
+     * 阅读时间
+     */
+    public final QueryColumn READ_TIME = new QueryColumn(this, "read_time");
+
+    /**
+     * 接收人
+     */
+    public final QueryColumn RECEIVER = new QueryColumn(this, "receiver");
+
+    /**
+     * 创建时间
+     */
+    public final QueryColumn GMT_CREATE = new QueryColumn(this, "gmt_create");
+
+    /**
+     * 阅读状态
+     */
+    public final QueryColumn READ_STATE = new QueryColumn(this, "read_state");
+
+    /**
+     * 更新时间
+     */
+    public final QueryColumn GMT_MODIFIED = new QueryColumn(this, "gmt_modified");
+
+    /**
+     * 接收时间
+     */
+    public final QueryColumn RECEIVE_TIME = new QueryColumn(this, "receive_time");
+
+    /**
+     * 接收状态
+     */
+    public final QueryColumn RECEIVE_STATE = new QueryColumn(this, "receive_state");
+
+    /**
+     * 所有字段。
+     */
+    public final QueryColumn ALL_COLUMNS = new QueryColumn(this, "*");
+
+    /**
+     * 默认字段,不包含逻辑删除或者 large 等字段。
+     */
+    public final QueryColumn[] DEFAULT_COLUMNS = new QueryColumn[]{ID, MSG_ID, RECEIVER, RECEIVE_STATE, RECEIVE_TIME, READ_STATE, READ_TIME, EXT1, EXT2, EXT3, GMT_CREATE, GMT_MODIFIED, SYS_ID};
+
+    public MsgReceiveTableDef() {
+        super("public", "msg_receive");
+    }
+
+}

+ 88 - 0
src/main/java/com/kingtom/shengtai/app/message/model/table/MsgSummaryTableDef.java

@@ -0,0 +1,88 @@
+package com.kingtom.shengtai.app.message.model.table;
+
+import java.io.Serial;
+
+import com.mybatisflex.core.query.QueryColumn;
+import com.mybatisflex.core.table.TableDef;
+
+/**
+ * 消息内容表 表定义层。
+ *
+ * @author 86181
+ * @since 2023-12-27
+ */
+public class MsgSummaryTableDef extends TableDef {
+
+    /**
+     * 消息内容表
+     */
+    public static final MsgSummaryTableDef MSG_SUMMARY = new MsgSummaryTableDef();
+
+    @Serial
+    private static final long serialVersionUID = 1229728280935555759L;
+
+    /**
+     * 主键
+     */
+    public final QueryColumn ID = new QueryColumn(this, "id");
+
+    /**
+     * 扩展字段1
+     */
+    public final QueryColumn EXT1 = new QueryColumn(this, "ext1");
+
+    /**
+     * 扩展字段2
+     */
+    public final QueryColumn EXT2 = new QueryColumn(this, "ext2");
+
+    /**
+     * 扩展字段3
+     */
+    public final QueryColumn EXT3 = new QueryColumn(this, "ext3");
+
+    /**
+     * 消息类型
+     */
+    public final QueryColumn TYPE = new QueryColumn(this, "type");
+
+    /**
+     * 系统ID
+     */
+    public final QueryColumn SYS_ID = new QueryColumn(this, "sys_id");
+
+    /**
+     * 发送人
+     */
+    public final QueryColumn SENDER = new QueryColumn(this, "sender");
+
+    /**
+     * 消息内容
+     */
+    public final QueryColumn CONTENT = new QueryColumn(this, "content");
+
+    /**
+     * 创建时间
+     */
+    public final QueryColumn GMT_CREATE = new QueryColumn(this, "gmt_create");
+
+    /**
+     * 更新时间
+     */
+    public final QueryColumn GMT_MODIFIED = new QueryColumn(this, "gmt_modified");
+
+    /**
+     * 所有字段。
+     */
+    public final QueryColumn ALL_COLUMNS = new QueryColumn(this, "*");
+
+    /**
+     * 默认字段,不包含逻辑删除或者 large 等字段。
+     */
+    public final QueryColumn[] DEFAULT_COLUMNS = new QueryColumn[]{ID, TYPE, CONTENT, SENDER, EXT1, EXT2, EXT3, GMT_CREATE, GMT_MODIFIED, SYS_ID};
+
+    public MsgSummaryTableDef() {
+        super("public", "msg_summary");
+    }
+
+}

+ 44 - 0
src/main/java/com/kingtom/shengtai/app/message/service/IMsgReceiveService.java

@@ -0,0 +1,44 @@
+package com.kingtom.shengtai.app.message.service;
+
+import java.util.List;
+
+import com.kingtom.kirin.core.common.base.service.IBaseService;
+import com.kingtom.shengtai.app.message.model.MsgReceive;
+import com.kingtom.shengtai.app.message.model.MsgSummary;
+import com.mybatisflex.core.paginate.Page;
+
+/**
+ * 消息接收记录表 服务层。
+ *
+ * @author 86181
+ * @since 2023 -12-27
+ */
+public interface IMsgReceiveService extends IBaseService<MsgReceive>{
+
+    /**
+     * 创建
+     *
+     * @param msgId    the msg id
+     * @param receiver the receiver
+     */
+    void create(String msgId, List<String> receiver);
+
+    /**
+     * 标记消息已读.
+     *
+     * @param userId the user id
+     * @param msgIds the msg ids
+     */
+    void updateMsgRead(String userId, List<String> msgIds);
+
+    /**
+     * 分页查询个人消息
+     *
+     * @param userId
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    Page<MsgReceive> page(String userId, Integer pageNum, Integer pageSize);
+
+}

+ 24 - 0
src/main/java/com/kingtom/shengtai/app/message/service/IMsgSummaryService.java

@@ -0,0 +1,24 @@
+package com.kingtom.shengtai.app.message.service;
+
+import java.util.List;
+
+import com.kingtom.kirin.core.common.base.service.IBaseService;
+import com.kingtom.shengtai.app.message.model.MsgSummary;
+
+/**
+ * 消息内容表 服务层。
+ *
+ * @author 86181
+ * @since 2023-12-27
+ */
+public interface IMsgSummaryService extends IBaseService<MsgSummary>{
+
+    /**
+     * 创建消息、消息接收
+     *
+     * @param summary
+     * @param receiver
+     */
+    void createMsg(MsgSummary summary, List<String> receiver);
+
+}

+ 66 - 0
src/main/java/com/kingtom/shengtai/app/message/service/impl/MsgReceiveServiceImpl.java

@@ -0,0 +1,66 @@
+package com.kingtom.shengtai.app.message.service.impl;
+
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.kingtom.kirin.app.system.utils.SystemUtils;
+import com.kingtom.kirin.core.common.CommonConst;
+import com.kingtom.kirin.core.common.base.service.impl.BaseServiceImpl;
+import com.kingtom.kirin.core.common.utils.IDUtils;
+import com.kingtom.shengtai.app.message.dao.IMsgReceiveDao;
+import com.kingtom.shengtai.app.message.model.MsgReceive;
+import com.kingtom.shengtai.app.message.service.IMsgReceiveService;
+import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.query.QueryCondition;
+import com.mybatisflex.core.query.QueryWrapper;
+import org.springframework.stereotype.Service;
+
+import static com.kingtom.shengtai.app.message.model.table.MsgReceiveTableDef.MSG_RECEIVE;
+
+/**
+ * 消息接收记录表 服务层实现。
+ *
+ * @author 86181
+ * @since 2023-12-27
+ */
+@Service
+public class MsgReceiveServiceImpl extends BaseServiceImpl<IMsgReceiveDao, MsgReceive> implements IMsgReceiveService{
+
+    @Override
+    public void create(String msgId, List<String> receiver){
+        Date date = new Date();
+        List<MsgReceive> receives = receiver.stream().map(e -> {
+            MsgReceive receive = new MsgReceive();
+            receive.setMsgId(msgId);
+            receive.setReceiver(e);
+            receive.setId(IDUtils.newUUID());
+            receive.setReceiveState(CommonConst.BooleanEnum.False.getKey());
+            receive.setReadState(CommonConst.BooleanEnum.False.getKey());
+            receive.setGmtCreate(date);
+            receive.setGmtModified(receive.getGmtCreate());
+            receive.setSysId(SystemUtils.getCurrentSystemId());
+            return receive;
+        }).collect(Collectors.toList());
+        mapper.insertBatch(receives);
+    }
+
+    @Override
+    public void updateMsgRead(String userId, List<String> msgIds){
+        QueryCondition condition = MSG_RECEIVE.RECEIVER.eq(userId).and(MSG_RECEIVE.MSG_ID.in(msgIds))
+                .and(MSG_RECEIVE.READ_STATE.eq(CommonConst.BooleanEnum.False.getKey()));
+        MsgReceive receive = new MsgReceive();
+        receive.setReadState(CommonConst.BooleanEnum.True.getKey());
+        receive.setReadTime(new Date());
+        receive.setGmtModified(receive.getReadTime());
+        mapper.updateByCondition(receive, condition);
+    }
+
+    @Override
+    public Page<MsgReceive> page(String userId, Integer pageNum, Integer pageSize){
+        QueryWrapper wrapper = QueryWrapper.create().from(MSG_RECEIVE).where(MSG_RECEIVE.RECEIVER.eq(userId))
+                .orderBy(MSG_RECEIVE.GMT_CREATE, false);
+        return mapper.paginateWithRelations(pageNum, pageSize, wrapper);
+    }
+
+}

+ 56 - 0
src/main/java/com/kingtom/shengtai/app/message/service/impl/MsgSummaryServiceImpl.java

@@ -0,0 +1,56 @@
+package com.kingtom.shengtai.app.message.service.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import com.kingtom.kirin.app.system.utils.SystemUtils;
+import com.kingtom.kirin.core.common.base.service.impl.BaseServiceImpl;
+import com.kingtom.kirin.core.common.exception.AppException;
+import com.kingtom.kirin.core.common.utils.CollectionUtils;
+import com.kingtom.kirin.core.common.utils.IDUtils;
+import com.kingtom.shengtai.app.message.dao.IMsgSummaryDao;
+import com.kingtom.shengtai.app.message.model.MsgSummary;
+import com.kingtom.shengtai.app.message.service.IMsgReceiveService;
+import com.kingtom.shengtai.app.message.service.IMsgSummaryService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 消息内容表 服务层实现。
+ *
+ * @author 86181
+ * @since 2023-12-27
+ */
+@Service
+public class MsgSummaryServiceImpl extends BaseServiceImpl<IMsgSummaryDao, MsgSummary> implements IMsgSummaryService{
+
+    @Autowired
+    private IMsgReceiveService msgReceiveService;
+
+    @Override
+    public void createMsg(MsgSummary summary, List<String> receiver){
+        if(summary == null){
+            throw new AppException("消息摘要不能为空!");
+        }
+        if(StringUtils.isBlank(summary.getType())){
+            throw new AppException("消息类型不能为空!");
+        }
+        if(StringUtils.isBlank(summary.getTitle())){
+            throw new AppException("消息标题不能为空!");
+        }
+        if(StringUtils.isBlank(summary.getContent())){
+            throw new AppException("消息内容不能为空!");
+        }
+        if(CollectionUtils.isEmpty(receiver)){
+            throw new AppException("消息接受者不能为空!");
+        }
+        summary.setId(IDUtils.newUUID());
+        summary.setGmtCreate(new Date());
+        summary.setGmtModified(summary.getGmtCreate());
+        summary.setSysId(SystemUtils.getCurrentSystemId());
+        mapper.insert(summary);
+        msgReceiveService.create(summary.getId(), receiver);
+    }
+
+}

+ 64 - 0
src/main/resources/db/V2.02__20231227_initMsg.sql

@@ -0,0 +1,64 @@
+-- ----------------------------
+-- Table structure for msg_summary
+-- ----------------------------
+DROP TABLE IF EXISTS "public"."msg_summary";
+CREATE TABLE "public"."msg_summary" (
+    "id"           VARCHAR(36) COLLATE "pg_catalog"."default"   NOT NULL PRIMARY KEY,
+    "type"         VARCHAR(128) COLLATE "pg_catalog"."default"  NOT NULL,
+    "title"        VARCHAR(128) COLLATE "pg_catalog"."default"  NOT NULL,
+    "content"      VARCHAR(1024) COLLATE "pg_catalog"."default" NOT NULL,
+    "sender"       VARCHAR(36) COLLATE "pg_catalog"."default",
+    "ext1"         VARCHAR(1024) COLLATE "pg_catalog"."default",
+    "ext2"         VARCHAR(1024) COLLATE "pg_catalog"."default",
+    "ext3"         TEXT COLLATE "pg_catalog"."default",
+    "gmt_create"   TIMESTAMP(3)                                 NOT NULL,
+    "gmt_modified" TIMESTAMP(3)                                 NOT NULL,
+    "sys_id"       VARCHAR(36) COLLATE "pg_catalog"."default"   NOT NULL
+);
+COMMENT ON TABLE "public"."msg_summary" IS '消息内容表';
+COMMENT ON COLUMN "public"."msg_summary"."id" IS '主键';
+COMMENT ON COLUMN "public"."msg_summary"."type" IS '消息类型';
+COMMENT ON COLUMN "public"."msg_summary"."title" IS '消息标题';
+COMMENT ON COLUMN "public"."msg_summary"."content" IS '消息内容';
+COMMENT ON COLUMN "public"."msg_summary"."sender" IS '发送人';
+COMMENT ON COLUMN "public"."msg_summary"."ext1" IS '扩展字段1';
+COMMENT ON COLUMN "public"."msg_summary"."ext2" IS '扩展字段2';
+COMMENT ON COLUMN "public"."msg_summary"."ext3" IS '扩展字段3';
+COMMENT ON COLUMN "public"."msg_summary"."gmt_create" IS '创建时间';
+COMMENT ON COLUMN "public"."msg_summary"."gmt_modified" IS '更新时间';
+COMMENT ON COLUMN "public"."msg_summary"."sys_id" IS '系统ID';
+
+
+-- ----------------------------
+-- Table structure for msg_receive
+-- ----------------------------
+DROP TABLE IF EXISTS "public"."msg_receive";
+CREATE TABLE "public"."msg_receive" (
+    "id"            VARCHAR(36) COLLATE "pg_catalog"."default" NOT NULL PRIMARY KEY,
+    "msg_id"        VARCHAR(36) COLLATE "pg_catalog"."default" NOT NULL,
+    "receiver"      VARCHAR(64) COLLATE "pg_catalog"."default" NOT NULL,
+    "receive_state" int4,
+    "receive_time"  TIMESTAMP(3),
+    "read_state"    int4,
+    "read_time"     TIMESTAMP(3),
+    "ext1"          VARCHAR(1024) COLLATE "pg_catalog"."default",
+    "ext2"          VARCHAR(1024) COLLATE "pg_catalog"."default",
+    "ext3"          TEXT COLLATE "pg_catalog"."default",
+    "gmt_create"    TIMESTAMP(3)                               NOT NULL,
+    "gmt_modified"  TIMESTAMP(3)                               NOT NULL,
+    "sys_id"        VARCHAR(36) COLLATE "pg_catalog"."default" NOT NULL
+);
+COMMENT ON TABLE "public"."msg_receive" IS '消息接收记录表';
+COMMENT ON COLUMN "public"."msg_receive"."id" IS '主键';
+COMMENT ON COLUMN "public"."msg_receive"."msg_id" IS '消息Id';
+COMMENT ON COLUMN "public"."msg_receive"."receiver" IS '接收人';
+COMMENT ON COLUMN "public"."msg_receive"."receive_state" IS '接收状态';
+COMMENT ON COLUMN "public"."msg_receive"."receive_time" IS '接收时间';
+COMMENT ON COLUMN "public"."msg_receive"."read_state" IS '阅读状态';
+COMMENT ON COLUMN "public"."msg_receive"."read_time" IS '阅读时间';
+COMMENT ON COLUMN "public"."msg_receive"."ext1" IS '扩展字段1';
+COMMENT ON COLUMN "public"."msg_receive"."ext2" IS '扩展字段2';
+COMMENT ON COLUMN "public"."msg_receive"."ext3" IS '扩展字段3';
+COMMENT ON COLUMN "public"."msg_receive"."gmt_create" IS '创建时间';
+COMMENT ON COLUMN "public"."msg_receive"."gmt_modified" IS '更新时间';
+COMMENT ON COLUMN "public"."msg_receive"."sys_id" IS '系统ID';