From 0ec3a356b56e973f540cc3704d3a1ae570e1dc4b Mon Sep 17 00:00:00 2001 From: = <=> Date: Wed, 15 Oct 2025 10:51:22 +0800 Subject: [PATCH] commit --- .../flow/controller/FlowDefineController.java | 1 + ...ndMemberBranchUnionApprovalController.java | 99 +++ .../FundMemberCommonController.java | 94 +++ .../controller/FundMemberMineController.java | 96 +++ .../controller/FundMemberQueryController.java | 83 +++ ...ndMemberSchoolUnionApprovalController.java | 97 +++ .../controller/FundMemberWriteController.java | 106 +++ .../dayofficework/fund/models/FundMember.java | 90 +++ .../fund/service/FundMemberService.java | 7 + .../service/impl/FundMemberServiceImpl.java | 14 + .../RetireSouvenirsBatchController.java | 216 ++++++ .../RetireSouvenirsLedgerController.java | 227 +++++++ .../model/RetireSouvenirsBatch.java | 43 ++ .../model/RetireSouvenirsLedger.java | 54 ++ .../model/RetireSouvenirsMsg.java | 58 ++ .../service/RetireSouvenirsBatchService.java | 14 + .../service/RetireSouvenirsLedgerService.java | 14 + .../impl/RetireSouvenirsBatchServiceImpl.java | 22 + .../RetireSouvenirsLedgerServiceImpl.java | 22 + .../template/RetireSouvenirsImportTemp.java | 33 + .../vo/RetireSouvenirsLedgerPageForm.java | 23 + ...tsCongressMeetingStatisticsController.java | 7 +- .../models/GrassrootsCongressMeetingInfo.java | 1 + .../ProposalDashboardController.java | 38 +- ...roposalQueryCollectProgressController.java | 49 +- .../ProposalCommissionerController.java | 107 +++ .../ProposalMasterUnitAssignmentHandler.java | 2 +- .../models/ProposalCommissionerOpinion.java | 57 ++ .../ProposalQueryComprehensiveParam.java | 3 + .../proposal/param/ProposalSearchParam.java | 14 +- .../common/ProposalCommonServiceImpl.java | 16 + ...acherCongressDelegateManageController.java | 49 +- ...rCongressDelegateTransitionController.java | 101 +++ .../models/Teacher_congress_delegate.java | 3 + ...cherCongressDelegateManageUpdateParam.java | 31 + .../components/plugins/snaker/snakerChart.vue | 5 +- .../components/plugins/sysUpload/index.vue | 30 +- .../views/layouts/v4/baseLayout.html | 4 +- .../views/platform/flow/define/preview.html | 642 +++++++++--------- .../fundMember/branchUnionApproval/index.html | 156 +++++ .../zhgh/dayofficework/fundMember/info.js | 100 +++ .../fundMember/mine}/index.html | 69 +- .../dayofficework/fundMember/query/index.html | 166 +++++ .../fundMember/schoolUnionApproval/index.html | 156 +++++ .../dayofficework/fundMember/write/index.html | 256 +++++++ .../retiresouvenirs/batch/basicForm.js | 78 +++ .../retiresouvenirs/batch/index.html | 163 +++++ .../retiresouvenirs/ledger/index.html | 383 +++++++++++ .../meeting/statistics/index.html | 7 + .../proposal/config/unit/index.html | 8 +- .../democratic/proposal/dashboard/index.html | 84 ++- .../proposal/query/collectProgress/index.html | 156 ++--- .../proposal/query/comprehensive/index.html | 153 ++--- .../proposal/query/history/index.html | 56 +- .../proposal/query/yearReport/index.html | 43 +- .../proposal/transact/apply/form.html | 309 --------- .../proposal/transact/commissioner/index.html | 219 ++++++ .../transact/committeeFiling/index.html | 40 +- .../proposal/transact/delegation/index.html | 6 +- .../proposal/transact/feedback/index.html | 57 +- .../transact/schoolLeaderApproval/index.html | 78 ++- .../transact/viceDelegation/index.html | 5 +- .../democratic/suggestionBox/mine/index.html | 2 +- .../delegate/manage/addForm.js | 108 ++- .../delegate/manage/editForm.js | 116 ++++ .../delegate/manage/index.html | 7 +- .../delegate/transition/index.html | 22 + .../teachercongress/prepare/file/index.html | 2 +- 68 files changed, 4486 insertions(+), 1091 deletions(-) create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberBranchUnionApprovalController.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberCommonController.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberMineController.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberQueryController.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberSchoolUnionApprovalController.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberWriteController.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/fund/models/FundMember.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/fund/service/FundMemberService.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/fund/service/impl/FundMemberServiceImpl.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/controller/RetireSouvenirsBatchController.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/controller/RetireSouvenirsLedgerController.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/model/RetireSouvenirsBatch.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/model/RetireSouvenirsLedger.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/model/RetireSouvenirsMsg.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/service/RetireSouvenirsBatchService.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/service/RetireSouvenirsLedgerService.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/service/impl/RetireSouvenirsBatchServiceImpl.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/service/impl/RetireSouvenirsLedgerServiceImpl.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/template/RetireSouvenirsImportTemp.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/vo/RetireSouvenirsLedgerPageForm.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommissionerController.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalCommissionerOpinion.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateTransitionController.java create mode 100644 src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/param/TeacherCongressDelegateManageUpdateParam.java create mode 100644 src/main/resources/views/platform/zhgh/dayofficework/fundMember/branchUnionApproval/index.html create mode 100644 src/main/resources/views/platform/zhgh/dayofficework/fundMember/info.js rename src/main/resources/views/platform/zhgh/{democratic/proposal/transact/apply => dayofficework/fundMember/mine}/index.html (57%) create mode 100644 src/main/resources/views/platform/zhgh/dayofficework/fundMember/query/index.html create mode 100644 src/main/resources/views/platform/zhgh/dayofficework/fundMember/schoolUnionApproval/index.html create mode 100644 src/main/resources/views/platform/zhgh/dayofficework/fundMember/write/index.html create mode 100644 src/main/resources/views/platform/zhgh/dayofficework/retiresouvenirs/batch/basicForm.js create mode 100644 src/main/resources/views/platform/zhgh/dayofficework/retiresouvenirs/batch/index.html create mode 100644 src/main/resources/views/platform/zhgh/dayofficework/retiresouvenirs/ledger/index.html delete mode 100644 src/main/resources/views/platform/zhgh/democratic/proposal/transact/apply/form.html create mode 100644 src/main/resources/views/platform/zhgh/democratic/proposal/transact/commissioner/index.html create mode 100644 src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/manage/editForm.js create mode 100644 src/main/resources/views/platform/zhgh/democratic/teachercongress/delegate/transition/index.html diff --git a/src/main/java/com/budwk/app/flow/controller/FlowDefineController.java b/src/main/java/com/budwk/app/flow/controller/FlowDefineController.java index d80e4cbe..efcc828e 100644 --- a/src/main/java/com/budwk/app/flow/controller/FlowDefineController.java +++ b/src/main/java/com/budwk/app/flow/controller/FlowDefineController.java @@ -58,6 +58,7 @@ public class FlowDefineController { ProcessDefine define = dao.fetch(ProcessDefine.class, Cnd.where(ProcessDefine::getName, "=", defineKey).desc(ProcessDefine::getVersion)); if (define != null) { request.setAttribute("defineId", define.getId()); + request.setAttribute("showImg", true); } } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberBranchUnionApprovalController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberBranchUnionApprovalController.java new file mode 100644 index 00000000..3682a836 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberBranchUnionApprovalController.java @@ -0,0 +1,99 @@ +package com.budwk.app.zhgh.dayofficework.fund.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.constant.RoleConstant; +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.utils.PageUtil; +import com.budwk.app.flow.enums.ProcessTaskStateEnum; +import com.budwk.app.web.commons.auth.utils.AuthUtil; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.dayofficework.fund.models.FundMember; +import com.budwk.app.zhgh.dayofficework.fund.service.FundMemberService; +import io.swagger.annotations.Api; +import org.nutz.dao.Cnd; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +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 java.util.List; + +@IocBean +@At("/platform/fundMember/branchUnionApproval") +@Ok("json:full") +@Api("基金会员-分工会审核") +public class FundMemberBranchUnionApprovalController { + + @Inject + private FundMemberService fundMemberService; + + @At("") + @Ok("beetl:/platform/zhgh/dayofficework/fundMember/branchUnionApproval/index.html") + @SaCheckPermission("fundMember.branchUnionApproval") + public void index() { + + } + + @At + @SaCheckPermission("fundMember.branchUnionApproval") + public Result pageData(PageForm pageForm, String taskId, String searchKeyword, Integer year, boolean approval) { + 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 fund_member 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", "=", "fgh"); + if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){ + 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("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); + } + + + if (StrUtil.isNotBlank(searchKeyword)) { + cnd.where().andLike("info.title", searchKeyword); + } + + cnd.groupBy("t.id"); + cnd.desc("t.createdAt"); + sql.setCondition(cnd); + Pagination pagination = fundMemberService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pagination); + } + + +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberCommonController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberCommonController.java new file mode 100644 index 00000000..604ec336 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberCommonController.java @@ -0,0 +1,94 @@ +package com.budwk.app.zhgh.dayofficework.fund.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import com.budwk.app.base.result.Result; +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.vo.ProcessTaskVO; +import com.budwk.app.zhgh.dayofficework.fund.models.FundMember; +import com.budwk.app.zhgh.dayofficework.fund.service.FundMemberService; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +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 javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.ByteArrayOutputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@IocBean +@At("/platform/fundMember/common") +@Ok("json:full") +@Api(tags = "基金会员-公共") +@Slf4j +public class FundMemberCommonController { + + @Inject + private Dao dao; + @Inject + private FundMemberService fundMemberService; + @Inject + private FlowEngine flowEngine; + @Inject + private SysOfficeTemplateUtil sysOfficeTemplateUtil; + + @At + @SaCheckPermission("fundMember") + public Result info(@Valid String id) { + FundMember fundMember = fundMemberService.fetch(id); + return Result.success(fundMember); + } + + @At + @SaCheckPermission("fundMember") + @Ok("void") + @ApiOperation("导出申请表") + public void exportDocx(@Valid String id, HttpServletResponse response) { + FundMember fundMember = dao.fetch(FundMember.class, id); + Map docData = BeanUtil.beanToMap(fundMember); + + docData.put("birthday", DateUtil.format(fundMember.getBirthday(), "yyyy年MM月dd日")); + docData.put("joinWorkTime", DateUtil.format(fundMember.getJoinWorkTime(), "yyyy年MM月dd日")); + docData.put("retireTime", DateUtil.format(fundMember.getRetireTime(), "yyyy年MM月dd日")); + + // 流程实例 + ProcessInstance processInstance = dao.fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", id)); + List doneTaskVos = new ArrayList<>(); + List doneTaskList = flowEngine.processTaskService().getDoneTaskList(processInstance.getId(), null); + for (ProcessTask doneTask : doneTaskList) { + ProcessTaskVO taskVO = flowEngine.processTaskService().findById(doneTask.getId()); + doneTaskVos.add(taskVO); + } + + // 按任务节点分组 + Map> taskGroups = doneTaskVos.stream().collect(Collectors.groupingBy(ProcessTaskVO::getDisplayName)); + docData.putAll(taskGroups); + + Configure configure = Configure.builder().build(); + + try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) { + XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("fundMember"), configure).render(docData).writeAndClose(byteArrayOutputStream); + CommonDownloadUtil.download(fundMember.getUserName() + "的医疗互助“爱心”基金入会申请表.docx", byteArrayOutputStream.toByteArray(), response); + } catch (Exception e) { + log.error("导出word异常", e); + } + } + + +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberMineController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberMineController.java new file mode 100644 index 00000000..6f2d580f --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberMineController.java @@ -0,0 +1,96 @@ +package com.budwk.app.zhgh.dayofficework.fund.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.annotation.SLog; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.result.Result; +import com.budwk.app.flow.engine.FlowEngine; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.dayofficework.fund.models.FundMember; +import com.budwk.app.zhgh.dayofficework.fund.service.FundMemberService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +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; + +@IocBean +@At("/platform/fundMember/mine") +@Ok("json:full") +@Api("基金会员-我的申请") +public class FundMemberMineController { + + @Inject + private Dao dao; + @Inject + private FlowEngine flowEngine; + @Inject + private FundMemberService fundMemberService; + + + @At("") + @Ok("beetl:/platform/zhgh/dayofficework/fundMember/mine/index.html") + @SaCheckPermission("fundMember.mine") + public void index() { + + } + + @At + @SaCheckPermission("fundMember.mine") + public Result pageData(Integer pageNumber, Integer pageSize, String searchKeyword, Integer year) { + 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, + 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 + fund_member info + 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 + LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("info.createdBy", "=", SecurityUtil.getUserId()); + sql.setCondition(cnd); + Pagination pagination = fundMemberService.listPageMap(pageNumber, pageSize, sql); + return Result.success(pagination); + } + + @At + @SaCheckPermission("fundMember.mine") + @Aop(TransAop.READ_COMMITTED) + @ApiOperation("删除") + @SLog(tag = "基金会员-我的申请", msg = "删除") + public Result delete(@Param("id") String id) { + dao.delete(FundMember.class, id); + flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id); + return Result.success(); + } + + +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberQueryController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberQueryController.java new file mode 100644 index 00000000..a718047e --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberQueryController.java @@ -0,0 +1,83 @@ +package com.budwk.app.zhgh.dayofficework.fund.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; +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.zhgh.dayofficework.fund.service.FundMemberService; +import io.swagger.annotations.Api; +import org.nutz.dao.Cnd; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.SqlExpressionGroup; +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 javax.servlet.http.HttpServletResponse; + +@IocBean +@At("/platform/fundMember/query") +@Ok("json:full") +@Api(tags = "基金会员-查询") +public class FundMemberQueryController { + + @Inject + private FundMemberService fundMemberService; + + @At("") + @Ok("beetl:/platform/zhgh/dayofficework/fundMember/query/index.html") + @SaCheckPermission("fundMember.query") + public void index() { + + } + + @At + @SaCheckPermission("fundMember.query") + public Result pageData(PageForm pageForm, Integer year) { + 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 + FROM + fund_member info + 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 + LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id + $condition + """); + Cnd cnd = Cnd.NEW(); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + SqlExpressionGroup seg = new SqlExpressionGroup(); + seg.orLike("info.userName", pageForm.getSearchKeyword()); + seg.orLike("info.loginName", pageForm.getSearchKeyword()); + cnd.and(seg); + } + cnd.andEX("YEAR(info.submitTime)", "=", year); + sql.setCondition(cnd); + Pagination pagination = fundMemberService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pagination); + } + + @At + @SaCheckPermission("fundMember.query") + @Ok("void") + public void exportExcel(Integer year, HttpServletResponse response) { + + } + +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberSchoolUnionApprovalController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberSchoolUnionApprovalController.java new file mode 100644 index 00000000..bd33d9d5 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberSchoolUnionApprovalController.java @@ -0,0 +1,97 @@ +package com.budwk.app.zhgh.dayofficework.fund.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.constant.RoleConstant; +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.flow.enums.ProcessTaskStateEnum; +import com.budwk.app.web.commons.auth.utils.AuthUtil; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.dayofficework.fund.service.FundMemberService; +import io.swagger.annotations.Api; +import org.nutz.dao.Cnd; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +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 java.util.List; + +@IocBean +@At("/platform/fundMember/schoolUnionApproval") +@Ok("json:full") +@Api("基金会员-校工会审核") +public class FundMemberSchoolUnionApprovalController { + + @Inject + private FundMemberService fundMemberService; + + @At("") + @Ok("beetl:/platform/zhgh/dayofficework/fundMember/schoolUnionApproval/index.html") + @SaCheckPermission("fundMember.schoolUnionApproval") + public void index() { + + } + + @At + @SaCheckPermission("fundMember.schoolUnionApproval") + public Result pageData(PageForm pageForm, String taskId, String searchKeyword, Integer year, boolean approval) { + 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 fund_member 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", "=", "xgh"); + if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){ + 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("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); + } + + + if (StrUtil.isNotBlank(searchKeyword)) { + cnd.where().andLike("info.title", searchKeyword); + } + + cnd.groupBy("t.id"); + cnd.desc("t.createdAt"); + sql.setCondition(cnd); + Pagination pagination = fundMemberService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pagination); + } + + +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberWriteController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberWriteController.java new file mode 100644 index 00000000..7d51cb05 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/controller/FundMemberWriteController.java @@ -0,0 +1,106 @@ +package com.budwk.app.zhgh.dayofficework.fund.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; +import cn.hutool.core.lang.Dict; +import com.budwk.app.base.annotation.SLog; +import com.budwk.app.base.result.Result; +import com.budwk.app.flow.constant.FlowConst; +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.ProcessSubmitTypeEnum; +import com.budwk.app.flow.service.FlowCommonService; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.dayofficework.fund.models.FundMember; +import com.budwk.app.zhgh.democratic.suggestionBox.models.SuggestionBox; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Dao; +import org.nutz.ioc.aop.Aop; +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 java.util.Date; +import java.util.List; + +@IocBean +@At("/platform/fundMember/write") +@Ok("json:full") +@Api(tags = "基金会员申请") +public class FundMemberWriteController { + + @Inject + private Dao dao; + @Inject + private FlowEngine flowEngine; + @Inject + private FlowCommonService flowCommonService; + + @At("") + @Ok("beetl:/platform/zhgh/dayofficework/fundMember/write/index.html") + @SaCheckPermission("fundMember.write") + public void index() { + + } + + @At + @SaCheckPermission("fundMember.write") + @ApiOperation("保存申请") + @SLog(tag = "建言献策-填写申请", msg = "保存申请") + public Result save(@Param("data") FundMember fundMember) { + dao.insertOrUpdate(fundMember); + return Result.success(); + } + + + @At + @SaCheckPermission("fundMember.write") + @ApiOperation("提交申请") + @Aop(TransAop.READ_COMMITTED) + @SLog(tag = "基金会员-填写申请", msg = "提交申请") + public Result submit(@Param("data") FundMember fundMember) { + fundMember.setSubmitTime(new Date()); + dao.insertOrUpdate(fundMember); + // 开启流程实例 + Dict args = Dict.create(); + args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode()); + args.set(FlowConst.FORM_DATA, fundMember); + ProcessInstance instance = flowEngine.startProcessInstanceByKey("FUND_MEMBER", fundMember.getId(), SecurityUtil.getUserId(), args); + + // 自动完成第一个申请任务 + List doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null); + for (ProcessTask task : doingTaskList) { + flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args); + } + return Result.success(); + } + + @At + @SaCheckPermission("fundMember.write") + @ApiOperation("重新提交申请") + @Aop(TransAop.READ_COMMITTED) + @SLog(tag = "基金会员-填写申请", msg = "重新提交申请") + public Result submitAgain(@Param("data") FundMember fundMember, @Param("taskId") Long taskId) { + dao.insertOrUpdate(fundMember); + + Dict dict = Dict.create(); + dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId); + dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode()); + flowCommonService.executeTask(dict); + return Result.success(); + } + + @At + @SaCheckPermission("fundMember.write") + @ApiOperation("获取申请信息") + public Result info(@Param("id") String id) { + FundMember box = dao.fetch(FundMember.class, id); + return Result.success(box); + } + +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/models/FundMember.java b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/models/FundMember.java new file mode 100644 index 00000000..ccb1515b --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/models/FundMember.java @@ -0,0 +1,90 @@ +package com.budwk.app.zhgh.dayofficework.fund.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +import java.util.Date; + +@Data +@Table("fund_member") +@EqualsAndHashCode(callSuper = true) +@TableMeta("{'mysql-charset':'utf8mb4'}") +@Comment("基金会员") +public class FundMember extends BaseModel { + + @Name + @Comment("ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + @PrevInsert(uu32 = true) + private String id; + + @Column + @Comment("姓名") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String userName; + + @Column + @Comment("工资号") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String loginName; + + @Column + @Comment("性别") + @ColDefine(type = ColType.VARCHAR, width = 10) + private String sex; + + @Column + @Comment("出生日期") + @ColDefine(type = ColType.DATE) + private Date birthday; + + @Column + @Comment("身份证号") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String idCard; + + @Column + @Comment("参加工作时间") + @ColDefine(type = ColType.DATE) + private Date joinWorkTime; + + @Column + @Comment("退休时间") + @ColDefine(type = ColType.DATE) + private Date retireTime; + + @Column + @Comment("家庭住址") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String address; + + @Column + @Comment("手机号码") + @ColDefine(type = ColType.VARCHAR, width = 20) + private String mobile; + + @Column + @Comment("住宅号码") + @ColDefine(type = ColType.VARCHAR, width = 20) + private String homePhone; + + @Column + @Comment("照片") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String avatar; + + @Column + @Comment("加入、退出") + @ColDefine(type = ColType.BOOLEAN) + @Default("1") + private Boolean isJoin; + + @Column + @Comment("提交时间") + @ColDefine(type = ColType.DATETIME) + private Date submitTime; + +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/service/FundMemberService.java b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/service/FundMemberService.java new file mode 100644 index 00000000..d365b853 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/service/FundMemberService.java @@ -0,0 +1,7 @@ +package com.budwk.app.zhgh.dayofficework.fund.service; + +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.dayofficework.fund.models.FundMember; + +public interface FundMemberService extends BaseService { +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/fund/service/impl/FundMemberServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/service/impl/FundMemberServiceImpl.java new file mode 100644 index 00000000..399a0a31 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/fund/service/impl/FundMemberServiceImpl.java @@ -0,0 +1,14 @@ +package com.budwk.app.zhgh.dayofficework.fund.service.impl; + +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.zhgh.dayofficework.fund.models.FundMember; +import com.budwk.app.zhgh.dayofficework.fund.service.FundMemberService; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; + +@IocBean(args = {"refer:dao"}) +public class FundMemberServiceImpl extends BaseServiceImpl implements FundMemberService { + public FundMemberServiceImpl(Dao dao) { + super(dao); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/controller/RetireSouvenirsBatchController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/controller/RetireSouvenirsBatchController.java new file mode 100644 index 00000000..9ce322cb --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/controller/RetireSouvenirsBatchController.java @@ -0,0 +1,216 @@ +package com.budwk.app.zhgh.dayofficework.retiresouvenirs.controller; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.budwk.app.base.annotation.SLog; +import com.budwk.app.base.model.ExcelImportRes; +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.utils.CommonDownloadUtil; +import com.budwk.app.base.utils.EasyExcelUtil; +import com.budwk.app.sys.views.View_user; +import com.budwk.app.zhgh.dayofficework.healthCheckup.template.HealthCheckupImportTemp; +import com.budwk.app.zhgh.dayofficework.retiresouvenirs.model.RetireSouvenirsBatch; +import com.budwk.app.zhgh.dayofficework.retiresouvenirs.model.RetireSouvenirsLedger; +import com.budwk.app.zhgh.dayofficework.retiresouvenirs.service.RetireSouvenirsBatchService; +import com.budwk.app.zhgh.dayofficework.retiresouvenirs.template.RetireSouvenirsImportTemp; +import io.swagger.annotations.ApiOperation; +import org.apache.poi.ss.formula.functions.T; +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.ioc.aop.Aop; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Strings; +import org.nutz.mvc.annotation.AdaptBy; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; +import org.nutz.mvc.upload.TempFile; +import org.nutz.mvc.upload.UploadAdaptor; + +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @ClassName RetireSouvenirsBatchController + * @Author JyuHsin + * @Date 2025/10/14 9:51 + * @Version 1.0 + * @Description TODO + */ +@IocBean +@Ok("json:full") +@ApiOperation("批次管理") +@At("/platform/retireSouvenirs/batch") +public class RetireSouvenirsBatchController { + + @Inject + private Dao dao; + @Inject + private RetireSouvenirsBatchService batchService; + + @At("") + @Ok("beetl:/platform/zhgh/dayofficework/retiresouvenirs/batch/index.html") + @SaCheckPermission("retireSouvenirs.batch") + public void index() { + } + + @At + @ApiOperation("分页查询") + @SaCheckPermission("retireSouvenirs.batch") + public Result pageData(PageForm pageForm, + @Param(value = "year") Integer year) { + Sql sql = Sqls.create(""" + select + b.*, + u.username as userName, + (select count(1) from retire_souvenirs_ledger where batchId = b.id) as count + from + retire_souvenirs_batch b + left join vw_user u on u.id = b .createdBy + $condition + """); + Cnd cnd = Cnd.NEW(); + + cnd.andEX("b.year", "=", year); + cnd.and(Cnd.likeEX("b.name", pageForm.getSearchKeyword())); + + sql.setCondition(cnd); + Pagination pagination = batchService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pagination); + } + + @At + @ApiOperation("新增/修改批次") + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("retireSouvenirs.batch") + @SLog(tag = "退休人员纪念品-批次管理", msg = "新增/修改批次") + public Result submit(RetireSouvenirsBatch batch) { + batchService.insertOrUpdate(batch); + return Result.success(); + } + + @At + @ApiOperation("删除批次") + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("retireSouvenirs.batch") + @SLog(tag = "退休人员纪念品-批次管理", msg = "删除批次") + public Result delete(String id) { + batchService.delete(id); + batchService.dao().clear(RetireSouvenirsLedger.class, Cnd.where(RetireSouvenirsLedger::getBatchId, "=", id)); + return Result.success(); + } + + @At + @ApiOperation("查询批次") + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("retireSouvenirs") + public Result selectList() { + List list = batchService.query(Cnd.NEW().desc(RetireSouvenirsBatch::getCreatedAt)); + return Result.success(list); + } + + @At + @Ok("void") + @ApiOperation("下载人员名单导入模版") + @SaCheckPermission("retireSouvenirs.batch") + public void downloadTem(HttpServletResponse response) { + List entities = new ArrayList<>(); + entities.add(new ExcelExportEntity("工号", "loginName", 20)); + entities.add(new ExcelExportEntity("姓名", "userName", 20)); + entities.add(new ExcelExportEntity("退休时间", "retireTime", 20)); + ExportParams exportParams = new ExportParams(); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entities, Collections.emptyList()); + CommonDownloadUtil.download("退休人员名单导入模版.xlsx", workbook, response); + } + + @At + @ApiOperation("退休人员名单导入") + @SLog(tag = "退休人员纪念品-批次管理", msg = "人员名单导入") + @SaCheckPermission("retireSouvenirs.batch") + @Aop(TransAop.READ_COMMITTED) + @AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"}) + public Result temImport(TempFile file, String batchId, String type) { + + if(StrUtil.isBlank(batchId)) { + return Result.error("批次信息为空"); + } + if("clear".equals(type)) { + dao.clear(RetireSouvenirsLedger.class, Cnd.where(RetireSouvenirsLedger::getBatchId, "=", batchId)); + } + + List ts = EasyExcelUtil.syncReadModel(file.getFile(), RetireSouvenirsImportTemp.class, 0, 1); + List importTemps = JSONUtil.parseArray(JSONUtil.toJsonStr(ts)).toList(RetireSouvenirsImportTemp.class); + + List loginNames = importTemps.stream().map(RetireSouvenirsImportTemp::getLoginName).filter(Strings::isNotBlank).toList(); + List userList = dao.query(View_user.class, Cnd.where(View_user::getLoginname, "in", loginNames)); + Map userMap = userList.stream().collect(Collectors.toMap(View_user::getLoginname, o -> o)); + + String[] patterns = { + "yyyy-MM-dd", + "yyyy/MM/dd", + "yyyy-MM", + "yyyy/MM", + "yyyyMM", + "yyyyMMdd", + "yyyy年MM月dd日", + "yyyy年M月d日" + }; + + List result = new ArrayList<>(); + for (int i = 0; i < importTemps.size(); i++) { + RetireSouvenirsImportTemp temp = importTemps.get(i); + + if (StrUtil.isBlank(temp.getLoginName())) { + temp.setErrInfo("工号为空", i + 1); + continue; + } + if (importTemps.stream().filter(s -> s.getLoginName().equals(temp.getLoginName())).count() > 1) { + temp.setErrInfo("重复数据", i + 1); + } + View_user user = userMap.get(temp.getLoginName()); + if (user == null) { + temp.setErrInfo("无此用户", i + 1); + continue; + } + + DateTime retireTime = DateUtil.parse(temp.getRetireTime(), patterns); + String format = DateUtil.format(retireTime, DatePattern.NORM_DATE_PATTERN); + + RetireSouvenirsLedger ledger = new RetireSouvenirsLedger(); + ledger.setBatchId(batchId); + ledger.setUserId(user.getId()); + ledger.setReceive(false); + ledger.setRetireTime(format); + result.add(ledger); + } + + dao.insert(result); + // 创建结果集 + ExcelImportRes excelImportRes = new ExcelImportRes<>(); + excelImportRes.setTotalRecords(importTemps.size()); + excelImportRes.setSuccessCount(Math.max(result.size() - excelImportRes.getFailedCount(), 0)); + // 添加错误记录 + excelImportRes.setErrorDetails(importTemps.stream().filter(s -> StrUtil.isNotBlank(s.getErrMsg())).toList()); + excelImportRes.setFailedCount(excelImportRes.getErrorDetails().size()); + + return Result.success(excelImportRes); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/controller/RetireSouvenirsLedgerController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/controller/RetireSouvenirsLedgerController.java new file mode 100644 index 00000000..b56112d2 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/controller/RetireSouvenirsLedgerController.java @@ -0,0 +1,227 @@ +package com.budwk.app.zhgh.dayofficework.retiresouvenirs.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.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.annotation.SLog; +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.utils.CommonDownloadUtil; +import com.budwk.app.base.utils.PageUtil; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.dayofficework.message.service.GlobalMessageSendService; +import com.budwk.app.zhgh.dayofficework.retiresouvenirs.model.RetireSouvenirsLedger; +import com.budwk.app.zhgh.dayofficework.retiresouvenirs.model.RetireSouvenirsMsg; +import com.budwk.app.zhgh.dayofficework.retiresouvenirs.service.RetireSouvenirsLedgerService; +import com.budwk.app.zhgh.dayofficework.retiresouvenirs.vo.RetireSouvenirsLedgerPageForm; +import io.swagger.annotations.ApiOperation; +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.entity.annotation.SQL; +import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.SqlExpressionGroup; +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.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; + +/** + * @ClassName RetireSouvenirsLedgerController + * @Author JyuHsin + * @Date 2025/10/14 9:52 + * @Version 1.0 + * @Description TODO + */ +@IocBean +@Ok("json:full") +@ApiOperation("人员台账") +@At("/platform/retireSouvenirs/ledger") +public class RetireSouvenirsLedgerController { + + @Inject + private Dao dao; + @Inject + private RetireSouvenirsLedgerService ledgerService; + @Inject + private GlobalMessageSendService sendService; + + @At("") + @Ok("beetl:/platform/zhgh/dayofficework/retiresouvenirs/ledger/index.html") + @SaCheckPermission("retireSouvenirs.ledger") + public void index() { + } + + @At + @ApiOperation("分页查询") + @SaCheckPermission("retireSouvenirs.ledger") + public Result pageData(RetireSouvenirsLedgerPageForm pageForm) { + Sql sql = this.generateSql(pageForm); + Pagination pagination = ledgerService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pagination); + } + + @At + @ApiOperation("删除人员") + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("retireSouvenirs.ledger") + @SLog(tag = "退休人员纪念品-人员台账", msg = "删除人员") + public Result delete(String id) { + ledgerService.delete(id); + return Result.success(); + } + + @At + @ApiOperation("设置领取状态") + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("retireSouvenirs.ledger") + @SLog(tag = "退休人员纪念品-人员台账", msg = "设置领取状态") + public Result receive(String id) { + RetireSouvenirsLedger ledger = ledgerService.fetch(id); + ledger.setReceive(!ledger.getReceive()); + ledgerService.update(ledger); + return Result.success(); + } + + @At + @ApiOperation("短信提醒") + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("retireSouvenirs.ledger") + @SLog(tag = "退休人员纪念品-人员台账", msg = "短信提醒") + public Result msg(@Param(value = "pageForm") RetireSouvenirsLedgerPageForm pageForm, + @Param(value = "message") String message) { + Sql sql = this.generateSql(pageForm); + List listMap = ledgerService.listMap(sql); + + List msgList = listMap.stream().map(o -> { + RetireSouvenirsMsg msg = new RetireSouvenirsMsg(); + msg.setBatchId(pageForm.getBatchId()); + msg.setUserId(o.getString("userId")); + msg.setSendUserId(SecurityUtil.getUserId()); + msg.setSendUserName(SecurityUtil.getUserUsername()); + msg.setMessage(message); + msg.setSendTime(DateUtil.now()); + return msg; + }).toList(); + List list = listMap.stream().map(o -> o.getString("loginName")).toList(); + + sendService.sendMessage("智慧工会", message, list); + dao.insert(msgList); + return Result.success(); + } + + @At + @ApiOperation("查询短信发送记录") + @SaCheckPermission("retireSouvenirs.ledger") + public Result selectMsgList(String batchId, String userId) { + Cnd cnd = Cnd.NEW(); + cnd.and(RetireSouvenirsMsg::getBatchId, "=", batchId); + cnd.and(RetireSouvenirsMsg::getUserId, "=", userId); + cnd.desc(RetireSouvenirsMsg::getSendTime); + List list = dao.query(RetireSouvenirsMsg.class, cnd); + return Result.success(list); + } + + @At + @ApiOperation("删除短信发送记录") + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("retireSouvenirs.ledger") + @SLog(tag = "退休人员纪念品-人员台账", msg = "删除短信发送记录") + public Result deleteMsg(String id) { + dao.delete(RetireSouvenirsMsg.class, id); + return Result.success(); + } + + @At + @Ok("void") + @SaCheckPermission("retireSouvenirs.ledger") + @ApiOperation("导出退休人员名单") + public void download(RetireSouvenirsLedgerPageForm pageForm, + HttpServletResponse response) { + Sql sql = this.generateSql(pageForm); + List listMap = ledgerService.listMap(sql); + + List exportEntities = new ArrayList<>(); + exportEntities.add(new ExcelExportEntity("姓名", "userName", 16)); + exportEntities.add(new ExcelExportEntity("工号", "loginName", 16)); + exportEntities.add(new ExcelExportEntity("性别", "sex", 10)); + exportEntities.add(new ExcelExportEntity("联系方式", "mobile", 20)); + exportEntities.add(new ExcelExportEntity("所属单位", "unitName", 30)); + exportEntities.add(new ExcelExportEntity("所属工会", "unionName", 30)); + exportEntities.add(new ExcelExportEntity("退休时间", "retireTimeFormat", 20)); + exportEntities.add(new ExcelExportEntity("是否领取", "receiveStatus", 10)); + exportEntities.add(new ExcelExportEntity("签字", "sign", 20)); + + try { + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, listMap); + CommonDownloadUtil.download("退休人员名单台账.xlsx", workbook, response); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private Sql generateSql(RetireSouvenirsLedgerPageForm pageForm) { + Sql sql = Sqls.create(""" + SELECT + l.*, + u.userName, + u.loginName, + u.sex, + u.mobile, + u.unitName, + u.unionName, + if(l.receive = true, '已领取', '未领取') as receiveStatus, + DATE_FORMAT(l.retireTime, '%Y-%m') as retireTimeFormat, + (select count(1) from retire_souvenirs_msg where batchId = l.batchId and userId = l.userId) as msgCount + FROM + retire_souvenirs_ledger l + LEFT JOIN vw_user u ON u.id = l.userId + $condition + """); + Cnd cnd = Cnd.NEW(); + + cnd.andEX("l.batchId", "=", pageForm.getBatchId()); + cnd.andEX("year(l.retireTime)", "=", pageForm.getYear()); + if("prev".equals(pageForm.getSelectTime())) { + String time = DateUtil.thisYear() + "-" + String.format("%02d", pageForm.getMonth()) + "-01"; + cnd.andEX("l.retireTime", "<", time); + } else { + cnd.andEX("month(l.retireTime)", "=", pageForm.getMonth()); + } + cnd.andEX("u.unitId", "=", pageForm.getUnitId()); + cnd.andEX("u.unionId", "=", pageForm.getUnionId()); + cnd.andEX("l.receive", "=", pageForm.getReceive()); + + if(StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + SqlExpressionGroup group = new SqlExpressionGroup(); + group.orLike("u.userName", pageForm.getSearchKeyword()); + group.orLike("u.loginName", pageForm.getSearchKeyword()); + cnd.and(group); + } + + if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { + cnd.asc("l.receive").asc("l.retireTime"); + } else { + cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + } + + sql.setCondition(cnd); + return sql; + } +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/model/RetireSouvenirsBatch.java b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/model/RetireSouvenirsBatch.java new file mode 100644 index 00000000..33e0c996 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/model/RetireSouvenirsBatch.java @@ -0,0 +1,43 @@ +package com.budwk.app.zhgh.dayofficework.retiresouvenirs.model; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +/** + * @ClassName RetireSouvenirsBatch + * @Author JyuHsin + * @Date 2025/10/14 9:52 + * @Version 1.0 + * @Description 退休人员纪念品批次管理 + */ +@Data +@Table +@Comment("退休人员纪念品-批次管理") +@EqualsAndHashCode(callSuper = true) +public class RetireSouvenirsBatch extends BaseModel { + + @Name + @Column + @Comment("ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + @PrevInsert(uu32 = true) + private String id; + + @Column + @Comment("年度") + @ColDefine(type = ColType.INT) + private Integer year; + + @Column + @Comment("批次名称") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String name; + + @Column + @Comment("备注") + @ColDefine(type = ColType.VARCHAR, width = 600) + private String remark; +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/model/RetireSouvenirsLedger.java b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/model/RetireSouvenirsLedger.java new file mode 100644 index 00000000..2a74d722 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/model/RetireSouvenirsLedger.java @@ -0,0 +1,54 @@ +package com.budwk.app.zhgh.dayofficework.retiresouvenirs.model; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +/** + * @ClassName RetireSouvenirsLedger + * @Author JyuHsin + * @Date 2025/10/14 9:52 + * @Version 1.0 + * @Description 退休人员纪念品人员台账管理 + */ +@Data +@Table +@Comment("退休人员纪念品-人员台账") +@EqualsAndHashCode(callSuper = true) +public class RetireSouvenirsLedger extends BaseModel { + + @Name + @Column + @Comment("ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + @PrevInsert(uu32 = true) + private String id; + + @Column + @Comment("批次id") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String batchId; + + @Column + @Comment("人员Id") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String userId; + + @Column + @Comment("退休时间") + @ColDefine(type = ColType.VARCHAR, width = 30) + private String retireTime; + + @Column + @Comment("是否领取") + @ColDefine(type = ColType.BOOLEAN) + @Default("0") + private Boolean receive; + + @Column + @Comment("领取时间") + @ColDefine(type = ColType.VARCHAR, width = 30) + private String receiveTime; +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/model/RetireSouvenirsMsg.java b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/model/RetireSouvenirsMsg.java new file mode 100644 index 00000000..633d11ff --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/model/RetireSouvenirsMsg.java @@ -0,0 +1,58 @@ +package com.budwk.app.zhgh.dayofficework.retiresouvenirs.model; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +/** + * @ClassName RetireSouvenirsMsg + * @Author JyuHsin + * @Date 2025/10/15 10:03 + * @Version 1.0 + * @Description TODO + */ +@Data +@Table +@Comment("退休人员纪念品-短信发送记录") +@EqualsAndHashCode(callSuper = true) +public class RetireSouvenirsMsg extends BaseModel { + + @Name + @Column + @Comment("ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + @PrevInsert(uu32 = true) + private String id; + + @Column + @Comment("批次id") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String batchId; + + @Column + @Comment("人员Id") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String userId; + + @Column + @Comment("发送人") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String sendUserId; + + @Column + @Comment("发送人姓名") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String sendUserName; + + @Column + @Comment("发送内容") + @ColDefine(type = ColType.VARCHAR, width = 600) + private String message; + + @Column + @Comment("发送时间") + @ColDefine(type = ColType.VARCHAR, width = 30) + private String sendTime; +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/service/RetireSouvenirsBatchService.java b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/service/RetireSouvenirsBatchService.java new file mode 100644 index 00000000..e9ed96a4 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/service/RetireSouvenirsBatchService.java @@ -0,0 +1,14 @@ +package com.budwk.app.zhgh.dayofficework.retiresouvenirs.service; + +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.dayofficework.retiresouvenirs.model.RetireSouvenirsBatch; + +/** + * @ClassName RetireSouvenirsBatchService + * @Author JyuHsin + * @Date 2025/10/14 14:22 + * @Version 1.0 + * @Description TODO + */ +public interface RetireSouvenirsBatchService extends BaseService { +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/service/RetireSouvenirsLedgerService.java b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/service/RetireSouvenirsLedgerService.java new file mode 100644 index 00000000..e83cdfe8 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/service/RetireSouvenirsLedgerService.java @@ -0,0 +1,14 @@ +package com.budwk.app.zhgh.dayofficework.retiresouvenirs.service; + +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.dayofficework.retiresouvenirs.model.RetireSouvenirsLedger; + +/** + * @ClassName RetireSouvenirsLedgerService + * @Author JyuHsin + * @Date 2025/10/14 14:22 + * @Version 1.0 + * @Description TODO + */ +public interface RetireSouvenirsLedgerService extends BaseService { +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/service/impl/RetireSouvenirsBatchServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/service/impl/RetireSouvenirsBatchServiceImpl.java new file mode 100644 index 00000000..9a4ecea3 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/service/impl/RetireSouvenirsBatchServiceImpl.java @@ -0,0 +1,22 @@ +package com.budwk.app.zhgh.dayofficework.retiresouvenirs.service.impl; + +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.zhgh.dayofficework.retiresouvenirs.model.RetireSouvenirsBatch; +import com.budwk.app.zhgh.dayofficework.retiresouvenirs.service.RetireSouvenirsBatchService; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; + +/** + * @ClassName RetireSouvenirsBatchServiceImpl + * @Author JyuHsin + * @Date 2025/10/14 14:22 + * @Version 1.0 + * @Description TODO + */ +@IocBean(args = {"refer:dao"}) +public class RetireSouvenirsBatchServiceImpl extends BaseServiceImpl implements RetireSouvenirsBatchService { + + public RetireSouvenirsBatchServiceImpl(Dao dao) { + super(dao); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/service/impl/RetireSouvenirsLedgerServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/service/impl/RetireSouvenirsLedgerServiceImpl.java new file mode 100644 index 00000000..85ab4bb7 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/service/impl/RetireSouvenirsLedgerServiceImpl.java @@ -0,0 +1,22 @@ +package com.budwk.app.zhgh.dayofficework.retiresouvenirs.service.impl; + +import com.budwk.app.base.service.impl.BaseServiceImpl; +import com.budwk.app.zhgh.dayofficework.retiresouvenirs.model.RetireSouvenirsLedger; +import com.budwk.app.zhgh.dayofficework.retiresouvenirs.service.RetireSouvenirsLedgerService; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; + +/** + * @ClassName RetireSouvenirsLedgerServiceImpl + * @Author JyuHsin + * @Date 2025/10/14 14:23 + * @Version 1.0 + * @Description TODO + */ +@IocBean(args = {"refer:dao"}) +public class RetireSouvenirsLedgerServiceImpl extends BaseServiceImpl implements RetireSouvenirsLedgerService { + + public RetireSouvenirsLedgerServiceImpl(Dao dao) { + super(dao); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/template/RetireSouvenirsImportTemp.java b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/template/RetireSouvenirsImportTemp.java new file mode 100644 index 00000000..1af8d967 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/template/RetireSouvenirsImportTemp.java @@ -0,0 +1,33 @@ +package com.budwk.app.zhgh.dayofficework.retiresouvenirs.template; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.budwk.app.base.model.ExcelImportError; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @ClassName RetireSouvenirsImportTemp + * @Author JyuHsin + * @Date 2025/10/14 15:21 + * @Version 1.0 + * @Description TODO + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ContentRowHeight(20) +@HeadRowHeight(20) +@ColumnWidth(25) +public class RetireSouvenirsImportTemp extends ExcelImportError { + + @ExcelProperty("工号" ) + private String loginName; + + @ExcelProperty("姓名") + private String userName; + + @ExcelProperty("退休时间") + private String retireTime; +} diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/vo/RetireSouvenirsLedgerPageForm.java b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/vo/RetireSouvenirsLedgerPageForm.java new file mode 100644 index 00000000..88ce264b --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/vo/RetireSouvenirsLedgerPageForm.java @@ -0,0 +1,23 @@ +package com.budwk.app.zhgh.dayofficework.retiresouvenirs.vo; + +import com.budwk.app.base.param.PageForm; +import lombok.Data; + +/** + * @ClassName RetireSouvenirsLedgerPageForm + * @Author JyuHsin + * @Date 2025/10/15 9:52 + * @Version 1.0 + * @Description TODO + */ +@Data +public class RetireSouvenirsLedgerPageForm extends PageForm { + + private String batchId; + private Integer year; + private Integer month; + private String unitId; + private String unionId; + private String selectTime; + private Boolean receive; +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/grassrootscongress/controller/meeting/GrassrootsCongressMeetingStatisticsController.java b/src/main/java/com/budwk/app/zhgh/democratic/grassrootscongress/controller/meeting/GrassrootsCongressMeetingStatisticsController.java index b7b34509..d52d61a8 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/grassrootscongress/controller/meeting/GrassrootsCongressMeetingStatisticsController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/grassrootscongress/controller/meeting/GrassrootsCongressMeetingStatisticsController.java @@ -2,12 +2,9 @@ package com.budwk.app.zhgh.democratic.grassrootscongress.controller.meeting; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.StrUtil; -import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; import com.budwk.app.flow.enums.ProcessInstanceStateEnum; -import com.budwk.app.web.commons.auth.utils.AuthUtil; -import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.democratic.grassrootscongress.param.GrassrootsCongressPageForm; import com.budwk.app.zhgh.democratic.grassrootscongress.service.GrassrootsCongressService; import io.swagger.annotations.Api; @@ -16,7 +13,6 @@ import lombok.extern.slf4j.Slf4j; import org.nutz.dao.Cnd; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; -import org.nutz.dao.util.cri.Static; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.util.NutMap; @@ -58,11 +54,12 @@ public class GrassrootsCongressMeetingStatisticsController { $condition """); Cnd cnd = Cnd.NEW(); - cnd.and("ins.state","=", ProcessInstanceStateEnum.FINISHED.getCode()); + cnd.and("ins.state", "=", ProcessInstanceStateEnum.FINISHED.getCode()); cnd.andEX("YEAR(info.createTime)", "=", pageForm.getYear()); if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { cnd.and(Cnd.likeEX("info.meetingName", pageForm.getSearchKeyword())); } + cnd.andEX("info.unionId", "=", pageForm.getUnionId()); cnd.desc("info.createTime"); sql.setCondition(cnd); Pagination pagination = grassrootsCongressService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/grassrootscongress/models/GrassrootsCongressMeetingInfo.java b/src/main/java/com/budwk/app/zhgh/democratic/grassrootscongress/models/GrassrootsCongressMeetingInfo.java index 2dc54ff9..e9912256 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/grassrootscongress/models/GrassrootsCongressMeetingInfo.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/grassrootscongress/models/GrassrootsCongressMeetingInfo.java @@ -63,6 +63,7 @@ public class GrassrootsCongressMeetingInfo extends BaseModel { @Comment("所属工会") @ColDefine(type = ColType.VARCHAR, width = 32) private String unionId; + @Column @Comment("所属工会") @ColDefine(type = ColType.VARCHAR, width = 32) diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java index 8a16d65c..a75e2f3c 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/dashboard/ProposalDashboardController.java @@ -8,6 +8,7 @@ import com.budwk.app.base.result.Result; import com.budwk.app.flow.engine.model.ProcessModel; import com.budwk.app.flow.engine.model.TaskModel; import com.budwk.app.flow.entity.ProcessDefine; +import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.flow.service.ProcessDefineService; import com.budwk.app.sys.models.Sys_dict; import com.budwk.app.sys.services.SysDictService; @@ -72,7 +73,10 @@ public class ProposalDashboardController { .addv("name", taskModel.getDisplayName()) .addv("id", taskModel.getName()) .addv("type", "task") - .addv("count", 0)).toList(); + .addv("count", 0) + .addv("todoCount", 0) + .addv("doneCount", 0) + ).toList(); nodes.addAll(taskNodes); // 立案结果 @@ -88,22 +92,24 @@ public class ProposalDashboardController { // 查询待办任务 Sql todoSql = Sqls.create(""" SELECT - t.taskName + t.taskName, + t.taskState FROM wf_process_task t INNER JOIN wf_process_instance ins ON ins.id = t.processInstanceId INNER JOIN proposal_info info ON info.id = ins.businessNo WHERE - t.taskState = 10 - AND info.sessionId = @sessionId + info.sessionId = @sessionId """); todoSql.setParam("sessionId", sessionId); List todoTasks = processDefineService.listMap(todoSql); for (NutMap node : nodes) { if (node.getString("type").equals("task")) { - long count = todoTasks.stream().filter(task -> task.getString("taskName").equals(node.getString("id"))).count(); - node.put("count", count); + long todoCount = todoTasks.stream().filter(task -> task.getInt("taskState") == ProcessTaskStateEnum.DOING.getCode() && task.getString("taskName").equals(node.getString("id"))).count(); + node.put("todoCount", todoCount); + long doneCount = todoTasks.stream().filter(task -> task.getInt("taskState") == ProcessTaskStateEnum.FINISHED.getCode() && task.getString("taskName").equals(node.getString("id"))).count(); + node.put("doneCount", doneCount); } else if (node.getString("type").equals("total")) { int count = dao.count(ProposalInfo.class, Cnd.where(ProposalInfo::getSessionId, "=", sessionId)); node.put("count", count); @@ -119,11 +125,10 @@ public class ProposalDashboardController { @At @SaCheckPermission("proposal.dashboard") - public Result pageData(PageForm pageForm, String sessionId, String selectNodeId, String selectNodeType) { + public Result pageData(PageForm pageForm, String sessionId, String selectNodeId, String selectNodeType, String selectNodeMode) { Sql sql = Sqls.create(""" SELECT info.*, - COUNT(p.consolidationIds) > 0 AS isConsolidation, type.name AS typeName, tcs.fullName AS sessionName, tcd.`name` AS delegationName, @@ -137,24 +142,33 @@ public class ProposalDashboardController { GROUP_CONCAT(DISTINCT CASE WHEN pru.isMaster = 0 THEN pru.unitName END) AS slaveUnitNames FROM proposal_info info - LEFT JOIN proposal_consolidation p ON JSON_CONTAINS(p.consolidationIds, JSON_QUOTE(info.id)) 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 teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id LEFT JOIN proposal_reply_unit pru ON pru.proposalId = info.id - LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 + LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = @taskState $condition """); Cnd cnd = Cnd.NEW(); cnd.and("info.sessionId", "=", sessionId); cnd.groupBy("info.id"); - if(StrUtil.isNotBlank(selectNodeType) && StrUtil.isNotBlank(selectNodeId)){ - switch (selectNodeType){ + // 默认显示进行中的任务 + sql.setParam("taskState", ProcessTaskStateEnum.DOING.getCode()); + + if (StrUtil.isNotBlank(selectNodeType) && StrUtil.isNotBlank(selectNodeId)) { + switch (selectNodeType) { case "task": cnd.and("t.taskName", "=", selectNodeId); + + if (selectNodeMode.equals("todo")) { + sql.setParam("taskState", ProcessTaskStateEnum.DOING.getCode()); + } else { + sql.setParam("taskState", ProcessTaskStateEnum.FINISHED.getCode()); + } + break; case "total": break; diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryCollectProgressController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryCollectProgressController.java index a1a048c6..f480cf84 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryCollectProgressController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/query/ProposalQueryCollectProgressController.java @@ -4,12 +4,15 @@ import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.ArrayUtil; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; -import com.budwk.app.base.service.BaseService; +import com.budwk.app.flow.entity.ProcessTask; +import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.zhgh.democratic.proposal.param.ProposalQueryComprehensiveParam; +import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; 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; @@ -36,12 +39,14 @@ public class ProposalQueryCollectProgressController { add(NutMap.NEW().addv("code", 10).addv("id", 10).addv("name", "撰写提案")); add(NutMap.NEW().addv("code", 20).addv("id", 20).addv("name", "附议提案")); add(NutMap.NEW().addv("code", 30).addv("id", 30).addv("name", "待团长审核")); - add(NutMap.NEW().addv("code", 40).addv("id", 40).addv("name", "团长审核退回")); - add(NutMap.NEW().addv("code", 50).addv("id", 50).addv("name", "团长审核通过")); + add(NutMap.NEW().addv("code", 40).addv("id", 40).addv("name", "团长已审核")); }}; @Inject - private BaseService baseService; + private ProposalCommonService proposalCommonService; + @Inject + private Dao dao; + @At("") @Ok("beetl:/platform/zhgh/democratic/proposal/query/collectProgress/index.html") @@ -61,43 +66,55 @@ public class ProposalQueryCollectProgressController { info.createUserName, type.NAME AS typeName, tcs.fullName AS sessionName, - tcd.`name` AS delegationName + tcd.`name` AS delegationName, + (SELECT count(1) FROM proposal_second WHERE proposalId = info.id) AS inviteCount, + (SELECT count(1) FROM wf_process_task WHERE processInstanceId = ins.id AND taskName = 'second' AND taskState = 20) finishCount, + ins.id AS instanceId, + ins.state instanceState, + t.displayName curTaskName FROM proposal_info info 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 teacher_congress_delegate tcde on tcde.loginName = info.createUserLoginName + 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 """); sql.setParam("sessionId", pageForm.getSessionId()); Cnd cnd = Cnd.NEW(); + ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm); SqlExpressionGroup seg = new SqlExpressionGroup(); if (ArrayUtil.contains(pageForm.getCollectIds(), 10)) { - seg.or("inst.processInstanceNodeCode", "=", 10); + seg.or("t.taskName", "=", "startTask"); } if (ArrayUtil.contains(pageForm.getCollectIds(), 20)) { - seg.or("inst.processInstanceNodeCode", "=", 20); + seg.or("t.taskName", "=", "second"); } if (ArrayUtil.contains(pageForm.getCollectIds(), 30)) { - seg.or("inst.processInstanceNodeCode", "=", 30); + seg.or("t.taskName", "=", "delegation"); } if (ArrayUtil.contains(pageForm.getCollectIds(), 40)) { - seg.or("inst.processInstanceNodeCode", "=", 40); - } - if (ArrayUtil.contains(pageForm.getCollectIds(), 50)) { - seg.or("inst.processInstanceNodeCode", ">", 50); + seg.or("t.taskName", "not in", List.of("startTask", "second", "delegation")); + seg.and("t.taskName", "is not", null); } if (!seg.isEmpty()) { cnd.and(seg); } - -// cnd.and("inst.processInstanceNodeCode", "in", List.of(10, 20, 30, 40, 50)); - ProposalQueryComprehensiveParam.buildSearch(cnd, pageForm); cnd.groupBy("info.id"); sql.setCondition(cnd); - Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + Pagination pagination = proposalCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + List list = (List) pagination.getList(); + for (NutMap row : list) { + int count = dao.count(ProcessTask.class, Cnd.where(ProcessTask::getProcessInstanceId, "=", row.getString("instanceId")) + .and(ProcessTask::getTaskName, "=", "second") + .and(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.FINISHED.getCode()) + ); + + + } return Result.success(pagination); } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommissionerController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommissionerController.java new file mode 100644 index 00000000..a0247047 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalCommissionerController.java @@ -0,0 +1,107 @@ +package com.budwk.app.zhgh.democratic.proposal.controller.transact; + + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.budwk.app.base.annotation.SLog; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.result.Result; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalCommissionerOpinion; +import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam; +import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; +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.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +import javax.validation.Valid; +import java.util.Date; + +@IocBean +@At("/platform/proposal/commissioner") +@Slf4j +@Ok("json:full") +@Api(tags = "提案委员会委员查询") +public class ProposalCommissionerController { + + @Inject + private Dao dao; + @Inject + private ProposalCommonService proposalCommonService; + + @At("") + @Ok("beetl:/platform/zhgh/democratic/proposal/transact/commissioner/index.html") + @SaCheckPermission("proposal.commissioner") + public void index() { + } + + @At + @SaCheckPermission("proposal.commissioner") + public Result pageData(@Valid ProposalSearchParam pageForm, 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.displayName taskName, + (SELECT count(1) FROM proposal_commissioner_opinion WHERE proposalId = info.id AND caseFilingResult = 'CONFIRM_FILING') CONFIRM_FILING_COUNT, + (SELECT count(1) FROM proposal_commissioner_opinion WHERE proposalId = info.id AND caseFilingResult = 'SUGGESTION') SUGGESTION_COUNT, + (SELECT count(1) FROM proposal_commissioner_opinion WHERE proposalId = info.id AND caseFilingResult = 'NOT') NOT_COUNT, + pco.id pcoId + FROM + proposal_info info + 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 + LEFT JOIN proposal_commissioner_opinion pco on pco.proposalId = info.id and pco.commissioner = @userId + $condition + """); + sql.setParam("userId", SecurityUtil.getUserId()); + + Cnd cnd = Cnd.NEW(); + ProposalSearchParam.buildSearch(cnd, pageForm); + cnd.and("pco.id", approval ? "is not" : "is", null); + cnd.groupBy("t.id"); + cnd.desc("t.createdAt"); + sql.setCondition(cnd); + Pagination pagination = proposalCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pagination); + } + + @At + @SaCheckPermission("proposal.commissioner") + @SLog(tag = "提案委员会委员意见", msg = "") + @Aop(TransAop.READ_COMMITTED) + public Result doApproval(String proposalId, String opinion, String caseFilingResult, String caseFilingType) { + dao.clear(ProposalCommissionerOpinion.class, Cnd.where(ProposalCommissionerOpinion::getProposalId, "=", proposalId).and(ProposalCommissionerOpinion::getCommissioner, "=", SecurityUtil.getUserId())); + + ProposalCommissionerOpinion commissionerOpinion = new ProposalCommissionerOpinion(); + commissionerOpinion.setProposalId(proposalId); + commissionerOpinion.setCommissioner(SecurityUtil.getUserId()); + commissionerOpinion.setOpinionText(opinion); + commissionerOpinion.setCaseFilingResult(caseFilingResult); + commissionerOpinion.setCaseFilingType(caseFilingType); + commissionerOpinion.setOpinionTime(new Date()); + dao.insert(commissionerOpinion); + + return Result.success(); + } + + +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalMasterUnitAssignmentHandler.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalMasterUnitAssignmentHandler.java index 7281b9ad..bce41a5e 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalMasterUnitAssignmentHandler.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/handler/ProposalMasterUnitAssignmentHandler.java @@ -28,7 +28,7 @@ public class ProposalMasterUnitAssignmentHandler implements AssignmentHandler { // 提案ID String proposalId = execution.getProcessInstance().getBusinessNo(); - + // 主办单位 ProposalReplyUnit masterUnit = dao.fetch(ProposalReplyUnit.class, Cnd.where(ProposalReplyUnit::getProposalId, "=", proposalId).and(ProposalReplyUnit::getIsMaster, "=", 1)); if (masterUnit == null) { diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalCommissionerOpinion.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalCommissionerOpinion.java new file mode 100644 index 00000000..741e9c43 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/models/ProposalCommissionerOpinion.java @@ -0,0 +1,57 @@ +package com.budwk.app.zhgh.democratic.proposal.models; + +import com.budwk.app.base.model.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.nutz.dao.entity.annotation.*; +import org.nutz.dao.interceptor.annotation.PrevInsert; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +@Table("proposal_commissioner_opinion") +@TableMeta("{'mysql-charset':'utf8mb4'}") +@Comment("提案委员意见") +@TableIndexes(value = { + @Index(name = "INDEX_PROPOSAL_COMMISSIONER_OPINION_PROPOSAL_ID", fields = {"proposalId"}, unique = false) +}) +public class ProposalCommissionerOpinion extends BaseModel { + + @Name + @Comment("ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + @PrevInsert(uu32 = true) + private String id; + + @Column + @Comment("提案ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String proposalId; + + @Column + @Comment("立案结果(字典表)") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String caseFilingResult; + + @Column + @Comment("立案类型(重点、普通提案)") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String caseFilingType; + + @Column + @Comment("委员意见") + @ColDefine(type = ColType.TEXT) + private String opinionText; + + @Column + @Comment("委员意见时间") + @ColDefine(type = ColType.DATETIME) + private Date opinionTime; + + @Column + @Comment("委员ID") + @ColDefine(type = ColType.VARCHAR, width = 32) + private String commissioner; + +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/param/ProposalQueryComprehensiveParam.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/param/ProposalQueryComprehensiveParam.java index 7fdf2342..25901f80 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/param/ProposalQueryComprehensiveParam.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/param/ProposalQueryComprehensiveParam.java @@ -50,6 +50,9 @@ public class ProposalQueryComprehensiveParam extends PageForm { @ApiModelProperty(name = "征集进度状态") private Integer[] collectIds; + @ApiModelProperty(name = "通用关键字") + private String commonKeyword; + /** * 构建通用查询参数 diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/param/ProposalSearchParam.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/param/ProposalSearchParam.java index acc8d40b..2cca39d7 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/param/ProposalSearchParam.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/param/ProposalSearchParam.java @@ -6,6 +6,7 @@ import com.budwk.app.base.utils.PageUtil; import lombok.Data; import lombok.EqualsAndHashCode; import org.nutz.dao.Cnd; +import org.nutz.dao.util.cri.SqlExpressionGroup; /** * 提案通用搜索 @@ -20,6 +21,7 @@ public class ProposalSearchParam extends PageForm { private String delegationId; private String createUserName; private String createUserLoginName; + private String createUserKeyword; private String caseFilingResult; /** @@ -46,11 +48,19 @@ public class ProposalSearchParam extends PageForm { if (StrUtil.isNotBlank(searchParam.getCreateUserLoginName())) { cnd.where().andLike("info.createUserLoginName", searchParam.getCreateUserLoginName()); } + + if (StrUtil.isNotBlank(searchParam.getCreateUserKeyword())) { + SqlExpressionGroup seg = new SqlExpressionGroup(); + seg.orLike("info.createUserName", searchParam.getCreateUserKeyword()); + seg.orLike("info.createUserLoginName", searchParam.getCreateUserKeyword()); + cnd.and(seg); + } + cnd.andEX("info.caseFilingResult", "=", searchParam.getCaseFilingResult()); - if(StrUtil.isAllNotBlank(searchParam.getPageOrderName(), searchParam.getPageOrderBy())){ + if (StrUtil.isAllNotBlank(searchParam.getPageOrderName(), searchParam.getPageOrderBy())) { cnd.orderBy(searchParam.getPageOrderName(), PageUtil.getOrder(searchParam.getPageOrderBy())); - }else{ + } else { cnd.asc("info.code"); } } 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 3de88df0..6761c507 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 @@ -125,6 +125,22 @@ public class ProposalCommonServiceImpl extends BaseServiceImpl imp info.put("merges", mergeInfos); } + // 提案委员会成员意见 + Sql commissionerSql = Sqls.create(""" + SELECT + pco.*, + u.username commissionerName, + u.loginname commissionerLoginName + FROM + proposal_commissioner_opinion pco + LEFT JOIN vw_user u ON u.id = pco.commissioner + WHERE + pco.proposalId = @proposalId + """); + commissionerSql.setParam("proposalId", id); + List commissionerOpinions = listMap(commissionerSql); + info.put("commissionerOpinions", commissionerOpinions); + return info; } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateManageController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateManageController.java index 010ac794..b846de9b 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateManageController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateManageController.java @@ -115,16 +115,57 @@ public class TeacherCongressDelegateManageController { delegate.setSessionId(param.getSessionId()); delegate.setRoleId(param.getRoleId()); } - dao.insert(delegates); - for (String userId : userIds) { - dao.insert("sys_user_role", Chain.make("userId", userId).add("roleId", param.getRoleId()).add("tcSessionId", param.getSessionId()).add("tcDelegationId", param.getDelegationId())); - } + // 删除掉旧的权限 + dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getUserId, "in", userIds) + .and(Sys_user_role::getTcSessionId, "=", param.getSessionId()) + .and(Sys_user_role::getRoleId, "=", param.getRoleId())); + + List userRoles = userIds.stream().map(userId -> { + Sys_user_role role = new Sys_user_role(); + role.setUserId(userId); + role.setTcSessionId(param.getSessionId()); + role.setTcDelegationId(param.getDelegationId()); + role.setRoleId(param.getRoleId()); + return role; + }).toList(); + dao.insert(userRoles); + sysUserService.clearCache(); return Result.success(); } + + @At + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("tc.delegate.manage") + @SLog(tag = "民主管理", msg = "教代会代表管理修改代表") + public Result update(@Valid TeacherCongressDelegateManageUpdateParam param) { + // 查询原来的记录 + Teacher_congress_delegate old = dao.fetch(Teacher_congress_delegate.class, param.getId()); + // 删除掉旧的权限 + dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getUserId, "=", old.getUserId()) + .and(Sys_user_role::getRoleId, "=", old.getRoleId()) + .and(Sys_user_role::getTcSessionId, "=", old.getSessionId()) + .and(Sys_user_role::getTcDelegationId, "=", old.getDelegationId())); + + old.setDelegationId(param.getDelegationId()); + dao.update(old, "delegationId"); + + // 新增权限 + Sys_user_role role = new Sys_user_role(); + role.setUserId(param.getUserId()); + role.setTcSessionId(param.getSessionId()); + role.setTcDelegationId(param.getDelegationId()); + role.setRoleId(param.getRoleId()); + dao.insert(role); + + sysUserService.clearCache(); + return Result.success(); + } + + @At @Aop(TransAop.READ_COMMITTED) @SaCheckPermission("tc.delegate.manage") diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateTransitionController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateTransitionController.java new file mode 100644 index 00000000..ac3b6fcf --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/controller/TeacherCongressDelegateTransitionController.java @@ -0,0 +1,101 @@ +package com.budwk.app.zhgh.democratic.teachercongress.delegate.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.result.Result; +import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.Teacher_congress_delegate; +import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation; +import com.budwk.app.zhgh.democratic.teachercongress.prepare.models.Teacher_congress_session; +import io.swagger.annotations.Api; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +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 java.util.HashMap; +import java.util.List; + +@IocBean +@At("/platform/zhgh/democratic/teacherCongress/delegate/transition") +@Api(tags = "教代会代表换届变动信息") +@Ok("json:full") +public class TeacherCongressDelegateTransitionController { + + @Inject + private Dao dao; + + @At("") + @Ok("beetl:/platform/zhgh/democratic/teachercongress/delegate/transition/index.html") + @SaCheckPermission("tc.delegate.transition") + public void index() { + } + + @At + @SaCheckPermission("tc.delegate.transition") + public Result pageData(String sessionId) { + // 当前届次 + Teacher_congress_session session = dao.fetch(Teacher_congress_session.class, sessionId); + // 上一届次 + Teacher_congress_session lastSession = dao.fetch(Teacher_congress_session.class, Cnd.where(Teacher_congress_session::getStartDate, "<", session.getStartDate()).desc(Teacher_congress_session::getStartDate)); + // 当前届次代表团 + List delegations = dao.query(Teacher_congress_delegation.class, Cnd.where(Teacher_congress_delegation::getSessionId, "=", sessionId).asc(Teacher_congress_delegation::getCode)); + + // 当前届次代表 + List delegates = dao.query(Teacher_congress_delegate.class, Cnd.where(Teacher_congress_delegate::getSessionId, "=", sessionId)); + dao.fetchLinks(delegates, "delegation"); + // 上一届次代表 + List lastDelegates = dao.query(Teacher_congress_delegate.class, Cnd.where(Teacher_congress_delegate::getSessionId, "=", lastSession.getId())); + dao.fetchLinks(lastDelegates, "delegation"); + + // 代表数据 + List delegateFull = delegates.stream().map(delegate -> { + NutMap delegateMap = NutMap.NEW(); + delegateMap.put("userId", delegate.getUserId()); + delegateMap.put("userName", delegate.getUserName()); + + // 本届次代表团信息 + delegateMap.put("delegationId", delegate.getDelegationId()); + delegateMap.put("delegationName", delegate.getDelegation().getName()); + delegateMap.put("delegationCode", delegate.getDelegation().getCode()); + + // 上一届次代表团信息 + lastDelegates.stream().filter(lastDelegate -> lastDelegate.getUserId().equals(delegate.getUserId())).findFirst().ifPresentOrElse(lastDelegate -> { + delegateMap.put("lastDelegationId", lastDelegate.getDelegationId()); + delegateMap.put("lastDelegationName", lastDelegate.getDelegation().getName()); + delegateMap.put("lastDelegationCode", lastDelegate.getDelegation().getCode()); + }, () -> { + delegateMap.put("lastDelegationId", ""); + delegateMap.put("lastDelegationName", ""); + delegateMap.put("lastDelegationCode", ""); + }); + + return delegateMap; + }).toList(); + + + List> list = delegations.stream().map(delegation -> { + HashMap map = new HashMap<>(); + map.put("name", delegation.getName()); + map.put("code", delegation.getCode()); + // 上一届次人数 + map.put("lastCount", delegateFull.stream().filter(delegate -> delegate.getString("lastDelegationCode").equals(delegation.getCode())).count()); + // 增补代表数 (上一届次不是代表 但是本届次是代表) + map.put("addCount", delegateFull.stream().filter(delegate -> StrUtil.isBlank(delegate.getString("lastDelegationCode")) && delegate.getString("delegationCode").equals(delegation.getCode()))); + // 转入代表数 (上一届次是代表 但是在别的代表团) + map.put("transferCount", delegateFull.stream().filter(delegate -> !delegate.getString("lastDelegationCode").equals(delegation.getCode()) && delegate.getString("delegationCode").equals(delegation.getCode()))); + // 转出代表数 (上一届次在本团 本届次转出去了) + map.put("transferOutCount", delegateFull.stream().filter(delegate -> delegate.getString("lastDelegationCode").equals(delegation.getCode()) && StrUtil.isNotBlank(delegate.getString("delegationCode")) && !delegate.getString("delegationCode").equals(delegation.getCode()))); + // 减少代表数 (上一届次是代表 本届次不是代表) + map.put("reduceCount", delegateFull.stream().filter(delegate -> delegate.getString("lastDelegationCode").equals(delegation.getCode()) && StrUtil.isBlank(delegate.getString("delegationCode")))); + // 当前代表数 + map.put("currentCount", delegateFull.stream().filter(delegate -> delegate.getString("delegationCode").equals(delegation.getCode())).count()); + return map; + }).toList(); + + return Result.success(list); + } + +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/Teacher_congress_delegate.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/Teacher_congress_delegate.java index 74e4a68b..e40c91b8 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/Teacher_congress_delegate.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/models/Teacher_congress_delegate.java @@ -2,6 +2,7 @@ package com.budwk.app.zhgh.democratic.teachercongress.delegate.models; import com.budwk.app.base.model.BaseModel; +import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation; import lombok.Data; import lombok.EqualsAndHashCode; import org.nutz.dao.entity.annotation.*; @@ -85,4 +86,6 @@ public class Teacher_congress_delegate extends BaseModel { @ColDefine(type = ColType.VARCHAR, width = 32) private String roleId; + @One(field = "delegationId") + private Teacher_congress_delegation delegation; } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/param/TeacherCongressDelegateManageUpdateParam.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/param/TeacherCongressDelegateManageUpdateParam.java new file mode 100644 index 00000000..1bc1564a --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/delegate/param/TeacherCongressDelegateManageUpdateParam.java @@ -0,0 +1,31 @@ +package com.budwk.app.zhgh.democratic.teachercongress.delegate.param; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 教代会代表更新对象 + */ +@Data +public class TeacherCongressDelegateManageUpdateParam { + + @NotBlank(message = "主键不能为空") + private String id; + + @NotBlank(message = "教代会届次不能为空") + private String sessionId; + + @NotBlank(message = "代表团不能为空") + private String delegationId; + + @NotBlank(message = "代表类型不能为空") + private String roleId; + + @NotEmpty(message = "用户不能为空") + private String userId; + + +} diff --git a/src/main/resources/static/components/plugins/snaker/snakerChart.vue b/src/main/resources/static/components/plugins/snaker/snakerChart.vue index f730721c..9c67e557 100644 --- a/src/main/resources/static/components/plugins/snaker/snakerChart.vue +++ b/src/main/resources/static/components/plugins/snaker/snakerChart.vue @@ -21,7 +21,7 @@ module.exports = {