From bf433727b9095591077e1337f0bcd37eac6114f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=9C=E5=AD=A6=E6=88=90?= <1274337408@qq.com> Date: Tue, 20 Oct 2026 21:35:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=AC=E4=BC=9A=E7=BB=84=E7=BB=87=E7=AE=A1?= =?UTF-8?q?=E7=90=86:=E5=9F=BA=E5=B1=82=E5=B9=B2=E9=83=A8=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=EF=BC=8C=E4=BB=A5=E5=8F=8A=E5=B1=8A=E6=AC=A1=E6=95=B4?= =?UTF-8?q?=E6=94=B9=EF=BC=8C=E6=96=B0=E5=A2=9E=E7=A6=BB=E4=BB=BB=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E5=92=8C=E5=AE=A1=E6=A0=B8=E7=95=8C=E9=9D=A2=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=88=86=E5=B7=A5=E4=BC=9A=E6=90=9C=E7=B4=A2=E9=A1=B9?= =?UTF-8?q?=E3=80=82=E7=A7=BB=E9=99=A4=E5=88=A0=E9=99=A4=E5=9F=BA=E5=B1=82?= =?UTF-8?q?=E5=B9=B2=E9=83=A8=E7=9B=B8=E5=85=B3=E8=A7=92=E8=89=B2=E7=9A=84?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E6=B5=81=E7=A8=8B=EF=BC=9B=E5=85=81=E8=AE=B8?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E7=AE=A1=E7=90=86=E5=91=98=E5=92=8C=E6=A0=A1?= =?UTF-8?q?=E5=B7=A5=E4=BC=9A=E7=AE=A1=E7=90=86=E5=91=98=E5=85=8D=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=E6=B7=BB=E5=8A=A0=E5=9F=BA=E5=B1=82=E5=B9=B2=E9=83=A8?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E8=A7=92=E8=89=B2=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../unioncadre/UnionCadreAuditController.java | 28 ++++++- .../sys/unioncadre/UnionCadreController.java | 81 ++++++++++++++++--- .../java/io/v/nutz/sys/models/UnionCadre.java | 7 ++ .../components/sys/union/cadre/Audit.vue | 53 +++++++++++- .../components/sys/union/cadre/Mange.vue | 64 ++++++++++++++- .../views/platform/sys/union/unionMange.html | 4 +- 6 files changed, 216 insertions(+), 21 deletions(-) diff --git a/src/main/java/io/v/nutz/sys/controllers/platform/sys/unioncadre/UnionCadreAuditController.java b/src/main/java/io/v/nutz/sys/controllers/platform/sys/unioncadre/UnionCadreAuditController.java index 327e610..0b78bc5 100644 --- a/src/main/java/io/v/nutz/sys/controllers/platform/sys/unioncadre/UnionCadreAuditController.java +++ b/src/main/java/io/v/nutz/sys/controllers/platform/sys/unioncadre/UnionCadreAuditController.java @@ -13,10 +13,12 @@ import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; import java.util.List; +import java.util.stream.Collectors; /** * 基层干部审核 @@ -71,7 +73,7 @@ public class UnionCadreAuditController { @At @ViReturn - public Object pageData(PageForm pageForm) { + public Object pageData(PageForm pageForm, boolean audit, String workersCongressSession, String unionId) { Sql sql = Sqls.create(""" SELECT uc.*, @@ -93,11 +95,33 @@ public class UnionCadreAuditController { pageForm.defaultSortDesc("uc.workersCongressSession"); CndPlus cnd = CndPlus.create(); - cnd.and("uc.auditStateId", "=", UnionCadreAuditState.SCHOOL_UNION); + if (audit) { + cnd.and("uc.auditStateId", "in", Lang.array( + UnionCadreAuditState.SCHOOL_UNION_FAIL, + UnionCadreAuditState.SUCCESS + )); + } else { + cnd.and("uc.auditStateId", "=", UnionCadreAuditState.SCHOOL_UNION); + } + cnd.andEX("uc.workersCongressSession", "=", workersCongressSession); + cnd.andEX("uc.unionId", "=", unionId); cnd.and(pageForm); sql.setCondition(cnd); return cadreService.list(pageForm, sql); } + @At + @ViReturn + public Object usedSessions(String unionId) { + Cnd cnd = Cnd.NEW(); + cnd.andEX("unionId", "=", unionId); + List sessions = cadreService.query(cnd).stream() + .map(UnionCadre::getWorkersCongressSession) + .filter(session -> session != null && !session.isBlank()) + .distinct() + .collect(Collectors.toList()); + return sessions; + } + } diff --git a/src/main/java/io/v/nutz/sys/controllers/platform/sys/unioncadre/UnionCadreController.java b/src/main/java/io/v/nutz/sys/controllers/platform/sys/unioncadre/UnionCadreController.java index db1ec11..afbcf80 100644 --- a/src/main/java/io/v/nutz/sys/controllers/platform/sys/unioncadre/UnionCadreController.java +++ b/src/main/java/io/v/nutz/sys/controllers/platform/sys/unioncadre/UnionCadreController.java @@ -6,19 +6,27 @@ import io.v.nutz.base.utils.PageUtil; import io.v.nutz.base.dao.CndPlus; import io.v.nutz.base.query.PageForm; import io.v.nutz.sys.models.Sys_role; +import io.v.nutz.sys.models.Sys_user_role; import io.v.nutz.sys.models.UnionCadre; import io.v.nutz.sys.services.SysDictService; import io.v.nutz.sys.services.SysRoleService; +import io.v.nutz.sys.services.SysUserRoleService; +import io.v.nutz.sys.services.SysUserService; import io.v.nutz.sys.services.UnionCadreService; +import io.v.nutz.web.commons.utils.ShiroUtil; +import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; 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.lang.Strings; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; +import java.util.Date; + /** * 基层干部 * @@ -40,6 +48,12 @@ public class UnionCadreController { @Inject private SysDictService sysDictService; + @Inject + private SysUserRoleService userRoleService; + + @Inject + private SysUserService userService; + @At @ViReturn public Object pageData(PageForm pageForm, String unionid) { @@ -64,7 +78,7 @@ public class UnionCadreController { CndPlus cnd = CndPlus.create(); cnd.and(pageForm); - cnd.andEx("u.unionid", "=", unionid); + cnd.andEx("uc.unionId", "=", unionid); if (Strings.isNotBlank(pageForm.getPageOrderName()) && Strings.isNotBlank(pageForm.getPageOrderBy())) { cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); } else { @@ -77,30 +91,79 @@ public class UnionCadreController { @At @ViReturn + @Aop(TransAop.READ_COMMITTED) public Object createCadre(UnionCadre cadre, String roleCode) { Sys_role role = roleService.fetch(Cnd.where("code", "=", roleCode)); - Cnd cnd = Cnd.where("userId", "=", cadre.getUserId()).and("roleId", "=", role.getId()).and("unionId", "=", cadre.getUnionId()).and("workersCongressSession", "=", cadre.getWorkersCongressSession()); + Cnd roleCnd = Cnd.where("userId", "=", cadre.getUserId()).and("roleId", "=", role.getId()).and("unionid", "=", cadre.getUnionId()); + Cnd pendingCnd = Cnd.where("userId", "=", cadre.getUserId()).and("roleId", "=", role.getId()).and("unionId", "=", cadre.getUnionId()) + .and("joining", "=", true).and("auditStateId", "=", UnionCadreAuditState.SCHOOL_UNION).and("leaveDate", "is", null); - if (unionCadreService.count(cnd) > 0) { + if (userRoleService.count(roleCnd) > 0 || unionCadreService.count(pendingCnd) > 0) { return Result.error("此操作重复!"); } - cadre.setJoining(true).setRoleId(role.getId()).setAuditStateId(UnionCadreAuditState.SCHOOL_UNION); + // 校工会管理员和系统管理员直接授权,不进入审核。 + boolean isAdmin = ShiroUtil.hasAnyRoles("sysadmin,SchoolUnionAdmin"); + cadre.setJoining(true).setRoleId(role.getId()).setAuditStateId(isAdmin + ? UnionCadreAuditState.SUCCESS + : UnionCadreAuditState.SCHOOL_UNION); unionCadreService.insert(cadre); + + if (isAdmin) { + Sys_user_role userRole = new Sys_user_role(); + userRole.setUserId(cadre.getUserId()); + userRole.setRoleId(role.getId()); + userRole.setUnionid(cadre.getUnionId()); + userRoleService.insert(userRole); + userService.deleteCache(cadre.getUserId()); + } return null; } @At @ViReturn + @Aop(TransAop.READ_COMMITTED) public Object removeCadre(String id) { UnionCadre cadre = unionCadreService.fetch(id); - if (UnionCadreAuditState.SUCCESS != cadre.getAuditStateId() && cadre.isJoining()) { - unionCadreService.delete(id); - } else { - cadre.setJoining(false).setAuditStateId(UnionCadreAuditState.SCHOOL_UNION); - unionCadreService.update(cadre); + if (cadre == null) { + return Result.error("未找到对应干部记录!"); } + if (cadre.getLeaveDate() != null) { + unionCadreService.delete(id); + return null; + } + + // 删除在任干部时直接移除角色,不发起退出审核。 + userRoleService.clear(Cnd.where("userId", "=", cadre.getUserId()).and("roleId", "=", cadre.getRoleId()).and("unionid", "=", cadre.getUnionId())); + unionCadreService.delete(id); + userService.deleteCache(cadre.getUserId()); + return null; + } + + @At + @ViReturn + @Aop(TransAop.READ_COMMITTED) + public Object leaveCadre(String id, Date leaveDate) { + if (leaveDate == null) { + return Result.error("请选择离任时间!"); + } + + UnionCadre cadre = unionCadreService.fetch(id); + if (cadre == null) { + return Result.error("未找到对应干部记录!"); + } + if (cadre.getLeaveDate() != null) { + return Result.error("该干部已离任!"); + } + if (UnionCadreAuditState.SUCCESS != cadre.getAuditStateId() || !cadre.isJoining()) { + return Result.error("仅已审核通过的在任干部可办理离任!"); + } + + cadre.setLeaveDate(leaveDate); + unionCadreService.update(cadre); + userRoleService.clear(Cnd.where("userId", "=", cadre.getUserId()).and("roleId", "=", cadre.getRoleId()).and("unionid", "=", cadre.getUnionId())); + userService.deleteCache(cadre.getUserId()); return null; } diff --git a/src/main/java/io/v/nutz/sys/models/UnionCadre.java b/src/main/java/io/v/nutz/sys/models/UnionCadre.java index 89a79ac..606ccfc 100644 --- a/src/main/java/io/v/nutz/sys/models/UnionCadre.java +++ b/src/main/java/io/v/nutz/sys/models/UnionCadre.java @@ -5,6 +5,8 @@ import lombok.Data; import lombok.experimental.Accessors; import org.nutz.dao.entity.annotation.*; +import java.util.Date; + /** * 基层干部 * @@ -48,6 +50,11 @@ public class UnionCadre { @ColDefine(type = ColType.BOOLEAN) private boolean joining; + @Column + @Comment("离任时间") + @ColDefine(type = ColType.DATETIME) + private Date leaveDate; + @Column @Comment("审核状态id") @ColDefine(type = ColType.INT, width = 8) diff --git a/src/main/resources/static/components/sys/union/cadre/Audit.vue b/src/main/resources/static/components/sys/union/cadre/Audit.vue index 720a21a..aa57735 100644 --- a/src/main/resources/static/components/sys/union/cadre/Audit.vue +++ b/src/main/resources/static/components/sys/union/cadre/Audit.vue @@ -4,10 +4,26 @@ @@ -18,6 +34,7 @@ @selection-change="handleSelectionChange"> @@ -71,6 +88,11 @@ module.exports = { }, data() { return { + pageForm: { + audit: false, + workersCongressSession: '', + unionId: '' + }, tableColumns: [ {prop: 'username', label: '姓名'}, {prop: 'loginname', label: '工号'}, @@ -79,11 +101,27 @@ module.exports = { {prop: 'rolename', label: '职务'}, {prop: 'workersCongressSession', label: '届次'}, {prop: 'joining', label: '申请类型'}, + {prop: 'stateName', label: '审核状态'}, ], multipleSelection: [], + sessionOptions: [], + usedSessionCodes: [], + unionOptions: [], } }, methods: { + hasSessionData(code) { + return this.usedSessionCodes.includes(code) + }, + async loadUsedSessionCodes() { + const {code, data} = await $.get('/platform/union/cadre/audit/usedSessions', { + unionId: this.pageForm.unionId + }) + this.usedSessionCodes = code === 0 ? (data || []) : [] + }, + unionChange() { + this.doSearch() + }, handleSelectionChange(val) { this.multipleSelection = val; }, @@ -105,6 +143,7 @@ module.exports = { }) }, pageData() { + this.loadUsedSessionCodes() sublime.showLoadingbar(); this.tableLoading = true $.post("/platform/union/cadre/audit/pageData", this.pageForm, (data) => { @@ -124,12 +163,18 @@ module.exports = { this.doSearch() } }, - created() { + async created() { + this.sessionOptions = await getDictOptions('jc') + this.unionOptions = await getUnions(null) this.doSearch() } } diff --git a/src/main/resources/static/components/sys/union/cadre/Mange.vue b/src/main/resources/static/components/sys/union/cadre/Mange.vue index 6245fae..fde2d23 100644 --- a/src/main/resources/static/components/sys/union/cadre/Mange.vue +++ b/src/main/resources/static/components/sys/union/cadre/Mange.vue @@ -87,7 +87,8 @@ align="center" show-overflow-tooltip > @@ -98,11 +99,15 @@ align="center" width="150"> @@ -211,7 +236,10 @@ module.exports = { roleCode: [{required: true, message: '必选', trigger: ['blur', 'change']}], userId: [{required: true, message: '必选', trigger: ['blur', 'change']}], }, - submitLoading: false + submitLoading: false, + leaveDialogVisible: false, + leaveForm: {}, + leaveSubmitLoading: false } }, watch: { @@ -282,6 +310,34 @@ module.exports = { this.$set(row, "delLoading", false) }, + openLeave(row) { + this.leaveForm = { + id: row.id, + leaveDate: '' + } + this.leaveDialogVisible = true + }, + + async doLeave() { + if (!this.leaveForm.leaveDate) { + this.$message.error('请选择离任时间') + return + } + + this.leaveSubmitLoading = true + const {code, msg} = await $.post('/platform/union/cadre/leaveCadre', this.leaveForm) + if (code === 0) { + this.leaveDialogVisible = false + this.pageData() + } + this.$notify({ + title: code === 0 ? '成功' : '失败', + type: code === 0 ? 'success' : 'error', + message: msg, + }) + this.leaveSubmitLoading = false + }, + async userRemoteMethod(query) { if (!query) { this.userOptions = [] diff --git a/src/main/resources/views/platform/sys/union/unionMange.html b/src/main/resources/views/platform/sys/union/unionMange.html index d8b6038..f4d974a 100644 --- a/src/main/resources/views/platform/sys/union/unionMange.html +++ b/src/main/resources/views/platform/sys/union/unionMange.html @@ -1129,8 +1129,8 @@ layout("/layouts/platform.html"){ 'tree-layout': httpVueLoader('/components/plugins/TreeLayout.vue'), 'dict-select': httpVueLoader('/components/plugins/DictSelect.vue'), 'union-cadre': httpVueLoader('/components/sys/union/UnionCadreMange.vue?v=1.0.89'), - 'union-cadre-mange': httpVueLoader('/components/sys/union/cadre/Mange.vue?v=1.0.5'), - 'union-cadre-audit': httpVueLoader('/components/sys/union/cadre/Audit.vue?v=1.0.5'), + 'union-cadre-mange': httpVueLoader('/components/sys/union/cadre/Mange.vue?v=1.0.9'), + 'union-cadre-audit': httpVueLoader('/components/sys/union/cadre/Audit.vue?v=1.0.7'), }, watch: { filterText(val) {