diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/apply/MemberApplyMineController.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/apply/MemberApplyMineController.java index 4561c62..a69276e 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/apply/MemberApplyMineController.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/controller/apply/MemberApplyMineController.java @@ -27,6 +27,7 @@ import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; /** @@ -92,6 +93,7 @@ public class MemberApplyMineController { t.finishTime, t.taskParentId, t.variable taskVariable, + GROUP_CONCAT(DISTINCT ta.actorName, '(', ta.actorAccount, ')' ) AS auditUser, IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke, (select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask' AND taskState in (10,20)) AS startTaskId FROM @@ -115,7 +117,7 @@ public class MemberApplyMineController { } else { cnd.orderBy("info." + pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); } - cnd.groupBy("t.id"); + cnd.groupBy("info.id"); sql.setCondition(cnd); Pagination pagination = memberCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); return Result.success().addData(pagination); @@ -147,4 +149,16 @@ public class MemberApplyMineController { MemberApplyRecord record = dao.fetch(MemberApplyRecord.class, id); return Result.success().addData(record); } + + /** + * 导出入会申请 + * @param id + * @return + */ + @At + @Ok("void") + @SaCheckPermission(value = {"member.apply.mine", "member.apply.branchUnionApproval", "member.apply.branchUnionApproval"}, mode = SaMode.OR) + public void exportApplyDocx(String id, HttpServletResponse response) { + memberCommonService.exportApplyDocx(id, response); + } } diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberCommonService.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberCommonService.java index 4b2879d..324c70e 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberCommonService.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/MemberCommonService.java @@ -10,6 +10,7 @@ import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm import org.nutz.dao.sql.Sql; import org.nutz.lang.util.NutMap; +import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; @@ -115,4 +116,10 @@ public interface MemberCommonService extends BaseService { * @param type 类型: apply or change */ void validateApplyOrChangeIsDoing(String userId, String type); + + /** + * 导出入会申请 + * @param id + */ + void exportApplyDocx(String id, HttpServletResponse response); } diff --git a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberManageServiceImpl.java b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberManageServiceImpl.java index e93ca2f..fd79908 100644 --- a/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberManageServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/staffmanage/member/service/impl/MemberManageServiceImpl.java @@ -3,6 +3,7 @@ package com.budwk.app.zhgh.staffmanage.member.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HtmlUtil; @@ -10,9 +11,13 @@ 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; import com.budwk.app.flow.engine.FlowEngine; import com.budwk.app.flow.entity.ProcessInstance; +import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.enums.ProcessTaskStateEnum; +import com.budwk.app.flow.vo.ProcessTaskVO; import com.budwk.app.sys.models.*; import com.budwk.app.sys.services.SysDictService; import com.budwk.app.sys.services.SysRoleService; @@ -21,6 +26,8 @@ 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.zhgh.activity.basic.models.ActivityUserScope; +import com.budwk.app.zhgh.democratic.suggestion.models.SuggestionInfo; +import com.budwk.app.zhgh.staffbenefit.condolence.model.Condolence; import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeOrigin; import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeType; import com.budwk.app.zhgh.staffmanage.member.models.MemberApplyRecord; @@ -29,12 +36,10 @@ import com.budwk.app.zhgh.staffmanage.member.param.pageform.MemberManagePageForm import com.budwk.app.zhgh.staffmanage.member.service.MemberCommonService; import com.budwk.app.zhgh.staffmanage.specialstaff.model.SpecialStaff; import com.budwk.app.zhgh.welfare.model.WelfareList; +import com.deepoove.poi.XWPFTemplate; import lombok.extern.slf4j.Slf4j; import org.nutz.aop.interceptor.ioc.TransAop; -import org.nutz.dao.Chain; -import org.nutz.dao.Cnd; -import org.nutz.dao.Dao; -import org.nutz.dao.Sqls; +import org.nutz.dao.*; import org.nutz.dao.sql.Sql; import org.nutz.dao.util.Daos; import org.nutz.dao.util.cri.SqlExpressionGroup; @@ -46,9 +51,18 @@ import org.nutz.lang.Lang; import org.nutz.lang.random.R; import org.nutz.lang.util.NutMap; +import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** * @version 1.0 @@ -67,6 +81,12 @@ public class MemberManageServiceImpl extends BaseServiceImpl implement private SysRoleService sysRoleService; @Inject private SysUserService sysUserService; + @Inject + private Dao dao; + @Inject + private FlowEngine flowEngine; + @Inject + private SysOfficeTemplateUtil sysOfficeTemplateUtil; public MemberManageServiceImpl(Dao dao) { super(dao); @@ -129,7 +149,7 @@ public class MemberManageServiceImpl extends BaseServiceImpl implement $condition """); Cnd cnd = Cnd.NEW(); - MemberManagePageForm.buildSearch(cnd,pageForm); + MemberManagePageForm.buildSearch(cnd, pageForm); sql.setCondition(cnd); cnd.desc("his.changeTime"); cnd.groupBy("u.id"); @@ -170,7 +190,7 @@ public class MemberManageServiceImpl extends BaseServiceImpl implement cnd.andEX("his.unitId", "=", pageForm.getUnitId()); cnd.andEX("his.personType", "=", pageForm.getPersonType()); cnd.andEX("his.userState", "=", pageForm.getUserState()); - if (StrUtil.isNotBlank(pageForm.getChangeType())){ + if (StrUtil.isNotBlank(pageForm.getChangeType())) { cnd.and(new Static("JSON_CONTAINS(his.changeTypes, JSON_ARRAY('%s'), '$')".formatted(pageForm.getChangeType()))); } @@ -264,7 +284,7 @@ public class MemberManageServiceImpl extends BaseServiceImpl implement changeTypes.add(list.get(0).name()); } } - if (!ObjectUtil.equals(user.getMember() == 1, record.getMember())){ + if (!ObjectUtil.equals(user.getMember() == 1, record.getMember())) { if (record.getMember()) { changeTypes.add(MemberChangeType.RESTORE.name()); } else { @@ -408,7 +428,7 @@ public class MemberManageServiceImpl extends BaseServiceImpl implement } @Override - public List getAllChangeInfo(String userId) { + public List getAllChangeInfo(String userId) { List resultMapList = new ArrayList<>(); Sql sql = Sqls.fetchString(Sqls.create("select loginname from sys_user where id = @id").setParam("id", userId).toString()); @@ -514,8 +534,9 @@ public class MemberManageServiceImpl extends BaseServiceImpl implement /** * 验证申请或变更是否正在进行 - * @param userId 用户id - * @param type 类型: apply or change + * + * @param userId 用户id + * @param type 类型: apply or change */ @Override public void validateApplyOrChangeIsDoing(String userId, String type) { @@ -566,4 +587,127 @@ public class MemberManageServiceImpl extends BaseServiceImpl implement } return value.toString(); } + + @Override + public void exportApplyDocx(String id, HttpServletResponse response) { + MemberApplyRecord member = dao().fetch(MemberApplyRecord.class, Cnd.where("id", "=", id)); + if (member == null) { + throw new RuntimeException("会员申请记录不存在"); + } + + // 2. 获取流程实例信息 (确保流程已归档或存在) + Sql sql = Sqls.create(""" + SELECT + info.*, + ins.id AS instanceId + FROM + `member_apply_record` info + LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id + WHERE + info.id = @id + """).setParam("id", id); + sql.setCallback(Sqls.callback.map()); + dao.execute(sql); + NutMap info = (NutMap) sql.getResult(); + + HashMap docData = new HashMap<>(); + + docData.put("unitName", member.getUnitName()); + docData.put("applyDateTime", member.getApplyDateTime() != null ? DateUtil.format(member.getApplyDateTime(), "yyyy年MM月dd日") : ""); + + docData.put("username", member.getUsername()); + docData.put("sex", member.getSex()); + docData.put("birthday", StrUtil.isNotBlank(member.getBirthday()) ? DateUtil.parse(member.getBirthday()).toString("yyyy-MM-dd") : ""); + + docData.put("political", member.getPolitical()); + docData.put("nation", member.getNation()); + docData.put("education", member.getEducation()); + + docData.put("nativePlace", member.getNativePlace()); + docData.put("marriage", member.getMarriage()); + docData.put("specialty", member.getSpecialty()); + + docData.put("jobCategory", member.getJobCategory()); + docData.put("idCard", member.getIdCard()); + + docData.put("mobile", member.getMobile()); + docData.put("arrivalAtSchoolDate", StrUtil.isNotBlank(member.getArrivalAtSchoolDate()) ? DateUtil.parse(member.getArrivalAtSchoolDate()).toString("yyyy-MM-dd") : ""); + docData.put("homeAddress", member.getHomeAddress()); + + docData.put("personalData", member.getPersonalData()); + + // 处理家庭成员列表 (假设模板支持循环或需要拼接字符串,这里先拼接为字符串示例,若模板支持循环需调整模板引擎配置) +// if (member.getFamilies() != null && !member.getFamilies().isEmpty()) { +// StringBuilder familyStr = new StringBuilder(); +// for (int i = 0; i < member.getFamilies().size(); i++) { +// NutMap fam = (NutMap) member.getFamilies().get(i); +// familyStr.append((i + 1)).append(". ") +// .append("关系:").append(fam.getStr("relation")).append(", ") +// .append("姓名:").append(fam.getStr("name")).append(", ") +// .append("单位:").append(fam.getStr("unit")).append(", ") +// .append("备注:").append(fam.getStr("remark")).append("\n"); +// } +// docData.put("familiesStr", familyStr.toString()); +// } else { +// docData.put("familiesStr", "无"); +// } + + + List doneTaskVos = new ArrayList<>(); + Long instanceId = info.getLong("instanceId"); + if (instanceId != null) { + 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", v.getFinishTime() != null ? DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日") : ""); + approval.put("user", taskFormData != null ? taskFormData.getStr("tf_userName") : ""); + if (taskFormData != null && StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) { + approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign"))); + } + approval.put("opinion", taskFormData != null ? taskFormData.getStr("tf_opinion") : ""); + docData.put("branchUnionApproval", approval); + }); + + // 提取校工会审核意见 + 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", v.getFinishTime() != null ? DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日") : ""); + approval.put("user", taskFormData != null ? taskFormData.getStr("tf_userName") : ""); + if (taskFormData != null && StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) { + approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign"))); + } + approval.put("opinion", taskFormData != null ? taskFormData.getStr("tf_opinion") : ""); + docData.put("schoolUnionApproval", approval); + }); + + String fileName = "会员入会申请表_" + member.getUsername() + "_" + + (member.getApplyDateTime() != null ? DateUtil.format(member.getApplyDateTime(), "yyyyMMdd") : "") + + ".docx"; + + response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); + response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8)); + try { + XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("member_apply_form")) + .render(docData) + .write(response.getOutputStream()); + } catch (IOException e) { + log.error("导出会员入会申请表失败,ID: {}, 错误信息: {}", id, e.getMessage()); + throw new RuntimeException("导出文件失败", e); + } + } + } + diff --git a/src/main/resources/views/platform/zhgh/staffmanage/member/apply/mine/index.html b/src/main/resources/views/platform/zhgh/staffmanage/member/apply/mine/index.html index eaa84c5..43b5ffc 100644 --- a/src/main/resources/views/platform/zhgh/staffmanage/member/apply/mine/index.html +++ b/src/main/resources/views/platform/zhgh/staffmanage/member/apply/mine/index.html @@ -48,6 +48,10 @@ layout("/layouts/platform.html"){ 查看 + + 导出申请表 + 编辑 @@ -102,6 +106,9 @@ layout("/layouts/platform.html"){ 'common-query': COMMON_QUERY, }, methods: { + exportApplyDocx(id) { + this.$downLoad("/platform/member/apply/mine/exportApplyDocx", { id }) + }, onApply() { commonUtil.pjaxPush('/platform/member/apply/submit') }, diff --git a/src/main/resources/views/platform/zhgh/staffmanage/member/apply/submit/form.html b/src/main/resources/views/platform/zhgh/staffmanage/member/apply/submit/form.html index fc19081..d2db39c 100644 --- a/src/main/resources/views/platform/zhgh/staffmanage/member/apply/submit/form.html +++ b/src/main/resources/views/platform/zhgh/staffmanage/member/apply/submit/form.html @@ -174,12 +174,7 @@ v-model="formData.isVoluntary">
- 我自愿申请加入学校工会,并委托学校按规定代为扣缴工会会员会费。 - -
-
- - 我将严格遵守工会章程,认真执行工会决议,积极参与工会活动,主动融入“学校健康幸福家”建设,为营造温暖、和谐、奋进的校园氛围贡献力量,以实际行动助力学校各项事业发展。 + 我自愿加入中华全国总工会,遵守工会章程,执行工会决议,积极参加工会活动,为把我国建设成为富强、民主、文明的社会主义国家而努力奋斗。
diff --git a/src/main/resources/views/platform/zhgh/staffmanage/member/apply/submit/index.html b/src/main/resources/views/platform/zhgh/staffmanage/member/apply/submit/index.html index 4f6ab87..025ef00 100644 --- a/src/main/resources/views/platform/zhgh/staffmanage/member/apply/submit/index.html +++ b/src/main/resources/views/platform/zhgh/staffmanage/member/apply/submit/index.html @@ -215,16 +215,11 @@ layout("/layouts/platform.html"){ size="medium" style="width: 95%; color: #F56C6C; display: flex; align-items: center;" v-model="formData.isVoluntary"> +
- 我自愿申请加入学校工会,并委托学校按规定代为扣缴工会会员会费。 - -
-
- - 我将严格遵守工会章程,认真执行工会决议,积极参与工会活动,主动融入“学校健康幸福家”建设,为营造温暖、和谐、奋进的校园氛围贡献力量,以实际行动助力学校各项事业发展。 + 我自愿加入中华全国总工会,遵守工会章程,执行工会决议,积极参加工会活动,为把我国建设成为富强、民主、文明的社会主义国家而努力奋斗。
diff --git a/src/main/resources/views/platform/zhghh5/staffmanage/member/apply/branchunionapproval/index.html b/src/main/resources/views/platform/zhghh5/staffmanage/member/apply/branchunionapproval/index.html index fd211ae..c7eaac6 100644 --- a/src/main/resources/views/platform/zhghh5/staffmanage/member/apply/branchunionapproval/index.html +++ b/src/main/resources/views/platform/zhghh5/staffmanage/member/apply/branchunionapproval/index.html @@ -59,6 +59,11 @@ layout("/layouts/platform_h5.html"){ maxlength="100" show-word-limit > + + +
退回 diff --git a/src/main/resources/views/platform/zhghh5/staffmanage/member/apply/common/info.js b/src/main/resources/views/platform/zhghh5/staffmanage/member/apply/common/info.js index c73a926..9e63508 100644 --- a/src/main/resources/views/platform/zhghh5/staffmanage/member/apply/common/info.js +++ b/src/main/resources/views/platform/zhghh5/staffmanage/member/apply/common/info.js @@ -13,10 +13,12 @@ const INFO = { {{ viewData.education }} {{ viewData.academicDegree }} + {{ viewData.nativePlace }} {{ viewData.position }} {{ viewData.unitName }} {{ viewData.unionName }} + {{ viewData.jobCategory }} {{ viewData.idCard }} {{ viewData.mobile }} @@ -73,6 +75,12 @@ const INFO = { + + + +
diff --git a/src/main/resources/views/platform/zhghh5/staffmanage/member/apply/mine/index.html b/src/main/resources/views/platform/zhghh5/staffmanage/member/apply/mine/index.html index 3adfaf5..2cd8e7f 100644 --- a/src/main/resources/views/platform/zhghh5/staffmanage/member/apply/mine/index.html +++ b/src/main/resources/views/platform/zhghh5/staffmanage/member/apply/mine/index.html @@ -32,7 +32,7 @@ layout("/layouts/platform_h5.html"){ {{row.unionName}} {{row.unitName}} {{row.applyDateTime}} - {{row.taskName}} + {{row.taskName}}-{{row.auditUser}}