项目目标
使用nodejs 技术栈，使用PostgreSQL 数据库，es module 写法

封装完成后，对外暴露方法即可，批量写入好友信息，批量写入群信息，批量写入群成员信息，写入对话记录

1、使用PostgreSQL 存储所有好友信息：
    robotId: {
      type: STRING,
      allowNull: false,
      comment: '机器人账号id',
    },
    wxid: {
      type: STRING,
      allowNull: false,
      comment: '好友wxid',
    },
    wxNumber: {
      type: STRING,
      comment: '好友微信号',
    },
    name: {
      type: STRING,
      defaultValue: null,
      comment: '昵称',
    },
    avatar: {
      allowNull: true,
      type: TEXT,
      defaultValue: null,
      comment: '头像',
    },
    alias: {
      allowNull: true,
      type: STRING,
      comment: '别名',
    },
    remark: {
      type: STRING,
      comment: '备注',
    },
    tags: {
      type: STRING,
      comment: '标签',
    }

2、使用PostgreSQL来存储群数据 和 群成员信息有关联，
    robotId: {
      type: STRING,
      allowNull: false,
      comment: '机器人账号id',
    },
    wxid: {
      type: STRING,
      allowNull: false,
      comment: '群wxid',
    },
    adminId:{
      type: STRING,
      comment: '群管理员wxid',
    },
    name: {
      type: STRING,
      defaultValue: null,
      comment: '群名',
    },
    avatar: {
      allowNull: true,
      type: TEXT,
      defaultValue: null,
      comment: '群头像',
    },
    memberCount: {
      type: STRING,
      comment: '群成员数',
    }
3、使用PostgreSQL来存储群成员信息， room_wxid和群数据的wxid进行关联
  robotId: {
      type: STRING,
      allowNull: false,
      comment: '机器人账号id',
    },
    roomWxid: {
      type: STRING,
      allowNull: false,
      comment: '群wxid, 和群数据的wxid进行关联',
    },
    wxid: {
      type: STRING,
      allowNull: false,
      comment: '群成员wxid',
    },
    wxNumber: {
      type: STRING,
      comment: '群成员微信号',
    },
    name: {
      type: STRING,
      defaultValue: null,
      comment: '群成员昵称',
    },
    avatar: {
      allowNull: true,
      type: TEXT,
      defaultValue: null,
      comment: '群成员头像',
    },
    alias: {
      allowNull: true,
      type: STRING,
      comment: '群成员别名',
    },
    remark: {
      type: STRING,
      comment: '群成员备注',
    },
4、把消息内容也都存储到PostgreSQL中，每条对话记录都存储，大概的数据结构是
robotId: { type: String, comment: '当前登录机器人的id' },
robotName: { type: String, comment: '当前登录机器人的昵称' },
conversationId: { type: String, comment: '会话id, 如果是私聊就是好友wxid，如果是群聊就是群wxid' },
conversationName: { type: String, comment: '会话名，如果是私聊就是好友昵称，如果是群聊就是群名' },
conversationAvatar: { type: String, comment: '会话头像，如果是私聊就是好友昵称，如果是群聊就是群名'  },
isRobotAnswer: { type: Boolean, default: false, comment: '是否机器人回复，用户检查是否机器人自己回复' },
realUser: { type: Number, default: 0, comment: '是否真人回复' },
msgId: { type: String },
contentType: { type: String, default: '文字'， comment: '对话内容，文字，图片，文件，h5连接，小程序，名片等' },
recordType: { type: String, comment: 'contact 私聊 room 群聊' },
chatUserName: { type: String, comment: '聊天用户昵称' },
chatUserAlias: { type: String, comment: '聊天用户备注' },
chatUserId: { type: String, comment: '聊天用户id' },
chatUserAvatar: { type: String, comment: '聊天用户头像' },
roomName: { type: String, comment: '群聊名称' },
roomId: { type: String, comment: '群聊id' },
content: { type: String, comment: '聊天内容' },
url: { type: String, comment: 'h5链接' },
fileName: { type: String, comment: '文件名称' },
isImage: { type: Boolean, default: false, comment: '是否图片' },
description: { type: String, comment: 'h5描述' },
imageUrl: { type: String, comment: 'h5图片链接' },
title: { type: String, comment: 'h5标题' },
timestamp: { type: Number, comment: '聊天时间戳' },