diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/controller/PendingConfirmUserController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/controller/PendingConfirmUserController.java new file mode 100644 index 00000000..5c439c8b --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/controller/PendingConfirmUserController.java @@ -0,0 +1,47 @@ +package com.budwk.app.zhgh.staffmanage.sourcechange.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.budwk.app.base.result.Result; +import com.budwk.app.zhgh.staffmanage.sourcechange.param.PendingConfirmUserPageForm; +import com.budwk.app.zhgh.staffmanage.sourcechange.service.PendingConfirmUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +/** + * 待确认人员记录页面及查询接口。 + */ +@Api(tags = "待确认人员记录") +@IocBean +@At("/platform/sourcechange/pending") +public class PendingConfirmUserController { + + @Inject + private PendingConfirmUserService pendingConfirmUserService; + + /** + * 打开待确认人员记录页面。 + */ + @At("") + @Ok("beetl:/platform/zhgh/staffmanage/sourcechange/pending/index.html") + @SaCheckPermission("staff.sourcechange.pending") + public void index() { + } + + /** + * 分页查询待确认或已确认人员。 + * + * @param pageForm 查询条件 + * @return 人员分页数据 + */ + @At + @Ok("json") + @ApiOperation("分页查询待确认人员记录") + @SaCheckPermission("staff.sourcechange.pending") + public Result pageData(PendingConfirmUserPageForm pageForm) { + return Result.success(pendingConfirmUserService.pageData(pageForm)); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/param/PendingConfirmUserPageForm.java b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/param/PendingConfirmUserPageForm.java new file mode 100644 index 00000000..7c210f6a --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/param/PendingConfirmUserPageForm.java @@ -0,0 +1,28 @@ +package com.budwk.app.zhgh.staffmanage.sourcechange.param; + +import com.budwk.app.base.param.PageForm; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 待确认人员记录分页查询参数。 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class PendingConfirmUserPageForm extends PageForm { + + /** 所属工会ID。 */ + private String unionId; + + /** 所属单位ID。 */ + private String unitId; + + /** 人员类型。 */ + private String personType; + + /** 在职状态。 */ + private String userState; + + /** 确认状态:1待确认、2已确认,默认查询待确认。 */ + private Integer pendingConfirmStatus = 1; +} 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 new file mode 100644 index 00000000..865a1274 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/service/PendingConfirmUserService.java @@ -0,0 +1,27 @@ +package com.budwk.app.zhgh.staffmanage.sourcechange.service; + +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.zhgh.staffmanage.sourcechange.param.PendingConfirmUserPageForm; + +/** + * 待确认人员记录业务服务。 + */ +public interface PendingConfirmUserService extends BaseService { + + /** + * 分页查询待确认或已确认人员。 + * + * @param pageForm 查询条件 + * @return 人员分页数据 + */ + Pagination pageData(PendingConfirmUserPageForm pageForm); + + /** + * 人员变更提交成功后,将待确认状态更新为已确认。 + * + * @param userId 系统用户ID + */ + void markConfirmed(String userId); +} 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 new file mode 100644 index 00000000..053be69a --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/sourcechange/service/impl/PendingConfirmUserServiceImpl.java @@ -0,0 +1,123 @@ +package com.budwk.app.zhgh.staffmanage.sourcechange.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.base.utils.PageUtil; +import com.budwk.app.sys.models.Sys_user; +import com.budwk.app.zhgh.staffmanage.sourcechange.param.PendingConfirmUserPageForm; +import com.budwk.app.zhgh.staffmanage.sourcechange.service.PendingConfirmUserService; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.SqlExpressionGroup; +import org.nutz.ioc.loader.annotation.IocBean; + +import java.util.Map; + +/** + * 待确认人员记录业务实现。 + */ +@IocBean(args = {"refer:dao"}) +public class PendingConfirmUserServiceImpl extends BaseServiceImpl implements PendingConfirmUserService { + + private static final int STATUS_PENDING = 1; + private static final int STATUS_CONFIRMED = 2; + + public PendingConfirmUserServiceImpl(Dao dao) { + super(dao); + } + + /** + * 从系统用户表查询确认状态为待确认或已确认的人员。 + * + * @param pageForm 查询条件 + * @return 人员分页数据 + */ + @Override + public Pagination pageData(PendingConfirmUserPageForm pageForm) { + Sql sql = Sqls.create(""" + SELECT + userInfo.id, + userInfo.loginname, + userInfo.username, + userInfo.sex, + userInfo.userState, + userInfo.personType, + userInfo.unitId, + unitInfo.name AS unitName, + unionInfo.id unionId, + unionInfo.name AS unionName, + userInfo.pendingConfirmStatus + FROM sys_user userInfo + LEFT JOIN sys_unit unitInfo ON unitInfo.id = userInfo.unitId + LEFT JOIN sys_union unionInfo ON unionInfo.id = unitInfo.unionId + $condition + """); + Cnd cnd = Cnd.NEW(); + int status = Integer.valueOf(STATUS_CONFIRMED).equals(pageForm.getPendingConfirmStatus()) + ? STATUS_CONFIRMED : STATUS_PENDING; + cnd.and("userInfo.pendingConfirmStatus", "=", status); + + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + SqlExpressionGroup keywordGroup = new SqlExpressionGroup(); + keywordGroup.orLike("userInfo.loginname", pageForm.getSearchKeyword()); + keywordGroup.orLike("userInfo.username", pageForm.getSearchKeyword()); + cnd.and(keywordGroup); + } + cnd.andEX("userInfo.unionId", "=", pageForm.getUnionId()); + cnd.andEX("userInfo.unitId", "=", pageForm.getUnitId()); + cnd.andEX("userInfo.personType", "=", pageForm.getPersonType()); + cnd.andEX("userInfo.userState", "=", pageForm.getUserState()); + + String orderColumn = resolveOrderColumn(pageForm.getPageOrderName()); + if (StrUtil.isAllNotBlank(orderColumn, pageForm.getPageOrderBy())) { + cnd.orderBy(orderColumn, PageUtil.getOrder(pageForm.getPageOrderBy())); + } else { + cnd.asc("userInfo.loginname"); + } + sql.setCondition(cnd); + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + } + + /** + * 变更提交成功后仅把待确认人员更新为已确认,重复调用不会改变其他状态。 + * + * @param userId 系统用户ID + */ + @Override + public void markConfirmed(String userId) { + if (StrUtil.isBlank(userId)) { + return; + } + Sql sql = Sqls.create(""" + UPDATE sys_user + SET pendingConfirmStatus = @confirmedStatus + WHERE id = @userId + AND pendingConfirmStatus = @pendingStatus + """); + sql.setParam("confirmedStatus", STATUS_CONFIRMED); + sql.setParam("pendingStatus", STATUS_PENDING); + sql.setParam("userId", userId); + dao().execute(sql); + } + + /** + * 将前端排序字段转换为固定数据库字段,避免排序参数直接拼接到 SQL。 + * + * @param pageOrderName 前端排序字段 + * @return 允许排序的数据库字段,不支持时返回空字符串 + */ + private String resolveOrderColumn(String pageOrderName) { + Map orderColumns = Map.of( + "loginname", "userInfo.loginname", + "username", "userInfo.username", + "unionName", "unionInfo.name", + "unitName", "unitInfo.name", + "personType", "userInfo.personType", + "userState", "userInfo.userState" + ); + return orderColumns.getOrDefault(StrUtil.nullToEmpty(pageOrderName), ""); + } +} diff --git a/src/main/resources/db/sys_user_add_pending_confirm_status.sql b/src/main/resources/db/sys_user_add_pending_confirm_status.sql new file mode 100644 index 00000000..10a2a8dd --- /dev/null +++ b/src/main/resources/db/sys_user_add_pending_confirm_status.sql @@ -0,0 +1,19 @@ +-- 系统用户增加人员待确认状态:0不用确认、1待确认、2已确认。 +-- 脚本支持重复执行,字段已存在时不再修改表结构。 +SET @pending_confirm_status_column_count = ( + SELECT COUNT(*) + FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'sys_user' + AND COLUMN_NAME = 'pendingConfirmStatus' +); + +SET @pending_confirm_status_ddl = IF( + @pending_confirm_status_column_count = 0, + 'ALTER TABLE sys_user ADD COLUMN pendingConfirmStatus TINYINT NOT NULL DEFAULT 0 COMMENT ''待确认状态:0不用确认、1待确认、2已确认'' AFTER personType', + 'SELECT 1' +); + +PREPARE pending_confirm_status_stmt FROM @pending_confirm_status_ddl; +EXECUTE pending_confirm_status_stmt; +DEALLOCATE PREPARE pending_confirm_status_stmt; diff --git a/src/main/resources/db/sys_user_role_add_enable.sql b/src/main/resources/db/sys_user_role_add_enable.sql new file mode 100644 index 00000000..775cfbe5 --- /dev/null +++ b/src/main/resources/db/sys_user_role_add_enable.sql @@ -0,0 +1,41 @@ +-- 用户角色关系增加启用状态,并按当前开启的教代会届次初始化历史数据。 +-- 脚本支持重复执行:字段已存在时不再重复修改表结构。 +SET @sys_user_role_enable_column_count = ( + SELECT COUNT(*) + FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'sys_user_role' + AND COLUMN_NAME = 'enable' +); + +SET @sys_user_role_enable_ddl = IF( + @sys_user_role_enable_column_count = 0, + 'ALTER TABLE sys_user_role ADD COLUMN enable TINYINT(1) NOT NULL DEFAULT 1 COMMENT ''是否启用:1启用,0禁用'' AFTER userId', + 'SELECT 1' +); + +PREPARE sys_user_role_enable_stmt FROM @sys_user_role_enable_ddl; +EXECUTE sys_user_role_enable_stmt; +DEALLOCATE PREPARE sys_user_role_enable_stmt; + +-- 普通角色不受教代会届次切换影响,历史数据统一保持启用。 +UPDATE sys_user_role +SET enable = 1 +WHERE tcSessionId IS NULL OR tcSessionId = ''; + +-- 历史教代会届次角色先全部禁用,再只启用当前开启的最新届次。 +UPDATE sys_user_role +SET enable = 0 +WHERE tcSessionId IS NOT NULL AND tcSessionId <> ''; + +SET @current_teacher_congress_session_id = ( + SELECT id + FROM teacher_congress_session + WHERE enable = 1 + ORDER BY startDate DESC, createdAt DESC, id DESC + LIMIT 1 +); + +UPDATE sys_user_role +SET enable = 1 +WHERE tcSessionId = @current_teacher_congress_session_id;