新增内部消息站内信功能。

This commit is contained in:
thinkgem
2019-03-19 21:52:10 +08:00
parent fce1cf8082
commit b6c992787d
27 changed files with 2779 additions and 657 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -481,13 +481,13 @@ CREATE TABLE js_sys_msg_inner
content_type char(1),
msg_content clob NOT NULL,
receive_type char(1) NOT NULL,
receive_codes clob NOT NULL,
receive_names clob NOT NULL,
send_user_code varchar(64) NOT NULL,
send_user_name varchar(100) NOT NULL,
send_date timestamp NOT NULL,
receive_codes clob,
receive_names clob,
send_user_code varchar(64),
send_user_name varchar(100),
send_date timestamp,
is_attac char(1),
notify_types varchar(100) NOT NULL,
notify_types varchar(100),
status char(1) NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,

View File

@@ -481,13 +481,13 @@ CREATE TABLE [js_sys_msg_inner]
[content_type] char(1),
[msg_content] text NOT NULL,
[receive_type] char(1) NOT NULL,
[receive_codes] text NOT NULL,
[receive_names] text NOT NULL,
[send_user_code] varchar(64) NOT NULL,
[send_user_name] varchar(100) NOT NULL,
[send_date] datetime NOT NULL,
[receive_codes] text,
[receive_names] text,
[send_user_code] varchar(64),
[send_user_name] varchar(100),
[send_date] datetime,
[is_attac] char(1),
[notify_types] varchar(100) NOT NULL,
[notify_types] varchar(100),
[status] char(1) NOT NULL,
[create_by] varchar(64) NOT NULL,
[create_date] datetime NOT NULL,

View File

@@ -481,14 +481,14 @@ CREATE TABLE js_sys_msg_inner
content_level char(1) NOT NULL COMMENT '内容级别1普通 2一般 3紧急',
content_type char(1) COMMENT '内容类型1公告 2新闻 3会议 4其它',
msg_content text NOT NULL COMMENT '消息内容',
receive_type char(1) NOT NULL COMMENT '接受者类型1用户 2部门 3角色 4岗位',
receive_codes text NOT NULL COMMENT '接受者字符串',
receive_names text NOT NULL COMMENT '接受者名称字符串',
send_user_code varchar(64) NOT NULL COMMENT '发送者用户编码',
send_user_name varchar(100) NOT NULL COMMENT '发送者用户姓名',
send_date datetime NOT NULL COMMENT '发送时间',
receive_type char(1) NOT NULL COMMENT '接受者类型(0全部 1用户 2部门 3角色 4岗位',
receive_codes text COMMENT '接受者字符串',
receive_names text COMMENT '接受者名称字符串',
send_user_code varchar(64) COMMENT '发送者用户编码',
send_user_name varchar(100) COMMENT '发送者用户姓名',
send_date datetime COMMENT '发送时间',
is_attac char(1) COMMENT '是否有附件',
notify_types varchar(100) NOT NULL COMMENT '通知类型PC APP 短信 邮件 微信)多选',
notify_types varchar(100) COMMENT '通知类型PC APP 短信 邮件 微信)多选',
status char(1) NOT NULL COMMENT '状态0正常 1删除 4审核 5驳回 9草稿',
create_by varchar(64) NOT NULL COMMENT '创建者',
create_date datetime NOT NULL COMMENT '创建时间',

View File

@@ -481,13 +481,13 @@ CREATE TABLE js_sys_msg_inner
content_type char(1),
msg_content clob NOT NULL,
receive_type char(1) NOT NULL,
receive_codes clob NOT NULL,
receive_names clob NOT NULL,
send_user_code varchar2(64) NOT NULL,
send_user_name varchar2(100) NOT NULL,
send_date timestamp NOT NULL,
receive_codes clob,
receive_names clob,
send_user_code varchar2(64),
send_user_name varchar2(100),
send_date timestamp,
is_attac char(1),
notify_types varchar2(100) NOT NULL,
notify_types varchar2(100),
status char(1) NOT NULL,
create_by varchar2(64) NOT NULL,
create_date timestamp NOT NULL,
@@ -1252,7 +1252,7 @@ COMMENT ON COLUMN js_sys_msg_inner.msg_title IS '消息标题';
COMMENT ON COLUMN js_sys_msg_inner.content_level IS '内容级别1普通 2一般 3紧急';
COMMENT ON COLUMN js_sys_msg_inner.content_type IS '内容类型1公告 2新闻 3会议 4其它';
COMMENT ON COLUMN js_sys_msg_inner.msg_content IS '消息内容';
COMMENT ON COLUMN js_sys_msg_inner.receive_type IS '接受者类型1用户 2部门 3角色 4岗位';
COMMENT ON COLUMN js_sys_msg_inner.receive_type IS '接受者类型(0全部 1用户 2部门 3角色 4岗位';
COMMENT ON COLUMN js_sys_msg_inner.receive_codes IS '接受者字符串';
COMMENT ON COLUMN js_sys_msg_inner.receive_names IS '接受者名称字符串';
COMMENT ON COLUMN js_sys_msg_inner.send_user_code IS '发送者用户编码';

View File

@@ -481,13 +481,13 @@ CREATE TABLE js_sys_msg_inner
content_type char(1),
msg_content text NOT NULL,
receive_type char(1) NOT NULL,
receive_codes text NOT NULL,
receive_names text NOT NULL,
send_user_code varchar(64) NOT NULL,
send_user_name varchar(100) NOT NULL,
send_date timestamp NOT NULL,
receive_codes text,
receive_names text,
send_user_code varchar(64),
send_user_name varchar(100),
send_date timestamp,
is_attac char(1),
notify_types varchar(100) NOT NULL,
notify_types varchar(100),
status char(1) NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
@@ -1252,7 +1252,7 @@ COMMENT ON COLUMN js_sys_msg_inner.msg_title IS '消息标题';
COMMENT ON COLUMN js_sys_msg_inner.content_level IS '内容级别1普通 2一般 3紧急';
COMMENT ON COLUMN js_sys_msg_inner.content_type IS '内容类型1公告 2新闻 3会议 4其它';
COMMENT ON COLUMN js_sys_msg_inner.msg_content IS '消息内容';
COMMENT ON COLUMN js_sys_msg_inner.receive_type IS '接受者类型1用户 2部门 3角色 4岗位';
COMMENT ON COLUMN js_sys_msg_inner.receive_type IS '接受者类型(0全部 1用户 2部门 3角色 4岗位';
COMMENT ON COLUMN js_sys_msg_inner.receive_codes IS '接受者字符串';
COMMENT ON COLUMN js_sys_msg_inner.receive_names IS '接受者名称字符串';
COMMENT ON COLUMN js_sys_msg_inner.send_user_code IS '发送者用户编码';

View File

@@ -0,0 +1,18 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*/
package com.jeesite.modules.msg.dao;
import com.jeesite.common.dao.CrudDao;
import com.jeesite.common.mybatis.annotation.MyBatisDao;
import com.jeesite.modules.msg.entity.MsgInner;
/**
* 内部消息DAO接口
* @author ThinkGem
* @version 2019-03-12
*/
@MyBatisDao
public interface MsgInnerDao extends CrudDao<MsgInner> {
}

View File

@@ -0,0 +1,23 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*/
package com.jeesite.modules.msg.dao;
import com.jeesite.common.dao.CrudDao;
import com.jeesite.common.mybatis.annotation.MyBatisDao;
import com.jeesite.modules.msg.entity.MsgInnerRecord;
/**
* 内部消息发送记录表DAO接口
* @author ThinkGem
* @version 2019-03-12
*/
@MyBatisDao
public interface MsgInnerRecordDao extends CrudDao<MsgInnerRecord> {
/**
* 根据消息编号和接受者用户名更新读取状态
*/
public void updateReadStatus(MsgInnerRecord msgInnerRecord);
}

View File

@@ -0,0 +1,214 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*/
package com.jeesite.modules.msg.entity;
import java.util.Date;
import javax.validation.constraints.NotBlank;
import org.hibernate.validator.constraints.Length;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.jeesite.common.entity.DataEntity;
import com.jeesite.common.lang.DateUtils;
import com.jeesite.common.mybatis.annotation.Column;
import com.jeesite.common.mybatis.annotation.Table;
import com.jeesite.common.mybatis.mapper.query.QueryType;
/**
* 内部消息Entity
* @author ThinkGem
* @version 2019-03-12
*/
@Table(name="${_prefix}sys_msg_inner", alias="a", columns={
@Column(name="id", attrName="id", label="编号", isPK=true),
@Column(name="msg_title", attrName="msgTitle", label="消息标题", queryType=QueryType.LIKE),
@Column(name="content_level", attrName="contentLevel", label="内容等级", comment="内容等级1普通 2一般 3紧急"),
@Column(name="content_type", attrName="contentType", label="内容类型", comment="内容类型1公告 2新闻 3会议 4其它"),
@Column(name="msg_content", attrName="msgContent", label="消息内容"),
@Column(name="receive_type", attrName="receiveType", label="接受者类型", comment="接受者类型1用户 2部门 3角色 4岗位"),
@Column(name="receive_codes", attrName="receiveCodes", label="接受者字符串"),
@Column(name="receive_names", attrName="receiveNames", label="接受者名称字符串", queryType=QueryType.LIKE),
@Column(name="send_user_code", attrName="sendUserCode", label="发送者用户编码"),
@Column(name="send_user_name", attrName="sendUserName", label="发送者用户姓名", queryType=QueryType.LIKE),
@Column(name="send_date", attrName="sendDate", label="发送时间"),
@Column(name="is_attac", attrName="isAttac", label="是否有附件"),
@Column(name="notify_types", attrName="notifyTypes", label="通知类型", comment="通知类型PC APP 短信 邮件 微信)多选"),
@Column(includeEntity=DataEntity.class, comment="状态0正常 1删除 4审核 5驳回 9草稿"),
}, orderBy="a.update_date DESC"
)
public class MsgInner extends DataEntity<MsgInner> {
// 接受者类型0所有 1用户 2部门 3角色 4岗位
public static final String RECEIVE_TYPE_ALL = "0";
public static final String RECEIVE_TYPE_USER = "1";
public static final String RECEIVE_TYPE_OFFICE = "2";
public static final String RECEIVE_TYPE_ROLE = "3";
public static final String RECEIVE_TYPE_POST = "4";
// 内容级别1普通 2一般 3紧急
public static final String CONTENT_LEVEL_1 = "1";
public static final String CONTENT_LEVEL_2 = "2";
public static final String CONTENT_LEVEL_3 = "3";
private static final long serialVersionUID = 1L;
private String msgTitle; // 消息标题
private String contentLevel; // 内容等级1普通 2一般 3紧急
private String contentType; // 内容类型1公告 2新闻 3会议 4其它
private String msgContent; // 消息内容
private String receiveType; // 接受者类型1用户 2部门 3角色 4岗位
private String receiveCodes; // 接受者字符串
private String receiveNames; // 接受者名称字符串
private String sendUserCode; // 发送者用户编码
private String sendUserName; // 发送者用户姓名
private Date sendDate; // 发送时间
private String isAttac; // 是否有附件
private String notifyTypes; // 通知类型PC APP 短信 邮件 微信)多选
private MsgInnerRecord record; // 消息记录状态
public MsgInner() {
this(null);
}
public MsgInner(String id){
super(id);
}
@NotBlank(message="消息标题不能为空")
@Length(min=0, max=200, message="消息标题长度不能超过 200 个字符")
public String getMsgTitle() {
return msgTitle;
}
public void setMsgTitle(String msgTitle) {
this.msgTitle = msgTitle;
}
@NotBlank(message="内容级别不能为空")
@Length(min=0, max=1, message="内容级别长度不能超过 1 个字符")
public String getContentLevel() {
return contentLevel;
}
public void setContentLevel(String contentLevel) {
this.contentLevel = contentLevel;
}
@Length(min=0, max=1, message="内容类型长度不能超过 1 个字符")
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
@NotBlank(message="消息内容不能为空")
public String getMsgContent() {
return msgContent;
}
public void setMsgContent(String msgContent) {
this.msgContent = msgContent;
}
@NotBlank(message="接受者类型不能为空")
@Length(min=0, max=1, message="接受者类型长度不能超过 1 个字符")
public String getReceiveType() {
return receiveType;
}
public void setReceiveType(String receiveType) {
this.receiveType = receiveType;
}
public String getReceiveCodes() {
return receiveCodes;
}
public void setReceiveCodes(String receiveCodes) {
this.receiveCodes = receiveCodes;
}
public String getReceiveNames() {
return receiveNames;
}
public void setReceiveNames(String receiveNames) {
this.receiveNames = receiveNames;
}
@Length(min=0, max=64, message="发送者用户编码长度不能超过 64 个字符")
public String getSendUserCode() {
return sendUserCode;
}
public void setSendUserCode(String sendUserCode) {
this.sendUserCode = sendUserCode;
}
@Length(min=0, max=100, message="发送者用户姓名长度不能超过 100 个字符")
public String getSendUserName() {
return sendUserName;
}
public void setSendUserName(String sendUserName) {
this.sendUserName = sendUserName;
}
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
public Date getSendDate() {
return sendDate;
}
public void setSendDate(Date sendDate) {
this.sendDate = sendDate;
}
public Date getSendDate_gte() {
return sqlMap.getWhere().getValue("send_date", QueryType.GTE);
}
public void setSendDate_gte(Date sendDate) {
sendDate = DateUtils.getOfDayFirst(sendDate);
sqlMap.getWhere().and("send_date", QueryType.GTE, sendDate);
}
public Date getSendDate_lte() {
return sqlMap.getWhere().getValue("send_date", QueryType.LTE);
}
public void setSendDate_lte(Date sendDate) {
sendDate = DateUtils.getOfDayLast(sendDate);
sqlMap.getWhere().and("send_date", QueryType.LTE, sendDate);
}
@Length(min=0, max=1, message="是否有附件长度不能超过 1 个字符")
public String getIsAttac() {
return isAttac;
}
public void setIsAttac(String isAttac) {
this.isAttac = isAttac;
}
@Length(min=0, max=100, message="通知类型长度不能超过 100 个字符")
public String getNotifyTypes() {
return notifyTypes;
}
public void setNotifyTypes(String notifyTypes) {
this.notifyTypes = notifyTypes;
}
public MsgInnerRecord getRecord() {
return record;
}
public void setRecord(MsgInnerRecord record) {
this.record = record;
}
}

