diff --git a/src/main/java/com/budwk/app/sys/controller/SysRoleController.java b/src/main/java/com/budwk/app/sys/controller/SysRoleController.java index cc2dfcf..9efc977 100644 --- a/src/main/java/com/budwk/app/sys/controller/SysRoleController.java +++ b/src/main/java/com/budwk/app/sys/controller/SysRoleController.java @@ -37,6 +37,7 @@ import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.GET; import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; +import org.nutz.mvc.annotation.POST; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; @@ -499,6 +500,24 @@ public class SysRoleController { return Result.success(list); } + /** + * 为全部 member=1 的用户设置会员角色,无需传入用户 ID、角色 ID 或列表筛选参数。 + * + * @return JSON Result,data.addedCount 为新增关联数,data.enabledCount 为恢复启用关联数 + */ + @At + @POST + @Ok("json") + @SaCheckPermission("sys.manager.role.user") + @SLog(tag = "一键设置会员角色", msg = "为全部member=1的人员补齐会员角色") + @Aop(TransAop.READ_COMMITTED) + public Result doSettingMemberRole() { + NutMap counts = sysRoleService.settingMemberRole(); + sysRoleService.clearCache(); + sysUserService.clearCache(); + return Result.success("会员角色设置完成", counts); + } + @At @Ok("json") @SaCheckPermission("sys.manager.role") diff --git a/src/main/java/com/budwk/app/sys/services/SysRoleService.java b/src/main/java/com/budwk/app/sys/services/SysRoleService.java index 1c6d6eb..08ee63b 100644 --- a/src/main/java/com/budwk/app/sys/services/SysRoleService.java +++ b/src/main/java/com/budwk/app/sys/services/SysRoleService.java @@ -8,6 +8,7 @@ import com.budwk.app.sys.models.Sys_role; import com.budwk.app.sys.models.Sys_unit; import java.util.List; +import org.nutz.lang.util.NutMap; /** * Created by wizzer on 2016/12/22. @@ -128,6 +129,13 @@ public interface SysRoleService extends BaseService { */ List getRoleIdsByCode(List roleConstantList); + /** + * 为用户表中 member=1 的全部人员补齐启用的 MEMBER 角色,不受列表筛选影响。 + * + * @return addedCount 为新增关联数,enabledCount 为恢复启用的关联数;已有启用关联不重复添加 + */ + NutMap settingMemberRole(); + /** * 清空缓存 */ diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysRoleServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysRoleServiceImpl.java index 86e79a7..35bdb80 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysRoleServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysRoleServiceImpl.java @@ -20,6 +20,7 @@ import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Strings; +import org.nutz.lang.util.NutMap; import org.nutz.plugins.wkcache.annotation.CacheDefaults; import org.nutz.plugins.wkcache.annotation.CacheRemoveAll; import org.nutz.plugins.wkcache.annotation.CacheResult; @@ -284,4 +285,44 @@ public class SysRoleServiceImpl extends BaseServiceImpl implements Sys public void clearCache() { } + + /** + * 批量补齐会员角色。仅处理 member=1 的用户,保留其他角色及账号禁用状态。 + * + * @return addedCount 为新增关联数,enabledCount 为恢复启用的关联数 + */ + @Override + @Aop(TransAop.READ_COMMITTED) + public NutMap settingMemberRole() { + // 锁定同一会员角色,使本接口的并发请求依次执行,避免重复插入用户角色关系。 + Sql roleSql = Sqls.create("SELECT * FROM sys_role WHERE code=@code FOR UPDATE"); + roleSql.setParam("code", RoleConstant.MEMBER.name()); + roleSql.setEntity(dao().getEntity(Sys_role.class)); + roleSql.setCallback(Sqls.callback.entities()); + dao().execute(roleSql); + List roles = roleSql.getList(Sys_role.class); + if (roles.isEmpty()) { + throw new BaseException("会员角色(MEMBER)不存在,请先配置会员角色"); + } + Sys_role role = roles.get(0); + if (role.isDisabled()) { + throw new BaseException("会员角色(MEMBER)已禁用,请先启用会员角色"); + } + + // 历史关联可能已停用或未填写 enable;恢复关联即可,无需重新插入。 + Sql enableSql = Sqls.create("UPDATE sys_user_role SET enable=1 WHERE roleId=@roleId " + + "AND (enable IS NULL OR enable<>1) " + + "AND EXISTS (SELECT 1 FROM sys_user u WHERE u.id=sys_user_role.userId AND u.member=1)"); + enableSql.setParam("roleId", role.getId()); + dao().execute(enableSql); + + // 按用户、角色判重,只为缺少会员关联的人员添加记录;不删除任何已有角色。 + Sql insertSql = Sqls.create("INSERT INTO sys_user_role (userId,roleId,enable) " + + "SELECT u.id,@roleId,1 FROM sys_user u WHERE u.member=1 " + + "AND NOT EXISTS (SELECT 1 FROM sys_user_role ur WHERE ur.userId=u.id AND ur.roleId=@roleId)"); + insertSql.setParam("roleId", role.getId()); + dao().execute(insertSql); + return NutMap.NEW().addv("addedCount", insertSql.getUpdateCount()) + .addv("enabledCount", enableSql.getUpdateCount()); + } } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/grassrootscongress/controller/material/GrassrootsCongressMaterialMineController.java b/src/main/java/com/budwk/app/zhgh/democratic/grassrootscongress/controller/material/GrassrootsCongressMaterialMineController.java index cdf0456..dfb44de 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/grassrootscongress/controller/material/GrassrootsCongressMaterialMineController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/grassrootscongress/controller/material/GrassrootsCongressMaterialMineController.java @@ -86,7 +86,8 @@ public class GrassrootsCongressMaterialMineController { cnd.and("info.createdBy", "=", SecurityUtil.getUserId()); } if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { - cnd.and(Cnd.likeEX("info.meetingName", pageForm.getSearchKeyword())); + // searchKeyword 为资料名称关键词,按资料表的 materialsName 字段模糊匹配。 + cnd.and(Cnd.likeEX("info.materialsName", pageForm.getSearchKeyword())); } cnd.andEX("YEAR(info.createdTime)", "=", pageForm.getYear()); cnd.desc("info.createdTime"); diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/apply/MemberApplyController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/apply/MemberApplyController.java index 90899d9..277a4eb 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/apply/MemberApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/apply/MemberApplyController.java @@ -20,6 +20,7 @@ import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.web.commons.base.Globals; import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord; import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService; +import com.budwk.app.zhgh.staffmanage.member.service.MemberApplyRecordService; import io.swagger.annotations.ApiOperation; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; @@ -54,6 +55,8 @@ public class MemberApplyController { private FlowCommonService flowCommonService; @Inject private MemberCommonService memberCommonService; + @Inject + private MemberApplyRecordService memberApplyRecordService; @At("") @Ok("beetl:/platform/zhgh/staffmanage/member/apply/submit/index.html") @@ -70,13 +73,14 @@ public class MemberApplyController { @At @ApiOperation("保存申请") + @Aop(TransAop.READ_COMMITTED) @SaCheckPermission("member.apply.submit") @SLog(tag = "会员入会申请", msg = "保存申请,申请人: ${args[0].username}") public Result save(@Param("data") MemberApplyRecord memberApplyRecord) { if (StrUtil.isBlank(memberApplyRecord.getId())) { memberCommonService.validateApplyOrChangeIsDoing(null, "apply"); } - dao.insertOrUpdate(memberApplyRecord); + memberApplyRecordService.saveApplyRecord(memberApplyRecord); return Result.success(); } @@ -105,7 +109,7 @@ public class MemberApplyController { .and(new Static("JSON_CONTAINS(unitIds, '\"%s\"')".formatted(SecurityUtil.getUnitId())))); args.set("type", Lang.isEmpty(group) ? "branch" : "group"); - dao.insertOrUpdate(memberApplyRecord); + memberApplyRecordService.saveApplyRecord(memberApplyRecord); args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode()); args.set(FlowConst.FORM_DATA, memberApplyRecord); @@ -143,7 +147,7 @@ public class MemberApplyController { .and(new Static("JSON_CONTAINS(unitIds, '\"%s\"')".formatted(SecurityUtil.getUnitId())))); dict.set("type", Lang.isEmpty(group) ? "branch" : "group"); - dao.insertOrUpdate(memberApplyRecord); + memberApplyRecordService.saveApplyRecord(memberApplyRecord); dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId); dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode()); diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberBranchUnionAuditController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberBranchUnionAuditController.java index 6cac513..9435887 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberBranchUnionAuditController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberBranchUnionAuditController.java @@ -64,7 +64,7 @@ public class MemberBranchUnionAuditController { info.sex, info.userName, info.loginName, - info.unitName, + COALESCE(changeUnit.name, info.unitName) AS unitName, info.unionName, info.userState, info.preparedBy, @@ -91,6 +91,7 @@ public class MemberBranchUnionAuditController { wf_process_task t LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId LEFT JOIN member_change_record info ON info.id = ins.businessNo + LEFT JOIN sys_unit changeUnit ON changeUnit.id = info.unitId LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10 LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10 @@ -111,7 +112,8 @@ public class MemberBranchUnionAuditController { if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { cnd.desc("info.applyDateTime"); } else { - cnd.orderBy("info." + pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + // 单位列按实际显示名称排序,其他字段保持原有排序规则。 + cnd.orderBy("unitName".equals(pageForm.getPageOrderName()) ? "unitName" : "info." + pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); } cnd.groupBy("t.id"); sql.setCondition(cnd); 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 9135d09..4776374 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 @@ -72,6 +72,7 @@ public class MemberChangeApplyController { @At @ApiOperation("保存申请") + @Aop(TransAop.READ_COMMITTED) @SaCheckPermission("member.apply.submit") @SLog(tag = "会员变更申请", msg = "保存申请,申请人: ${args[0].username}") public Result save(@Param("data") MemberChangeRecord memberChangeRecord) { @@ -147,7 +148,7 @@ public class MemberChangeApplyController { @ApiModelProperty("根据id查询变更记录") @SaCheckPermission("member.change.apply") public Result findChangeById(String id){ - return Result.success().addData(dao.fetch(MemberChangeRecord.class, id)); + return Result.success().addData(memberCommonService.findChangeRecordWithUnitName(id)); } /** diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeMineController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeMineController.java index 4a87955..fe6a28e 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeMineController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberChangeMineController.java @@ -76,7 +76,7 @@ public class MemberChangeMineController { info.username, info.loginname, info.sex, - info.unitName, + COALESCE(changeUnit.name, info.unitName) AS unitName, info.unionName, info.userState, info.preparedBy, @@ -103,6 +103,7 @@ public class MemberChangeMineController { member_change_record info LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 + LEFT JOIN sys_unit changeUnit ON changeUnit.id = info.unitId LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id $condition """); @@ -124,7 +125,8 @@ public class MemberChangeMineController { if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { cnd.desc("info.applyDateTime"); } else { - cnd.orderBy("info." + pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + // 单位列按实际显示名称排序,其他字段保持原有排序规则。 + cnd.orderBy("unitName".equals(pageForm.getPageOrderName()) ? "unitName" : "info." + pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); } cnd.groupBy("t.id"); sql.setCondition(cnd); @@ -166,7 +168,7 @@ public class MemberChangeMineController { @ApiOperation("根据id查询变更记录") @SaCheckPermission(value = {"member.change.mine", "member.change.unionGroup.audit"}, mode = SaMode.OR) public Result findMemberChangeRecord(String id){ - MemberChangeRecord record = dao.fetch(MemberChangeRecord.class, id); + MemberChangeRecord record = memberCommonService.findChangeRecordWithUnitName(id); NutMap nutMap = Lang.obj2nutmap(record); // 变更记录只保存三级单位 ID,查看时补充当前单位名称供页面展示。 diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberSchoolUnionAuditController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberSchoolUnionAuditController.java index 029eb5c..bcf7dd3 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberSchoolUnionAuditController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberSchoolUnionAuditController.java @@ -92,7 +92,7 @@ public class MemberSchoolUnionAuditController { info.sex, info.userName, info.loginName, - info.unitName, + COALESCE(changeUnit.name, info.unitName) AS unitName, info.unionName, info.userState, info.preparedBy, @@ -119,6 +119,7 @@ public class MemberSchoolUnionAuditController { wf_process_task t LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId LEFT JOIN member_change_record info ON info.id = ins.businessNo + LEFT JOIN sys_unit changeUnit ON changeUnit.id = info.unitId LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10 LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10 @@ -139,7 +140,8 @@ public class MemberSchoolUnionAuditController { if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { cnd.desc("info.applyDateTime"); } else { - cnd.orderBy("info." + pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + // 单位列按实际显示名称排序,其他字段保持原有排序规则。 + cnd.orderBy("unitName".equals(pageForm.getPageOrderName()) ? "unitName" : "info." + pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); } cnd.groupBy("t.id"); sql.setCondition(cnd); diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberUnionGroupAuditController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberUnionGroupAuditController.java index b9066a7..d03bea7 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberUnionGroupAuditController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/change/MemberUnionGroupAuditController.java @@ -60,7 +60,7 @@ public class MemberUnionGroupAuditController { info.sex, info.userName, info.loginName, - info.unitName, + COALESCE(changeUnit.name, info.unitName) AS unitName, info.unionName, info.userState, info.preparedBy, @@ -87,6 +87,7 @@ public class MemberUnionGroupAuditController { wf_process_task t LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId LEFT JOIN member_change_record info ON info.id = ins.businessNo + LEFT JOIN sys_unit changeUnit ON changeUnit.id = info.unitId LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10 LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10 @@ -107,7 +108,8 @@ public class MemberUnionGroupAuditController { if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { cnd.desc("info.applyDateTime"); } else { - cnd.orderBy("info." + pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + // 单位列按实际显示名称排序,其他字段保持原有排序规则。 + cnd.orderBy("unitName".equals(pageForm.getPageOrderName()) ? "unitName" : "info." + pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); } cnd.groupBy("t.id"); sql.setCondition(cnd); diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/interceptor/MemberApplySaveInterceptor.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/interceptor/MemberApplySaveInterceptor.java index 84c8ead..08cde75 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/interceptor/MemberApplySaveInterceptor.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/interceptor/MemberApplySaveInterceptor.java @@ -7,6 +7,7 @@ import com.budwk.app.flow.engine.core.ServiceContext; import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.web.commons.base.Globals; import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord; +import com.budwk.app.zhgh.staffmanage.member.service.MemberApplyRecordService; import org.nutz.dao.Chain; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; @@ -35,7 +36,8 @@ public class MemberApplySaveInterceptor implements FlowInterceptor { MemberApplyRecord record = Json.fromJson(MemberApplyRecord.class, formDataStr); Dao dao = ServiceContext.find(Dao.class); - dao.insertOrUpdate(record); + // WF 保存同样经过日期校验,防止绕过普通申请接口写入无效日期。 + ServiceContext.find(MemberApplyRecordService.class).saveApplyRecord(record); execution.getArgs().set(FlowConst.FORM_DATA, Json.toJson(record)); diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberApplyRecordService.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberApplyRecordService.java index c666eff..ac4bb9c 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberApplyRecordService.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberApplyRecordService.java @@ -8,4 +8,10 @@ import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord; */ public interface MemberApplyRecordService extends BaseService { + /** + * 校验入职时间并保存入会申请,统一供保存、提交、重新提交及 WF 保存入口调用。 + * @param record 申请数据,arrivalAtSchoolDate 可为空,非空时必须为有效的 yyyy-MM-dd 日期 + * @return 无返回值;新增时记录 ID 回填到 record,非空日期非法时抛出业务异常 + */ + void saveApplyRecord(MemberApplyRecord record); } 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 4b2879d..c1cd55c 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 @@ -44,6 +44,13 @@ public interface MemberCommonService extends BaseService { Pagination memberHistoryRecords(MemberManagePageForm pageForm); + /** + * 读取变更申请并按申请单位 ID 校准显示名称,不写回历史记录。 + * @param id 会员变更申请记录 ID + * @return 申请记录,unitName 对应本次申请的 unitId;单位不存在时保留原名称 + */ + MemberChangeRecord findChangeRecordWithUnitName(String id); + /** * 获取可变更字段 * @return diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberApplyRecordServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberApplyRecordServiceImpl.java index cb59a3a..8ea3231 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberApplyRecordServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberApplyRecordServiceImpl.java @@ -4,6 +4,13 @@ import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord; import com.budwk.app.zhgh.staffmanage.member.service.MemberApplyRecordService; import org.nutz.dao.Dao; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.ioc.aop.Aop; +import com.budwk.app.base.exception.BaseException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.time.format.ResolverStyle; import org.nutz.ioc.loader.annotation.IocBean; @IocBean(args = {"refer:dao"}) @@ -12,4 +19,37 @@ public class MemberApplyRecordServiceImpl extends BaseServiceImpl implements // 获取系统用户 Cnd cnd = Cnd.NEW(); List dataUserList = dao().query(Sys_user.class, cnd); - Map userMap = dataUserList.stream().collect(Collectors.toMap(Sys_user::getLoginname, v -> v)); + // 无工号人员保留原有资料和会员身份,仅不参与本次按工号匹配,避免多个空工号导致 Map 键冲突。 + Map userMap = dataUserList.stream() + .filter(user -> StrUtil.isNotBlank(user.getLoginname())) + .collect(Collectors.toMap(Sys_user::getLoginname, v -> v)); List unitList = dao().query(Sys_unit.class, Cnd.where("unitTypeCode", "=", "1").groupBy("name")); 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 6bc1cbb..47c079c 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 @@ -159,20 +159,21 @@ public class MemberManageServiceImpl extends BaseServiceImpl implement his.changeTypes, his.changeOrigin, his.changeReason, - his.remark, gh.`name` AS unionName, - unit.`name` AS unitName, + COALESCE(unit.name, changeRecord.unitName) AS unitName, u.id AS userId FROM `sys_user_history` his LEFT JOIN sys_user u ON u.loginname = his.loginname - LEFT JOIN sys_unit unit ON unit.id = u.unitid + LEFT JOIN member_change_record changeRecord ON changeRecord.id = his.recordId + LEFT JOIN sys_unit unit ON unit.id = COALESCE(NULLIF(changeRecord.unitId, ''), his.unitId) LEFT JOIN sys_union gh ON gh.id = unit.unionId $condition """); Cnd cnd = Cnd.NEW(); cnd.andEX("gh.id", "=", pageForm.getUnionId()); - cnd.andEX("his.unitId", "=", pageForm.getUnitId()); + // 优先使用本次变更目标单位;无关联申请时使用历史记录自身单位,筛选与显示一致。 + cnd.andEX("COALESCE(NULLIF(changeRecord.unitId, ''), his.unitId)", "=", pageForm.getUnitId()); cnd.andEX("his.personType", "=", pageForm.getPersonType()); cnd.andEX("his.userState", "=", pageForm.getUserState()); // 变更记录查询自行拼接历史表条件,需要单独补充人员属性多选及旧单值兼容。 @@ -251,6 +252,8 @@ public class MemberManageServiceImpl extends BaseServiceImpl implement @Override public List getChangeInfos(MemberChangeRecord record) { + // 普通提交、WF 保存拦截器和审核落库均先比较变更,在此统一校准申请单位名称。 + normalizeChangeUnitName(record); View_user info = dao().fetch(View_user.class, Cnd.where("id", "=", record.getUserId())); NutMap map = getDictAllowChangeFields(); @@ -537,6 +540,36 @@ public class MemberManageServiceImpl extends BaseServiceImpl implement } + /** + * 按申请 ID 读取详情并校准单位名称;仅修正返回对象,不改写历史记录。 + * @param id 会员变更申请 ID + * @return 含一致 unitId、unitName 的申请记录;记录不存在时提示错误 + */ + @Override + public MemberChangeRecord findChangeRecordWithUnitName(String id) { + MemberChangeRecord record = dao().fetch(MemberChangeRecord.class, id); + if (record == null) { + throw new BaseException("未找到会员变更申请记录"); + } + normalizeChangeUnitName(record); + return record; + } + + /** + * 名称以申请目标单位 ID 为准,避免前端残留原单位名称;不改变单位 ID 或所属工会。 + * 单位已删除或未填写 ID 时保留原名称,避免用人员当前单位覆盖历史申请含义。 + * @param record 待保存或待展示的申请对象,仅更新内存中的 unitName,不执行数据库更新 + */ + private void normalizeChangeUnitName(MemberChangeRecord record) { + if (record == null || StrUtil.isBlank(record.getUnitId())) { + return; + } + Sys_unit unit = dao().fetch(Sys_unit.class, record.getUnitId()); + if (unit != null && unit.getName() != null) { + record.setUnitName(unit.getName()); + } + } + /** * 统一规范变更记录中的到校日期,避免 Date 对象复制后以英文字符串形式参与比较或直接落库。 */ diff --git a/src/main/resources/static/assets/platform/css/home-portal.css b/src/main/resources/static/assets/platform/css/home-portal.css index 853f8d2..1f9174f 100644 --- a/src/main/resources/static/assets/platform/css/home-portal.css +++ b/src/main/resources/static/assets/platform/css/home-portal.css @@ -96,10 +96,10 @@ #v4-home-app .act-card { padding: 0; border: 0; border-radius: 0; box-shadow: none; } #v4-home-app .activity-swiper-container { padding: 0 0 4px; } #v4-home-app .activity-swiper .swiper-slide .item { display: flex; flex-direction: column; height: 100%; } -/* 加高封面并统一裁剪容器,图片、加载态和占位图都保持相同圆角。 */ -#v4-home-app .activity-swiper .swiper-slide .item .img-box { flex-shrink: 0; height: auto; aspect-ratio: 1.5; border-radius: 10px; overflow: hidden; clip-path: inset(0 round 10px); background: #1687f5; isolation: isolate; } +/* 保留横向卡片比例,海报等比完整居中显示,比例不一致时以浅色背景补齐空白。 */ +#v4-home-app .activity-swiper .swiper-slide .item .img-box { flex-shrink: 0; height: auto; aspect-ratio: 1.5; border-radius: 10px; overflow: hidden; clip-path: inset(0 round 10px); background: #f0f5fb; isolation: isolate; } #v4-home-app .img-box .el-image { display: block; width: 100%; height: 100%; position: absolute; inset: 0; border-radius: inherit; overflow: hidden; } -#v4-home-app .activity-swiper .swiper-slide .item .img-box img { height: 100% !important; max-height: none !important; object-fit: cover !important; border-radius: 10px; } +#v4-home-app .activity-swiper .swiper-slide .item .img-box img { height: 100% !important; max-height: none !important; object-fit: contain !important; object-position: center; border-radius: 10px; } #v4-home-app .activity-swiper .swiper-slide .item .img-box .status { top: 8px; left: 8px; border-radius: 5px; padding: 4px 7px; background: #ed4859; } #v4-home-app .activity-swiper .swiper-slide .item .img-box .status-ended { background: #8b97a7; } #v4-home-app .activity-swiper .swiper-slide .item .img-box .status-upcoming { background: #1687f5; } diff --git a/src/main/resources/views/layouts/v4/home/act.js b/src/main/resources/views/layouts/v4/home/act.js index cee74c4..ea3a947 100644 --- a/src/main/resources/views/layouts/v4/home/act.js +++ b/src/main/resources/views/layouts/v4/home/act.js @@ -12,7 +12,7 @@ const act = {
- +
暂无图片
@@ -356,12 +356,9 @@ const act = { height: 100% !important; max-width: 100% !important; max-height: 128px !important; - object-fit: fill !important; - transition: transform 0.3s ease; - } - - .activity-swiper .swiper-slide .item:hover .img-box img { - transform: scale(1.1); + /* 活动海报含有文字,等比完整显示且悬停时不放大,避免内容被裁切。 */ + object-fit: contain !important; + object-position: center; } .activity-swiper .swiper-slide .item h4 { diff --git a/src/main/resources/views/layouts/v4/home/entry.js b/src/main/resources/views/layouts/v4/home/entry.js index 2e17f03..01b3fa7 100644 --- a/src/main/resources/views/layouts/v4/home/entry.js +++ b/src/main/resources/views/layouts/v4/home/entry.js @@ -5,7 +5,7 @@ const entry = {
+ :class="{active: activeSection === section.key}" @click="switchSection(section.key)">{{ section.title }}
全部应用
@@ -60,6 +60,10 @@ const entry = { this.getFavorite() }, methods: { + // sectionKey 为 serv(推荐服务)、app(推荐应用)或 fav(我的收藏);通过组件方法更新栏目,避免内联事件中 this 指向错误。 + switchSection(sectionKey) { + this.$set(this, 'activeSection', sectionKey) + }, // platform 固定传 PC;Result.data 为当前用户有权限的推荐服务数组。 getRecommendService() { this.$axios.post('/platform/home/listRecommendService', {platform: "PC"}).then(res => { diff --git a/src/main/resources/views/layouts/v4/home/index.html b/src/main/resources/views/layouts/v4/home/index.html index 1b1457e..d4fed09 100644 --- a/src/main/resources/views/layouts/v4/home/index.html +++ b/src/main/resources/views/layouts/v4/home/index.html @@ -118,7 +118,7 @@ layout("/layouts/v4/baseLayout.html"){ - + - - - - - @@ -511,6 +510,7 @@ layout("/layouts/platform.html"){ } } return { + memberRoleLoading: false, addDialogVisible: false, editDialogVisible: false, roleDialogVisible: false, @@ -689,18 +689,30 @@ layout("/layouts/platform.html"){ }) }, doSettingMemberRole() { - this.$confirm("是否确定一键设置会员角色?", "提示", { + if (this.memberRoleLoading) { + return + } + // 操作面向全部会员,忽略当前列表筛选;确认期间也锁定按钮,避免重复提交。 + this.$set(this, "memberRoleLoading", true) + this.$confirm("确定为全部已标记为会员的人员设置会员角色吗?已有角色将保留。", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning" }) - .then(async () => { - const {code, msg} = await this.$axios.post("/platform/sys/role/doSettingMemberRole") - if (code === 0) { - this.$message.success(msg) - } + .then(() => { + return this.$axios.post("/platform/sys/role/doSettingMemberRole").then((res) => { + if (res.code === 0) { + this.$message.success("设置完成:新增 " + res.data.addedCount + + " 条,恢复启用 " + res.data.enabledCount + " 条会员角色关联") + this.pageData() + } + }) }) .catch(() => { + // 取消确认无需提示;请求异常由全局 axios 拦截器统一提示。 + }) + .finally(() => { + this.$set(this, "memberRoleLoading", false) }) }, formatAt(val) { diff --git a/src/main/resources/views/platform/zhgh/democratic/grassrootscongress/material/mine/index.html b/src/main/resources/views/platform/zhgh/democratic/grassrootscongress/material/mine/index.html index e519c8b..032f349 100644 --- a/src/main/resources/views/platform/zhgh/democratic/grassrootscongress/material/mine/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/grassrootscongress/material/mine/index.html @@ -9,8 +9,8 @@ layout("/layouts/platform.html"){ - - + + diff --git a/src/main/resources/views/platform/zhgh/staffmanage/member/apply/submit/index.html b/src/main/resources/views/platform/zhgh/staffmanage/member/apply/submit/index.html index c1834bc..94d3806 100644 --- a/src/main/resources/views/platform/zhgh/staffmanage/member/apply/submit/index.html +++ b/src/main/resources/views/platform/zhgh/staffmanage/member/apply/submit/index.html @@ -124,7 +124,7 @@ layout("/layouts/platform.html"){ - @@ -256,7 +256,6 @@ layout("/layouts/platform.html"){ personalData: [{ required: true, message: "必填", trigger: ["change", "blur"] }], specialty: [{ required: true, message: "必填", trigger: ["change", "blur"] }], marriage: [{ required: true, message: "必填", trigger: ["change", "blur"] }], - arrivalAtSchoolDate: [{ required: true, message: "必填", trigger: ["change", "blur"] }] /*email: [ { validator: (rule, value, callback) => { @@ -321,6 +320,14 @@ layout("/layouts/platform.html"){ } }, methods: { + // 缺失或非法日期回填为空,避免生成十二位 Invalid date;不使用当天日期补缺。 + formatArrivalAtSchoolDate(value) { + if (value === null || value === undefined || String(value).trim() === '') { + return '' + } + const date = this.$moment(value, this.$moment.ISO_8601, true) + return date.isValid() ? date.format('YYYY-MM-DD') : '' + }, normalizeUnitField() { if (!this.formData || !this.formData.unitId) { return @@ -413,6 +420,7 @@ layout("/layouts/platform.html"){ debugger if (res.code === 0) { this.formData = res.data + this.$set(this.formData, "arrivalAtSchoolDate", this.formatArrivalAtSchoolDate(res.data.arrivalAtSchoolDate)) } } else { const { @@ -468,7 +476,7 @@ layout("/layouts/platform.html"){ this.$set(this.formData, "email", email) this.$set(this.formData, "families", families ? families : []) this.$set(this.formData, "personalData", personalData) - this.$set(this.formData, "arrivalAtSchoolDate", this.$moment(arrivalAtSchoolDate).format('YYYY-MM-DD')) + this.$set(this.formData, "arrivalAtSchoolDate", this.formatArrivalAtSchoolDate(arrivalAtSchoolDate)) } } }, diff --git a/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/info.js b/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/info.js index 5e2ae63..2ac5209 100644 --- a/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/info.js +++ b/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/info.js @@ -23,8 +23,9 @@ const INFO = { {{ viewData.unitName }} {{ viewData.unionName }} - {{ viewData.threeUnitName || '暂无' }} - {{ viewData.campus }} + + {{ viewData.threeUnitName || '暂无' }} + {{ viewData.campus }} {{ viewData.idCard }} {{ viewData.mobile }} @@ -74,7 +75,8 @@ const INFO = { - + diff --git a/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/memberAllChangeInfo.js b/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/memberAllChangeInfo.js index 6364300..e1a8579 100644 --- a/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/memberAllChangeInfo.js +++ b/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/memberAllChangeInfo.js @@ -67,7 +67,8 @@ const MEMBER_ALL_CHANGE_INFO = { :key="index" :timestamp="changeData.timestamp">

{{ changeData.changeOriginName }}

- + + @@ -86,6 +87,7 @@ const MEMBER_ALL_CHANGE_INFO = {
+ `, store, diff --git a/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/memberChange.js b/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/memberChange.js index 23eb0e9..c377a8a 100644 --- a/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/memberChange.js +++ b/src/main/resources/views/platform/zhgh/staffmanage/member/change/common/memberChange.js @@ -101,7 +101,8 @@ const MEMBER_CHANGE = { - + + @@ -110,7 +111,7 @@ const MEMBER_CHANGE = { - + @@ -215,8 +216,6 @@ const MEMBER_CHANGE = { value-format="yyyy-MM-dd"> - -