|
@@ -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;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|