View File

@@ -0,0 +1,112 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*/
package com.jeesite.modules.msg.entity;
import java.util.Date;
import javax.validation.constraints.NotBlank;
import org.hibernate.validator.constraints.Length;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.jeesite.common.entity.DataEntity;
import com.jeesite.common.mybatis.annotation.Column;
import com.jeesite.common.mybatis.annotation.Table;
import com.jeesite.common.mybatis.mapper.query.QueryType;
/**
* 内部消息发送记录表Entity
* @author ThinkGem
* @version 2019-03-12
*/
@Table(name="${_prefix}sys_msg_inner_record", alias="a", columns={
@Column(name="id", attrName="id", label="编号", isPK=true),
@Column(name="msg_inner_id", attrName="msgInnerId", label="所属消息"),
@Column(name="receive_user_code", attrName="receiveUserCode", label="接受者用户编码"),
@Column(name="receive_user_name", attrName="receiveUserName", label="接受者用户姓名", queryType=QueryType.LIKE),
@Column(name="read_status", attrName="readStatus", label="读取状态", comment="读取状态0未送达 1已读 2未读"),
@Column(name="read_date", attrName="readDate", label="阅读时间"),
@Column(name="is_star", attrName="isStar", label="是否标星"),
}, orderBy="a.read_date ASC, a.id ASC"
)
public class MsgInnerRecord extends DataEntity<MsgInnerRecord> {
// 读取状态0未送达 1已读 2未读
public static final String READ_STATUS_READ = "1";
public static final String READ_STATUS_UNREAD = "2";
private static final long serialVersionUID = 1L;
private String msgInnerId; // 所属消息
private String receiveUserCode; // 接受者用户编码
private String receiveUserName; // 接受者用户姓名
private String readStatus; // 读取状态0未送达 1已读 2未读
private Date readDate; // 阅读时间
private String isStar; // 是否标星
public MsgInnerRecord() {
this(null);
}
public MsgInnerRecord(String id){
super(id);
}
@NotBlank(message="所属消息不能为空")
@Length(min=0, max=64, message="所属消息长度不能超过 64 个字符")
public String getMsgInnerId() {
return msgInnerId;
}
public void setMsgInnerId(String msgInnerId) {
this.msgInnerId = msgInnerId;
}
@Length(min=0, max=64, message="接受者用户编码长度不能超过 64 个字符")
public String getReceiveUserCode() {
return receiveUserCode;
}
public void setReceiveUserCode(String receiveUserCode) {
this.receiveUserCode = receiveUserCode;
}
@NotBlank(message="接受者用户姓名不能为空")
@Length(min=0, max=100, message="接受者用户姓名长度不能超过 100 个字符")
public String getReceiveUserName() {
return receiveUserName;
}
public void setReceiveUserName(String receiveUserName) {
this.receiveUserName = receiveUserName;
}
@NotBlank(message="读取状态不能为空")
@Length(min=0, max=1, message="读取状态长度不能超过 1 个字符")
public String getReadStatus() {
return readStatus;
}
public void setReadStatus(String readStatus) {
this.readStatus = readStatus;
}
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
public Date getReadDate() {
return readDate;
}
public void setReadDate(Date readDate) {
this.readDate = readDate;
}
@Length(min=0, max=1, message="是否标星长度不能超过 1 个字符")
public String getIsStar() {
return isStar;
}
public void setIsStar(String isStar) {
this.isStar = isStar;
}
}

View File

@@ -0,0 +1,243 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*/
package com.jeesite.modules.msg.service;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.jeesite.common.callback.MethodCallback;
import com.jeesite.common.collect.ListUtils;
import com.jeesite.common.config.Global;
import com.jeesite.common.entity.Page;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.service.CrudService;
import com.jeesite.common.web.http.ServletUtils;
import com.jeesite.modules.file.utils.FileUploadUtils;
import com.jeesite.modules.msg.dao.MsgInnerDao;
import com.jeesite.modules.msg.dao.MsgInnerRecordDao;
import com.jeesite.modules.msg.entity.MsgInner;
import com.jeesite.modules.msg.entity.MsgInnerRecord;
import com.jeesite.modules.msg.entity.MsgPush;
import com.jeesite.modules.msg.entity.content.AppMsgContent;
import com.jeesite.modules.msg.entity.content.BaseMsgContent;
import com.jeesite.modules.msg.entity.content.EmailMsgContent;
import com.jeesite.modules.msg.entity.content.PcMsgContent;
import com.jeesite.modules.msg.entity.content.SmsMsgContent;
import com.jeesite.modules.msg.utils.MsgPushUtils;
import com.jeesite.modules.sys.entity.EmpUser;
import com.jeesite.modules.sys.entity.User;
import com.jeesite.modules.sys.service.EmpUserService;
/**
* 内部消息Service
* @author ThinkGem
* @version 2019-03-12
*/
@Service
@Transactional(readOnly=true)
public class MsgInnerService extends CrudService<MsgInnerDao, MsgInner> {
@Autowired
private EmpUserService empUserService;
@Autowired
private MsgInnerRecordDao msgInnerRecordDao;
/**
* 获取单条数据
* @param msgInner
* @return
*/
@Override
public MsgInner get(MsgInner msgInner) {
return super.get(msgInner);
}
/**
* 查询分页数据
* @param msgInner 查询条件
* @param msgInner.page 分页对象
* @return
*/
@Override
public Page<MsgInner> findPage(MsgInner msgInner) {
return super.findPage(msgInner);
}
/**
* 查询消息记录数据
*/
public List<MsgInnerRecord> findRecordList(MsgInnerRecord msgInnerRecord){
return msgInnerRecordDao.findList(msgInnerRecord);
}
/**
* 保存数据(插入或更新)
* @param msgInner
*/
@Override
@Transactional(readOnly=false)
public void save(MsgInner msgInner) {
if (msgInner.getIsNewRecord()){
User user = msgInner.getCurrentUser();
msgInner.setSendUserCode(user.getUserCode());
msgInner.setSendUserName(user.getUserName());
// 没有设置状态,则默认新增后是草稿状态
if (StringUtils.isBlank(msgInner.getStatus())){
msgInner.setStatus(MsgInner.STATUS_DRAFT);
}
}
msgInner.setSendDate(new Date());
msgInner.setIsAttac(StringUtils.isNotBlank(ServletUtils.getParameter("msgInner_file"))?Global.YES:Global.NO);
super.save(msgInner);
// 保存上传附件
FileUploadUtils.saveFileUpload(msgInner.getId(), "msgInner_file");
// 发送内部消息
if (MsgInner.STATUS_NORMAL.equals(msgInner.getStatus())){
this.updateStatus(msgInner); // 更新状态
List<EmpUser> empUserList = null;
if (MsgInner.RECEIVE_TYPE_ALL.equals(msgInner.getReceiveType())){
EmpUser empUser = new EmpUser();
empUser.setCodes(new String[]{});
empUserList = empUserService.findUserList(empUser);
}else{
String[] codes = StringUtils.split(msgInner.getReceiveCodes(), ",");
String[] names = StringUtils.split(msgInner.getReceiveNames(), ",");
if (codes != null && names != null && codes.length > 0 && codes.length == names.length){
EmpUser empUser = new EmpUser();
empUser.setCodes(codes);
switch(msgInner.getReceiveType()){
case MsgInner.RECEIVE_TYPE_USER:
empUserList = ListUtils.newArrayList();
for (int i=0; i<codes.length; i++){
EmpUser e = new EmpUser();
e.setUserCode(codes[i]);
e.setUserName(names[i]);
empUserList.add(e);
}
break;
case MsgInner.RECEIVE_TYPE_OFFICE:
empUserList = empUserService.findUserListByOfficeCodes(empUser);
break;
case MsgInner.RECEIVE_TYPE_ROLE:
empUserList = empUserService.findUserListByRoleCodes(empUser);
break;
case MsgInner.RECEIVE_TYPE_POST:
empUserList = empUserService.findUserListByPostCodes(empUser);
break;
}
}
}
this.saveMsgInnerRecord(msgInner, empUserList);
}
}
/**
* 保存消息推送记录
*/
private void saveMsgInnerRecord(MsgInner msgInner, List<EmpUser> empUserList){
if (empUserList == null || empUserList.size() <= 0){
return;
}
String[] notifyTypes = StringUtils.split(msgInner.getNotifyTypes(), ",");
List<MsgInnerRecord> recordList = ListUtils.newArrayList();
empUserList.forEach(user -> {
MsgInnerRecord r = new MsgInnerRecord();
r.setMsgInnerId(msgInner.getId());
r.setReceiveUserCode(user.getUserCode());
r.setReceiveUserName(user.getUserName());
r.setReadStatus(MsgInnerRecord.READ_STATUS_UNREAD);
recordList.add(r);
// 发送消息通知(消息推送)
if (notifyTypes != null){
for (String type : notifyTypes){
BaseMsgContent msgContent = null;
if (MsgPush.TYPE_PC.equals(type)){
msgContent = new PcMsgContent();
msgContent.setContent("你有一条内部消息,请点击“详情”进行查阅。");
((PcMsgContent)msgContent).addButton(new String[]{
"详情", "/a/msg/msgInner/view?id="+msgInner.getId()});
}else if (MsgPush.TYPE_APP.equals(type)){
msgContent = new AppMsgContent();
}else if (MsgPush.TYPE_SMS.equals(type)){
msgContent = new SmsMsgContent();
}else if (MsgPush.TYPE_EMAIL.equals(type)){
msgContent = new EmailMsgContent();
}
if (msgContent != null){
msgContent.setTitle(msgInner.getMsgTitle());
if (msgContent.getContent() != null){
msgContent.setContent("你有一条内部消息请查阅:"
+ StringUtils.abbr(msgInner.getMsgTitle(), 30));
}
msgContent.setMsgPush(new MsgPush());
msgContent.getMsgPush().setIsRealtimePush(false); // 关闭实时推送,改为手动推送
MsgPushUtils.push(msgContent, msgInner.getId(),
MsgInner.class.getSimpleName(), user.getUserCode());
}
}
}
});
ListUtils.pageList(recordList, 100, new MethodCallback() {
@Override
@SuppressWarnings("unchecked")
public Object execute(Object... objs) {
msgInnerRecordDao.insertBatch((List<MsgInnerRecord>)objs[0]);
return null;
}
});
// 手动触发消息推送任务
if (Global.TRUE.equals(Global.getProperty("msg.realtime.enabled"))){
new Thread(){
public void run() {
try{
MsgPushUtils.getMsgPushTask().execute();
}catch(Exception ex){
logger.error("实时消息发送失败,推送服务配置不正确。", ex);
}
}
}.start();
}
}
/**
* 根据消息编号和接受者用户名读取内部消息
*/
@Transactional(readOnly=false)
public void readMsgInnerRecord(MsgInner msgInner){
MsgInnerRecord msgInnerRecord = new MsgInnerRecord();
msgInnerRecord.setMsgInnerId(msgInner.getId());
msgInnerRecord.setReceiveUserCode(msgInner.getCurrentUser().getUserCode());
msgInnerRecord.setReadStatus(MsgInnerRecord.READ_STATUS_READ);
msgInnerRecord.setReadDate(new Date());
msgInnerRecordDao.updateReadStatus(msgInnerRecord);
// 将关联的内部消息通知更新为已读(消息推送)
MsgPushUtils.readMsgByBiz(msgInner.getId(), MsgInner.class.getSimpleName(),
msgInnerRecord.getReceiveUserCode());
}
/**
* 更新状态
* @param msgInner
*/
@Override
@Transactional(readOnly=false)
public void updateStatus(MsgInner msgInner) {
super.updateStatus(msgInner);
}
/**
* 删除数据
* @param msgInner
*/
@Override
@Transactional(readOnly=false)
public void delete(MsgInner msgInner) {
super.delete(msgInner);
}
}

