This commit is contained in:
2026-07-02 16:52:08 +08:00
parent 4afb3bd835
commit a79280d16d
5 changed files with 193 additions and 14 deletions
@@ -85,8 +85,8 @@ public class ProposalConfigUnitController {
Sql sql = Sqls.create("""
SELECT
t1.*,
u1.username AS branchSchoolLeader,
u2.username AS unitLeader
GROUP_CONCAT(DISTINCT u1.username ORDER BY u1.username SEPARATOR '、') AS branchSchoolLeader,
GROUP_CONCAT(DISTINCT u2.username ORDER BY u2.username SEPARATOR '、') AS unitLeader
FROM
proposal_undertake t1
LEFT JOIN sys_user_role sur1 ON sur1.underTakeId = t1.id
@@ -108,6 +108,7 @@ public class ProposalConfigUnitController {
cnd.where().orLike("t1.name", pageForm.getSearchKeyword());
}
cnd.and("t1.enable","=", true);
cnd.groupBy("t1.id");
cnd.asc("t1.code");
sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
@@ -1,13 +1,18 @@
package com.budwk.app.zhgh.democratic.proposal.controller.query;
import cn.hutool.core.bean.BeanUtil;
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.engine.util.FlowUtil;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.zhgh.democratic.proposal.controller.vo.ProposalUnitReplyProposalVO;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalConfig;
import com.budwk.app.zhgh.democratic.proposal.models.ProposalReplyUnit;
import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam;
import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
@@ -19,6 +24,7 @@ import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
import java.util.*;
import java.util.stream.Collectors;
@@ -131,4 +137,43 @@ public class ProposalQueryUnitReplyController {
return Result.success().addData(Map.of("tableData", tableData, "slaveNeedReply", slaveNeedReply));
}
@At
@SaCheckPermission("proposal.query.unitReply")
@ApiOperation("承办单位提案明细")
public Result getProposalsByUnit(@Valid ProposalSearchParam pageForm, String unitCode) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.code,
info.name,
info.createUserName,
type.name AS typeName,
tcs.fullName AS sessionName,
tcd.`name` AS delegationName,
pru.unitName AS underTakeUnitName,
IF(pru.isMaster = 1, '主办', '协办') AS underTakeType,
IFNULL(GROUP_CONCAT(DISTINCT t.displayName), '结束') AS curTaskName
FROM
proposal_reply_unit pru
INNER JOIN proposal_info info ON info.id = pru.proposalId
LEFT JOIN proposal_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_instance ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
// 明细弹窗按当前届次和点击的承办单位编码查询,返回该单位主办、协办的提案列表。
cnd.andEX("pru.unitCode", "=", unitCode);
ProposalSearchParam.buildSearch(cnd, pageForm);
cnd.groupBy("info.id", "pru.unitName", "pru.isMaster");
sql.setCondition(cnd);
Pagination pagination = proposalCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
List<ProposalUnitReplyProposalVO> list = BeanUtil.copyToList(pagination.getList(), ProposalUnitReplyProposalVO.class);
pagination.setList(list);
return Result.success(pagination);
}
}
@@ -98,9 +98,28 @@ public class ProposalUnderTakeReplyController {
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IFNULL(GROUP_CONCAT(DISTINCT nt.taskName),'结束') curTaskKey,
CASE WHEN t.taskState = 20 AND ( rt.id IS NULL OR rt.taskState = 10 ) THEN 1 ELSE 0 END AS canRevoke,
IFNULL((
SELECT GROUP_CONCAT(DISTINCT nt.displayName)
FROM wf_process_task nt
WHERE nt.processInstanceId = ins.id AND nt.taskState = 10
), '结束') curTaskName,
IFNULL((
SELECT GROUP_CONCAT(DISTINCT nt.taskName)
FROM wf_process_task nt
WHERE nt.processInstanceId = ins.id AND nt.taskState = 10
), '结束') curTaskKey,
CASE WHEN t.taskState = 20 AND (
NOT EXISTS (
SELECT 1
FROM wf_process_task rt
WHERE rt.processInstanceId = ins.id AND rt.taskParentId = t.id
)
OR EXISTS (
SELECT 1
FROM wf_process_task rt
WHERE rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
)
) THEN 1 ELSE 0 END AS canRevoke,
IFNULL(pru.unitName, t.variable->>'$.underTakeName') AS underTakeName,
IFNULL(pru.isMaster, IF(JSON_EXTRACT(t.variable, '$.underTakeIsMaster') = true, 1, 0)) AS underTakeIsMaster,
t.variable->>'$.tf_transferUserId' AS tf_transferUserId,
@@ -109,8 +128,6 @@ public class ProposalUnderTakeReplyController {
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
LEFT JOIN proposal_info info ON info.id = ins.businessNo
LEFT JOIN proposal_type type on type.id = info.typeId
LEFT JOIN proposal_merge mer ON mer.proposalId = info.id
@@ -124,6 +141,16 @@ public class ProposalUnderTakeReplyController {
LEFT JOIN sys_user transferUser on transferUser.id = t.variable->>'$.tf_transferUserId'
$condition
""");
// 分页统计只保留任务、办理人和提案查询所需关联,避免完整列表 SQL 的聚合字段参与 count。
Sql countSql = Sqls.create("""
SELECT COUNT(DISTINCT t.id)
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 proposal_info info ON info.id = ins.businessNo
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "in", List.of("master_reply", "slave_reply", "opinion_master_reply"));
@@ -140,11 +167,23 @@ public class ProposalUnderTakeReplyController {
cnd.groupBy("t.id", "pru.unitId", "pru.unitName", "pru.isMaster");
cnd.desc("t.createdAt");
sql.setCondition(cnd);
Pagination pagination = proposalCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
Cnd countCnd = Cnd.NEW();
countCnd.and("t.taskName", "in", List.of("master_reply", "slave_reply", "opinion_master_reply"));
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
countCnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
}
if (approval) {
countCnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.TRANSFER.getCode()));
} else {
countCnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
ProposalSearchParam.buildSearch(countCnd, pageForm);
countSql.setCondition(countCnd);
Pagination pagination = proposalCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql, countSql);
List<NutMap> list = pagination.getList();
for (NutMap row : list) {
if (row.getInt("taskIsMaster") == 1) {
if (row.getInt("underTakeIsMaster") == 1) {
boolean b = Stream.of("master_reply", "slave_reply", "school_leader")
.anyMatch(a -> row.getString("curTaskKey").contains(a));
row.setv("canRevoke", b && row.getInt("taskState") == ProcessTaskStateEnum.FINISHED.getCode());