From 0ab932e213f5878c77ec3085f3b024edfcd6bda1 Mon Sep 17 00:00:00 2001 From: Paidax Date: Tue, 23 Sep 2025 09:53:41 +0800 Subject: [PATCH 1/5] commit --- .../app/sys/annotation/DataCenterColumn.java | 2 + .../sys/controller/SysUnionController.java | 3 +- .../app/sys/controller/SysUnitController.java | 5 +- .../app/sys/enums/Api2FinanceFiledMap.java | 31 + .../budwk/app/sys/enums/Api2UnitFiledMap.java | 32 + .../sys/listener/SysRoleEventListener.java | 11 +- .../budwk/app/sys/models/Sys_data_dict.java | 34 ++ .../com/budwk/app/sys/models/Sys_user.java | 114 ++-- .../impl/SysDataDictPullServiceImpl.java | 106 ++++ .../impl/SysDataUnitPullServiceImpl.java | 113 ++++ .../impl/SysDataUserAllUpdateServiceImpl.java | 48 +- .../impl/SysDataUserPullServiceImpl.java | 232 ++++++-- .../ActivityBasicUnionController.java | 3 +- .../TeacherCongressDelegationController.java | 3 +- .../WorkerCongressDelegationController.java | 3 +- .../member/constant/MemberChangeType.java | 48 +- .../change/MemberChangeApplyController.java | 2 + .../change/MemberChangeManageController.java | 84 ++- .../info/MemberInfoBoardController.java | 2 +- .../member/service/MemberCommonService.java | 7 + .../service/impl/MemberManageServiceImpl.java | 14 +- .../module/activity/UserDataScope.vue | 2 +- .../components/module/activity/UserScope.vue | 2 +- .../views/platform/sys/data/user/update.html | 524 ++++++++-------- .../platform/zhgh/benefit/userList/index.html | 2 +- .../zhgh/benefit/userSelectionList/index.html | 2 +- .../club/infoManage/manage/clubInfoManage.js | 2 +- .../dayofficework/integral/manage/index.html | 2 +- .../member/apply/common/commonQuery.js | 2 +- .../member/apply/submit/index.html | 2 +- .../branch/verification/check/index.html | 2 +- .../member/change/common/commonQuery.js | 2 +- .../change/common/memberAllChangeInfo.js | 48 +- .../member/change/common/memberChange.js | 560 ++++++++---------- .../member/change/manage/index.html | 12 +- .../member/change/record/index.html | 2 +- .../member/change/submit/form.html | 2 +- .../member/change/submit/index.html | 10 +- .../member/info/history/index.html | 2 +- .../member/modelworker/manage/index.html | 2 +- .../verification/check/schoolViewAndHandle.js | 2 +- .../verification/check/viewChangeTypeUser.js | 2 +- .../verification/manage/verificationQuery.js | 2 +- .../manage/verificationSetUserList.js | 2 +- .../manage/verificationShowSelectionUsers.js | 2 +- .../statistics/comprehensive/index.html | 345 ++++++----- .../statistics/comprehensive/queryForm.js | 406 ++++++++----- .../zhgh/staffmanage/membercost/config.html | 2 +- .../zhgh/staffmanage/membercost/summary.html | 2 +- .../singleTeacher/ledger/index.html | 4 +- .../sourcechange/manage/index.html | 2 +- .../specialstaff/manage/index.html | 2 +- .../staffmanage/thirtyTeach/manage/index.html | 2 +- src/test/java/com/budwk/app/JugTest.java | 38 +- 54 files changed, 1754 insertions(+), 1138 deletions(-) create mode 100644 src/main/java/com/budwk/app/sys/enums/Api2FinanceFiledMap.java create mode 100644 src/main/java/com/budwk/app/sys/enums/Api2UnitFiledMap.java create mode 100644 src/main/java/com/budwk/app/sys/models/Sys_data_dict.java create mode 100644 src/main/java/com/budwk/app/sys/services/impl/SysDataDictPullServiceImpl.java create mode 100644 src/main/java/com/budwk/app/sys/services/impl/SysDataUnitPullServiceImpl.java diff --git a/src/main/java/com/budwk/app/sys/annotation/DataCenterColumn.java b/src/main/java/com/budwk/app/sys/annotation/DataCenterColumn.java index 86aab3c2..55a1c73c 100644 --- a/src/main/java/com/budwk/app/sys/annotation/DataCenterColumn.java +++ b/src/main/java/com/budwk/app/sys/annotation/DataCenterColumn.java @@ -18,4 +18,6 @@ public @interface DataCenterColumn { */ String key(); + // 字典码表名称 + String dict() default ""; } diff --git a/src/main/java/com/budwk/app/sys/controller/SysUnionController.java b/src/main/java/com/budwk/app/sys/controller/SysUnionController.java index c45c602c..91fd02a0 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysUnionController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysUnionController.java @@ -353,7 +353,8 @@ public class SysUnionController { @ApiOperation("分工会组成单位穿梭框数据") @SaCheckPermission("sys.manager.union.partUnit") public Result branchUnionPartUnitTransferData(String unionId) { - List units = dao.query(Sys_unit.class, Cnd.where("unitLevel", "=", 2).asc("unitcode")); +// List units = dao.query(Sys_unit.class, Cnd.where("unitLevel", "=", 2).asc("unitcode")); + List units = dao.query(Sys_unit.class, Cnd.where("unitTypeCode", "=", "1").asc("unitcode")); List selectUnitIds = units.stream().filter(unit -> StrUtil.isNotBlank(unit.getUnionId()) && unit.getUnionId().equals(unionId)).map(Sys_unit::getId).toList(); List matchUnits = units.stream().filter(unit -> StrUtil.isBlank(unit.getUnionId()) || (StrUtil.isNotBlank(unit.getUnionId()) && unit.getUnionId().equals(unionId))).toList(); NutMap transferData = NutMap.NEW().addv("selectUnitIds", selectUnitIds).addv("allUnits", matchUnits); diff --git a/src/main/java/com/budwk/app/sys/controller/SysUnitController.java b/src/main/java/com/budwk/app/sys/controller/SysUnitController.java index 64895c29..085fad50 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysUnitController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysUnitController.java @@ -77,7 +77,10 @@ public class SysUnitController { @SaCheckLogin public Object pageData(PageForm pageForm, String unitName, Integer unitLevel) { Cnd cnd = Cnd.NEW(); - cnd.and("parentId", "is not", null).andEX("unitLevel", "=", unitLevel).asc("unitLevel").asc("unitcode"); +// cnd.and("parentId", "is not", null).andEX("unitLevel", "=", unitLevel).asc("unitLevel").asc("unitcode"); + cnd.and("parentId", "is not", null) + .and("unitTypeCode", "=", "1") + .asc("unitcode"); cnd.and(Cnd.likeEX("name", unitName)); Pagination listPage = sysUnitService.listPage(pageForm.getPageNumber(), pageForm.getPageSize(), Sys_unit.class, cnd); diff --git a/src/main/java/com/budwk/app/sys/enums/Api2FinanceFiledMap.java b/src/main/java/com/budwk/app/sys/enums/Api2FinanceFiledMap.java new file mode 100644 index 00000000..6c628064 --- /dev/null +++ b/src/main/java/com/budwk/app/sys/enums/Api2FinanceFiledMap.java @@ -0,0 +1,31 @@ +package com.budwk.app.sys.enums; + +import lombok.Getter; + +/** + * @version 1.0 + * @Author zzr + * @name:Api2FinanceFiledMap + * @Date 2025/9/16 9:51 + * @注释 财务会费字段映射 + */ +@Getter +public enum Api2FinanceFiledMap { + + // 工号 + RYDM("rydm", "loginname"), + // 人员名称 + RYMC("rymc", "username"), + // 编制会费 + HF("hf", "name"), + // 合同制会费 + HF2("hf2", "unitType"); + + public final String apiField; + public final String dbColumn; + + Api2FinanceFiledMap(String apiField, String dbColumn) { + this.apiField = apiField; + this.dbColumn = dbColumn; + } +} diff --git a/src/main/java/com/budwk/app/sys/enums/Api2UnitFiledMap.java b/src/main/java/com/budwk/app/sys/enums/Api2UnitFiledMap.java new file mode 100644 index 00000000..57a6f008 --- /dev/null +++ b/src/main/java/com/budwk/app/sys/enums/Api2UnitFiledMap.java @@ -0,0 +1,32 @@ +package com.budwk.app.sys.enums; + +import lombok.Getter; + +/** + * @version 1.0 + * @Author zzr + * @name:Api2UnitFiledMap + * @Date 2025/9/16 8:52 + * @注释 单位接口转单位字段映射 + */ +@Getter +public enum Api2UnitFiledMap { + + ZZJGDM("zzjgdm", "id"), + ZZJGMC("zzjgmc", "name"), + FJZZJGDM("fjzzjgdm", "parentId"), + JDCJDM("jdcjdm", "unitLevel"), + CJ_XYDWH("cj_xydwh", "divisionCollegeCode"), + JGLX("jglx", "institutionType"), + BMLB("bmlb", "unitType"); +// SFQY("sfqy", "delFlag"); + + public final String apiField; + public final String dbColumn; + + Api2UnitFiledMap(String apiField, String dbColumn) { + this.apiField = apiField; + this.dbColumn = dbColumn; + } + +} diff --git a/src/main/java/com/budwk/app/sys/listener/SysRoleEventListener.java b/src/main/java/com/budwk/app/sys/listener/SysRoleEventListener.java index 24f90de3..4743830f 100644 --- a/src/main/java/com/budwk/app/sys/listener/SysRoleEventListener.java +++ b/src/main/java/com/budwk/app/sys/listener/SysRoleEventListener.java @@ -85,22 +85,27 @@ public class SysRoleEventListener implements RoleEventListener { * @param message 订阅消息 */ private void removeRole(RoleEventMsg message) { + Sys_role role = dao.fetch(Sys_role.class, Cnd.where("code", "=", message.getRoleCode())); + if (ObjectUtil.isEmpty(role)) { + return; + } + // 判断传过来的东西 if (ObjectUtil.isAllNotEmpty(message.getUserIds(), message.getUnitId(), message.getRoleCode())) { dao.clear(Sys_user_role.class, Cnd.where("userId", "in", message.getUserIds()) .and("unitId", "=", message.getUnitId()) - .and("roleCode", "=", message.getRoleCode()) + .and("roleId", "=", role.getId()) ); } else if (ObjectUtil.isAllNotEmpty(message.getUserIds(), message.getRoleCode())) { dao.clear(Sys_user_role.class, Cnd.where("userId", "in", message.getUserIds()) - .and("roleCode", "=", message.getRoleCode()) + .and("roleId", "=", role.getId()) ); } else if (ObjectUtil.isAllNotEmpty(message.getUnitId(), message.getUnitId())) { dao.clear(Sys_user_role.class, Cnd.where("unitId", "in", message.getUnitId()) - .and("roleCode", "=", message.getRoleCode()) + .and("roleId", "=", role.getId()) ); } } diff --git a/src/main/java/com/budwk/app/sys/models/Sys_data_dict.java b/src/main/java/com/budwk/app/sys/models/Sys_data_dict.java new file mode 100644 index 00000000..f15c8662 --- /dev/null +++ b/src/main/java/com/budwk/app/sys/models/Sys_data_dict.java @@ -0,0 +1,34 @@ +package com.budwk.app.sys.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.*; + +/** + * @version 1.0 + * @Author zzr + * @name:Sys_data_dict + * @Date 2025/9/22 16:43 + * @注释 + */ +@Data +@Table +@EqualsAndHashCode(callSuper = true) +public class Sys_data_dict extends BaseModel { + + @Column + @Comment("父级编码") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String parentCode; + + @Column + @Comment("名称") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String name; + + @Column + @Comment("编码") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String code; +} 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 a664a5e2..d287b1a5 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 @@ -11,6 +11,7 @@ import org.nutz.dao.interceptor.annotation.PrevInsert; import org.nutz.json.JsonField; import java.io.Serializable; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Date; import java.util.List; @@ -35,7 +36,7 @@ public class Sys_user extends BaseModel implements Serializable { @Column @Comment("工号") @ColDefine(type = ColType.VARCHAR, width = 120) - @DataCenterColumn(name = "工号", key = "zgh") + @DataCenterColumn(name = "工号", key = "gh") private String loginname; @Column @@ -47,7 +48,6 @@ public class Sys_user extends BaseModel implements Serializable { @Column @Comment("性别") @ColDefine(type = ColType.VARCHAR, width = 10) - @DataCenterColumn(name = "性别", key = "xbmc") private String sex; @Column @@ -69,37 +69,36 @@ public class Sys_user extends BaseModel implements Serializable { @Column @Comment("政治面貌") @ColDefine(type = ColType.VARCHAR, width = 100) - @DataCenterColumn(name = "政治面貌", key = "zzmmmc") + @DataCenterColumn(name = "政治面貌", key = "zzmmm", dict = "USER_POLITICAL") 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") + @DataCenterColumn(name = "民族", key = "mzm", dict = "USER_NATION") private String nation; @Column @Comment("籍贯") @ColDefine(type = ColType.VARCHAR, width = 100) - @DataCenterColumn(name = "籍贯", key = "jgmc") + @DataCenterColumn(name = "籍贯", key = "dqm") private String nativePlace; @Column @Comment("国籍") @ColDefine(type = ColType.VARCHAR, width = 20) - @DataCenterColumn(name = "国籍", key = "gjdqmc") + @DataCenterColumn(name = "国籍", key = "gjdqm", dict = "USER_NATIONALITY") private String nationality; @Column @Comment("证件类型") @ColDefine(type = ColType.VARCHAR, width = 30) - @DataCenterColumn(name = "证件类型", key = "sfzjlxmc") + @DataCenterColumn(name = "证件类型", key = "sfzjlxm", dict = "USER_IDENTITY_TYPE") private String idCardType; @Column @@ -111,60 +110,79 @@ public class Sys_user extends BaseModel implements Serializable { @Column @Comment("手机号码") @ColDefine(type = ColType.VARCHAR, width = 32) - @DataCenterColumn(name = "手机号码", key = "sjh") +// @DataCenterColumn(name = "手机号码", key = "sjh") private String mobile; @Column @Comment("学历") @ColDefine(type = ColType.VARCHAR, width = 20) - @DataCenterColumn(name = "学历", key = "zgxlmc") +// @DataCenterColumn(name = "学历", key = "zgxlmc") private String education; @Column @Comment("婚姻状况") @ColDefine(type = ColType.VARCHAR, width = 20) + @DataCenterColumn(name = "婚姻状况", key = "hyztm", dict = "USER_MARRIAGE") private String marriage; @Column @Comment("学位") @ColDefine(type = ColType.VARCHAR, width = 50) - @DataCenterColumn(name = "学位", key = "zgxwmc") +// @DataCenterColumn(name = "学位", key = "zgxwmc") private String academicDegree; @Column - @Comment("技术职称") + @Comment("岗位类别") @ColDefine(type = ColType.VARCHAR, width = 50) - @DataCenterColumn(name = "技术职称", key = "zyjszwmc") - private String technicalTitle; + @DataCenterColumn(name = "岗位类别", key = "prgw") + private String jobCategory; @Column - @Comment("技术职称级别") + @Comment("职称") @ColDefine(type = ColType.VARCHAR, width = 50) - @DataCenterColumn(name = "技术职称级别", key = "zyjszwjbmc") - private String technicalTitleLevel; + @DataCenterColumn(name = "职称", key = "zc") + private String professionalTitle; @Column - @Comment("职务") + @Comment("职级") @ColDefine(type = ColType.VARCHAR, width = 50) - @DataCenterColumn(name = "职务", key = "gbzw") - private String position; + @DataCenterColumn(name = "职级", key = "zj") + private String professionalLevel; @Column - @Comment("职务级别") + @Comment("职工来源") @ColDefine(type = ColType.VARCHAR, width = 50) - @DataCenterColumn(name = "职务级别", key = "gbzwjbmc") + @DataCenterColumn(name = "职工来源", key = "zgly") + private String employeeSource; + + @Column + @Comment("行政级别(用于管理岗位)") + @ColDefine(type = ColType.VARCHAR, width = 50) + @DataCenterColumn(name = "行政级别(用于管理岗位)", key = "xzjb") + private String administrativeLevel; + + @Column + @Comment("岗位系列") + @ColDefine(type = ColType.VARCHAR, width = 50) + @DataCenterColumn(name = "岗位系列", key = "gwxl") + private String positionSeries; + + @Column + @Comment("岗级") + @ColDefine(type = ColType.VARCHAR, width = 50) + @DataCenterColumn(name = "岗级", key = "gj") private String positionLevel; @Column - @Comment("职员级别") + @Comment("行政岗级") @ColDefine(type = ColType.VARCHAR, width = 50) - @DataCenterColumn(name = "职员级别", key = "zydjmc") - private String employeeLevel; + @DataCenterColumn(name = "行政岗级", key = "xzgj") + private String administrativePositionLevel; @Column @Comment("来校时间") @ColDefine(type = ColType.VARCHAR, width = 10) - @DataCenterColumn(name = "来校时间", key = "lxny") + @DataCenterColumn(name = "来校时间", key = "lxrq") private String arrivalAtSchoolDate; @Column @@ -176,21 +194,33 @@ public class Sys_user extends BaseModel implements Serializable { @Column @Comment("在职状态") @ColDefine(type = ColType.VARCHAR, width = 30) - @DataCenterColumn(name = "在职状态", key = "jzgdqztmc") + @DataCenterColumn(name = "在岗状态", key = "zgzt") private String userState; @Column - @Comment("人员类别") + @Comment("教职工类别码") @ColDefine(type = ColType.VARCHAR, width = 30) - @DataCenterColumn(name = "人员类别", key = "jzglbmc") + @DataCenterColumn(name = "教职工类别码", key = "jzglbm", dict = "USER_PERSON_TYPE") private String personType; @Column - @Comment("聘用方式") + @Comment("编制类别码") @ColDefine(type = ColType.VARCHAR, width = 30) - @DataCenterColumn(name = "聘用方式", key = "yrfsmc") + @DataCenterColumn(name = "编制类别码", key = "bzlxm", dict = "USER_PREPARED_BY_TYPE") private String preparedBy; + @Column + @Comment("从教年月") + @ColDefine(type = ColType.DATE) + @DataCenterColumn(name = "从教年月", key = "cjny") + private Date teachingTime; + + @Column + @Comment("预计离校时间/最后离校时间") + @ColDefine(type = ColType.DATE) + @DataCenterColumn(name = "预计离校时间/最后离校时间", key = "yjlxsj") + private Date expectedLeaveSchoolDate; + @Column @Comment("退休时间") @ColDefine(type = ColType.DATE) @@ -199,7 +229,7 @@ public class Sys_user extends BaseModel implements Serializable { @Column @Comment("博士后进站时间") @ColDefine(type = ColType.DATE) - @DataCenterColumn(name = "博士后进站时间", key = "bhzjzsj") +// @DataCenterColumn(name = "博士后进站时间", key = "bhzjzsj") private Date postDoctoralJoinDate; @Column @@ -252,6 +282,16 @@ public class Sys_user extends BaseModel implements Serializable { @ColDefine(type = ColType.DATETIME) private Date memberTime; + @Column + @Comment("编制会费") + @ColDefine(customType = "decimal(10,2)") + private BigDecimal preparationMemberFee; + + @Column + @Comment("合同制会费") + @ColDefine(customType = "decimal(10,2)") + private BigDecimal contractMemberFee; + @Column @Comment("是否福利会员") @ColDefine(type = ColType.BOOLEAN) @@ -280,16 +320,6 @@ public class Sys_user extends BaseModel implements Serializable { @ColDefine(type = ColType.VARCHAR, customType = "text") private String personalData; - @Column - @Comment("是否是劳模") - @ColDefine(type = ColType.BOOLEAN) - @Default(value = "0") - private Boolean isModelWorker; - - @Column - @Comment("劳模资料") - @ColDefine(type = ColType.MYSQL_JSON) - private List modelWorkerFiles; @Column @Comment("常用审批意见") diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysDataDictPullServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysDataDictPullServiceImpl.java new file mode 100644 index 00000000..a0be87f2 --- /dev/null +++ b/src/main/java/com/budwk/app/sys/services/impl/SysDataDictPullServiceImpl.java @@ -0,0 +1,106 @@ +package com.budwk.app.sys.services.impl; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.budwk.app.base.config.DataCenterProperties; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.sys.models.Sys_data_dict; +import com.budwk.app.sys.models.Sys_dict; +import com.budwk.app.sys.services.SysDataDictPullService; +import com.budwk.app.sys.services.SysDictService; +import lombok.extern.slf4j.Slf4j; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.aop.Aop; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.util.NutMap; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @version 1.0 + * @Author zzr + * @name:SysDataDictPullServiceImpl + * @Date 2025/9/22 11:37 + * @注释 + */ +@Slf4j +@IocBean(args = {"refer:dao"}) +public class SysDataDictPullServiceImpl extends BaseServiceImpl implements SysDataDictPullService { + + @Inject + private DataCenterProperties dcPro; + @Inject + private SysDictService dictService; + + // code + private final static String KEY_PREFIX = "user_"; + + public SysDataDictPullServiceImpl(Dao dao) { + super(dao); + } + + @Override + @Aop(TransAop.READ_COMMITTED) + public void pullDataDict() { + Map urls = dcPro.getUrls(); + List list = urls.keySet().stream().filter(o -> o.startsWith(KEY_PREFIX.toUpperCase())).toList(); + + List dataDictList = new ArrayList<>(); + + for (String key : list) { + // 获取配置 + DataCenterProperties.Credential credential = dcPro.credential(key); + String url = credential.getUrl(); + String token = credential.getToken(); + + // 请求数据 + HttpRequest httpRequest = HttpUtil.createPost(url); + httpRequest.header("Content-Type", "application/json"); + httpRequest.header("X-H3C-TOKEN", token); + httpRequest.body(JSONUtil.toJsonStr(Map.of())); + + String resBody = httpRequest.execute().body(); + JSONObject jsonBody = JSONUtil.parseObj(resBody); + + if (jsonBody.getInt("code") != 200) { + log.error("获取{}字典数据失败,错误码: {};错误原因:{}", key, jsonBody.getInt("code"), jsonBody.getStr("msg")); + } + List data = Json.fromJsonAsList(NutMap.class, jsonBody.getStr("data")); + + // 先删除 + Sys_dict sysDict = dao().fetch(Sys_dict.class, Cnd.where(Sys_dict::getCode, "=", key)); + dao().clear(Sys_dict.class, Cnd.where(Sys_dict::getParentId, "=", sysDict.getId())); + + // 组合数据 + data.forEach(o -> { + Sys_dict dict = new Sys_dict(); + dict.setParentId(sysDict.getId()); + + dict.setPath(dictService.getSubPath("sys_dict", "path", sysDict.getPath())); + dict.setName(o.getString("xbname")); + dict.setCode(o.getString("xbname")); + dict.setDisabled(false); + dict.setHasChildren(false); + dao().insert(dict); + + Sys_data_dict sysDataDict = new Sys_data_dict(); + sysDataDict.setParentCode(key); + sysDataDict.setCode(o.getString("xbcode")); + sysDataDict.setName(o.getString("xbname")); + + dataDictList.add(sysDataDict); + + }); + + dao().insert(dataDictList); + } + } +} diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysDataUnitPullServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysDataUnitPullServiceImpl.java new file mode 100644 index 00000000..81813462 --- /dev/null +++ b/src/main/java/com/budwk/app/sys/services/impl/SysDataUnitPullServiceImpl.java @@ -0,0 +1,113 @@ +package com.budwk.app.sys.services.impl; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.budwk.app.base.config.DataCenterProperties; +import com.budwk.app.base.exception.BaseException; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.sys.enums.Api2UnitFiledMap; +import com.budwk.app.sys.models.Sys_unit; +import com.budwk.app.sys.services.SysDataUnitPullService; +import com.budwk.app.sys.utils.DataCenterUtil; +import lombok.extern.slf4j.Slf4j; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.aop.Aop; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @version 1.0 + * @Author zzr + * @name:SysDataUnitPullServiceImpl + * @Date 2025/9/15 17:52 + * @注释 + */ +@Slf4j +@IocBean(args = {"refer:dao"}) +public class SysDataUnitPullServiceImpl extends BaseServiceImpl implements SysDataUnitPullService { + + @Inject + private DataCenterProperties dcPro; + + public SysDataUnitPullServiceImpl(Dao dao) { + super(dao); + } + + + @Override + @Aop(TransAop.READ_COMMITTED) + public void updateUnits() { + Sql sql = Sqls.create("select id from sys_unit group by id"); + sql.setCallback(Sqls.callback.strList()); + dao().execute(sql); + List unitIds = sql.getList(String.class); + updateUnits(unitIds); + } + + /** + * 拉取单位数据 + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public void updateUnits(List unitIds) { + // 获取配置 + DataCenterProperties.Credential credential = dcPro.credential("unit"); + String url = credential.getUrl(); + String token = credential.getToken(); + + // 请求数据 + HttpRequest httpRequest = HttpUtil.createPost(url); + httpRequest.header("Content-Type", "application/json"); + httpRequest.header("X-H3C-TOKEN", token); + httpRequest.body(JSONUtil.toJsonStr(Map.of())); + + String resBody = httpRequest.execute().body(); + JSONObject jsonBody = JSONUtil.parseObj(resBody); + + if (jsonBody.getInt("code") != 200) { + throw new BaseException("获取单位数据失败,错误码: " + jsonBody.getInt("code") + ";错误原因:" + jsonBody.getStr("msg")); + } + + // 需要新增的单位 + List insertList = new ArrayList<>(); + // 需要更新的单位 + List updateList = new ArrayList<>(); + + // 拉取过来的数据,全部的单位,一万四千多条,这里只保留 “部门类” + List data = jsonBody.getJSONArray("data").stream() + .map(o -> (JSONObject) o) + .filter(row -> StrUtil.isNotBlank(row.getStr("bmlb"))) + .toList(); + + Map api2db = Arrays.stream(Api2UnitFiledMap.values()) + .collect(Collectors.toMap(e -> e.apiField, e -> e.dbColumn)); + for (JSONObject row : data) { + Sys_unit unit = DataCenterUtil.mapJsonToBean(row, Sys_unit.class, api2db); + unit.setUnitcode(unit.getId()); + unit.setUnitTypeCode(unit.getUnitType().contains("部门") ? 1 : 0); + + if (unitIds.contains(unit.getId())) { + // 存在则更新 + updateList.add(unit); + } else { + // 不存在则新增 + insertList.add(unit); + } + } + log.info("本次拉取单位数据,新增{}条,更新{}条", insertList.size(), updateList.size()); + dao().insert(insertList); + dao().update(updateList); + } +} 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 2b6b9ea2..ddb53f1a 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 @@ -9,7 +9,6 @@ import cn.hutool.http.HtmlUtil; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.event.role.RoleEventMsg; import com.budwk.app.base.event.role.RoleEventPublisher; -import com.budwk.app.base.utils.ConditionGroupUtil; import com.budwk.app.base.utils.PwdUtil; import com.budwk.app.sys.annotation.DataCenterColumn; import com.budwk.app.sys.models.*; @@ -37,7 +36,10 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.lang.reflect.Field; import java.util.*; -import java.util.concurrent.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.stream.Collectors; /** @@ -153,7 +155,7 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService // 处理复杂条件 if (updateParam.getConditionGroup() != null) { - cnd = ConditionGroupUtil.applyConditionGroup(cnd, updateParam.getConditionGroup()); +// cnd = ConditionGroupUtil.applyConditionGroup(cnd, updateParam.getConditionGroup()); } List sources = dao.query(Sys_user_source.class, cnd.groupBy("loginname")); @@ -184,42 +186,20 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService u.setSalt(salt); u.setPassword(PwdUtil.getPassword(PwdUtil.generate(12), salt)); - // 检查是否符合会员条件 - boolean shouldBeMember = checkMembershipEligibility( - source.getUserState(), - source.getPreparedBy(), - source.getPostDoctoralJoinDate() - ); - - if (shouldBeMember) { - u.setMember(true); + if (u.getMember()) { 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); + if (!currentIsMember) { addMemberUserIds.add(user.getId()); - } else if (!shouldBeMember && currentIsMember) { - // 移除会员 - u.setMember(false); + } else{ removeMemberUserIds.add(user.getId()); } @@ -431,9 +411,9 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService // 如果值不相等,记录变更 if (!ObjectUtil.equals(sourceValue, userValue)) { NutMap change = NutMap.NEW(); - change.put("name", mapping.name); + change.put("fieldName", mapping.name); change.put("field", mapping.field.getName()); - change.put("value", userValue == null ? "" : userValue.toString()); + change.put("sourceValue", userValue == null ? "" : userValue.toString()); change.put("newValue", sourceValue == null ? "" : sourceValue.toString()); changeList.add(change); } @@ -461,9 +441,9 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService if (!ObjectUtil.equals(user.getUnitId(), source.getUnitId())) { changeTypes.add(MemberChangeType.UNIT_CHANGE.name()); NutMap change = NutMap.NEW(); - change.put("name", "单位"); + change.put("fieldName", "单位"); change.put("field", "unitId"); - change.put("value", user.getUnitId()); + change.put("sourceValue", user.getUnitId()); change.put("newValue", source.getUnitId()); changeList.add(change); } @@ -475,8 +455,8 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService // 生成变更信息描述 String changeInfos = changeList.stream() - .map(v -> v.getString("name") + ":" + - HtmlUtil.cleanHtmlTag(v.getString("value")) + "→" + + .map(v -> v.getString("fieldName") + ":" + + HtmlUtil.cleanHtmlTag(v.getString("sourceValue")) + "→" + HtmlUtil.cleanHtmlTag(v.getString("newValue"))) .collect(Collectors.joining(";")); 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 da537e96..e2cc0fbd 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 @@ -1,35 +1,46 @@ package com.budwk.app.sys.services.impl; import cn.hutool.core.codec.Base64; -import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.IdcardUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.digest.DigestUtil; +import cn.hutool.http.Header; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import com.budwk.app.base.config.DataCenterProperties; 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.enums.Api2FinanceFiledMap; +import com.budwk.app.sys.models.Sys_data_dict; 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; +import com.budwk.app.sys.services.SysDataUnitPullService; import com.budwk.app.sys.services.SysDataUserPullService; import com.budwk.app.sys.services.SysDictService; +import com.budwk.app.sys.utils.DataCenterUtil; import lombok.extern.slf4j.Slf4j; import org.nutz.aop.interceptor.async.Async; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Cnd; import org.nutz.dao.Dao; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; +import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; -import org.nutz.json.Json; import org.nutz.lang.util.NutMap; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.lang.reflect.Field; +import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +51,10 @@ public class SysDataUserPullServiceImpl extends BaseServiceImpl @Inject private SysDictService sysDictService; @Inject + private DataCenterProperties dataCenterProperties; + @Inject + private SysDataUnitPullService sysDataUnitPullService; + @Inject private ThreadPoolTaskExecutor threadPoolTaskExecutor; public SysDataUserPullServiceImpl(Dao dao) { @@ -52,10 +67,12 @@ public class SysDataUserPullServiceImpl extends BaseServiceImpl private static class FieldMapping { final Field field; final String key; + final String dict; - FieldMapping(Field field, String key) { + FieldMapping(Field field, String key, String dict) { this.field = field; this.key = key; + this.dict = dict; field.setAccessible(true); } } @@ -77,7 +94,7 @@ public class SysDataUserPullServiceImpl extends BaseServiceImpl for (Field field : fields) { DataCenterColumn annotation = field.getAnnotation(DataCenterColumn.class); if (annotation != null) { - mappings.add(new FieldMapping(field, annotation.key())); + mappings.add(new FieldMapping(field, annotation.key(), annotation.dict())); } } fieldMappings = mappings; @@ -88,58 +105,48 @@ public class SysDataUserPullServiceImpl extends BaseServiceImpl } @Override + @Aop(TransAop.READ_COMMITTED) public Date pull() { try { - // 博士后进站日期数据 - Map doctoralData = pullPostDoctoral(); + // 获取数据中心的字典 + List dataDictList = dao().query(Sys_data_dict.class, Cnd.NEW()); + // 字典码表Map,key为父级编码,value为子级字典列表 + Map> dataDictMap = dataDictList.stream().collect(Collectors.groupingBy(Sys_data_dict::getParentCode)); - Date nowDate = new Date(); - String appId = "1926887238437818370"; - String secret = "32df31fcf4fc43f9a647ee1f47134f36"; + Map financeUserMap = pullFinance(); +// // 博士后进站日期数据 +// Map doctoralData = pullPostDoctoral(); + + // 获取配置文件 接口地址 和 token + DataCenterProperties.Credential credential = dataCenterProperties.credential("teacher"); + String url = credential.getUrl(); + String token = credential.getToken(); + + // 请求数据 + HttpRequest httpRequest = HttpUtil.createPost(url); + httpRequest.header("Content-Type", "application/json"); + httpRequest.header("X-H3C-TOKEN", token); + httpRequest.body(JSONUtil.toJsonStr(Map.of())); + + String resBody = httpRequest.execute().body(); + JSONObject jsonBody = JSONUtil.parseObj(resBody); + + if (jsonBody.getInt("code") != 200) { + throw new BaseException("获取人员数据失败,错误码: " + jsonBody.getInt("code") + ";错误原因:" + jsonBody.getStr("msg")); + } List rawDataList = new ArrayList<>(); - int skip = 0; - int totalCount = 0; - boolean firstRequest = true; - do { - long ts = System.currentTimeMillis(); - String sign = Base64.encode(DigestUtil.md5Hex(appId + secret + ts, CharsetUtil.CHARSET_UTF_8)); + JSONArray data = jsonBody.getJSONArray("data"); - HttpRequest httpRequest = HttpUtil.createPost("https://sjzcpt.nnu.edu.cn/cdsp/data-api/v2/DS0026"); - httpRequest.header("Content-Type", "application/json"); - httpRequest.header("appId", appId); - httpRequest.header("timestamp", String.valueOf(ts)); - httpRequest.header("sign", sign); + if (!data.isEmpty()) { + // 先收集所有原始数据 + rawDataList = data.stream().map(v -> (JSONObject) v).toList(); + log.info("数据拉取进度: {}/{}", rawDataList.size(), jsonBody.getInt("total")); + } else { + log.warn("当前未获取到数据"); + } - HashMap reqBody = new HashMap<>(); - 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 '劳动合同'"); - - httpRequest.body(JSONUtil.toJsonStr(reqBody)); - String resBody = httpRequest.execute().body(); - - JSONObject entries = JSONUtil.parseObj(resBody); - - if (firstRequest) { - totalCount = entries.getInt("@odata.count", 0); - firstRequest = false; - } - - JSONArray value = entries.getJSONArray("value"); - - if (!value.isEmpty()) { - // 先收集所有原始数据 - 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); + Date nowDate = new Date(); // 赋值 List latestSourceList = rawDataList.stream().map(raw -> { @@ -150,12 +157,25 @@ public class SysDataUserPullServiceImpl extends BaseServiceImpl 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); + + if (StrUtil.isNotBlank(mapping.dict)) { + Sys_data_dict sysDataDict = dataDictMap.get(mapping.dict).stream() + .filter(v -> raw.getStr(mapping.key) + .equals(v.getCode())).findFirst().orElse(new Sys_data_dict()); + mapping.field.set(sysUser, sysDataDict.getName()); } else { - mapping.field.set(sysUser, raw.getStr(mapping.key)); + // 特殊处理 根据身份证号获取性别和出生年月 + if ("sfzjh".equals(mapping.field.getName())) { + String idCard = raw.getStr(mapping.key); + if (StrUtil.isNotBlank(idCard)) { + int gender = IdcardUtil.getGenderByIdCard(idCard); + // 性别(1 : 男 , 0 : 女) + sysUser.setSex(gender == 1 ? "男" : "女"); + mapping.field.set(sysUser, raw.getStr(mapping.key)); + } + } else { + mapping.field.set(sysUser, raw.getStr(mapping.key)); + } } } else if (mapping.field.getType() == Date.class) { mapping.field.set(sysUser, raw.getDate(mapping.key)); @@ -165,22 +185,40 @@ public class SysDataUserPullServiceImpl extends BaseServiceImpl } } - // 设置博士后的进站日期 - if (doctoralData.containsKey(sysUser.getLoginname())) { - sysUser.setPostDoctoralJoinDate(doctoralData.get(sysUser.getLoginname())); + // 设置单位相关信息 + sysUser.setUnitId(raw.getStr("dwh")); + sysUser.setPullTime(nowDate); + + // 判断财务信息有没有值, + if (financeUserMap.containsKey(sysUser.getLoginname())) { + NutMap nutMap = financeUserMap.get(sysUser.getLoginname()); + sysUser.setMember(true); + sysUser.setWelfareMember(true); + sysUser.setPreparationMemberFee(BigDecimal.valueOf(nutMap.getDouble("preparationMemberFee"))); + sysUser.setContractMemberFee(BigDecimal.valueOf(nutMap.getDouble("contractMemberFee"))); + } else { + sysUser.setMember(false); + sysUser.setWelfareMember(false); } - // 设置单位相关信息 - sysUser.setUnitName(raw.getStr("dwmc")); - sysUser.setUnitId(raw.getStr("dwdm")); - sysUser.setPullTime(nowDate); return sysUser; }).toList(); - log.info("--------------------"); + log.info("用户数据初始化完成,等待插入,当前数据条数{}", latestSourceList.size()); // 插入到数据库 dao().insert(latestSourceList); + // 人员的单位数据和数据库的单位数据比较,如果人员里面有单位不存在,去更新单位数据 + List sourceUnitIds = latestSourceList.stream().map(Sys_user_source::getUnitId).distinct().toList(); + Sql sql = Sqls.create("select id from sys_unit group by id"); + sql.setCallback(Sqls.callback.strList()); + dao().execute(sql); + List unitIds = sql.getList(String.class); + + if (!new HashSet<>(unitIds).containsAll(sourceUnitIds)) { + log.info("单位需要更新,正在同步更新"); + sysDataUnitPullService.updateUnits(unitIds); + } return nowDate; } catch (Exception e) { throw new BaseException("数据拉取失败,{}", e.getMessage()); @@ -346,4 +384,74 @@ public class SysDataUserPullServiceImpl extends BaseServiceImpl """); return listMap(sql); } + + + @Override + public Map pullFinance() { + // 获取配置文件 接口地址 和 token + DataCenterProperties.Credential credential = dataCenterProperties.credential("finance"); + String url = credential.getUrl(); + String token = credential.getToken(); + + List rawDataList = new ArrayList<>(); + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth() + 1); + + int pageNum = 1; + int pageSize = 1000; + int totalPages = 1; + int totalCount = 0; + do { + HttpRequest httpRequest = HttpUtil.createPost(url); + httpRequest.header(Header.CONTENT_TYPE, "application/json"); + httpRequest.header("Accept-Encoding", "gzip, deflate, br"); + httpRequest.header("X-H3C-TOKEN", token); + Map reqBody = Map.of( + "nf", year, + "yf", month, + "pageNum", pageNum, + "pageSize", pageSize + ); + httpRequest.body(JSONUtil.toJsonStr(reqBody)); + + JSONObject resp = JSONUtil.parseObj(httpRequest.execute().body()); + if (resp.getInt("code") != 0) { + throw new BaseException("获取财务数据失败,错误码: " + resp.getInt("code") + ";错误原因:" + resp.getStr("msg")); + } + + JSONObject data = resp.getJSONObject("data"); + if (pageNum == 1) { + totalCount = data.getInt("total", 0); +// totalPages = data.getInt("pages", 0); + totalPages = (int) Math.ceil((double) totalCount / pageSize); + } + + JSONArray records = data.getJSONArray("records"); + if (CollUtil.isNotEmpty(records)) { + rawDataList.addAll(records.stream().map(v -> (JSONObject) v).toList()); + log.info("数据拉取进度: {}/{}", rawDataList.size(), totalCount); + } + pageNum++; // 只加页码 + } while (pageNum <= totalPages); + + // 接口数据输出 + log.info("数据拉取结果: {}", rawDataList); + + // 最后结果数据 + Map result = new HashMap<>(); + + Map api2db = Arrays.stream(Api2FinanceFiledMap.values()) + .collect(Collectors.toMap(e -> e.apiField, e -> e.dbColumn)); + + for (JSONObject row : rawDataList) { + NutMap nutMap = DataCenterUtil.mapJsonToBean(row, NutMap.class, api2db); + result.put(nutMap.getString("loginname"), nutMap); + } + + // 输出结果 + log.info("财务数据拉取转换结果: {}", result); + + log.info("数据拉取完成,共拉取 {} 条数据", result.size()); + return result; + } } diff --git a/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicUnionController.java b/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicUnionController.java index 29689842..135a6ec5 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicUnionController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/basic/controller/ActivityBasicUnionController.java @@ -244,7 +244,8 @@ public class ActivityBasicUnionController { @At public Result branchUnionPartUnitTransferData(String unionId) { - List units = dao.query(ActivityBasicUnit.class, Cnd.where("unitLevel", "=", 2).asc("unitcode")); +// List units = dao.query(ActivityBasicUnit.class, Cnd.where("unitLevel", "=", 2).asc("unitcode")); + List units = dao.query(ActivityBasicUnit.class, Cnd.where("unitTypeCode", "=", "1").asc("unitcode")); List selectUnitIds = units.stream().filter(unit -> StrUtil.isNotBlank(unit.getUnionId()) && unit.getUnionId().equals(unionId)).map(ActivityBasicUnit::getId).toList(); NutMap transferData = NutMap.NEW().addv("selectUnitIds", selectUnitIds).addv("allUnits", units); return Result.success(transferData); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java index d7947674..05c7282f 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegation/controller/TeacherCongressDelegationController.java @@ -169,7 +169,8 @@ public class TeacherCongressDelegationController { seg.orEX("id", "not in", unitIds); seg.orEX("id", "in", selectUnitIds); - Cnd cnd = Cnd.where("unitLevel", "=", 2); +// Cnd cnd = Cnd.where("unitLevel", "=", 2); + Cnd cnd = Cnd.where("unitTypeCode", "=", "1"); if (!seg.isEmpty()) { cnd.and(seg); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/workercongress/controller/WorkerCongressDelegationController.java b/src/main/java/com/budwk/app/zhgh/democratic/workercongress/controller/WorkerCongressDelegationController.java index c01cfcb5..4b0d4421 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/workercongress/controller/WorkerCongressDelegationController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/workercongress/controller/WorkerCongressDelegationController.java @@ -174,7 +174,8 @@ public class WorkerCongressDelegationController { seg.orEX("id", "not in", unitIds); seg.orEX("id", "in", selectUnitIds); - Cnd cnd = Cnd.where("unitLevel", "=", 2); +// Cnd cnd = Cnd.where("unitLevel", "=", 2); + Cnd cnd = Cnd.where("unitTypeCode", "=", "1"); if (!seg.isEmpty()) { cnd.and(seg); } diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/constant/MemberChangeType.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/constant/MemberChangeType.java index 60d47d98..48e80c5f 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/constant/MemberChangeType.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/constant/MemberChangeType.java @@ -17,20 +17,42 @@ import lombok.Getter; public enum MemberChangeType { //变更类型 - NEW("新入职"), - RESTORE("入会"), - WITHDRAWAL("退会"), - WORK("在职"), - LEAVE_SCHOOL("离校"), - RETIRE("退休"), - RESIGN("辞职"), - OUT("调出"), - LEAVE_OFFICE("离职"), - OTHER("其他减员"), - UNIT_CHANGE("单位异动"), - UNION_CHANGE("工会关系异动"), - BASIC_CHANGE("基本信息异动"); + NEW("NEW", "新入职"), + RESTORE("RESTORE", "入会"), + WITHDRAWAL("WITHDRAWAL", "退会"), + + ONLINE("ONLINE", "在岗"), + FLEX("FLEX", "柔性"), + SECONDED("SECONDED", "借调挂职"), + REMOTE_POST("REMOTE_POST", "异地任职"), + REHIRE_INNER("REHIRE_INNER", "内退返岗"), + + SHORT_TRIP("SHORT_TRIP", "短期公差"), + DOMESTIC_MEET("DOMESTIC_MEET", "境内会务"), + QUARANTINE("QUARANTINE", "疫期隔离"), + SICK_LEAVE("SICK_LEAVE", "病假"), + PERSONAL_LEAVE("PERSONAL_LEAVE", "事假"), + NURSING_LEAVE("NURSING_LEAVE", "哺乳假"), + + MATERNITY("MATERNITY", "产假"), + LONG_SICK("LONG_SICK", "长病假"), + ABROAD_PUB("ABROAD_PUB", "公派出国"), + STUDY_DOMESTIC("STUDY_DOMESTIC", "国内进修"), + STUDY_ABROAD("STUDY_ABROAD", "境外留学"), + OFF_JOB_START("OFF_JOB_START", "离岗创业"), + INNER_RETIRE("INNER_RETIRE", "内部退养"), + + EXTEND("EXTEND", "延聘"), + REHIRE_SCH("REHIRE_SCH", "学校返聘"), + REHIRE_DEPT("REHIRE_DEPT", "部门返聘"), + + OFFLINE("OFFLINE", "不在岗"), + + UNIT_CHANGE("UNIT_CHANGE", "单位异动"), + UNION_CHANGE("UNION_CHANGE", "工会关系异动"), + BASIC_CHANGE("BASIC_CHANGE", "基本信息异动"); + private final String code; private final String changeTypeName; } diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeApplyController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeApplyController.java index 183e86c6..59e7adb0 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeApplyController.java @@ -92,6 +92,7 @@ public class MemberChangeApplyController { // 开启流程实例 Dict args = Dict.create(); + args.set("origin", "personType"); args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode()); args.set(FlowConst.FORM_DATA, memberChangeRecord); ProcessInstance instance = flowEngine.startProcessInstanceByKey("HYBG", memberChangeRecord.getId(), SecurityUtil.getUserId(), args); @@ -116,6 +117,7 @@ public class MemberChangeApplyController { dao.insertOrUpdate(memberChangeRecord); Dict dict = Dict.create(); + dict.set("origin", "personType"); dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId); dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode()); flowCommonService.executeTask(dict); diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeManageController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeManageController.java index 13123973..7d66228a 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeManageController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeManageController.java @@ -4,10 +4,12 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Dict; import com.budwk.app.base.annotation.RepeatSubmit; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.constant.BpmProcessConstant; import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.base.exception.BaseException; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum; @@ -15,6 +17,11 @@ import com.budwk.app.bpm.models.BpmProcessInstance; import com.budwk.app.bpm.models.BpmProcessTask; import com.budwk.app.bpm.param.BpmTaskApprovalParam; import com.budwk.app.bpm.service.BpmService; +import com.budwk.app.flow.constant.FlowConst; +import com.budwk.app.flow.engine.FlowEngine; +import com.budwk.app.flow.entity.ProcessInstance; +import com.budwk.app.flow.entity.ProcessTask; +import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; import com.budwk.app.sys.views.View_user; import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; @@ -59,7 +66,7 @@ public class MemberChangeManageController { @Inject private Dao dao; @Inject - private BpmService bpmService; + private FlowEngine flowEngine; @Inject private CommonService commonService; @Inject @@ -87,65 +94,44 @@ public class MemberChangeManageController { @Aop(TransAop.READ_COMMITTED) @SLog(tag = "会员高级管理-会员变更", msg = "分工会/校工会会员管理员提交变更") @SaCheckPermission(value = {"member.change.mange", "staff.member.change.mange"}, mode = SaMode.OR) - public Result doSubmitChange(@Param("record") MemberChangeRecord record, @Param("approvalRemark") String approvalRemark){ + public Result doSubmitChange(MemberChangeRecord record){ // 检验是否有变更 if (Lang.isEmpty(record)) { return Result.error("未获取到异动数据"); } - List changeInfos = memberCommonService.getChangeInfos(record); - if (Lang.isEmpty(changeInfos)) { - return Result.error("未校验到变更数据,请确认数据是否存在变更"); - } - - if (Lang.isEmpty(record.getChangeTypes())) { - record.setChangeTypes(List.of(MemberChangeType.BASIC_CHANGE.name())); - } else { - List changeTypes = record.getChangeTypes(); - changeTypes.add(MemberChangeType.BASIC_CHANGE.name()); - record.setChangeTypes(changeTypes); - } - boolean schoolRoleBool = AuthUtil.hasRoleOr(RoleConstant.SCHOOL_UNION_CHAIRMAN.name(), RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name(), RoleConstant.SYSADMIN.name()); + boolean branchRoleBool = AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_CHAIRMAN.name(), RoleConstant.BRANCH_UNION_OPERATOR.name()); - record.setApplyDateTime(DateUtil.date()); - record.setChangeOrigin(schoolRoleBool ? MemberChangeOrigin.SCHOOL_UNION.name() : MemberChangeOrigin.BRANCH_UNION.name()); + // 变更类型 + MemberChangeOrigin changeOrigin = schoolRoleBool ? MemberChangeOrigin.SCHOOL_UNION : branchRoleBool ? MemberChangeOrigin.BRANCH_UNION : null; + + if (changeOrigin == null) { + throw new BaseException("没有权限,或未设置工会小组"); + } + + memberCommonService.validateChangeAndSetBasicData(record); dao.insertOrUpdate(record); - bpmService.startSubmitProcessInstance(BpmProcessConstant.MEMBER_CHANGE.name(), - "【会员变更】" + record.getUsername(), record.getId(), List.of(SecurityUtil.getUserLoginname()), null); - - // 有这个菜单权限的,那就是默认分工会审核通过了 - BpmProcessInstance instance = dao.fetch(BpmProcessInstance.class, Cnd.where("processInstanceBusinessId", "=", record.getId())); - BpmProcessTask task = dao.fetch(BpmProcessTask.class, Cnd.where(BpmProcessTask::getProcessInstanceId, "=", instance.getId()) - .desc(BpmProcessTask::getCreatedAt)); - BpmTaskApprovalParam param = new BpmTaskApprovalParam(); - param.setProcessInstanceId(instance.getId()); - param.setProcessInstanceBusinessId(record.getId()); - param.setProcessInstanceTaskId(task.getId()); - param.setBpmTaskApprovalType(BpmTaskApprovalTypeEnum.PASS.name()); - param.setBpmTaskApprovalTypeEnum(BpmTaskApprovalTypeEnum.PASS); - param.setApprovalOpinion("分工会审核通过"); - // 表示分工会审核通过 - param.getBpmTaskApprovalTypeEnum(); - Map variables = BeanUtil.beanToMap(param); - bpmService.completeTask(param.getProcessInstanceTaskId(), param.getBpmTaskApprovalTypeEnum(), variables, List.of(SecurityUtil.getUserLoginname())); - - // 如果有校工会或者超管的角色,直接审核通过了 + // 开启流程实例 + Dict args = Dict.create(); if (schoolRoleBool) { - BpmProcessInstance committeeInstance = dao.fetch(BpmProcessInstance.class, Cnd.where("processInstanceBusinessId", "=", record.getId())); - BpmProcessTask committeeTask = dao.fetch(BpmProcessTask.class, Cnd.where(BpmProcessTask::getProcessInstanceId, "=", committeeInstance.getId()) - .desc(BpmProcessTask::getCreatedAt)); + args.set("origin", "schoolUnion"); + } else { + args.set("origin", "branchUnion"); + } + args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode()); + args.set(FlowConst.FORM_DATA, record); + ProcessInstance instance = flowEngine.startProcessInstanceByKey("HYBG", record.getId(), SecurityUtil.getUserId(), args); - BpmTaskApprovalParam committeeParam = new BpmTaskApprovalParam(); - committeeParam.setProcessInstanceId(committeeInstance.getId()); - committeeParam.setProcessInstanceBusinessId(record.getId()); - committeeParam.setProcessInstanceTaskId(committeeTask.getId()); - committeeParam.setBpmTaskApprovalType(BpmTaskApprovalTypeEnum.PASS.name()); - committeeParam.setBpmTaskApprovalTypeEnum(BpmTaskApprovalTypeEnum.PASS); - committeeParam.setApprovalOpinion("校工会审核通过"); + // 自动完成第一个申请任务 + List doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null); + for (ProcessTask task : doingTaskList) { + flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args); + } - memberCommonService.compareChangeInfoAndUpdateMember(committeeParam.getProcessInstanceBusinessId()); - bpmService.completeTask(committeeParam.getProcessInstanceTaskId(), committeeParam.getBpmTaskApprovalTypeEnum(), null, null); + // 如果是管理员的话,直接完成变更,修改变更记录 + if (schoolRoleBool) { + memberCommonService.compareChangeInfoAndUpdateMember(record); } return Result.success(); } diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/info/MemberInfoBoardController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/info/MemberInfoBoardController.java index 8d7d673d..f199fe36 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/info/MemberInfoBoardController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/info/MemberInfoBoardController.java @@ -86,7 +86,7 @@ public class MemberInfoBoardController { @At @SaCheckPermission(value = {"member.info.board", "h5.member.info.board"}, mode = SaMode.OR) public Result memberPercentage() { - List memberApplyPersonTypeDictList = sysDictService.getSubListByCode("PERSON_TYPE"); + List memberApplyPersonTypeDictList = sysDictService.getSubListByCode("USER_PERSON_TYPE"); List personTypes = memberApplyPersonTypeDictList.stream().map(Sys_dict::getCode).collect(Collectors.toList()); int member = memberInfoService.count(Sqls.create("select count(1) from sys_user where member = 1")); int user = memberInfoService.count(Sqls.create("select count(1) from sys_user").setParam("personTypes", personTypes)); diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberCommonService.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberCommonService.java index 8f80c53e..167dcbe3 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberCommonService.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberCommonService.java @@ -4,6 +4,7 @@ import com.budwk.app.base.page.Pagination; import com.budwk.app.base.service.BaseService; import com.budwk.app.sys.models.Sys_user; import com.budwk.app.sys.views.View_user; +import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeOrigin; import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord; import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm; import org.nutz.dao.sql.Sql; @@ -100,4 +101,10 @@ public interface MemberCommonService extends BaseService { * @param record */ void validateChangeAndSetBasicData(MemberChangeRecord record); + + /** + * 验证变更信息 + * @param record + */ + void validateChangeAndSetBasicData(MemberChangeRecord record, MemberChangeOrigin origin); } diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberManageServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberManageServiceImpl.java index c41afbab..2300aeff 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberManageServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberManageServiceImpl.java @@ -484,6 +484,13 @@ public class MemberManageServiceImpl extends BaseServiceImpl implement @Override public void validateChangeAndSetBasicData(MemberChangeRecord record) { + // 不传递 MemberChangeOrigin 默认个人变更 + validateChangeAndSetBasicData(record, MemberChangeOrigin.PERSONAL); + } + + + @Override + public void validateChangeAndSetBasicData(MemberChangeRecord record, MemberChangeOrigin origin) { // 校验有没有发生变更 List changeInfos = getChangeInfos(record); if (Lang.isEmpty(changeInfos)) { @@ -495,9 +502,10 @@ public class MemberManageServiceImpl extends BaseServiceImpl implement List changeTypes = compareChangeType(record, user); record.setChangeTypes(changeTypes); - record.setUserId(SecurityUtil.getUserId()); - // 变更来源 个人 - record.setChangeOrigin(MemberChangeOrigin.PERSONAL.name()); + record.setUserId(user.getId()); + // 变更来源 + record.setChangeOrigin(origin != null ? origin.name() : MemberChangeOrigin.PERSONAL.name()); + record.setApplyDateTime(DateUtil.date()); } private String booleanVerification(Object value) { diff --git a/src/main/resources/static/components/module/activity/UserDataScope.vue b/src/main/resources/static/components/module/activity/UserDataScope.vue index afb1938e..5af64699 100644 --- a/src/main/resources/static/components/module/activity/UserDataScope.vue +++ b/src/main/resources/static/components/module/activity/UserDataScope.vue @@ -102,7 +102,7 @@
人员类型:
-
diff --git a/src/main/resources/static/components/module/activity/UserScope.vue b/src/main/resources/static/components/module/activity/UserScope.vue index cb88804f..2498136a 100644 --- a/src/main/resources/static/components/module/activity/UserScope.vue +++ b/src/main/resources/static/components/module/activity/UserScope.vue @@ -675,7 +675,7 @@ module.exports = { } await this.flushUnits() await this.getActivityGroup() - this.personTypeOptions = await this.$businessTool.getDictOptions("PERSON_TYPE") + this.personTypeOptions = await this.$businessTool.getDictOptions("USER_PERSON_TYPE") this.userStateOptions = await this.$businessTool.getDictOptions("USER_STATE") await this.getRoleListByMenuId() await this.pageData() 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 b6ac48b1..dc166155 100644 --- a/src/main/resources/views/platform/sys/data/user/update.html +++ b/src/main/resources/views/platform/sys/data/user/update.html @@ -3,266 +3,302 @@ layout("/layouts/platform.html"){ #-->
- - + + + + + + {{item.pullTime}} rows:{{item.num}} - - - - - - - - 全部更新 - 仅更新新增人员 - - - - - - - -
- - -
-
-
- + + + + + + + + 全部更新 + 仅更新新增人员 + + + + + + + +
+ + +
+
+ + 取 消 确 定 -
+
- - - - - - 返 回 - - 提交变更 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 会员 + 非会员 + + + + + + + + 福利会员 + 非福利会员 + + + + + + + + + 返回 + 提交变更 + + + + + + + + `, props: { @@ -390,7 +346,7 @@ const MEMBER_CHANGE = { methods: { getUnionName(val){ const data = this.units.find(v => v.id === val) - this.$set(this.formData, 'unionName', data ? data.unionname : '') + this.$set(this.formData, 'unionName', data ? data.unionName : '') }, allowFields(prop) { return !this.allowChangeFields.map(v => v.code).includes(prop) @@ -406,7 +362,7 @@ const MEMBER_CHANGE = { }) .catch() }, - doSubmit() { + onSubmit() { this.$refs.formRef.validate((valid) => { if (valid) { this.$confirm("提交后将进入审核流程,无法再进行编辑,您确定要提交申请吗?", "提示", { type: "warning" }) diff --git a/src/main/resources/views/platform/zhgh/staffmanage/member/change/manage/index.html b/src/main/resources/views/platform/zhgh/staffmanage/member/change/manage/index.html index 8e8df02f..17ea896e 100644 --- a/src/main/resources/views/platform/zhgh/staffmanage/member/change/manage/index.html +++ b/src/main/resources/views/platform/zhgh/staffmanage/member/change/manage/index.html @@ -32,7 +32,7 @@ layout("/layouts/platform.html"){ + code="USER_PERSON_TYPE"> { - this.unions = data - }) + this.unions = await this.$businessTool.listUnion(this.pageForm.unionId) } else { - this.$businessTool.listUnion(this.$store.state.user.union.id).then(data => { - this.unions = data - }) + this.unions = await this.$businessTool.listUnion(this.$store.state.user.union.id) } this.changeTypeData = await this.$businessTool.getEnumOptions("MemberChangeType") - this.url = isAdmin ? "/platform/member/school/manage/generalMemberChange" : "/platform/member/branch/manage/generalMemberChange" }, async flushUnits() { this.$set(this.pageForm, "unitId", null) diff --git a/src/main/resources/views/platform/zhgh/staffmanage/member/change/record/index.html b/src/main/resources/views/platform/zhgh/staffmanage/member/change/record/index.html index c39b4bb8..206c7218 100644 --- a/src/main/resources/views/platform/zhgh/staffmanage/member/change/record/index.html +++ b/src/main/resources/views/platform/zhgh/staffmanage/member/change/record/index.html @@ -29,7 +29,7 @@ layout("/layouts/platform.html"){ + code="USER_PERSON_TYPE"> - diff --git a/src/main/resources/views/platform/zhgh/staffmanage/member/change/submit/index.html b/src/main/resources/views/platform/zhgh/staffmanage/member/change/submit/index.html index 760f9a14..383abb8e 100644 --- a/src/main/resources/views/platform/zhgh/staffmanage/member/change/submit/index.html +++ b/src/main/resources/views/platform/zhgh/staffmanage/member/change/submit/index.html @@ -69,7 +69,7 @@ layout("/layouts/platform.html"){ -