View File

@@ -0,0 +1,140 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
*/
package com.jeesite.modules.msg.web;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.jeesite.common.config.Global;
import com.jeesite.common.entity.Page;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.web.BaseController;
import com.jeesite.modules.msg.entity.MsgInner;
import com.jeesite.modules.msg.entity.MsgInnerRecord;
import com.jeesite.modules.msg.entity.MsgPush;
import com.jeesite.modules.msg.service.MsgInnerService;
/**
* 内部消息Controller
* @author ThinkGem
* @version 2019-03-12
*/
@Controller
@RequestMapping(value = "${adminPath}/msg/msgInner")
public class MsgInnerController extends BaseController {
@Autowired
private MsgInnerService msgInnerService;
/**
* 获取数据
*/
@ModelAttribute
public MsgInner get(String id, boolean isNewRecord) {
return msgInnerService.get(id, isNewRecord);
}
/**
* 查询列表
*/
@RequiresPermissions("msg:msgInner:view")
@RequestMapping(value = {"list", ""})
public String list(MsgInner msgInner, Model model) {
model.addAttribute("msgInner", msgInner);
return "modules/msg/msgInnerList";
}
/**
* 查询列表数据
*/
@RequiresPermissions("msg:msgInner:view")
@RequestMapping(value = "listData")
@ResponseBody
public Page<MsgInner> listData(MsgInner msgInner, HttpServletRequest request, HttpServletResponse response) {
msgInner.setPage(new Page<>(request, response));
msgInner.setRecord(new MsgInnerRecord());
msgInner.getRecord().setReceiveUserCode(msgInner.getCurrentUser().getUserCode());
Page<MsgInner> page = msgInnerService.findPage(msgInner);
return page;
}
/**
* 查看编辑表单
*/
@RequiresPermissions("msg:msgInner:view")
@RequestMapping(value = "form")
public String form(MsgInner msgInner, Model model) {
if (StringUtils.isBlank(msgInner.getNotifyTypes())){
msgInner.setNotifyTypes(MsgPush.TYPE_PC);
}
if (StringUtils.isBlank(msgInner.getContentLevel())){
msgInner.setContentLevel(MsgInner.CONTENT_LEVEL_1);
}
if (StringUtils.isBlank(msgInner.getReceiveType())){
msgInner.setReceiveType(MsgInner.RECEIVE_TYPE_USER);
}
model.addAttribute("msgInner", msgInner);
return "modules/msg/msgInnerForm";
}
/**
* 查看编辑表单
*/
@RequiresPermissions("msg:msgInner:view")
@RequestMapping(value = "view")
public String view(MsgInner msgInner, Model model) {
model.addAttribute("msgInner", msgInner);
// 根据消息编号和接受者用户名读取内部消息
msgInnerService.readMsgInnerRecord(msgInner);
// 查询已读和未读用户列表数据
MsgInnerRecord msgInnerRecord = new MsgInnerRecord();
msgInnerRecord.setMsgInnerId(msgInner.getId());
msgInnerRecord.setReadStatus(MsgInnerRecord.READ_STATUS_READ);
model.addAttribute("readList", msgInnerService.findRecordList(msgInnerRecord));
msgInnerRecord.setReadStatus(MsgInnerRecord.READ_STATUS_UNREAD);
model.addAttribute("unReadList", msgInnerService.findRecordList(msgInnerRecord));
return "modules/msg/msgInnerView";
}
/**
* 保存消息
*/
@RequiresPermissions("msg:msgInner:edit")
@PostMapping(value = "save")
@ResponseBody
public String save(@Validated MsgInner msgInner, HttpServletRequest request) {
MsgInner old = super.getWebDataBinderSource(request);
if (old != null && MsgInner.STATUS_NORMAL.equals(old.getStatus())){
return renderResult(Global.FALSE, "数据已发布,不允许修改!");
}
msgInnerService.save(msgInner);
return renderResult(Global.TRUE, text("保存消息成功!"));
}
/**
* 删除消息
*/
@RequiresPermissions("msg:msgInner:edit")
@RequestMapping(value = "delete")
@ResponseBody
public String delete(MsgInner msgInner, HttpServletRequest request) {
MsgInner old = super.getWebDataBinderSource(request);
if (old != null && MsgInner.STATUS_NORMAL.equals(old.getStatus())){
return renderResult(Global.FALSE, "数据已发布,不允许删除!");
}
msgInnerService.delete(msgInner);
return renderResult(Global.TRUE, text("删除消息成功!"));
}
}

View File

