diff --git a/src/main/java/com/budwk/app/MainLauncher.java b/src/main/java/com/budwk/app/MainLauncher.java index 9521656..2f6b025 100644 --- a/src/main/java/com/budwk/app/MainLauncher.java +++ b/src/main/java/com/budwk/app/MainLauncher.java @@ -116,8 +116,8 @@ public class MainLauncher { try { Daos.createTablesInPackage(dao, "com.budwk", false); //通过POJO类修改表结构 -// Daos.migration(dao, "com.budwk", true, false); - Daos.migration(dao, "com.budwk", true, false, false); + Daos.migration(dao, "com.budwk", true, false); +// Daos.migration(dao, "com.budwk", true, false, false); } catch (Exception e) { e.printStackTrace(); } diff --git a/src/main/java/com/budwk/app/sys/annotation/DataCenterColumn.java b/src/main/java/com/budwk/app/sys/annotation/DataCenterColumn.java new file mode 100644 index 0000000..86aab3c --- /dev/null +++ b/src/main/java/com/budwk/app/sys/annotation/DataCenterColumn.java @@ -0,0 +1,21 @@ +package com.budwk.app.sys.annotation; + +import java.lang.annotation.*; + +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +@Documented +public @interface DataCenterColumn { + + /* + * 列名 + */ + String name(); + + /* + * 列key + */ + String key(); + +} 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 daafba5..f2d6ffc 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysDataUserPullController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysDataUserPullController.java @@ -37,6 +37,7 @@ public class SysDataUserPullController { @At @SaCheckPermission("sys.data.user.pull") + @Ok("json:{dateFormat:'yyyy-MM-dd'}") @ApiOperation("分页数据") public Result pageData(@Valid SysDataUserPullPageForm pageForm) { Cnd cnd = Cnd.NEW(); 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 de6f492..4fb937a 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysDataUserUpdateController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysDataUserUpdateController.java @@ -29,6 +29,7 @@ import org.nutz.lang.Lang; import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; import javax.validation.Valid; import java.util.Comparator; @@ -105,7 +106,7 @@ public class SysDataUserUpdateController { @SaCheckPermission("sys.data.user.pull") @SLog(tag = "更新系统用户数据", msg = "更新数据") @ApiOperation("更新数据") - public Result updateUserFormSource(@Valid SysDataUserUpdateParam updateParam) { + public Result updateUserFormSource(@Valid @Param("param") SysDataUserUpdateParam updateParam) { SysDataUpdateMode updateMode = EnumUtil.getBy(SysDataUpdateMode.class, (val) -> val.name().equals(updateParam.getUpdateMode())); if (ObjectUtil.isNull(updateMode)) { return Result.error("更新模式错误,请传入正确的更新模式。"); diff --git a/src/main/java/com/budwk/app/sys/models/Sys_user.java b/src/main/java/com/budwk/app/sys/models/Sys_user.java index c0b1b51..59cce12 100644 --- a/src/main/java/com/budwk/app/sys/models/Sys_user.java +++ b/src/main/java/com/budwk/app/sys/models/Sys_user.java @@ -2,6 +2,7 @@ package com.budwk.app.sys.models; import cn.hutool.json.JSONObject; import com.budwk.app.base.model.BaseModel; +import com.budwk.app.sys.annotation.DataCenterColumn; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -24,7 +25,6 @@ import java.util.List; @TableMeta("{'mysql-charset':'utf8mb4'}") @TableIndexes({@Index(name = "INDEX_SYS_USER_LOGINNAMAE", fields = {"loginname"})}) public class Sys_user extends BaseModel implements Serializable { - private static final long serialVersionUID = 1L; @Name @Comment("ID") @@ -33,18 +33,21 @@ public class Sys_user extends BaseModel implements Serializable { private String id; @Column - @Comment("用户名") + @Comment("工号") @ColDefine(type = ColType.VARCHAR, width = 120) + @DataCenterColumn(name = "工号", key = "zgh") private String loginname; @Column @Comment("姓名") @ColDefine(type = ColType.VARCHAR, width = 100) + @DataCenterColumn(name = "姓名", key = "xm") private String username; @Column @Comment("性别") @ColDefine(type = ColType.VARCHAR, width = 10) + @DataCenterColumn(name = "性别", key = "xbmc") private String sex; @Column @@ -60,106 +63,127 @@ public class Sys_user extends BaseModel implements Serializable { @Column @Comment("出生日期") @ColDefine(type = ColType.DATE) + @DataCenterColumn(name = "出生日期", key = "csrq") private Date birthday; @Column @Comment("政治面貌") @ColDefine(type = ColType.VARCHAR, width = 100) + @DataCenterColumn(name = "政治面貌", key = "zzmmmc") private String political; @Column @ColDefine(type = ColType.DATE) @Comment("入党时间") + @DataCenterColumn(name = "入党时间", key = "rdsj") private Date joinPartyDate; @Column @Comment("民族") @ColDefine(type = ColType.VARCHAR, width = 20) + @DataCenterColumn(name = "民族", key = "mzmc") private String nation; @Column @Comment("籍贯") @ColDefine(type = ColType.VARCHAR, width = 100) + @DataCenterColumn(name = "籍贯", key = "jgmc") private String nativePlace; @Column @Comment("国籍") @ColDefine(type = ColType.VARCHAR, width = 20) + @DataCenterColumn(name = "国籍", key = "gjdqmc") private String nationality; @Column @Comment("证件类型") @ColDefine(type = ColType.VARCHAR, width = 30) + @DataCenterColumn(name = "证件类型", key = "sfzjlxmc") private String idCardType; @Column @Comment("证件号码") @ColDefine(type = ColType.VARCHAR, width = 30) + @DataCenterColumn(name = "证件号码", key = "sfzjh") private String idCard; @Column @Comment("手机号码") @ColDefine(type = ColType.VARCHAR, width = 32) + @DataCenterColumn(name = "手机号码", key = "sjh") private String mobile; @Column @Comment("学历") @ColDefine(type = ColType.VARCHAR, width = 20) + @DataCenterColumn(name = "学历", key = "zgxlmc") private String education; @Column @Comment("学位") @ColDefine(type = ColType.VARCHAR, width = 50) + @DataCenterColumn(name = "学位", key = "zgxwmc") private String academicDegree; @Column @Comment("技术职称") @ColDefine(type = ColType.VARCHAR, width = 50) + @DataCenterColumn(name = "技术职称", key = "zyjszwmc") private String technicalTitle; @Column @Comment("技术职称级别") @ColDefine(type = ColType.VARCHAR, width = 50) + @DataCenterColumn(name = "技术职称级别", key = "zyjszwjbmc") private String technicalTitleLevel; @Column @Comment("职务") @ColDefine(type = ColType.VARCHAR, width = 50) + @DataCenterColumn(name = "职务", key = "gbzw") private String position; @Column @Comment("职务级别") @ColDefine(type = ColType.VARCHAR, width = 50) + @DataCenterColumn(name = "职务级别", key = "gbzwjbmc") private String positionLevel; @Column @Comment("职员级别") @ColDefine(type = ColType.VARCHAR, width = 50) + @DataCenterColumn(name = "职员级别", key = "zydjmc") private String employeeLevel; @Column @Comment("来校时间") @ColDefine(type = ColType.VARCHAR, width = 10) + @DataCenterColumn(name = "来校时间", key = "lxny") private String arrivalAtSchoolDate; @Column @Comment("身份类型") @ColDefine(type = ColType.VARCHAR, width = 30) + @DataCenterColumn(name = "身份类型", key = "grsfmc") private String identityType; @Column @Comment("在职状态") @ColDefine(type = ColType.VARCHAR, width = 30) + @DataCenterColumn(name = "在职状态", key = "jzgdqztmc") private String userState; @Column @Comment("人员类别") @ColDefine(type = ColType.VARCHAR, width = 30) + @DataCenterColumn(name = "人员类别", key = "jzglbmc") private String personType; @Column @Comment("聘用方式") @ColDefine(type = ColType.VARCHAR, width = 30) + @DataCenterColumn(name = "聘用方式", key = "yrfsmc") private String preparedBy; @Column @@ -170,6 +194,7 @@ public class Sys_user extends BaseModel implements Serializable { @Column @Comment("博士后进站时间") @ColDefine(type = ColType.DATE) + @DataCenterColumn(name = "博士后进站时间", key = "bhzjzsj") private Date postDoctoralJoinDate; @Column diff --git a/src/main/java/com/budwk/app/sys/models/Sys_user_source.java b/src/main/java/com/budwk/app/sys/models/Sys_user_source.java index 4171d14..f507c0c 100644 --- a/src/main/java/com/budwk/app/sys/models/Sys_user_source.java +++ b/src/main/java/com/budwk/app/sys/models/Sys_user_source.java @@ -10,7 +10,10 @@ import java.util.Date; @Table("sys_user_source") @TableMeta("{'mysql-charset':'utf8mb4'}") -@TableIndexes({@Index(name = "INDEX_SYS_USER_SOURCE_LOGINNAMAE", fields = {"loginname"}, unique = false)}) +@TableIndexes({ + @Index(name = "INDEX_SYS_USER_SOURCE_LOGINNAMAE", fields = {"loginname"}, unique = false), + @Index(name = "INDEX_SYS_USER_SOURCE_PULLTIME", fields = {"pullTime"}, unique = false) +}) @Comment("系统用户拉取数据表") @Data @EqualsAndHashCode(callSuper = true) 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 1e78fd9..a3ff33e 100644 --- a/src/main/java/com/budwk/app/sys/param/SysDataUserUpdateParam.java +++ b/src/main/java/com/budwk/app/sys/param/SysDataUserUpdateParam.java @@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; +import java.util.List; @Data @ApiModel("用户数据更新参数") @@ -18,4 +19,36 @@ public class SysDataUserUpdateParam { @NotBlank(message = "更新方式不能为空") private String updateMode; + @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 2f58788..752936c 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 @@ -29,6 +29,7 @@ import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; @@ -75,6 +76,147 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService */ private final List MEMBER_PREPARED_BY = List.of("新人事代理", "校聘合同制", "事业编制", "博士后"); + /** + * 处理条件组,将条件组转换为Cnd条件 + * + * @param cnd 原始条件 + * @param group 条件组 + * @return 处理后的条件 + */ + private Cnd applyConditionGroup(Cnd cnd, SysDataUserUpdateParam.ConditionGroup group) { + if (group == null) { + return cnd; + } + + 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; + } + /** * 全量更新用户数据, 很慢、优化一下 @@ -89,23 +231,27 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService Sys_role publicRole = sysRoleService.getByCode(RoleConstant.PUBLIC); Sys_role memberRole = sysRoleService.getByCode(RoleConstant.MEMBER); - //查询数据源 - List sources = dao.query(Sys_user_source.class, Cnd.where(Sys_user_source::getPullTime, "=", updateParam.getPullTime()).groupBy("loginname")); - //查询系统用户 + // 查询数据源 + Cnd cnd = Cnd.where(Sys_user_source::getPullTime, "=", updateParam.getPullTime()); + + // 处理复杂条件 + if (updateParam.getConditionGroup() != null) { + cnd = applyConditionGroup(cnd, updateParam.getConditionGroup()); + } + + List sources = dao.query(Sys_user_source.class, cnd.groupBy("loginname")); + log.info("符合条件的数据源记录数: {}", sources.size()); + + // 查询系统用户 List sysUsers = dao.query(Sys_user.class, Cnd.NEW().groupBy("loginname")); Map userMap = sysUsers.stream().collect(Collectors.toMap(Sys_user::getLoginname, sysUser -> sysUser)); - // 要修改的用户表 - List needDoUpdateList = new CopyOnWriteArrayList<>(); - // 要新增的用户 - List needInitUserList = new CopyOnWriteArrayList<>(); - // 存储人员变更记录的表 - List histories = new CopyOnWriteArrayList<>(); - - // 添加会员角色 - List addMemberUserIds = new CopyOnWriteArrayList<>(); - // 移除会员角色 - List removeMemberUserIds = new CopyOnWriteArrayList<>(); + // 准备数据集合 + 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"); @@ -114,104 +260,86 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService Map dictMap = dictList.stream().collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName)); dictMap.put("member", "会员状态"); - // 创建线程开始更新 - int numberOfThreads = Runtime.getRuntime().availableProcessors() * 2; - List> futures = new CopyOnWriteArrayList<>(); - // 每批处理的数据量,可以根据实际情况调整 - int batchSize = 200; - for (int i = 0; i < sources.size(); i += batchSize) { - final int end = Math.min(i + batchSize, sources.size()); - List batch = sources.subList(i, end); + // 处理每条数据 + for (Sys_user_source source : sources) { + Sys_user user = userMap.get(source.getLoginname()); - CompletableFuture future = CompletableFuture.runAsync(() -> { - for (Sys_user_source source : batch) { - // 获取系统用户 - Sys_user user = userMap.get(source.getLoginname()); + // 创建用户对象 + Sys_user u = new Sys_user(); + BeanUtils.copyProperties(source, u); - // 进入系统的人 - boolean isEnterUser = StrUtil.isNotBlank(source.getPreparedBy()) && MEMBER_PREPARED_BY.contains(source.getPreparedBy()) - && StrUtil.isNotBlank(source.getUserState()) && MEMBER_USER_STATE.contains(source.getUserState()); + if (user == null) { + // 新增用户,初始化数据 + String salt = R.UU32(); + u.setSalt(salt); + u.setPassword(PwdUtil.getPassword(R.captchaNumber(6), salt)); + needInitUserList.add(u); + } else { + // 修改现有用户 + u.setId(user.getId()); + needDoUpdateList.add(u); + } - // 去校验是不是会员 - judgeMember(source, user, addMemberUserIds, removeMemberUserIds, isEnterUser); - - // 中间对象u - Sys_user u = new Sys_user(); - BeanUtils.copyProperties(source, u); - if (user == null && isEnterUser) { - // 新增教工,去初始化数据 - String salt = R.UU32(); - u.setSalt(salt); - // 随机密码 - String pwd = R.captchaNumber(6); - u.setPassword(PwdUtil.getPassword(pwd, salt)); - u.setLoginCount(0); - } else if (user != null) { - // 修改数据 - u.setId(user.getId()); - needDoUpdateList.add(u); - } - - Sys_user_history history = createHistory(source, user, dictMap, allowChangeFieldNames); - if (Lang.isEmpty(history)) { - continue; - } - // 在系统里的人,创建人员变更记录 - if (user != null) { - histories.add(history); - } else { - // 要进系统的,是新入职的也要创建变更记录 - if (isEnterUser && Lang.isNotEmpty(history.getChangeTypes()) && history.getChangeTypes().contains(MemberChangeType.NEW.name())) { - histories.add(history); - needInitUserList.add(u); - } - } + // 创建历史记录 + Sys_user_history history = createHistory(source, user, dictMap, allowChangeFieldNames); + if (Lang.isNotEmpty(history)) { + if (user != null) { + histories.add(history); + } else if (Lang.isNotEmpty(history.getChangeTypes()) && history.getChangeTypes().contains(MemberChangeType.NEW.name())) { + histories.add(history); } - }, Executors.newFixedThreadPool(numberOfThreads)); - futures.add(future); + } } - // 确保线程完全走完 - CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); - - //如果有新用户,增加到用户表同时增加角色 + // 处理结果 + // 1. 新增用户并分配公共角色 if (Lang.isNotEmpty(needInitUserList)) { - sysUserService.fastInsert(needInitUserList); + log.info("新增用户: {} 个", needInitUserList.size()); + dao.fastInsert(needInitUserList); + 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(); - manyAddOrRenewUtil.asyncExecuteFastInsert(roleList, 200); + dao.insert(roleList); } - // 更新需要变更的用户 - manyAddOrRenewUtil.asyncExecuteUpdateIgnoreNull(needDoUpdateList, 200); - // 添加历史记录 - manyAddOrRenewUtil.asyncExecuteFastInsert(histories, 200); + // 2. 更新现有用户 + if (Lang.isNotEmpty(needDoUpdateList)) { + log.info("更新用户: {} 个", needDoUpdateList.size()); + dao.updateIgnoreNull(needDoUpdateList); + } - // 设置和移除会员角色 + // 3. 添加历史记录 + if (Lang.isNotEmpty(histories)) { + log.info("添加历史记录: {} 条", histories.size()); + dao.fastInsert(histories); + } + + // 4. 添加会员角色 if (Lang.isNotEmpty(addMemberUserIds)) { - List roleList = addMemberUserIds.stream().map(v -> { - Sys_user_role role = new Sys_user_role(); - role.setRoleId(memberRole.getId()); - role.setUserId(v); - return role; + 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(); - manyAddOrRenewUtil.asyncExecuteInsert(roleList, 200); -// dao.update(Sys_user.class, Chain.make("member", true), Cnd.where("id", "in", addMemberUserIds)); + dao.insert(roleList); } + // 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())); } - return ""; + return "更新完成: 新增用户 " + needInitUserList.size() + " 个, 更新用户 " + needDoUpdateList.size() + " 个"; } - /** * 构建变更的历史数据 * @@ -247,9 +375,7 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService if (Lang.isEmpty(changeList)) { return null; } - String changeInfos = changeList.stream().map(v -> { - return v.getString("name") + ":" + HtmlUtil.cleanHtmlTag(v.getString("value")) + "—>" + HtmlUtil.cleanHtmlTag(v.getString("newValue")); - }).collect(Collectors.joining(";")); + 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); @@ -269,15 +395,6 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService */ private void commonCompareChange(Sys_user_source source, Sys_user user, List changeTypes) { changeTypes.add(MemberChangeType.BASIC_CHANGE.name()); - -// if (!ObjectUtil.equals(user.getUserState(), source.getUserState())) { -// List list = Arrays.stream(MemberChangeType.values()) -// .filter(v -> v.getChangeTypeName().equals(source.getUserState())).toList(); -// if (Lang.isNotEmpty(list)) { -// changeTypes.add(list.get(0).getType()); -// } -// } - if (!ObjectUtil.equals(user.getMember(), source.getMember())) { if (source.getMember()) { changeTypes.add(MemberChangeType.RESTORE.name()); @@ -290,109 +407,4 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService changeTypes.add(MemberChangeType.UNIT_CHANGE.name()); } } - - - /** - * 判断是否是会员 - * - * @param source - * @param user - */ - private void judgeMember(Sys_user_source source, Sys_user user, List addMemberUserIds, List removeMemberUserIds, boolean isEligibleForMember) { - // 根据上面定义final常量 在职状态、编制类型去判断是不是会员 - if (user == null && isEligibleForMember) { - addMemberUserIds.add(source.getId()); - } else { - if (user == null) { - return; - } - boolean isUserMember = user.getMember(); - - // 判断博士后 - if ("博士后".equals(source.getPreparedBy())) { - if (isUserMember) { - String arrivalDateStr = source.getArrivalAtSchoolDate(); - // 将字符串转换为 DateTime 对象 - DateTime arrivalDate = DateUtil.parse(arrivalDateStr, "yyyy-MM"); - // 获取当前日期 - DateTime currentDate = DateUtil.date(); - // 计算两个日期之间的差异(单位:年) - long yearsDifference = DateUtil.betweenYear(arrivalDate, currentDate, false); - // 判断是否已经过去了两年 - if (yearsDifference >= 2) { - removeMemberUserIds.add(user.getId()); - source.setMember(false); - } - } else { - if (isEligibleForMember) { - addMemberUserIds.add(user.getId()); - source.setMember(true); - } - } - } else { - if (isUserMember && !isEligibleForMember) { - removeMemberUserIds.add(user.getId()); - source.setMember(false); - } else if (!isUserMember && isEligibleForMember) { - addMemberUserIds.add(user.getId()); - source.setMember(true); - } - } - } - } - - - /** - * 数据大批量更新 - * - * @param needDoUpdateList 需要更新的数据 - */ - private void massUpdatesAsync(List needDoUpdateList) { - // 线程去更新 - int numberOfThreads = Runtime.getRuntime().availableProcessors() * 2; - ExecutorService executorService = Executors.newFixedThreadPool(numberOfThreads); - ExecutorCompletionService ecs = new ExecutorCompletionService<>(executorService); - - int batchSize = 200; - // 共享锁 - Lock lock = new ReentrantLock(); - try { - for (int i = 0; i < needDoUpdateList.size(); i += batchSize) { - final int end = Math.min(i + batchSize, needDoUpdateList.size()); - List batch = needDoUpdateList.subList(i, end); - - ecs.submit(() -> { - lock.lock(); - try { - dao.updateIgnoreNull(batch); - } finally { - lock.unlock(); - } - return null; - }); - } - - for (int i = 0; i < needDoUpdateList.size(); i += batchSize) { - try { - Future future = ecs.take(); - future.get(); - } catch (InterruptedException | ExecutionException e) { - Thread.currentThread().interrupt(); - throw new RuntimeException("Error during batch update", e); - } - } - } catch (Exception e) { - log.error("Error in massUpdatesAsync", e); - throw new RuntimeException("Error in massUpdatesAsync", e); - } finally { - executorService.shutdown(); - try { - if (!executorService.awaitTermination(10, TimeUnit.SECONDS)) { - executorService.shutdownNow(); - } - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - } - } } 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 5d977cc..7320ba4 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 @@ -25,10 +25,105 @@ 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; @@ -37,13 +132,21 @@ public class SysDataUserIncrUpdateServiceImpl implements SysDataUserUpdateServic @Override public String update(SysDataUserUpdateParam updateParam) { - Sql sql = Sqls.create(""" + StringBuilder sqlBuilder = new StringBuilder(""" SELECT * FROM sys_user_source s WHERE s.pullTime = @pullTime AND s.loginname NOT IN (SELECT loginname FROM sys_user) - GROUP BY s.loginname """); + + // 处理复杂条件 + if (updateParam.getConditionGroup() != null) { + sqlBuilder.append(" AND ").append(buildConditionSql(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)); diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysDataUserPullServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysDataUserPullServiceImpl.java index 4e4bc32..be79338 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysDataUserPullServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysDataUserPullServiceImpl.java @@ -12,6 +12,7 @@ import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.budwk.app.base.exception.BaseException; import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.sys.annotation.DataCenterColumn; import com.budwk.app.sys.models.Sys_dict; import com.budwk.app.sys.models.Sys_user; import com.budwk.app.sys.models.Sys_user_source; @@ -28,6 +29,7 @@ import org.nutz.json.Json; import org.nutz.lang.util.NutMap; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import java.lang.reflect.Field; import java.util.*; import java.util.stream.Collectors; @@ -44,13 +46,58 @@ public class SysDataUserPullServiceImpl extends BaseServiceImpl super(dao); } + /** + * 字段映射类,用于缓存反射结果 + */ + private static class FieldMapping { + final Field field; + final String key; + + FieldMapping(Field field, String key) { + this.field = field; + this.key = key; + field.setAccessible(true); + } + } + + /** + * 字段映射缓存 + */ + private static List fieldMappings; + + /** + * 获取字段映射,使用懒加载模式 + */ + private static List getFieldMappings() { + if (fieldMappings == null) { + synchronized (SysDataUserPullServiceImpl.class) { + if (fieldMappings == null) { + List mappings = new ArrayList<>(); + Field[] fields = Sys_user.class.getDeclaredFields(); + for (Field field : fields) { + DataCenterColumn annotation = field.getAnnotation(DataCenterColumn.class); + if (annotation != null) { + mappings.add(new FieldMapping(field, annotation.key())); + } + } + fieldMappings = mappings; + } + } + } + return fieldMappings; + } + @Override public void pull() { try { + // 博士后进站日期数据 + Map doctoralData = pullPostDoctoral(); + Date nowDate = new Date(); String appId = "1926887238437818370"; String secret = "32df31fcf4fc43f9a647ee1f47134f36"; - List latestSourceList = new ArrayList<>(); + + List rawDataList = new ArrayList<>(); int skip = 0; int totalCount = 0; boolean firstRequest = true; @@ -68,7 +115,7 @@ public class SysDataUserPullServiceImpl extends BaseServiceImpl reqBody.put("$count", true); reqBody.put("$skip", skip); reqBody.put("$top", 1000); - reqBody.put("$filter", "yrfsmc eq '事业编制' or yrfsmc eq '校聘合同制' or yrfsmc eq '新人事代理' or yrfsmc eq '博士后' or yrfsmc eq '劳动合同'"); +// reqBody.put("$filter", "yrfsmc eq '事业编制' or yrfsmc eq '校聘合同制' or yrfsmc eq '新人事代理' or yrfsmc eq '博士后' or yrfsmc eq '劳动合同'"); httpRequest.body(JSONUtil.toJsonStr(reqBody)); String resBody = httpRequest.execute().body(); @@ -83,76 +130,63 @@ public class SysDataUserPullServiceImpl extends BaseServiceImpl JSONArray value = entries.getJSONArray("value"); if (!value.isEmpty()) { - List list = value.stream().map(v -> { - JSONObject jsonObject = (JSONObject) v; - Sys_user_source sysUser = new Sys_user_source(); - sysUser.setLoginname(jsonObject.getStr("zgh")); - sysUser.setUsername(jsonObject.getStr("xm")); - sysUser.setSex(StrUtil.equals("男性", jsonObject.getStr("xbmc")) ? "男" : StrUtil.equals("女性", jsonObject.getStr("xbmc")) ? "女" : null); - sysUser.setBirthday(jsonObject.getDate("csrq")); - sysUser.setNativePlace(jsonObject.getStr("jgmc")); - sysUser.setNationality(jsonObject.getStr("gjdqmc")); - sysUser.setNation(jsonObject.getStr("mzmc")); - sysUser.setIdCardType(jsonObject.getStr("sfzjlxmc")); - sysUser.setIdCard(jsonObject.getStr("sfzjh")); - sysUser.setPolitical(jsonObject.getStr("zzmmmc")); - sysUser.setUnitName(jsonObject.getStr("dwmc")); - sysUser.setUnitId(jsonObject.getStr("dwdm")); - sysUser.setUserState(jsonObject.getStr("jzgdqztmc")); - sysUser.setPreparedBy(jsonObject.getStr("yrfsmc")); - sysUser.setPersonType(jsonObject.getStr("jzglbmc")); - sysUser.setEducation(jsonObject.getStr("zgxlmc")); - sysUser.setAcademicDegree(jsonObject.getStr("zgxwmc")); - sysUser.setMobile(jsonObject.getStr("sjh")); - sysUser.setJoinPartyDate(jsonObject.getDate("rdsj")); - sysUser.setTechnicalTitle(jsonObject.getStr("zyjszwmc")); - sysUser.setTechnicalTitleLevel(jsonObject.getStr("zyjszwjbmc")); - sysUser.setPosition(jsonObject.getStr("gbzw")); - sysUser.setPositionLevel(jsonObject.getStr("gbzwjbmc")); - sysUser.setEmployeeLevel(jsonObject.getStr("zydjmc")); - sysUser.setArrivalAtSchoolDate(jsonObject.getStr("lxny")); - sysUser.setRetireDate(jsonObject.getDate("yjtxrq")); - sysUser.setIdentityType(jsonObject.getStr("grsfmc")); - sysUser.setPullTime(nowDate); - return sysUser; - }).toList(); - latestSourceList.addAll(list); - skip += list.size(); + // 先收集所有原始数据 + List currentBatch = value.stream().map(v -> (JSONObject) v).toList(); + rawDataList.addAll(currentBatch); + skip += currentBatch.size(); + log.info("数据拉取进度: {}/{}", rawDataList.size(), totalCount); } else { + log.warn("当前批次未获取到数据,skip={}", skip); break; } } while (skip < totalCount); - // 博士后进站日期数据 - Map doctoralData = pullPostDoctoral(); + // 赋值 + List latestSourceList = rawDataList.stream().map(raw -> { + Sys_user_source sysUser = new Sys_user_source(); - // 设置博士后的进站日期 - for (Sys_user_source sysUserSource : latestSourceList) { - if (doctoralData.containsKey(sysUserSource.getLoginname())) { - sysUserSource.setPostDoctoralJoinDate(doctoralData.get(sysUserSource.getLoginname())); + // 使用缓存的字段映射 + for (FieldMapping mapping : getFieldMappings()) { + try { + // 根据字段类型设置值 + if (mapping.field.getType() == String.class) { + // 特殊处理性别字段 + if (mapping.field.getName().equals("sex")) { + String xbmc = raw.getStr(mapping.key); + mapping.field.set(sysUser, StrUtil.equals("男性", xbmc) ? "男" : StrUtil.equals("女性", xbmc) ? "女" : null); + } else { + mapping.field.set(sysUser, raw.getStr(mapping.key)); + } + } else if (mapping.field.getType() == Date.class) { + mapping.field.set(sysUser, raw.getDate(mapping.key)); + } + } catch (IllegalAccessException e) { + log.error("设置字段值失败: {}", mapping.field.getName(), e); + } } - } + // 设置博士后的进站日期 + if (doctoralData.containsKey(sysUser.getLoginname())) { + sysUser.setPostDoctoralJoinDate(doctoralData.get(sysUser.getLoginname())); + } + + // 设置单位相关信息 + sysUser.setUnitName(raw.getStr("dwmc")); + sysUser.setUnitId(raw.getStr("dwdm")); + sysUser.setPullTime(nowDate); + return sysUser; + }).toList(); + + log.info("--------------------"); // 插入到数据库 dao().insert(latestSourceList); - - //异步插入数据 -// List> splitLatestSourceList = ListUtil.split(latestSourceList, 500); -// for (List sysUserSources : splitLatestSourceList) { -// threadPoolTaskExecutor.execute(() -> { -// dao().insert(sysUserSources); -// }); -// } - - - } catch (Exception e) { throw new BaseException("数据拉取失败,{}", e.getMessage()); } } @Async - private void updateDict(List userSources){ + private void updateDict(List userSources) { //判断是否要更新在职状态字典 List sourceUserStates = userSources.stream().map(Sys_user::getUserState).filter(StrUtil::isNotBlank).distinct().toList(); //判断是否要更新学历字典 diff --git a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareListController.java b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareListController.java index 9ff1da3..b7a08d0 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareListController.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareListController.java @@ -46,6 +46,7 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.ByteArrayOutputStream; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -76,6 +77,9 @@ public class WelfareListController { @SaCheckPermission("welfare.list.mange") @Ok("json:{dateFormat:'yyyy-MM-dd'}") public Result pageData(@Valid @Param("pageForm") WelfareListPageForm pageForm) { + if (StrUtil.isBlank(pageForm.getProjectId())) { + return Result.success(new Pagination<>(1, 10, 0, Collections.emptyList())); + } Pagination pagination = welfareListService.pageData(pageForm); return Result.success(pagination); } @@ -108,6 +112,15 @@ public class WelfareListController { return Result.success(); } + @At + @SaCheckPermission("welfare.list.mange") + @ApiOperation("导出") + @Ok("void") + public void exportXlsx(@Param("pageForm") WelfareListPageForm pageForm, HttpServletResponse response) { + welfareListService.exportXlsx(pageForm, response); + } + + @At @SaCheckPermission("welfare.list.mange") @ApiOperation("编辑备注") diff --git a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareSelectionSituationController.java b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareSelectionSituationController.java index e664413..040ac06 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareSelectionSituationController.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/controller/WelfareSelectionSituationController.java @@ -53,58 +53,12 @@ public class WelfareSelectionSituationController { @At @SaCheckPermission("welfare.selection.situation") @ApiOperation("分页查询") + @Ok("json:{dateFormat:'yyyy-MM-dd'}") public Result pageData(@Valid @Param("pageForm") WelfareSelectionSituationPageForm pageForm) { if (StrUtil.isBlank(pageForm.getProjectId())) { return Result.success(new Pagination<>(1, 10, 0, Collections.emptyList())); } - - Sql sql = Sqls.create(""" - SELECT - t1.id, - t1.welfareUnionName, - t1.welfareUnitName, - GROUP_CONCAT(DISTINCT t3.optionName) AS selectedOptions, - GROUP_CONCAT(DISTINCT t2.mobile) AS mobile, - t4.username AS userName, - t4.loginname AS loginName, - t4.sex - FROM - welfare_list t1 - LEFT JOIN welfare_project_user_selection t2 ON t2.welfareId = t1.projectId AND t2.selectUserId = t1.userId - LEFT JOIN welfare_project_subject_option t3 ON t3.id = t2.selectOptionId - LEFT JOIN sys_user t4 ON t4.id = t1.userId - $condition - """); - Cnd cnd = Cnd.NEW(); - cnd.and("t1.projectId", "=", pageForm.getProjectId()); - - if (StrUtil.isNotBlank(pageForm.getUserName())) { - cnd.where().andLike("t4.username", pageForm.getUserName()); - } - if (StrUtil.isNotBlank(pageForm.getLoginName())) { - cnd.where().andLike("t4.loginname", pageForm.getLoginName()); - } - cnd.andEX("t1.welfareUnitId", "in", pageForm.getUnitIds()); - cnd.andEX("t1.welfareUnionId", "=", pageForm.getUnionId()); - - if (pageForm.getIsSelect() != null) { - if (pageForm.getIsSelect()) { - cnd.and("t2.id", "IS NOT", null); - } else { - cnd.and("t2.id", "IS", null); - } - } - - if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { - cnd.asc("welfareUnionName"); - cnd.asc("welfareUnitName"); - } else { - cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); - } - - cnd.groupBy("t1.id"); - sql.setCondition(cnd); - Pagination pagination = welfareListService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + Pagination pagination = situationService.pageData(pageForm); return Result.success(pagination); } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareSelectionSituationPageForm.java b/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareSelectionSituationPageForm.java index 5a29d32..a35a793 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareSelectionSituationPageForm.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/param/WelfareSelectionSituationPageForm.java @@ -15,6 +15,9 @@ public class WelfareSelectionSituationPageForm extends PageForm { @ApiModelProperty("福利项目id") private String projectId; + @ApiModelProperty("福利选项id") + private String welfareOptionId; + @ApiModelProperty("姓名") private String userName; diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareListService.java b/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareListService.java index 0a23c79..6b231b3 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareListService.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareListService.java @@ -45,4 +45,11 @@ public interface WelfareListService extends BaseService { * @param pageForm */ void addWelfareUser(WelfareFilterUserPageForm pageForm); + + /** + * 导出 + * @param pageForm + * @param response + */ + void exportXlsx(WelfareListPageForm pageForm, HttpServletResponse response); } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareSelectionSituationService.java b/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareSelectionSituationService.java index 591f3b7..2d356f8 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareSelectionSituationService.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/WelfareSelectionSituationService.java @@ -1,5 +1,6 @@ package com.budwk.app.zhgh.welfare.service; +import com.budwk.app.base.page.Pagination; import com.budwk.app.base.service.BaseService; import com.budwk.app.zhgh.welfare.model.WelfareList; import com.budwk.app.zhgh.welfare.param.WelfareSelectionSituationPageForm; @@ -8,6 +9,8 @@ import javax.servlet.http.HttpServletResponse; public interface WelfareSelectionSituationService extends BaseService { + Pagination pageData(WelfareSelectionSituationPageForm pageForm); + void exportXlsx(WelfareSelectionSituationPageForm pageForm, HttpServletResponse response); } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java index fbffcc4..d8b04a3 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareListServiceImpl.java @@ -395,7 +395,7 @@ public class WelfareListServiceImpl extends BaseServiceImpl impleme $condition """); Cnd cnd = Cnd.NEW(); - cnd.and("t1.projectId","=",pageForm.getProjectId()); + cnd.and("t1.projectId", "=", pageForm.getProjectId()); if (StrUtil.isNotBlank(pageForm.getUserName())) { cnd.where().andLike("t2.username", pageForm.getUserName()); } @@ -412,7 +412,12 @@ public class WelfareListServiceImpl extends BaseServiceImpl impleme cnd.andEX("t1.personType", "in", pageForm.getPersonTypes()); cnd.andEX("t1.preparedBy", "in", pageForm.getPreparedBys()); cnd.andEX("t1.userState", "in", pageForm.getUserStates()); - + if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { + cnd.asc("t1.welfareUnionName"); + cnd.asc("t1.welfareUnitName"); + } else { + cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + } sql.setCondition(cnd); Pagination pagination = listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); return pagination; @@ -543,4 +548,70 @@ public class WelfareListServiceImpl extends BaseServiceImpl impleme log.info("选择用户生成福利名单,筛选条件:{},筛选结果条数:{}", Json.toJson(pageForm), welfareList.size()); dao().insert(welfareList); } + + @Override + public void exportXlsx(WelfareListPageForm pageForm, HttpServletResponse response) { + Sql sql = Sqls.create(""" + SELECT + t1.*, + t2.loginname, + t2.username, + t2.sex, + DATE_FORMAT(t2.birthday, '%Y-%m-%d') AS birthday + FROM + `welfare_list` t1 + LEFT JOIN sys_user t2 ON t2.id = t1.userId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("t1.projectId", "=", pageForm.getProjectId()); + if (StrUtil.isNotBlank(pageForm.getUserName())) { + cnd.where().andLike("t2.username", pageForm.getUserName()); + } + if (StrUtil.isNotBlank(pageForm.getLoginName())) { + cnd.where().andLike("t2.loginname", pageForm.getLoginName()); + } + cnd.andEX("t2.sex", "=", pageForm.getSex()); + cnd.andEX("t2.birthday", "=", pageForm.getBirthday()); + if (pageForm.getBirthMonths() != null && pageForm.getBirthMonths().length > 0) { + cnd.andEX("MONTH(t2.birthday)", "in", pageForm.getBirthMonths()); + } + cnd.andEX("t1.welfareUnitId", "in", pageForm.getUnitIds()); + cnd.andEX("t1.welfareUnionId", "=", pageForm.getUnionId()); + cnd.andEX("t1.personType", "in", pageForm.getPersonTypes()); + cnd.andEX("t1.preparedBy", "in", pageForm.getPreparedBys()); + cnd.andEX("t1.userState", "in", pageForm.getUserStates()); + + if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { + cnd.asc("t1.welfareUnionName"); + cnd.asc("t1.welfareUnitName"); + } else { + cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + } + + sql.setCondition(cnd); + List list = listMap(sql); + + List entities = new ArrayList<>(); + entities.add(new ExcelExportEntity("工号", "loginname", 20)); + entities.add(new ExcelExportEntity("姓名", "username", 20)); + entities.add(new ExcelExportEntity("性别", "sex", 20)); + entities.add(new ExcelExportEntity("出生日期", "birthday", 20)); + entities.add(new ExcelExportEntity("人员类型", "personType", 20)); + entities.add(new ExcelExportEntity("聘用方式", "preparedBy", 20)); + entities.add(new ExcelExportEntity("在职状态", "userState", 20)); + entities.add(new ExcelExportEntity("所属工会", "welfareUnionName", 20)); + entities.add(new ExcelExportEntity("所属单位", "welfareUnitName", 20)); + entities.add(new ExcelExportEntity("备注", "remark", 20)); + + // 设置导出参数 + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + // 导出Excel并下载 + try (Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entities, list)) { + CommonDownloadUtil.download("福利名单.xlsx", workbook, response); + } catch (Exception e) { + log.error("导出Excel失败", e); + } + } } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareProjectServiceImpl.java b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareProjectServiceImpl.java index 1687d6d..7f103fc 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareProjectServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareProjectServiceImpl.java @@ -87,13 +87,10 @@ public class WelfareProjectServiceImpl extends BaseServiceImpl i @Override @Aop(TransAop.READ_COMMITTED) public void deleteWelfare(String id) { - WelfareProjectSubject welfareProjectSubject = dao().fetch(WelfareProjectSubject.class, Cnd.where("projectId", "=", id)); - dao().clear(WelfareProjectSubject.class, Cnd.where("projectId", "=", id)); - dao().clear(WelfareProjectSubjectOption.class, Cnd.where("subjectId", "=", welfareProjectSubject.getId())); - dao().clear(WelfareUserSelection.class, Cnd.where("welfareId", "=", id)); + dao().clear(WelfareProjectSubjectOption.class, Cnd.where(WelfareProjectSubjectOption::getWelfareId, "=", id)); + dao().clear(WelfareUserSelection.class, Cnd.where(WelfareUserSelection::getWelfareId, "=", id)); + dao().clear(WelfareList.class, Cnd.where(WelfareList::getProjectId, "=", id)); delete(id); - dao().clear(WelfareList.class, Cnd.where("projectId", "=", id)); - //删除首页活动 dao().clear(Sys_home_activity.class, Cnd.where("id", "=", id)); } diff --git a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java index 9812dda..205d9ac 100644 --- a/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/welfare/service/impl/WelfareSelectionSituationServiceImpl.java @@ -5,6 +5,8 @@ import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.result.Result; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.PageUtil; @@ -31,6 +33,59 @@ public class WelfareSelectionSituationServiceImpl extends BaseServiceImpl
@@ -52,10 +51,10 @@ layout("/layouts/platform.html"){ - 拉取信息中心数据 + 拉取信息中心数据 删除本地数据源 - + @@ -103,11 +102,12 @@ layout("/layouts/platform.html"){ return { unitNameOptions: [], userStateOptions: [], - preparedByOptions:[], - personTypeOptions: [], + preparedByOptions: [], + personTypeOptions: [], pullTimeOptions: false, sourceTime: null, - pullTimeDialogVisible: false + pullTimeDialogVisible: false, + pullLoading: false } }, methods: { @@ -118,12 +118,18 @@ layout("/layouts/platform.html"){ cancelButtonText: "取消" }) .then(() => { - this.$axios.post("/platform/sys/data/user/pull/pullData").then((resp) => { - if (resp.code === 0) { - this.$message.success(resp.msg) - this.doSearch() - } - }) + this.pullLoading = true + this.$axios + .post("/platform/sys/data/user/pull/pullData") + .then((resp) => { + if (resp.code === 0) { + this.$message.success(resp.msg) + this.doSearch() + } + }) + .finally(() => { + this.pullLoading = false + }) }) .catch(() => {}) }, 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 5fc6770..9a67f1b 100644 --- a/src/main/resources/views/platform/sys/data/user/update.html +++ b/src/main/resources/views/platform/sys/data/user/update.html @@ -7,9 +7,37 @@ layout("/layouts/platform.html"){ width: 100%; margin-bottom: 10px; } - .pullTimeRadioGroup .el-radio.is-bordered + .el-radio.is-bordered{ + + .pullTimeRadioGroup .el-radio.is-bordered + .el-radio.is-bordered { margin-left: 0; } + + .condition-builder { + border: 1px solid #dcdfe6; + border-radius: 4px; + 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; + }
@@ -50,8 +78,8 @@ layout("/layouts/platform.html"){ @@ -75,12 +103,8 @@ layout("/layouts/platform.html"){ - - - + @@ -101,6 +125,20 @@ layout("/layouts/platform.html"){ + + + + +
+ + +
+
取 消 @@ -109,8 +147,110 @@ layout("/layouts/platform.html"){
+ + +