From 71da51c7f8c637aa523ec69574104a513f09e200 Mon Sep 17 00:00:00 2001 From: = <=> Date: Tue, 21 Jul 2026 15:43:48 +0800 Subject: [PATCH] commit --- .../sys/services/SysUnionCadreService.java | 31 ++++ .../impl/SysUnionCadreServiceImpl.java | 145 ++++++++++++++++++ .../ProposalUndertakeConfigService.java | 19 +++ .../ProposalUndertakeConfigServiceImpl.java | 64 ++++++++ 4 files changed, 259 insertions(+) create mode 100644 src/main/java/com/budwk/app/sys/services/SysUnionCadreService.java create mode 100644 src/main/java/com/budwk/app/sys/services/impl/SysUnionCadreServiceImpl.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalUndertakeConfigService.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalUndertakeConfigServiceImpl.java diff --git a/src/main/java/com/budwk/app/sys/services/SysUnionCadreService.java b/src/main/java/com/budwk/app/sys/services/SysUnionCadreService.java new file mode 100644 index 0000000..f276015 --- /dev/null +++ b/src/main/java/com/budwk/app/sys/services/SysUnionCadreService.java @@ -0,0 +1,31 @@ +package com.budwk.app.sys.services; + +import com.budwk.app.base.result.Result; +import com.budwk.app.sys.models.Sys_union_cadre; +import com.budwk.app.base.service.BaseService; + +import java.util.List; + +/** + * 分工会干部档案维护服务。 + */ +public interface SysUnionCadreService extends BaseService { + + /** + * 返回分工会干部页面可维护的角色范围,列表、历史届次和新增校验均使用同一范围。 + * + * @return 可维护的角色编码 + */ + List getBranchUnionRoleCodes(); + + /** + * 新增分工会干部;角色已存在而档案缺失时,仅补充档案,不重复写入角色。 + * + * @param userId 人员ID + * @param roleCode 角色编码 + * @param unionId 分工会ID + * @param j 教代会届次 + * @return 保存结果和可直接展示的提示信息 + */ + Result saveBranchUnionCadre(String userId, String roleCode, String unionId, String j); +} diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysUnionCadreServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysUnionCadreServiceImpl.java new file mode 100644 index 0000000..957f5e5 --- /dev/null +++ b/src/main/java/com/budwk/app/sys/services/impl/SysUnionCadreServiceImpl.java @@ -0,0 +1,145 @@ +package com.budwk.app.sys.services.impl; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.lang.Dict; +import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.base.result.Result; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.flow.constant.FlowConst; +import com.budwk.app.flow.engine.FlowEngine; +import com.budwk.app.flow.entity.ProcessInstance; +import com.budwk.app.flow.entity.ProcessTask; +import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; +import com.budwk.app.sys.models.Sys_dict; +import com.budwk.app.sys.models.Sys_role; +import com.budwk.app.sys.models.Sys_union; +import com.budwk.app.sys.models.Sys_union_cadre; +import com.budwk.app.sys.models.Sys_user_role; +import com.budwk.app.sys.services.SysDictService; +import com.budwk.app.sys.services.SysRoleService; +import com.budwk.app.sys.services.SysUnionCadreService; +import com.budwk.app.sys.services.SysUserService; +import com.budwk.app.sys.views.View_user; +import com.budwk.app.web.commons.auth.utils.AuthUtil; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.aop.Aop; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@IocBean(args = {"refer:dao"}) +public class SysUnionCadreServiceImpl extends BaseServiceImpl implements SysUnionCadreService { + + @Inject + private SysDictService sysDictService; + @Inject + private SysRoleService sysRoleService; + @Inject + private SysUserService sysUserService; + @Inject + private FlowEngine flowEngine; + + public SysUnionCadreServiceImpl(Dao dao) { + super(dao); + } + + @Override + public List getBranchUnionRoleCodes() { + List roleCodes = new ArrayList<>(sysDictService.getSubListByCode("BRANCH_UNION_ROLES") + .stream().map(Sys_dict::getCode).toList()); + roleCodes.add(RoleConstant.BRANCH_UNION_ADMIN.name()); + roleCodes.add(RoleConstant.UNIT_PARTY_SECRETARY.name()); + return roleCodes.stream().filter(StrUtil::isNotBlank).distinct().toList(); + } + + @Override + @Aop(TransAop.READ_COMMITTED) + public Result saveBranchUnionCadre(String userId, String roleCode, String unionId, String j) { + if (StrUtil.hasBlank(userId, roleCode, unionId, j)) { + return Result.error("人员、角色和届数均不能为空"); + } + if (!getBranchUnionRoleCodes().contains(roleCode)) { + return Result.error("该角色不允许在分工会干部中维护"); + } + + Sys_role role = sysRoleService.fetch(Cnd.where("code", "=", roleCode)); + if (Lang.isEmpty(role)) { + return Result.error("未找到对应的角色"); + } + Sys_union union = dao().fetch(Sys_union.class, unionId); + if (union == null) { + return Result.error("未找到对应分工会"); + } + View_user user = dao().fetch(View_user.class, Cnd.where("id", "=", userId)); + if (user == null) { + return Result.error("未找到人员信息"); + } + + Cnd cadreCnd = Cnd.where("userId", "=", userId) + .and("unionId", "=", unionId) + .and("roleCode", "=", roleCode) + .and("j", "=", j) + .and("delFlag", "=", false); + Sys_union_cadre existedCadre = dao().fetch(Sys_union_cadre.class, cadreCnd); + boolean existedRole = dao().count(Sys_user_role.class, Cnd.where("roleId", "=", role.getId()) + .and("userId", "=", userId).and("unionId", "=", unionId)) > 0; + if (existedCadre != null) { + return Result.error("该人员已担任本分工会本届该职务,请勿重复添加"); + } + + Sys_union_cadre unionCadre = buildUnionCadre(user, union, roleCode, j); + dao().insert(unionCadre); + if (existedRole) { + // 历史迁移或人工维护可能先写入角色。此处只补齐档案,避免重复授权或再次发起审批。 + return Result.success("该人员已有该职务,已补充分工会干部档案"); + } + + // 保留原有新增审批流程:新角色仍需发起“分工会干部”流程,管理员按既有规则直接写入角色。 + boolean isAdmin = AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name()); + Dict args = Dict.create(); + args.set("submit", isAdmin ? "admin" : "branch"); + args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode()); + args.set(FlowConst.FORM_DATA, unionCadre); + ProcessInstance instance = flowEngine.startProcessInstanceByKey("JCGHWY", unionCadre.getId(), SecurityUtil.getUserId(), args); + List doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null); + for (ProcessTask task : doingTaskList) { + flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args); + } + if (isAdmin) { + sysRoleService.clear("sys_user_role", Cnd.where("roleId", "=", role.getId()) + .and("userId", "=", userId).and("unionId", "=", unionId)); + sysRoleService.insert("sys_user_role", Chain.make("roleId", role.getId()) + .add("userId", userId).add("unionId", unionId)); + sysRoleService.clearCache(); + sysUserService.clearCache(); + } + return Result.success("添加成功"); + } + + /** + * 从当前人员和分工会信息生成干部档案;只读取人员资料,不修改 sys_user 的任何字段。 + */ + private Sys_union_cadre buildUnionCadre(View_user user, Sys_union union, String roleCode, String j) { + Sys_union_cadre unionCadre = new Sys_union_cadre(); + unionCadre.setUserId(user.getId()); + unionCadre.setUnionId(union.getId()); + unionCadre.setMobile(user.getMobile()); + unionCadre.setUnionName(union.getName()); + unionCadre.setLoginName(user.getLoginname()); + unionCadre.setUserName(user.getUsername()); + unionCadre.setRoleCode(roleCode); + unionCadre.setJ(j); + unionCadre.setApplyDate(new Date()); + unionCadre.setIsServing(true); + unionCadre.setIsJoin(true); + return unionCadre; + } +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalUndertakeConfigService.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalUndertakeConfigService.java new file mode 100644 index 0000000..a419926 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/ProposalUndertakeConfigService.java @@ -0,0 +1,19 @@ +package com.budwk.app.zhgh.democratic.proposal.service; + +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake; +import org.nutz.lang.util.NutMap; + +/** + * 提案承办单位配置服务。 + */ +public interface ProposalUndertakeConfigService extends BaseService { + + /** + * 将系统中有效的二级单位补充为提案承办单位。 + * 已存在相同单位编码的承办单位不会被修改或删除。 + * + * @return 包含候选数、新增数和已存在数的同步结果 + */ + NutMap syncSystemUnits(); +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalUndertakeConfigServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalUndertakeConfigServiceImpl.java new file mode 100644 index 0000000..1bc9b14 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/impl/ProposalUndertakeConfigServiceImpl.java @@ -0,0 +1,64 @@ +package com.budwk.app.zhgh.democratic.proposal.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.sys.models.Sys_unit; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake; +import com.budwk.app.zhgh.democratic.proposal.service.ProposalUndertakeConfigService; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.aop.Aop; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@IocBean(args = {"refer:dao"}) +public class ProposalUndertakeConfigServiceImpl extends BaseServiceImpl implements ProposalUndertakeConfigService { + + public ProposalUndertakeConfigServiceImpl(Dao dao) { + super(dao); + } + + @Override + @Aop(TransAop.READ_COMMITTED) + public NutMap syncSystemUnits() { + // V3 承办单位初始化范围是有父节点的二级单位;V4 的 unitTypeCode 不再能代表这个业务范围。 + List systemUnits = dao().query(Sys_unit.class, Cnd.where(Sys_unit::getUnitLevel, "=", 2) + .and(Sys_unit::getParentId, "is not", null) + .and(Sys_unit::getParentId, "!=", "") + .and(Sys_unit::getDelFlag, "=", false) + .asc(Sys_unit::getUnitcode)); + Set configuredCodes = dao().query(ProposalUndertake.class, Cnd.NEW()).stream() + .map(ProposalUndertake::getCode) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toSet()); + List newUndertakes = systemUnits.stream() + .filter(unit -> StrUtil.isNotBlank(unit.getUnitcode())) + .filter(unit -> !configuredCodes.contains(unit.getUnitcode())) + .map(this::createUndertake) + .toList(); + if (!newUndertakes.isEmpty()) { + dao().fastInsert(newUndertakes); + } + return NutMap.NEW() + .addv("candidateCount", systemUnits.size()) + .addv("insertedCount", newUndertakes.size()) + .addv("existingCount", systemUnits.size() - newUndertakes.size()); + } + + /** + * 承办单位与系统单位只共享稳定的单位 ID、编码和名称;同步时默认启用,不处理负责人角色。 + */ + private ProposalUndertake createUndertake(Sys_unit unit) { + ProposalUndertake undertake = new ProposalUndertake(); + undertake.setId(unit.getId()); + undertake.setCode(unit.getUnitcode()); + undertake.setName(unit.getName()); + undertake.setEnable(true); + return undertake; + } +}