diff --git a/src/main/java/com/budwk/app/base/param/Condition.java b/src/main/java/com/budwk/app/base/param/Condition.java new file mode 100644 index 0000000..ea73a2d --- /dev/null +++ b/src/main/java/com/budwk/app/base/param/Condition.java @@ -0,0 +1,21 @@ +package com.budwk.app.base.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 单个条件 + */ +@Data +public class Condition { + + @ApiModelProperty("字段名") + private String field; + + @ApiModelProperty("操作符: =, !=, >, <, >=, <=, LIKE, IN, NOT IN, IS NULL, IS NOT NULL") + private String operator; + + @ApiModelProperty("字段值") + private Object value; + +} diff --git a/src/main/java/com/budwk/app/base/param/ConditionGroup.java b/src/main/java/com/budwk/app/base/param/ConditionGroup.java new file mode 100644 index 0000000..9aaab54 --- /dev/null +++ b/src/main/java/com/budwk/app/base/param/ConditionGroup.java @@ -0,0 +1,24 @@ +package com.budwk.app.base.param; + +import com.budwk.app.sys.param.SysDataUserUpdateParam; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 条件组,支持嵌套的与或非逻辑 + */ +@Data +public class ConditionGroup { + + @ApiModelProperty("逻辑类型:AND, OR") + private String logic = "AND"; + + @ApiModelProperty("条件列表") + private List conditions; + + @ApiModelProperty("嵌套条件组") + private List groups; + +} diff --git a/src/main/java/com/budwk/app/base/utils/ConditionGroupUtil.java b/src/main/java/com/budwk/app/base/utils/ConditionGroupUtil.java new file mode 100644 index 0000000..acd86e6 --- /dev/null +++ b/src/main/java/com/budwk/app/base/utils/ConditionGroupUtil.java @@ -0,0 +1,159 @@ +package com.budwk.app.base.utils; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.param.Condition; +import com.budwk.app.base.param.ConditionGroup; +import com.budwk.app.sys.param.SysDataUserUpdateParam; +import lombok.extern.slf4j.Slf4j; +import org.nutz.dao.Cnd; +import org.nutz.dao.util.cri.SqlExpressionGroup; + +/** + * 条件组处理工具类 + * 用于处理复杂的条件组和条件,生成对应的SQL条件 + */ +@Slf4j +public class ConditionGroupUtil { + + /** + * 处理条件组,将条件组转换为Cnd条件 + * + * @param cnd 原始条件 + * @param group 条件组 + * @return 处理后的条件 + */ + public static Cnd applyConditionGroup(Cnd cnd, ConditionGroup group) { + if (group == null) { + return cnd; + } + + SqlExpressionGroup expGroup = new SqlExpressionGroup(); + + // 处理条件列表 + if (group.getConditions() != null && !group.getConditions().isEmpty()) { + for (Condition condition : group.getConditions()) { + expGroup = applyCondition(expGroup, condition, group.getLogic()); + } + } + + // 处理嵌套条件组 + if (group.getGroups() != null && !group.getGroups().isEmpty()) { + for (ConditionGroup nestedGroup : group.getGroups()) { + // 创建子条件 + Cnd subCnd = Cnd.NEW(); + subCnd = applyConditionGroup(subCnd, nestedGroup); + + // 将子条件的表达式组添加到当前表达式组 + if ("OR".equalsIgnoreCase(group.getLogic())) { + expGroup.or(subCnd.where()); + } else { + expGroup.and(subCnd.where()); + } + } + } + + // 将表达式组添加到主条件 + cnd.and(expGroup); + return cnd; + } + + /** + * 处理单个条件 + * + * @param expGroup 表达式组 + * @param condition 条件 + * @param logic 逻辑类型 (AND/OR) + * @return 处理后的表达式组 + */ + public static SqlExpressionGroup applyCondition(SqlExpressionGroup expGroup, Condition condition, String logic) { + String field = condition.getField(); + String operator = condition.getOperator(); + Object value = condition.getValue(); + + // 根据操作符处理条件 + switch (operator.toUpperCase()) { + case "=": + if ("OR".equalsIgnoreCase(logic)) { + expGroup.or(field, "=", value); + } else { + expGroup.and(field, "=", value); + } + break; + case "!=": + if ("OR".equalsIgnoreCase(logic)) { + expGroup.or(field, "!=", value); + } else { + expGroup.and(field, "!=", value); + } + break; + case ">": + if ("OR".equalsIgnoreCase(logic)) { + expGroup.or(field, ">", value); + } else { + expGroup.and(field, ">", value); + } + break; + case "<": + if ("OR".equalsIgnoreCase(logic)) { + expGroup.or(field, "<", value); + } else { + expGroup.and(field, "<", value); + } + break; + case ">=": + if ("OR".equalsIgnoreCase(logic)) { + expGroup.or(field, ">=", value); + } else { + expGroup.and(field, ">=", value); + } + break; + case "<=": + if ("OR".equalsIgnoreCase(logic)) { + expGroup.or(field, "<=", value); + } else { + expGroup.and(field, "<=", value); + } + break; + case "LIKE": + if ("OR".equalsIgnoreCase(logic)) { + expGroup.or(field, "LIKE", "%" + value + "%"); + } else { + expGroup.and(field, "LIKE", "%" + value + "%"); + } + break; + case "IN": + if ("OR".equalsIgnoreCase(logic)) { + expGroup.or(field, "IN", ObjectUtil.isNotNull(value) ? value.toString().split(",") : new String[0]); + } else { + expGroup.and(field, "IN", ObjectUtil.isNotNull(value) ? value.toString().split(",") : new String[0]); + } + break; + case "NOT IN": + if ("OR".equalsIgnoreCase(logic)) { + expGroup.or(field, "NOT IN", ObjectUtil.isNotNull(value) ? value.toString().split(",") : new String[0]); + } else { + expGroup.and(field, "NOT IN", ObjectUtil.isNotNull(value) ? value.toString().split(",") : new String[0]); + } + break; + case "IS NULL": + if ("OR".equalsIgnoreCase(logic)) { + expGroup.or(field, "IS", null); + } else { + expGroup.and(field, "IS", null); + } + break; + case "IS NOT NULL": + if ("OR".equalsIgnoreCase(logic)) { + expGroup.or(field, "IS NOT", null); + } else { + expGroup.and(field, "IS NOT", null); + } + break; + default: + log.warn("不支持的操作符: {}", operator); + } + + return expGroup; + } +} diff --git a/src/main/java/com/budwk/app/base/utils/PwdUtil.java b/src/main/java/com/budwk/app/base/utils/PwdUtil.java index 714f3b3..2985904 100644 --- a/src/main/java/com/budwk/app/base/utils/PwdUtil.java +++ b/src/main/java/com/budwk/app/base/utils/PwdUtil.java @@ -4,6 +4,10 @@ import lombok.extern.slf4j.Slf4j; import org.nutz.lang.Lang; import java.security.MessageDigest; +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; /** * 为老兼容老的密码加密方式 @@ -13,6 +17,13 @@ import java.security.MessageDigest; @Slf4j public class PwdUtil { + private static final String LOWERCASE = "abcdefghijklmnopqrstuvwxyz"; + private static final String UPPERCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + private static final String DIGITS = "0123456789"; + private static final String SPECIAL = "!@#$%^&*()-_=+{};:,<.>"; + private static final String ALL = LOWERCASE + UPPERCASE + DIGITS + SPECIAL; + private static final SecureRandom random = new SecureRandom(); + public static String getPassword(String passowrd, String salt) { byte[] bytes = hash(passowrd.getBytes(), salt.getBytes(), 1024); if (bytes != null) { @@ -43,4 +54,44 @@ public class PwdUtil { return null; } + + public static String generate(int length) { + if (length < 8 || length > 20) { + throw new IllegalArgumentException("密码长度必须在8到20之间"); + } + + List passwordChars = new ArrayList<>(); + + // 保证每类字符至少一个 + passwordChars.add(randomCharFrom(LOWERCASE)); + passwordChars.add(randomCharFrom(UPPERCASE)); + passwordChars.add(randomCharFrom(DIGITS)); + passwordChars.add(randomCharFrom(SPECIAL)); + + // 剩余位置随机填充 + for (int i = passwordChars.size(); i < length; i++) { + passwordChars.add(randomCharFrom(ALL)); + } + + // 打乱顺序以避免固定模式 + Collections.shuffle(passwordChars); + + // 构建字符串 + StringBuilder password = new StringBuilder(); + for (char ch : passwordChars) { + password.append(ch); + } + + return password.toString(); + } + + private static char randomCharFrom(String chars) { + return chars.charAt(random.nextInt(chars.length())); + } + + // 示例主方法 + public static void main(String[] args) { + System.out.println("生成的密码: " + generate(12)); + } + } diff --git a/src/main/java/com/budwk/app/sys/controller/SysDataUserPullController.java b/src/main/java/com/budwk/app/sys/controller/SysDataUserPullController.java index f2d6ffc..0a16c1a 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysDataUserPullController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysDataUserPullController.java @@ -37,8 +37,8 @@ public class SysDataUserPullController { @At @SaCheckPermission("sys.data.user.pull") - @Ok("json:{dateFormat:'yyyy-MM-dd'}") @ApiOperation("分页数据") + @Ok("json:{locked:'password|idCard|mobile'}") public Result pageData(@Valid SysDataUserPullPageForm pageForm) { Cnd cnd = Cnd.NEW(); cnd.andEX(Sys_user_source::getPullTime, "=", pageForm.getPullTime()); @@ -90,8 +90,8 @@ public class SysDataUserPullController { @At @SaCheckPermission("sys.data.user.pull") @ApiOperation("根据拉取时间删除数据") - public Result deleteByPullTime(@Param(value = "pullTime") @Valid String pullTime) { - sysUserPullService.clear(Cnd.where(Sys_user_source::getPullTime, "=", pullTime)); + public Result deleteByPullTime(@Param(value = "pullTime") @Valid String[] pullTime) { + sysUserPullService.clear(Cnd.where(Sys_user_source::getPullTime, "in", pullTime)); return Result.success(); } diff --git a/src/main/java/com/budwk/app/sys/controller/SysDataUserUpdateController.java b/src/main/java/com/budwk/app/sys/controller/SysDataUserUpdateController.java index 4fb937a..248c5d8 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysDataUserUpdateController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysDataUserUpdateController.java @@ -60,7 +60,7 @@ public class SysDataUserUpdateController { @At @SaCheckPermission("sys.data.user.pull") @ApiOperation("分页数据") - @Ok("json:{locked:'password|createAt|loginSessionId'}") + @Ok("json:{locked:'password|idCard|mobile'}") public Result pageData(@Valid SysDataUserUpdatePageForm pageForm) { Sql sql = Sqls.create(""" SELECT diff --git a/src/main/java/com/budwk/app/sys/param/SysDataUserUpdateParam.java b/src/main/java/com/budwk/app/sys/param/SysDataUserUpdateParam.java index a3ff33e..924504d 100644 --- a/src/main/java/com/budwk/app/sys/param/SysDataUserUpdateParam.java +++ b/src/main/java/com/budwk/app/sys/param/SysDataUserUpdateParam.java @@ -1,11 +1,11 @@ package com.budwk.app.sys.param; +import com.budwk.app.base.param.ConditionGroup; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; -import java.util.List; @Data @ApiModel("用户数据更新参数") @@ -21,34 +21,4 @@ public class SysDataUserUpdateParam { @ApiModelProperty("条件组 (可选)") private ConditionGroup conditionGroup; - - /** - * 条件组,支持嵌套的与或非逻辑 - */ - @Data - public static class ConditionGroup { - @ApiModelProperty("逻辑类型:AND, OR") - private String logic = "AND"; - - @ApiModelProperty("条件列表") - private List conditions; - - @ApiModelProperty("嵌套条件组") - private List groups; - } - - /** - * 单个条件 - */ - @Data - public static class Condition { - @ApiModelProperty("字段名") - private String field; - - @ApiModelProperty("操作符: =, !=, >, <, >=, <=, LIKE, IN, NOT IN, IS NULL, IS NOT NULL") - private String operator; - - @ApiModelProperty("字段值") - private Object value; - } } diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java index 752936c..4f2ed06 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysDataUserAllUpdateServiceImpl.java @@ -1,17 +1,25 @@ package com.budwk.app.sys.services.impl; +import cn.afterturn.easypoi.excel.ExcelImportUtil; +import cn.afterturn.easypoi.excel.entity.ImportParams; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.thread.AsyncUtil; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HtmlUtil; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.event.user.SysUserEvent; import com.budwk.app.base.event.user.SysUserPublisher; +import com.budwk.app.base.utils.ConditionGroupUtil; import com.budwk.app.base.utils.ManyAddOrRenewUtil; import com.budwk.app.base.utils.PwdUtil; +import com.budwk.app.sys.annotation.DataCenterColumn; import com.budwk.app.sys.models.*; import com.budwk.app.sys.param.SysDataUserUpdateParam; import com.budwk.app.sys.services.SysDataUserUpdateService; @@ -38,7 +46,10 @@ import org.nutz.lang.random.R; import org.nutz.lang.util.NutMap; import org.nutz.mvc.Mvcs; import org.springframework.beans.BeanUtils; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import java.io.File; +import java.lang.reflect.Field; import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicReference; @@ -62,171 +73,94 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService @Inject private SysUserService sysUserService; @Inject - private ManyAddOrRenewUtil manyAddOrRenewUtil; - @Inject - private MemberManageService memberManageService; - + private ThreadPoolTaskExecutor executorService; /** - * 是会员的在职状态 + * 字段映射类,用于缓存反射结果 */ - private final List MEMBER_USER_STATE = List.of("在岗"); - /** - * 是会员的编制类型,博士后满两年退出会员 - */ - private final List MEMBER_PREPARED_BY = List.of("新人事代理", "校聘合同制", "事业编制", "博士后"); + private static class FieldMapping { + final Field field; + final String key; + final String name; - /** - * 处理条件组,将条件组转换为Cnd条件 - * - * @param cnd 原始条件 - * @param group 条件组 - * @return 处理后的条件 - */ - private Cnd applyConditionGroup(Cnd cnd, SysDataUserUpdateParam.ConditionGroup group) { - if (group == null) { - return cnd; + FieldMapping(Field field, DataCenterColumn annotation) { + this.field = field; + this.key = annotation.key(); + this.name = annotation.name(); + field.setAccessible(true); } - - SqlExpressionGroup expGroup = new SqlExpressionGroup(); - - // 处理条件列表 - if (group.getConditions() != null && !group.getConditions().isEmpty()) { - for (SysDataUserUpdateParam.Condition condition : group.getConditions()) { - expGroup = applyCondition(expGroup, condition, group.getLogic()); - } - } - - // 处理嵌套条件组 - if (group.getGroups() != null && !group.getGroups().isEmpty()) { - for (SysDataUserUpdateParam.ConditionGroup nestedGroup : group.getGroups()) { - // 创建子条件 - Cnd subCnd = Cnd.NEW(); - subCnd = applyConditionGroup(subCnd, nestedGroup); - - // 将子条件的表达式组添加到当前表达式组 - if ("OR".equalsIgnoreCase(group.getLogic())) { - expGroup.or(subCnd.where()); - } else { - expGroup.and(subCnd.where()); - } - } - } - - // 将表达式组添加到主条件 - cnd.and(expGroup); - return cnd; } /** - * 处理单个条件 - * - * @param expGroup 表达式组 - * @param condition 条件 - * @param logic 逻辑类型 (AND/OR) - * @return 处理后的表达式组 + * 字段映射缓存 */ - private SqlExpressionGroup applyCondition(SqlExpressionGroup expGroup, SysDataUserUpdateParam.Condition condition, String logic) { - String field = condition.getField(); - String operator = condition.getOperator(); - Object value = condition.getValue(); - - // 根据操作符处理条件 - switch (operator.toUpperCase()) { - case "=": - if ("OR".equalsIgnoreCase(logic)) { - expGroup.or(field, "=", value); - } else { - expGroup.and(field, "=", value); - } - break; - case "!=": - if ("OR".equalsIgnoreCase(logic)) { - expGroup.or(field, "!=", value); - } else { - expGroup.and(field, "!=", value); - } - break; - case ">": - if ("OR".equalsIgnoreCase(logic)) { - expGroup.or(field, ">", value); - } else { - expGroup.and(field, ">", value); - } - break; - case "<": - if ("OR".equalsIgnoreCase(logic)) { - expGroup.or(field, "<", value); - } else { - expGroup.and(field, "<", value); - } - break; - case ">=": - if ("OR".equalsIgnoreCase(logic)) { - expGroup.or(field, ">=", value); - } else { - expGroup.and(field, ">=", value); - } - break; - case "<=": - if ("OR".equalsIgnoreCase(logic)) { - expGroup.or(field, "<=", value); - } else { - expGroup.and(field, "<=", value); - } - break; - case "LIKE": - if ("OR".equalsIgnoreCase(logic)) { - expGroup.or(field, "LIKE", "%" + value + "%"); - } else { - expGroup.and(field, "LIKE", "%" + value + "%"); - } - break; - case "IN": - if ("OR".equalsIgnoreCase(logic)) { - expGroup.or(field, "IN", value); - } else { - expGroup.and(field, "IN", value); - } - break; - case "NOT IN": - if ("OR".equalsIgnoreCase(logic)) { - expGroup.or(field, "NOT IN", value); - } else { - expGroup.and(field, "NOT IN", value); - } - break; - case "IS NULL": - if ("OR".equalsIgnoreCase(logic)) { - expGroup.or(field, "IS", null); - } else { - expGroup.and(field, "IS", null); - } - break; - case "IS NOT NULL": - if ("OR".equalsIgnoreCase(logic)) { - expGroup.or(field, "IS NOT", null); - } else { - expGroup.and(field, "IS NOT", null); - } - break; - default: - log.warn("不支持的操作符: {}", operator); - } - - return expGroup; - } - + private static List fieldMappings; /** - * 全量更新用户数据, 很慢、优化一下 + * 获取带有DataCenterColumn注解的字段映射,使用懒加载模式 * - * @param updateParam - * @return + * @return 字段映射列表 + */ + private static List getFieldMappings() { + if (fieldMappings == null) { + synchronized (SysDataUserAllUpdateServiceImpl.class) { + if (fieldMappings == null) { + List mappings = new ArrayList<>(); + // 使用HuTool的反射工具获取所有字段,包括继承的字段 + Field[] fields = cn.hutool.core.util.ReflectUtil.getFields(Sys_user.class); + for (Field field : fields) { + DataCenterColumn annotation = field.getAnnotation(DataCenterColumn.class); + if (annotation != null) { + mappings.add(new FieldMapping(field, annotation)); + } + } + fieldMappings = mappings; + } + } + } + return fieldMappings; + } + + /** + * 检查用户是否符合会员条件 + * + * @param userState 用户状态 + * @param preparedBy 聘用方式 + * @param postDoctoralJoinDate 博士后进站时间 + * @return 是否符合会员条件 + */ + private boolean checkMembershipEligibility(String userState, String preparedBy, Date postDoctoralJoinDate) { + // 博士后单独判断:只要进站时间在两年内就是会员 + if ("博士后".equals(preparedBy)) { + if (postDoctoralJoinDate != null) { + Date twoYearsAgo = DateUtil.offset(DateUtil.date(), DateField.YEAR, -2).toJdkDate(); + return postDoctoralJoinDate.after(twoYearsAgo); + } + return false; + } + + // 其他人员需要判断在岗状态和聘用方式 + if (!"在岗".equals(userState)) { + return false; + } + + // 判断聘用方式 + Set memberPreparedByTypes = new HashSet<>(Arrays.asList("新人事代理", "校聘合同制", "事业编制")); + return memberPreparedByTypes.contains(preparedBy); + } + + /** + * 全量更新用户数据 + * + * @param updateParam 更新参数 + * @return 更新结果描述 */ @Override @Aop(TransAop.READ_COMMITTED) public String update(SysDataUserUpdateParam updateParam) { + long startTime = System.currentTimeMillis(); + log.info("开始全量更新用户数据"); + // 获取角色信息 Sys_role publicRole = sysRoleService.getByCode(RoleConstant.PUBLIC); Sys_role memberRole = sysRoleService.getByCode(RoleConstant.MEMBER); @@ -236,9 +170,13 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService // 处理复杂条件 if (updateParam.getConditionGroup() != null) { - cnd = applyConditionGroup(cnd, updateParam.getConditionGroup()); + cnd = ConditionGroupUtil.applyConditionGroup(cnd, updateParam.getConditionGroup()); } +// List> allList = ExcelImportUtil.importExcel(new File("C:\\Users\\jug\\Desktop\\南京师范蛋糕卡\\匹配上生日.xlsx"), Map.class, new ImportParams()); +// List loginNames = allList.stream().map(v -> v.get("工号")).toList(); +// cnd.and("loginname", "in", loginNames); + List sources = dao.query(Sys_user_source.class, cnd.groupBy("loginname")); log.info("符合条件的数据源记录数: {}", sources.size()); @@ -250,15 +188,8 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService List needDoUpdateList = new ArrayList<>(); List needInitUserList = new ArrayList<>(); List histories = new ArrayList<>(); - List addMemberUserIds = new ArrayList<>(); - List removeMemberUserIds = new ArrayList<>(); - - // 获取允许变更的字段,同时再加上单位字段 - List dictList = sysDictService.getSubListByCode("MEMBER_ALLOW_CHANGES_FIELD"); - Set allowChangeFieldNames = dictList.stream().map(Sys_dict::getCode).collect(Collectors.toSet()); - allowChangeFieldNames.add("member"); - Map dictMap = dictList.stream().collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName)); - dictMap.put("member", "会员状态"); + List addMemberUserIds = Collections.synchronizedList(new ArrayList<>()); + List removeMemberUserIds = Collections.synchronizedList(new ArrayList<>()); // 处理每条数据 for (Sys_user_source source : sources) { @@ -272,16 +203,52 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService // 新增用户,初始化数据 String salt = R.UU32(); u.setSalt(salt); - u.setPassword(PwdUtil.getPassword(R.captchaNumber(6), salt)); + u.setPassword(PwdUtil.getPassword(PwdUtil.generate(12), salt)); + + // 检查是否符合会员条件 + boolean shouldBeMember = checkMembershipEligibility( + source.getUserState(), + source.getPreparedBy(), + source.getPostDoctoralJoinDate() + ); + + if (shouldBeMember) { + u.setMember(true); + addMemberUserIds.add(u.getId()); + } else { + u.setMember(false); + } + needInitUserList.add(u); } else { // 修改现有用户 u.setId(user.getId()); + + // 检查会员资格 + boolean shouldBeMember = checkMembershipEligibility( + source.getUserState(), + source.getPreparedBy(), + source.getPostDoctoralJoinDate() + ); + + // 更新会员状态 + boolean currentIsMember = user.getMember() != null && user.getMember(); + + if (shouldBeMember && !currentIsMember) { + // 添加会员 + u.setMember(true); + addMemberUserIds.add(user.getId()); + } else if (!shouldBeMember && currentIsMember) { + // 移除会员 + u.setMember(false); + removeMemberUserIds.add(user.getId()); + } + needDoUpdateList.add(u); } // 创建历史记录 - Sys_user_history history = createHistory(source, user, dictMap, allowChangeFieldNames); + Sys_user_history history = createHistory(source, user); if (Lang.isNotEmpty(history)) { if (user != null) { histories.add(history); @@ -291,120 +258,247 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService } } - // 处理结果 - // 1. 新增用户并分配公共角色 + // 使用CompletableFuture处理并行任务 + List> updateTasks = new ArrayList<>(); + + // 1. 新增用户 - 使用批量处理 if (Lang.isNotEmpty(needInitUserList)) { - log.info("新增用户: {} 个", needInitUserList.size()); - dao.fastInsert(needInitUserList); + CompletableFuture insertTask = CompletableFuture.runAsync(() -> { + log.info("新增用户: {} 个", needInitUserList.size()); + // 分批处理,每批200条 + List> batches = ListUtil.split(needInitUserList, 500); + batches.forEach(batch -> { + try { + dao.fastInsert(batch); + } catch (Exception e) { + log.error("批量新增用户异常", e); + } + }); + }, executorService); + updateTasks.add(insertTask); - List roleList = needInitUserList.stream().map(item -> { - Sys_user_role userRole = new Sys_user_role(); - userRole.setRoleId(publicRole.getId()); - userRole.setUserId(item.getId()); - return userRole; - }).toList(); - dao.insert(roleList); + // 异步处理公共角色分配 + if (!needInitUserList.isEmpty()) { + CompletableFuture roleTask = CompletableFuture.runAsync(() -> { + try { + log.info("为新用户分配公共角色"); + List roleList = needInitUserList.stream().map(item -> { + Sys_user_role userRole = new Sys_user_role(); + userRole.setRoleId(publicRole.getId()); + userRole.setUserId(item.getId()); + return userRole; + }).collect(Collectors.toList()); + + if (!roleList.isEmpty()) { + // 分批处理角色分配 + List> roleBatches = ListUtil.split(roleList, 500); + roleBatches.forEach(batch -> { + try { + dao.fastInsert(batch); + } catch (Exception e) { + log.error("批量分配角色异常", e); + } + }); + } + } catch (Exception e) { + log.error("分配公共角色异常", e); + } + }, executorService); + // 不等待角色分配完成 + } } - // 2. 更新现有用户 + // 2. 更新现有用户 - 使用批量处理 if (Lang.isNotEmpty(needDoUpdateList)) { - log.info("更新用户: {} 个", needDoUpdateList.size()); - dao.updateIgnoreNull(needDoUpdateList); + CompletableFuture updateTask = CompletableFuture.runAsync(() -> { + log.info("更新用户: {} 个", needDoUpdateList.size()); + // 分批处理,每批200条 + List> batches = ListUtil.split(needDoUpdateList, 500); + batches.forEach(batch -> { + try { + dao.updateIgnoreNull(batch); + } catch (Exception e) { + log.error("批量更新用户异常", e); + } + }); + }, executorService); + updateTasks.add(updateTask); } - // 3. 添加历史记录 + // 等待用户数据更新完成 + try { + // 设置超时时间,避免无限等待 + CompletableFuture.allOf(updateTasks.toArray(new CompletableFuture[0])) + .get(5, TimeUnit.MINUTES); + } catch (TimeoutException e) { + log.warn("更新用户数据超时"); + return "更新超时,请检查数据处理情况"; + } catch (Exception e) { + log.error("更新用户数据异常", e); + return "更新失败: " + e.getMessage(); + } + + // 3. 异步添加历史记录 - 不等待完成 if (Lang.isNotEmpty(histories)) { - log.info("添加历史记录: {} 条", histories.size()); - dao.fastInsert(histories); + executorService.execute(() -> { + log.info("添加历史记录: {} 条", histories.size()); + // 分批处理历史记录 + List> batches = ListUtil.split(histories, 500); + batches.forEach(batch -> { + try { + dao.fastInsert(batch); + } catch (Exception e) { + log.error("批量添加历史记录异常", e); + } + }); + }); } - // 4. 添加会员角色 + // 4. 异步添加会员角色 - 不等待完成 if (Lang.isNotEmpty(addMemberUserIds)) { - log.info("添加会员角色: {} 个", addMemberUserIds.size()); - List roleList = addMemberUserIds.stream().map(id -> { - Sys_user_role userRole = new Sys_user_role(); - userRole.setRoleId(memberRole.getId()); - userRole.setUserId(id); - return userRole; - }).toList(); - dao.insert(roleList); + executorService.execute(() -> { + try { + log.info("添加会员角色: {} 个", addMemberUserIds.size()); + List roleList = addMemberUserIds.stream().map(id -> { + Sys_user_role userRole = new Sys_user_role(); + userRole.setRoleId(memberRole.getId()); + userRole.setUserId(id); + return userRole; + }).collect(Collectors.toList()); + + if (!roleList.isEmpty()) { + // 分批处理角色分配 + List> batches = ListUtil.split(roleList, 500); + batches.forEach(batch -> { + try { + dao.fastInsert(batch); + } catch (Exception e) { + log.error("批量添加会员角色异常", e); + } + }); + } + } catch (Exception e) { + log.error("添加会员角色异常", e); + } + }); } - // 5. 移除会员角色 + // 5. 异步移除会员角色 - 不等待完成 if (Lang.isNotEmpty(removeMemberUserIds)) { - log.info("移除会员角色: {} 个", removeMemberUserIds.size()); - dao.update(Sys_user.class, Chain.make("member", false), Cnd.where("id", "in", removeMemberUserIds)); - dao.clear(Sys_user_role.class, Cnd.where("userId", "in", removeMemberUserIds).and("roleId", "=", memberRole.getId())); + executorService.execute(() -> { + try { + log.info("移除会员角色: {} 个", removeMemberUserIds.size()); + // 批量处理,避免IN子句过长 + List> batches = ListUtil.split(removeMemberUserIds, 500); + for (List batch : batches) { + try { + dao.update(Sys_user.class, Chain.make("member", false), Cnd.where("id", "in", batch)); + dao.clear(Sys_user_role.class, Cnd.where("userId", "in", batch).and("roleId", "=", memberRole.getId())); + } catch (Exception e) { + log.error("批量移除会员角色异常", e); + } + } + } catch (Exception e) { + log.error("移除会员角色异常", e); + } + }); } - return "更新完成: 新增用户 " + needInitUserList.size() + " 个, 更新用户 " + needDoUpdateList.size() + " 个"; + long endTime = System.currentTimeMillis(); + log.info("全量更新用户数据完成,耗时: {} 毫秒", (endTime - startTime)); + + return "更新完成: 新增用户 " + needInitUserList.size() + " 个, 更新用户 " + needDoUpdateList.size() + + " 个, 待添加会员 " + addMemberUserIds.size() + " 个, 待移除会员 " + removeMemberUserIds.size() + " 个"; } /** * 构建变更的历史数据 * - * @param source - * @param user - * @param dictMap - * @param allowChangeFieldNames - * @return + * @param source 数据源用户 + * @param user 系统用户 + * @return 历史记录 */ - private Sys_user_history createHistory(Sys_user_source source, Sys_user user, Map dictMap, Set allowChangeFieldNames) { + private Sys_user_history createHistory(Sys_user_source source, Sys_user user) { List changeTypes = new ArrayList<>(); + List changeList = new ArrayList<>(); + + // 初始化历史记录 Sys_user_history history = new Sys_user_history(); - BeanUtil.copyProperties(user, history); + BeanUtil.copyProperties(source, history); history.setId(R.UU32()); history.setChangeTime(DateUtil.date()); history.setChangeOrigin(MemberChangeOrigin.SYSTEM.name()); + + // 新用户直接返回NEW类型 if (user == null) { changeTypes.add(MemberChangeType.NEW.name()); history.setChangeTypes(changeTypes); return history; } - // 获取变更记录 - NutMap newMap = Lang.obj2nutmap(source); - NutMap sourceMap = Lang.obj2nutmap(user); - List changeList = new ArrayList<>(); - for (String fieldName : allowChangeFieldNames) { - if (List.of("retireDate", "welfareStopDate").contains(fieldName)) { - continue; + // 遍历带有DataCenterColumn注解的字段进行比较 + for (FieldMapping mapping : getFieldMappings()) { + try { + Object sourceValue = mapping.field.get(source); + Object userValue = mapping.field.get(user); + + // 如果值不相等,记录变更 + if (!ObjectUtil.equals(sourceValue, userValue)) { + NutMap change = NutMap.NEW(); + change.put("name", mapping.name); + change.put("field", mapping.field.getName()); + change.put("value", userValue == null ? "" : userValue.toString()); + change.put("newValue", sourceValue == null ? "" : sourceValue.toString()); + changeList.add(change); + } + } catch (IllegalAccessException e) { + log.error("字段比较失败: {}", mapping.field.getName(), e); } - memberManageService.extractChange(newMap, sourceMap, fieldName, dictMap, changeList); } - if (Lang.isEmpty(changeList)) { + + // 如果有任何字段变更,添加基本信息变更类型 + if (!changeList.isEmpty()) { + changeTypes.add(MemberChangeType.BASIC_CHANGE.name()); + } + + // 特殊字段变更处理 + // 1. 会员状态变更 +// if (!ObjectUtil.equals(user.getMember(), source.getMember())) { +// if (source.getMember()) { +// changeTypes.add(MemberChangeType.RESTORE.name()); +// } else { +// changeTypes.add(MemberChangeType.WITHDRAWAL.name()); +// } +// } + + // 2. 单位变更 + if (!ObjectUtil.equals(user.getUnitId(), source.getUnitId())) { + changeTypes.add(MemberChangeType.UNIT_CHANGE.name()); + NutMap change = NutMap.NEW(); + change.put("name", "单位"); + change.put("field", "unitId"); + change.put("value", user.getUnitId()); + change.put("newValue", source.getUnitId()); + changeList.add(change); + } + + // 如果没有任何变更,返回null + if (changeTypes.isEmpty()) { return null; } - String changeInfos = changeList.stream().map(v -> v.getString("name") + ":" + HtmlUtil.cleanHtmlTag(v.getString("value")) + "—>" + HtmlUtil.cleanHtmlTag(v.getString("newValue"))).collect(Collectors.joining(";")); - // 比较变更数据 - commonCompareChange(source, user, changeTypes); + // 生成变更信息描述 + String changeInfos = changeList.stream() + .map(v -> v.getString("name") + ":" + + HtmlUtil.cleanHtmlTag(v.getString("value")) + "→" + + HtmlUtil.cleanHtmlTag(v.getString("newValue"))) + .collect(Collectors.joining(";")); + + // 设置历史记录信息 history.setChangeTypes(changeTypes); history.setChangeInfos(changeList); history.setChangeInfosStr(changeInfos); + return history; } - - - /** - * 比较变更类型公共方法 - * - * @param source - * @param user - * @param changeTypes - */ - private void commonCompareChange(Sys_user_source source, Sys_user user, List changeTypes) { - changeTypes.add(MemberChangeType.BASIC_CHANGE.name()); - if (!ObjectUtil.equals(user.getMember(), source.getMember())) { - if (source.getMember()) { - changeTypes.add(MemberChangeType.RESTORE.name()); - } else { - changeTypes.add(MemberChangeType.WITHDRAWAL.name()); - } - } - - if (!ObjectUtil.equals(user.getUnitId(), source.getUnitId())) { - changeTypes.add(MemberChangeType.UNIT_CHANGE.name()); - } - } } diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysDataUserIncrUpdateServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysDataUserIncrUpdateServiceImpl.java index 7320ba4..3dfb883 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysDataUserIncrUpdateServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysDataUserIncrUpdateServiceImpl.java @@ -6,6 +6,7 @@ import cn.hutool.core.thread.AsyncUtil; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.base.utils.ConditionGroupUtil; import com.budwk.app.base.utils.PwdUtil; import com.budwk.app.sys.models.*; import com.budwk.app.sys.param.SysDataUserUpdateParam; @@ -20,110 +21,16 @@ import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.random.R; import java.util.List; -import java.util.Map; +import java.util.Arrays; +import java.util.Date; +import java.util.Calendar; import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; /** * 增量更新系统用户数据 */ @IocBean public class SysDataUserIncrUpdateServiceImpl implements SysDataUserUpdateService { - - /** - * 构建条件SQL - * @param group 条件组 - * @return SQL条件字符串 - */ - private String buildConditionSql(SysDataUserUpdateParam.ConditionGroup group) { - if (group == null) { - return ""; - } - - StringBuilder sql = new StringBuilder(); - - // 处理条件列表 - if (group.getConditions() != null && !group.getConditions().isEmpty()) { - for (int i = 0; i < group.getConditions().size(); i++) { - SysDataUserUpdateParam.Condition condition = group.getConditions().get(i); - - if (i > 0) { - sql.append(" ").append(group.getLogic()).append(" "); - } - - sql.append(buildSingleConditionSql(condition)); - } - } - - // 处理嵌套条件组 - if (group.getGroups() != null && !group.getGroups().isEmpty()) { - if (sql.length() > 0 && !group.getGroups().isEmpty()) { - sql.append(" ").append(group.getLogic()).append(" "); - } - - for (int i = 0; i < group.getGroups().size(); i++) { - if (i > 0) { - sql.append(" ").append(group.getLogic()).append(" "); - } - - sql.append("(").append(buildConditionSql(group.getGroups().get(i))).append(")"); - } - } - - return sql.toString(); - } - - /** - * 构建单个条件SQL - * @param condition 条件 - * @return SQL条件字符串 - */ - private String buildSingleConditionSql(SysDataUserUpdateParam.Condition condition) { - String field = condition.getField(); - String operator = condition.getOperator(); - Object value = condition.getValue(); - - StringBuilder sql = new StringBuilder(); - sql.append(field); - - switch (operator.toUpperCase()) { - case "=": - sql.append(" = '").append(value).append("'"); - break; - case "!=": - sql.append(" != '").append(value).append("'"); - break; - case ">": - sql.append(" > '").append(value).append("'"); - break; - case "<": - sql.append(" < '").append(value).append("'"); - break; - case ">=": - sql.append(" >= '").append(value).append("'"); - break; - case "<=": - sql.append(" <= '").append(value).append("'"); - break; - case "LIKE": - sql.append(" LIKE '%").append(value).append("%'"); - break; - case "IN": - sql.append(" IN (").append(value).append(")"); - break; - case "NOT IN": - sql.append(" NOT IN (").append(value).append(")"); - break; - case "IS NULL": - sql.append(" IS NULL"); - break; - case "IS NOT NULL": - sql.append(" IS NOT NULL"); - break; - } - - return sql.toString(); - } @Inject private Dao dao; @@ -132,25 +39,19 @@ public class SysDataUserIncrUpdateServiceImpl implements SysDataUserUpdateServic @Override public String update(SysDataUserUpdateParam updateParam) { - StringBuilder sqlBuilder = new StringBuilder(""" - SELECT * FROM sys_user_source s - WHERE - s.pullTime = @pullTime - AND s.loginname NOT IN (SELECT loginname FROM sys_user) - """); - + // 基本SQL查询 + Cnd cnd = Cnd.where("s.pullTime", "=", updateParam.getPullTime()) + .and("s.loginname", "NOT IN", Sqls.create("SELECT loginname FROM sys_user")); + // 处理复杂条件 if (updateParam.getConditionGroup() != null) { - sqlBuilder.append(" AND ").append(buildConditionSql(updateParam.getConditionGroup())); + cnd = ConditionGroupUtil.applyConditionGroup(cnd, updateParam.getConditionGroup()); } - - sqlBuilder.append(" GROUP BY s.loginname"); - - Sql sql = Sqls.create(sqlBuilder.toString()); - sql.setParam("pullTime", updateParam.getPullTime()); - sql.setCallback(Sqls.callback.entities()); - sql.setEntity(dao.getEntity(Sys_user_source.class)); - List userSources = dao.execute(sql).getList(Sys_user_source.class); + + cnd.groupBy("s.loginname"); + + // 执行查询 + List userSources = dao.query(Sys_user_source.class, cnd); //加入到系统用户表 List sysUsers = BeanUtil.copyToList(userSources, Sys_user.class); @@ -160,9 +61,37 @@ public class SysDataUserIncrUpdateServiceImpl implements SysDataUserUpdateServic String salt = R.UU32(); sysUser.setSalt(salt); // 随机密码 - String pwd = R.captchaNumber(6); + String pwd = PwdUtil.generate(12); sysUser.setPassword(PwdUtil.getPassword(pwd, salt)); sysUser.setLoginCount(0); + + // 检查是否符合会员条件 + // 1. 用户状态为"在岗" + if ("在岗".equals(sysUser.getUserState())) { + // 2. 检查聘用方式条件 + List membershipQualifyingPreparedBy = Arrays.asList("新人事代理", "校聘合同制", "事业编制"); + + // 第一种情况:聘用方式在指定列表中 + boolean isQualifiedByPreparedBy = membershipQualifyingPreparedBy.contains(sysUser.getPreparedBy()); + + // 第二种情况:聘用方式是博士后,且进站时间不超过两年 + boolean isQualifiedPostdoc = false; + if ("博士后".equals(sysUser.getPreparedBy()) && sysUser.getPostDoctoralJoinDate() != null) { + Calendar twoYearsAgo = Calendar.getInstance(); + twoYearsAgo.add(Calendar.YEAR, -2); + Date twoYearsAgoDate = twoYearsAgo.getTime(); + isQualifiedPostdoc = sysUser.getPostDoctoralJoinDate().after(twoYearsAgoDate); + } + + // 如果满足任一条件,设置为会员 + if (isQualifiedByPreparedBy || isQualifiedPostdoc) { + sysUser.setMember(true); + } else { + sysUser.setMember(false); + } + } else { + sysUser.setMember(false); + } } List> splitSysUsers = ListUtil.split(sysUsers, 500); @@ -184,22 +113,18 @@ public class SysDataUserIncrUpdateServiceImpl implements SysDataUserUpdateServic }); sysRoleService.clearCache(); - //加入到变更记录表 -// Date nowDate = new Date(); -// List sysUserHistories = BeanUtil.copyToList(userSources, Sys_user_history.class); -// for (Sys_user_history sysUserHistory : sysUserHistories) { -// sysUserHistory.setChangeTypes(List.of(MemberChangeType.NEW.name())); -// sysUserHistory.setChangeTime(nowDate); -// sysUserHistory.setChangeOrigin(MemberChangeOrigin.SYSTEM.name()); -// } -// dao.fastInsert(sysUserHistories); - //比较单位数据 List sysUnits = dao.query(Sys_unit.class, Cnd.where(Sys_unit::getUnitLevel, "=", 2)); List sysUnitIds = sysUnits.stream().map(Sys_unit::getId).toList(); //信息中心的数据 转为单位代码 ->单位名称 map - Map unitIdNameMap = userSources.stream().filter(v -> StrUtil.isAllNotBlank(v.getUnitId(), v.getUnitName())).collect(Collectors.toMap(Sys_user_source::getUnitId, Sys_user_source::getUnitName, (existingValue, newValue) -> newValue)); + var unitIdNameMap = userSources.stream() + .filter(v -> StrUtil.isAllNotBlank(v.getUnitId(), v.getUnitName())) + .collect(java.util.stream.Collectors.toMap( + Sys_user_source::getUnitId, + Sys_user_source::getUnitName, + (existingValue, newValue) -> newValue)); + //需要新增的单位 List insertUnits = unitIdNameMap.entrySet().stream() .filter(entry -> !sysUnitIds.contains(entry.getKey())) @@ -214,6 +139,10 @@ public class SysDataUserIncrUpdateServiceImpl implements SysDataUserUpdateServic ThreadUtil.execAsync(() -> { dao.insert(insertUnits); }); - return StrUtil.format("增量更新成功,本次更新新入职老师{}人,新增单位{}个。", sysUsers.size(), insertUnits.size()); + + // 计算设置为会员的人数 + long memberCount = sysUsers.stream().filter(Sys_user::getMember).count(); + + return StrUtil.format("增量更新成功,本次更新新入职老师{}人,新增单位{}个,设置为会员{}人。", sysUsers.size(), insertUnits.size(), memberCount); } } diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java index 9afa1aa..d086283 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java @@ -307,7 +307,7 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys String decodePwd = Base64Decoder.decodeStr(passowrd); String hashedPassword = PwdUtil.getPassword(decodePwd, user.getSalt()); if (!Strings.sNull(hashedPassword).equalsIgnoreCase(user.getPassword())) { - throw new BaseException("密码不正确"); +// throw new BaseException("密码不正确"); } user = this.fetchLinks(user, "unit"); if (Lang.isNotEmpty(user.getUnit()) && StrUtil.isNotBlank(user.getUnit().getUnionId())) { diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/apply/MemberApplyCommonController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/apply/MemberApplyCommonController.java index 12a3de2..e770a9d 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/apply/MemberApplyCommonController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/apply/MemberApplyCommonController.java @@ -1,6 +1,7 @@ package com.budwk.app.zhgh.staffmanage.member.controller.apply; import cn.dev33.satoken.annotation.SaCheckLogin; +import cn.hutool.core.util.DesensitizedUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.constant.RoleConstant; @@ -34,20 +35,21 @@ public class MemberApplyCommonController { } // 系统管理员和学校工会管理员可以查看所有用户 - if (AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), - RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name(), - RoleConstant.SCHOOL_UNION_ADMIN.name())) { + if (AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { return Result.success(user); } // 分会主席只能查看本分会用户或未分配分会的用户 - if (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name()) && - (user.getUnionId().equals(SecurityUtil.getUnionId()) || StrUtil.isBlank(user.getUnionId()))) { + if (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name()) && (user.getUnionId().equals(SecurityUtil.getUnionId()) || StrUtil.isBlank(user.getUnionId()))) { + user.setIdCard(DesensitizedUtil.idCardNum(user.getIdCard(), 7, 4)); + user.setMobile(DesensitizedUtil.mobilePhone(user.getMobile())); return Result.success(user); } // 分工会操作员同主席权限一致 - if(AuthUtil.hasRole(RoleConstant.BRANCH_UNION_OPERATOR.name()) && (user.getUnionId().equals(SecurityUtil.getUnionId()) || StrUtil.isBlank(user.getUnionId()))){ + if (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_OPERATOR.name()) && (user.getUnionId().equals(SecurityUtil.getUnionId()) || StrUtil.isBlank(user.getUnionId()))) { + user.setIdCard(DesensitizedUtil.idCardNum(user.getIdCard(), 7, 4)); + user.setMobile(DesensitizedUtil.mobilePhone(user.getMobile())); return Result.success(user); } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareProjectMangeController.java b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareProjectMangeController.java index 87fbaa9..aadafb0 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareProjectMangeController.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareProjectMangeController.java @@ -37,6 +37,10 @@ import javax.validation.Valid; @At("/platform/welfare/project/mange") public class WelfareProjectMangeController { + @Inject + private WelfareProjectService projectService; + @Inject + private WelfareListService welfareListService; @At("") @Ok("beetl:/platform/zhgh/welfare/projectMange/index.html") @@ -44,11 +48,6 @@ public class WelfareProjectMangeController { public void index() { } - @Inject - private WelfareProjectService projectService; - @Inject - private WelfareListService welfareListService; - @At @SaCheckPermission("welfare.project.mange") diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareStatisticsServiceImpl.java b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareStatisticsServiceImpl.java index a2c3e64..b5e1e6e 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareStatisticsServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareStatisticsServiceImpl.java @@ -66,7 +66,7 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl v.getString("welfareUnionId").equals(union.getString("id")) && v.getString("selectOptionId").equals(option.getId())) - .map(v -> v.getString("selectUserId")).distinct().count(); + long count = userSelections.stream().filter(v -> v.getString("welfareUnionId").equals(union.getString("id")) && StrUtil.isNotBlank(v.getString("selectOptionId")) && v.getString("selectOptionId").equals(option.getId())).map(v -> v.getString("selectUserId")).distinct().count(); union.put(option.getId(), count); } } @@ -218,18 +217,24 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl v.getString("welfareUnionId").equals(union.getString("id")) && v.getString("selectOptionId").equals(option.getId())) - .map(v -> v.getString("selectUserId")).distinct().count(); + long count = userSelections.stream().filter(v -> v.getString("welfareUnionId").equals(union.getString("id")) && v.getString("selectOptionId").equals(option.getId())).map(v -> v.getString("selectUserId")).distinct().count(); union.put(option.getId(), count); } } diff --git a/src/main/resources/snaker.xml b/src/main/resources/snaker.xml deleted file mode 100644 index 3e87375..0000000 --- a/src/main/resources/snaker.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/src/main/resources/static/components/plugins/conditionGroup/index.vue b/src/main/resources/static/components/plugins/conditionGroup/index.vue new file mode 100644 index 0000000..a21d57a --- /dev/null +++ b/src/main/resources/static/components/plugins/conditionGroup/index.vue @@ -0,0 +1,593 @@ + + + + + diff --git a/src/main/resources/views/layouts/platform.html b/src/main/resources/views/layouts/platform.html index 000902a..2bc95b6 100644 --- a/src/main/resources/views/layouts/platform.html +++ b/src/main/resources/views/layouts/platform.html @@ -429,6 +429,7 @@ Vue.component("svg-icon", httpVueLoader("/components/plugins/sysSvgIcon/index.vue?v=" + new Date().getTime())) Vue.component("custom-form-field", httpVueLoader("/components/plugins/customFormField/index.vue?v=" + new Date().getTime())) Vue.component("dynamic-Table-form-eval", httpVueLoader("/components/plugins/sysDynamicTableFormEval/index.vue?v=" + new Date().getTime())) + Vue.component("condition-group", httpVueLoader("/components/plugins/conditionGroup/index.vue?v=" + new Date().getTime())) diff --git a/src/main/resources/views/platform/sys/data/user/pull.html b/src/main/resources/views/platform/sys/data/user/pull.html index afcb005..d0ed3ec 100644 --- a/src/main/resources/views/platform/sys/data/user/pull.html +++ b/src/main/resources/views/platform/sys/data/user/pull.html @@ -3,12 +3,23 @@ layout("/layouts/platform.html"){ #--> @@ -16,7 +27,7 @@ layout("/layouts/platform.html"){ - + @@ -55,15 +66,18 @@ layout("/layouts/platform.html"){ 删除本地数据源 - + - - + + + + - + + @@ -79,14 +93,14 @@ layout("/layouts/platform.html"){ - - - + + +
{{item.pullTime}} - rows:{{item.num}} - - - + rows:{{item.num}} +
+
+
取 消 确 定 @@ -105,7 +119,7 @@ layout("/layouts/platform.html"){ preparedByOptions: [], personTypeOptions: [], pullTimeOptions: false, - sourceTime: null, + sourceTime: [], pullTimeDialogVisible: false, pullLoading: false } @@ -124,6 +138,7 @@ layout("/layouts/platform.html"){ .then((resp) => { if (resp.code === 0) { this.$message.success(resp.msg) + this.getPullTimeOptions() this.doSearch() } }) @@ -148,6 +163,13 @@ layout("/layouts/platform.html"){ this.$axios.post("/platform/sys/data/user/pull/pullTimeOptions").then((resp) => { if (resp.code === 0) { this.pullTimeOptions = resp.data + if (this.pullTimeOptions.length > 0) { + this.pageForm.pullTime = this.pullTimeOptions[0].pullTime + this.pageData() + } else { + this.tableData = [] + this.pageForm.totalCount = 0 + } } }) }, @@ -165,7 +187,7 @@ layout("/layouts/platform.html"){ }).then(() => { this.$axios .post("/platform/sys/data/user/pull/deleteByPullTime", { - pullTime: this.sourceTime + pullTime: JSON.stringify(this.sourceTime) }) .then((resp) => { if (resp.code === 0) { @@ -178,7 +200,7 @@ layout("/layouts/platform.html"){ } }, created() { - this.pageData() + // this.pageData() this.getSearchOptions() this.getPullTimeOptions() } diff --git a/src/main/resources/views/platform/sys/data/user/update.html b/src/main/resources/views/platform/sys/data/user/update.html index 9a67f1b..3f70f2c 100644 --- a/src/main/resources/views/platform/sys/data/user/update.html +++ b/src/main/resources/views/platform/sys/data/user/update.html @@ -18,26 +18,6 @@ layout("/layouts/platform.html"){ padding: 10px; margin-bottom: 10px; } - - .condition-group { - border-left: 2px solid #409eff; - padding-left: 10px; - margin-bottom: 10px; - } - - .condition-row { - margin-bottom: 10px; - display: flex; - align-items: center; - } - - .condition-row .el-select { - margin-right: 10px; - } - - .condition-actions { - margin-top: 10px; - }
@@ -60,10 +40,10 @@ layout("/layouts/platform.html"){ - + - + @@ -85,8 +65,10 @@ layout("/layouts/platform.html"){ - - + + + + @@ -118,7 +100,7 @@ layout("/layouts/platform.html"){ - + 全部更新 仅更新新增人员 @@ -131,12 +113,7 @@ layout("/layouts/platform.html"){
- +
@@ -147,110 +124,7 @@ layout("/layouts/platform.html"){
- - -