|
|
@@ -0,0 +1,159 @@
|
|
|
+package com.jeesite.modules.mes.dingtalk;
|
|
|
+
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.boot.ApplicationArguments;
|
|
|
+import org.springframework.boot.ApplicationRunner;
|
|
|
+import org.springframework.core.annotation.Order;
|
|
|
+import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 启动时确保钉钉消息配置表、预置类型和菜单存在。
|
|
|
+ */
|
|
|
+@Component
|
|
|
+@Order(90)
|
|
|
+public class MesDingMsgTableInitializer implements ApplicationRunner {
|
|
|
+
|
|
|
+ private static final Logger logger = LoggerFactory.getLogger(MesDingMsgTableInitializer.class);
|
|
|
+
|
|
|
+ private static final String CREATE_CONFIG_SQL = "CREATE TABLE IF NOT EXISTS `mes_ding_msg_config` ("
|
|
|
+ + "`id` varchar(64) NOT NULL COMMENT '主键',"
|
|
|
+ + "`msg_code` varchar(64) NOT NULL COMMENT '消息编码',"
|
|
|
+ + "`msg_name` varchar(100) NOT NULL COMMENT '消息名称',"
|
|
|
+ + "`module` varchar(20) NOT NULL COMMENT '模块',"
|
|
|
+ + "`trigger_desc` varchar(255) DEFAULT '' COMMENT '触发说明',"
|
|
|
+ + "`msg_content` text COMMENT '发送内容',"
|
|
|
+ + "`is_enabled` char(1) NOT NULL DEFAULT '0' COMMENT '是否启用',"
|
|
|
+ + "`sort_order` int DEFAULT 0 COMMENT '排序',"
|
|
|
+ + "`status` char(1) NOT NULL DEFAULT '0' COMMENT '状态',"
|
|
|
+ + "`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',"
|
|
|
+ + "`create_date` datetime DEFAULT NULL COMMENT '创建时间',"
|
|
|
+ + "`update_by` varchar(64) DEFAULT NULL COMMENT '更新者',"
|
|
|
+ + "`update_date` datetime DEFAULT NULL COMMENT '更新时间',"
|
|
|
+ + "`remarks` varchar(500) DEFAULT NULL COMMENT '备注',"
|
|
|
+ + "PRIMARY KEY (`id`),"
|
|
|
+ + "UNIQUE KEY `uk_mes_ding_msg_code` (`msg_code`)"
|
|
|
+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='钉钉消息推送配置'";
|
|
|
+
|
|
|
+ private static final String CREATE_LINE_SQL = "CREATE TABLE IF NOT EXISTS `mes_ding_msg_line` ("
|
|
|
+ + "`id` varchar(64) NOT NULL COMMENT '主键',"
|
|
|
+ + "`config_id` varchar(64) NOT NULL COMMENT '消息配置ID',"
|
|
|
+ + "`line_sn` varchar(64) NOT NULL COMMENT '产线编号',"
|
|
|
+ + "`line_title` varchar(100) DEFAULT '' COMMENT '产线名称',"
|
|
|
+ + "`user_codes` varchar(2000) DEFAULT '' COMMENT '接收人用户编码',"
|
|
|
+ + "`user_names` varchar(2000) DEFAULT '' COMMENT '接收人姓名',"
|
|
|
+ + "`mobiles` varchar(2000) DEFAULT '' COMMENT '接收人手机号',"
|
|
|
+ + "`status` char(1) NOT NULL DEFAULT '0' COMMENT '状态',"
|
|
|
+ + "`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',"
|
|
|
+ + "`create_date` datetime DEFAULT NULL COMMENT '创建时间',"
|
|
|
+ + "`update_by` varchar(64) DEFAULT NULL COMMENT '更新者',"
|
|
|
+ + "`update_date` datetime DEFAULT NULL COMMENT '更新时间',"
|
|
|
+ + "`remarks` varchar(500) DEFAULT NULL COMMENT '备注',"
|
|
|
+ + "PRIMARY KEY (`id`),"
|
|
|
+ + "KEY `idx_mes_ding_msg_line_cfg` (`config_id`, `line_sn`)"
|
|
|
+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='钉钉消息产线接收人'";
|
|
|
+
|
|
|
+ private final JdbcTemplate jdbcTemplate;
|
|
|
+
|
|
|
+ public MesDingMsgTableInitializer(JdbcTemplate jdbcTemplate) {
|
|
|
+ this.jdbcTemplate = jdbcTemplate;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void run(ApplicationArguments args) {
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute(CREATE_CONFIG_SQL);
|
|
|
+ jdbcTemplate.execute(CREATE_LINE_SQL);
|
|
|
+ ensureMsgContentColumn();
|
|
|
+ seedConfigs();
|
|
|
+ ensureMenu();
|
|
|
+ logger.info("钉钉消息推送配置表已就绪");
|
|
|
+ } catch (Exception ex) {
|
|
|
+ logger.error("初始化钉钉消息推送配置失败,请手动执行 db/mysql/add_mes_ding_msg.sql: {}",
|
|
|
+ ex.getMessage(), ex);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void seedConfigs() {
|
|
|
+ for (DingMsgCode code : DingMsgCode.values()) {
|
|
|
+ Integer exists = jdbcTemplate.queryForObject(
|
|
|
+ "SELECT COUNT(1) FROM mes_ding_msg_config WHERE msg_code = ?", Integer.class, code.getCode());
|
|
|
+ if (exists != null && exists > 0) {
|
|
|
+ jdbcTemplate.update(
|
|
|
+ "UPDATE mes_ding_msg_config SET msg_content = ? WHERE msg_code = ? AND (msg_content IS NULL OR msg_content = '')",
|
|
|
+ code.getDefaultContent(), code.getCode());
|
|
|
+ jdbcTemplate.update(
|
|
|
+ "UPDATE mes_ding_msg_config SET msg_content = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE("
|
|
|
+ + "msg_content, '${msgName}', '{消息名称}'), '${time}', '{发送时间}'), "
|
|
|
+ + "'${lineTitle}', '{产线名称}'), '${lineSn}', '{产线编号}'), '${userNames}', '{接收人}') "
|
|
|
+ + "WHERE msg_code = ? AND msg_content LIKE '%${%'",
|
|
|
+ code.getCode());
|
|
|
+ String current = jdbcTemplate.queryForObject(
|
|
|
+ "SELECT msg_content FROM mes_ding_msg_config WHERE msg_code = ?", String.class, code.getCode());
|
|
|
+ if (!DingMsgCard.isCardJson(current)) {
|
|
|
+ jdbcTemplate.update("UPDATE mes_ding_msg_config SET msg_content = ? WHERE msg_code = ?",
|
|
|
+ DingMsgCard.parse(current).toJson(), code.getCode());
|
|
|
+ }
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ jdbcTemplate.update(
|
|
|
+ "INSERT INTO mes_ding_msg_config (id, msg_code, msg_name, module, trigger_desc, msg_content, is_enabled, sort_order, status, create_by, create_date, update_by, update_date) "
|
|
|
+ + "VALUES (?, ?, ?, ?, ?, ?, '0', ?, '0', 'system', NOW(), 'system', NOW())",
|
|
|
+ code.getCode(), code.getCode(), code.getMsgName(), code.getModule(),
|
|
|
+ code.getTriggerDesc(), code.getDefaultContent(), code.getSortOrder());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /** 已有表补加发送内容列 */
|
|
|
+ private void ensureMsgContentColumn() {
|
|
|
+ Integer cnt = jdbcTemplate.queryForObject(
|
|
|
+ "SELECT COUNT(1) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'mes_ding_msg_config' AND COLUMN_NAME = 'msg_content'",
|
|
|
+ Integer.class);
|
|
|
+ if (cnt == null || cnt == 0) {
|
|
|
+ jdbcTemplate.execute("ALTER TABLE mes_ding_msg_config ADD COLUMN msg_content text COMMENT '发送内容' AFTER trigger_desc");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void ensureMenu() {
|
|
|
+ Integer count = jdbcTemplate.queryForObject(
|
|
|
+ "SELECT COUNT(1) FROM js_sys_menu WHERE menu_code = ?", Integer.class, "mesDingMsgConfig");
|
|
|
+ if (count == null || count == 0) {
|
|
|
+ jdbcTemplate.update(
|
|
|
+ "INSERT INTO js_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, "
|
|
|
+ + "menu_title, permission, weight, is_show, sys_code, module_codes, component, params, "
|
|
|
+ + "status, create_by, create_date, update_by, update_date, remarks) VALUES ("
|
|
|
+ + "'mesDingMsgConfig', '1582259828007895040', '0,1582259822626603008,1582259828007895040,', "
|
|
|
+ + "180, '0000009000,0000000500,0000000180,', '1', 2, "
|
|
|
+ + "'系统管理/系统设置/钉钉消息推送', '钉钉消息推送', '1', '/mes/mesDingMsgConfig/list', '', "
|
|
|
+ + "'icon-speech', '', '', 'mes:mesDingMsgConfig:view', 40, '1', 'default', 'core', NULL, NULL, "
|
|
|
+ + "'0', 'system', NOW(), 'system', NOW(), '')");
|
|
|
+ jdbcTemplate.update(
|
|
|
+ "INSERT INTO js_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, "
|
|
|
+ + "menu_title, permission, weight, is_show, sys_code, module_codes, component, params, "
|
|
|
+ + "status, create_by, create_date, update_by, update_date, remarks) VALUES ("
|
|
|
+ + "'mesDingMsgConfigEdit', 'mesDingMsgConfig', '0,1582259822626603008,1582259828007895040,mesDingMsgConfig,', "
|
|
|
+ + "30, '0000009000,0000000500,0000000180,0000000030,', '1', 3, "
|
|
|
+ + "'系统管理/系统设置/钉钉消息推送/编辑', '编辑', '2', '', '', "
|
|
|
+ + "'', '', '', 'mes:mesDingMsgConfig:edit', 40, '0', 'default', 'core', NULL, NULL, "
|
|
|
+ + "'0', 'system', NOW(), 'system', NOW(), '')");
|
|
|
+ }
|
|
|
+ grantRoleMenu("corpAdmin", "mesDingMsgConfig");
|
|
|
+ grantRoleMenu("corpAdmin", "mesDingMsgConfigEdit");
|
|
|
+ }
|
|
|
+
|
|
|
+ private void grantRoleMenu(String roleCode, String menuCode) {
|
|
|
+ Integer roleCount = jdbcTemplate.queryForObject(
|
|
|
+ "SELECT COUNT(1) FROM js_sys_role_menu WHERE role_code = ? AND menu_code = ?",
|
|
|
+ Integer.class, roleCode, menuCode);
|
|
|
+ if (roleCount == null || roleCount == 0) {
|
|
|
+ jdbcTemplate.update("INSERT INTO js_sys_role_menu (role_code, menu_code) VALUES (?, ?)",
|
|
|
+ roleCode, menuCode);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|