@@ -1,9 +1,27 @@
-- 删除sys_file_entity表的file_md5唯一索引
-- ALTER TABLE [${_prefix}sys_file_entity] DROP CONSTRAINT [UQ__js_sys_f__3BD63C9E32E0915F];
-- ALTER TABLE [${_prefix}sys_file_entity] DROP CONSTRAINT [UQ__${_prefix}sys_f__3BD63C9E32E0915F];
-- 增加文件信息字段(可存储图片大小)
ALTER TABLE [${_prefix}js_sys_file_entity] ADD [file_meta] varchar(64) NULL;
ALTER TABLE [${_prefix}sys_file_entity] ADD [file_meta] varchar(64) NULL;
-- 集群的实例名字
ALTER TABLE [${_prefix}sys_job] ADD [instance_name] varchar(64) DEFAULT JeeSiteScheduler NOT NULL;
ALTER TABLE [${_prefix}sys_job] ADD [instance_name] varchar(64) DEFAULT 'JeeSiteScheduler' NOT NULL;
-- 内部消息菜单
INSERT INTO ${_prefix}sys_menu(menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks, extend_s1, extend_s2, extend_s3, extend_s4, extend_s5, extend_s6, extend_s7, extend_s8, extend_i1, extend_i2, extend_i3, extend_i4, extend_f1, extend_f2, extend_f3, extend_f4, extend_d1, extend_d2, extend_d3, extend_d4)
VALUES ('1105443204287991808', '0', '0,', 9030, '0000009030,', '1', 0, '站内消息', '站内消息', '1', '/msg/msgInner/list', '', 'icon-speech', '', 'msg:msgInner', 40, '1', 'default', 'core', '0', 'system', getdate(), 'system', getdate(), '', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- 内部消息新增字典数据
INSERT INTO ${_prefix}sys_dict_type(id, dict_name, dict_type, is_sys, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('1105440848414543872', '消息状态', 'msg_inner_msg_status', '0', '0', 'system', getdate(), 'system', getdate(), '');
INSERT INTO ${_prefix}sys_dict_data(dict_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, dict_label, dict_value, dict_type, is_sys, description, css_style, css_class, status, create_by, create_date, update_by, update_date, remarks, corp_code, corp_name, extend_s1, extend_s2, extend_s3, extend_s4, extend_s5, extend_s6, extend_s7, extend_s8, extend_i1, extend_i2, extend_i3, extend_i4, extend_f1, extend_f2, extend_f3, extend_f4, extend_d1, extend_d2, extend_d3, extend_d4)
VALUES ('1106135527342673920', '0', '0,', 20, '0000000020,', '1', 0, '全部', '全部', '0', 'msg_inner_receiver_type', '1', '', '', '', '0', 'system', getdate(), 'system', getdate(), '', '0', 'JeeSite', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- 取消内部消息部分字段必填选项
ALTER TABLE [${_prefix}sys_msg_inner] ALTER COLUMN [receive_codes] text NULL;
ALTER TABLE [${_prefix}sys_msg_inner] ALTER COLUMN [receive_names] text NULL;
ALTER TABLE [${_prefix}sys_msg_inner] ALTER COLUMN [send_user_code] varchar(64) NULL;
ALTER TABLE [${_prefix}sys_msg_inner] ALTER COLUMN [send_user_name] varchar(100) NULL;
ALTER TABLE [${_prefix}sys_msg_inner] ALTER COLUMN [send_date] datetime NULL;
ALTER TABLE [${_prefix}sys_msg_inner] ALTER COLUMN [notify_types] varchar(100) NULL;

View File

@@ -5,9 +5,28 @@ DROP INDEX `file_md5`,
ADD INDEX `file_md5`(`file_md5`);
-- 增加文件信息字段(可存储图片大小)
ALTER TABLE `${_prefix}js_sys_file_entity`
ALTER TABLE `${_prefix}sys_file_entity`
ADD COLUMN `file_meta` varchar(255) NULL COMMENT '文件信息(JSON格式)' AFTER `file_size`;
-- 集群的实例名字
ALTER TABLE `${_prefix}sys_job`
ADD COLUMN `instance_name` varchar(64) NOT NULL DEFAULT JeeSiteScheduler COMMENT '集群的实例名字' AFTER `concurrent`;
ADD COLUMN `instance_name` varchar(64) NOT NULL DEFAULT 'JeeSiteScheduler' COMMENT '集群的实例名字' AFTER `concurrent`;
-- 内部消息菜单
INSERT INTO `${_prefix}sys_menu`(`menu_code`, `parent_code`, `parent_codes`, `tree_sort`, `tree_sorts`, `tree_leaf`, `tree_level`, `tree_names`, `menu_name`, `menu_type`, `menu_href`, `menu_target`, `menu_icon`, `menu_color`, `permission`, `weight`, `is_show`, `sys_code`, `module_codes`, `status`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `extend_s1`, `extend_s2`, `extend_s3`, `extend_s4`, `extend_s5`, `extend_s6`, `extend_s7`, `extend_s8`, `extend_i1`, `extend_i2`, `extend_i3`, `extend_i4`, `extend_f1`, `extend_f2`, `extend_f3`, `extend_f4`, `extend_d1`, `extend_d2`, `extend_d3`, `extend_d4`)
VALUES ('1105443204287991808', '0', '0,', 9030, '0000009030,', '1', 0, '站内消息', '站内消息', '1', '/msg/msgInner/list', '', 'icon-speech', '', 'msg:msgInner', 40, '1', 'default', 'core', '0', 'system', now(), 'system', now(), '', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- 内部消息新增字典数据
INSERT INTO `${_prefix}sys_dict_type`(`id`, `dict_name`, `dict_type`, `is_sys`, `status`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`)
VALUES ('1105440848414543872', '消息状态', 'msg_inner_msg_status', '0', '0', 'system', now(), 'system', now(), '');
INSERT INTO `${_prefix}sys_dict_data`(`dict_code`, `parent_code`, `parent_codes`, `tree_sort`, `tree_sorts`, `tree_leaf`, `tree_level`, `tree_names`, `dict_label`, `dict_value`, `dict_type`, `is_sys`, `description`, `css_style`, `css_class`, `status`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `corp_code`, `corp_name`, `extend_s1`, `extend_s2`, `extend_s3`, `extend_s4`, `extend_s5`, `extend_s6`, `extend_s7`, `extend_s8`, `extend_i1`, `extend_i2`, `extend_i3`, `extend_i4`, `extend_f1`, `extend_f2`, `extend_f3`, `extend_f4`, `extend_d1`, `extend_d2`, `extend_d3`, `extend_d4`)
VALUES ('1106135527342673920', '0', '0,', 20, '0000000020,', '1', 0, '全部', '全部', '0', 'msg_inner_receiver_type', '1', '', '', '', '0', 'system', now(), 'system', now(), '', '0', 'JeeSite', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- 取消内部消息部分字段必填选项
ALTER TABLE `${_prefix}sys_msg_inner`
MODIFY COLUMN `receive_codes` text NULL COMMENT '接受者字符串' AFTER `receive_type`,
MODIFY COLUMN `receive_names` text NULL COMMENT '接受者名称字符串' AFTER `receive_codes`,
MODIFY COLUMN `send_user_code` varchar(64) NULL COMMENT '发送者用户编码' AFTER `receive_names`,
MODIFY COLUMN `send_user_name` varchar(100) NULL COMMENT '发送者用户姓名' AFTER `send_user_code`,
MODIFY COLUMN `send_date` datetime(0) NULL COMMENT '发送时间' AFTER `send_user_name`,
MODIFY COLUMN `notify_types` varchar(100) NULL COMMENT '通知类型PC APP 短信 邮件 微信)多选' AFTER `is_attac`;

View File

@@ -5,9 +5,28 @@
-- 增加文件信息字段(可存储图片大小)
ALTER TABLE ${_prefix}SYS_FILE_ENTITY
ADD (file_meta VARCHAR2(64) NULL );
COMMENT ON COLUMN ${_prefix}SYS_FILE_ENTITY.file_meta IS '文件信息(JSON格式)'
COMMENT ON COLUMN ${_prefix}SYS_FILE_ENTITY.file_meta IS '文件信息(JSON格式)';
-- 集群的实例名字
ALTER TABLE ${_prefix}SYS_JOB
ADD (instance_name VARCHAR2(64) DEFAULT JeeSiteScheduler NOT NULL );
COMMENT ON COLUMN ${_prefix}SYS_JOB.instance_name IS '集群的实例名字'
ADD (instance_name VARCHAR2(64) DEFAULT 'JeeSiteScheduler' NOT NULL );
COMMENT ON COLUMN ${_prefix}SYS_JOB.instance_name IS '集群的实例名字';
-- 内部消息菜单
INSERT INTO ${_prefix}sys_menu(menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks, extend_s1, extend_s2, extend_s3, extend_s4, extend_s5, extend_s6, extend_s7, extend_s8, extend_i1, extend_i2, extend_i3, extend_i4, extend_f1, extend_f2, extend_f3, extend_f4, extend_d1, extend_d2, extend_d3, extend_d4)
VALUES ('1105443204287991808', '0', '0,', 9030, '0000009030,', '1', 0, '站内消息', '站内消息', '1', '/msg/msgInner/list', '', 'icon-speech', '', 'msg:msgInner', 40, '1', 'default', 'core', '0', 'system', sysdate, 'system', sysdate, '', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- 内部消息新增字典数据
INSERT INTO ${_prefix}sys_dict_type(id, dict_name, dict_type, is_sys, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('1105440848414543872', '消息状态', 'msg_inner_msg_status', '0', '0', 'system', sysdate, 'system', sysdate, '');
INSERT INTO ${_prefix}sys_dict_data(dict_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, dict_label, dict_value, dict_type, is_sys, description, css_style, css_class, status, create_by, create_date, update_by, update_date, remarks, corp_code, corp_name, extend_s1, extend_s2, extend_s3, extend_s4, extend_s5, extend_s6, extend_s7, extend_s8, extend_i1, extend_i2, extend_i3, extend_i4, extend_f1, extend_f2, extend_f3, extend_f4, extend_d1, extend_d2, extend_d3, extend_d4)
VALUES ('1106135527342673920', '0', '0,', 20, '0000000020,', '1', 0, '全部', '全部', '0', 'msg_inner_receiver_type', '1', '', '', '', '0', 'system', sysdate, 'system', sysdate, '', '0', 'JeeSite', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- 取消内部消息部分字段必填选项
ALTER TABLE ${_prefix}SYS_MSG_INNER MODIFY (RECEIVE_CODES NULL );
ALTER TABLE ${_prefix}SYS_MSG_INNER MODIFY (RECEIVE_NAMES NULL );
ALTER TABLE ${_prefix}SYS_MSG_INNER MODIFY (SEND_USER_CODE NULL );
ALTER TABLE ${_prefix}SYS_MSG_INNER MODIFY (SEND_USER_NAME NULL );
ALTER TABLE ${_prefix}SYS_MSG_INNER MODIFY (SEND_DATE NULL );
ALTER TABLE ${_prefix}SYS_MSG_INNER MODIFY (NOTIFY_TYPES NULL );

View File

@@ -10,5 +10,25 @@ COMMENT ON COLUMN ${_prefix}sys_file_entity.file_meta IS '文件信息(JSON格
-- 集群的实例名字
ALTER TABLE ${_prefix}sys_job
ADD COLUMN instance_name varchar(255) NOT NULL DEFAULT JeeSiteScheduler;
ADD COLUMN instance_name varchar(255) NOT NULL DEFAULT 'JeeSiteScheduler';
COMMENT ON COLUMN ${_prefix}sys_job.instance_name IS '集群的实例名字';
-- 内部消息菜单
INSERT INTO ${_prefix}sys_menu(menu_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, menu_name, menu_type, menu_href, menu_target, menu_icon, menu_color, permission, weight, is_show, sys_code, module_codes, status, create_by, create_date, update_by, update_date, remarks, extend_s1, extend_s2, extend_s3, extend_s4, extend_s5, extend_s6, extend_s7, extend_s8, extend_i1, extend_i2, extend_i3, extend_i4, extend_f1, extend_f2, extend_f3, extend_f4, extend_d1, extend_d2, extend_d3, extend_d4)
VALUES ('1105443204287991808', '0', '0,', 9030, '0000009030,', '1', 0, '站内消息', '站内消息', '1', '/msg/msgInner/list', '', 'icon-speech', '', 'msg:msgInner', 40, '1', 'default', 'core', '0', 'system', now(), 'system', now(), '', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- 内部消息新增字典数据
INSERT INTO ${_prefix}sys_dict_type(id, dict_name, dict_type, is_sys, status, create_by, create_date, update_by, update_date, remarks)
VALUES ('1105440848414543872', '消息状态', 'msg_inner_msg_status', '0', '0', 'system', now(), 'system', now(), '');
INSERT INTO ${_prefix}sys_dict_data(dict_code, parent_code, parent_codes, tree_sort, tree_sorts, tree_leaf, tree_level, tree_names, dict_label, dict_value, dict_type, is_sys, description, css_style, css_class, status, create_by, create_date, update_by, update_date, remarks, corp_code, corp_name, extend_s1, extend_s2, extend_s3, extend_s4, extend_s5, extend_s6, extend_s7, extend_s8, extend_i1, extend_i2, extend_i3, extend_i4, extend_f1, extend_f2, extend_f3, extend_f4, extend_d1, extend_d2, extend_d3, extend_d4)
VALUES ('1106135527342673920', '0', '0,', 20, '0000000020,', '1', 0, '全部', '全部', '0', 'msg_inner_receiver_type', '1', '', '', '', '0', 'system', now(), 'system', now(), '', '0', 'JeeSite', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- 取消内部消息部分字段必填选项
ALTER TABLE ${_prefix}sys_msg_inner
ALTER COLUMN receive_codes DROP NOT NULL,
ALTER COLUMN receive_names DROP NOT NULL,
ALTER COLUMN send_user_code DROP NOT NULL,
ALTER COLUMN send_user_name DROP NOT NULL,
ALTER COLUMN send_date DROP NOT NULL,
ALTER COLUMN notify_types DROP NOT NULL;

View File

@@ -0,0 +1,28 @@
<?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.jeesite.modules.msg.dao.MsgInnerDao">
<!-- 查询数据 -->
<select id="findList" resultType="MsgInner">
SELECT distinct ${sqlMap.column.toSql()}
<if test="record != null and record.receiveUserCode != null and record.receiveUserCode != ''">,
r.read_status AS "record.readStatus",
r.read_date AS "record.readDate",
r.is_star AS "record.isStar"
</if>
FROM ${sqlMap.table.toSql()}
<if test="record != null and record.receiveUserCode != null and record.receiveUserCode != ''">
LEFT JOIN ${_prefix}sys_msg_inner_record r ON r.msg_inner_id = a.id
AND r.receive_user_code = #{record.receiveUserCode}
</if>
<where>
${sqlMap.where.toSql()}
<if test="record != null and record.receiveUserCode != null and record.receiveUserCode != ''">
AND ((a.status = #{STATUS_NORMAL} AND r.receive_user_code = #{record.receiveUserCode})
OR a.create_by = #{currentUser.userCode})
</if>
</where>
ORDER BY ${sqlMap.order.toSql()}
</select>
</mapper>

View File

@@ -0,0 +1,15 @@
<?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.jeesite.modules.msg.dao.MsgInnerRecordDao">
<!-- 查询数据
<select id="findList" resultType="MsgInnerRecord">
SELECT ${sqlMap.column.toSql()}
FROM ${sqlMap.table.toSql()}
<where>
${sqlMap.where.toSql()}
</where>
ORDER BY ${sqlMap.order.toSql()}
</select> -->
</mapper>

View File

@@ -0,0 +1,176 @@
<% layout('/layouts/default.html', {title: '站内消息', libs: ['validate','fileupload','ueditor']}){ %>
<div class="main-content">
<div class="box box-main">
<div class="box-header with-border">
<div class="box-title">
<i class="fa icon-speech"></i> ${text(msgInner.isNewRecord ? '发送消息' : '编辑消息')}
</div>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div>
<#form:form id="inputForm" model="${msgInner}" action="${ctx}/msg/msgInner/save" method="post" class="form-horizontal">
<div class="box-body">
<div class="form-unit">${text('基本信息')}</div>
<#form:hidden path="id"/>
<#form:hidden path="status"/>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label class="control-label col-sm-2" title="">
<span class="required ">*</span> ${text('标题')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-10">
<#form:input path="msgTitle" maxlength="200" class="form-control required text-ruler"/>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-4" title="">
<span class="required ">*</span> ${text('等级')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-8">
<#form:radio path="contentLevel" dictType="msg_inner_content_level" class="form-control required" />
</div>
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-4" title="">
<span class="required hide">*</span> ${text('类型')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-8">
<#form:radio path="contentType" dictType="msg_inner_content_type" blankOption="true" class="form-control" />
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label class="control-label col-sm-2" title="">
<span class="required ">*</span> ${text('内容')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-10">
<#form:ueditor path="msgContent" rows="4" class="form-control required" simpleToolbars="true"/>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label class="control-label col-sm-2">${text('附件')}</label>
<div class="col-sm-10">
<#form:fileupload id="uploadFile" bizKey="${msgInner.id}" bizType="msgInner_file"
uploadType="all" class="" readonly="false"/>
</div>
</div>
</div>
</div>
<div class="form-unit">${text('接受者信息')}</div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label class="control-label col-sm-2" title="">
<span class="required ">*</span> ${text('接受者')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-10">
<#form:radio path="receiveType" dictType="msg_inner_receiver_type" class="form-control required" />
<#form:treeselect id="receive" title="${text('接受者选择')}"
path="receiveCodes" labelPath="receiveNames"
url="${ctx}/sys/office/treeData?isLoadUser=true"
class=" required" allowClear="true" checkbox="true"/>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-4" title="">
<span class="required ">*</span> ${text('通知')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-8">
<#form:checkbox path="notifyTypes" dictType="sys_msg_type" class="form-control required" />
</div>
</div>
</div>
</div>
<% if(!msgInner.isNewRecord){ %>
<div class="form-unit">${text('发送者信息')}</div>
<div class="row">
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-4" title="">
<span class="required hide">*</span> ${text('发送者')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-8">
<#form:input path="sendUserName" readonly="true" maxlength="100" class="form-control required"/>
</div>
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-4" title="">
<span class="required hide">*</span> ${text('发送时间')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-8">
<#form:input path="sendDate" dataFormat="datetime" readonly="true" maxlength="20" class="form-control required"/>
</div>
</div>
</div>
</div>
<% } %>
</div>
<div class="box-footer">
<div class="row">
<div class="col-sm-offset-2 col-sm-10">
<% if (hasPermi('msg:msgInner:edit')){ %>
<% if (msgInner.status == null || msgInner.status == '9'){ %>
<button type="submit" class="btn btn-sm btn-primary" id="btnSubmit" onclick="$('#status').val(9)"><i class="fa fa-save"></i> ${text('保存草稿')}</button>&nbsp;
<button type="submit" class="btn btn-sm btn-info" id="btnRelease" onclick="$('#status').val(0)"><i class="fa fa-send"></i> ${text('发布消息')}</button>&nbsp;
<% } %>
<% } %>
<button type="button" class="btn btn-sm btn-default" id="btnCancel" onclick="js.closeCurrentTabPage()"><i class="fa fa-reply-all"></i> ${text('关 闭')}</button>
</div>
</div>
</div>
</#form:form>
</div>
</div>
<% } %>
<script>
$('#receiveType input').on('ifCreated ifChecked', function(event){
if ($(this).is(':checked')){
var url, val = $(this).val(); // 接受者类型1用户 2部门 3角色 4岗位
if (val == '0'){
$('#receiveDiv').hide();
$('#receiveName').removeClass('required');
}else{
$('#receiveDiv').show();
$('#receiveName').addClass('required');
if (val == '1'){
url = '${ctx}/sys/office/treeData?isLoadUser=true&isAll=true';
}else if (val == '2'){
url = '${ctx}/sys/office/treeData?isAll=true';
}else if (val == '3'){
url = '${ctx}/sys/role/treeData?isAll=true';
}else if (val == '4'){
url = '${ctx}/sys/post/treeData?isAll=true';
}
$('#receiveDiv').attr('data-url', url);
}
if (event.type != 'ifCreated'){
$('#receiveCode,#receiveName').val('');
}
}
});
$("#inputForm").validate({
submitHandler: function(form){
js.ajaxSubmitForm($(form), function(data){
js.showMessage(data.message);
if(data.result == Global.TRUE){
js.closeCurrentTabPage(function(contentWindow){
contentWindow.page();
});
}
}, "json");
}
});
</script>

View File

@@ -0,0 +1,107 @@
<% layout('/layouts/default.html', {title: '站内消息', libs: ['dataGrid']}){ %>
<div class="main-content">
<div class="box box-main">
<div class="box-header">
<div class="box-title">
<i class="fa icon-speech"></i> ${text('站内消息')}
</div>
<div class="box-tools pull-right">
<a href="#" class="btn btn-default" id="btnSearch" title="${text('查询')}"><i class="fa fa-filter"></i> ${text('查询')}</a>
<% if(hasPermi('msg:msgInner:edit')){ %>
<a href="${ctx}/msg/msgInner/form" class="btn btn-default btnTool" title="${text('新增')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
<% } %>
</div>
</div>
<div class="box-body">
<#form:form id="searchForm" model="${msgInner}" action="${ctx}/msg/msgInner/listData" method="post" class="form-inline hide"
data-page-no="${parameter.pageNo}" data-page-size="${parameter.pageSize}" data-order-by="${parameter.orderBy}">
<div class="form-group">
<label class="control-label">${text('标题')}</label>
<div class="control-inline">
<#form:input path="msgTitle" maxlength="200" class="form-control width-120"/>
</div>
</div>
<div class="form-group">
<label class="control-label">${text('级别')}</label>
<div class="control-inline width-60">
<#form:select path="contentLevel" dictType="msg_inner_content_level" blankOption="true" class="form-control"/>
</div>
</div>
<div class="form-group">
<label class="control-label">${text('类型')}</label>
<div class="control-inline width-60">
<#form:select path="contentType" dictType="msg_inner_content_type" blankOption="true" class="form-control"/>
</div>
</div>
<div class="form-group">
<label class="control-label">${text('发送时间')}</label>
<div class="control-inline">
<#form:input path="sendDate_gte" readonly="true" maxlength="20" class="form-control Wdate-date"
dataFormat="date" onclick="WdatePicker({dateFmt:'yyyy-MM-dd',isShowClear:false,onpicked:function(){sendDate_lte.click()}});"/>
&nbsp;--&nbsp;
<#form:input path="sendDate_lte" readonly="true" maxlength="20" class="form-control Wdate-date"
dataFormat="date" onclick="WdatePicker({dateFmt:'yyyy-MM-dd',isShowClear:false});"/>
</div>
</div>
<div class="form-group">
<label class="control-label">${text('状态')}</label>
<div class="control-inline width-60">
<#form:select path="status" dictType="msg_inner_msg_status" blankOption="true" class="form-control"/>
</div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary btn-sm">${text('查询')}</button>
<button type="reset" class="btn btn-default btn-sm">${text('重置')}</button>
</div>
</#form:form>
<table id="dataGrid"></table>
<div id="dataGridPage"></div>
</div>
</div>
</div>
<% } %>
<script>
// 初始化DataGrid对象
$('#dataGrid').dataGrid({
searchForm: $("#searchForm"),
columnModel: [
{header:'${text("标题")}', name:'msgTitle', index:'a.msg_title', width:280, align:"left", frozen:true, formatter: function(val, obj, row, act){
if(row.status == Global.STATUS_DRAFT){
return '<a href="${ctx}/msg/msgInner/form?id='+row.id+'" class="btnList" data-title="${text("编辑消息")}">'
+(val||row.id)+'</a>'+(row.isAttac==1?' <i class="fa fa-paperclip"></i>':'');
}else{
return '<a href="${ctx}/msg/msgInner/view?id='+row.id+'" class="btnList" data-title="${text("查看消息")}">'
+(val||row.id)+'</a>'+(row.isAttac==1?' <i class="fa fa-paperclip"></i>':'');
}
}},
{header:'${text("等级")}', name:'contentLevel', index:'a.content_level', width:80, align:"center", formatter: function(val, obj, row, act){
return js.getDictLabel(${@DictUtils.getDictListJson('msg_inner_content_level')}, val, '${text("未知")}', true);
}},
{header:'${text("类型")}', name:'contentType', index:'a.content_type', width:80, align:"center", formatter: function(val, obj, row, act){
return js.getDictLabel(${@DictUtils.getDictListJson('msg_inner_content_type')}, val, '${text("未知")}', true);
}},
{header:'${text("发送者")}', name:'sendUserName', index:'a.send_user_name', width:100, align:"center"},
{header:'${text("发送时间")}', name:'sendDate', index:'a.send_date', width:150, align:"center"},
// {header:'${text("更新时间")}', name:'updateDate', index:'a.update_date', width:150, align:"center"},
{header:'${text("状态")}', name:'status', index:'a.status', width:80, align:"center", formatter: function(val, obj, row, act){
return js.getDictLabel(${@DictUtils.getDictListJson('msg_inner_msg_status')}, val, '${text("未知")}', true);
}},
{header:'${text("操作")}', name:'actions', width:120, sortable:false, title:false, formatter: function(val, obj, row, act){
var actions = [];
if(row.status == Global.STATUS_DRAFT){
<% if(hasPermi('msg:msgInner:edit')){ %>
actions.push('<a href="${ctx}/msg/msgInner/form?id='+row.id+'" class="btnList" title="${text("编辑消息")}"><i class="fa fa-pencil"></i></a>&nbsp;');
actions.push('<a href="${ctx}/msg/msgInner/delete?id='+row.id+'" class="btnList" title="${text("删除消息")}" data-confirm="${text("确认要删除该消息吗?")}"><i class="fa fa-trash-o"></i></a>&nbsp;');
<% } %>
}else{
actions.push('<a href="${ctx}/msg/msgInner/view?id='+row.id+'" class="btnList" title="${text("查看消息")}"><i class="fa fa-book"></i></a>&nbsp;');
}
return actions.join('');
}}
],
// 加载成功后执行事件
ajaxSuccess: function(data){
}
});
</script>

View File

@@ -0,0 +1,50 @@
<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved. */ %>
<% layout('/layouts/default.html', {title: '查看消息', libs: ['validate','fileupload']}){ %>
<div class="main-content">
<div class="box box-main">
<div class="box-header with-border hide">
<div class="box-title">
<i class="fa icon-envelope-letter"></i> ${text('查看消息')}
</div>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
</div>
</div>
<div class="box-body article-view">
<h2 class="article-title">${msgInner.msgTitle}</h2>
<div class="content-text">
<!-- <blockquote>摘要:</blockquote> -->
${msgInner.msgContent}
<% if(msgInner.isAttac == @Global.YES){ %>
<div class="form-group pt20">
<#form:fileupload id="uploadFile" bizKey="${msgInner.id}" bizType="msgInner_file"
uploadType="all" class="" readonly="true" preview="weboffice"/>
</div>
<% } %>
</div>
<ul class="content-info">
<li><i class="fa fa-user"></i> 发送者:${msgInner.sendUserName}</li>
<li><i class="fa fa-calendar"></i> 发送时间:${msgInner.sendDate, 'yyyy-MM-dd HH:mm'}</li>
<li><i class="fa icon-envelope-letter"></i> 读取时间:${msgInner.sendDate, 'yyyy-MM-dd HH:mm'}</li>
<li><i class="fa fa-bookmark-o"></i> 等级:${@DictUtils.getDictLabel('msg_inner_content_level', msgInner.contentLevel, '普通')}</li>
<li><i class="fa fa-bookmark-o"></i> 类型:${@DictUtils.getDictLabel('msg_inner_content_type', msgInner.contentType, '其它')}</li>
</ul>
<% if (readList! != null && readList.~size > 0){ %>
<div class="content-info">已读用户:<% for (e in readList){ %>
<span class="label bg-green" title="${e.readDate,dateFormat='yyyy-MM-dd HH:mm:ss'}" data-code="${e.receiveUserName}">${e.receiveUserName}</span><% } %>
</div><% } %>
<% if (unReadList! != null && unReadList.~size > 0){ %>
<div class="content-info">未读用户:<% for (e in unReadList){ %>
<span class="label bg-yellow" data-code="${e.receiveUserName}">${e.receiveUserName}</span><% } %>
</div><% } %>
</div>
<div class="box-footer">
<div class="row">
<div class="col-sm-offset-2 col-sm-10">
<button type="button" class="btn btn-sm btn-default" id="btnCancel" onclick="js.closeCurrentTabPage()"><i class="fa fa-reply-all"></i> ${text('关 闭')}</button>
</div>
</div>
</div>
</div>
</div>
<% } %>

920
web/db/db2/core.sql Normal file
View File

@@ -0,0 +1,920 @@
/* Drop Tables */
DROP TABLE js_gen_table_column;
DROP TABLE js_gen_table;
DROP TABLE js_sys_company_office;
DROP TABLE js_sys_employee_post;
DROP TABLE js_sys_user_data_scope;
DROP TABLE js_sys_user_role;
DROP TABLE js_sys_user;
DROP TABLE js_sys_employee;
DROP TABLE js_sys_company;
DROP TABLE js_sys_area;
DROP TABLE js_sys_config;
DROP TABLE js_sys_dict_data;
DROP TABLE js_sys_dict_type;
DROP TABLE js_sys_file_upload;
DROP TABLE js_sys_file_entity;
DROP TABLE js_sys_job_log;
DROP TABLE js_sys_job;
DROP TABLE js_sys_lang;
DROP TABLE js_sys_log;
DROP TABLE js_sys_role_menu;
DROP TABLE js_sys_menu;
DROP TABLE js_sys_module;
DROP TABLE js_sys_msg_inner_record;
DROP TABLE js_sys_msg_inner;
DROP TABLE js_sys_msg_push;
DROP TABLE js_sys_msg_pushed;
DROP TABLE js_sys_msg_template;
DROP TABLE js_sys_office;
DROP TABLE js_sys_post;
DROP TABLE js_sys_role_data_scope;
DROP TABLE js_sys_role;
/* Create Tables */
-- 代码生成表
CREATE TABLE js_gen_table
(
table_name varchar(64) NOT NULL,
class_name varchar(100) NOT NULL,
comments vargraphic(500) NOT NULL,
parent_table_name varchar(64),
parent_table_fk_name varchar(64),
data_source_name varchar(64),
tpl_category varchar(200),
package_name varchar(500),
module_name varchar(30),
sub_module_name varchar(30),
function_name vargraphic(200),
function_name_simple vargraphic(50),
function_author vargraphic(50),
gen_base_dir vargraphic(1000),
options vargraphic(1000),
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks vargraphic(500),
PRIMARY KEY (table_name)
);
-- 代码生成表列
CREATE TABLE js_gen_table_column
(
id varchar(64) NOT NULL,
table_name varchar(64) NOT NULL,
column_name varchar(64) NOT NULL,
column_sort decimal(10),
column_type varchar(100) NOT NULL,
column_label vargraphic(50),
comments vargraphic(500) NOT NULL,
attr_name varchar(200) NOT NULL,
attr_type varchar(200) NOT NULL,
is_pk char(1),
is_null char(1),
is_insert char(1),
is_update char(1),
is_list char(1),
is_query char(1),
query_type varchar(200),
is_edit char(1),
show_type varchar(200),
options vargraphic(1000),
PRIMARY KEY (id)
);
-- 行政区划
CREATE TABLE js_sys_area
(
area_code varchar(100) NOT NULL,
parent_code varchar(64) NOT NULL,
parent_codes varchar(1000) NOT NULL,
tree_sort decimal(10) NOT NULL,
tree_sorts varchar(1000) NOT NULL,
tree_leaf char(1) NOT NULL,
tree_level decimal(4) NOT NULL,
tree_names varchar(1000) NOT NULL,
area_name vargraphic(100) NOT NULL,
area_type char(1),
status char(1) DEFAULT '0' NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks vargraphic(500),
PRIMARY KEY (area_code)
);
-- 公司表
CREATE TABLE js_sys_company
(
company_code varchar(64) NOT NULL,
parent_code varchar(64) NOT NULL,
parent_codes varchar(1000) NOT NULL,
tree_sort decimal(10) NOT NULL,
tree_sorts varchar(1000) NOT NULL,
tree_leaf char(1) NOT NULL,
tree_level decimal(4) NOT NULL,
tree_names varchar(1000) NOT NULL,
view_code varchar(100) NOT NULL,
company_name vargraphic(200) NOT NULL,
full_name vargraphic(200) NOT NULL,
area_code varchar(100),
status char(1) DEFAULT '0' NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks vargraphic(500),
corp_code varchar(64) DEFAULT '0' NOT NULL,
corp_name vargraphic(100) DEFAULT 'JeeSite' NOT NULL,
extend_s1 vargraphic(500),
extend_s2 vargraphic(500),
extend_s3 vargraphic(500),
extend_s4 vargraphic(500),
extend_s5 vargraphic(500),
extend_s6 vargraphic(500),
extend_s7 vargraphic(500),
extend_s8 vargraphic(500),
extend_i1 decimal(19),
extend_i2 decimal(19),
extend_i3 decimal(19),
extend_i4 decimal(19),
extend_f1 decimal(19,4),
extend_f2 decimal(19,4),
extend_f3 decimal(19,4),
extend_f4 decimal(19,4),
extend_d1 timestamp,
extend_d2 timestamp,
extend_d3 timestamp,
extend_d4 timestamp,
PRIMARY KEY (company_code)
);
-- 公司部门关联表
CREATE TABLE js_sys_company_office
(
company_code varchar(64) NOT NULL,
office_code varchar(64) NOT NULL,
PRIMARY KEY (company_code, office_code)
);
-- 参数配置表
CREATE TABLE js_sys_config
(
id varchar(64) NOT NULL,
config_name vargraphic(100) NOT NULL,
config_key varchar(100) NOT NULL,
config_value vargraphic(1000),
is_sys char(1) NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks vargraphic(500),
PRIMARY KEY (id)
);
-- 字典数据表
CREATE TABLE js_sys_dict_data
(
dict_code varchar(64) NOT NULL,
parent_code varchar(64) NOT NULL,
parent_codes varchar(1000) NOT NULL,
tree_sort decimal(10) NOT NULL,
tree_sorts varchar(1000) NOT NULL,
tree_leaf char(1) NOT NULL,
tree_level decimal(4) NOT NULL,
tree_names varchar(1000) NOT NULL,
dict_label vargraphic(100) NOT NULL,
dict_value varchar(100) NOT NULL,
dict_type varchar(100) NOT NULL,
is_sys char(1) NOT NULL,
description vargraphic(500),
css_style vargraphic(500),
css_class vargraphic(500),
status char(1) DEFAULT '0' NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks vargraphic(500),
corp_code varchar(64) DEFAULT '0' NOT NULL,
corp_name vargraphic(100) DEFAULT 'JeeSite' NOT NULL,
extend_s1 vargraphic(500),
extend_s2 vargraphic(500),
extend_s3 vargraphic(500),
extend_s4 vargraphic(500),
extend_s5 vargraphic(500),
extend_s6 vargraphic(500),
extend_s7 vargraphic(500),
extend_s8 vargraphic(500),
extend_i1 decimal(19),
extend_i2 decimal(19),
extend_i3 decimal(19),
extend_i4 decimal(19),
extend_f1 decimal(19,4),
extend_f2 decimal(19,4),
extend_f3 decimal(19,4),
extend_f4 decimal(19,4),
extend_d1 timestamp,
extend_d2 timestamp,
extend_d3 timestamp,
extend_d4 timestamp,
PRIMARY KEY (dict_code)
);
-- 字典类型表
CREATE TABLE js_sys_dict_type
(
id varchar(64) NOT NULL,
dict_name vargraphic(100) NOT NULL,
dict_type varchar(100) NOT NULL,
is_sys char(1) NOT NULL,
status char(1) DEFAULT '0' NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks vargraphic(500),
PRIMARY KEY (id)
);
-- 员工表
CREATE TABLE js_sys_employee
(
emp_code varchar(64) NOT NULL,
emp_name vargraphic(100) NOT NULL,
emp_name_en varchar(100),
office_code varchar(64) NOT NULL,
office_name vargraphic(100) NOT NULL,
company_code varchar(64),
company_name vargraphic(200),
status char(1) NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks vargraphic(500),
corp_code varchar(64) DEFAULT '0' NOT NULL,
corp_name vargraphic(100) DEFAULT 'JeeSite' NOT NULL,
PRIMARY KEY (emp_code)
);
-- 员工与岗位关联表
CREATE TABLE js_sys_employee_post
(
emp_code varchar(64) NOT NULL,
post_code varchar(64) NOT NULL,
PRIMARY KEY (emp_code, post_code)
);
-- 文件实体表
CREATE TABLE js_sys_file_entity
(
file_id varchar(64) NOT NULL,
file_md5 varchar(64) NOT NULL,
file_path vargraphic(1000) NOT NULL,
file_content_type varchar(200) NOT NULL,
file_extension varchar(100) NOT NULL,
file_size decimal(31) NOT NULL,
file_meta varchar(255),
PRIMARY KEY (file_id)
);
-- 文件上传表
CREATE TABLE js_sys_file_upload
(
id varchar(64) NOT NULL,
file_id varchar(64) NOT NULL,
file_name vargraphic(500) NOT NULL,
file_type varchar(20) NOT NULL,
biz_key varchar(64),
biz_type varchar(64),
status char(1) DEFAULT '0' NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks vargraphic(500),
PRIMARY KEY (id)
);
-- 作业调度表
CREATE TABLE js_sys_job
(
job_name varchar(64) NOT NULL,
job_group varchar(64) NOT NULL,
description vargraphic(100) NOT NULL,
invoke_target vargraphic(1000) NOT NULL,
cron_expression varchar(255) NOT NULL,
misfire_instruction decimal(1) NOT NULL,
concurrent char(1) NOT NULL,
instance_name varchar(64) DEFAULT 'JeeSiteScheduler' NOT NULL,
status char(1) NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks vargraphic(500),
PRIMARY KEY (job_name, job_group)
);
-- 作业调度日志表
CREATE TABLE js_sys_job_log
(
id varchar(64) NOT NULL,
job_name varchar(64) NOT NULL,
job_group varchar(64) NOT NULL,
job_type varchar(50),
job_event varchar(200),
job_message varchar(500),
is_exception char(1),
exception_info clob,
create_date timestamp,
PRIMARY KEY (id)
);
-- 国际化语言
CREATE TABLE js_sys_lang
(
id varchar(64) NOT NULL,
module_code varchar(64) NOT NULL,
lang_code vargraphic(500) NOT NULL,
lang_text vargraphic(500) NOT NULL,
lang_type varchar(50) NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks vargraphic(500),
PRIMARY KEY (id)
);
-- 操作日志表
CREATE TABLE js_sys_log
(
id varchar(64) NOT NULL,
log_type varchar(50) NOT NULL,
log_title vargraphic(500) NOT NULL,
create_by varchar(64) NOT NULL,
create_by_name vargraphic(100) NOT NULL,
create_date timestamp NOT NULL,
request_uri vargraphic(500),
request_method varchar(10),
request_params clob,
diff_modify_data clob,
biz_key varchar(64),
biz_type varchar(64),
remote_addr varchar(255) NOT NULL,
server_addr varchar(255) NOT NULL,
is_exception char(1),
exception_info clob,
user_agent vargraphic(500),
device_name varchar(100),
browser_name varchar(100),
execute_time decimal(19),
corp_code varchar(64) DEFAULT '0' NOT NULL,
corp_name vargraphic(100) DEFAULT 'JeeSite' NOT NULL,
PRIMARY KEY (id)
);
-- 菜单表
CREATE TABLE js_sys_menu
(
menu_code varchar(64) NOT NULL,
parent_code varchar(64) NOT NULL,
parent_codes varchar(1000) NOT NULL,
tree_sort decimal(10) NOT NULL,
tree_sorts varchar(1000) NOT NULL,
tree_leaf char(1) NOT NULL,
tree_level decimal(4) NOT NULL,
tree_names varchar(1000) NOT NULL,
menu_name varchar(100) NOT NULL,
menu_type char(1) NOT NULL,
menu_href varchar(1000),
menu_target varchar(20),
menu_icon varchar(100),
menu_color varchar(50),
permission varchar(1000),
weight decimal(4),
is_show char(1) NOT NULL,
sys_code varchar(64) NOT NULL,
module_codes varchar(500) NOT NULL,
status char(1) DEFAULT '0' NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks vargraphic(500),
extend_s1 vargraphic(500),
extend_s2 vargraphic(500),
extend_s3 vargraphic(500),
extend_s4 vargraphic(500),
extend_s5 vargraphic(500),
extend_s6 vargraphic(500),
extend_s7 vargraphic(500),
extend_s8 vargraphic(500),
extend_i1 decimal(19),
extend_i2 decimal(19),
extend_i3 decimal(19),
extend_i4 decimal(19),
extend_f1 decimal(19,4),
extend_f2 decimal(19,4),
extend_f3 decimal(19,4),
extend_f4 decimal(19,4),
extend_d1 timestamp,
extend_d2 timestamp,
extend_d3 timestamp,
extend_d4 timestamp,
PRIMARY KEY (menu_code)
);
-- 模块表
CREATE TABLE js_sys_module
(
module_code varchar(64) NOT NULL,
module_name varchar(100) NOT NULL,
description vargraphic(500),
main_class_name varchar(500),
current_version varchar(50),
upgrade_info varchar(300),
status char(1) DEFAULT '0' NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks vargraphic(500),
PRIMARY KEY (module_code)
);
-- 内部消息
CREATE TABLE js_sys_msg_inner
(
id varchar(64) NOT NULL,
msg_title varchar(200) NOT NULL,
content_level char(1) NOT NULL,
content_type char(1),
msg_content clob NOT NULL,
receive_type char(1) NOT NULL,
receive_codes clob,
receive_names clob,
send_user_code varchar(64),
send_user_name varchar(100),
send_date timestamp,
is_attac char(1),
notify_types varchar(100),
status char(1) NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks vargraphic(500),
PRIMARY KEY (id)
);
-- 内部消息发送记录表
CREATE TABLE js_sys_msg_inner_record
(
id varchar(64) NOT NULL,
msg_inner_id varchar(64) NOT NULL,
receive_user_code varchar(64),
receive_user_name varchar(100) NOT NULL,
read_status char(1) NOT NULL,
read_date timestamp,
is_star char(1),
PRIMARY KEY (id)
);
-- 消息推送表
CREATE TABLE js_sys_msg_push
(
id varchar(64) NOT NULL,
msg_type varchar(16) NOT NULL,
msg_title varchar(200) NOT NULL,
msg_content clob NOT NULL,
biz_key varchar(64),
biz_type varchar(64),
receive_code varchar(64) NOT NULL,
receive_user_code varchar(64) NOT NULL,
receive_user_name varchar(100) NOT NULL,
send_user_code varchar(64) NOT NULL,
send_user_name varchar(100) NOT NULL,
send_date timestamp NOT NULL,
is_merge_push char(1),
plan_push_date timestamp,
push_number int,
push_return_code varchar(200),
push_return_msg_id varchar(200),
push_return_content clob,
push_status char(1),
push_date timestamp,
read_status char(1),
read_date timestamp,
PRIMARY KEY (id)
);
-- 消息已推送表
CREATE TABLE js_sys_msg_pushed
(
id varchar(64) NOT NULL,
msg_type varchar(16) NOT NULL,
msg_title varchar(200) NOT NULL,
msg_content clob NOT NULL,
biz_key varchar(64),
biz_type varchar(64),
receive_code varchar(64) NOT NULL,
receive_user_code varchar(64) NOT NULL,
receive_user_name varchar(100) NOT NULL,
send_user_code varchar(64) NOT NULL,
send_user_name varchar(100) NOT NULL,
send_date timestamp NOT NULL,
is_merge_push char(1),
plan_push_date timestamp,
push_number int,
push_return_content clob,
push_return_code varchar(200),
push_return_msg_id varchar(200),
push_status char(1),
push_date timestamp,
read_status char(1),
read_date timestamp,
PRIMARY KEY (id)
);
-- 消息模板
CREATE TABLE js_sys_msg_template
(
id varchar(64) NOT NULL,
module_code varchar(64),
tpl_key varchar(100) NOT NULL,
tpl_name vargraphic(100) NOT NULL,
tpl_type varchar(16) NOT NULL,
tpl_content clob NOT NULL,
status char(1) DEFAULT '0' NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks vargraphic(500),
PRIMARY KEY (id)
);
-- 组织机构表
CREATE TABLE js_sys_office
(
office_code varchar(64) NOT NULL,
parent_code varchar(64) NOT NULL,
parent_codes varchar(1000) NOT NULL,
tree_sort decimal(10) NOT NULL,
tree_sorts varchar(1000) NOT NULL,
tree_leaf char(1) NOT NULL,
tree_level decimal(4) NOT NULL,
tree_names varchar(1000) NOT NULL,
view_code varchar(100) NOT NULL,
office_name vargraphic(100) NOT NULL,
full_name varchar(200) NOT NULL,
office_type char(1) NOT NULL,
leader varchar(100),
phone varchar(100),
address varchar(255),
zip_code varchar(100),
email varchar(300),
status char(1) DEFAULT '0' NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks vargraphic(500),
corp_code varchar(64) DEFAULT '0' NOT NULL,
corp_name vargraphic(100) DEFAULT 'JeeSite' NOT NULL,
extend_s1 vargraphic(500),
extend_s2 vargraphic(500),
extend_s3 vargraphic(500),
extend_s4 vargraphic(500),
extend_s5 vargraphic(500),
extend_s6 vargraphic(500),
extend_s7 vargraphic(500),
extend_s8 vargraphic(500),
extend_i1 decimal(19),
extend_i2 decimal(19),
extend_i3 decimal(19),
extend_i4 decimal(19),
extend_f1 decimal(19,4),
extend_f2 decimal(19,4),
extend_f3 decimal(19,4),
extend_f4 decimal(19,4),
extend_d1 timestamp,
extend_d2 timestamp,
extend_d3 timestamp,
extend_d4 timestamp,
PRIMARY KEY (office_code)
);
-- 员工岗位表
CREATE TABLE js_sys_post
(
post_code varchar(64) NOT NULL,
post_name varchar(100) NOT NULL,
post_type varchar(100),
post_sort decimal(10),
status char(1) DEFAULT '0' NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks vargraphic(500),
corp_code varchar(64) DEFAULT '0' NOT NULL,
corp_name vargraphic(100) DEFAULT 'JeeSite' NOT NULL,
PRIMARY KEY (post_code)
);
-- 角色表
CREATE TABLE js_sys_role
(
role_code varchar(64) NOT NULL,
role_name varchar(100) NOT NULL,
role_type varchar(100),
role_sort decimal(10),
is_sys char(1),
user_type varchar(16),
data_scope char(1),
status char(1) DEFAULT '0' NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks vargraphic(500),
corp_code varchar(64) DEFAULT '0' NOT NULL,
corp_name vargraphic(100) DEFAULT 'JeeSite' NOT NULL,
PRIMARY KEY (role_code)
);
-- 角色数据权限表
CREATE TABLE js_sys_role_data_scope
(
role_code varchar(64) NOT NULL,
ctrl_type varchar(20) NOT NULL,
ctrl_data varchar(64) NOT NULL,
ctrl_permi varchar(64) NOT NULL,
PRIMARY KEY (role_code, ctrl_type, ctrl_data, ctrl_permi)
);
-- 角色与菜单关联表
CREATE TABLE js_sys_role_menu
(
role_code varchar(64) NOT NULL,
menu_code varchar(64) NOT NULL,
PRIMARY KEY (role_code, menu_code)
);
-- 用户表
CREATE TABLE js_sys_user
(
user_code varchar(100) NOT NULL,
login_code varchar(100) NOT NULL,
user_name varchar(100) NOT NULL,
password varchar(100) NOT NULL,
email varchar(300),
mobile varchar(100),
phone varchar(100),
sex char(1),
avatar varchar(1000),
sign vargraphic(200),
wx_openid varchar(100),
mobile_imei varchar(100),
user_type varchar(16) NOT NULL,
ref_code varchar(64),
ref_name varchar(100),
mgr_type char(1) NOT NULL,
pwd_security_level decimal(1),
pwd_update_date timestamp,
pwd_update_record varchar(1000),
pwd_question varchar(200),
pwd_question_answer varchar(200),
pwd_question_2 varchar(200),
pwd_question_answer_2 varchar(200),
pwd_question_3 varchar(200),
pwd_question_answer_3 varchar(200),
pwd_quest_update_date timestamp,
last_login_ip varchar(100),
last_login_date timestamp,
freeze_date timestamp,
freeze_cause varchar(200),
user_weight decimal(8) DEFAULT 0,
status char NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
update_by varchar(64) NOT NULL,
update_date timestamp NOT NULL,
remarks vargraphic(500),
corp_code varchar(64) DEFAULT '0' NOT NULL,
corp_name vargraphic(100) DEFAULT 'JeeSite' NOT NULL,
extend_s1 vargraphic(500),
extend_s2 vargraphic(500),
extend_s3 vargraphic(500),
extend_s4 vargraphic(500),
extend_s5 vargraphic(500),
extend_s6 vargraphic(500),
extend_s7 vargraphic(500),
extend_s8 vargraphic(500),
extend_i1 decimal(19),
extend_i2 decimal(19),
extend_i3 decimal(19),
extend_i4 decimal(19),
extend_f1 decimal(19,4),
extend_f2 decimal(19,4),
extend_f3 decimal(19,4),
extend_f4 decimal(19,4),
extend_d1 timestamp,
extend_d2 timestamp,
extend_d3 timestamp,
extend_d4 timestamp,
PRIMARY KEY (user_code)
);
-- 用户数据权限表
CREATE TABLE js_sys_user_data_scope
(
user_code varchar(100) NOT NULL,
ctrl_type varchar(20) NOT NULL,
ctrl_data varchar(64) NOT NULL,
ctrl_permi varchar(64) NOT NULL,
PRIMARY KEY (user_code, ctrl_type, ctrl_data, ctrl_permi)
);
-- 用户与角色关联表
CREATE TABLE js_sys_user_role
(
user_code varchar(100) NOT NULL,
role_code varchar(64) NOT NULL,
PRIMARY KEY (user_code, role_code)
);
/* Create Indexes */
CREATE INDEX idx_gen_table_ptn ON js_gen_table (parent_table_name);
CREATE INDEX idx_gen_table_column_tn ON js_gen_table_column (table_name);
CREATE INDEX idx_sys_area_pc ON js_sys_area (parent_code);
CREATE INDEX idx_sys_area_ts ON js_sys_area (tree_sort);
CREATE INDEX idx_sys_area_status ON js_sys_area (status);
CREATE INDEX idx_sys_area_pcs ON js_sys_area (parent_codes);
CREATE INDEX idx_sys_area_tss ON js_sys_area (tree_sorts);
CREATE INDEX idx_sys_company_cc ON js_sys_company (corp_code);
CREATE INDEX idx_sys_company_pc ON js_sys_company (parent_code);
CREATE INDEX idx_sys_company_ts ON js_sys_company (tree_sort);
CREATE INDEX idx_sys_company_status ON js_sys_company (status);
CREATE INDEX idx_sys_company_vc ON js_sys_company (view_code);
CREATE INDEX idx_sys_company_pcs ON js_sys_company (parent_codes);
CREATE INDEX idx_sys_company_tss ON js_sys_company (tree_sorts);
CREATE UNIQUE INDEX idx_sys_config_key ON js_sys_config (config_key);
CREATE INDEX idx_sys_dict_data_cc ON js_sys_dict_data (corp_code);
CREATE INDEX idx_sys_dict_data_dt ON js_sys_dict_data (dict_type);
CREATE INDEX idx_sys_dict_data_pc ON js_sys_dict_data (parent_code);
CREATE INDEX idx_sys_dict_data_status ON js_sys_dict_data (status);
CREATE INDEX idx_sys_dict_data_pcs ON js_sys_dict_data (parent_codes);
CREATE INDEX idx_sys_dict_data_ts ON js_sys_dict_data (tree_sort);
CREATE INDEX idx_sys_dict_data_tss ON js_sys_dict_data (tree_sorts);
CREATE INDEX idx_sys_dict_data_dv ON js_sys_dict_data (dict_value);
CREATE INDEX idx_sys_dict_type_is ON js_sys_dict_type (is_sys);
CREATE INDEX idx_sys_dict_type_status ON js_sys_dict_type (status);
CREATE INDEX idx_sys_employee_cco ON js_sys_employee (company_code);
CREATE INDEX idx_sys_employee_cc ON js_sys_employee (corp_code);
CREATE INDEX idx_sys_employee_ud ON js_sys_employee (update_date);
CREATE INDEX idx_sys_employee_oc ON js_sys_employee (office_code);
CREATE INDEX idx_sys_employee_status ON js_sys_employee (status);
CREATE INDEX idx_sys_file_entity_md5 ON js_sys_file_entity (file_md5);
CREATE INDEX idx_sys_file_entity_size ON js_sys_file_entity (file_size);
CREATE INDEX idx_sys_file_biz_ft ON js_sys_file_upload (file_type);
CREATE INDEX idx_sys_file_biz_fi ON js_sys_file_upload (file_id);
CREATE INDEX idx_sys_file_biz_status ON js_sys_file_upload (status);
CREATE INDEX idx_sys_file_biz_cb ON js_sys_file_upload (create_by);
CREATE INDEX idx_sys_file_biz_ud ON js_sys_file_upload (update_date);
CREATE INDEX idx_sys_file_biz_bt ON js_sys_file_upload (biz_type);
CREATE INDEX idx_sys_file_biz_bk ON js_sys_file_upload (biz_key);
CREATE INDEX idx_sys_job_status ON js_sys_job (status);
CREATE INDEX idx_sys_job_log_jn ON js_sys_job_log (job_name);
CREATE INDEX idx_sys_job_log_jg ON js_sys_job_log (job_group);
CREATE INDEX idx_sys_job_log_t ON js_sys_job_log (job_type);
CREATE INDEX idx_sys_job_log_e ON js_sys_job_log (job_event);
CREATE INDEX idx_sys_job_log_ie ON js_sys_job_log (is_exception);
CREATE INDEX idx_sys_lang_code ON js_sys_lang (lang_code);
CREATE INDEX idx_sys_lang_type ON js_sys_lang (lang_type);
CREATE INDEX idx_sys_log_cb ON js_sys_log (create_by);
CREATE INDEX idx_sys_log_cc ON js_sys_log (corp_code);
CREATE INDEX idx_sys_log_lt ON js_sys_log (log_type);
CREATE INDEX idx_sys_log_bk ON js_sys_log (biz_key);
CREATE INDEX idx_sys_log_bt ON js_sys_log (biz_type);
CREATE INDEX idx_sys_log_ie ON js_sys_log (is_exception);
CREATE INDEX idx_sys_log_cd ON js_sys_log (create_date);
CREATE INDEX idx_sys_menu_pc ON js_sys_menu (parent_code);
CREATE INDEX idx_sys_menu_ts ON js_sys_menu (tree_sort);
CREATE INDEX idx_sys_menu_status ON js_sys_menu (status);
CREATE INDEX idx_sys_menu_mt ON js_sys_menu (menu_type);
CREATE INDEX idx_sys_menu_pss ON js_sys_menu (parent_codes);
CREATE INDEX idx_sys_menu_tss ON js_sys_menu (tree_sorts);
CREATE INDEX idx_sys_menu_sc ON js_sys_menu (sys_code);
CREATE INDEX idx_sys_menu_is ON js_sys_menu (is_show);
CREATE INDEX idx_sys_menu_mcs ON js_sys_menu (module_codes);
CREATE INDEX idx_sys_menu_wt ON js_sys_menu (weight);
CREATE INDEX idx_sys_module_status ON js_sys_module (status);
CREATE INDEX idx_sys_msg_inner_cb ON js_sys_msg_inner (create_by);
CREATE INDEX idx_sys_msg_inner_status ON js_sys_msg_inner (status);
CREATE INDEX idx_sys_msg_inner_cl ON js_sys_msg_inner (content_level);
CREATE INDEX idx_sys_msg_inner_sc ON js_sys_msg_inner (send_user_code);
CREATE INDEX idx_sys_msg_inner_sd ON js_sys_msg_inner (send_date);
CREATE INDEX idx_sys_msg_inner_r_mi ON js_sys_msg_inner_record (msg_inner_id);
CREATE INDEX idx_sys_msg_inner_r_ruc ON js_sys_msg_inner_record (receive_user_code);
CREATE INDEX idx_sys_msg_inner_r_status ON js_sys_msg_inner_record (read_status);
CREATE INDEX idx_sys_msg_inner_r_star ON js_sys_msg_inner_record (is_star);
CREATE INDEX idx_sys_msg_push_type ON js_sys_msg_push (msg_type);
CREATE INDEX idx_sys_msg_push_rc ON js_sys_msg_push (receive_code);
CREATE INDEX idx_sys_msg_push_uc ON js_sys_msg_push (receive_user_code);
CREATE INDEX idx_sys_msg_push_suc ON js_sys_msg_push (send_user_code);
CREATE INDEX idx_sys_msg_push_pd ON js_sys_msg_push (plan_push_date);
CREATE INDEX idx_sys_msg_push_ps ON js_sys_msg_push (push_status);
CREATE INDEX idx_sys_msg_push_rs ON js_sys_msg_push (read_status);
CREATE INDEX idx_sys_msg_push_bk ON js_sys_msg_push (biz_key);
CREATE INDEX idx_sys_msg_push_bt ON js_sys_msg_push (biz_type);
CREATE INDEX idx_sys_msg_push_imp ON js_sys_msg_push (is_merge_push);
CREATE INDEX idx_sys_msg_pushed_type ON js_sys_msg_pushed (msg_type);
CREATE INDEX idx_sys_msg_pushed_rc ON js_sys_msg_pushed (receive_code);
CREATE INDEX idx_sys_msg_pushed_uc ON js_sys_msg_pushed (receive_user_code);
CREATE INDEX idx_sys_msg_pushed_suc ON js_sys_msg_pushed (send_user_code);
CREATE INDEX idx_sys_msg_pushed_pd ON js_sys_msg_pushed (plan_push_date);
CREATE INDEX idx_sys_msg_pushed_ps ON js_sys_msg_pushed (push_status);
CREATE INDEX idx_sys_msg_pushed_rs ON js_sys_msg_pushed (read_status);
CREATE INDEX idx_sys_msg_pushed_bk ON js_sys_msg_pushed (biz_key);
CREATE INDEX idx_sys_msg_pushed_bt ON js_sys_msg_pushed (biz_type);
CREATE INDEX idx_sys_msg_pushed_imp ON js_sys_msg_pushed (is_merge_push);
CREATE INDEX idx_sys_msg_tpl_key ON js_sys_msg_template (tpl_key);
CREATE INDEX idx_sys_msg_tpl_type ON js_sys_msg_template (tpl_type);
CREATE INDEX idx_sys_msg_tpl_status ON js_sys_msg_template (status);
CREATE INDEX idx_sys_office_cc ON js_sys_office (corp_code);
CREATE INDEX idx_sys_office_pc ON js_sys_office (parent_code);
CREATE INDEX idx_sys_office_pcs ON js_sys_office (parent_codes);
CREATE INDEX idx_sys_office_status ON js_sys_office (status);
CREATE INDEX idx_sys_office_ot ON js_sys_office (office_type);
CREATE INDEX idx_sys_office_vc ON js_sys_office (view_code);
CREATE INDEX idx_sys_office_ts ON js_sys_office (tree_sort);
CREATE INDEX idx_sys_office_tss ON js_sys_office (tree_sorts);
CREATE INDEX idx_sys_post_cc ON js_sys_post (corp_code);
CREATE INDEX idx_sys_post_status ON js_sys_post (status);
CREATE INDEX idx_sys_post_ps ON js_sys_post (post_sort);
CREATE INDEX idx_sys_role_cc ON js_sys_role (corp_code);
CREATE INDEX idx_sys_role_is ON js_sys_role (is_sys);
CREATE INDEX idx_sys_role_status ON js_sys_role (status);
CREATE INDEX idx_sys_role_rs ON js_sys_role (role_sort);
CREATE INDEX idx_sys_user_lc ON js_sys_user (login_code);
CREATE INDEX idx_sys_user_email ON js_sys_user (email);
CREATE INDEX idx_sys_user_mobile ON js_sys_user (mobile);
CREATE INDEX idx_sys_user_wo ON js_sys_user (wx_openid);
CREATE INDEX idx_sys_user_imei ON js_sys_user (mobile_imei);
CREATE INDEX idx_sys_user_rt ON js_sys_user (user_type);
CREATE INDEX idx_sys_user_rc ON js_sys_user (ref_code);
CREATE INDEX idx_sys_user_mt ON js_sys_user (mgr_type);
CREATE INDEX idx_sys_user_us ON js_sys_user (user_weight);
CREATE INDEX idx_sys_user_ud ON js_sys_user (update_date);
CREATE INDEX idx_sys_user_status ON js_sys_user (status);
CREATE INDEX idx_sys_user_cc ON js_sys_user (corp_code);

View File

@@ -481,13 +481,13 @@ CREATE TABLE [js_sys_msg_inner]
[content_type] char(1),
[msg_content] text NOT NULL,
[receive_type] char(1) NOT NULL,
[receive_codes] text NOT NULL,
[receive_names] text NOT NULL,
[send_user_code] varchar(64) NOT NULL,
[send_user_name] varchar(100) NOT NULL,
[send_date] datetime NOT NULL,
[receive_codes] text,
[receive_names] text,
[send_user_code] varchar(64),
[send_user_name] varchar(100),
[send_date] datetime,
[is_attac] char(1),
[notify_types] varchar(100) NOT NULL,
[notify_types] varchar(100),
[status] char(1) NOT NULL,
[create_by] varchar(64) NOT NULL,
[create_date] datetime NOT NULL,

View File

@@ -481,14 +481,14 @@ CREATE TABLE js_sys_msg_inner
content_level char(1) NOT NULL COMMENT '内容级别1普通 2一般 3紧急',
content_type char(1) COMMENT '内容类型1公告 2新闻 3会议 4其它',
msg_content text NOT NULL COMMENT '消息内容',
receive_type char(1) NOT NULL COMMENT '接受者类型1用户 2部门 3角色 4岗位',
receive_codes text NOT NULL COMMENT '接受者字符串',
receive_names text NOT NULL COMMENT '接受者名称字符串',
send_user_code varchar(64) NOT NULL COMMENT '发送者用户编码',
send_user_name varchar(100) NOT NULL COMMENT '发送者用户姓名',
send_date datetime NOT NULL COMMENT '发送时间',
receive_type char(1) NOT NULL COMMENT '接受者类型(0全部 1用户 2部门 3角色 4岗位',
receive_codes text COMMENT '接受者字符串',
receive_names text COMMENT '接受者名称字符串',
send_user_code varchar(64) COMMENT '发送者用户编码',
send_user_name varchar(100) COMMENT '发送者用户姓名',
send_date datetime COMMENT '发送时间',
is_attac char(1) COMMENT '是否有附件',
notify_types varchar(100) NOT NULL COMMENT '通知类型PC APP 短信 邮件 微信)多选',
notify_types varchar(100) COMMENT '通知类型PC APP 短信 邮件 微信)多选',
status char(1) NOT NULL COMMENT '状态0正常 1删除 4审核 5驳回 9草稿',
create_by varchar(64) NOT NULL COMMENT '创建者',
create_date datetime NOT NULL COMMENT '创建时间',

View File

@@ -481,13 +481,13 @@ CREATE TABLE js_sys_msg_inner
content_type char(1),
msg_content clob NOT NULL,
receive_type char(1) NOT NULL,
receive_codes clob NOT NULL,
receive_names clob NOT NULL,
send_user_code varchar2(64) NOT NULL,
send_user_name varchar2(100) NOT NULL,
send_date timestamp NOT NULL,
receive_codes clob,
receive_names clob,
send_user_code varchar2(64),
send_user_name varchar2(100),
send_date timestamp,
is_attac char(1),
notify_types varchar2(100) NOT NULL,
notify_types varchar2(100),
status char(1) NOT NULL,
create_by varchar2(64) NOT NULL,
create_date timestamp NOT NULL,
@@ -1252,7 +1252,7 @@ COMMENT ON COLUMN js_sys_msg_inner.msg_title IS '消息标题';
COMMENT ON COLUMN js_sys_msg_inner.content_level IS '内容级别1普通 2一般 3紧急';
COMMENT ON COLUMN js_sys_msg_inner.content_type IS '内容类型1公告 2新闻 3会议 4其它';
COMMENT ON COLUMN js_sys_msg_inner.msg_content IS '消息内容';
COMMENT ON COLUMN js_sys_msg_inner.receive_type IS '接受者类型1用户 2部门 3角色 4岗位';
COMMENT ON COLUMN js_sys_msg_inner.receive_type IS '接受者类型(0全部 1用户 2部门 3角色 4岗位';
COMMENT ON COLUMN js_sys_msg_inner.receive_codes IS '接受者字符串';
COMMENT ON COLUMN js_sys_msg_inner.receive_names IS '接受者名称字符串';
COMMENT ON COLUMN js_sys_msg_inner.send_user_code IS '发送者用户编码';

View File

@@ -481,13 +481,13 @@ CREATE TABLE js_sys_msg_inner
content_type char(1),
msg_content text NOT NULL,
receive_type char(1) NOT NULL,
receive_codes text NOT NULL,
receive_names text NOT NULL,
send_user_code varchar(64) NOT NULL,
send_user_name varchar(100) NOT NULL,
send_date timestamp NOT NULL,
receive_codes text,
receive_names text,
send_user_code varchar(64),
send_user_name varchar(100),
send_date timestamp,
is_attac char(1),
notify_types varchar(100) NOT NULL,
notify_types varchar(100),
status char(1) NOT NULL,
create_by varchar(64) NOT NULL,
create_date timestamp NOT NULL,
@@ -1252,7 +1252,7 @@ COMMENT ON COLUMN js_sys_msg_inner.msg_title IS '消息标题';
COMMENT ON COLUMN js_sys_msg_inner.content_level IS '内容级别1普通 2一般 3紧急';
COMMENT ON COLUMN js_sys_msg_inner.content_type IS '内容类型1公告 2新闻 3会议 4其它';
COMMENT ON COLUMN js_sys_msg_inner.msg_content IS '消息内容';
COMMENT ON COLUMN js_sys_msg_inner.receive_type IS '接受者类型1用户 2部门 3角色 4岗位';
COMMENT ON COLUMN js_sys_msg_inner.receive_type IS '接受者类型(0全部 1用户 2部门 3角色 4岗位';
COMMENT ON COLUMN js_sys_msg_inner.receive_codes IS '接受者字符串';
COMMENT ON COLUMN js_sys_msg_inner.receive_names IS '接受者名称字符串';
COMMENT ON COLUMN js_sys_msg_inner.send_user_code IS '发送者用户编码';