From b6c992787d3bd0beae66edabaae78fdb8e469c5f Mon Sep 17 00:00:00 2001 From: thinkgem Date: Tue, 19 Mar 2019 21:52:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=86=85=E9=83=A8=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E7=AB=99=E5=86=85=E4=BF=A1=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/core/db/core.erm | 1174 ++++++++--------- modules/core/db/db2/core.sql | 12 +- modules/core/db/mssql/core.sql | 12 +- modules/core/db/mysql/core.sql | 14 +- modules/core/db/oracle/core.sql | 14 +- modules/core/db/postgresql/core.sql | 14 +- .../jeesite/modules/msg/dao/MsgInnerDao.java | 18 + .../modules/msg/dao/MsgInnerRecordDao.java | 23 + .../jeesite/modules/msg/entity/MsgInner.java | 214 +++ .../modules/msg/entity/MsgInnerRecord.java | 112 ++ .../modules/msg/service/MsgInnerService.java | 243 ++++ .../modules/msg/web/MsgInnerController.java | 140 ++ .../jeesite/modules/sys/db/InitCoreData.xlsx | Bin 167905 -> 168364 bytes .../db/upgrade/core/mssql/mssql_4.1.4.sql | 24 +- .../db/upgrade/core/mysql/mysql_4.1.4.sql | 23 +- .../db/upgrade/core/oracle/oracle_4.1.4.sql | 25 +- .../core/postgresql/postgresql_4.1.4.sql | 24 +- .../mappings/modules/msg/MsgInnerDao.xml | 28 + .../modules/msg/MsgInnerRecordDao.xml | 15 + .../views/modules/msg/msgInnerForm.html | 176 +++ .../views/modules/msg/msgInnerList.html | 107 ++ .../views/modules/msg/msgInnerView.html | 50 + web/db/db2/core.sql | 920 +++++++++++++ web/db/mssql/core.sql | 12 +- web/db/mysql/core.sql | 14 +- web/db/oracle/core.sql | 14 +- web/db/postgresql/core.sql | 14 +- 27 files changed, 2779 insertions(+), 657 deletions(-) create mode 100644 modules/core/src/main/java/com/jeesite/modules/msg/dao/MsgInnerDao.java create mode 100644 modules/core/src/main/java/com/jeesite/modules/msg/dao/MsgInnerRecordDao.java create mode 100644 modules/core/src/main/java/com/jeesite/modules/msg/entity/MsgInner.java create mode 100644 modules/core/src/main/java/com/jeesite/modules/msg/entity/MsgInnerRecord.java create mode 100644 modules/core/src/main/java/com/jeesite/modules/msg/service/MsgInnerService.java create mode 100644 modules/core/src/main/java/com/jeesite/modules/msg/web/MsgInnerController.java create mode 100644 modules/core/src/main/resources/mappings/modules/msg/MsgInnerDao.xml create mode 100644 modules/core/src/main/resources/mappings/modules/msg/MsgInnerRecordDao.xml create mode 100644 modules/core/src/main/resources/views/modules/msg/msgInnerForm.html create mode 100644 modules/core/src/main/resources/views/modules/msg/msgInnerList.html create mode 100644 modules/core/src/main/resources/views/modules/msg/msgInnerView.html create mode 100644 web/db/db2/core.sql diff --git a/modules/core/db/core.erm b/modules/core/db/core.erm index 64e3b7a5..306608eb 100644 --- a/modules/core/db/core.erm +++ b/modules/core/db/core.erm @@ -11,8 +11,8 @@ 0 1.0 - 1232 - 988 + 2677 + 1945 128 128 @@ -3144,7 +3144,7 @@ clob - a70dd4133cc6302307f8a0ac828a6049c401db58 + 0fa4e2d76aa9a87670cb1345202c5fbc44183cfe 1 null false @@ -3154,8 +3154,8 @@ false false - 接受者类型(1用户 2部门 3角色 4岗位) - 接受者类型(1用户 2部门 3角色 4岗位) + 接受者类型(0全部 1用户 2部门 3角色 4岗位) + 接受者类型(0全部 1用户 2部门 3角色 4岗位) receive_type character(n) @@ -4153,8 +4153,8 @@ - ba99318947626ff9e4c0d0b58ec3bf4e7a260f75 - 7ef4520149693e59bda4b4f9a5d096b6e67a7097 + 8ea7ed753c560f6973c842ad64a3b10501a27877 + e7ba93bf87a67cd2a90abc01ef2d6c856405dc11 f285b2e9350856442d3f491d08a9f2f79f706a2b -1 -1 @@ -4241,7 +4241,7 @@ ffde396c7b349d700fe1b7891694ac538d00bf6d 22d38cfee95536d3e3af5fdd444b027a85d95432 - ba99318947626ff9e4c0d0b58ec3bf4e7a260f75 + 8ea7ed753c560f6973c842ad64a3b10501a27877 @@ -5729,13 +5729,13 @@ - 7ef4520149693e59bda4b4f9a5d096b6e67a7097 - 359 - 452 + e7ba93bf87a67cd2a90abc01ef2d6c856405dc11 + 438 + 548Segoe UI9 - 1610 - 468 + 1622 + 492 128 128 @@ -6059,7 +6059,7 @@ - cadeedfda6891fa00cbe3578c497d9cb94402772 + dedcc43c72ee436685481fa079d465594380905e 519d64ec10e7c0df51e0b14489d6666c04b93e34 a66af690ade469b3b4b472b1680bdc1923d5c972 -1 @@ -6124,7 +6124,7 @@ f385f23b1163beb8b239a67f5a262c83fb46cae6 5eecd1e4e1dc132da52de1bd1f59b13dd13a3587 - cadeedfda6891fa00cbe3578c497d9cb94402772 + dedcc43c72ee436685481fa079d465594380905e 所属消息 所属消息 @@ -12850,8 +12850,8 @@ - 034713cef6fc23366672cb01ceb39788739f3ada - 7ef4520149693e59bda4b4f9a5d096b6e67a7097 + 611309bafbfe0264d77a6bc7de24b53acfe213d6 + e7ba93bf87a67cd2a90abc01ef2d6c856405dc11 58be1ca8c00baf293ef16f69d782da2b79da6ec2 -1 -1 @@ -12882,7 +12882,7 @@ 7e2f59707205419c8556876dc854aeff0fbf7b57 22d38cfee95536d3e3af5fdd444b027a85d95432 - 034713cef6fc23366672cb01ceb39788739f3ada + 611309bafbfe0264d77a6bc7de24b53acfe213d6 控制角色编码 @@ -13231,565 +13231,6 @@
- - 519d64ec10e7c0df51e0b14489d6666c04b93e34 - 443 - 484 - Segoe UI - 9 - 2682 - 1950 - - 128 - 128 - 192 - - - - js_sys_msg_inner - 内部消息 - - - - - - - 869fc70cf3a4e92e8056b40814df8e03f9f9efde - 5eecd1e4e1dc132da52de1bd1f59b13dd13a3587 - - - - - varchar(n) - - - false - false - true - true - false - - - - - - - - - - - false - false - false - - - 0 - - - - a304841afc9968e7c8768979fe2ba3f2f315db78 - cbbb279fbb0f0ea5d67536332ce7d9a8b3d70e36 - - - - - varchar(n) - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - a654ac8de54e8c19cfdba4bcf6d636ab760799b9 - 04c3905ff7bf6c16dbe32569f226a3cbaf2674fe - - - - - character(n) - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - 31410c3d884588423ca2a5803e78d0934412f458 - 10a8ef0d67bd3c9a90e9c67dc86953fefb8f8755 - - - - - character(n) - - - false - false - false - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - 98eb079aebd2f56c461cb92d97ab4d56f603b840 - 48bf7c9cb90d62b9cba0283d51bf94980e9fea92 - - - - - clob - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - a70dd4133cc6302307f8a0ac828a6049c401db58 - 5b256d59f963bf2a76cf35c847634b1188154874 - - - - - character(n) - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - 5797ae3ca5da40a8a45dfd0071f3589585c2517f - fe9b7e3236d284db50cb1d4cda9a77d1d8de40d2 - - - - - clob - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - 86b915810d6436eb5c60062abbe4f8910c86f89c - b21a2db1cf685edc44c2bf252785aabc4cfb0794 - - - - - clob - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - c5364fcf3327275d038d229e22f80ce97c28d402 - b0959f0c2f737aa49188e57cc71afb3242e9e97b - - - - - varchar(n) - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - 949f48cec7229094875af06d5c3ee4e7efbba1e0 - 8d09d0b4b174964fb858b7ccb77ed9e14767de65 - - - - - varchar(n) - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - 5e197b7f106763a6952e72203fcc902cea793853 - d492c41633035ed8c33c89c5c704ef2dd5d7d32c - - - - - datetime - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - da74a37a1025119cd79a05644781c76b606352d3 - 0390e069a393fa7b2f2de0531b12470c299317f8 - - - - - character(n) - - - false - false - false - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - 81e89a36c985a9f69710177677cd7be6ed6ea089 - fd262e1d867fb854931a86728233eec74fc0099b - - - - - varchar(n) - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - - 20092a8f08bbf1304383014693172e4fc863277d - 6d885df5f4956aeb6b228e769b8d037459d7a7d7 - - - - - character(n) - - - false - false - true - false - false - - - - - - - - - - - false - false - false - - - 0 - - - 85024a2953cf3e3c9c1cce49b2351853ab0d125b - - - - false - true - idx_sys_msg_inner_cb - - - - - e5355faba5ec3c9128507dd4c48ea9230631cf83 - false - - - - - false - true - idx_sys_msg_inner_status - - - - - 6d885df5f4956aeb6b228e769b8d037459d7a7d7 - false - - - - - false - true - idx_sys_msg_inner_cl - - - - - 04c3905ff7bf6c16dbe32569f226a3cbaf2674fe - false - - - - - false - true - idx_sys_msg_inner_sc - - - - - b0959f0c2f737aa49188e57cc71afb3242e9e97b - false - - - - - false - true - idx_sys_msg_inner_sd - - - - - d492c41633035ed8c33c89c5c704ef2dd5d7d32c - false - - - - - - - - - -
9ab9e19921654f64fedac3e4a117a6109afc4e41506 @@ -15848,13 +15289,13 @@
- 18ad211a33ec95af9104d9e6b843d74227b914ce + 2692f98d54cb6b15c3c537e3fda8eedf24bc9e19100321Segoe UI9 - 2076 - 1320 + 2064 + 1296 128 128 @@ -15862,9 +15303,9 @@ - 6a79d6669a1b4809994f42c602cb55c6f0651136 + cbde37ca64bc9ba898ee5f83f212c7f3163cdf5a f10bd927f4651e79dbe30cb0fecaeaeb8ec18ac4 - 18ad211a33ec95af9104d9e6b843d74227b914ce + 2692f98d54cb6b15c3c537e3fda8eedf24bc9e19 -1 -1 -1 @@ -15884,9 +15325,9 @@ null - 15ed391c4abb14bb54345a177fd0c39682f87e48 - 7ef4520149693e59bda4b4f9a5d096b6e67a7097 - 18ad211a33ec95af9104d9e6b843d74227b914ce + 61454f5c66b50fe69ecab419245b6c0011698f4b + e7ba93bf87a67cd2a90abc01ef2d6c856405dc11 + 2692f98d54cb6b15c3c537e3fda8eedf24bc9e19 -1 -1 -1 @@ -15916,7 +15357,7 @@ 136c2841a88ba120cd1f0bb13f7ba446474de69e 22d38cfee95536d3e3af5fdd444b027a85d95432 - 15ed391c4abb14bb54345a177fd0c39682f87e48 + 61454f5c66b50fe69ecab419245b6c0011698f4b @@ -15950,7 +15391,7 @@ 1882f53a36409270c8622486740876fcb2af9842 e84c40cdf5ffdb2ba4d59630d98abb5972d74795 - 6a79d6669a1b4809994f42c602cb55c6f0651136 + cbde37ca64bc9ba898ee5f83f212c7f3163cdf5a @@ -16332,6 +15773,565 @@
+ + 519d64ec10e7c0df51e0b14489d6666c04b93e34 + 443 + 484 + Segoe UI + 9 + 2682 + 1950 + + 128 + 128 + 192 + + + + js_sys_msg_inner + 内部消息 + + + + + + + 869fc70cf3a4e92e8056b40814df8e03f9f9efde + 5eecd1e4e1dc132da52de1bd1f59b13dd13a3587 + + + + + varchar(n) + + + false + false + true + true + false + + + + + + + + + + + false + false + false + + + 0 + + + + a304841afc9968e7c8768979fe2ba3f2f315db78 + cbbb279fbb0f0ea5d67536332ce7d9a8b3d70e36 + + + + + varchar(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + a654ac8de54e8c19cfdba4bcf6d636ab760799b9 + 04c3905ff7bf6c16dbe32569f226a3cbaf2674fe + + + + + character(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 31410c3d884588423ca2a5803e78d0934412f458 + 10a8ef0d67bd3c9a90e9c67dc86953fefb8f8755 + + + + + character(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 98eb079aebd2f56c461cb92d97ab4d56f603b840 + 48bf7c9cb90d62b9cba0283d51bf94980e9fea92 + + + + + clob + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 0fa4e2d76aa9a87670cb1345202c5fbc44183cfe + 5b256d59f963bf2a76cf35c847634b1188154874 + + + + + character(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 5797ae3ca5da40a8a45dfd0071f3589585c2517f + fe9b7e3236d284db50cb1d4cda9a77d1d8de40d2 + + + + + clob + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 86b915810d6436eb5c60062abbe4f8910c86f89c + b21a2db1cf685edc44c2bf252785aabc4cfb0794 + + + + + clob + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + c5364fcf3327275d038d229e22f80ce97c28d402 + b0959f0c2f737aa49188e57cc71afb3242e9e97b + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 949f48cec7229094875af06d5c3ee4e7efbba1e0 + 8d09d0b4b174964fb858b7ccb77ed9e14767de65 + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 5e197b7f106763a6952e72203fcc902cea793853 + d492c41633035ed8c33c89c5c704ef2dd5d7d32c + + + + + datetime + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + da74a37a1025119cd79a05644781c76b606352d3 + 0390e069a393fa7b2f2de0531b12470c299317f8 + + + + + character(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 81e89a36c985a9f69710177677cd7be6ed6ea089 + fd262e1d867fb854931a86728233eec74fc0099b + + + + + varchar(n) + + + false + false + false + false + false + + + + + + + + + + + false + false + false + + + 0 + + + + 20092a8f08bbf1304383014693172e4fc863277d + 6d885df5f4956aeb6b228e769b8d037459d7a7d7 + + + + + character(n) + + + false + false + true + false + false + + + + + + + + + + + false + false + false + + + 0 + + + 85024a2953cf3e3c9c1cce49b2351853ab0d125b + + + + false + true + idx_sys_msg_inner_cb + + + + + e5355faba5ec3c9128507dd4c48ea9230631cf83 + false + + + + + false + true + idx_sys_msg_inner_status + + + + + 6d885df5f4956aeb6b228e769b8d037459d7a7d7 + false + + + + + false + true + idx_sys_msg_inner_cl + + + + + 04c3905ff7bf6c16dbe32569f226a3cbaf2674fe + false + + + + + false + true + idx_sys_msg_inner_sc + + + + + b0959f0c2f737aa49188e57cc71afb3242e9e97b + false + + + + + false + true + idx_sys_msg_inner_sd + + + + + d492c41633035ed8c33c89c5c704ef2dd5d7d32c + false + + + + + + + + + +
diff --git a/modules/core/db/db2/core.sql b/modules/core/db/db2/core.sql index 935a20ed..0a9c0737 100644 --- a/modules/core/db/db2/core.sql +++ b/modules/core/db/db2/core.sql @@ -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, diff --git a/modules/core/db/mssql/core.sql b/modules/core/db/mssql/core.sql index 0cf1045d..593862fd 100644 --- a/modules/core/db/mssql/core.sql +++ b/modules/core/db/mssql/core.sql @@ -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, diff --git a/modules/core/db/mysql/core.sql b/modules/core/db/mysql/core.sql index 8725c462..cf0b337a 100644 --- a/modules/core/db/mysql/core.sql +++ b/modules/core/db/mysql/core.sql @@ -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 '创建时间', diff --git a/modules/core/db/oracle/core.sql b/modules/core/db/oracle/core.sql index b29424e7..9943b4e1 100644 --- a/modules/core/db/oracle/core.sql +++ b/modules/core/db/oracle/core.sql @@ -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 '发送者用户编码'; diff --git a/modules/core/db/postgresql/core.sql b/modules/core/db/postgresql/core.sql index f7a01cf4..0a0403c5 100644 --- a/modules/core/db/postgresql/core.sql +++ b/modules/core/db/postgresql/core.sql @@ -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 '发送者用户编码'; diff --git a/modules/core/src/main/java/com/jeesite/modules/msg/dao/MsgInnerDao.java b/modules/core/src/main/java/com/jeesite/modules/msg/dao/MsgInnerDao.java new file mode 100644 index 00000000..8c010032 --- /dev/null +++ b/modules/core/src/main/java/com/jeesite/modules/msg/dao/MsgInnerDao.java @@ -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 { + +} \ No newline at end of file diff --git a/modules/core/src/main/java/com/jeesite/modules/msg/dao/MsgInnerRecordDao.java b/modules/core/src/main/java/com/jeesite/modules/msg/dao/MsgInnerRecordDao.java new file mode 100644 index 00000000..5a1e9c8a --- /dev/null +++ b/modules/core/src/main/java/com/jeesite/modules/msg/dao/MsgInnerRecordDao.java @@ -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 { + + /** + * 根据消息编号和接受者用户名更新读取状态 + */ + public void updateReadStatus(MsgInnerRecord msgInnerRecord); + +} \ No newline at end of file diff --git a/modules/core/src/main/java/com/jeesite/modules/msg/entity/MsgInner.java b/modules/core/src/main/java/com/jeesite/modules/msg/entity/MsgInner.java new file mode 100644 index 00000000..faed61fb --- /dev/null +++ b/modules/core/src/main/java/com/jeesite/modules/msg/entity/MsgInner.java @@ -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 { + + // 接受者类型(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; + } + +} \ No newline at end of file diff --git a/modules/core/src/main/java/com/jeesite/modules/msg/entity/MsgInnerRecord.java b/modules/core/src/main/java/com/jeesite/modules/msg/entity/MsgInnerRecord.java new file mode 100644 index 00000000..c4adf6f3 --- /dev/null +++ b/modules/core/src/main/java/com/jeesite/modules/msg/entity/MsgInnerRecord.java @@ -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 { + + // 读取状态(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; + } + +} \ No newline at end of file diff --git a/modules/core/src/main/java/com/jeesite/modules/msg/service/MsgInnerService.java b/modules/core/src/main/java/com/jeesite/modules/msg/service/MsgInnerService.java new file mode 100644 index 00000000..9d19ec28 --- /dev/null +++ b/modules/core/src/main/java/com/jeesite/modules/msg/service/MsgInnerService.java @@ -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 { + + @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 findPage(MsgInner msgInner) { + return super.findPage(msgInner); + } + + /** + * 查询消息记录数据 + */ + public List 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 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 empUserList){ + if (empUserList == null || empUserList.size() <= 0){ + return; + } + String[] notifyTypes = StringUtils.split(msgInner.getNotifyTypes(), ","); + List 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)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); + } + +} \ No newline at end of file diff --git a/modules/core/src/main/java/com/jeesite/modules/msg/web/MsgInnerController.java b/modules/core/src/main/java/com/jeesite/modules/msg/web/MsgInnerController.java new file mode 100644 index 00000000..44c2d648 --- /dev/null +++ b/modules/core/src/main/java/com/jeesite/modules/msg/web/MsgInnerController.java @@ -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 listData(MsgInner msgInner, HttpServletRequest request, HttpServletResponse response) { + msgInner.setPage(new Page<>(request, response)); + msgInner.setRecord(new MsgInnerRecord()); + msgInner.getRecord().setReceiveUserCode(msgInner.getCurrentUser().getUserCode()); + Page 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("删除消息成功!")); + } + +} \ No newline at end of file diff --git a/modules/core/src/main/java/com/jeesite/modules/sys/db/InitCoreData.xlsx b/modules/core/src/main/java/com/jeesite/modules/sys/db/InitCoreData.xlsx index 4628dc8cb65b4c947771e2200033e54f89dab91b..1cb5495adf6d518b4b79e005e624e0f45ca39670 100644 GIT binary patch delta 58205 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 DbYwd; delta 57832 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

SP&M`do%zspf5Pi;8uZ7qV2|^aGHO)OxHT;$y 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 diff --git a/modules/core/src/main/resources/db/upgrade/core/mssql/mssql_4.1.4.sql b/modules/core/src/main/resources/db/upgrade/core/mssql/mssql_4.1.4.sql index 80f8f640..af304f40 100644 --- a/modules/core/src/main/resources/db/upgrade/core/mssql/mssql_4.1.4.sql +++ b/modules/core/src/main/resources/db/upgrade/core/mssql/mssql_4.1.4.sql @@ -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; diff --git a/modules/core/src/main/resources/db/upgrade/core/mysql/mysql_4.1.4.sql b/modules/core/src/main/resources/db/upgrade/core/mysql/mysql_4.1.4.sql index 2efffd57..e8b82c99 100644 --- a/modules/core/src/main/resources/db/upgrade/core/mysql/mysql_4.1.4.sql +++ b/modules/core/src/main/resources/db/upgrade/core/mysql/mysql_4.1.4.sql @@ -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`; \ No newline at end of file +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`; diff --git a/modules/core/src/main/resources/db/upgrade/core/oracle/oracle_4.1.4.sql b/modules/core/src/main/resources/db/upgrade/core/oracle/oracle_4.1.4.sql index a275f4b4..9db5c09d 100644 --- a/modules/core/src/main/resources/db/upgrade/core/oracle/oracle_4.1.4.sql +++ b/modules/core/src/main/resources/db/upgrade/core/oracle/oracle_4.1.4.sql @@ -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 '集群的实例名字' \ No newline at end of file +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 ); + diff --git a/modules/core/src/main/resources/db/upgrade/core/postgresql/postgresql_4.1.4.sql b/modules/core/src/main/resources/db/upgrade/core/postgresql/postgresql_4.1.4.sql index 95fecce7..9d33d6b8 100644 --- a/modules/core/src/main/resources/db/upgrade/core/postgresql/postgresql_4.1.4.sql +++ b/modules/core/src/main/resources/db/upgrade/core/postgresql/postgresql_4.1.4.sql @@ -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; -COMMENT ON COLUMN ${_prefix}sys_job.instance_name IS '集群的实例名字'; \ No newline at end of file +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; + \ No newline at end of file diff --git a/modules/core/src/main/resources/mappings/modules/msg/MsgInnerDao.xml b/modules/core/src/main/resources/mappings/modules/msg/MsgInnerDao.xml new file mode 100644 index 00000000..0caee9b0 --- /dev/null +++ b/modules/core/src/main/resources/mappings/modules/msg/MsgInnerDao.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/core/src/main/resources/mappings/modules/msg/MsgInnerRecordDao.xml b/modules/core/src/main/resources/mappings/modules/msg/MsgInnerRecordDao.xml new file mode 100644 index 00000000..dc56159e --- /dev/null +++ b/modules/core/src/main/resources/mappings/modules/msg/MsgInnerRecordDao.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/modules/core/src/main/resources/views/modules/msg/msgInnerForm.html b/modules/core/src/main/resources/views/modules/msg/msgInnerForm.html new file mode 100644 index 00000000..97f3ce02 --- /dev/null +++ b/modules/core/src/main/resources/views/modules/msg/msgInnerForm.html @@ -0,0 +1,176 @@ +<% layout('/layouts/default.html', {title: '站内消息', libs: ['validate','fileupload','ueditor']}){ %> +

+
+
+
+ ${text(msgInner.isNewRecord ? '发送消息' : '编辑消息')} +
+
+ +
+
+ <#form:form id="inputForm" model="${msgInner}" action="${ctx}/msg/msgInner/save" method="post" class="form-horizontal"> +
+
${text('基本信息')}
+ <#form:hidden path="id"/> + <#form:hidden path="status"/> +
+
+
+ +
+ <#form:input path="msgTitle" maxlength="200" class="form-control required text-ruler"/> +
+
+
+
+
+
+
+ +
+ <#form:radio path="contentLevel" dictType="msg_inner_content_level" class="form-control required" /> +
+
+
+
+
+ +
+ <#form:radio path="contentType" dictType="msg_inner_content_type" blankOption="true" class="form-control" /> +
+
+
+
+
+
+
+ +
+ <#form:ueditor path="msgContent" rows="4" class="form-control required" simpleToolbars="true"/> +
+
+
+
+
+
+
+ +
+ <#form:fileupload id="uploadFile" bizKey="${msgInner.id}" bizType="msgInner_file" + uploadType="all" class="" readonly="false"/> +
+
+
+
+
${text('接受者信息')}
+
+
+
+ +
+ <#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"/> +
+
+
+
+
+
+
+ +
+ <#form:checkbox path="notifyTypes" dictType="sys_msg_type" class="form-control required" /> +
+
+
+
+ <% if(!msgInner.isNewRecord){ %> +
${text('发送者信息')}
+
+
+
+ +
+ <#form:input path="sendUserName" readonly="true" maxlength="100" class="form-control required"/> +
+
+
+
+
+ +
+ <#form:input path="sendDate" dataFormat="datetime" readonly="true" maxlength="20" class="form-control required"/> +
+
+
+
+ <% } %> +
+ + +
+
+<% } %> + \ No newline at end of file diff --git a/modules/core/src/main/resources/views/modules/msg/msgInnerList.html b/modules/core/src/main/resources/views/modules/msg/msgInnerList.html new file mode 100644 index 00000000..b7dc2a1f --- /dev/null +++ b/modules/core/src/main/resources/views/modules/msg/msgInnerList.html @@ -0,0 +1,107 @@ +<% layout('/layouts/default.html', {title: '站内消息', libs: ['dataGrid']}){ %> +
+
+
+
+ ${text('站内消息')} +
+
+ ${text('查询')} + <% if(hasPermi('msg:msgInner:edit')){ %> + ${text('新增')} + <% } %> +
+
+
+ <#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}"> +
+ +
+ <#form:input path="msgTitle" maxlength="200" class="form-control width-120"/> +
+
+
+ +
+ <#form:select path="contentLevel" dictType="msg_inner_content_level" blankOption="true" class="form-control"/> +
+
+
+ +
+ <#form:select path="contentType" dictType="msg_inner_content_type" blankOption="true" class="form-control"/> +
+
+
+ +
+ <#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()}});"/> +  --  + <#form:input path="sendDate_lte" readonly="true" maxlength="20" class="form-control Wdate-date" + dataFormat="date" onclick="WdatePicker({dateFmt:'yyyy-MM-dd',isShowClear:false});"/> +
+
+
+ +
+ <#form:select path="status" dictType="msg_inner_msg_status" blankOption="true" class="form-control"/> +
+
+
+ + +
+ +
+
+
+
+
+<% } %> + \ No newline at end of file diff --git a/modules/core/src/main/resources/views/modules/msg/msgInnerView.html b/modules/core/src/main/resources/views/modules/msg/msgInnerView.html new file mode 100644 index 00000000..96573a0a --- /dev/null +++ b/modules/core/src/main/resources/views/modules/msg/msgInnerView.html @@ -0,0 +1,50 @@ +<%/* Copyright (c) 2013-Now http://jeesite.com All rights reserved. */ %> +<% layout('/layouts/default.html', {title: '查看消息', libs: ['validate','fileupload']}){ %> +
+
+
+
+ ${text('查看消息')} +
+
+ +
+
+
+

${msgInner.msgTitle}

+
+ + ${msgInner.msgContent} + <% if(msgInner.isAttac == @Global.YES){ %> +
+ <#form:fileupload id="uploadFile" bizKey="${msgInner.id}" bizType="msgInner_file" + uploadType="all" class="" readonly="true" preview="weboffice"/> +
+ <% } %> +
+ + <% if (readList! != null && readList.~size > 0){ %> + <% } %> + <% if (unReadList! != null && unReadList.~size > 0){ %> + <% } %> +
+ +
+
+<% } %> \ No newline at end of file diff --git a/web/db/db2/core.sql b/web/db/db2/core.sql new file mode 100644 index 00000000..0a9c0737 --- /dev/null +++ b/web/db/db2/core.sql @@ -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); + + + diff --git a/web/db/mssql/core.sql b/web/db/mssql/core.sql index 0cf1045d..593862fd 100644 --- a/web/db/mssql/core.sql +++ b/web/db/mssql/core.sql @@ -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, diff --git a/web/db/mysql/core.sql b/web/db/mysql/core.sql index 8725c462..cf0b337a 100644 --- a/web/db/mysql/core.sql +++ b/web/db/mysql/core.sql @@ -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 '创建时间', diff --git a/web/db/oracle/core.sql b/web/db/oracle/core.sql index b29424e7..9943b4e1 100644 --- a/web/db/oracle/core.sql +++ b/web/db/oracle/core.sql @@ -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 '发送者用户编码'; diff --git a/web/db/postgresql/core.sql b/web/db/postgresql/core.sql index f7a01cf4..0a0403c5 100644 --- a/web/db/postgresql/core.sql +++ b/web/db/postgresql/core.sql @@ -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 '发送者用户编码';