From 06893cf3e9e20937b7610276e23daa4e3651daed Mon Sep 17 00:00:00 2001 From: zhangrui Date: Fri, 21 Aug 2026 14:58:15 +0800 Subject: [PATCH] change --- .../impl/SysDataUserAllUpdateServiceImpl.java | 5 + .../RepresentativeChangeRecordController.java | 49 ++++++ .../models/RepresentativeChangeRecord.java | 106 ++++++++++++ .../RepresentativeChangeRecordPageParam.java | 22 +++ .../RepresentativeChangeRecordService.java | 21 +++ ...RepresentativeChangeRecordServiceImpl.java | 96 +++++++++++ .../TeacherCongressSessionServiceImpl.java | 72 ++++++++ .../delegate/changeRecord/index.html | 155 ++++++++++++++++++ 8 files changed, 526 insertions(+) create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/RepresentativeChangeRecordController.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/RepresentativeChangeRecord.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/param/RepresentativeChangeRecordPageParam.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/RepresentativeChangeRecordService.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/impl/RepresentativeChangeRecordServiceImpl.java create mode 100644 src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/changeRecord/index.html 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 d3448941..790ad4d7 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 @@ -23,6 +23,7 @@ import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig; import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeOrigin; import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeType; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; @@ -160,6 +161,10 @@ public class SysDataUserAllUpdateServiceImpl implements SysDataUserUpdateService for (Sys_user_source source : sources) { Sys_user user = userMap.get(source.getLoginname()); source.setMember(null); + String unitId = source.getUnitId(); + if (StringUtils.isNotBlank(unitId) && unitId.length() == 5) { + source.setUnitId(unitId.substring(0, 3)); + } // 创建用户对象 Sys_user u = new Sys_user(); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/RepresentativeChangeRecordController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/RepresentativeChangeRecordController.java new file mode 100644 index 00000000..03a412b8 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/RepresentativeChangeRecordController.java @@ -0,0 +1,49 @@ +package com.budwk.app.zhgh.democratic.teachercongress.delegate.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.result.Result; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.param.RepresentativeChangeRecordPageParam; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.service.RepresentativeChangeRecordService; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import javax.validation.Valid; + +/** + * 教代会代表变动记录页面及查询接口。 + */ +@IocBean +@At("/platform/jdh/db/changeRecord") +@Ok("json:full") +public class RepresentativeChangeRecordController { + + @Inject + private RepresentativeChangeRecordService representativeChangeRecordService; + + /** + * 打开代表变动记录页面。 + */ + @At("") + @Ok("beetl:/platform/zhgh/democratic/teachercongress/delegate/changeRecord/index.html") + @SaCheckPermission("sys.jdh.db.changeRecord") + public void index() { + } + + /** + * 分页查询代表变动记录。 + * + * @param pageForm 分页、关键字及组织筛选参数 + * @return 代表变动记录分页结果 + */ + @At + @SaCheckPermission("sys.jdh.db.changeRecord") + public Result pageData(@Valid @Param("pageForm") RepresentativeChangeRecordPageParam pageForm) { + Pagination pagination = representativeChangeRecordService.pageData(pageForm); + return Result.success(pagination); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/RepresentativeChangeRecord.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/RepresentativeChangeRecord.java new file mode 100644 index 00000000..46983fe4 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/RepresentativeChangeRecord.java @@ -0,0 +1,106 @@ +package com.budwk.app.zhgh.democratic.teachercongress.delegate.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Comment; +import org.nutz.dao.entity.annotation.Name; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableMeta; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +/** + * 教代会届次延用时产生的代表异动记录。 + * 记录代表在上一届与新一届之间单位、分工会及代表团的对应关系,供后续异动查询使用。 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Table("representative_change_record") +@TableMeta("{'mysql-charset':'utf8mb4'}") +@Comment("教代会代表异动记录") +public class RepresentativeChangeRecord extends BaseModel { + + @Name + @Comment("ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + @PrevInsert(uu32 = true) + private String id; + + @Column + @Comment("用户ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String userId; + + @Column + @Comment("原教代会届次") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String oldJdhSession; + + @Column + @Comment("新教代会届次") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String newJdhSession; + + @Column + @Comment("原单位ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String oldUnitId; + + @Column + @Comment("原单位名称") + @ColDefine(type = ColType.VARCHAR, width = 500) + private String oldUnitName; + + @Column + @Comment("原工会ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String oldUnionId; + + @Column + @Comment("原工会名称") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String oldUnionName; + + @Column + @Comment("原代表团ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String oldDbtId; + + @Column + @Comment("原代表团名称") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String oldDbtName; + + @Column + @Comment("新单位ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String newUnitId; + + @Column + @Comment("新单位名称") + @ColDefine(type = ColType.VARCHAR, width = 500) + private String newUnitName; + + @Column + @Comment("新工会ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String newUnionId; + + @Column + @Comment("新工会名称") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String newUnionName; + + @Column + @Comment("新代表团ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String newDbtId; + + @Column + @Comment("新代表团名称") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String newDbtName; +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/param/RepresentativeChangeRecordPageParam.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/param/RepresentativeChangeRecordPageParam.java new file mode 100644 index 00000000..697eacab --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/param/RepresentativeChangeRecordPageParam.java @@ -0,0 +1,22 @@ +package com.budwk.app.zhgh.democratic.teachercongress.delegate.param; + +import com.budwk.app.base.param.PageForm; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 代表变动记录分页查询参数。 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class RepresentativeChangeRecordPageParam extends PageForm { + + /** 新教代会届次ID。 */ + private String sessionId; + + /** 代表变动后的所属单位ID。 */ + private String unitId; + + /** 代表变动后的所属分工会ID。 */ + private String unionId; +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/RepresentativeChangeRecordService.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/RepresentativeChangeRecordService.java new file mode 100644 index 00000000..d532c499 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/RepresentativeChangeRecordService.java @@ -0,0 +1,21 @@ +package com.budwk.app.zhgh.democratic.teachercongress.delegate.service; + +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.RepresentativeChangeRecord; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.param.RepresentativeChangeRecordPageParam; +import org.nutz.lang.util.NutMap; + +/** + * 教代会代表变动记录服务。 + */ +public interface RepresentativeChangeRecordService extends BaseService { + + /** + * 分页查询代表变动记录,并关联人员及新旧届次名称。 + * + * @param pageForm 分页、关键字及组织筛选条件 + * @return 代表变动记录分页数据 + */ + Pagination pageData(RepresentativeChangeRecordPageParam pageForm); +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/impl/RepresentativeChangeRecordServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/impl/RepresentativeChangeRecordServiceImpl.java new file mode 100644 index 00000000..47080468 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/service/impl/RepresentativeChangeRecordServiceImpl.java @@ -0,0 +1,96 @@ +package com.budwk.app.zhgh.democratic.teachercongress.delegate.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.RepresentativeChangeRecord; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.param.RepresentativeChangeRecordPageParam; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.service.RepresentativeChangeRecordService; +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.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; + +import java.util.Map; + +/** + * 教代会代表变动记录服务实现。 + */ +@IocBean(args = {"refer:dao"}) +public class RepresentativeChangeRecordServiceImpl extends BaseServiceImpl + implements RepresentativeChangeRecordService { + + /** 前端排序字段与查询字段映射,避免将未校验字段直接拼入 SQL。 */ + private static final Map SORT_COLUMNS = Map.of( + "username", "u.username", + "loginname", "u.loginname", + "oldJdhName", "oldSession.fullName", + "newJdhName", "newSession.fullName", + "oldUnitName", "c.oldUnitName", + "newUnitName", "c.newUnitName", + "oldDbtName", "c.oldDbtName", + "newDbtName", "c.newDbtName" + ); + + public RepresentativeChangeRecordServiceImpl(Dao dao) { + super(dao); + } + + /** + * 分页查询代表变动记录,并关联当前人员姓名、工号及新旧届次名称。 + * + * @param pageForm 分页、关键字及组织筛选条件 + * @return 可直接供列表展示的分页 Map 数据 + */ + @Override + @SuppressWarnings("unchecked") + public Pagination pageData(RepresentativeChangeRecordPageParam pageForm) { + Sql sql = Sqls.create(""" + SELECT + c.*, + u.username, + u.loginname, + oldSession.fullName AS oldJdhName, + newSession.fullName AS newJdhName + FROM representative_change_record c + LEFT JOIN sys_user u ON c.userId = u.id + LEFT JOIN teacher_congress_session oldSession ON oldSession.id = c.oldJdhSession + LEFT JOIN teacher_congress_session newSession ON newSession.id = c.newJdhSession + $condition + """); + sql.setCondition(buildCondition(pageForm)); + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + } + + /** + * 组装代表变动记录查询条件。单位和分工会均按变动后的组织信息筛选,保持与原系统口径一致。 + * + * @param pageForm 页面查询参数 + * @return SQL 查询条件及安全排序规则 + */ + private Cnd buildCondition(RepresentativeChangeRecordPageParam pageForm) { + Cnd cnd = Cnd.NEW(); + cnd.andEX("c.newJdhSession", "=", pageForm.getSessionId()); + cnd.andEX("c.newUnionId", "=", pageForm.getUnionId()); + cnd.andEX("c.newUnitId", "=", pageForm.getUnitId()); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + String keyword = "%" + pageForm.getSearchKeyword().trim() + "%"; + cnd.and(Cnd.exps("u.username", "like", keyword) + .or("u.loginname", "like", keyword)); + } + + String sortColumn = SORT_COLUMNS.get(pageForm.getPageOrderName()); + if (StrUtil.isNotBlank(sortColumn)) { + if ("ascending".equalsIgnoreCase(pageForm.getPageOrderBy())) { + cnd.asc(sortColumn); + } else { + cnd.desc(sortColumn); + } + } else { + cnd.desc("c.createdAt"); + } + return cnd; + } +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/prepare/service/impl/TeacherCongressSessionServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/prepare/service/impl/TeacherCongressSessionServiceImpl.java index 2a968a98..fb4aa6d1 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/prepare/service/impl/TeacherCongressSessionServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/prepare/service/impl/TeacherCongressSessionServiceImpl.java @@ -17,6 +17,7 @@ import com.budwk.app.sys.services.SysRoleService; import com.budwk.app.sys.services.SysUserService; import com.budwk.app.sys.views.View_user; import com.budwk.app.zhgh.democratic.proposal.models.ProposalType; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.RepresentativeChangeRecord; import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.Teacher_congress_delegate; import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation; import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation_union; @@ -46,6 +47,8 @@ import java.util.Date; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; @IocBean(args = {"refer:dao"}) public class TeacherCongressSessionServiceImpl extends BaseServiceImpl implements TeacherCongressSessionService { @@ -131,6 +134,9 @@ public class TeacherCongressSessionServiceImpl extends BaseServiceImpl lastDelegations = dao().query(Teacher_congress_delegation.class, Cnd.where("sessionId", "=", lastSession.getId())); + // 保留上一届代表团ID与实体的对应关系,用于代表延用完成后判断代表团是否发生异动。 + Map lastDelegationsMap = lastDelegations.stream() + .collect(Collectors.toMap(Teacher_congress_delegation::getId, delegation -> delegation)); for (Teacher_congress_delegation lastDelegation : lastDelegations) { //代表团继承 Teacher_congress_delegation newDelegation = BeanUtil.copyProperties(lastDelegation, Teacher_congress_delegation.class); @@ -201,10 +207,17 @@ public class TeacherCongressSessionServiceImpl extends BaseServiceImpl newSessionDelegations = dao().query(Teacher_congress_delegation.class, + Cnd.where(Teacher_congress_delegation::getSessionId, "=", session.getId())); + Map newDelegationsMap = newSessionDelegations.stream() + .collect(Collectors.toMap(Teacher_congress_delegation::getId, delegation -> delegation)); + //代表数据 单位 分工会 要根据最新的设置来调整 //代表数据 List lastDelegates = dao().query(Teacher_congress_delegate.class, Cnd.where(Teacher_congress_delegate::getSessionId, "=", lastSession.getId())); + List changeRecords = new ArrayList<>(); List newDelegates = lastDelegates.stream().map(lastDelegate -> { Teacher_congress_delegate newDelegate = BeanUtil.copyProperties(lastDelegate, Teacher_congress_delegate.class); newDelegate.setId(R.UU32()); @@ -241,9 +254,20 @@ public class TeacherCongressSessionServiceImpl extends BaseServiceImpl oldDelegationsMap, + Map newDelegationsMap) { + Teacher_congress_delegation oldDelegation = oldDelegationsMap.get(oldDelegate.getDelegationId()); + Teacher_congress_delegation newDelegation = newDelegationsMap.get(newDelegate.getDelegationId()); + if (oldDelegation == null || newDelegation == null + || Objects.equals(oldDelegation.getCode(), newDelegation.getCode())) { + return null; + } + + RepresentativeChangeRecord record = new RepresentativeChangeRecord(); + record.setOldJdhSession(oldSessionId); + record.setNewJdhSession(newSessionId); + record.setUserId(oldDelegate.getUserId()); + record.setOldUnitId(oldDelegate.getUnitId()); + record.setOldUnitName(oldDelegate.getUnitName()); + record.setOldUnionId(oldDelegate.getUnionId()); + record.setOldUnionName(oldDelegate.getUnionName()); + record.setOldDbtId(oldDelegate.getDelegationId()); + record.setOldDbtName(oldDelegation.getName()); + record.setNewUnitId(newDelegate.getUnitId()); + record.setNewUnitName(newDelegate.getUnitName()); + record.setNewUnionId(newDelegate.getUnionId()); + record.setNewUnionName(newDelegate.getUnionName()); + record.setNewDbtId(newDelegate.getDelegationId()); + record.setNewDbtName(newDelegation.getName()); + return record; + } + /** * 修改届次基础信息。提案类型在保存前统一完成 JSON 解析、去重和长度校验, * 避免新增与编辑使用不同的数据格式。 @@ -492,6 +561,9 @@ public class TeacherCongressSessionServiceImpl extends BaseServiceImpl + +
+ + + +
+ + + +