deason 4 年 前
コミット
30e9abd9c1

+ 212 - 0
src/main/java/cn/com/qmth/dp/examcloud/oe/modules/init_user_data_rule/InitUserDataRule.java

@@ -0,0 +1,212 @@
+package cn.com.qmth.dp.examcloud.oe.modules.init_user_data_rule;
+
+import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.BatchPreparedStatementSetter;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 数据割接(可重复执行):
+ * 初始化用户与学习中心、课程、考试等数据维度的默认数据权限
+ */
+@Component
+public class InitUserDataRule {
+
+    private final static Logger log = LoggerFactory.getLogger(InitUserDataRule.class);
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    public void start() {
+        StringBuilder querySql = new StringBuilder()
+                .append("select id,root_org_id,org_id from ec_b_user ")
+                .append("where id > %s ")
+                .append("order by id asc limit 0,1000");
+
+        Long nextMinId = 0L;
+        while (true) {
+            log.info("query nextMinId:" + nextMinId);
+
+            // 分批查询所有用户信息
+            List<UserInfo> list = jdbcTemplate.query(String.format(querySql.toString(), nextMinId),
+                    new BeanPropertyRowMapper(UserInfo.class));
+
+            if (CollectionUtils.isEmpty(list)) {
+                break;
+            }
+
+            nextMinId = list.get(list.size() - 1).getId();
+
+            this.initUserDataRulesForDefaultStatus(list);
+        }
+
+        log.info("task end...");
+    }
+
+    private void initUserDataRulesForDefaultStatus(List<UserInfo> userList) {
+        List<UserDataRuleInfo> todoRuleList = new ArrayList<>();
+
+        int existRuleSize = 0;
+        for (UserInfo user : userList) {
+            UserDataRuleInfo curOrgDataRule = null;
+
+            // 用户与学习中心、课程、考试等数据维度的“默认全部”权限
+            for (DataRuleType type : DataRuleType.values()) {
+                UserDataRuleInfo rule = new UserDataRuleInfo();
+                rule.setRootOrgId(user.getRootOrgId());
+                rule.setUserId(user.getId());
+                rule.setType(type);
+                rule.setRefId(-1L);// 为-1时,代表“全部”
+                rule.setEnabled(true);
+
+                if (this.existUserDataRule(rule)) {
+                    // 跳过存在的
+                    existRuleSize++;
+                    continue;
+                }
+
+                if (DataRuleType.ORG == type) {
+                    curOrgDataRule = rule;
+                }
+
+                todoRuleList.add(rule);
+            }
+
+            // 用户与学习中心的数据权限
+            if (user.getOrgId() != null) {
+                UserDataRuleInfo rule = new UserDataRuleInfo();
+                rule.setRootOrgId(user.getRootOrgId());
+                rule.setUserId(user.getId());
+                rule.setType(DataRuleType.ORG);
+                rule.setRefId(user.getOrgId());// 关联学习中心ID
+                rule.setEnabled(true);
+
+                if (curOrgDataRule != null) {
+                    List<String> roles = this.queryUserRoles(user.getId());
+                    boolean isLearnCenterUser = roles.contains("LC_USER");
+                    if (isLearnCenterUser) {
+                        curOrgDataRule.setEnabled(false);
+                    }
+                }
+
+                if (this.existUserDataRule(rule)) {
+                    // 跳过存在的
+                    existRuleSize++;
+                    continue;
+                }
+
+                todoRuleList.add(rule);
+            }
+        }
+
+        log.info(String.format("userSize = %s, existRuleSize = %s, todoRuleSize = %s \n",
+                userList.size(), existRuleSize, todoRuleList.size()));
+        this.addUserDataRules(todoRuleList);
+    }
+
+    private List<String> queryUserRoles(Long userId) {
+        StringBuilder querySql = new StringBuilder()
+                .append("select r.code from ec_b_user_role_relation ur ")
+                .append("inner join ec_b_role r on r.id = ur.role_id ")
+                .append("where ur.user_id = ").append(userId);
+
+        List<String> roles = jdbcTemplate.queryForList(querySql.toString(), String.class);
+        log.debug(String.format("userId = %s, roles = %s", userId, StringUtils.join(roles, ",")));
+        return roles;
+    }
+
+    private boolean existUserDataRule(UserDataRuleInfo rule) {
+        String countSql = String.format(
+                "select count(1) from ec_b_user_data_rule where user_id = %s and type = '%s' and ref_id = %s",
+                rule.getUserId(), rule.getType().name(), rule.getRefId());
+        Long total = jdbcTemplate.queryForObject(countSql, Long.class);
+        return total > 0 ? true : false;
+    }
+
+    private void addUserDataRules(List<UserDataRuleInfo> list) {
+        if (CollectionUtils.isEmpty(list)) {
+            return;
+        }
+
+        StringBuilder insertSql = new StringBuilder()
+                .append("insert into ec_b_user_data_rule ")
+                .append("(user_id,type,ref_id,root_org_id,enabled,creation_time,update_time) ")
+                .append("values (?,?,?,?,?,?,?)");
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+        jdbcTemplate.batchUpdate(insertSql.toString(), new BatchPreparedStatementSetter() {
+            @Override
+            public void setValues(PreparedStatement ps, int n) throws SQLException {
+                UserDataRuleInfo row = list.get(n);
+                ps.setLong(1, row.getUserId());
+                ps.setString(2, row.getType().name());
+                ps.setLong(3, row.getRefId());
+                ps.setLong(4, row.getRootOrgId());
+                ps.setBoolean(5, row.getEnabled());
+                ps.setString(6, sdf.format(new Date()));
+                ps.setString(7, sdf.format(new Date()));
+            }
+
+            @Override
+            public int getBatchSize() {
+                return list.size();
+            }
+        });
+    }
+
+    @Data
+    static class UserInfo implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        private Long id;
+
+        private Long rootOrgId;
+
+        private Long orgId;
+
+    }
+
+    @Data
+    static class UserDataRuleInfo implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        private Long rootOrgId;
+
+        private Long userId;
+
+        private DataRuleType type;
+
+        private Long refId;
+
+        private Boolean enabled;
+
+    }
+
+    enum DataRuleType {
+
+        ORG,
+
+        EXAM,
+
+        COURSE;
+
+    }
+
+}