diff --git a/src/main/java/com/budwk/app/base/constant/RoleConstant.java b/src/main/java/com/budwk/app/base/constant/RoleConstant.java index 69f1abf..cd1969d 100644 --- a/src/main/java/com/budwk/app/base/constant/RoleConstant.java +++ b/src/main/java/com/budwk/app/base/constant/RoleConstant.java @@ -50,6 +50,7 @@ RoleConstant { BRANCH_UNION_WENTI_SPORTS("分工会文体福利委员"), UNIT_PARTY_SECRETARY("单位党委书记"), + UNIT_MANAGER("单位负责人"), TEACHER_CONGRESS_DELEGATE_FORMAL("教代会正式代表"), TEACHER_CONGRESS_DELEGATE_ATTENDANCE("教代会列席代表"), diff --git a/src/main/java/com/budwk/app/flow/handler/FlowInitiatorPartyOrganizationAssignmentHandler.java b/src/main/java/com/budwk/app/flow/handler/FlowInitiatorPartyOrganizationAssignmentHandler.java new file mode 100644 index 0000000..5d5b7da --- /dev/null +++ b/src/main/java/com/budwk/app/flow/handler/FlowInitiatorPartyOrganizationAssignmentHandler.java @@ -0,0 +1,50 @@ +package com.budwk.app.flow.handler; + +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.base.exception.BaseException; +import com.budwk.app.flow.constant.FlowConst; +import com.budwk.app.flow.engine.AssignmentHandler; +import com.budwk.app.flow.engine.core.Execution; +import com.budwk.app.flow.engine.core.ServiceContext; +import com.budwk.app.flow.engine.model.TaskModel; +import com.budwk.app.sys.services.SysUserService; + +import java.util.List; + +/** + * 按流程发起时固化的分工会 ID 获取二级党组织党委书记。 + * + *

二级党组织以分工会为范围,通过角色用户所属单位关联分工会,不跨组织兜底。

+ */ +public class FlowInitiatorPartyOrganizationAssignmentHandler implements AssignmentHandler { + + /** 根据流程发起人所属分工会查找全部有效二级党组织党委书记。 */ + @Override + public List assign(TaskModel model, Execution execution) { + String unionId = execution.getArgs().getStr(FlowConst.INITIATOR_UNIT_UNION_ID); + if (StrUtil.isBlank(unionId)) { + throw new BaseException("流程发起人缺少所属分工会,无法分配二级党组织审核任务"); + } + + // 角色关系表不维护分工会范围,通过角色用户的单位关联 sys_unit.unionId。 + List userIds = ServiceContext.find(SysUserService.class) + .getEnabledRoleUserIdsByUnion(unionId, RoleConstant.UNIT_PARTY_SECRETARY.name()); + if (userIds.isEmpty()) { + throw new BaseException("流程发起人所属二级党组织未设置党委书记,请联系校工会进行设置"); + } + return userIds; + } + + /** 返回流程设计器展示的参与人说明。 */ + @Override + public String getMessage() { + return "流程发起人所属二级党组织党委书记"; + } + + /** 返回处理类在流程参与者列表中的排序值。 */ + @Override + public int getOrder() { + return 240; + } +} diff --git a/src/main/java/com/budwk/app/flow/handler/FlowInitiatorUnitManagerAssignmentHandler.java b/src/main/java/com/budwk/app/flow/handler/FlowInitiatorUnitManagerAssignmentHandler.java new file mode 100644 index 0000000..53957db --- /dev/null +++ b/src/main/java/com/budwk/app/flow/handler/FlowInitiatorUnitManagerAssignmentHandler.java @@ -0,0 +1,50 @@ +package com.budwk.app.flow.handler; + +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.base.exception.BaseException; +import com.budwk.app.flow.constant.FlowConst; +import com.budwk.app.flow.engine.AssignmentHandler; +import com.budwk.app.flow.engine.core.Execution; +import com.budwk.app.flow.engine.core.ServiceContext; +import com.budwk.app.flow.engine.model.TaskModel; +import com.budwk.app.sys.services.SysUserService; + +import java.util.List; + +/** + * 按流程发起时固化的单位 ID 获取单位负责人。 + * + *

审核流程进入后续节点时当前登录人已发生变化,因此不能使用当前登录人的单位信息。

+ */ +public class FlowInitiatorUnitManagerAssignmentHandler implements AssignmentHandler { + + /** 根据流程发起人单位查找全部有效单位负责人。 */ + @Override + public List assign(TaskModel model, Execution execution) { + String unitId = execution.getArgs().getStr(FlowConst.INITIATOR_UNIT_ID); + if (StrUtil.isBlank(unitId)) { + throw new BaseException("流程发起人缺少所属单位,无法分配单位审核任务"); + } + + // 角色关系表不维护单位范围,实际组织归属由角色用户的 sys_user.unitId 确定。 + List userIds = ServiceContext.find(SysUserService.class) + .getEnabledRoleUserIdsByUnit(unitId, RoleConstant.UNIT_MANAGER.name()); + if (userIds.isEmpty()) { + throw new BaseException("流程发起人所属单位未设置单位负责人,请联系校工会进行设置"); + } + return userIds; + } + + /** 返回流程设计器展示的参与人说明。 */ + @Override + public String getMessage() { + return "流程发起人所属单位负责人"; + } + + /** 返回处理类在流程参与者列表中的排序值。 */ + @Override + public int getOrder() { + return 230; + } +} diff --git a/src/main/java/com/budwk/app/sys/services/SysUserService.java b/src/main/java/com/budwk/app/sys/services/SysUserService.java index 2cce57f..7c35ff0 100644 --- a/src/main/java/com/budwk/app/sys/services/SysUserService.java +++ b/src/main/java/com/budwk/app/sys/services/SysUserService.java @@ -198,4 +198,22 @@ public interface SysUserService extends BaseService { String loginPlus(Sys_user user, LoginType loginType, HttpServletRequest request); Sys_user getByLoginName(String loginName); + + /** + * 查询指定单位中具有目标角色的有效用户。 + * + * @param unitId 单位 ID + * @param roleCode 角色编码 + * @return 符合条件的用户 ID,已去重 + */ + List getEnabledRoleUserIdsByUnit(String unitId, String roleCode); + + /** + * 查询指定分工会(即二级党组织范围)中具有目标角色的有效用户。 + * + * @param unionId 分工会 ID + * @param roleCode 角色编码 + * @return 符合条件的用户 ID,已去重 + */ + List getEnabledRoleUserIdsByUnion(String unionId, String roleCode); } diff --git a/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java b/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java index 63a9140..2693259 100644 --- a/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java +++ b/src/main/java/com/budwk/app/sys/services/impl/SysUserServiceImpl.java @@ -64,6 +64,78 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys @Inject private RedisService redisService; + /** + * 按用户当前所属单位查询角色人员。 + * sys_user_role 仅用于确认用户具有目标角色,组织范围统一取 sys_user.unitId, + * 避免依赖未维护的 sys_user_role.unitId 字段导致流程无人可分派。 + * + * @param unitId 单位 ID + * @param roleCode 角色编码 + * @return 对应单位下有效且具有目标角色的用户 ID + */ + @Override + public List getEnabledRoleUserIdsByUnit(String unitId, String roleCode) { + if (StrUtil.hasBlank(unitId, roleCode)) { + return List.of(); + } + Sql sql = Sqls.create(""" + SELECT DISTINCT u.id + FROM sys_user_role ur + INNER JOIN sys_role r ON r.id = ur.roleId + INNER JOIN sys_user u ON u.id = ur.userId + WHERE r.code = @roleCode + AND r.disabled = 0 + AND IFNULL(r.delFlag, 0) = 0 + AND u.unitId = @unitId + AND u.disabled = 0 + AND IFNULL(u.delFlag, 0) = 0 + AND u.loginname IS NOT NULL + AND u.loginname <> '' + """); + sql.setParam("unitId", unitId); + sql.setParam("roleCode", roleCode); + sql.setCallback(Sqls.callback.strList()); + dao().execute(sql); + return sql.getList(String.class); + } + + /** + * 按用户当前单位关联的分工会查询角色人员。 + * 角色用户通过 sys_user.unitId 关联 sys_unit,再以 sys_unit.unionId 确定 + * 二级党组织范围,不读取未维护的 sys_user_role.unionId 字段。 + * + * @param unionId 分工会 ID + * @param roleCode 角色编码 + * @return 对应二级党组织下有效且具有目标角色的用户 ID + */ + @Override + public List getEnabledRoleUserIdsByUnion(String unionId, String roleCode) { + if (StrUtil.hasBlank(unionId, roleCode)) { + return List.of(); + } + Sql sql = Sqls.create(""" + SELECT DISTINCT u.id + FROM sys_user_role ur + INNER JOIN sys_role r ON r.id = ur.roleId + INNER JOIN sys_user u ON u.id = ur.userId + INNER JOIN sys_unit unit ON unit.id = u.unitId + WHERE r.code = @roleCode + AND r.disabled = 0 + AND IFNULL(r.delFlag, 0) = 0 + AND unit.unionId = @unionId + AND IFNULL(unit.delFlag, 0) = 0 + AND u.disabled = 0 + AND IFNULL(u.delFlag, 0) = 0 + AND u.loginname IS NOT NULL + AND u.loginname <> '' + """); + sql.setParam("unionId", unionId); + sql.setParam("roleCode", roleCode); + sql.setCallback(Sqls.callback.strList()); + dao().execute(sql); + return sql.getList(String.class); + } + @Override @CacheResult(cacheKey = "${userId}_getPermissionList") public List getPermissionList(String userId) { diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleBranchUnionApprovalController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleBranchUnionApprovalController.java index 4bd5a58..6ae3f6d 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleBranchUnionApprovalController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleBranchUnionApprovalController.java @@ -42,6 +42,7 @@ public class ArticleBranchUnionApprovalController { @SaCheckPermission("article.branchUnionApproval") @ApiOperation("分页查询") public Result pageData(@Valid ArticleInfoPageParam pageForm, boolean approval) { + // 返回流程定义ID,供新闻投稿公共详情组件加载对应的流程图。 Sql sql = Sqls.create(""" SELECT info.id, @@ -55,6 +56,7 @@ public class ArticleBranchUnionApprovalController { ins.businessNo, ins.state instanceState, ins.variable instanceVariable, + ins.processDefineId instanceProcessDefineId, t.id taskId, t.taskName AS taskKey, t.displayName taskName, diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleClubApprovalController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleClubApprovalController.java index 26a7213..6f48c3c 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleClubApprovalController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleClubApprovalController.java @@ -61,6 +61,7 @@ public class ArticleClubApprovalController { @SaCheckPermission("article.clubApproval") @ApiOperation("分页查询") public Result pageData(@Valid ArticleInfoPageParam pageForm, boolean approval) { + // 返回流程定义ID,供新闻投稿公共详情组件加载对应的流程图。 Sql sql = Sqls.create(""" SELECT info.id, @@ -74,6 +75,7 @@ public class ArticleClubApprovalController { ins.businessNo, ins.state instanceState, ins.variable instanceVariable, + ins.processDefineId instanceProcessDefineId, t.id taskId, t.taskName AS taskKey, t.displayName taskName, diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleExamineController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleExamineController.java index 2d4a51b..cc8ec04 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleExamineController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleExamineController.java @@ -67,6 +67,7 @@ public class ArticleExamineController { @SaCheckPermission("article.examine") @ApiOperation("分页查询") public Result pageData(@Valid ArticleInfoPageParam pageForm, boolean approval) { + // 返回流程定义ID,供新闻投稿公共详情组件加载对应的流程图。 Sql sql = Sqls.create(""" SELECT info.id, @@ -80,6 +81,7 @@ public class ArticleExamineController { ins.businessNo, ins.state instanceState, ins.variable instanceVariable, + ins.processDefineId instanceProcessDefineId, t.id taskId, t.taskName AS taskKey, t.displayName taskName, diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleMineController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleMineController.java index 72fa113..d57bbaa 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleMineController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleMineController.java @@ -52,6 +52,7 @@ public class ArticleMineController { @SaCheckPermission("article.mine") @ApiOperation("分页查询") public Result pageData(@Valid ArticleInfoPageParam pageForm) { + // 返回流程定义ID,供新闻投稿公共详情组件加载对应的流程图。 Sql sql = Sqls.create(""" SELECT info.id, @@ -65,6 +66,7 @@ public class ArticleMineController { ins.businessNo, ins.state instanceState, ins.variable instanceVariable, + ins.processDefineId instanceProcessDefineId, t.id taskId, t.taskName AS taskKey, t.displayName taskName, diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleQueryController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleQueryController.java index c191c59..92ecfe9 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleQueryController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleQueryController.java @@ -41,6 +41,7 @@ public class ArticleQueryController { @SaCheckPermission("article.query") @ApiOperation(value = "分页列表") public Result pageData(@Valid ArticleInfoPageParam pageForm) { + // 返回流程定义ID,供新闻投稿公共详情组件加载对应的流程图。 Sql sql = Sqls.create(""" SELECT info.id, @@ -55,6 +56,7 @@ public class ArticleQueryController { ins.businessNo, ins.state instanceState, ins.variable instanceVariable, + ins.processDefineId instanceProcessDefineId, t.id taskId, t.taskName AS taskKey, t.displayName taskName, diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleSchoolUnionApprovalController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleSchoolUnionApprovalController.java index 270143f..ce8f696 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleSchoolUnionApprovalController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/article/controller/ArticleSchoolUnionApprovalController.java @@ -54,6 +54,7 @@ public class ArticleSchoolUnionApprovalController { @SaCheckPermission("article.schoolUnionApproval") @ApiOperation("分页查询") public Result pageData(@Valid ArticleInfoPageParam pageForm, boolean approval) { + // 返回流程定义ID,供新闻投稿公共详情组件加载对应的流程图。 Sql sql = Sqls.create(""" SELECT info.id, @@ -67,6 +68,7 @@ public class ArticleSchoolUnionApprovalController { ins.businessNo, ins.state instanceState, ins.variable instanceVariable, + ins.processDefineId instanceProcessDefineId, t.id taskId, t.taskName AS taskKey, t.displayName taskName, diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/constant/EvaluateConstant.java b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/constant/EvaluateConstant.java index c5aee45..7b0c3c1 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/constant/EvaluateConstant.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/constant/EvaluateConstant.java @@ -7,4 +7,28 @@ public class EvaluateConstant { */ public static final String HONOR_TYPE_CODE = "H1000"; + /** 流程网关读取的审核路线参数名。 */ + public static final String APPROVAL_ROUTE_KEY = "evaluationApprovalRoute"; + + /** 机关与直属单位工会申请需要先经过单位审核。 */ + public static final String UNIT_APPROVAL_ROUTE = "unitApproval"; + + /** 其他分工会申请直接进入分工会审核。 */ + public static final String BRANCH_UNION_APPROVAL_ROUTE = "branchUnionApproval"; + + /** 机关与直属单位工会编码。 */ + public static final String DIRECT_UNIT_UNION_CODE = "01"; + + /** 流程发起人提交申请后进入的单位负责人审核节点。 */ + public static final String UNIT_APPROVAL_TASK_KEY = "b14df33c-053c-4a91-a1b7-283ae70ece56"; + + /** 分工会主席或管理员审核节点。 */ + public static final String BRANCH_UNION_APPROVAL_TASK_KEY = "3bdaa29d-e5eb-4e3e-b7f1-14d03bedd078"; + + /** 流程发起人所属二级党组织的党委书记审核节点。 */ + public static final String PARTY_ORGANIZATION_APPROVAL_TASK_KEY = "7dbdd0ed-05bb-4c31-9f5d-bfad3b3e2e26"; + + /** 校工会管理员审核节点。 */ + public static final String SCHOOL_UNION_APPROVAL_TASK_KEY = "3c158aca-89ef-4188-bbc3-e8db201f02a1"; + } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateApplyController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateApplyController.java index 4321534..d94faf9 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateApplyController.java @@ -15,6 +15,7 @@ import com.budwk.app.flow.service.FlowCommonService; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.dayofficework.evaluation.models.EvaluateActivity; import com.budwk.app.zhgh.dayofficework.evaluation.models.EvaluateApply; +import com.budwk.app.zhgh.dayofficework.evaluation.constant.EvaluateConstant; import com.budwk.app.zhgh.dayofficework.evaluation.service.EvaluateActivityService; import com.budwk.app.zhgh.dayofficework.evaluation.service.EvaluateService; import io.swagger.annotations.Api; @@ -141,6 +142,9 @@ public class EvaluateApplyController { Dict args = Dict.create(); args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode()); args.set(FlowConst.FORM_DATA, evaluateApply); + // 通用流程决策节点只读取流程参数,提交时根据发起人所属工会固化首次审核路线。 + args.set(EvaluateConstant.APPROVAL_ROUTE_KEY, + evaluateService.getApprovalRoute(SecurityUtil.getUnionId())); ProcessInstance instance = flowEngine.startProcessInstanceByKey("PYPX", evaluateApply.getId(), SecurityUtil.getUserId(), args); // 自动完成第一个申请任务 diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateBranchUnionApprovalController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateBranchUnionApprovalController.java index fcf0f14..3724fb1 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateBranchUnionApprovalController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateBranchUnionApprovalController.java @@ -1,117 +1,46 @@ package com.budwk.app.zhgh.dayofficework.evaluation.controller; import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.hutool.core.util.StrUtil; -import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; -import com.budwk.app.base.utils.PageUtil; -import com.budwk.app.bpm.service.BpmService; -import com.budwk.app.flow.enums.ProcessTaskStateEnum; -import com.budwk.app.web.commons.auth.utils.SecurityUtil; -import com.budwk.app.web.controllers.open.commons.service.CommonService; +import com.budwk.app.zhgh.dayofficework.evaluation.constant.EvaluateConstant; import com.budwk.app.zhgh.dayofficework.evaluation.service.EvaluateService; import com.budwk.app.zhgh.dayofficework.evaluation.vo.EvaluatePageForm; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -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.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; import javax.validation.Valid; -import java.util.List; +/** + * 评优评先分工会审核入口。 + */ @IocBean @At("/platform/evaluate/branchUnionApproval") @Ok("json:full") @Api(tags = "评优评先分工会审核") public class EvaluateBranchUnionApprovalController { - @Inject - private Dao dao; - @Inject - private BpmService bpmService; @Inject private EvaluateService evaluateService; - @Inject - private CommonService commonService; + /** 打开评优评先分工会审核页面。 */ @At("") @Ok("beetl:/platform/zhgh/dayofficework/evaluation/branchUnionApproval/index.html") @SaCheckPermission("evaluation.branchUnionApproval") public void index() { } + /** + * 查询当前用户在分工会审核节点的待办或已办任务。 + */ @At @SaCheckPermission("evaluation.branchUnionApproval") - @ApiOperation("数据列表") - @Ok("json") - public Result pageData(@Valid EvaluatePageForm pageForm, Boolean approval){ - Sql sql = Sqls.create(""" - SELECT - info.*, - ea.name AS evaluateName, - hb.name AS honorName, - bs.name as honorTypeName, - ins.id AS instanceId, - ins.businessNo, - ins.state instanceState, - ins.variable instanceVariable, - ins.processDefineId instanceProcessDefineId, - t.id taskId, - t.taskName AS taskKey, - t.displayName taskName, - t.taskType, - t.performType taskPerformType, - t.taskState, - t.finishTime, - t.taskParentId, - t.variable taskVariable, - IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName, - IF(rt.id IS NOT NULL, 1, 0) AS canRevoke - FROM - wf_process_task t - LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId - 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 - LEFT JOIN evaluate_apply info ON info.id = ins.businessNo - LEFT JOIN evaluate_activity ea ON ea.id = info.evaluateId - LEFT JOIN honor_basic_settings hb ON hb.id = info.honorId - LEFT JOIN honor_basic_settings bs ON bs.id = info.honorTypeId - $condition - """); - Cnd cnd = Cnd.NEW(); - cnd.and("t.taskName", "=", "3bdaa29d-e5eb-4e3e-b7f1-14d03bedd078"); - cnd.andEX("info.evaluateId", "=", pageForm.getEvaluateId()); - cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); - if (approval) { - cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); - } else { - cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); - } - if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { - SqlExpressionGroup seg = new SqlExpressionGroup(); - seg.orLike("info.userName", pageForm.getSearchKeyword()); - seg.orLike("info.loginName", pageForm.getSearchKeyword()); - cnd.and(seg); - } - cnd.andEX("YEAR(info.applyDateTime)", "=", pageForm.getYear()); - cnd.groupBy("t.id"); - if(StrUtil.isAllBlank(pageForm.getPageOrderName(),pageForm.getPageOrderBy())){ - cnd.desc("t.createdAt").desc("info.applyDateTime"); - }else{ - cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); - } - - sql.setCondition(cnd); - Pagination pagination = evaluateService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); - return Result.success(pagination); + @ApiOperation("分工会审核数据列表") + public Result pageData(@Valid EvaluatePageForm pageForm, Boolean approval) { + return Result.success(evaluateService.listApprovalPage(pageForm, approval, + EvaluateConstant.BRANCH_UNION_APPROVAL_TASK_KEY)); } - } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluatePartyOrganizationApprovalController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluatePartyOrganizationApprovalController.java new file mode 100644 index 0000000..df8d187 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluatePartyOrganizationApprovalController.java @@ -0,0 +1,48 @@ +package com.budwk.app.zhgh.dayofficework.evaluation.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.budwk.app.base.result.Result; +import com.budwk.app.zhgh.dayofficework.evaluation.constant.EvaluateConstant; +import com.budwk.app.zhgh.dayofficework.evaluation.service.EvaluateService; +import com.budwk.app.zhgh.dayofficework.evaluation.vo.EvaluatePageForm; +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; + +import javax.validation.Valid; + +/** + * 评优评先二级党组织审核入口。 + */ +@IocBean +@At("/platform/evaluate/partyOrganizationApproval") +@Ok("json:full") +@Api(tags = "评优评先二级党组织审核") +public class EvaluatePartyOrganizationApprovalController { + + @Inject + private EvaluateService evaluateService; + + /** + * 打开二级党组织审核页面,并复用评优评先审核公共页面。 + */ + @At("") + @Ok("beetl:/platform/zhgh/dayofficework/evaluation/branchUnionApproval/index.html") + @SaCheckPermission("evaluation.partyOrganizationApproval") + public void index() { + } + + /** + * 查询当前用户在二级党组织审核节点的待办或已办任务。 + */ + @At + @SaCheckPermission("evaluation.partyOrganizationApproval") + @ApiOperation("二级党组织审核数据列表") + public Result pageData(@Valid EvaluatePageForm pageForm, Boolean approval) { + return Result.success(evaluateService.listApprovalPage(pageForm, approval, + EvaluateConstant.PARTY_ORGANIZATION_APPROVAL_TASK_KEY)); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateSchoolUnionApprovalController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateSchoolUnionApprovalController.java index dc6ca0b..48df25f 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateSchoolUnionApprovalController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateSchoolUnionApprovalController.java @@ -1,159 +1,46 @@ package com.budwk.app.zhgh.dayofficework.evaluation.controller; import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.StrUtil; -import com.budwk.app.base.annotation.SLog; -import com.budwk.app.base.constant.RoleConstant; -import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; -import com.budwk.app.base.utils.PageUtil; -import com.budwk.app.bpm.enums.BpmTaskApprovalTypeEnum; -import com.budwk.app.bpm.param.BpmTaskApprovalParam; -import com.budwk.app.bpm.service.BpmService; -import com.budwk.app.flow.enums.ProcessTaskStateEnum; -import com.budwk.app.sys.models.Sys_user_role; -import com.budwk.app.web.commons.auth.utils.SecurityUtil; -import com.budwk.app.web.controllers.open.commons.service.CommonService; -import com.budwk.app.zhgh.dayofficework.evaluation.models.EvaluateApply; +import com.budwk.app.zhgh.dayofficework.evaluation.constant.EvaluateConstant; import com.budwk.app.zhgh.dayofficework.evaluation.service.EvaluateService; import com.budwk.app.zhgh.dayofficework.evaluation.vo.EvaluatePageForm; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.nutz.aop.interceptor.ioc.TransAop; -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.aop.Aop; 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; -import org.nutz.mvc.annotation.Param; import javax.validation.Valid; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +/** + * 评优评先校工会审核入口。 + */ @IocBean @At("/platform/evaluate/schoolUnionApproval") @Ok("json:full") @Api(tags = "评优评先校工会审核") public class EvaluateSchoolUnionApprovalController { - @Inject - private Dao dao; - @Inject - private BpmService bpmService; @Inject private EvaluateService evaluateService; - @Inject - private CommonService commonService; + /** 打开评优评先校工会审核页面。 */ @At("") @Ok("beetl:/platform/zhgh/dayofficework/evaluation/schoolUnionApproval/index.html") @SaCheckPermission("evaluation.schoolUnionApproval") public void index() { } + /** + * 查询当前用户在校工会审核节点的待办或已办任务。 + */ @At @SaCheckPermission("evaluation.schoolUnionApproval") - @ApiOperation("数据列表") - @Ok("json") - public Result pageData(@Valid EvaluatePageForm pageForm, Boolean approval){ - Sql sql = Sqls.create(""" - SELECT - info.*, - ea.name AS evaluateName, - hb.name AS honorName, - bs.name as honorTypeName, - ins.id AS instanceId, - ins.businessNo, - ins.state instanceState, - ins.variable instanceVariable, - ins.processDefineId instanceProcessDefineId, - t.id taskId, - t.taskName AS taskKey, - t.displayName taskName, - t.taskType, - t.performType taskPerformType, - t.taskState, - t.finishTime, - t.taskParentId, - t.variable taskVariable, - IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName, - IF(rt.id IS NOT NULL, 1, 0) AS canRevoke - FROM - wf_process_task t - LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId - LEFT JOIN evaluate_apply info ON info.id = ins.businessNo - LEFT JOIN evaluate_activity ea ON ea.id = info.evaluateId - LEFT JOIN honor_basic_settings hb ON hb.id = info.honorId - LEFT JOIN honor_basic_settings bs ON bs.id = info.honorTypeId - 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 - $condition - """); - Cnd cnd = Cnd.NEW(); - cnd.and("t.taskName", "=", "3c158aca-89ef-4188-bbc3-e8db201f02a1"); - cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); - cnd.andEX("info.unionId","=",pageForm.getUnionId()); - cnd.andEX("info.unitId","=",pageForm.getUnitId()); - cnd.andEX("info.evaluateId","=",pageForm.getEvaluateId()); - - if (approval) { - cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); - } else { - cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); - } - if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { - SqlExpressionGroup seg = new SqlExpressionGroup(); - seg.orLike("info.userName", pageForm.getSearchKeyword()); - seg.orLike("info.loginName", pageForm.getSearchKeyword()); - cnd.and(seg); - } - cnd.andEX("YEAR(info.applyDateTime)", "=", pageForm.getYear()); - cnd.groupBy("t.id"); - if(StrUtil.isAllBlank(pageForm.getPageOrderName(),pageForm.getPageOrderBy())){ - cnd.desc("t.createdAt").desc("info.applyDateTime"); - }else{ - cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); - } - sql.setCondition(cnd); - Pagination pagination = evaluateService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); - return Result.success(pagination); + @ApiOperation("校工会审核数据列表") + public Result pageData(@Valid EvaluatePageForm pageForm, Boolean approval) { + return Result.success(evaluateService.listApprovalPage(pageForm, approval, + EvaluateConstant.SCHOOL_UNION_APPROVAL_TASK_KEY)); } - - @At - @SaCheckPermission("evaluation.schoolUnionApproval") - @ApiOperation("审核") - @SLog(tag = "评优评先校工会审核", msg = "校工会审核") - @Aop(TransAop.READ_COMMITTED) - public Result approval(@Valid @Param("approval") BpmTaskApprovalParam approvalParam){ - approvalParam.getBpmTaskApprovalTypeEnum(); - Map variables = BeanUtil.beanToMap(approvalParam); - EvaluateApply evaluateApply = evaluateService.fetch(approvalParam.getProcessInstanceBusinessId()); - List assignments = new ArrayList<>(); - if(approvalParam.getBpmTaskApprovalTypeEnum().equals(BpmTaskApprovalTypeEnum.PASS)){ - String schoolUnionApprovalLoginName = commonService.findUserLoginNameByRoleCode(RoleConstant.SCHOOL_UNION_ADMIN, Cnd.where(Sys_user_role::getUnionId, "=", evaluateApply.getUnionId())); - assignments.add(schoolUnionApprovalLoginName); - } - bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), approvalParam.getBpmTaskApprovalTypeEnum(), variables, assignments); - return Result.success(); - } - - @At - @SaCheckPermission("evaluation.branchUnionApproval") - @ApiOperation("撤回") - @SLog(tag = "评优评先校工会审核", msg = "撤回") - @Aop(TransAop.READ_COMMITTED) - public Result revoke(@Valid String taskId){ - bpmService.revokeTask(taskId); - return Result.success(); - } - } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateUnitApprovalController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateUnitApprovalController.java new file mode 100644 index 0000000..5f59486 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateUnitApprovalController.java @@ -0,0 +1,48 @@ +package com.budwk.app.zhgh.dayofficework.evaluation.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.budwk.app.base.result.Result; +import com.budwk.app.zhgh.dayofficework.evaluation.constant.EvaluateConstant; +import com.budwk.app.zhgh.dayofficework.evaluation.service.EvaluateService; +import com.budwk.app.zhgh.dayofficework.evaluation.vo.EvaluatePageForm; +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; + +import javax.validation.Valid; + +/** + * 评优评先单位负责人审核入口。 + */ +@IocBean +@At("/platform/evaluate/unitApproval") +@Ok("json:full") +@Api(tags = "评优评先单位审核") +public class EvaluateUnitApprovalController { + + @Inject + private EvaluateService evaluateService; + + /** + * 打开单位审核页面,并复用评优评先审核公共页面。 + */ + @At("") + @Ok("beetl:/platform/zhgh/dayofficework/evaluation/branchUnionApproval/index.html") + @SaCheckPermission("evaluation.unitApproval") + public void index() { + } + + /** + * 查询当前用户在单位审核节点的待办或已办任务。 + */ + @At + @SaCheckPermission("evaluation.unitApproval") + @ApiOperation("单位审核数据列表") + public Result pageData(@Valid EvaluatePageForm pageForm, Boolean approval) { + return Result.success(evaluateService.listApprovalPage(pageForm, approval, + EvaluateConstant.UNIT_APPROVAL_TASK_KEY)); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/service/EvaluateService.java b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/service/EvaluateService.java index 4f4a633..4cb7244 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/service/EvaluateService.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/service/EvaluateService.java @@ -1,6 +1,7 @@ package com.budwk.app.zhgh.dayofficework.evaluation.service; import com.budwk.app.base.service.BaseService; +import com.budwk.app.base.page.Pagination; import com.budwk.app.zhgh.dayofficework.evaluation.models.EvaluateApply; import com.budwk.app.zhgh.dayofficework.evaluation.vo.EvaluatePageForm; import org.nutz.dao.sql.Sql; @@ -10,4 +11,22 @@ public interface EvaluateService extends BaseService { Sql getSummarySql(EvaluatePageForm pageForm); + + /** + * 按流程节点查询当前用户的评优评先已办或待办任务。 + * + * @param pageForm 查询和分页参数 + * @param approval true 查询已审核,false 查询未审核 + * @param taskKey 流程任务节点标识 + * @return 审核任务分页数据 + */ + Pagination listApprovalPage(EvaluatePageForm pageForm, Boolean approval, String taskKey); + + /** + * 根据流程发起人的所属工会确定首次审核路线。 + * + * @param unionId 流程发起人所属工会 ID + * @return 流程决策节点使用的路线参数值 + */ + String getApprovalRoute(String unionId); } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/service/impl/EvaluateServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/service/impl/EvaluateServiceImpl.java index 87b4611..7d7b6ef 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/service/impl/EvaluateServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/service/impl/EvaluateServiceImpl.java @@ -1,9 +1,14 @@ package com.budwk.app.zhgh.dayofficework.evaluation.service.impl; import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.exception.BaseException; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.base.utils.PageUtil; import com.budwk.app.flow.enums.ProcessTaskStateEnum; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.sys.models.Sys_union; +import com.budwk.app.zhgh.dayofficework.evaluation.constant.EvaluateConstant; import com.budwk.app.zhgh.dayofficework.evaluation.models.EvaluateApply; import com.budwk.app.zhgh.dayofficework.evaluation.service.EvaluateService; import com.budwk.app.zhgh.dayofficework.evaluation.vo.EvaluatePageForm; @@ -14,6 +19,8 @@ import org.nutz.dao.sql.Sql; import org.nutz.dao.util.cri.SqlExpressionGroup; import org.nutz.ioc.loader.annotation.IocBean; +import java.util.List; + @IocBean(args = {"refer:dao"}) public class EvaluateServiceImpl extends BaseServiceImpl implements EvaluateService { public EvaluateServiceImpl(Dao dao) { @@ -76,4 +83,92 @@ public class EvaluateServiceImpl extends BaseServiceImpl implemen sql.setCondition(cnd); return sql; } + + /** + * 统一查询评优评先各审核节点任务,确保四级审核页面使用一致的数据权限与查询口径。 + */ + @Override + public Pagination listApprovalPage(EvaluatePageForm pageForm, Boolean approval, String taskKey) { + Sql sql = Sqls.create(""" + SELECT + info.*, + ea.name AS evaluateName, + hb.name AS honorName, + bs.name AS honorTypeName, + ins.id AS instanceId, + ins.businessNo, + ins.state AS instanceState, + ins.variable AS instanceVariable, + ins.processDefineId AS instanceProcessDefineId, + t.id AS taskId, + t.taskName AS taskKey, + t.displayName AS taskName, + t.taskType, + t.performType AS taskPerformType, + t.taskState, + t.finishTime, + t.taskParentId, + t.variable AS taskVariable, + IFNULL(GROUP_CONCAT(DISTINCT nt.displayName), '结束') AS curTaskName, + IF(rt.id IS NOT NULL, 1, 0) AS canRevoke + FROM wf_process_task t + LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId + 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 + LEFT JOIN evaluate_apply info ON info.id = ins.businessNo + LEFT JOIN evaluate_activity ea ON ea.id = info.evaluateId + LEFT JOIN honor_basic_settings hb ON hb.id = info.honorId + LEFT JOIN honor_basic_settings bs ON bs.id = info.honorTypeId + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("t.taskName", "=", taskKey); + cnd.and("ta.actorId", "=", SecurityUtil.getUserId()); + cnd.andEX("info.evaluateId", "=", pageForm.getEvaluateId()); + cnd.andEX("info.unionId", "=", pageForm.getUnionId()); + cnd.andEX("info.unitId", "=", pageForm.getUnitId()); + + // 已审核保留完成、后续撤回和中断的历史任务;未审核只返回当前待办。 + if (Boolean.TRUE.equals(approval)) { + cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), + ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); + } else { + cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); + } + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + SqlExpressionGroup keywordGroup = new SqlExpressionGroup(); + keywordGroup.orLike("info.userName", pageForm.getSearchKeyword()); + keywordGroup.orLike("info.loginName", pageForm.getSearchKeyword()); + cnd.and(keywordGroup); + } + cnd.andEX("YEAR(info.applyDateTime)", "=", pageForm.getYear()); + cnd.groupBy("t.id"); + if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { + cnd.desc("t.createdAt").desc("info.applyDateTime"); + } else { + cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + } + sql.setCondition(cnd); + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + } + + /** + * 根据发起人所属工会编码生成流程网关参数。 + * 只有编码为 01 的“机关与直属单位工会”需要先走单位审核,其他工会直接进入分工会审核。 + */ + @Override + public String getApprovalRoute(String unionId) { + if (StrUtil.isBlank(unionId)) { + throw new BaseException("流程发起人未设置所属工会,无法确定评优评先审核路线"); + } + Sys_union union = dao().fetch(Sys_union.class, + Cnd.where(Sys_union::getId, "=", unionId).and(Sys_union::getDelFlag, "=", false)); + if (union == null || StrUtil.isBlank(union.getUnionCode())) { + throw new BaseException("流程发起人所属工会不存在或未设置工会编码,无法确定评优评先审核路线"); + } + return EvaluateConstant.DIRECT_UNIT_UNION_CODE.equals(union.getUnionCode()) + ? EvaluateConstant.UNIT_APPROVAL_ROUTE + : EvaluateConstant.BRANCH_UNION_APPROVAL_ROUTE; + } } diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/condolence/controller/CondolenceMineController.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/condolence/controller/CondolenceMineController.java index 3d5b26d..b2cd15d 100644 --- a/src/main/java/com/budwk/app/zhgh/staffbenefit/condolence/controller/CondolenceMineController.java +++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/condolence/controller/CondolenceMineController.java @@ -6,6 +6,7 @@ import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.constant.RoleConstant; +import com.budwk.app.base.exception.BaseException; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; @@ -34,6 +35,8 @@ import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; +import javax.servlet.http.HttpServletResponse; + /** * @ClassName CondolenceApplyController * @Author JyuHsin @@ -72,6 +75,7 @@ public class CondolenceMineController { SELECT info.*, type.name as typeName, + COALESCE(NULLIF(info.typeCode, ''), type.code) AS exportTypeCode, ins.id AS instanceId, ins.businessNo, ins.state instanceState, @@ -153,6 +157,24 @@ public class CondolenceMineController { nutMap.put("typeName", type.getName()); return Result.success(nutMap); } + + /** + * 导出当前登录用户本人创建的生育慰问补贴登记表 Word。 + * + * @param id 慰问申请 ID + * @param response 文件下载响应,内容为 docx + */ + @At + @Ok("void") + @ApiOperation("导出我的补贴登记表") + @SaCheckPermission(value = {"condolence.mine", "h5.condolence.mine"}, mode = SaMode.OR) + public void onExportSubsidyRegistration(@Param("id") String id, HttpServletResponse response) { + if (StrUtil.isBlank(id)) { + throw new BaseException("慰问申请ID不能为空"); + } + condolenceService.exportOwnSubsidyRegistration(id, SecurityUtil.getUserId(), response); + } + @Inject private SmsService smsService; } diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/condolence/service/CondolenceService.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/condolence/service/CondolenceService.java index d849a07..683149c 100644 --- a/src/main/java/com/budwk/app/zhgh/staffbenefit/condolence/service/CondolenceService.java +++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/condolence/service/CondolenceService.java @@ -65,6 +65,15 @@ public interface CondolenceService extends BaseService { */ void exportSubsidyRegistration(String id, HttpServletResponse response); + /** + * 导出当前用户本人创建且已审核完成的生育慰问补贴登记表 Word。 + * + * @param id 慰问申请 ID + * @param userId 当前登录用户 ID,用于校验申请归属 + * @param response HTTP 文件下载响应 + */ + void exportOwnSubsidyRegistration(String id, String userId, HttpServletResponse response); + /** * 按页面查询条件批量生成慰问资料压缩包。 * diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/condolence/service/impl/CondolenceServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/condolence/service/impl/CondolenceServiceImpl.java index 5eb2be5..579a947 100644 --- a/src/main/java/com/budwk/app/zhgh/staffbenefit/condolence/service/impl/CondolenceServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/condolence/service/impl/CondolenceServiceImpl.java @@ -184,9 +184,31 @@ public class CondolenceServiceImpl extends BaseServiceImpl implement CommonDownloadUtil.download(fileName, docx, response); } + /** + * 按统计阅览权限导出生育慰问补贴登记表。 + */ @Override public void exportSubsidyRegistration(String id, HttpServletResponse response) { NutMap record = findExportRecord(id); + exportSubsidyRegistration(record, response); + } + + /** + * 校验申请创建人后,导出当前用户本人的生育慰问补贴登记表。 + */ + @Override + public void exportOwnSubsidyRegistration(String id, String userId, HttpServletResponse response) { + NutMap record = findOwnExportRecord(id, userId); + exportSubsidyRegistration(record, response); + } + + /** + * 校验补贴登记表的流程状态和慰问类型,并生成 Word 下载响应。 + * + * @param record 已完成访问权限校验的慰问申请导出数据 + * @param response HTTP 文件下载响应 + */ + private void exportSubsidyRegistration(NutMap record, HttpServletResponse response) { if (!ProcessInstanceStateEnum.FINISHED.getCode().equals(record.getInt("instanceState"))) { throw new BaseException("仅流程已完成的慰问申请可以导出补贴登记表"); } @@ -287,7 +309,7 @@ public class CondolenceServiceImpl extends BaseServiceImpl implement * @param id 慰问申请 ID * @return 慰问信息、类型信息和 wf 实例信息 */ - private NutMap findExportRecord(String id) { + private NutMap queryExportRecord(String id) { Sql sql = Sqls.create(""" SELECT con.*, @@ -320,6 +342,17 @@ public class CondolenceServiceImpl extends BaseServiceImpl implement if (StrUtil.isBlank(record.getString("typeCode"))) { record.put("typeCode", record.getString("currentTypeCode")); } + return record; + } + + /** + * 查询导出记录并按统计阅览权限校验数据范围。 + * + * @param id 慰问申请 ID + * @return 可供导出模板使用的慰问申请数据 + */ + private NutMap findExportRecord(String id) { + NutMap record = queryExportRecord(id); // 非校级管理员只能导出本工会数据,避免通过手工拼接 ID 越权下载。 if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name()) && !StrUtil.equals(record.getString("applyUnionId"), SecurityUtil.getUnionId())) { @@ -328,6 +361,21 @@ public class CondolenceServiceImpl extends BaseServiceImpl implement return record; } + /** + * 查询“我的申请”导出记录并校验记录创建人,防止通过手工拼接 ID 导出他人申请。 + * + * @param id 慰问申请 ID + * @param userId 当前登录用户 ID + * @return 可供导出模板使用的本人慰问申请数据 + */ + private NutMap findOwnExportRecord(String id, String userId) { + NutMap record = queryExportRecord(id); + if (!StrUtil.equals(record.getString("createdBy"), userId)) { + throw new BaseException("无权导出该慰问申请"); + } + return record; + } + /** * 组装模板数据并生成 Word 字节数组。 * diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/param/pageform/MemberInfoPageForm.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/param/pageform/MemberInfoPageForm.java index f9558c8..183cc89 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/param/pageform/MemberInfoPageForm.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/param/pageform/MemberInfoPageForm.java @@ -133,13 +133,21 @@ public class MemberInfoPageForm extends PageForm { cnd.and(seg); } - // 权限判断 - if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) { - SqlExpressionGroup seg = new SqlExpressionGroup(); - seg.or(prefix + "unionId", "=", SecurityUtil.getUnionId()); - seg.or(prefix + "unionId", "is", null); - seg.or(prefix + "unionId", "=", ""); - cnd.and(seg); + // 校工会会员管理员与校工会管理员拥有相同的全校会员查询范围,需与前端角色口径保持一致。 + if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name(), + RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name())) { + String currentUnionId = SecurityUtil.getUnionId(); + if (StrUtil.isNotBlank(this.getUnionId())) { + // 普通用户明确选择工会时只查询本人所属工会,不包含未归属工会人员,也不接受越权工会参数。 + cnd.and(prefix + "unionId", "=", currentUnionId); + } else { + // 未指定工会时保留原数据范围,允许处理本人所属工会及尚未归属工会的会员。 + SqlExpressionGroup seg = new SqlExpressionGroup(); + seg.or(prefix + "unionId", "=", currentUnionId); + seg.or(prefix + "unionId", "is", null); + seg.or(prefix + "unionId", "=", ""); + cnd.and(seg); + } } else { cnd.andEX(prefix + "unionId", "=", this.getUnionId()); } diff --git a/src/main/resources/db/evaluation_add_unit_party_approval.sql b/src/main/resources/db/evaluation_add_unit_party_approval.sql new file mode 100644 index 0000000..0f4a65f --- /dev/null +++ b/src/main/resources/db/evaluation_add_unit_party_approval.sql @@ -0,0 +1,169 @@ +-- 评优评先新增“单位审核、二级党组织审核”节点。 +-- 脚本保留历史流程定义,新申请使用新版本;重复执行不会重复新增菜单和角色授权。 +START TRANSACTION; + +SET @evaluation_menu_id = '32bd9853db494301bb59757a55dc1c5d'; +SET @unit_menu_id = 'e8f0f73512de4a8db7d95478dd1885ad'; +SET @party_menu_id = '76c7148f8cc84d29b4b0ee791620eb7e'; + +-- 调整原菜单顺序,为两个新增审核入口预留业务流程顺序。 +UPDATE sys_menu SET path = 'evaluation_tmp_branch', location = 330 +WHERE permission = 'evaluation.branchUnionApproval'; +UPDATE sys_menu SET path = 'evaluation_tmp_school', location = 332 +WHERE permission = 'evaluation.schoolUnionApproval'; +UPDATE sys_menu SET path = 'evaluation_tmp_summary', location = 333 +WHERE permission = 'evaluation.summary'; +UPDATE sys_menu SET path = '0053' WHERE permission = 'evaluation.branchUnionApproval'; +UPDATE sys_menu SET path = '0055' WHERE permission = 'evaluation.schoolUnionApproval'; +UPDATE sys_menu SET path = '0056' WHERE permission = 'evaluation.summary'; + +INSERT INTO sys_menu + (id, parentId, path, name, type, href, showit, disabled, permission, location, hasChildren, + createdBy, createdAt, delFlag, platform, moduleId, isQuickEntry, initialPinyinName, + isRecommendApp, isRecommendService) +SELECT @unit_menu_id, @evaluation_menu_id, '0052', CONVERT(0xE58D95E4BD8DE5AEA1E6A0B8 USING utf8mb4), 'menu', + '/platform/evaluate/unitApproval', 1, 0, 'evaluation.unitApproval', 329, 0, + 'system', UNIX_TIMESTAMP(CURRENT_TIMESTAMP(3)) * 1000, 0, 'PC', moduleId, 0, 'd', 0, 0 +FROM sys_menu +WHERE id = @evaluation_menu_id + AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM sys_menu WHERE permission = 'evaluation.unitApproval') existing_menu); + +INSERT INTO sys_menu + (id, parentId, path, name, type, href, showit, disabled, permission, location, hasChildren, + createdBy, createdAt, delFlag, platform, moduleId, isQuickEntry, initialPinyinName, + isRecommendApp, isRecommendService) +SELECT @party_menu_id, @evaluation_menu_id, '0054', CONVERT(0xE4BA8CE7BAA7E5859AE7BB84E7BB87E5AEA1E6A0B8 USING utf8mb4), 'menu', + '/platform/evaluate/partyOrganizationApproval', 1, 0, 'evaluation.partyOrganizationApproval', 331, 0, + 'system', UNIX_TIMESTAMP(CURRENT_TIMESTAMP(3)) * 1000, 0, 'PC', moduleId, 0, 'e', 0, 0 +FROM sys_menu +WHERE id = @evaluation_menu_id + AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM sys_menu WHERE permission = 'evaluation.partyOrganizationApproval') existing_menu); + +-- 无论菜单是首次新增还是重复执行,均统一校正名称,十六进制字面量避免终端编码影响中文。 +UPDATE sys_menu SET name = CONVERT(0xE58D95E4BD8DE5AEA1E6A0B8 USING utf8mb4) +WHERE permission = 'evaluation.unitApproval'; +UPDATE sys_menu SET name = CONVERT(0xE4BA8CE7BAA7E5859AE7BB84E7BB87E5AEA1E6A0B8 USING utf8mb4) +WHERE permission = 'evaluation.partyOrganizationApproval'; + +-- 单位负责人和单位党委书记同时需要父菜单与各自审核菜单权限,确保菜单树可见。 +INSERT INTO sys_role_menu (roleId, menuId) +SELECT role.id, menu.id +FROM sys_role role +JOIN sys_menu menu ON menu.permission IN ('evaluation', 'evaluation.unitApproval') +WHERE role.code = 'UNIT_MANAGER' + AND NOT EXISTS (SELECT 1 FROM sys_role_menu relation WHERE relation.roleId = role.id AND relation.menuId = menu.id); + +INSERT INTO sys_role_menu (roleId, menuId) +SELECT role.id, menu.id +FROM sys_role role +JOIN sys_menu menu ON menu.permission IN ('evaluation', 'evaluation.partyOrganizationApproval') +WHERE role.code = 'UNIT_PARTY_SECRETARY' + AND NOT EXISTS (SELECT 1 FROM sys_role_menu relation WHERE relation.roleId = role.id AND relation.menuId = menu.id); + +-- 设计稿已有两个节点,本次补齐表单地址和严格按发起人组织范围取人的处理类。 +UPDATE wf_process_design +SET content = JSON_SET( + IF( + JSON_SEARCH(content, 'one', '3a833b92-badd-4569-994e-9a675a4e0e54') IS NULL, + content, + JSON_REMOVE(content, REPLACE( + JSON_UNQUOTE(JSON_SEARCH(content, 'one', '3a833b92-badd-4569-994e-9a675a4e0e54')), + '.id', '')) + ), + '$.nodes[5].properties.form', '/platform/evaluate/unitApproval', + '$.nodes[5].properties.assignee', '', + '$.nodes[5].properties.assigneeMode', 'manual', + '$.nodes[5].properties.assigneeText', '', + '$.nodes[5].properties.assignmentHandler', 'com.budwk.app.flow.handler.FlowInitiatorUnitManagerAssignmentHandler', + '$.nodes[6].text.value', CONVERT(0xE4BA8CE7BAA7E5859AE7BB84E7BB87E5AEA1E6A0B8 USING utf8mb4), + '$.nodes[6].properties.form', '/platform/evaluate/partyOrganizationApproval', + '$.nodes[6].properties.assignee', '', + '$.nodes[6].properties.assigneeMode', 'manual', + '$.nodes[6].properties.assigneeText', '', + '$.nodes[6].properties.assignmentHandler', 'com.budwk.app.flow.handler.FlowInitiatorPartyOrganizationAssignmentHandler' + ), + isDeployed = 1, + updatedBy = 'system', + updatedAt = UNIX_TIMESTAMP(CURRENT_TIMESTAMP(3)) * 1000 +WHERE name = 'PYPX'; + +-- 提交申请后复用设计稿中已有的通用决策节点,不创建业务专用判断类或重复网关。 +SET @route_decision_id = '7d03f3fd-7fc4-4865-9dc9-c1895c677624'; +SET @route_unit_edge_id = '7b3af019-a8af-419c-9f83-aacca0c71d2e'; +SET @route_branch_edge_id = 'ca809b7a-f5dc-4f4a-9780-35f47a6babfc'; + +-- 清理首次执行旧脚本可能生成的重复节点和连线,按精确 ID 定位,避免影响其他流程元素。 +UPDATE wf_process_design +SET content = JSON_REMOVE( + content, + REPLACE(JSON_UNQUOTE(JSON_SEARCH(content, 'one', 'evaluateApprovalRouteToUnit')), '.id', '') + ) +WHERE name = 'PYPX' + AND JSON_SEARCH(content, 'one', 'evaluateApprovalRouteToUnit') IS NOT NULL; +UPDATE wf_process_design +SET content = JSON_REMOVE( + content, + REPLACE(JSON_UNQUOTE(JSON_SEARCH(content, 'one', 'evaluateApprovalRouteToBranch')), '.id', '') + ) +WHERE name = 'PYPX' + AND JSON_SEARCH(content, 'one', 'evaluateApprovalRouteToBranch') IS NOT NULL; +UPDATE wf_process_design +SET content = JSON_REMOVE( + content, + REPLACE(JSON_UNQUOTE(JSON_SEARCH(content, 'one', 'evaluateApprovalRouteDecision')), '.id', '') + ) +WHERE name = 'PYPX' + AND JSON_SEARCH(content, 'one', 'evaluateApprovalRouteDecision') IS NOT NULL; + +-- 在现有网关的两条输出线上配置参数表达式。 +UPDATE wf_process_design +SET content = JSON_SET( + content, + CONCAT(REPLACE(JSON_UNQUOTE(JSON_SEARCH(content, 'one', @route_unit_edge_id)), '.id', ''), + '.properties.expr'), + '{evaluationApprovalRoute==\'unitApproval\'}', + CONCAT(REPLACE(JSON_UNQUOTE(JSON_SEARCH(content, 'one', @route_branch_edge_id)), '.id', ''), + '.properties.expr'), + '{evaluationApprovalRoute==\'branchUnionApproval\'}' + ) +WHERE name = 'PYPX' + AND JSON_SEARCH(content, 'one', @route_decision_id) IS NOT NULL + AND JSON_SEARCH(content, 'one', @route_unit_edge_id) IS NOT NULL + AND JSON_SEARCH(content, 'one', @route_branch_edge_id) IS NOT NULL; + +-- 插入新流程版本,旧申请继续绑定原有版本,不改写历史实例。 +INSERT INTO wf_process_define + (createdBy, createdAt, updatedBy, updatedAt, delFlag, name, displayName, type, state, + content, version, category, instanceUrl, h5InstanceUrl, icon, instanceViewUrl, + h5InstanceViewUrl, pinyinName, description) +SELECT 'system', UNIX_TIMESTAMP(CURRENT_TIMESTAMP(3)) * 1000, 'system', + UNIX_TIMESTAMP(CURRENT_TIMESTAMP(3)) * 1000, 0, design.name, design.displayName, + design.type, 1, CAST(design.content AS BINARY), latest.version + 1, design.category, + design.instanceUrl, design.h5InstanceUrl, design.icon, design.instanceViewUrl, + design.h5InstanceViewUrl, 'p', design.description +FROM wf_process_design design +JOIN (SELECT MAX(version) AS version FROM wf_process_define WHERE name = 'PYPX') latest +WHERE design.name = 'PYPX' + AND NOT EXISTS ( + SELECT 1 + FROM wf_process_define deployed + WHERE deployed.name = 'PYPX' + AND JSON_SEARCH(CONVERT(deployed.content USING utf8mb4), 'one', + 'com.budwk.app.flow.handler.FlowInitiatorUnitManagerAssignmentHandler') IS NOT NULL + AND JSON_SEARCH(CONVERT(deployed.content USING utf8mb4), 'one', + 'com.budwk.app.flow.handler.FlowInitiatorPartyOrganizationAssignmentHandler') IS NOT NULL + AND JSON_SEARCH(CONVERT(deployed.content USING utf8mb4), 'one', + @route_decision_id) IS NOT NULL + AND JSON_SEARCH(CONVERT(deployed.content USING utf8mb4), 'one', + '{evaluationApprovalRoute==\'unitApproval\'}') IS NOT NULL + AND JSON_SEARCH(CONVERT(deployed.content USING utf8mb4), 'one', + '{evaluationApprovalRoute==\'branchUnionApproval\'}') IS NOT NULL + AND JSON_SEARCH(CONVERT(deployed.content USING utf8mb4), 'one', + 'evaluateApprovalRouteDecision') IS NULL + AND JSON_SEARCH(CONVERT(deployed.content USING utf8mb4), 'one', + 'evaluateApprovalRouteToUnit') IS NULL + AND JSON_SEARCH(CONVERT(deployed.content USING utf8mb4), 'one', + 'evaluateApprovalRouteToBranch') IS NULL + ); + +COMMIT; diff --git a/src/main/resources/db/migrate_v3_evaluation_data.sql b/src/main/resources/db/migrate_v3_evaluation_data.sql new file mode 100644 index 0000000..f1112ea --- /dev/null +++ b/src/main/resources/db/migrate_v3_evaluation_data.sql @@ -0,0 +1,669 @@ +-- 将 v3 评优评先业务数据和审批状态迁移到 v4,并重建 v4 流程实例、任务及参与人。 +-- 说明:v3 没有流程引擎表,审批链由 evaluate_apply 的状态、四个审核记录 ID 和 audit 表还原。 +USE zhgh_swufe; +START TRANSACTION; + +SET @now_ms = UNIX_TIMESTAMP(CURRENT_TIMESTAMP(3)) * 1000; +SET @process_define_id = ( + SELECT id FROM zhgh_swufe.wf_process_define + WHERE name = 'PYPX' AND state = 1 AND IFNULL(delFlag, 0) = 0 + ORDER BY version DESC LIMIT 1 +); + +-- 缺少已部署流程定义时主动中断,禁止生成无法继续办理的孤立流程。 +DROP TEMPORARY TABLE IF EXISTS tmp_evaluation_migration_guard; +CREATE TEMPORARY TABLE tmp_evaluation_migration_guard ( + checkName VARCHAR(64) NOT NULL, + passed TINYINT NOT NULL +); +INSERT INTO tmp_evaluation_migration_guard (checkName, passed) +VALUES ('active_process_definition', IF(@process_define_id IS NOT NULL, 1, NULL)); + +-- 当前任务节点采用固定业务键,部署定义缺少任一节点时立即中断,避免创建无法继续办理的待办。 +SET @process_definition_content = ( + SELECT CAST(content AS CHAR) + FROM zhgh_swufe.wf_process_define + WHERE id = @process_define_id +); +DELETE FROM tmp_evaluation_migration_guard; +INSERT INTO tmp_evaluation_migration_guard (checkName, passed) VALUES +('unit_node', IF(LOCATE('b14df33c-053c-4a91-a1b7-283ae70ece56', @process_definition_content) > 0, 1, NULL)), +('branch_node', IF(LOCATE('3bdaa29d-e5eb-4e3e-b7f1-14d03bedd078', @process_definition_content) > 0, 1, NULL)), +('party_node', IF(LOCATE('7dbdd0ed-05bb-4c31-9f5d-bfad3b3e2e26', @process_definition_content) > 0, 1, NULL)), +('school_node', IF(LOCATE('3c158aca-89ef-4188-bbc3-e8db201f02a1', @process_definition_content) > 0, 1, NULL)); + +-- v3 的两个荣誉在 v4 中没有原主键;保留原 ID、名称和层级,确保历史活动及申请关联完整。 +INSERT INTO zhgh_swufe.honor_basic_settings + (id, parentId, code, name, level, hasChildren, createdBy, createdAt, updatedBy, updatedAt, delFlag) +SELECT oldHonor.id, oldHonor.parentId, oldHonor.code, oldHonor.name, oldHonor.level, + oldHonor.hasChildren, 'migration', @now_ms, 'migration', @now_ms, 0 +FROM union_swufe.honor_basic_settings oldHonor +WHERE oldHonor.id IN ('275c2ddff5ee4edbb961bc73654686ff', '00a4a86f2713403485322fd9786cafc8') + AND NOT EXISTS ( + SELECT 1 FROM zhgh_swufe.honor_basic_settings currentHonor WHERE currentHonor.id = oldHonor.id + ); + +-- 仅清理 v4 当前评优评先申请关联的流程运行数据,不影响流程设计、定义和其他模块。 +DROP TEMPORARY TABLE IF EXISTS tmp_old_evaluation_instance; +CREATE TEMPORARY TABLE tmp_old_evaluation_instance (id BIGINT PRIMARY KEY); +INSERT INTO tmp_old_evaluation_instance (id) +SELECT DISTINCT instance.id +FROM zhgh_swufe.wf_process_instance instance +JOIN zhgh_swufe.evaluate_apply apply ON apply.id = instance.businessNo +JOIN zhgh_swufe.wf_process_define processDefine + ON processDefine.id = instance.processDefineId AND processDefine.name = 'PYPX'; + +DELETE actor +FROM zhgh_swufe.wf_process_task_actor actor +JOIN zhgh_swufe.wf_process_task task ON task.id = actor.processTaskId +JOIN tmp_old_evaluation_instance oldInstance ON oldInstance.id = task.processInstanceId; +DELETE cc +FROM zhgh_swufe.wf_process_cc_instance cc +JOIN tmp_old_evaluation_instance oldInstance ON oldInstance.id = cc.processInstanceId; +DELETE task +FROM zhgh_swufe.wf_process_task task +JOIN tmp_old_evaluation_instance oldInstance ON oldInstance.id = task.processInstanceId; +DELETE instance +FROM zhgh_swufe.wf_process_instance instance +JOIN tmp_old_evaluation_instance oldInstance ON oldInstance.id = instance.id; + +DELETE home +FROM zhgh_swufe.sys_home_activity home +JOIN zhgh_swufe.evaluate_activity activity ON activity.id = home.id; +DELETE FROM zhgh_swufe.evaluate_apply; +DELETE FROM zhgh_swufe.evaluate_activity; + +-- 活动字段仅做语义一致的映射;conditions、program、xlFlag 在 v4 无对应字段,不强制写入其他字段。 +INSERT INTO zhgh_swufe.evaluate_activity + (id, honorId, honorTypeId, name, year, startTime, endTime, notice, directions, + quotaAllocations, enable, activityGroupId, createdBy, createdAt, updatedBy, updatedAt, delFlag) +SELECT activity.id, + activity.honorId, + activity.honorTypeId, + activity.name, + YEAR(STR_TO_DATE(activity.startTime, '%Y-%m-%d %H:%i:%s')), + STR_TO_DATE(activity.startTime, '%Y-%m-%d %H:%i:%s'), + STR_TO_DATE(activity.endTime, '%Y-%m-%d %H:%i:%s'), + NULL, + activity.directions, + activity.unionLimit, + 1, + activity.groupId, + COALESCE(NULLIF(activity.userid, ''), 'migration'), + UNIX_TIMESTAMP(STR_TO_DATE(activity.startTime, '%Y-%m-%d %H:%i:%s')) * 1000, + COALESCE(NULLIF(activity.userid, ''), 'migration'), + UNIX_TIMESTAMP(STR_TO_DATE(activity.startTime, '%Y-%m-%d %H:%i:%s')) * 1000, + 0 +FROM union_swufe.evaluate activity; + +-- 同步首页活动记录,使迁移后的历史活动在现有活动入口保持一致的数据关系。 +INSERT INTO zhgh_swufe.sys_home_activity + (id, name, cover, url, h5Url, groupId, enable, createdBy, createdAt, updatedBy, updatedAt, + delFlag, classPath, sortNo, top, allowUserGroupId, startDate, endDate, push) +SELECT activity.id, activity.name, '', '/platform/evaluate/apply', '', NULL, activity.enable, + activity.createdBy, activity.createdAt, activity.updatedBy, activity.updatedAt, 0, + 'com.budwk.app.zhgh.dayofficework.evaluation.models.EvaluateActivity', 0, 0, + activity.activityGroupId, activity.startTime, activity.endTime, 0 +FROM zhgh_swufe.evaluate_activity activity; + +-- 申请人、单位和分工会名称从 v4 源数据补齐;v3 业务字段有直接对应关系的才迁移。 +INSERT INTO zhgh_swufe.evaluate_apply + (id, evaluateId, honorId, honorTypeId, loginName, userName, mobile, birthday, sex, nation, + political, education, technicalTitle, governmentPosition, historyHonor, briefDeeds, + unitName, unitId, unionName, unionId, clubName, clubId, applyDateTime, isClub, files, + memberNumber, unionGroupNumber, unionLeader, applyUnionName, + createdBy, createdAt, updatedBy, updatedAt, delFlag) +SELECT apply.id, + apply.evaluateId, + apply.honorId, + apply.honorTypeId, + user.loginname, + user.username, + user.mobile, + STR_TO_DATE(NULLIF(apply.birthday, ''), '%Y-%m-%d'), + apply.userSex, + apply.nation, + apply.political, + user.education, + apply.jobTitle, + apply.position, + apply.award, + apply.deeds, + unit.name, + apply.unitId, + COALESCE(NULLIF(apply.unionName, ''), branchUnion.name), + apply.unionId, + NULL, + NULL, + STR_TO_DATE(apply.applyTime, '%Y-%m-%d'), + 0, + apply.files, + apply.memberNumber, + apply.unionGroupNumber, + apply.unionLeader, + apply.applyUnionName, + apply.userId, + UNIX_TIMESTAMP(STR_TO_DATE(apply.applyTime, '%Y-%m-%d')) * 1000, + apply.userId, + UNIX_TIMESTAMP(STR_TO_DATE(apply.applyTime, '%Y-%m-%d')) * 1000, + 0 +FROM union_swufe.evaluate_apply apply +JOIN zhgh_swufe.sys_user user ON user.id = apply.userId +LEFT JOIN zhgh_swufe.sys_unit unit ON unit.id = apply.unitId +LEFT JOIN zhgh_swufe.sys_union branchUnion ON branchUnion.id = apply.unionId; + +-- 72 条已提交或有审批历史的申请需要流程实例;6 条纯草稿只保留业务数据。 +INSERT INTO zhgh_swufe.wf_process_instance + (parentId, processDefineId, state, parentNodeName, businessNo, operator, expireTime, variable, + createdBy, createdAt, updatedBy, updatedAt, delFlag) +SELECT NULL, + @process_define_id, + IF(oldApply.stateId = 1900, 20, 10), + NULL, + currentApply.id, + currentApply.createdBy, + NULL, + JSON_OBJECT( + 'submitType', 0, + 'f_data', JSON_OBJECT( + 'id', currentApply.id, + 'evaluateId', currentApply.evaluateId, + 'honorId', currentApply.honorId, + 'honorTypeId', currentApply.honorTypeId, + 'loginName', currentApply.loginName, + 'userName', currentApply.userName, + 'mobile', currentApply.mobile, + 'birthday', UNIX_TIMESTAMP(currentApply.birthday) * 1000, + 'sex', currentApply.sex, + 'nation', currentApply.nation, + 'political', currentApply.political, + 'education', currentApply.education, + 'technicalTitle', currentApply.technicalTitle, + 'governmentPosition', currentApply.governmentPosition, + 'historyHonor', currentApply.historyHonor, + 'briefDeeds', currentApply.briefDeeds, + 'unitName', currentApply.unitName, + 'unitId', currentApply.unitId, + 'unionName', currentApply.unionName, + 'unionId', currentApply.unionId, + 'applyDateTime', UNIX_TIMESTAMP(currentApply.applyDateTime) * 1000, + 'memberNumber', currentApply.memberNumber, + 'unionGroupNumber', currentApply.unionGroupNumber, + 'unionLeader', currentApply.unionLeader, + 'applyUnionName', currentApply.applyUnionName, + 'createdBy', currentApply.createdBy, + 'createdAt', currentApply.createdAt, + 'updatedBy', currentApply.updatedBy, + 'updatedAt', currentApply.updatedAt, + 'delFlag', FALSE + ), + 'evaluationApprovalRoute', IF(branchUnion.unionCode = '01', 'unitApproval', 'branchUnionApproval'), + 'u_userId', currentApply.createdBy, + 'initiator', currentApply.createdBy, + 'initiatorName', currentApply.userName, + 'initiatorAccount', currentApply.loginName, + 'initiatorUnitId', currentApply.unitId, + 'initiatorUnitName', currentApply.unitName, + 'initiatorUnionId', currentApply.unionId, + 'initiatorUnionName', currentApply.unionName, + 'instanceName', CONCAT(currentApply.userName, '的评优评先申请') + ), + currentApply.createdBy, + currentApply.createdAt, + currentApply.createdBy, + COALESCE( + UNIX_TIMESTAMP(schoolAudit.auditTime) * 1000, + UNIX_TIMESTAMP(partyAudit.auditTime) * 1000, + UNIX_TIMESTAMP(unionAudit.auditTime) * 1000, + UNIX_TIMESTAMP(unitAudit.auditTime) * 1000, + currentApply.updatedAt + ), + 0 +FROM zhgh_swufe.evaluate_apply currentApply +JOIN union_swufe.evaluate_apply oldApply ON oldApply.id = currentApply.id +LEFT JOIN zhgh_swufe.sys_union branchUnion ON branchUnion.id = currentApply.unionId +LEFT JOIN union_swufe.audit unitAudit ON unitAudit.id = oldApply.unitAuditId +LEFT JOIN union_swufe.audit unionAudit ON unionAudit.id = oldApply.unionAuditId +LEFT JOIN union_swufe.audit partyAudit ON partyAudit.id = oldApply.partyAuditId +LEFT JOIN union_swufe.audit schoolAudit ON schoolAudit.id = oldApply.schoolAuditId +WHERE oldApply.stateId <> 1400 + OR NULLIF(oldApply.unitAuditId, '') IS NOT NULL + OR NULLIF(oldApply.unionAuditId, '') IS NOT NULL + OR NULLIF(oldApply.partyAuditId, '') IS NOT NULL + OR NULLIF(oldApply.schoolAuditId, '') IS NOT NULL; + +DROP TEMPORARY TABLE IF EXISTS tmp_evaluation_task_plan; +CREATE TEMPORARY TABLE tmp_evaluation_task_plan ( + rowKey VARCHAR(100) PRIMARY KEY, + parentRowKey VARCHAR(100), + businessNo VARCHAR(32) NOT NULL, + taskName VARCHAR(128) NOT NULL, + displayName VARCHAR(128) NOT NULL, + formKey VARCHAR(128), + taskState INT NOT NULL, + operator VARCHAR(128), + finishTime DATETIME, + createdAt BIGINT, + auditId VARCHAR(32), + submitType INT +); + +-- 退回待修改申请可能已有多级审核历史,只有最后一次审核标记为退回,之前节点仍保留原审核结果。 +DROP TEMPORARY TABLE IF EXISTS tmp_evaluation_returned_last_audit; +CREATE TEMPORARY TABLE tmp_evaluation_returned_last_audit ( + businessNo VARCHAR(32) PRIMARY KEY, + auditId VARCHAR(32) NOT NULL +); +INSERT INTO tmp_evaluation_returned_last_audit (businessNo, auditId) +SELECT oldApply.id, + SUBSTRING_INDEX( + GROUP_CONCAT(audit.id ORDER BY audit.auditTime DESC, audit.opAt DESC, audit.id DESC SEPARATOR ','), + ',', 1 + ) +FROM union_swufe.evaluate_apply oldApply +JOIN union_swufe.audit audit + ON audit.id IN (oldApply.unitAuditId, oldApply.unionAuditId, oldApply.partyAuditId, oldApply.schoolAuditId) +WHERE oldApply.stateId = 1400 +GROUP BY oldApply.id; + +-- 每个流程首先保留一条已完成的“提交申请”任务。 +INSERT INTO tmp_evaluation_task_plan +SELECT CONCAT(apply.id, ':start:finished'), NULL, apply.id, 'startTask', '提交申请', NULL, + 20, apply.createdBy, apply.applyDateTime, apply.createdAt, NULL, 0 +FROM zhgh_swufe.evaluate_apply apply +JOIN zhgh_swufe.wf_process_instance instance + ON instance.businessNo = apply.id AND instance.processDefineId = @process_define_id; + +-- 按 v3 四个审核记录 ID 还原已发生的历史审核任务,节点顺序遵循当前 PYPX 流程。 +INSERT INTO tmp_evaluation_task_plan +SELECT CONCAT(oldApply.id, ':unit'), CONCAT(oldApply.id, ':start:finished'), oldApply.id, + 'b14df33c-053c-4a91-a1b7-283ae70ece56', '单位审核', '/platform/evaluate/unitApproval', + 20, audit.auditor, audit.auditTime, UNIX_TIMESTAMP(audit.auditTime) * 1000, audit.id, + IF(returnedAudit.auditId = audit.id, 6, IF(audit.auditPass = 1, 1, 2)) +FROM union_swufe.evaluate_apply oldApply +JOIN union_swufe.audit audit ON audit.id = oldApply.unitAuditId +LEFT JOIN tmp_evaluation_returned_last_audit returnedAudit ON returnedAudit.businessNo = oldApply.id; + +INSERT INTO tmp_evaluation_task_plan +SELECT CONCAT(oldApply.id, ':union'), + IF(oldApply.unitAuditId IS NOT NULL AND oldApply.unitAuditId <> '', + CONCAT(oldApply.id, ':unit'), CONCAT(oldApply.id, ':start:finished')), + oldApply.id, '3bdaa29d-e5eb-4e3e-b7f1-14d03bedd078', '分工会审核', + '/platform/evaluate/branchUnionApproval', 20, audit.auditor, audit.auditTime, + UNIX_TIMESTAMP(audit.auditTime) * 1000, audit.id, + IF(returnedAudit.auditId = audit.id, 6, IF(audit.auditPass = 1, 1, 2)) +FROM union_swufe.evaluate_apply oldApply +JOIN union_swufe.audit audit ON audit.id = oldApply.unionAuditId +LEFT JOIN tmp_evaluation_returned_last_audit returnedAudit ON returnedAudit.businessNo = oldApply.id; + +INSERT INTO tmp_evaluation_task_plan +SELECT CONCAT(oldApply.id, ':party'), + IF(oldApply.unionAuditId IS NOT NULL AND oldApply.unionAuditId <> '', + CONCAT(oldApply.id, ':union'), + IF(oldApply.unitAuditId IS NOT NULL AND oldApply.unitAuditId <> '', + CONCAT(oldApply.id, ':unit'), CONCAT(oldApply.id, ':start:finished'))), + oldApply.id, '7dbdd0ed-05bb-4c31-9f5d-bfad3b3e2e26', '二级党组织审核', + '/platform/evaluate/partyOrganizationApproval', 20, audit.auditor, audit.auditTime, + UNIX_TIMESTAMP(audit.auditTime) * 1000, audit.id, + IF(returnedAudit.auditId = audit.id, 6, IF(audit.auditPass = 1, 1, 2)) +FROM union_swufe.evaluate_apply oldApply +JOIN union_swufe.audit audit ON audit.id = oldApply.partyAuditId +LEFT JOIN tmp_evaluation_returned_last_audit returnedAudit ON returnedAudit.businessNo = oldApply.id; + +INSERT INTO tmp_evaluation_task_plan +SELECT CONCAT(oldApply.id, ':school'), + IF(oldApply.partyAuditId IS NOT NULL AND oldApply.partyAuditId <> '', + CONCAT(oldApply.id, ':party'), + IF(oldApply.unionAuditId IS NOT NULL AND oldApply.unionAuditId <> '', + CONCAT(oldApply.id, ':union'), CONCAT(oldApply.id, ':start:finished'))), + oldApply.id, '3c158aca-89ef-4188-bbc3-e8db201f02a1', '校工会审核', + '/platform/evaluate/schoolUnionApproval', 20, audit.auditor, audit.auditTime, + UNIX_TIMESTAMP(audit.auditTime) * 1000, audit.id, + IF(returnedAudit.auditId = audit.id, 6, IF(audit.auditPass = 1, 1, 2)) +FROM union_swufe.evaluate_apply oldApply +JOIN union_swufe.audit audit ON audit.id = oldApply.schoolAuditId +LEFT JOIN tmp_evaluation_returned_last_audit returnedAudit ON returnedAudit.businessNo = oldApply.id; + +-- 根据 v3 当前状态生成唯一待办节点;退回状态生成新的发起人“提交申请”待办。 +INSERT INTO tmp_evaluation_task_plan +SELECT CONCAT(oldApply.id, ':start:doing'), + COALESCE( + IF(oldApply.schoolAuditId IS NOT NULL AND oldApply.schoolAuditId <> '', CONCAT(oldApply.id, ':school'), NULL), + IF(oldApply.partyAuditId IS NOT NULL AND oldApply.partyAuditId <> '', CONCAT(oldApply.id, ':party'), NULL), + IF(oldApply.unionAuditId IS NOT NULL AND oldApply.unionAuditId <> '', CONCAT(oldApply.id, ':union'), NULL), + IF(oldApply.unitAuditId IS NOT NULL AND oldApply.unitAuditId <> '', CONCAT(oldApply.id, ':unit'), NULL), + CONCAT(oldApply.id, ':start:finished') + ), + oldApply.id, 'startTask', '提交申请', NULL, 10, NULL, NULL, + COALESCE( + UNIX_TIMESTAMP(schoolAudit.auditTime) * 1000, + UNIX_TIMESTAMP(partyAudit.auditTime) * 1000, + UNIX_TIMESTAMP(unionAudit.auditTime) * 1000, + UNIX_TIMESTAMP(unitAudit.auditTime) * 1000 + ), NULL, 5 +FROM union_swufe.evaluate_apply oldApply +JOIN zhgh_swufe.wf_process_instance instance + ON instance.businessNo = oldApply.id AND instance.processDefineId = @process_define_id +LEFT JOIN union_swufe.audit unitAudit ON unitAudit.id = oldApply.unitAuditId +LEFT JOIN union_swufe.audit unionAudit ON unionAudit.id = oldApply.unionAuditId +LEFT JOIN union_swufe.audit partyAudit ON partyAudit.id = oldApply.partyAuditId +LEFT JOIN union_swufe.audit schoolAudit ON schoolAudit.id = oldApply.schoolAuditId +WHERE oldApply.stateId = 1400; + +INSERT INTO tmp_evaluation_task_plan +SELECT CONCAT(oldApply.id, ':unit:doing'), CONCAT(oldApply.id, ':start:finished'), oldApply.id, + 'b14df33c-053c-4a91-a1b7-283ae70ece56', '单位审核', '/platform/evaluate/unitApproval', + 10, NULL, NULL, currentApply.createdAt, NULL, NULL +FROM union_swufe.evaluate_apply oldApply +JOIN zhgh_swufe.evaluate_apply currentApply ON currentApply.id = oldApply.id +WHERE oldApply.stateId = 1500; + +INSERT INTO tmp_evaluation_task_plan +SELECT CONCAT(oldApply.id, ':union:doing'), + IF(oldApply.unitAuditId IS NOT NULL AND oldApply.unitAuditId <> '', + CONCAT(oldApply.id, ':unit'), CONCAT(oldApply.id, ':start:finished')), + oldApply.id, '3bdaa29d-e5eb-4e3e-b7f1-14d03bedd078', '分工会审核', + '/platform/evaluate/branchUnionApproval', 10, NULL, NULL, + COALESCE(UNIX_TIMESTAMP(unitAudit.auditTime) * 1000, currentApply.createdAt), NULL, NULL +FROM union_swufe.evaluate_apply oldApply +JOIN zhgh_swufe.evaluate_apply currentApply ON currentApply.id = oldApply.id +LEFT JOIN union_swufe.audit unitAudit ON unitAudit.id = oldApply.unitAuditId +WHERE oldApply.stateId = 1600; + +INSERT INTO tmp_evaluation_task_plan +SELECT CONCAT(oldApply.id, ':party:doing'), CONCAT(oldApply.id, ':union'), oldApply.id, + '7dbdd0ed-05bb-4c31-9f5d-bfad3b3e2e26', '二级党组织审核', + '/platform/evaluate/partyOrganizationApproval', 10, NULL, NULL, + COALESCE(UNIX_TIMESTAMP(unionAudit.auditTime) * 1000, currentApply.createdAt), NULL, NULL +FROM union_swufe.evaluate_apply oldApply +JOIN zhgh_swufe.evaluate_apply currentApply ON currentApply.id = oldApply.id +LEFT JOIN union_swufe.audit unionAudit ON unionAudit.id = oldApply.unionAuditId +WHERE oldApply.stateId = 1700; + +INSERT INTO tmp_evaluation_task_plan +SELECT CONCAT(oldApply.id, ':school:doing'), CONCAT(oldApply.id, ':party'), oldApply.id, + '3c158aca-89ef-4188-bbc3-e8db201f02a1', '校工会审核', + '/platform/evaluate/schoolUnionApproval', 10, NULL, NULL, + COALESCE(UNIX_TIMESTAMP(partyAudit.auditTime) * 1000, currentApply.createdAt), NULL, NULL +FROM union_swufe.evaluate_apply oldApply +JOIN zhgh_swufe.evaluate_apply currentApply ON currentApply.id = oldApply.id +LEFT JOIN union_swufe.audit partyAudit ON partyAudit.id = oldApply.partyAuditId +WHERE oldApply.stateId = 1800; + +-- 先插入任务,再通过业务号、节点和状态建立临时行键与自增 ID 的对应关系。 +INSERT INTO zhgh_swufe.wf_process_task + (processInstanceId, taskName, displayName, taskType, performType, taskState, operator, + finishTime, expireTime, formKey, h5FormKey, taskParentId, variable, + createdBy, createdAt, updatedBy, updatedAt, delFlag) +SELECT instance.id, plan.taskName, plan.displayName, 0, 0, plan.taskState, plan.operator, + plan.finishTime, NULL, plan.formKey, NULL, NULL, + JSON_MERGE_PATCH( + instance.variable, + JSON_OBJECT( + 'processInstanceId', instance.id, + 'isFirstTaskNode', IF(plan.taskName = 'startTask', TRUE, FALSE), + 'taskName', plan.displayName + ), + CASE WHEN plan.auditId IS NULL THEN + JSON_OBJECT('submitType', COALESCE(plan.submitType, 0)) + ELSE JSON_OBJECT( + 'submitType', plan.submitType, + 'tf_approvalComment', audit.auditOpinion, + 'tf_opinion', audit.auditOpinion, + 'tf_userSign', audit.auditSign, + 'tf_userName', COALESCE(audit.username, reviewer.username), + 'tf_loginName', COALESCE(audit.loginname, reviewer.loginname), + 'tf_unitId', reviewer.unitId, + 'tf_unitName', reviewerUnit.name, + 'tf_unionId', reviewerUnit.unionId, + 'migrationAuditId', audit.id + ) END + ), + COALESCE(plan.operator, apply.createdBy), + COALESCE(plan.createdAt, apply.createdAt), + COALESCE(plan.operator, apply.createdBy), + COALESCE(UNIX_TIMESTAMP(plan.finishTime) * 1000, plan.createdAt, apply.createdAt), + 0 +FROM tmp_evaluation_task_plan plan +JOIN zhgh_swufe.wf_process_instance instance + ON instance.businessNo = plan.businessNo AND instance.processDefineId = @process_define_id +JOIN zhgh_swufe.evaluate_apply apply ON apply.id = plan.businessNo +LEFT JOIN union_swufe.audit audit ON audit.id = plan.auditId +LEFT JOIN zhgh_swufe.sys_user reviewer ON reviewer.id = audit.auditor +LEFT JOIN zhgh_swufe.sys_unit reviewerUnit ON reviewerUnit.id = reviewer.unitId; + +DROP TEMPORARY TABLE IF EXISTS tmp_evaluation_task_id; +CREATE TEMPORARY TABLE tmp_evaluation_task_id ( + rowKey VARCHAR(100) PRIMARY KEY, + taskId BIGINT NOT NULL +); +INSERT INTO tmp_evaluation_task_id (rowKey, taskId) +SELECT plan.rowKey, task.id +FROM tmp_evaluation_task_plan plan +JOIN zhgh_swufe.wf_process_instance instance + ON instance.businessNo = plan.businessNo AND instance.processDefineId = @process_define_id +JOIN zhgh_swufe.wf_process_task task + ON task.processInstanceId = instance.id + AND task.taskName = plan.taskName + AND task.taskState = plan.taskState + AND (plan.auditId IS NULL OR JSON_UNQUOTE(JSON_EXTRACT(task.variable, '$.migrationAuditId')) = plan.auditId); + +-- MySQL 同一语句不能重复打开同一临时表,复制一份父任务映射后再更新父子链。 +DROP TEMPORARY TABLE IF EXISTS tmp_evaluation_parent_task_id; +CREATE TEMPORARY TABLE tmp_evaluation_parent_task_id ( + rowKey VARCHAR(100) PRIMARY KEY, + taskId BIGINT NOT NULL +); +INSERT INTO tmp_evaluation_parent_task_id (rowKey, taskId) +SELECT rowKey, taskId FROM tmp_evaluation_task_id; + +UPDATE zhgh_swufe.wf_process_task task +JOIN tmp_evaluation_task_id currentTask ON currentTask.taskId = task.id +JOIN tmp_evaluation_task_plan plan ON plan.rowKey = currentTask.rowKey +LEFT JOIN tmp_evaluation_parent_task_id parentTask ON parentTask.rowKey = plan.parentRowKey +SET task.taskParentId = parentTask.taskId; + +-- 已完成节点的参与人使用 v3 原审核人;提交申请任务使用原申请人。 +INSERT INTO zhgh_swufe.wf_process_task_actor + (processTaskId, actorId, actorAccount, actorName, actorUnitId, actorUnitName, + createdBy, createdAt, updatedBy, updatedAt, delFlag) +SELECT taskId.taskId, + CASE WHEN plan.taskName = 'startTask' THEN apply.createdBy ELSE plan.operator END, + CASE WHEN plan.taskName = 'startTask' THEN apply.loginName + ELSE COALESCE(audit.loginname, reviewer.loginname) END, + CASE WHEN plan.taskName = 'startTask' THEN apply.userName + ELSE COALESCE(audit.username, reviewer.username) END, + CASE WHEN plan.taskName = 'startTask' THEN apply.unitId ELSE reviewer.unitId END, + CASE WHEN plan.taskName = 'startTask' THEN apply.unitName ELSE reviewerUnit.name END, + 'migration', COALESCE(plan.createdAt, apply.createdAt), + 'migration', COALESCE(plan.createdAt, apply.createdAt), 0 +FROM tmp_evaluation_task_plan plan +JOIN tmp_evaluation_task_id taskId ON taskId.rowKey = plan.rowKey +JOIN zhgh_swufe.evaluate_apply apply ON apply.id = plan.businessNo +LEFT JOIN union_swufe.audit audit ON audit.id = plan.auditId +LEFT JOIN zhgh_swufe.sys_user reviewer ON reviewer.id = plan.operator +LEFT JOIN zhgh_swufe.sys_unit reviewerUnit ON reviewerUnit.id = reviewer.unitId +WHERE plan.taskState = 20 OR plan.taskName = 'startTask'; + +-- 单位审核参与人:实际审核人已在上一步保留;再按当前角色组织范围补齐候选人, +-- 使迁移后的已审核页面与正常 v4 流程一样,可由同单位现任负责人查看历史任务。 +INSERT INTO zhgh_swufe.wf_process_task_actor + (processTaskId, actorId, actorAccount, actorName, actorUnitId, actorUnitName, + createdBy, createdAt, updatedBy, updatedAt, delFlag) +SELECT DISTINCT taskId.taskId, user.id, user.loginname, user.username, user.unitId, unit.name, + 'migration', @now_ms, 'migration', @now_ms, 0 +FROM tmp_evaluation_task_plan plan +JOIN tmp_evaluation_task_id taskId ON taskId.rowKey = plan.rowKey +JOIN zhgh_swufe.evaluate_apply apply ON apply.id = plan.businessNo +JOIN zhgh_swufe.sys_role role ON role.code = 'UNIT_MANAGER' AND role.disabled = 0 +JOIN zhgh_swufe.sys_user_role userRole ON userRole.roleId = role.id +JOIN zhgh_swufe.sys_user user ON user.id = userRole.userId AND user.unitId = apply.unitId +LEFT JOIN zhgh_swufe.sys_unit unit ON unit.id = user.unitId +LEFT JOIN zhgh_swufe.wf_process_task_actor existingActor + ON existingActor.processTaskId = taskId.taskId AND existingActor.actorId = user.id +WHERE plan.taskState IN (10, 20) + AND plan.taskName = 'b14df33c-053c-4a91-a1b7-283ae70ece56' + AND user.disabled = 0 AND IFNULL(user.delFlag, 0) = 0 + AND existingActor.id IS NULL; + +-- 分工会审核参与人:沿用现有处理器的主席、管理员角色及 sys_user_role.unionId 范围。 +INSERT INTO zhgh_swufe.wf_process_task_actor + (processTaskId, actorId, actorAccount, actorName, actorUnitId, actorUnitName, + createdBy, createdAt, updatedBy, updatedAt, delFlag) +SELECT DISTINCT taskId.taskId, user.id, user.loginname, user.username, user.unitId, unit.name, + 'migration', @now_ms, 'migration', @now_ms, 0 +FROM tmp_evaluation_task_plan plan +JOIN tmp_evaluation_task_id taskId ON taskId.rowKey = plan.rowKey +JOIN zhgh_swufe.evaluate_apply apply ON apply.id = plan.businessNo +JOIN zhgh_swufe.sys_role role ON role.code IN ('BRANCH_UNION_CHAIRMAN', 'BRANCH_UNION_ADMIN') +JOIN zhgh_swufe.sys_user_role userRole ON userRole.roleId = role.id AND userRole.unionId = apply.unionId +JOIN zhgh_swufe.sys_user user ON user.id = userRole.userId +LEFT JOIN zhgh_swufe.sys_unit unit ON unit.id = user.unitId +LEFT JOIN zhgh_swufe.wf_process_task_actor existingActor + ON existingActor.processTaskId = taskId.taskId AND existingActor.actorId = user.id +WHERE plan.taskState IN (10, 20) + AND plan.taskName = '3bdaa29d-e5eb-4e3e-b7f1-14d03bedd078' + AND user.disabled = 0 AND IFNULL(user.delFlag, 0) = 0 + AND existingActor.id IS NULL; + +-- 二级党组织审核参与人:角色用户所属单位关联的 unionId 必须匹配申请人分工会。 +INSERT INTO zhgh_swufe.wf_process_task_actor + (processTaskId, actorId, actorAccount, actorName, actorUnitId, actorUnitName, + createdBy, createdAt, updatedBy, updatedAt, delFlag) +SELECT DISTINCT taskId.taskId, user.id, user.loginname, user.username, user.unitId, unit.name, + 'migration', @now_ms, 'migration', @now_ms, 0 +FROM tmp_evaluation_task_plan plan +JOIN tmp_evaluation_task_id taskId ON taskId.rowKey = plan.rowKey +JOIN zhgh_swufe.evaluate_apply apply ON apply.id = plan.businessNo +JOIN zhgh_swufe.sys_role role ON role.code = 'UNIT_PARTY_SECRETARY' AND role.disabled = 0 +JOIN zhgh_swufe.sys_user_role userRole ON userRole.roleId = role.id +JOIN zhgh_swufe.sys_user user ON user.id = userRole.userId +JOIN zhgh_swufe.sys_unit unit ON unit.id = user.unitId AND unit.unionId = apply.unionId +LEFT JOIN zhgh_swufe.wf_process_task_actor existingActor + ON existingActor.processTaskId = taskId.taskId AND existingActor.actorId = user.id +WHERE plan.taskState IN (10, 20) + AND plan.taskName = '7dbdd0ed-05bb-4c31-9f5d-bfad3b3e2e26' + AND user.disabled = 0 AND IFNULL(user.delFlag, 0) = 0 + AND existingActor.id IS NULL; + +-- 校工会审核参与人:按当前校工会管理员角色配置补齐候选人。 +INSERT INTO zhgh_swufe.wf_process_task_actor + (processTaskId, actorId, actorAccount, actorName, actorUnitId, actorUnitName, + createdBy, createdAt, updatedBy, updatedAt, delFlag) +SELECT DISTINCT taskId.taskId, user.id, user.loginname, user.username, user.unitId, unit.name, + 'migration', @now_ms, 'migration', @now_ms, 0 +FROM tmp_evaluation_task_plan plan +JOIN tmp_evaluation_task_id taskId ON taskId.rowKey = plan.rowKey +JOIN zhgh_swufe.sys_role role ON role.code = 'SCHOOL_UNION_ADMIN' AND role.disabled = 0 +JOIN zhgh_swufe.sys_user_role userRole ON userRole.roleId = role.id +JOIN zhgh_swufe.sys_user user ON user.id = userRole.userId +LEFT JOIN zhgh_swufe.sys_unit unit ON unit.id = user.unitId +LEFT JOIN zhgh_swufe.wf_process_task_actor existingActor + ON existingActor.processTaskId = taskId.taskId AND existingActor.actorId = user.id +WHERE plan.taskState IN (10, 20) + AND plan.taskName = '3c158aca-89ef-4188-bbc3-e8db201f02a1' + AND user.disabled = 0 AND IFNULL(user.delFlag, 0) = 0 + AND existingActor.id IS NULL; + +-- 提交前输出并校验关键数量;任一校验失败会触发 NOT NULL 错误并由连接关闭回滚整个事务。 +SELECT 'activity' AS metric, COUNT(*) AS amount FROM zhgh_swufe.evaluate_activity +UNION ALL SELECT 'application', COUNT(*) FROM zhgh_swufe.evaluate_apply +UNION ALL SELECT 'flow_instance', COUNT(*) + FROM zhgh_swufe.wf_process_instance WHERE processDefineId = @process_define_id + AND businessNo IN (SELECT id FROM zhgh_swufe.evaluate_apply) +UNION ALL SELECT 'flow_task', COUNT(*) + FROM zhgh_swufe.wf_process_task task + JOIN zhgh_swufe.wf_process_instance instance ON instance.id = task.processInstanceId + WHERE instance.processDefineId = @process_define_id + AND instance.businessNo IN (SELECT id FROM zhgh_swufe.evaluate_apply) +UNION ALL SELECT 'pending_task', COUNT(*) + FROM zhgh_swufe.wf_process_task task + JOIN zhgh_swufe.wf_process_instance instance ON instance.id = task.processInstanceId + WHERE instance.processDefineId = @process_define_id + AND instance.businessNo IN (SELECT id FROM zhgh_swufe.evaluate_apply) + AND task.taskState = 10; + +DELETE FROM tmp_evaluation_migration_guard; +INSERT INTO tmp_evaluation_migration_guard (checkName, passed) VALUES +('activity_count', IF((SELECT COUNT(*) FROM zhgh_swufe.evaluate_activity) = 11, 1, NULL)), +('application_count', IF((SELECT COUNT(*) FROM zhgh_swufe.evaluate_apply) = 78, 1, NULL)), +('home_activity_count', IF((SELECT COUNT(*) FROM zhgh_swufe.sys_home_activity home + JOIN zhgh_swufe.evaluate_activity activity ON activity.id = home.id) = 11, 1, NULL)), +('flow_instance_count', IF((SELECT COUNT(*) FROM zhgh_swufe.wf_process_instance instance + WHERE instance.processDefineId = @process_define_id + AND instance.businessNo IN (SELECT id FROM zhgh_swufe.evaluate_apply)) = 72, 1, NULL)), +('doing_instance_count', IF((SELECT COUNT(*) FROM zhgh_swufe.wf_process_instance instance + WHERE instance.processDefineId = @process_define_id AND instance.state = 10 + AND instance.businessNo IN (SELECT id FROM zhgh_swufe.evaluate_apply)) = 27, 1, NULL)), +('finished_instance_count', IF((SELECT COUNT(*) FROM zhgh_swufe.wf_process_instance instance + WHERE instance.processDefineId = @process_define_id AND instance.state = 20 + AND instance.businessNo IN (SELECT id FROM zhgh_swufe.evaluate_apply)) = 45, 1, NULL)), +('pending_task_count', IF((SELECT COUNT(*) FROM zhgh_swufe.wf_process_task task + JOIN zhgh_swufe.wf_process_instance instance ON instance.id = task.processInstanceId + WHERE instance.processDefineId = @process_define_id + AND instance.businessNo IN (SELECT id FROM zhgh_swufe.evaluate_apply) + AND task.taskState = 10) = 27, 1, NULL)), +('pending_start_count', IF((SELECT COUNT(*) FROM zhgh_swufe.wf_process_task task + JOIN zhgh_swufe.wf_process_instance instance ON instance.id = task.processInstanceId + WHERE instance.processDefineId = @process_define_id + AND instance.businessNo IN (SELECT id FROM zhgh_swufe.evaluate_apply) + AND task.taskState = 10 AND task.taskName = 'startTask') = 5, 1, NULL)), +('pending_unit_count', IF((SELECT COUNT(*) FROM zhgh_swufe.wf_process_task task + JOIN zhgh_swufe.wf_process_instance instance ON instance.id = task.processInstanceId + WHERE instance.processDefineId = @process_define_id + AND instance.businessNo IN (SELECT id FROM zhgh_swufe.evaluate_apply) + AND task.taskState = 10 + AND task.taskName = 'b14df33c-053c-4a91-a1b7-283ae70ece56') = 6, 1, NULL)), +('pending_branch_count', IF((SELECT COUNT(*) FROM zhgh_swufe.wf_process_task task + JOIN zhgh_swufe.wf_process_instance instance ON instance.id = task.processInstanceId + WHERE instance.processDefineId = @process_define_id + AND instance.businessNo IN (SELECT id FROM zhgh_swufe.evaluate_apply) + AND task.taskState = 10 + AND task.taskName = '3bdaa29d-e5eb-4e3e-b7f1-14d03bedd078') = 5, 1, NULL)), +('pending_party_count', IF((SELECT COUNT(*) FROM zhgh_swufe.wf_process_task task + JOIN zhgh_swufe.wf_process_instance instance ON instance.id = task.processInstanceId + WHERE instance.processDefineId = @process_define_id + AND instance.businessNo IN (SELECT id FROM zhgh_swufe.evaluate_apply) + AND task.taskState = 10 + AND task.taskName = '7dbdd0ed-05bb-4c31-9f5d-bfad3b3e2e26') = 11, 1, NULL)), +('pending_actor_exists', IF(NOT EXISTS ( + SELECT 1 + FROM zhgh_swufe.wf_process_task task + JOIN zhgh_swufe.wf_process_instance instance ON instance.id = task.processInstanceId + WHERE instance.processDefineId = @process_define_id + AND instance.businessNo IN (SELECT id FROM zhgh_swufe.evaluate_apply) + AND task.taskState = 10 + AND NOT EXISTS ( + SELECT 1 FROM zhgh_swufe.wf_process_task_actor actor WHERE actor.processTaskId = task.id + ) +), 1, NULL)); + +-- 涉及临时任务表的校验必须拆成独立语句,规避 MySQL 同一语句重复打开临时表的限制。 +INSERT INTO tmp_evaluation_migration_guard (checkName, passed) +VALUES ('task_plan_count', IF((SELECT COUNT(*) FROM tmp_evaluation_task_plan) = 253, 1, NULL)); + +INSERT INTO tmp_evaluation_migration_guard (checkName, passed) +VALUES ('task_id_map_count', IF((SELECT COUNT(*) FROM tmp_evaluation_task_id) = 253, 1, NULL)); + +DROP TEMPORARY TABLE IF EXISTS tmp_evaluation_parent_check_plan; +CREATE TEMPORARY TABLE tmp_evaluation_parent_check_plan ( + rowKey VARCHAR(100) PRIMARY KEY, + parentRowKey VARCHAR(100) +); +INSERT INTO tmp_evaluation_parent_check_plan (rowKey, parentRowKey) +SELECT rowKey, parentRowKey FROM tmp_evaluation_task_plan; + +INSERT INTO tmp_evaluation_migration_guard (checkName, passed) +VALUES ('task_parent_complete', IF(NOT EXISTS ( + SELECT 1 + FROM tmp_evaluation_parent_check_plan plan + JOIN tmp_evaluation_task_id taskId ON taskId.rowKey = plan.rowKey + JOIN zhgh_swufe.wf_process_task task ON task.id = taskId.taskId + LEFT JOIN tmp_evaluation_parent_task_id parentTaskId ON parentTaskId.rowKey = plan.parentRowKey + LEFT JOIN zhgh_swufe.wf_process_task parentTask + ON parentTask.id = task.taskParentId AND parentTask.processInstanceId = task.processInstanceId + WHERE plan.parentRowKey IS NOT NULL + AND (parentTaskId.taskId IS NULL OR task.taskParentId <> parentTaskId.taskId OR parentTask.id IS NULL) +), 1, NULL)); + +COMMIT; diff --git a/src/main/resources/views/platform/zhgh/staffbenefit/condolence/apply/index.html b/src/main/resources/views/platform/zhgh/staffbenefit/condolence/apply/index.html index 0b0de05..c8e9adb 100644 --- a/src/main/resources/views/platform/zhgh/staffbenefit/condolence/apply/index.html +++ b/src/main/resources/views/platform/zhgh/staffbenefit/condolence/apply/index.html @@ -63,10 +63,10 @@ layout("/layouts/platform.html"){ - - + + + placeholder="请选择补贴类型"> } Axios 请求 Promise,响应 data 为 yyyy-MM-dd 日期字符串。 */ queryApplyEndDate() { @@ -245,7 +245,7 @@ layout("/layouts/platform.html"){ this.$set(this, "applyPeriodDialogVisible", false) }, /** - * 保存慰问申报截止日期。 + * 保存补贴申报截止日期。 * @returns {void} 保存成功后刷新截止日期并关闭弹框。 */ saveApplyEndDate() { @@ -433,8 +433,8 @@ layout("/layouts/platform.html"){ } }, /** - * 按当前用户角色过滤可申请的慰问类型。 - * @param {Array} options 接口返回的全部启用慰问类型。 + * 按当前用户角色过滤可申请的补贴类型。 + * @param {Array} options 接口返回的全部启用补贴类型。 * @returns {Array} 系统管理员、校工会管理员返回全部类型,其他角色仅返回编码 A、B 的类型。 */ filterTypeOptions(options) { diff --git a/src/main/resources/views/platform/zhgh/staffbenefit/condolence/branchUnionApproval/index.html b/src/main/resources/views/platform/zhgh/staffbenefit/condolence/branchUnionApproval/index.html index 9afd341..c4d2881 100644 --- a/src/main/resources/views/platform/zhgh/staffbenefit/condolence/branchUnionApproval/index.html +++ b/src/main/resources/views/platform/zhgh/staffbenefit/condolence/branchUnionApproval/index.html @@ -21,9 +21,9 @@ layout("/layouts/platform.html"){ @keyup.enter.native="doSearch"> - + + placeholder="请选择补贴类型" filterable clearable> - + + placeholder="请选择补贴类型" filterable clearable>