From c18579fe40c42185b407e65f35089a973a6885fd Mon Sep 17 00:00:00 2001 From: zhangrui Date: Thu, 3 Sep 2026 17:53:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=99=E4=BB=A3=E4=BC=9A=E6=84=8F=E8=A7=81?= =?UTF-8?q?=E6=A8=A1=E5=9D=97->=E6=89=BF=E5=8A=9E=E7=AD=94=E5=A4=8D=20=20?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=88=9D=E5=A7=8B=E5=8C=96=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=9C=89=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transact/OpinionUnitReplyController.java | 78 ++----------------- .../service/common/OpinionCommonService.java | 10 +++ .../common/OpinionCommonServiceImpl.java | 67 ++++++++++++++++ .../opinion/transact/unitReply/index.html | 12 +-- 4 files changed, 90 insertions(+), 77 deletions(-) diff --git a/src/main/java/com/budwk/app/zhgh/democratic/opinion/controller/transact/OpinionUnitReplyController.java b/src/main/java/com/budwk/app/zhgh/democratic/opinion/controller/transact/OpinionUnitReplyController.java index f5eeba17..5bf8b513 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/opinion/controller/transact/OpinionUnitReplyController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/opinion/controller/transact/OpinionUnitReplyController.java @@ -1,29 +1,19 @@ package com.budwk.app.zhgh.democratic.opinion.controller.transact; import cn.dev33.satoken.annotation.SaCheckPermission; -import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; -import com.budwk.app.flow.enums.ProcessTaskStateEnum; -import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.democratic.opinion.param.OpinionSearchParam; import com.budwk.app.zhgh.democratic.opinion.service.common.OpinionCommonService; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; 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.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; -import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; -import org.nutz.mvc.annotation.Param; import javax.validation.Valid; -import java.util.List; /** * @ClassName OpinionUnitReplyController @@ -39,8 +29,6 @@ import java.util.List; @Api(tags = "意见管理-承办答复") public class OpinionUnitReplyController { - @Inject - private Dao dao; @Inject private OpinionCommonService opinionCommonService; @@ -50,67 +38,15 @@ public class OpinionUnitReplyController { public void index() { } + /** + * 承办答复分页查询。pageForm 接收届次 sessionId、意见搜索条件、分页及排序参数; + * approval 为 true 查询已审核,为 false 或未传时查询未审核。 + * 返回 Result,data 为分页结果,其中 list 为意见及任务信息,totalCount 为匹配总数。 + */ @At @SaCheckPermission("opinion.unitReply") @Aop(TransAop.READ_COMMITTED) - public Result pageData(@Valid OpinionSearchParam pageForm, - @Param(value = "String") String sessionId, - @Param(value = "approval") Boolean approval) { - Sql sql = Sqls.create(""" - SELECT - info.*, - type.name AS typeName, - tcs.fullName AS sessionName, - tcd.`name` AS delegationName, - 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, - t.variable->>'$.underTakeName' AS underTakeName, - IF(JSON_EXTRACT(t.variable, '$.underTakeIsMaster') in (true, 1), 1, 0) AS underTakeIsMaster - FROM - wf_process_task t - LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId - LEFT JOIN opinion_info info ON info.id = ins.businessNo - LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id - LEFT JOIN opinion_type type on type.id = info.typeId - LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId - LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId - 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 wf_process_task_actor pta ON pta.processTaskId = nt.id - $condition - """); - Cnd cnd = Cnd.NEW(); - cnd.andEX("info.sessionId", "=", sessionId); - cnd.and("t.taskName", "in", List.of("master_reply", "slave_reply")); - cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); - - if (approval) { - cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); - } else { - cnd.and("pta.actorId", "in", List.of(SecurityUtil.getUserId())); - cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); - } - - OpinionSearchParam.buildSearch(cnd, pageForm); - - cnd.groupBy("t.id"); - sql.setCondition(cnd); - - Pagination pageVO = opinionCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); - return Result.success(pageVO); + public Result pageData(@Valid OpinionSearchParam pageForm) { + return Result.success(opinionCommonService.listUnitReplyPage(pageForm)); } } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/opinion/service/common/OpinionCommonService.java b/src/main/java/com/budwk/app/zhgh/democratic/opinion/service/common/OpinionCommonService.java index 8e38f6da..c51ee0e4 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/opinion/service/common/OpinionCommonService.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/opinion/service/common/OpinionCommonService.java @@ -1,7 +1,9 @@ package com.budwk.app.zhgh.democratic.opinion.service.common; +import com.budwk.app.base.page.Pagination; import com.budwk.app.base.service.BaseService; import com.budwk.app.zhgh.democratic.opinion.models.OpinionInfo; +import com.budwk.app.zhgh.democratic.opinion.param.OpinionSearchParam; import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake; import org.nutz.lang.util.NutMap; @@ -12,6 +14,14 @@ import java.util.List; public interface OpinionCommonService extends BaseService { + /** + * 查询当前登录人的意见承办答复任务,仅包含 JDHYJ 流程且业务意见存在的记录。 + * + * @param pageForm 届次、意见搜索条件、分页及排序参数;approval 为 true 查询已审核,否则查询未审核 + * @return 分页结果,list 包含意见及任务信息,totalCount 为匹配总数 + */ + Pagination listUnitReplyPage(OpinionSearchParam pageForm); + /** * 查询意见信息 */ diff --git a/src/main/java/com/budwk/app/zhgh/democratic/opinion/service/common/OpinionCommonServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/opinion/service/common/OpinionCommonServiceImpl.java index 14d2aea2..b9178de7 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/opinion/service/common/OpinionCommonServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/opinion/service/common/OpinionCommonServiceImpl.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; 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.service.impl.BaseServiceImpl; import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.SysOfficeTemplateUtil; @@ -26,6 +27,7 @@ import com.budwk.app.sys.services.SysRoleService; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.web.commons.base.Globals; import com.budwk.app.zhgh.democratic.opinion.models.OpinionInfo; +import com.budwk.app.zhgh.democratic.opinion.param.OpinionSearchParam; import com.budwk.app.zhgh.democratic.proposal.models.ProposalConsolidation; import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; import com.budwk.app.zhgh.democratic.proposal.models.ProposalMerge; @@ -75,6 +77,71 @@ public class OpinionCommonServiceImpl extends BaseServiceImpl imple super(dao); } + /** + * 按当前登录人和审核状态查询意见承办任务,避免其他流程的同名节点混入列表。 + * + * @param pageForm 届次、搜索、分页及排序参数;approval 为空时按未审核处理 + * @return 包含 list 和 totalCount 的分页结果,保留页面所需的意见及任务字段 + */ + @Override + public Pagination listUnitReplyPage(OpinionSearchParam pageForm) { + // 提案与意见存在同名答复节点,必须同时校验流程标识及意见业务记录。 + Sql sql = Sqls.create(""" + SELECT + info.*, + type.name AS typeName, + tcs.fullName AS sessionName, + tcd.`name` AS delegationName, + 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, + t.variable->>'$.underTakeName' AS underTakeName, + IF(JSON_EXTRACT(t.variable, '$.underTakeIsMaster') in (true, 1), 1, 0) AS underTakeIsMaster + FROM + wf_process_task t + INNER JOIN wf_process_instance ins ON ins.id = t.processInstanceId + INNER JOIN wf_process_define def ON def.id = ins.processDefineId + INNER JOIN opinion_info info ON info.id = ins.businessNo + LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id + LEFT JOIN opinion_type type on type.id = info.typeId + LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId + LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId + 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 wf_process_task_actor pta ON pta.processTaskId = nt.id + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("def.name", "=", "JDHYJ"); + cnd.and("t.taskName", "in", List.of("master_reply", "slave_reply")); + cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); + + if (Boolean.TRUE.equals(pageForm.getApproval())) { + cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); + } else { + cnd.and("pta.actorId", "in", List.of(SecurityUtil.getUserId())); + cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); + } + + OpinionSearchParam.buildSearch(cnd, pageForm); + cnd.groupBy("t.id"); + sql.setCondition(cnd); + return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + } + @Override public NutMap info(String id) { if (StrUtil.isBlank(id)) { diff --git a/src/main/resources/views/platform/zhgh/democratic/opinion/transact/unitReply/index.html b/src/main/resources/views/platform/zhgh/democratic/opinion/transact/unitReply/index.html index 1201d6c8..ced58ecd 100644 --- a/src/main/resources/views/platform/zhgh/democratic/opinion/transact/unitReply/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/opinion/transact/unitReply/index.html @@ -202,21 +202,21 @@ layout("/layouts/platform.html"){ this.doSearch() }, - // 查询开启的教代会 + // 默认届次确定后再查询列表,避免无届次请求覆盖带届次的查询结果。 listOpenSession() { - this.$axios.post("/platform/opinion/common/listOpenSession").then((res) => { + return this.$axios.post("/platform/opinion/common/listOpenSession").then((res) => { if (res.code === 0) { - this.sessionOptions = res.data - if (this.sessionOptions) { + this.$set(this, "sessionOptions", res.data || []) + if (this.sessionOptions.length > 0) { this.$set(this.pageForm, "sessionId", this.sessionOptions[0].id) - this.pageData() } + // 无开启届次时仍按当前用户查询,由后端限定为有效的意见任务。 + this.pageData() } }) }, }, created() { - this.pageData() this.listOpenSession() } })