diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCaseCheckController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCaseCheckController.java index f96e9315..6cd1af9a 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCaseCheckController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCaseCheckController.java @@ -3,6 +3,7 @@ package com.budwk.app.zhgh.democratic.proposal.controller.transact; import cn.dev33.satoken.annotation.SaCheckPermission; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.BaseService; import com.budwk.app.flow.enums.ProcessTaskStateEnum; @@ -21,7 +22,9 @@ 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.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.util.List; @@ -116,6 +119,15 @@ public class ProposalCaseCheckController { return Result.success(pagination); } + @At + @Ok("void") + @SaCheckPermission("proposal.caseCheck") + @ApiOperation("导出列表") + public void exportList(@Valid @Param("pageForm") ProposalSearchParam pageForm, boolean approval, + @Param("tableColumns") ExportTableColumns[] tableColumns, HttpServletResponse response) { + proposalCommonService.exportWorkflowList("caseCheck", pageForm, approval, tableColumns, response); + } + @At @SaCheckPermission("proposal.caseCheck") @ApiOperation("查询当前提案承办单位") diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingController.java index 78306070..f3f487a3 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingController.java @@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.lang.Dict; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.base.result.Result; import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.web.commons.auth.utils.AuthUtil; @@ -28,6 +29,7 @@ import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import javax.validation.Valid; +import javax.servlet.http.HttpServletResponse; import java.util.List; @IocBean @@ -114,6 +116,15 @@ public class ProposalCommitteeFilingController { return Result.success(pagination); } + @At + @Ok("void") + @SaCheckPermission("proposal.committeeFiling") + @ApiOperation("导出列表") + public void exportList(@Valid @Param("pageForm") ProposalSearchParam pageForm, boolean approval, + @Param("tableColumns") ExportTableColumns[] tableColumns, HttpServletResponse response) { + proposalCommonService.exportWorkflowList("committeeFiling", pageForm, approval, tableColumns, response); + } + @At @SaCheckPermission("proposal.committeeFiling") @ApiOperation("并案审核") diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingUnitController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingUnitController.java index e2883d49..38d4af98 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingUnitController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommitteeFilingUnitController.java @@ -6,6 +6,7 @@ import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ObjectUtil; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.BaseService; import com.budwk.app.flow.entity.ProcessInstance; @@ -36,6 +37,7 @@ import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import javax.validation.Valid; +import javax.servlet.http.HttpServletResponse; import java.util.List; @IocBean @@ -127,6 +129,15 @@ public class ProposalCommitteeFilingUnitController { return Result.success(pagination); } + @At + @Ok("void") + @SaCheckPermission("proposal.committeeFilingUnit") + @ApiOperation("导出列表") + public void exportList(@Valid @Param("pageForm") ProposalSearchParam pageForm, boolean approval, + @Param("tableColumns") ExportTableColumns[] tableColumns, HttpServletResponse response) { + proposalCommonService.exportWorkflowList("committeeFilingUnit", pageForm, approval, tableColumns, response); + } + @At @SaCheckPermission("proposal.committeeFilingUnit") @ApiOperation("执行任务") diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java index 8249ac24..cd024a5a 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java @@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission; 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.param.ExportTableColumns; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.BaseService; import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum; @@ -32,6 +33,7 @@ import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import javax.validation.Valid; +import javax.servlet.http.HttpServletResponse; import java.util.List; /** @@ -127,4 +129,13 @@ public class ProposalDelegationController { return Result.success(pagination); } + @At + @Ok("void") + @SaCheckPermission("proposal.delegation") + @ApiOperation("导出列表") + public void exportList(@Valid @Param("pageForm") ProposalSearchParam pageForm, boolean approval, + @Param("tableColumns") ExportTableColumns[] tableColumns, HttpServletResponse response) { + proposalCommonService.exportWorkflowList("delegation", pageForm, approval, tableColumns, response); + } + } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalFeedbackEvaluationController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalFeedbackEvaluationController.java index 537882a7..bef308e3 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalFeedbackEvaluationController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalFeedbackEvaluationController.java @@ -5,6 +5,7 @@ import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.base.result.Result; import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.enums.ProcessTaskStateEnum; @@ -26,6 +27,7 @@ import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import javax.validation.Valid; +import javax.servlet.http.HttpServletResponse; import java.util.List; @IocBean @@ -116,6 +118,15 @@ public class ProposalFeedbackEvaluationController { return Result.success(pagination); } + @At + @Ok("void") + @SaCheckPermission("proposal.feedbackEvaluation") + @ApiOperation("导出列表") + public void exportList(@Valid @Param("pageForm") ProposalSearchParam pageForm, boolean approval, + @Param("tableColumns") ExportTableColumns[] tableColumns, HttpServletResponse response) { + proposalCommonService.exportWorkflowList("feedbackEvaluation", pageForm, approval, tableColumns, response); + } + @At @SaCheckPermission("proposal.feedbackEvaluation") @ApiOperation("获取立案信息") diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalPreAuditController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalPreAuditController.java index e3e7fa16..a2381d9d 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalPreAuditController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalPreAuditController.java @@ -3,6 +3,7 @@ package com.budwk.app.zhgh.democratic.proposal.controller.transact; import cn.dev33.satoken.annotation.SaCheckPermission; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.BaseService; import com.budwk.app.flow.enums.ProcessTaskStateEnum; @@ -20,7 +21,9 @@ 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.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.util.List; @@ -113,4 +116,13 @@ public class ProposalPreAuditController { Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(),pageForm.getPageSize(), sql); return Result.success(pagination); } + + @At + @Ok("void") + @SaCheckPermission("proposal.preAudit") + @ApiOperation("导出列表") + public void exportList(@Valid @Param("pageForm") ProposalSearchParam pageForm, boolean approval, + @Param("tableColumns") ExportTableColumns[] tableColumns, HttpServletResponse response) { + proposalCommonService.exportWorkflowList("preAudit", pageForm, approval, tableColumns, response); + } } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSchoolLeaderApprovalController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSchoolLeaderApprovalController.java index 4c8625b4..7561186b 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSchoolLeaderApprovalController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSchoolLeaderApprovalController.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.base.result.Result; import com.budwk.app.base.vo.LabelValueVO; import com.budwk.app.flow.constant.FlowConst; @@ -38,6 +39,7 @@ import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import javax.validation.Valid; +import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.List; @@ -144,6 +146,15 @@ public class ProposalSchoolLeaderApprovalController { return Result.success(pagination); } + @At + @Ok("void") + @SaCheckPermission("proposal.schoolLeaderApproval") + @ApiOperation("导出列表") + public void exportList(@Valid @Param("pageForm") ProposalSearchParam pageForm, boolean approval, + @Param("tableColumns") ExportTableColumns[] tableColumns, HttpServletResponse response) { + proposalCommonService.exportWorkflowList("schoolLeaderApproval", pageForm, approval, tableColumns, response); + } + @At @SaCheckPermission("proposal.schoolLeaderApproval") @ApiOperation("获取主办单位") diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalUnderTakeReplyController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalUnderTakeReplyController.java index 53f9cb7c..47e4a5d8 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalUnderTakeReplyController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalUnderTakeReplyController.java @@ -5,6 +5,7 @@ import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ObjectUtil; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.base.result.Result; import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.enums.ProcessTaskStateEnum; @@ -37,6 +38,7 @@ import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import javax.validation.Valid; +import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.util.List; @@ -170,6 +172,15 @@ public class ProposalUnderTakeReplyController { return Result.success(pagination); } + @At + @Ok("void") + @SaCheckPermission("proposal.unitReply") + @ApiOperation("导出列表") + public void exportList(@Valid @Param("pageForm") ProposalSearchParam pageForm, boolean approval, + @Param("tableColumns") ExportTableColumns[] tableColumns, HttpServletResponse response) { + proposalCommonService.exportWorkflowList("unitReply", pageForm, approval, tableColumns, response); + } + /** * 承办单位答复节点撤回需要基于整组当前节点判断。 * 只有“当前流程正在办理的节点”和“这条列表记录所属节点”完全一致时,才允许撤回; diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonService.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonService.java index 7d6f645d..207a0ade 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonService.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonService.java @@ -2,8 +2,10 @@ package com.budwk.app.zhgh.democratic.proposal.service.common; import com.budwk.app.base.service.BaseService; import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; import com.budwk.app.zhgh.democratic.proposal.models.ProposalUndertake; +import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam; import org.nutz.dao.Cnd; import org.nutz.lang.util.NutMap; @@ -137,6 +139,18 @@ public interface ProposalCommonService extends BaseService { */ void exportYearReport(String sessionId, HttpServletResponse response); + /** + * 按办理页面当前筛选条件和可见列导出提案列表。 + * + * @param pageCode 页面代码,用于固定查询范围、数据权限和排序白名单 + * @param pageForm 页面筛选条件 + * @param approval 审核状态筛选条件 + * @param tableColumns 当前页面可见列 + * @param response HTTP 响应 + */ + void exportWorkflowList(String pageCode, ProposalSearchParam pageForm, boolean approval, + ExportTableColumns[] tableColumns, HttpServletResponse response); + /** * 合并提案 diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonServiceImpl.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonServiceImpl.java index f7fb81b2..f20a6067 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/service/common/ProposalCommonServiceImpl.java @@ -7,8 +7,13 @@ import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.exception.BaseException; +import com.budwk.app.base.param.ExportTableColumns; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.base.utils.CommonDownloadUtil; @@ -19,6 +24,7 @@ import com.budwk.app.flow.engine.FlowEngine; import com.budwk.app.flow.engine.util.FlowUtil; import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.entity.ProcessTask; +import com.budwk.app.flow.enums.ProcessInstanceStateEnum; import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.flow.vo.ProcessTaskVO; import com.budwk.app.sys.models.Sys_dict; @@ -28,11 +34,13 @@ import com.budwk.app.sys.models.Sys_user_role; import com.budwk.app.sys.services.SysDictService; import com.budwk.app.sys.services.SysRoleService; import com.budwk.app.sys.services.SysUserService; +import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.web.commons.base.Globals; import com.budwk.app.zhgh.democratic.proposal.constants.ProposalState; import com.budwk.app.zhgh.democratic.proposal.models.*; import com.budwk.app.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam; +import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam; import com.budwk.app.zhgh.democratic.proposal.service.ProposalWriteService; import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.Teacher_congress_delegate; import com.budwk.app.zhgh.democratic.teachercongress.delegate.service.TeacherCongressDelegateService; @@ -55,6 +63,7 @@ import org.nutz.json.Json; import org.nutz.lang.Lang; import org.nutz.lang.Strings; import org.nutz.lang.util.NutMap; +import org.apache.poi.ss.usermodel.Workbook; import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; @@ -73,6 +82,9 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp /** PC端提案列表页面的排序字段白名单,页面代码由对应Controller固定传入。 */ private static final Map> PROPOSAL_LIST_ORDER_COLUMNS = createProposalListOrderColumns(); + /** 办理页面允许导出的列表字段,避免请求参数携带非页面字段。 */ + private static final Map> WORKFLOW_EXPORT_COLUMNS = createWorkflowExportColumns(); + //找出富文本里面上传的图片 static String IMG_SRC_REGEX = "]*src\\s*=\\s*([\"'])(/platform/sys/file/download\\?id=.*?)\\1[^>]*>"; @@ -204,6 +216,219 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp return Collections.unmodifiableMap(columns); } + /** + * 按办理页面当前筛选条件和可见列导出列表,查询范围与页面分页列表保持一致。 + * + * @param pageCode 页面代码 + * @param pageForm 页面筛选条件 + * @param approval 审核状态 + * @param tableColumns 页面可见列 + * @param response HTTP 响应 + */ + @Override + public void exportWorkflowList(String pageCode, ProposalSearchParam pageForm, boolean approval, + ExportTableColumns[] tableColumns, HttpServletResponse response) { + List exportColumns = getWorkflowExportColumns(pageCode, tableColumns); + if (exportColumns.isEmpty()) { + throw Lang.makeThrow("请选择至少一个列表字段后再导出"); + } + + Sql sql = buildWorkflowExportSql(pageCode, pageForm, approval); + List rows = listMap(sql); + convertWorkflowExportValues(rows, pageCode); + + List excelColumns = new ArrayList<>(); + for (ExportTableColumns column : exportColumns) { + excelColumns.add(new ExcelExportEntity(column.getLabel(), column.getProp(), 20)); + } + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + exportParams.setTitle("提案列表"); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, excelColumns, rows); + CommonDownloadUtil.download("提案列表.xlsx", workbook, response); + } + + /** 根据页面代码构造导出查询,保证数据权限、筛选条件及排序规则与列表页一致。 */ + private Sql buildWorkflowExportSql(String pageCode, ProposalSearchParam pageForm, boolean approval) { + boolean isUnitReply = "unitReply".equals(pageCode); + boolean isSchoolLeaderApproval = "schoolLeaderApproval".equals(pageCode); + boolean requiresUnionFilter = Set.of("preAudit", "committeeFiling", "committeeFilingUnit", + "schoolLeaderApproval", "caseCheck").contains(pageCode); + String taskName = getWorkflowTaskName(pageCode); + + String schoolLeaderColumns = isSchoolLeaderApproval ? """ + GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 1 THEN pru.unitName END) AS masterUnitName, + GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 0 THEN pru.unitName END) AS slaveUnitNames, + """ : ""; + String auditUserColumn = (isSchoolLeaderApproval || isUnitReply) + ? "GROUP_CONCAT(DISTINCT ta.actorName, '(', ta.actorAccount, ')') AS auditUser," + : ""; + String unitReplyColumns = isUnitReply ? """ + COALESCE(NULLIF(t.variable->>'$.underTakeName', ''), replyUnit.unitName) AS underTakeName, + CASE + WHEN JSON_EXTRACT(t.variable, '$.underTakeIsMaster') IS NOT NULL + THEN IF(JSON_EXTRACT(t.variable, '$.underTakeIsMaster') = true, 1, 0) + ELSE IFNULL(replyUnit.isMaster, 0) + END AS underTakeIsMaster, + """ : ""; + String unionJoin = requiresUnionFilter ? "LEFT JOIN vw_user vu ON vu.id = info.createUserId" : ""; + String schoolLeaderJoin = isSchoolLeaderApproval ? "LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id" : ""; + String unitReplyJoin = isUnitReply + ? "LEFT JOIN proposal_reply_unit replyUnit ON replyUnit.proposalId = info.id AND replyUnit.unitId = ta.actorUnitId\n LEFT JOIN sys_user transferUser ON transferUser.id = t.variable->>'$.tf_transferUserId'" + : ""; + + Sql sql = Sqls.create(""" + SELECT + info.*, + type.name AS typeName, + IF(mer.proposalId IS NOT NULL, 1, 0) AS merge, + tcs.fullName AS sessionName, + tcd.`name` AS delegationName, + ins.state AS instanceState, + t.finishTime, + %s + %s + %s + IFNULL(GROUP_CONCAT(DISTINCT nt.displayName), '结束') AS curTaskName + 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 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 + LEFT JOIN teacher_congress_session tcs ON tcs.id = info.sessionId + LEFT JOIN teacher_congress_delegation tcd ON tcd.id = info.delegationId + %s + %s + %s + $condition + """.formatted(schoolLeaderColumns, auditUserColumn, unitReplyColumns, unionJoin, schoolLeaderJoin, unitReplyJoin)); + + Cnd cnd = Cnd.NEW(); + if (isUnitReply) { + cnd.and("t.taskName", "in", List.of("unit_reply", "two_unit_reply", "opinion_unit_reply")); + if (!"superadmin".equals(SecurityUtil.getUserLoginname())) { + cnd.and("ta.actorId", "=", SecurityUtil.getUserId()); + } + } else { + cnd.and("t.taskName", "=", taskName); + if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) { + cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); + } + } + if (approval) { + cnd.and("t.taskState", "in", isUnitReply + ? List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.TRANSFER.getCode()) + : List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); + } else { + cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); + } + if (requiresUnionFilter) { + cnd.andEX("vu.unionId", "=", pageForm.getUnionId()); + } + ProposalSearchParam.buildSearch(cnd, pageForm); + cnd.groupBy("t.id"); + if (!applySafeProposalListOrder(cnd, pageForm, pageCode)) { + cnd.desc("t.createdAt"); + } + sql.setCondition(cnd); + return sql; + } + + /** 获取页面对应的流程任务编码,页面代码不匹配时拒绝导出。 */ + private String getWorkflowTaskName(String pageCode) { + Map taskNames = Map.of( + "delegation", "delegation", + "preAudit", "preAudit", + "committeeFiling", "committee", + "committeeFilingUnit", "committeeFilingUnit", + "schoolLeaderApproval", "schoolLeader", + "feedbackEvaluation", "feedback", + "caseCheck", "caseCheck" + ); + String taskName = taskNames.get(pageCode); + if (StrUtil.isBlank(taskName) && !"unitReply".equals(pageCode)) { + throw Lang.makeThrow("不支持的提案列表导出页面"); + } + return taskName; + } + + /** 将字典、枚举及组合字段转换为与列表页面相同的显示文本。 */ + private void convertWorkflowExportValues(List rows, String pageCode) { + Map caseFilingResultMap = sysDictService.getSubListByCode("PROPOSAL_CASE_FILING_RESULT") + .stream().collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName)); + Map processStateMap = Arrays.stream(ProcessInstanceStateEnum.values()) + .collect(Collectors.toMap(ProcessInstanceStateEnum::getCode, ProcessInstanceStateEnum::getMessage)); + for (NutMap row : rows) { + if ("schoolLeaderApproval".equals(pageCode)) { + row.put("undertakeUnits", formatUndertakeUnits(row)); + } + // 所有含“是否并案”列的办理页面统一导出“是/否”,避免未并案记录出现空白。 + row.put("merge", row.getInt("merge") == 1 ? "是" : "否"); + if ("unitReply".equals(pageCode)) { + row.put("underTakeIsMaster", row.getInt("underTakeIsMaster") == 1 ? "主办" : "协办"); + } + row.put("caseFilingResult", caseFilingResultMap.getOrDefault(row.getString("caseFilingResult"), row.getString("caseFilingResult"))); + Integer instanceState = row.getInt("instanceState"); + row.put("instanceState", processStateMap.getOrDefault(instanceState, row.getString("instanceState"))); + } + } + + /** 校领导审批页按页面展示规则拼接承办单位。 */ + private String formatUndertakeUnits(NutMap row) { + String masterUnitNames = StrUtil.nullToEmpty(row.getString("masterUnitName")); + String slaveUnitNames = StrUtil.nullToEmpty(row.getString("slaveUnitNames")); + if ("SUGGESTION".equals(row.getString("caseFilingResult"))) { + return StrUtil.isNotBlank(masterUnitNames) ? masterUnitNames : slaveUnitNames; + } + if ("CONFIRM_FILING".equals(row.getString("caseFilingResult"))) { + List unitNames = new ArrayList<>(); + if (StrUtil.isNotBlank(masterUnitNames)) { + unitNames.add("主办:" + masterUnitNames); + } + if (StrUtil.isNotBlank(slaveUnitNames)) { + unitNames.add("协办:" + slaveUnitNames); + } + return StrUtil.join(";", unitNames); + } + return ""; + } + + /** 根据页面列定义过滤导出字段,确保导出范围只包含列表可展示字段。 */ + private List getWorkflowExportColumns(String pageCode, ExportTableColumns[] tableColumns) { + Set allowedColumns = WORKFLOW_EXPORT_COLUMNS.get(pageCode); + if (allowedColumns == null || tableColumns == null) { + return List.of(); + } + return Arrays.stream(tableColumns) + .filter(Objects::nonNull) + .filter(column -> StrUtil.isNotBlank(column.getLabel()) && allowedColumns.contains(column.getProp())) + .collect(Collectors.toList()); + } + + /** 初始化各办理页面可导出的列表字段白名单。 */ + private static Map> createWorkflowExportColumns() { + Set commonColumns = Set.of("code", "caseFilingCode", "name", "createUserName", "typeName", + "sessionName", "delegationName", "curTaskName", "instanceState"); + Map> columns = new HashMap<>(); + columns.put("delegation", commonColumns); + columns.put("preAudit", commonColumns); + columns.put("caseCheck", Set.of("code", "caseFilingCode", "name", "createUserName", "typeName", + "sessionName", "delegationName", "curTaskName", "instanceState", "finishTime")); + columns.put("committeeFiling", Set.of("code", "caseFilingCode", "name", "typeName", "sessionName", + "caseFilingResult", "delegationName", "curTaskName", "instanceState")); + columns.put("committeeFilingUnit", Set.of("code", "caseFilingCode", "name", "typeName", "sessionName", + "caseFilingResult", "delegationName", "curTaskName", "instanceState")); + columns.put("schoolLeaderApproval", Set.of("code", "caseFilingCode", "name", "typeName", "undertakeUnits", + "merge", "curTaskName", "auditUser", "instanceState")); + columns.put("unitReply", Set.of("code", "caseFilingCode", "name", "typeName", "caseFilingResult", + "merge", "underTakeName", "underTakeIsMaster", "curTaskName", "auditUser", "instanceState")); + columns.put("feedbackEvaluation", Set.of("code", "caseFilingCode", "name", "typeName", "merge", + "curTaskName", "instanceState")); + return Collections.unmodifiableMap(columns); + } + /** * 按白名单字段对统计结果执行后端排序,数字按数值比较,文本按中文区域规则比较。 * diff --git a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/caseCheck/index.html b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/caseCheck/index.html index 28faf0c1..69840198 100644 --- a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/caseCheck/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/caseCheck/index.html @@ -35,6 +35,7 @@ layout("/layouts/platform.html"){ + 导出 已审核 未审核 @@ -147,6 +148,7 @@ layout("/layouts/platform.html"){ return { tableColumns: [ {label: "提案编号", prop: "code"}, + {label: "立案编号", prop: "caseFilingCode"}, {label: "提案名称", prop: "name", width: "200px"}, {label: "提案人", prop: "createUserName", width: "80px"}, {label: "提案类别", prop: "typeName"}, @@ -172,6 +174,15 @@ layout("/layouts/platform.html"){ this.listUnion() }, methods: { + exportList() { + this.$downLoad(loc() + "/exportList", { + pageForm: JSON.stringify(this.pageForm), + approval: this.pageForm.approval, + tableColumns: JSON.stringify(this.tableColumns.filter(function (item) { + return item.visible !== false + })) + }) + }, openView(row) { this.$refs.guava.edit(() => { this.showApprovalForm = false diff --git a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/committeeFiling/index.html b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/committeeFiling/index.html index 62f6055e..272d0ca5 100644 --- a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/committeeFiling/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/committeeFiling/index.html @@ -59,6 +59,7 @@ layout("/layouts/platform.html"){ + 导出 并案审核 已审核 @@ -200,6 +201,7 @@ layout("/layouts/platform.html"){ return { tableColumns: [ { label: "提案编号", prop: "code" }, + { label: "立案编号", prop: "caseFilingCode" }, { label: "提案名称", prop: "name", width: "200px" }, { label: "提案类别", prop: "typeName" }, { label: "届次", prop: "sessionName" }, @@ -229,6 +231,15 @@ layout("/layouts/platform.html"){ } }, methods: { + exportList() { + this.$downLoad(loc() + "/exportList", { + pageForm: JSON.stringify(this.pageForm), + approval: this.pageForm.approval, + tableColumns: JSON.stringify(this.tableColumns.filter(function (item) { + return item.visible !== false + })) + }) + }, /** * “作为建议”不再区分主办/协办,只保留办理单位; * 切到“不予立案”等结果时,同时清空已选单位,避免旧值被误提交。 diff --git a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/committeeFilingUnit/index.html b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/committeeFilingUnit/index.html index 9dbd7349..fc101a00 100644 --- a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/committeeFilingUnit/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/committeeFilingUnit/index.html @@ -59,6 +59,7 @@ layout("/layouts/platform.html"){ + 导出 @@ -208,6 +209,7 @@ layout("/layouts/platform.html"){ return { tableColumns: [ {label: "提案编号", prop: "code"}, + {label: "立案编号", prop: "caseFilingCode"}, {label: "提案名称", prop: "name", width: "200px"}, {label: "提案类别", prop: "typeName"}, {label: "届次", prop: "sessionName"}, @@ -231,6 +233,15 @@ layout("/layouts/platform.html"){ } }, methods: { + exportList() { + this.$downLoad(loc() + "/exportList", { + pageForm: JSON.stringify(this.pageForm), + approval: this.pageForm.approval, + tableColumns: JSON.stringify(this.tableColumns.filter(function (item) { + return item.visible !== false + })) + }) + }, /** * “作为建议”场景下只保留办理单位,协办单位和立案类型都要及时清空, * 避免旧表单值跟着一起提交到流程里。 diff --git a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/delegation/index.html b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/delegation/index.html index 580fe080..04d3bd1d 100644 --- a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/delegation/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/delegation/index.html @@ -25,6 +25,7 @@ layout("/layouts/platform.html"){ + 导出 已审核 未审核 @@ -107,6 +108,7 @@ layout("/layouts/platform.html"){ return { tableColumns: [ {label: "提案编号", prop: "code"}, + {label: "立案编号", prop: "caseFilingCode"}, {label: "提案名称", prop: "name", width: "200px"}, {label: "提案人", prop: "createUserName", width: "80px"}, {label: "提案类别", prop: "typeName"}, @@ -122,6 +124,15 @@ layout("/layouts/platform.html"){ } }, methods: { + exportList() { + this.$downLoad(loc() + "/exportList", { + pageForm: JSON.stringify(this.pageForm), + approval: this.pageForm.approval, + tableColumns: JSON.stringify(this.tableColumns.filter(function (item) { + return item.visible !== false + })) + }) + }, openView(row) { this.$refs.guava.edit(() => { this.showApprovalForm = false diff --git a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/feedback/index.html b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/feedback/index.html index dbcbff21..f72b54e6 100644 --- a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/feedback/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/feedback/index.html @@ -25,7 +25,8 @@ layout("/layouts/platform.html"){ - + + 导出 已审核 未审核 @@ -119,6 +120,7 @@ layout("/layouts/platform.html"){ return { tableColumns: [ {label: "提案编号", prop: "code"}, + {label: "立案编号", prop: "caseFilingCode"}, {label: "提案名称", prop: "name", width: "200px"}, {label: "提案类别", prop: "typeName"}, {label: "是否并案", prop: "merge"}, @@ -135,6 +137,15 @@ layout("/layouts/platform.html"){ } }, methods: { + exportList() { + this.$downLoad(loc() + "/exportList", { + pageForm: JSON.stringify(this.pageForm), + approval: this.pageForm.approval, + tableColumns: JSON.stringify(this.tableColumns.filter(function (item) { + return item.visible !== false + })) + }) + }, openView(row) { this.$refs.guava.edit(() => { this.showApprovalForm = false diff --git a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/preAudit/index.html b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/preAudit/index.html index dddbadb6..11b1c3f6 100644 --- a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/preAudit/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/preAudit/index.html @@ -36,6 +36,7 @@ layout("/layouts/platform.html"){ + 导出 已审核 未审核 @@ -111,6 +112,7 @@ layout("/layouts/platform.html"){ return { tableColumns: [ {label: "提案编号", prop: "code"}, + {label: "立案编号", prop: "caseFilingCode"}, {label: "提案名称", prop: "name", width: "200px"}, {label: "提案人", prop: "createUserName", width: "80px"}, {label: "提案类别", prop: "typeName"}, @@ -134,6 +136,15 @@ layout("/layouts/platform.html"){ this.listUnion() }, methods: { + exportList() { + this.$downLoad(loc() + "/exportList", { + pageForm: JSON.stringify(this.pageForm), + approval: this.pageForm.approval, + tableColumns: JSON.stringify(this.tableColumns.filter(function (item) { + return item.visible !== false + })) + }) + }, openView(row) { this.$refs.guava.edit(() => { this.showApprovalForm = false diff --git a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/schoolLeaderApproval/index.html b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/schoolLeaderApproval/index.html index 195c9407..85cbd8e2 100644 --- a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/schoolLeaderApproval/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/schoolLeaderApproval/index.html @@ -58,7 +58,8 @@ layout("/layouts/platform.html"){ - + + 导出 已审核 未审核 @@ -145,6 +146,7 @@ layout("/layouts/platform.html"){ return { tableColumns: [ {label: "提案编号", prop: "code"}, + {label: "立案编号", prop: "caseFilingCode"}, {label: "提案名称", prop: "name", width: "200px"}, {label: "提案类别", prop: "typeName"}, {label: "办理单位", prop: "undertakeUnits", width: "260px"}, @@ -164,6 +166,15 @@ layout("/layouts/platform.html"){ } }, methods: { + exportList() { + this.$downLoad(loc() + "/exportList", { + pageForm: JSON.stringify(this.pageForm), + approval: this.pageForm.approval, + tableColumns: JSON.stringify(this.tableColumns.filter(function (item) { + return item.visible !== false + })) + }) + }, /** * 校领导审批列表需要按立案结果切换办理单位展示口径: * 确定立案显示主办/协办,作为建议只显示办理单位。 diff --git a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/unitReply/index.html b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/unitReply/index.html index 8f3a595f..ad3ffac3 100644 --- a/src/main/resources/views/platform/zhgh/democratic/proposal/transact/unitReply/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/proposal/transact/unitReply/index.html @@ -97,6 +97,7 @@ layout("/layouts/platform.html"){ + 导出 已审核 未审核 @@ -288,6 +289,7 @@ layout("/layouts/platform.html"){ return { tableColumns: [ {label: "提案编号", prop: "code"}, + {label: "立案编号", prop: "caseFilingCode"}, {label: "提案名称", prop: "name", width: "200px"}, {label: "提案类别", prop: "typeName"}, {label: "立案结果", prop: "caseFilingResult"}, @@ -319,6 +321,15 @@ layout("/layouts/platform.html"){ } }, methods: { + exportList() { + this.$downLoad(loc() + "/exportList", { + pageForm: JSON.stringify(this.pageForm), + approval: this.pageForm.approval, + tableColumns: JSON.stringify(this.tableColumns.filter(function (item) { + return item.visible !== false + })) + }) + }, openView(row) { this.$refs.guava.edit(() => { this.showApprovalForm = false