基於 Nutz AceAdmin 的 通知公告 (後臺)
思路
通知公告存儲於4張表,分別爲羣組公告(DB_GROUP_NOTICE)、區劃公告(DB_REGION_NOTICE)、用戶公告(DB_USER_NOTICE)、公告內容(DB_NOTICE_INFO)。關聯羣組公告和區劃公告讀取用戶公告表,然後根據用戶公告表,讀取用戶公告讀取狀態。若用戶公告表中無數據,或數據爲已讀狀態,均視爲改公告已讀。
讀用戶通知公告時,根據用戶所在羣組、所在區劃,關聯查詢羣組公告(DB_GROUP_NOTICE)、區劃公告(DB_REGION_NOTICE)讀取用戶公告列表,然後根據公告內容(DB_NOTICE_INFO)中的信息讀取用戶通知公告的讀取狀態。
寫公告時,先寫入公告內容(DB_NOTICE_INFO),然後再寫入羣組公告(DB_GROUP_NOTICE)、區劃公告(DB_REGION_NOTICE)、用戶公告(DB_USER_NOTICE)。
公告內容在數據庫中以CLOB存儲,在頁面上用AceAdmin中的 wysiwyg-editor 編輯。
Manage層
主要分爲讀取用戶通知公告,發佈/修改通知公告
DbNoticeManager
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import com.alibaba.fastjson.JSONArray;
import com.wonders.biz.fl.common.util.BeanUtils;
import com.wonders.biz.workdesk.model.UserDTO;
import com.wonders.biz.workdesk.service.impl.MenuServiceImpl;
import com.wonders.framework.common.constant.MenuConstant;
import com.wonders.framework.common.notice.entity.DbRegionNotice;
import com.wonders.framework.common.redis.session.constant.SessionConstant;
import com.wonders.framework.common.redis.session.util.RedisSessionUtil;
import org.apache.poi.hssf.record.formula.functions.Int;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.QueryResult;
import org.nutz.dao.Sqls;
import org.nutz.dao.entity.Record;
import org.nutz.dao.pager.Pager;
import org.nutz.dao.sql.Criteria;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.sql.SqlCallback;
import org.nutz.dao.util.Daos;
import org.nutz.dao.util.blob.SimpleClob;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import com.alibaba.fastjson.JSONObject;
import com.wonders.framework.common.flow.util.FlowHttpUtil;
import com.wonders.framework.common.notice.constants.NoticeContants;
import com.wonders.framework.common.notice.dto.DbNoticeInfoDTO;
import com.wonders.framework.common.notice.entity.DbGroupNotice;
import com.wonders.framework.common.notice.entity.DbNoticeInfo;
import com.wonders.framework.common.notice.entity.DbUserNotice;
import org.nutz.lang.util.NutMap;
import org.nutz.trans.Atom;
import org.nutz.trans.Trans;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.rmi.runtime.Log;
@IocBean
public class DbNoticeManager {
public static final Logger log = LoggerFactory.getLogger(DbNoticeManager.class);
@Inject
private Dao dao;
/**
* 保存 通知公告
* @param dbNoticeInfoDTO 通知公告DTO
* @param regions 接收區劃 Code
* @param groups 接收羣組(角色) Id
* @param token 用戶token
* @return NutMap格式的數據,key: returnCode, returnString, data
* @author shidaoshun
* @date 2018-8-8
*/
public Object saveNoticeInfoNew(final DbNoticeInfoDTO dbNoticeInfoDTO, final List<String> regions, final List<String> groups, String token) {
final NutMap nutMap = new NutMap().setv("returnCode", "0").setv("returnString", "notice save error");
final Set<Long> groupsUserSet = new HashSet<Long>(); // 羣組用戶set
final Set<Long> regionUserSet = new HashSet<Long>(); // 區劃用戶set
final Set<Long> userSet = new HashSet<Long>(); // 用戶set
final HashMap<Long, Integer> groupsUserMap = new HashMap<>(); // 羣組用戶map
final HashMap<Long, Integer> regionUserMap = new HashMap<>(); // 區劃用戶map
final DbNoticeInfo dbNoticeInfo = new DbNoticeInfo();
BeanUtils.copyProperties(dbNoticeInfoDTO, dbNoticeInfo); // DTO -> DO
if (dbNoticeInfo == null || regions.isEmpty() || groups.isEmpty() || token==null || token=="") {
return nutMap.setv("returnCode", "0").setv("returnString", "參數爲空");
}
//1. 查詢羣組(角色)包含的用戶
//根據Id獲取指定羣組用戶信息
if(!groups.isEmpty()) {
String groupsStr = "";
for(String group:groups){
groupsStr+=group+",";
}
JSONObject jsonObj = new JSONObject();
jsonObj.put("userId", dbNoticeInfo.getCreateUserId());
jsonObj.put("groups", groupsStr.substring(0, groupsStr.length()-1));
String result = FlowHttpUtil.httpAccess(MenuConstant.GET_USERS_BY_GROUP_IDS, jsonObj, token); // 調用遠程服務讀取羣組(角色)用戶
net.sf.json.JSONObject jsonObject = net.sf.json.JSONObject.fromObject(result);
List<String> groupList = (List<String>)jsonObject.get("data");
System.out.println(groupList);
for(String group : groupList){
groupsUserSet.add(Long.parseLong(group)); //羣組(角色)用戶寫入用戶set
// Long id = Long.valueOf(group);
// if (groupsUserMap.containsKey(id)) {
// groupsUserMap.put(id, groupsUserMap.get(id) + 1);
// } else {
// groupsUserMap.put(id, 1);
// }
}
}
//根據Code獲取指定羣組用戶信息
// for (String groupCode : groups) {
// JSONObject param = new JSONObject();
// param.put("code", groupCode);
// String result = FlowHttpUtil.httpAccess(MenuConstant.GET_GROUP_USERS, param, token); // 調用遠程服務讀取羣組(角色)用戶
// JSONObject jsonObject = (JSONObject) JSONObject.parse(result);
// List<String> groupUserList = (List<String>)jsonObject.get("data");
// for (String user : groupUserList) { //羣組(角色)用戶寫入用戶set
// log.debug(user);
// userSet.add(Long.valueOf(user));
// }
// }
//2. 查詢區劃包含的用戶 && 獲取用戶電話號碼
for (String regionCode: regions){
JSONObject param = new JSONObject();
param.put("regionCode", regionCode);
String result = FlowHttpUtil.httpAccess(MenuConstant.FIND_USERS_BY_REGION_CODE, param, token); // 調用遠程服務讀取區劃用戶
JSONObject jsonObject = (JSONObject) JSONObject.parse(result);
JSONArray regionUserList = (JSONArray) jsonObject.get("data");
if (regionUserList != null){
for (Object jsonObject1: regionUserList) { // 區劃用戶寫入用戶set
JSONObject t = (JSONObject) jsonObject1;
regionUserSet.add(Long.valueOf(t.get("id") + ""));
Long id = Long.valueOf(t.get("id") + "");
if (regionUserMap.containsKey(id)) {
regionUserMap.put(id, regionUserMap.get(id) + 1);
} else {
regionUserMap.put(id, 1);
}
log.debug(t.get("id") + "");
}
}
}
//3.1 判斷兩個用戶組的交集
userSet.addAll(regionUserSet);
userSet.retainAll(groupsUserSet);
//3.2. 將自己去除。發佈人默認已讀此通知公告
userSet.remove(Long.valueOf(dbNoticeInfo.getCreateUserId()));
//4. 事務操作
Trans.exec(Connection.TRANSACTION_READ_COMMITTED, new Atom() {
@Override
public void run() {
//4.1 刪除原關係。編輯通知公告時,去除原發送對象
dao.clear(DbUserNotice.class, Cnd.where("noticeId", "=",dbNoticeInfo.getId()));
dao.clear(DbGroupNotice.class, Cnd.where("noticeId", "=",dbNoticeInfo.getId()));
dao.clear(DbRegionNotice.class, Cnd.where("noticeId", "=", dbNoticeInfo.getId()));
//4.2 保存通知公告DTO dbNoticeInfo
if (dbNoticeInfo.getId() != null) {
dao.update(dbNoticeInfo);
} else {
dao.insert(dbNoticeInfo);
}
//4.3 保存羣組通知公告
for (String groupId : groups) {
DbGroupNotice dbGroupNotice = new DbGroupNotice();
dbGroupNotice.setNoticeId(dbNoticeInfo.getId());
dbGroupNotice.setGroupId(Long.valueOf(groupId));
dbGroupNotice.setCreateUserId(dbNoticeInfo.getCreateUserId());
dbGroupNotice.setCreateTime(new Date());
dao.insert(dbGroupNotice);
}
//4.4 保存區劃通知公告
for (String resionCode : regions) {
DbRegionNotice dbRegionNotice = new DbRegionNotice();
dbRegionNotice.setNoticeId(dbNoticeInfo.getId());
dbRegionNotice.setRegionCode(resionCode);
dbRegionNotice.setCreateUserId(dbNoticeInfo.getCreateUserId());
dbRegionNotice.setCreateTime(new Date());
dao.insert(dbRegionNotice);
}
//4.5 保存用戶通知公告。在用戶通知公告表中對每個接收公告的用戶都保存一條“未讀”狀態的記錄
for (Long userId : userSet) {
DbUserNotice userNotice = new DbUserNotice();
userNotice.setIsGroup(NoticeContants.YES);
userNotice.setUserId(userId);
userNotice.setNoticeId(dbNoticeInfo.getId());
userNotice.setReadStatus(dbNoticeInfoDTO.getReadStatus());
userNotice.setTagStatus(NoticeContants.UNTAG);
userNotice.setCreateUserId(dbNoticeInfo.getCreateUserId());
userNotice.setCreateTime(new Date());
dao.insert(userNotice);
}
//5. 封裝返回值
nutMap.setv("returnCode", "1").setv("returnString", "notice save success!");
}
});
return nutMap;
}
/**
* 分頁查詢通知公告讀取情況
* 查詢條件 : userId : "xxxx"
* @param filter 查詢條件。 包含userId, token, sessionId, pager
* @return JSONObject 格式的數據,key: returnCode, returnString, data
* @author shidaoshun
*/
public Object queryUserNoticeByPageNew (Map<String, Object> filter) {
JSONObject result = new JSONObject();
String userId = (String) filter.get("userId");
String token = (String) filter.get("token");
String sessionId = (String) filter.get("sessionId");
Pager pager = (Pager) filter.get("pager");
result.put("returnCode", "0");
result.put("returnString", "query user notice error");
//1.讀取用戶所屬羣組
//通過遠程服務接口 MenuConstant.GET_USER_GROUPS 讀取用戶羣組信息
JSONObject groupParam = new JSONObject();
groupParam.put("userId", Long.valueOf("6"));
String groupResult = FlowHttpUtil.httpAccess(MenuConstant.GET_USER_GROUPS, groupParam, token); // 調用遠程服務
JSONObject resultJson = (JSONObject) JSONObject.parse(groupResult);
JSONArray dataJson = (JSONArray) resultJson.get("data");
Long[] groupsId = new Long[dataJson.size()];
for (int i=0; i<dataJson.size(); i++) {
JSONObject rowJson = (JSONObject) dataJson.get(i);
groupsId[i] = Long.valueOf(rowJson.getString("id"));
}
//2. 讀取用戶區劃
// 通過 redis 讀取用戶區劃信息
JSONObject regionParam = new JSONObject();
String regionResult = RedisSessionUtil.getInstance().getSessionString(sessionId, SessionConstant.USER_REGION); // {"createBy":"1","createDate":"2018-07-14 00:00:00","id":3,"regionNo":"310105000000","updateBy":"","updateDate":null}
JSONObject regionJson = JSONObject.parseObject(regionResult);
String region = (String) regionJson.get("regionNo");
//3. 聯合查詢用戶通知公告的消息
//3.1 自定義sql
Sql sqls = Sqls.create("select NOTICE_ID, USER_ID, NOTICE_TYPE, NOTICE_SUBJECT, NOTICE_CONTENT, NOTICE_LEVEL, PUBLISH_STATUS, SMS_NOTIFY, ATTACHMENT_ID, PUBLISH_DATE, CANCEL_REASON, CANCEL_DATE, EXT1, EXT2, CREATE_USER_ID, CREATE_TIME, UPDATE_USER_ID, UPDATE_TIME, " +
" (select max(un.READ_STATUS) " +
" from DB_USER_NOTICE un " +
" where un.NOTICE_ID = NOTICE_ID " +
" and un.USER_ID = @USERID " +
" ) AS READ_STATUS " +
"from ( " +
" select NOTICE_ID, info.* " +
" from DB_NOTICE_INFO info, ( " +
" select NOTICE_ID from V_GROUP_REGION_NOTICE " +
" where REGION_CODE in (@REGIONCODE) and GROUP_ID in (@GROUPID) " +
" group by NOTICE_ID " +
" ) infoList " +
" where info.ID = infoList.NOTICE_ID " +
") " +
"where 1=1 ");
//3.2參數注入
sqls.params().set("USERID", userId);
sqls.params().set("REGIONCODE", Long.valueOf(region));
// 測試數據
// Integer[] groups = {10041, 10042, 101, 102, 103, 104, 10022, 10043, 10061, 10001, 10023};
// sqls.params().set("GROUPID", groups);
// 正式寫法
sqls.params().set("GROUPID", groupsId);
sqls.setPager(pager); //Pager分頁
//3.3 設置回調
sqls.setCallback(new SqlCallback() {
@Override
public Object invoke(Connection conn, ResultSet rs, Sql sql) throws SQLException {
List<DbNoticeInfoDTO> list = new ArrayList<>();
while (rs.next()) {
DbNoticeInfoDTO dbNoticeInfoDTO = new DbNoticeInfoDTO();
dbNoticeInfoDTO.setId(rs.getLong("NOTICE_ID1"));
list.add(dbNoticeInfoDTO);
}
return list;
}
});
sqls.setCallback(Sqls.callback.entities());
sqls.setEntity(dao.getEntity(DbNoticeInfoDTO.class));
//3.4 讀取數據
dao.execute(sqls);
List<DbNoticeInfoDTO> dbNoticeInfoDTOList = sqls.getList(DbNoticeInfoDTO.class);
//4. 封裝返回值
result = new JSONObject();
result.put("data", dbNoticeInfoDTOList);
result.put("returnCode", "1");
result.put("returnString", "");
return result;
}
}
DbNoticeInfo
import java.sql.Clob;
import java.util.Date;
import com.wonders.framework.common.util.ClobUtil;
import org.nutz.dao.DB;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.util.blob.SimpleClob;
@Table("DB_NOTICE_INFO")
public class DbNoticeInfo {
@Id
@Column("ID")
@Prev({@SQL(value="select SEQ_DB_NOTICE_INFO.nextval FROM dual", db=DB.ORACLE)})
private Long id; // id
@Column("USER_ID")
private Long userId; // businessNo
@Column("NOTICE_TYPE")
private String noticeType; // type
@Column("NOTICE_SUBJECT")
private String noticeSubject; // noticeSubject
@Column("NOTICE_CONTENT")
@ColDefine(type = ColType.TEXT)
private Clob noticeContent; // noticeContent
@Column("NOTICE_LEVEL")
private String noticeLevel; // noticeLevel
@Column("PUBLISH_STATUS")
private String publishStatus; // isPublic
@Column("SMS_NOTIFY")
private String smsNotify; // validity
@Column("ATTACHMENT_ID")
private String attachmentId; // createDate
@Column("PUBLISH_DATE")
private Date publishDate;
@Column("CANCEL_REASON")
private String cancelReason;
@Column("CANCEL_DATE")
private Date cancelDate;
@Column("EXT1")
private String ext1;
@Column("EXT2")
private String ext2;
@Column("CREATE_USER_ID")
private String createUserId;
@Column("CREATE_TIME")
private Date createTime;
@Column("UPDATE_USER_ID")
private String updateUserId;
@Column("UPDATE_TIME")
private Date updateTime;
@Column("USER_NAME")
private String userName;
@Column("ORGAN_NODE_ID")
private Long organNodeId;
@Column("SMS_CONTENT")
private String smsContent;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getNoticeType() {
return noticeType;
}
public void setNoticeType(String noticeType) {
this.noticeType = noticeType;
}
public String getNoticeSubject() {
return noticeSubject;
}
public void setNoticeSubject(String noticeSubject) {
this.noticeSubject = noticeSubject;
}
public Clob getNoticeContent() {
return noticeContent;
}
public void setNoticeContent(Clob noticeContent) {
this.noticeContent = noticeContent;
}
public String getNoticeLevel() {
return noticeLevel;
}
public void setNoticeLevel(String noticeLevel) {
this.noticeLevel = noticeLevel;
}
public String getPublishStatus() {
return publishStatus;
}
public void setPublishStatus(String publishStatus) {
this.publishStatus = publishStatus;
}
public String getSmsNotify() {
return smsNotify;
}
public void setSmsNotify(String smsNotify) {
this.smsNotify = smsNotify;
}
public String getAttachmentId() {
return attachmentId;
}
public void setAttachmentId(String attachmentId) {
this.attachmentId = attachmentId;
}
public Date getPublishDate() {
return publishDate;
}
public void setPublishDate(Date publishDate) {
this.publishDate = publishDate;
}
public String getCancelReason() {
return cancelReason;
}
public void setCancelReason(String cancelReason) {
this.cancelReason = cancelReason;
}
public Date getCancelDate() {
return cancelDate;
}
public void setCancelDate(Date cancelDate) {
this.cancelDate = cancelDate;
}
public String getExt1() {
return ext1;
}
public void setExt1(String ext1) {
this.ext1 = ext1;
}
public String getExt2() {
return ext2;
}
public void setExt2(String ext2) {
this.ext2 = ext2;
}
public String getCreateUserId() {
return createUserId;
}
public void setCreateUserId(String createUserId) {
this.createUserId = createUserId;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getUpdateUserId() {
return updateUserId;
}
public void setUpdateUserId(String updateUserId) {
this.updateUserId = updateUserId;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Long getOrganNodeId() {
return organNodeId;
}
public void setOrganNodeId(Long organNodeId) {
this.organNodeId = organNodeId;
}
public String getSmsContent() {
return smsContent;
}
public void setSmsContent(String smsContent) {
this.smsContent = smsContent;
}
}
DbGroupNotice
import java.util.Date;
import org.nutz.dao.DB;
import org.nutz.dao.entity.annotation.Column;
import org.nutz.dao.entity.annotation.Id;
import org.nutz.dao.entity.annotation.Prev;
import org.nutz.dao.entity.annotation.SQL;
import org.nutz.dao.entity.annotation.Table;
@Table("DB_GROUP_NOTICE")
public class DbGroupNotice {
@Id
@Prev(@SQL(value="select SEQ_DB_GROUP_NOTICE.nextval from dual", db=DB.ORACLE))
@Column("ID")
private Long id;
@Column("NOTICE_ID")
private Long noticeId;
@Column("GROUP_ID")
private Long groupId;
@Column("CREATE_USER_ID")
private String createUserId;
@Column("CREATE_TIME")
private Date createTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getNoticeId() {
return noticeId;
}
public void setNoticeId(Long noticeId) {
this.noticeId = noticeId;
}
public Long getGroupId() {
return groupId;
}
public void setGroupId(Long groupId) {
this.groupId = groupId;
}
public String getCreateUserId() {
return createUserId;
}
public void setCreateUserId(String createUserId) {
this.createUserId = createUserId;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
DbRegionNotice
import org.nutz.dao.DB;
import org.nutz.dao.entity.annotation.*;
import java.util.Date;
/**
* @Auther: shidaoshun
* @Date: 2018/8/8 09:52
* @Description: 消息區劃關係
*/
@Table("DB_REGION_NOTICE")
public class DbRegionNotice {
@Id
@Prev(@SQL(value="select SEQ_DB_REGION_NOTICE.nextval from dual", db=DB.ORACLE))
@Column("ID")
private Long id;
@Column("NOTICE_ID")
private Long noticeId;
@Column("REGION_CODE")
private String regionCode;
@Column("CREATE_USER_ID")
private String createUserId;
@Column("CREATE_TIME")
private Date createTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getNoticeId() {
return noticeId;
}
public void setNoticeId(Long noticeId) {
this.noticeId = noticeId;
}
public String getRegionCode() {
return regionCode;
}
public void setRegionCode(String regionCode) {
this.regionCode = regionCode;
}
public String getCreateUserId() {
return createUserId;
}
public void setCreateUserId(String createUserId) {
this.createUserId = createUserId;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
DbUserNotice
import java.util.Date;
import org.nutz.dao.DB;
import org.nutz.dao.entity.annotation.Column;
import org.nutz.dao.entity.annotation.Id;
import org.nutz.dao.entity.annotation.Prev;
import org.nutz.dao.entity.annotation.SQL;
import org.nutz.dao.entity.annotation.Table;
@Table("DB_USER_NOTICE")
public class DbUserNotice {
@Id
@Prev(@SQL(value="select SEQ_DB_USER_NOTICE.nextval from dual", db=DB.ORACLE))
@Column("ID")
private Long id; // id
@Column("USER_ID")
private Long userId; // userId
@Column("NOTICE_ID")
private Long noticeId; // noticeId
@Column("READ_STATUS")
private String readStatus;
@Column("IS_GROUP")
private String isGroup;
@Column("READ_DATE")
public Date readDate;
@Column("TAG_STATUS")
private String tagStatus; // validity
@Column("CREATE_USER_ID")
private String createUserId;
@Column("CREATE_TIME")
private Date createTime;
@Column("UPDATE_USER_ID")
private String updateUserId;
@Column("UPDATE_TIME")
private Date updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public Long getNoticeId() {
return noticeId;
}
public void setNoticeId(Long noticeId) {
this.noticeId = noticeId;
}
public String getReadStatus() {
return readStatus;
}
public void setReadStatus(String readStatus) {
this.readStatus = readStatus;
}
public String getIsGroup() {
return isGroup;
}
public void setIsGroup(String isGroup) {
this.isGroup = isGroup;
}
public Date getReadDate() {
return readDate;
}
public void setReadDate(Date readDate) {
this.readDate = readDate;
}
public String getTagStatus() {
return tagStatus;
}
public void setTagStatus(String tagStatus) {
this.tagStatus = tagStatus;
}
public String getCreateUserId() {
return createUserId;
}
public void setCreateUserId(String createUserId) {
this.createUserId = createUserId;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getUpdateUserId() {
return updateUserId;
}
public void setUpdateUserId(String updateUserId) {
this.updateUserId = updateUserId;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}
數據庫
DB_NOTICE_INFO
create table DB_NOTICE_INFO
(
ID NUMBER(19) not null
constraint PK_DB_NOTICE_INFO
primary key,
USER_ID NUMBER(19),
NOTICE_TYPE VARCHAR2(2) default NULL,
NOTICE_SUBJECT VARCHAR2(300) default NULL,
NOTICE_LEVEL VARCHAR2(2) default NULL,
PUBLISH_STATUS VARCHAR2(2) default NULL,
SMS_NOTIFY VARCHAR2(2),
ATTACHMENT_ID VARCHAR2(32),
PUBLISH_DATE DATE,
CANCEL_REASON VARCHAR2(300),
CANCEL_DATE DATE,
EXT1 VARCHAR2(60),
EXT2 VARCHAR2(60),
CREATE_USER_ID VARCHAR2(32),
CREATE_TIME DATE,
UPDATE_USER_ID VARCHAR2(32),
UPDATE_TIME DATE,
NOTICE_CONTENT CLOB,
USER_NAME VARCHAR2(72),
ORGAN_NODE_ID NUMBER(19),
SMS_CONTENT VARCHAR2(300)
)
/
comment on table DB_NOTICE_INFO
is '個人首頁-個人站內消息表'
/
comment on column DB_NOTICE_INFO.ID
is '消息ID'
/
comment on column DB_NOTICE_INFO.USER_ID
is '發送人主鍵,外鍵CS_USER'
/
comment on column DB_NOTICE_INFO.NOTICE_TYPE
is '信息類別代碼,[取值 1:公告| 2:通知| 3:系統消息]'
/
comment on column DB_NOTICE_INFO.NOTICE_SUBJECT
is '信息主題'
/
comment on column DB_NOTICE_INFO.NOTICE_LEVEL
is '信息等級代碼,[取值 1~9, 等級越高越緊急,在顯示時可以用顏色區分]'
/
comment on column DB_NOTICE_INFO.PUBLISH_STATUS
is '是否發佈代碼,[取值 0 :未發佈|1:發佈|2:已撤銷]'
/
comment on column DB_NOTICE_INFO.SMS_NOTIFY
is '是否短信通知代碼,[取值 0 :不需要|1:需要]'
/
comment on column DB_NOTICE_INFO.ATTACHMENT_ID
is '附件表主鍵ID'
/
comment on column DB_NOTICE_INFO.PUBLISH_DATE
is '發佈時間'
/
comment on column DB_NOTICE_INFO.CANCEL_REASON
is '撤銷原因'
/
comment on column DB_NOTICE_INFO.CANCEL_DATE
is '撤銷時間'
/
comment on column DB_NOTICE_INFO.EXT1
is '擴展信息1'
/
comment on column DB_NOTICE_INFO.EXT2
is '擴展信息2'
/
comment on column DB_NOTICE_INFO.CREATE_USER_ID
is '創建人姓名'
/
comment on column DB_NOTICE_INFO.CREATE_TIME
is '創建時間'
/
comment on column DB_NOTICE_INFO.UPDATE_USER_ID
is '更新人姓名'
/
comment on column DB_NOTICE_INFO.UPDATE_TIME
is '更新時間'
/
comment on column DB_NOTICE_INFO.NOTICE_CONTENT
is '信息內容'
/
comment on column DB_NOTICE_INFO.USER_NAME
is '消息發送人姓名'
/
comment on column DB_NOTICE_INFO.ORGAN_NODE_ID
is '發佈部門ID;外鍵到CS_ORGAN_NODE.ID'
/
comment on column DB_NOTICE_INFO.SMS_CONTENT
is '短信內容'
/
DB_GROUP_NOTICE
create table DB_GROUP_NOTICE
(
ID NUMBER(19) default NULL not null
constraint PK_DB_GROUP_NOTICE
primary key,
NOTICE_ID NUMBER(19) default NULL
constraint FK_DB_GROUP_FK_GROUP_DB_NOTIC
references DB_NOTICE_INFO,
GROUP_ID NUMBER(19),
CREATE_USER_ID VARCHAR2(32),
CREATE_TIME DATE
)
/
comment on table DB_GROUP_NOTICE
is '個人首頁-消息羣組關係表'
/
comment on column DB_GROUP_NOTICE.ID
is '消息羣組關係ID[主鍵]'
/
comment on column DB_GROUP_NOTICE.NOTICE_ID
is '公告信息ID,外鍵DB_NOTICE_INFO'
/
comment on column DB_GROUP_NOTICE.GROUP_ID
is '消息接受羣組ID'
/
comment on column DB_GROUP_NOTICE.CREATE_USER_ID
is '創建人姓名'
/
comment on column DB_GROUP_NOTICE.CREATE_TIME
is '創建時間'
/
DB_REGION_NOTICE
create table DB_REGION_NOTICE
(
ID NUMBER(19) not null
constraint PK_DB_NOTICE_REGION
primary key,
NOTICE_ID NUMBER(19)
constraint FK_DB_NOTIC_REFERENCE_DB_NOTIC
references DB_NOTICE_INFO,
REGION_CODE VARCHAR2(12),
CREATE_USER_ID VARCHAR2(32),
CREATE_TIME DATE
)
/
comment on table DB_REGION_NOTICE
is '個人首頁-消息區劃關係表'
/
comment on column DB_REGION_NOTICE.ID
is '消息區劃關係ID[主鍵]'
/
comment on column DB_REGION_NOTICE.NOTICE_ID
is '消息ID[外鍵]'
/
comment on column DB_REGION_NOTICE.REGION_CODE
is '消息接受區劃代碼,外鍵到DC_REGION.CODE'
/
comment on column DB_REGION_NOTICE.CREATE_USER_ID
is '創建人姓名'
/
comment on column DB_REGION_NOTICE.CREATE_TIME
is '創建時間'
/
DB_USER_NOTICE
create table DB_USER_NOTICE
(
ID NUMBER(19) not null
constraint PK_DB_USER_NOTICE
primary key,
NOTICE_ID NUMBER(19) default NULL
constraint FK_DB_USER_FK_USER_N_DB_NOTIC
references DB_NOTICE_INFO,
USER_ID NUMBER(19) default NULL,
READ_STATUS VARCHAR2(2) default NULL,
READ_DATE DATE,
TAG_STATUS VARCHAR2(2),
CREATE_USER_ID VARCHAR2(32),
CREATE_TIME DATE,
UPDATE_USER_ID VARCHAR2(32),
UPDATE_TIME DATE,
IS_GROUP VARCHAR2(2)
)
/
comment on table DB_USER_NOTICE
is '個人首頁-消息人員關係表
'
/
comment on column DB_USER_NOTICE.ID
is '消息關係ID[主鍵]'
/
comment on column DB_USER_NOTICE.NOTICE_ID
is '公告信息ID,外鍵DB_NOTICE_INFO'
/
comment on column DB_USER_NOTICE.USER_ID
is '用戶ID,外鍵CS_USER'
/
comment on column DB_USER_NOTICE.READ_STATUS
is '讀取狀態代碼,[取值 1:是|0:否],DIC=YESNO'
/
comment on column DB_USER_NOTICE.READ_DATE
is '讀取時間'
/
comment on column DB_USER_NOTICE.TAG_STATUS
is '標記狀態代碼,[取值 0:未標記|1:標記爲未讀 | 2:標記爲日程]'
/
comment on column DB_USER_NOTICE.CREATE_USER_ID
is '創建人姓名'
/
comment on column DB_USER_NOTICE.CREATE_TIME
is '創建時間'
/
comment on column DB_USER_NOTICE.UPDATE_USER_ID
is '更新人姓名'
/
comment on column DB_USER_NOTICE.UPDATE_TIME
is '更新時間'
/
comment on column DB_USER_NOTICE.IS_GROUP
is '是否來自羣組,如果既屬於個人同時又屬於羣組,則記錄否;取值DIC=YESNO'
/