From 8c431ff665d351df9a494ffe6b418648933dd9a3 Mon Sep 17 00:00:00 2001 From: zhouhefeng Date: Tue, 29 Sep 2026 10:06:50 +0800 Subject: [PATCH] commit --- .../aidFund/param/AidFundPageForm.java | 2 + .../impl/AidFundMemberServiceImpl.java | 12 ++ .../PendingConfirmUserBatchChangeParam.java | 20 ++++ .../service/PendingConfirmUserService.java | 4 +- .../impl/PendingConfirmUserServiceImpl.java | 107 ++++++++++++++++-- .../aidFund/manage/index.html | 12 +- .../sourcechange/pending/index.html | 87 +++++++++++--- .../sourcechange/pending/memberChange.js | 5 +- 8 files changed, 217 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/param/AidFundPageForm.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/param/AidFundPageForm.java index a7c89000..7fbb8961 100644 --- a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/param/AidFundPageForm.java +++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/param/AidFundPageForm.java @@ -17,6 +17,8 @@ public class AidFundPageForm extends PageForm { private String unitId; //是否当年未缴费 private Boolean notPayedCurrentYear; + //是否筛选人员类型与基金会员类型不一致的基金会员 + private Boolean personTypeChanged; //基金会员变更类型 private String changeType; diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/impl/AidFundMemberServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/impl/AidFundMemberServiceImpl.java index 5ae7baf2..1afb68e3 100644 --- a/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/impl/AidFundMemberServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/medicalMutualAid/aidFund/service/impl/AidFundMemberServiceImpl.java @@ -22,6 +22,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.Static; import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.IocBean; @@ -167,6 +168,17 @@ public class AidFundMemberServiceImpl extends BaseServiceImpl implements AidFund if (pageForm.getNotPayedCurrentYear()) { cnd.and("id", "in", Sqls.create("SELECT userid FROM `aid_fund_member_pay` where `year` = YEAR(CURDATE()) and isPayed = 0")); } + if (ObjectUtil.equals(pageForm.getPersonTypeChanged(), true)) { + // 按工号比对当前用户表人员类型与基金会员类型,筛出需要人工核实变更的会员。 + cnd.and(new Static(""" + EXISTS ( + SELECT 1 + FROM sys_user su + WHERE su.loginname = vw_user.loginname + AND IFNULL(su.personType, '') <> IFNULL(vw_user.aidFundMemberUserType, '') + ) + """)); + } cnd.andEX(Sys_user::getAidFundMemberUserType, "=", pageForm.getAidFundMemberUserType()); cnd.andEX(View_user::getUnionId, "=", pageForm.getUnionId()); cnd.andEX(View_user::getUnitId, "=", pageForm.getUnitId()); diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/param/PendingConfirmUserBatchChangeParam.java b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/param/PendingConfirmUserBatchChangeParam.java index 9c4fef01..2f87d02a 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/param/PendingConfirmUserBatchChangeParam.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/param/PendingConfirmUserBatchChangeParam.java @@ -17,4 +17,24 @@ public class PendingConfirmUserBatchChangeParam { * 批量设置的人员类型。 */ private String personType; + + /** + * 批量设置的在职状态,空值不参与批量变更。 + */ + private String userState; + + /** + * 批量设置的人员属性,空值不参与批量变更。 + */ + private String userAttribute; + + /** + * 批量设置的会员状态,null不参与批量变更,false表示设置为非会员。 + */ + private Boolean member; + + /** + * 批量设置的福利会员状态,null不参与批量变更,false表示设置为非福利会员。 + */ + private Boolean welfareMember; } diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/service/PendingConfirmUserService.java b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/service/PendingConfirmUserService.java index 85c37013..e4c1d0ba 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/service/PendingConfirmUserService.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/service/PendingConfirmUserService.java @@ -29,9 +29,9 @@ public interface PendingConfirmUserService extends BaseService { boolean submitChange(MemberChangeRecord record); /** - * 批量修改待确认人员的人员类型,并将处理成功的人员标记为已确认。 + * 批量修改待确认人员允许整改的字段,并将处理成功的人员标记为已确认。 * - * @param changeParam 批量勾选的用户ID及目标人员类型 + * @param changeParam 批量勾选的用户ID及待整改字段 * @return 实际完成确认的人员数量 */ int batchChangePersonType(PendingConfirmUserBatchChangeParam changeParam); diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/service/impl/PendingConfirmUserServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/service/impl/PendingConfirmUserServiceImpl.java index 8dfecbfb..a81cae8d 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/service/impl/PendingConfirmUserServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/service/impl/PendingConfirmUserServiceImpl.java @@ -71,6 +71,7 @@ public class PendingConfirmUserServiceImpl extends BaseServiceImpl imp userInfo.sex, userInfo.userState, userInfo.personType, + userInfo.userAttribute, userInfo.unitId, unitInfo.name AS unitName, unionInfo.id unionId, @@ -123,14 +124,14 @@ public class PendingConfirmUserServiceImpl extends BaseServiceImpl imp throw new BaseException("请选择人员类型"); } validatePersonType(record.getPersonType()); - // 单人页面虽然提交完整表单,服务层只采用用户ID和人员类型,防止请求篡改其他只读字段。 - return changePersonType(record.getUserId(), record.getPersonType()); + // 单人页面虽然提交完整表单,服务层只采纳待确认业务允许编辑的字段,防止请求篡改其他只读字段。 + return changePendingUserFields(record); } /** * 在同一事务内批量处理选中人员;任意人员状态异常时整体回滚,避免出现部分成功。 * - * @param changeParam 批量用户ID及目标人员类型 + * @param changeParam 批量用户ID及待确认字段变更内容 * @return 完成确认的人员数量 */ @Override @@ -139,10 +140,12 @@ public class PendingConfirmUserServiceImpl extends BaseServiceImpl imp if (changeParam == null || StrUtil.isBlank(changeParam.getUserIds())) { throw new BaseException("请选择需要变更的人员"); } - if (StrUtil.isBlank(changeParam.getPersonType())) { - throw new BaseException("请选择人员类型"); + if (!hasBatchChangeField(changeParam)) { + throw new BaseException("请选择需要变更的内容"); + } + if (StrUtil.isNotBlank(changeParam.getPersonType())) { + validatePersonType(changeParam.getPersonType()); } - validatePersonType(changeParam.getPersonType()); List userIds; try { @@ -162,11 +165,42 @@ public class PendingConfirmUserServiceImpl extends BaseServiceImpl imp } for (String userId : new ArrayList<>(normalizedUserIds)) { - changePersonType(userId, changeParam.getPersonType()); + MemberChangeRecord record = new MemberChangeRecord(); + record.setUserId(userId); + if (StrUtil.isNotBlank(changeParam.getPersonType())) { + record.setPersonType(changeParam.getPersonType()); + } + if (StrUtil.isNotBlank(changeParam.getUserState())) { + record.setUserState(changeParam.getUserState()); + } + if (StrUtil.isNotBlank(changeParam.getUserAttribute())) { + record.setUserAttribute(changeParam.getUserAttribute()); + } + if (changeParam.getMember() != null) { + record.setMember(changeParam.getMember()); + } + if (changeParam.getWelfareMember() != null) { + record.setWelfareMember(changeParam.getWelfareMember()); + } + changePendingUserFields(record); } return normalizedUserIds.size(); } + /** + * 判断批量请求是否至少包含一个待整改字段;字符串空值不参与,Boolean false 是有效值。 + * + * @param changeParam 批量变更参数 + * @return true 表示存在至少一个待变更字段 + */ + private boolean hasBatchChangeField(PendingConfirmUserBatchChangeParam changeParam) { + return StrUtil.isNotBlank(changeParam.getPersonType()) + || StrUtil.isNotBlank(changeParam.getUserState()) + || StrUtil.isNotBlank(changeParam.getUserAttribute()) + || changeParam.getMember() != null + || changeParam.getWelfareMember() != null; + } + /** * 仅修改指定待确认人员的人员类型,并复用会员公共服务生成用户历史记录。 * @@ -175,6 +209,20 @@ public class PendingConfirmUserServiceImpl extends BaseServiceImpl imp * @return true 表示人员类型发生变化,false 表示类型未变化但已完成确认 */ private boolean changePersonType(String userId, String personType) { + MemberChangeRecord record = new MemberChangeRecord(); + record.setUserId(userId); + record.setPersonType(personType); + return changePendingUserFields(record); + } + + /** + * 仅采纳待确认页面允许编辑的人员字段,并复用会员公共服务生成用户历史记录。 + * + * @param record 前端提交的待确认人员变更内容 + * @return true 表示人员字段发生变化,false 表示字段未变化但已完成确认 + */ + private boolean changePendingUserFields(MemberChangeRecord record) { + String userId = record.getUserId(); Sys_user user = dao().fetch(Sys_user.class, userId); if (user == null || !Integer.valueOf(STATUS_PENDING).equals(user.getPendingConfirmStatus())) { throw new BaseException("当前人员不属于待确认人员记录"); @@ -185,13 +233,15 @@ public class PendingConfirmUserServiceImpl extends BaseServiceImpl imp if (userView == null) { throw new BaseException("未获取到人员基础信息"); } - // 从数据库当前值重建完整变更对象,除人员类型外不信任前端提交的任何人员字段。 + // 从数据库当前值重建完整变更对象,仅覆盖待确认页面允许编辑的字段。 MemberChangeRecord safeRecord = new MemberChangeRecord(); BeanUtil.copyProperties(userView, safeRecord); safeRecord.setUserId(userId); - safeRecord.setPersonType(StrUtil.trim(personType)); - safeRecord.setMember(Integer.valueOf(1).equals(userView.getMember())); - safeRecord.setWelfareMember(Integer.valueOf(1).equals(userView.getWelfareMember())); + safeRecord.setPersonType(record.getPersonType() == null ? userView.getPersonType() : StrUtil.trim(record.getPersonType())); + safeRecord.setUserState(record.getUserState() == null ? userView.getUserState() : record.getUserState()); + safeRecord.setUserAttribute(record.getUserAttribute() == null ? userView.getUserAttribute() : record.getUserAttribute()); + safeRecord.setMember(record.getMember() == null ? Integer.valueOf(1).equals(userView.getMember()) : record.getMember()); + safeRecord.setWelfareMember(record.getWelfareMember() == null ? Integer.valueOf(1).equals(userView.getWelfareMember()) : record.getWelfareMember()); safeRecord.setArrivalAtSchoolDate(userView.getArrivalAtSchoolDate() == null ? null : DateUtil.formatDate(userView.getArrivalAtSchoolDate())); safeRecord.setWelfareStopDate(userView.getWelfareStopDate() == null @@ -201,8 +251,12 @@ public class PendingConfirmUserServiceImpl extends BaseServiceImpl imp // 复用公共校验和历史记录生成口径,确保单人、批量变更结果保持一致。 memberCommonService.validateChangeAndSetBasicData(safeRecord, MemberChangeOrigin.SYSTEM); } catch (BaseException e) { - // 人员类型与当前值相同时允许直接完成确认;其他业务异常必须继续抛出并触发事务回滚。 + // 公共允许变更字段暂不包含福利会员状态,单独修改该字段时由待确认入口专用逻辑直接更新。 if ("未获取到异动数据".equals(e.getMessage())) { + if (updateWelfareMemberIfChanged(record, userView)) { + markConfirmed(userId); + return true; + } markConfirmed(userId); return false; } @@ -214,6 +268,34 @@ public class PendingConfirmUserServiceImpl extends BaseServiceImpl imp return true; } + /** + * 仅在本次请求明确传入福利会员状态且与当前值不一致时更新;未传入时不参与整改。 + * + * @param record 待确认页面提交的变更内容 + * @param userView 当前人员视图数据 + * @return true 表示已更新福利会员状态 + */ + private boolean updateWelfareMemberIfChanged(MemberChangeRecord record, View_user userView) { + if (record.getWelfareMember() == null) { + return false; + } + boolean currentWelfareMember = Integer.valueOf(1).equals(userView.getWelfareMember()); + if (record.getWelfareMember().equals(currentWelfareMember)) { + return false; + } + Sql sql = Sqls.create(""" + UPDATE sys_user + SET welfareMember = @welfareMember + WHERE id = @userId + AND pendingConfirmStatus = @pendingStatus + """); + sql.setParam("welfareMember", record.getWelfareMember()); + sql.setParam("userId", userView.getId()); + sql.setParam("pendingStatus", STATUS_PENDING); + dao().execute(sql); + return true; + } + /** * 校验待确认人员允许变更的目标人员类型。 * @@ -265,6 +347,7 @@ public class PendingConfirmUserServiceImpl extends BaseServiceImpl imp "unionName", "unionInfo.name", "unitName", "unitInfo.name", "personType", "userInfo.personType", + "userAttribute", "userInfo.userAttribute", "userState", "userInfo.userState" ); return orderColumns.getOrDefault(StrUtil.nullToEmpty(pageOrderName), ""); diff --git a/src/main/resources/views/platform/zhgh/staffbenefit/medicalMutualAid/aidFund/manage/index.html b/src/main/resources/views/platform/zhgh/staffbenefit/medicalMutualAid/aidFund/manage/index.html index b0eae16c..222a33c7 100644 --- a/src/main/resources/views/platform/zhgh/staffbenefit/medicalMutualAid/aidFund/manage/index.html +++ b/src/main/resources/views/platform/zhgh/staffbenefit/medicalMutualAid/aidFund/manage/index.html @@ -43,10 +43,15 @@ layout("/layouts/platform.html"){ v-if="$auth.hasPermission('medicalMutualAid.aidFund.manage.createPayList')" class="mr10"> 当年未缴费【基金会员】名单 + + 人员类型变化名单 + + type="danger" + v-if="$auth.hasPermission('medicalMutualAid.aidFund.manage.createPayList') && (pageForm.notPayedCurrentYear || pageForm.personTypeChanged)"> 批量设置为退会 @@ -258,7 +263,8 @@ layout("/layouts/platform.html"){ pageForm: { unitId: '', unionId: '', - notPayedCurrentYear: false + notPayedCurrentYear: false, + personTypeChanged: false }, tableColumns: [ {prop: "loginname", label: "工号"}, diff --git a/src/main/resources/views/platform/zhgh/staffmanage/sourcechange/pending/index.html b/src/main/resources/views/platform/zhgh/staffmanage/sourcechange/pending/index.html index 9a36a4d8..687dc634 100644 --- a/src/main/resources/views/platform/zhgh/staffmanage/sourcechange/pending/index.html +++ b/src/main/resources/views/platform/zhgh/staffmanage/sourcechange/pending/index.html @@ -153,6 +153,8 @@ layout("/layouts/platform.html"){ prop="unitName" show-overflow-tooltip sortable> + - - - + + + + + + + + + + + + + + + + + + +