diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushController.java index 53aea30..5740fbf 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushController.java @@ -1,7 +1,12 @@ package com.budwk.app.zhgh.democratic.teachercongress.delegate.controller; +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 cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @@ -11,6 +16,9 @@ import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.BaseService; +import com.budwk.app.base.utils.CommonDownloadUtil; +import com.budwk.app.base.utils.PageUtil; +import com.budwk.app.base.utils.SysOfficeTemplateUtil; import com.budwk.app.flow.constant.FlowConst; import com.budwk.app.flow.engine.FlowEngine; import com.budwk.app.flow.entity.ProcessInstance; @@ -18,14 +26,19 @@ import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.enums.ProcessInstanceStateEnum; import com.budwk.app.flow.enums.ProcessSubmitTypeEnum; import com.budwk.app.flow.enums.ProcessTaskStateEnum; +import com.budwk.app.flow.vo.ProcessTaskVO; import com.budwk.app.sys.views.View_user; import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.web.commons.base.Globals; import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.TeacherCongressDelegatePush; import com.budwk.app.zhgh.democratic.teachercongress.delegate.service.TeacherCongressDelegatePushService; import com.budwk.app.zhgh.democratic.teachercongress.prepare.models.Teacher_congress_quota_allocation; +import com.deepoove.poi.XWPFTemplate; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.Workbook; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; @@ -40,11 +53,17 @@ 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.io.ByteArrayOutputStream; +import java.io.IOException; +import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.Period; import java.time.ZoneId; import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** * @author zhf @@ -529,5 +548,128 @@ public class TeacherCongressDelegatePushController { return Result.success(hashMap); } + @Ok("void") + @At("/exportExcel") + @ApiOperation("导出各分工会审核已完成的代表汇总表") + @SaCheckPermission("tc.delegate.push") + public void exportExcel(PageForm pageForm, + @Param(value = "sessionId") String sessionId, + @Param(value = "unionId") String unionId, + @Param(value = "isFormalOrAttendance") String isFormalOrAttendance, HttpServletResponse response) { + + Sql sql; + if (AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())){ + sql = getSql(pageForm, sessionId, unionId, isFormalOrAttendance); + } else { + sql = getSql(pageForm, sessionId, SecurityUtil.getUnitId(), isFormalOrAttendance); + } + + List exportList = baseService.listMap(sql); + + exportList.forEach(item -> { + item.put("isJdh", item.getBoolean("isJdh") ? "是" : "否"); + item.put("isGdh", item.getBoolean("isGdh") ? "是" : "否"); + item.put("cadre", item.getBoolean("cadre") ? "是" : "否"); + item.put("worker", item.getBoolean("worker") ? "是" : "否"); + item.put("intermediateBelow", item.getBoolean("intermediateBelow") ? "是" : "否"); + item.put("seniorTeacher", item.getBoolean("seniorTeacher") ? "是" : "否"); + + }); + + List entityList = new ArrayList<>(); + entityList.add(new ExcelExportEntity("姓名", "userName", 20)); + entityList.add(new ExcelExportEntity("工号", "loginName", 20)); + entityList.add(new ExcelExportEntity("性别", "sex", 20)); + entityList.add(new ExcelExportEntity("联系电话", "mobile", 20)); + entityList.add(new ExcelExportEntity("分工会", "unionName", 20)); + entityList.add(new ExcelExportEntity("职务", "position", 20)); + entityList.add(new ExcelExportEntity("职称", "professionalTitle", 20)); + entityList.add(new ExcelExportEntity("文化程度", "education", 20)); + entityList.add(new ExcelExportEntity("政治面貌", "political", 20)); + entityList.add(new ExcelExportEntity("是否高级职称", "seniorTeacher", 20)); + entityList.add(new ExcelExportEntity("是否中级职称及以下", "intermediateBelow", 20)); + entityList.add(new ExcelExportEntity("是否干部", "cadre", 20)); + entityList.add(new ExcelExportEntity("是否工人", "worker", 20)); + entityList.add(new ExcelExportEntity("教代会代表", "isJdh", 20)); + entityList.add(new ExcelExportEntity("工代会代表", "isGdh", 20)); + entityList.add(new ExcelExportEntity("代表类型", "representativeType", 20)); + + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, exportList); + CommonDownloadUtil.download("推选代表汇总表.xlsx", workbook, response); + + } + + /** + * 公共sql + * + * @return + */ + private Sql getSql(PageForm pageForm, + String sessionId, + String unionId, + String isFormalOrAttendance) { + Sql sql = Sqls.create(""" + SELECT + info.*, + 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 teacher_congress_delegate_push info ON info.id = ins.businessNo + 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", "=", "900217e4-4332-4a21-90dd-363b8be17801"); +// cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); + if (!"全部".equals(isFormalOrAttendance)) { + cnd.and("info.representativeType", "=", isFormalOrAttendance); + } + cnd.andEX("info.sessionId", "=", sessionId); + cnd.andEX("info.unionId", "=", unionId); + cnd.and("ins.state", "=", 20); +// 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 group = new SqlExpressionGroup(); + group.orLike("info.userName", pageForm.getSearchKeyword()); + group.orLike("info.loginName", pageForm.getSearchKeyword()); + cnd.and(group); + } + + cnd.groupBy("t.id"); + if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { + cnd.desc("t.createdAt"); + } else { + cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + } + sql.setCondition(cnd); + return sql; + } + + } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushZgAuditController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushZgAuditController.java index 5e09f44..9bd7693 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushZgAuditController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegatePushZgAuditController.java @@ -5,6 +5,7 @@ import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @@ -16,8 +17,12 @@ import com.budwk.app.base.result.Result; import com.budwk.app.base.service.BaseService; import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.base.utils.PageUtil; +import com.budwk.app.base.utils.SysOfficeTemplateUtil; +import com.budwk.app.flow.engine.FlowEngine; +import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.flow.service.FlowCommonService; +import com.budwk.app.flow.vo.ProcessTaskVO; import com.budwk.app.sys.models.Sys_role; import com.budwk.app.sys.models.Sys_user_role; import com.budwk.app.sys.views.View_user; @@ -25,11 +30,14 @@ import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.TeacherCong import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.Teacher_congress_delegate; import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation_union; import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation_unit; +import com.deepoove.poi.XWPFTemplate; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.Workbook; 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; @@ -44,8 +52,12 @@ import org.nutz.mvc.annotation.Param; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; -import java.util.ArrayList; -import java.util.List; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** * @author zhf @@ -55,15 +67,25 @@ import java.util.List; @IocBean @At("/platform/teacherCongress/delegate/push/zcAudit") @Ok("json:full") +@Slf4j @Api(value = "/platform/teacherCongress/delegate/push/zcAudit", tags = "代表推选资格审查") public class TeacherCongressDelegatePushZgAuditController { + @Inject + private Dao dao; + @Inject private BaseService baseService; @Inject private FlowCommonService flowCommonService; + @Inject + private FlowEngine flowEngine; + + @Inject + private SysOfficeTemplateUtil sysOfficeTemplateUtil; + @At("") @Ok("beetl:/platform/zhgh/democratic/teachercongress/delegate/push/zcAudit.html") @SaCheckPermission("tc.delegate.push.zcAudit") @@ -113,8 +135,10 @@ public class TeacherCongressDelegatePushZgAuditController { entityList.add(new ExcelExportEntity("性别", "sex", 20)); entityList.add(new ExcelExportEntity("联系电话", "mobile", 20)); entityList.add(new ExcelExportEntity("分工会", "unionName", 20)); + entityList.add(new ExcelExportEntity("职务", "position", 20)); entityList.add(new ExcelExportEntity("职称", "professionalTitle", 20)); - entityList.add(new ExcelExportEntity("职级", "professionalLevel", 20)); + entityList.add(new ExcelExportEntity("文化程度", "education", 20)); + entityList.add(new ExcelExportEntity("政治面貌", "political", 20)); entityList.add(new ExcelExportEntity("是否高级职称", "seniorTeacher", 20)); entityList.add(new ExcelExportEntity("是否中级职称及以下", "intermediateBelow", 20)); entityList.add(new ExcelExportEntity("是否干部", "cadre", 20)); @@ -260,5 +284,101 @@ public class TeacherCongressDelegatePushZgAuditController { return Result.success(); } + @At + @Ok("void") + @SaCheckPermission("tc.delegate.push.zcAudit") + @SLog(tag = "代表推荐表", msg = "导出代表推荐表ZIP包") + public void doExportApplyZip( + PageForm pageForm, + @Param(value = "sessionId") String sessionId, + @Param(value = "unionId") String unionId, + @Param(value = "approval") Boolean approval, + @Param(value = "isFormalOrAttendance") String isFormalOrAttendance, + HttpServletResponse response) { + try { + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment;filename=" + + java.net.URLEncoder.encode("教代会代表推荐表.zip", "UTF-8")); + + ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream()); + Sql sql = getSql(pageForm, sessionId, unionId, approval, isFormalOrAttendance); + List dataList = baseService.listMap(sql); + + for (NutMap info : dataList) { + byte[] wordBytes = generateWordDocument(info); + + // 添加到ZIP文件 + String fileName = "代表推荐表_" + info.getString("userName") + ".docx"; + zipOut.putNextEntry(new ZipEntry(fileName)); + zipOut.write(wordBytes); + zipOut.closeEntry(); + } + + zipOut.finish(); + zipOut.close(); + } catch (Exception e) { + log.error("导出代表推荐表ZIP包失败, 错误信息:{}", e.getMessage(), e); + try { + response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "导出失败"); + } catch (IOException ioException) { + log.error("发送错误响应失败", ioException); + } + } + } + + /** + * 生成单个代表推荐表Word文档 + */ + private byte[] generateWordDocument(NutMap info) throws IOException { + HashMap docData = new HashMap<>(); + + // 格式化日期字段 + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMM"); + SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日"); + + if (info.get("birthday") != null && info.get("birthday") instanceof Date) { + info.put("birthday", sdf1.format((Date) info.get("birthday"))); + } + if (info.get("pushTime") != null && info.get("pushTime") instanceof Date) { + info.put("pushTime", sdf2.format((Date) info.get("pushTime"))); + } + + docData.put("schoolName", "河北地质大学"); + docData.put("info", info); + + // 处理审批信息 + Long instanceId = info.getLong("instanceId"); + if (instanceId != null) { + List doneTaskVos = new ArrayList<>(); + List doneTaskList = flowEngine.processTaskService().getDoneTaskList(instanceId, null); + for (ProcessTask doneTask : doneTaskList) { + ProcessTaskVO taskVO = flowEngine.processTaskService().findById(doneTask.getId()); + doneTaskVos.add(taskVO); + } + + doneTaskVos.stream().filter(task -> "代表资格审查".equals(task.getDisplayName())) + .max(Comparator.comparing(ProcessTaskVO::getCreatedAt)) + .ifPresent(v -> { + Dict taskFormData = v.getTaskFormData(); + HashMap approval = new HashMap<>(); + + approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日")); + approval.put("user", taskFormData.getStr("tf_userName")); + if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) { + // approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign"))); + } + approval.put("opinion", taskFormData.getStr("tf_opinion")); + docData.put("wyh", approval); + }); + } + + try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) { + XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("representative_election")) + .render(docData) + .writeAndClose(byteArrayOutputStream); + return byteArrayOutputStream.toByteArray(); + } + } + } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/TeacherCongressDelegatePush.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/TeacherCongressDelegatePush.java index 7343b00..adc9efd 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/TeacherCongressDelegatePush.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/TeacherCongressDelegatePush.java @@ -88,11 +88,26 @@ public class TeacherCongressDelegatePush extends BaseModel { @ColDefine(type = ColType.VARCHAR, width = 50) private String professionalTitle; + @Column + @Comment("职务") + @ColDefine(type = ColType.VARCHAR, width = 50) + private String position; + @Column @Comment("职级") @ColDefine(type = ColType.VARCHAR, width = 50) private String professionalLevel; + @Column + @Comment("主要工作简历") + @ColDefine(type = ColType.VARCHAR, width = 500) + private String resume; + + @Column + @Comment("现实表现") + @ColDefine(type = ColType.VARCHAR, width = 500) + private String performance; + @Column @Comment("是否专任教师") @ColDefine(type = ColType.BOOLEAN) diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/index.html b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/index.html index 00eacbf..6717d3d 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/index.html +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/index.html @@ -48,7 +48,7 @@ layout("/layouts/platform.html"){ 正式代表提交上报 - 导出 + 导出 @@ -69,8 +69,8 @@ layout("/layouts/platform.html"){ - - + + @@ -257,11 +277,13 @@ const write = { mobile: [{required: true, message: '必填', trigger: ['blur', 'change']}], position: [{required: false, message: '必填', trigger: ['blur', 'change']}], political: [{required: true, message: '必填', trigger: ['blur', 'change']}], - education: [{required: true, message: '必填', trigger: ['blur', 'change']}], + // education: [{required: true, message: '必填', trigger: ['blur', 'change']}], academicDegree: [{required: true, message: '必填', trigger: ['blur', 'change']}], jobTitle: [{required: false, message: '必填', trigger: ['blur', 'change']}], email: [{required: false, message: '必填', trigger: ['blur', 'change']}], - vita: [{required: true, message: '必填', trigger: ['blur', 'change']}] + vita: [{required: true, message: '必填', trigger: ['blur', 'change']}], + resume: [{required: true, message: '必填', trigger: ['blur', 'change']}], + performance: [{required: true, message: '必填', trigger: ['blur', 'change']}], }, sessionOptions: [], representativeTypeList: ['正式代表', '列席代表'], diff --git a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/zcAudit.html b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/zcAudit.html index 51d4fe8..a57e0bf 100644 --- a/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/zcAudit.html +++ b/src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/push/zcAudit.html @@ -23,6 +23,8 @@ layout("/layouts/platform.html"){ + 导出代表推荐表 + 导出汇总表 @@ -33,8 +35,6 @@ layout("/layouts/platform.html"){ 已审核 未审核 - 导出 - --> - - + +