Merge remote-tracking branch 'origin/main'

This commit is contained in:
那些花儿
2025-09-23 16:18:56 +08:00
43 changed files with 3072 additions and 96 deletions
@@ -0,0 +1,108 @@
package com.budwk.app.zhgh.dayofficework.cadreTraining.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.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.dayofficework.cadreTraining.model.CadreTrainingAct;
import com.budwk.app.zhgh.dayofficework.cadreTraining.service.CadreTrainingActService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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.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 javax.validation.Valid;
/**
* @ClassName UnionReimburse
* @Author hongqiwei
* @Date 2025/9/19 14:45
* @Version 1.0
* @Description TODO
*/
@IocBean
@At("/platform/cadreTraining/activity")
@Api("培训活动")
@Ok("json:full")
@Slf4j
public class CadreTrainingActController {
@Inject
private Dao dao;
@Inject
private CadreTrainingActService cadreTrainingActService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/cadreTraining/activity/index.html")
@SaCheckPermission("cadreTraining.activity")
public void index() {
}
@At("/h5")
@Ok("beetl:/platform/zhghh5/dayofficework/cadreTraining/activity/index.html")
@SaCheckPermission("h5.cadreTraining.activity")
public void h5Index() {
}
@At
@SaCheckPermission("cadreTraining.activity")
@ApiOperation("活动列表")
public Result pageData(@Valid PageForm pageForm, Integer year) {
Cnd cnd = Cnd.NEW();
cnd.andEX("year(signUpStartTime)", "=", year);
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
cnd.where().andLike(CadreTrainingAct::getName, pageForm.getSearchKeyword());
}
Pagination pagination = cadreTrainingActService.listPage(pageForm.getPageNumber(), pageForm.getPageSize(), cnd);
return Result.success(pagination);
}
@At
@SaCheckPermission("cadreTraining.activity")
@ApiOperation("添加活动")
@SLog(tag = "干部培训添加活动", msg = "活动名称:${args[0].name}")
public Result insert(@Valid @Param("cadreTrainingAct") CadreTrainingAct cadreTrainingAct) {
cadreTrainingActService.insert(cadreTrainingAct);
return Result.success();
}
@At
@SaCheckPermission("cadreTraining.activity")
@ApiOperation("编辑活动")
@SLog(tag = "干部培训编辑活动", msg = "活动名称:${args[0].name}")
public Result update(@Valid @Param("cadreTrainingAct") CadreTrainingAct cadreTrainingAct) {
cadreTrainingActService.update(cadreTrainingAct);
return Result.success();
}
@At
@SaCheckPermission("cadreTraining.activity")
@ApiOperation("删除活动")
@SLog(tag = "干部培训删除活动", msg = "活动名称:${args[0]}")
@Aop(TransAop.READ_COMMITTED)
public Result delete(@Param("id") String id) {
cadreTrainingActService.delete(id);
dao.clear(CadreTrainingAct.class, Cnd.where(CadreTrainingAct::getId, "=", id));
return Result.success();
}
@At
@SaCheckPermission("cadreTraining.activity")
@ApiOperation("查询单个活动信息")
public Result get(@Param("id") String id) {
CadreTrainingAct cadreTrainingAct = cadreTrainingActService.fetch(id);
return Result.success().addData(cadreTrainingAct);
}
}
@@ -0,0 +1,211 @@
package com.budwk.app.zhgh.dayofficework.cadreTraining.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
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.flow.engine.FlowEngine;
import com.budwk.app.zhgh.dayofficework.cadreTraining.model.CadreTrainingAct;
import com.budwk.app.zhgh.dayofficework.cadreTraining.service.CadreTrainingSignUpService;
import com.budwk.app.zhgh.dayofficework.cadreTraining.service.CadreTrainingActService;
import com.budwk.app.zhgh.dayofficework.cadreTraining.vo.CadreTrainingCollectExcelVO;
import com.budwk.app.zhgh.staffbenefit.condolence.model.CondolenceType;
import com.budwk.app.zhgh.staffbenefit.maternityLeave.vo.MaternityLeaveCollectExcelVO;
import io.swagger.annotations.Api;
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.Record;
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;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.List;
/**
* @author : hongqiwei
* @description :
* @createDate : 2025/9/22 19:01
*/
@IocBean
@At("/platform/cadreTraining/collect")
@Ok("json:full")
@Api(tags = "查询统计")
public class CadreTrainingCollectController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private CadreTrainingSignUpService cadreTrainingSignUpService;
@Inject
private CadreTrainingActService cadreTrainingActService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/cadreTraining/collect/index.html")
@SaCheckPermission("cadreTraining.collect")
public void index() {
}
@At("/h5")
@Ok("beetl:/platform/zhghh5/dayofficework/cadreTraining/collect/index.html")
@SaCheckPermission("h5.cadreTraining.collect")
public void h5Index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission(value = {"cadreTraining.collect", "h5.cadreTraining.collect"}, mode = SaMode.OR)
public Result pageData(PageForm pageForm,
String activityId,
String unionId,
String unitId,
String userName,
String sex) {
Sql sql = Sqls.create("""
SELECT
info.*,
ct.name,
ct.signUpStartTime,
ct.signUpEndTime,
ct.startTime,
ct.endTime,
ct.notice,
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
cadre_training_signup info
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN `cadre_training` ct ON ct.id = info.cadreTrainingActId
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();
// 活动ID查询条件
cnd.and("info.cadreTrainingActId", "=", activityId);
// 工会、单位名称查询条件
cnd.andEX("info.unionId", "=", unionId);
cnd.andEX("info.unitId", "=", unitId);
// 性别查询条件
cnd.andEX("info.sex", "=", sex);
// 姓名查询条件
if (StrUtil.isNotBlank(userName)) {
cnd.and("info.userName", "like", "%" + userName + "%");
}
// 只查询流程实例状态为20的数据(已完成状态)
cnd.and("ins.state", "=", 20);
cnd.desc("info.applyTime");
sql.setCondition(cnd);
Pagination<NutMap> pagination = cadreTrainingSignUpService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@ApiOperation("获取活动列表")
@SaCheckPermission(value = {"cadreTraining.collect", "h5.cadreTraining.collect"}, mode = SaMode.OR)
public Result getActivityList(Integer year) {
Cnd cnd = Cnd.NEW();
// 添加年度筛选条件,基于报名开始时间
if (year != null) {
cnd.andEX("year(signUpStartTime)", "=", year);
}
// 按报名开始时间倒序排列(最新的活动在前)
cnd.desc("signUpStartTime");
List<CadreTrainingAct> list = cadreTrainingActService.query(cnd);
return Result.success(list);
}
@At
@ApiOperation("删除")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"cadreTraining.collect", "h5.cadreTraining.collect"}, mode = SaMode.OR)
@SLog(tag = "删除干部培训报名", msg = "删除干部培训报名")
public Result delete(@Param("id") String id) {
cadreTrainingSignUpService.delete(id);
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
return Result.success();
}
@At
@Ok("void")
@SaCheckPermission(value = {"cadreTraining.collect", "h5.cadreTraining.collect"}, mode = SaMode.OR)
@ApiOperation("导出培训活动报名人表")
public void onExport(@Param(value = "activityId") String activityId,
@Param(value = "unionId") String unionId,
@Param(value = "unitId") String unitId,
@Param(value = "userName") String userName,
@Param(value = "sex") String sex,
HttpServletResponse response) {
//查询审核通过的数据
Sql sql = Sqls.create("""
SELECT
info.*,
ct.name AS activityName,
ins.state instanceState
FROM
cadre_training_signup info
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN `cadre_training` ct ON ct.id = info.cadreTrainingActId
$condition
""");
Cnd cnd = Cnd.NEW();
if (StrUtil.isNotBlank(userName)) {
cnd.and("info.userName", "like", "%" + userName + "%");
}
// 活动ID查询条件
cnd.and("info.cadreTrainingActId", "=", activityId);
cnd.andEX("info.unionId", "=", unionId);
cnd.andEX("info.unitId", "=", unitId);
cnd.andEX("info.sex", "=", sex);
cnd.and("ins.state", "=", 20);
cnd.desc("info.applyTime");
sql.setCondition(cnd);
List<CadreTrainingCollectExcelVO> list = cadreTrainingSignUpService.listVO(sql, CadreTrainingCollectExcelVO.class);
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, CadreTrainingCollectExcelVO.class, list);
CommonDownloadUtil.download("培训报名表.xlsx", workbook, response);
}
}
@@ -0,0 +1,126 @@
package com.budwk.app.zhgh.dayofficework.cadreTraining.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
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.flow.engine.FlowEngine;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.cadreTraining.model.CadreTrainingAct;
import com.budwk.app.zhgh.dayofficework.cadreTraining.service.CadreTrainingActService;
import com.budwk.app.zhgh.dayofficework.cadreTraining.service.CadreTrainingSignUpService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
/**
* @author : hongqiwei
* @description :
* @createDate : 2025/9/22 15:46
*/
@IocBean
@At("/platform/cadreTraining/mine")
@Api("我的报名")
@Ok("json:full")
@Slf4j
public class CadreTrainingMineController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private CadreTrainingSignUpService cadreTrainingSignUpService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/cadreTraining/mine/index.html")
@SaCheckPermission("cadreTraining.mine")
public void index() {
}
@At("/h5")
@Ok("beetl:/platform/zhghh5/dayofficework/cadreTraining/mine/index.html")
@SaCheckPermission("h5.cadreTraining.mine")
public void h5Index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission(value = {"cadreTraining.mine", "h5.cadreTraining.mine"}, mode = SaMode.OR)
public Result pageData(@Valid PageForm pageForm, Integer year) {
Sql sql = Sqls.create("""
SELECT
info.*,
ct.name,
ct.signUpStartTime,
ct.signUpEndTime,
ct.startTime,
ct.endTime,
ct.notice,
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') AS startTaskId
FROM
cadre_training_signup info
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN `cadre_training` ct ON ct.id = info.cadreTrainingActId
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.andEX("year(info.applyTime)", "=", year);
// 名称搜索条件
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
cnd.where().andLike(CadreTrainingAct::getName, pageForm.getSearchKeyword());
}
cnd.desc("info.applyTime");
cnd.and("info.userId", "=", SecurityUtil.getUserId());
sql.setCondition(cnd);
Pagination<NutMap> pagination = cadreTrainingSignUpService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@ApiOperation("删除")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"cadreTraining.mine", "h5.cadreTraining.mine"}, mode = SaMode.OR)
@SLog( tag = "删除工会报销", msg = "删除工会报销")
public Result delete(@Param("id") String id) {
cadreTrainingSignUpService.delete(id);
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
return Result.success();
}
}
@@ -0,0 +1,139 @@
package com.budwk.app.zhgh.dayofficework.cadreTraining.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
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.base.utils.PageUtil;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.cadreTraining.service.CadreTrainingSignUpService;
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.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;
/**
* @author : hongqiwei
* @description :
* @createDate : 2025/9/22 15:47
*/
@IocBean
@At("/platform/cadreTraining/schoolAudit")
@Api("校工会审核")
@Ok("json:full")
@Slf4j
public class CadreTrainingSchoolAuditController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private CadreTrainingSignUpService cadreTrainingSignUpService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/cadreTraining/schoolAudit/index.html")
@SaCheckPermission("cadreTraining.schoolAudit")
public void index() {
}
@At("/h5")
@Ok("beetl:/platform/zhghh5/dayofficework/cadreTraining/schoolAudit/index.html")
@SaCheckPermission("h5.cadreTraining.schoolAudit")
public void h5Index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission(value = {"cadreTraining.schoolAudit", "h5.cadreTraining.schoolAudit"}, mode = SaMode.OR)
public Result pageData(PageForm pageForm,
boolean approval,
Integer year,
String activityId,
String unionId,
String unitId,
String userName,
String sex) {
Sql sql = Sqls.create("""
SELECT
info.*,
ct.name,
ct.signUpStartTime,
ct.signUpEndTime,
ct.startTime,
ct.endTime,
ct.notice,
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 cadre_training_signup info ON info.id = ins.businessNo
LEFT JOIN `cadre_training` ct ON ct.id = info.cadreTrainingActId
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", "=", "14347d9f-125f-4b8c-bd6e-97cce1e40e3f");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (approval) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
// 活动ID查询条件
cnd.andEX("info.cadreTrainingActId", "=", activityId);
// 工会、单位名称查询条件
cnd.andEX("info.unionId", "=", unionId);
cnd.andEX("info.unitId", "=", unitId);
// 性别查询条件
cnd.andEX("info.sex", "=", sex);
// 姓名查询条件
if (StrUtil.isNotBlank(userName)) {
cnd.and("info.userName", "like", "%" + userName + "%");
}
if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
cnd.groupBy("t.id");
cnd.desc("t.createdAt");
sql.setCondition(cnd);
Pagination<NutMap> pagination = cadreTrainingSignUpService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
}
@@ -0,0 +1,120 @@
package com.budwk.app.zhgh.dayofficework.cadreTraining.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Dict;
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.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.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.cadreTraining.model.CadreTrainingAct;
import com.budwk.app.zhgh.dayofficework.cadreTraining.model.CadreTrainingSignUp;
import com.budwk.app.zhgh.dayofficework.cadreTraining.service.CadreTrainingActService;
import com.budwk.app.zhgh.dayofficework.cadreTraining.service.CadreTrainingSignUpService;
import com.budwk.app.zhgh.dayofficework.rest.models.RestActSignUp;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.List;
@IocBean
@At("/platform/cadreTraining/branchUnionSignUp")
@Ok("json:full")
@Api(tags = "干部培训分工会活动报名")
public class CadreTrainingSignUpController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private CadreTrainingActService cadreTrainingActService;
@Inject
private CadreTrainingSignUpService cadreTrainingSignUpService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/cadreTraining/signUp/index.html")
@SaCheckPermission("cadreTraining.branchUnionSignUp")
public void index() {
}
@At
@SaCheckPermission("cadreTraining.branchUnionSignUp")
@ApiOperation("分页查询")
public Result pageData(@Valid PageForm pageForm,Integer year) {
Sql sql = Sqls.create("""
SELECT
info.*
FROM
cadre_training info
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("year(signUpStartTime)", "=", year);
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
cnd.where().andLike(CadreTrainingAct::getName, pageForm.getSearchKeyword());
}
sql.setCondition(cnd);
Pagination pagination = cadreTrainingActService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@ApiOperation("提交申请")
@SaCheckPermission(value = {"cadreTraining.branchUnionSignUp", "h5.cadreTraining.branchUnionSignUp"}, mode = SaMode.OR)
public Result submit(@Param("data") CadreTrainingSignUp cadreTrainingSignUp) {
if (StrUtil.isBlank(cadreTrainingSignUp.getId())) cadreTrainingSignUp.setApplyTime(DateUtil.now());
dao.insertOrUpdate(cadreTrainingSignUp);
// 开启流程实例
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, cadreTrainingSignUp);
ProcessInstance instance = flowEngine.startProcessInstanceByKey("GBPX", cadreTrainingSignUp.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
for (ProcessTask task : doingTaskList) {
flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args);
}
return Result.success();
}
@At
@SaCheckPermission("cadreTraining.branchUnionSignUp")
@ApiOperation("查询报名用户")
public Result listSignUser(@Param("activityId") String activityId) {
List<CadreTrainingSignUp> list = dao.query(CadreTrainingSignUp.class, Cnd.where(CadreTrainingSignUp::getCadreTrainingActId, "=", activityId).and(CadreTrainingSignUp::getUnionId, "=", SecurityUtil.getUnionId()));
return Result.success(list);
}
@At
@SaCheckPermission("cadreTraining.branchUnionSignUp")
@ApiOperation("查询本分工会名额")
public Result quota(@Param("activityId") String activityId) {
CadreTrainingAct cadreTrainingAct = dao.fetch(CadreTrainingAct.class, activityId);
Integer quota = cadreTrainingAct.getQuotas().stream().filter(v -> v.getStr("id", "").equals(SecurityUtil.getUnionId())).findFirst().map(v -> v.getInt("num")).orElse(0);
return Result.success(quota);
}
}
@@ -0,0 +1,72 @@
package com.budwk.app.zhgh.dayofficework.cadreTraining.model;
import cn.hutool.json.JSONObject;
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;
import java.util.List;
/**
* @ClassName UnionReimburse
* @Author hongqiwei
* @Date 2025/9/19 14:45
* @Version 1.0
* @Description TODO
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Table("cadre_training")
@TableMeta("{'mysql-charset':'utf8mb4'}")
@Comment("工会干部培训")
public class CadreTrainingAct extends BaseModel {
@Name
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
@Comment("id")
private String id;
@Column
@Comment("活动名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String name;
@Column
@Comment("报名开始时间")
@ColDefine(type = ColType.DATETIME)
private Date signUpStartTime;
@Column
@Comment("报名结束时间")
@ColDefine(type = ColType.DATETIME)
private Date signUpEndTime;
@Column
@Comment("活动开始时间")
@ColDefine(type = ColType.DATETIME)
private Date startTime;
@Column
@Comment("活动结束时间")
@ColDefine(type = ColType.DATETIME)
private Date endTime;
@Column
@Comment("通知内容")
@ColDefine(customType = "longtext")
private String notice;
@Column
@Comment("名额分配")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> quotas;
}
@@ -0,0 +1,91 @@
package com.budwk.app.zhgh.dayofficework.cadreTraining.model;
import cn.hutool.json.JSONObject;
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.List;
@Data
@EqualsAndHashCode(callSuper = true)
@Table("cadre_training_signup")
@TableMeta("{'mysql-charset':'utf8mb4'}")
@Comment("工会干部培训报名")
public class CadreTrainingSignUp extends BaseModel {
@Name
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
@Comment("id")
private String id;
@Column
@Comment("活动ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String cadreTrainingActId;
@Column
@Comment("用户ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String userId;
@Column
@Comment("姓名")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String userName;
@Column
@Comment("性别")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String sex;
@Column
@Comment("分工会ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unionId;
@Column
@Comment("分工会名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String unionName;
@Column
@Comment("工号")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String loginName;
@Column
@Comment("单位ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unitId;
@Column
@Comment("单位")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String unitName;
@Column
@Comment("年龄")
@ColDefine(type = ColType.INT)
private Integer age;
@Column
@Comment("手机号")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String mobile;
@Column
@Comment("报名时间")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String applyTime;
@Column
@Comment("备注")
@ColDefine(type = ColType.VARCHAR, width = 1000)
private String remark;
}
@@ -0,0 +1,23 @@
package com.budwk.app.zhgh.dayofficework.cadreTraining.param;
import com.budwk.app.base.param.PageForm;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ApiModel("疗休养综合查询查询参数")
@EqualsAndHashCode(callSuper = true)
@Data
public class CadreTrainingActPageForm extends PageForm {
@ApiModelProperty("活动ID")
private String actId;
@ApiModelProperty("分工会ID")
private String unionId;
@ApiModelProperty("单位ID")
private String unitId;
}
@@ -0,0 +1,7 @@
package com.budwk.app.zhgh.dayofficework.cadreTraining.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.dayofficework.cadreTraining.model.CadreTrainingAct;
public interface CadreTrainingActService extends BaseService<CadreTrainingAct> {
}
@@ -0,0 +1,8 @@
package com.budwk.app.zhgh.dayofficework.cadreTraining.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.dayofficework.cadreTraining.model.CadreTrainingSignUp;
public interface CadreTrainingSignUpService extends BaseService<CadreTrainingSignUp> {
}
@@ -0,0 +1,17 @@
package com.budwk.app.zhgh.dayofficework.cadreTraining.service.impl;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.dayofficework.cadreTraining.model.CadreTrainingAct;
import com.budwk.app.zhgh.dayofficework.cadreTraining.service.CadreTrainingActService;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.IocBean;
@Slf4j
@IocBean(args = {"refer:dao"})
public class CadreTrainingActServiceImpl extends BaseServiceImpl<CadreTrainingAct> implements CadreTrainingActService {
public CadreTrainingActServiceImpl(Dao dao) {
super(dao);
}
}
@@ -0,0 +1,15 @@
package com.budwk.app.zhgh.dayofficework.cadreTraining.service.impl;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.dayofficework.cadreTraining.model.CadreTrainingSignUp;
import com.budwk.app.zhgh.dayofficework.cadreTraining.service.CadreTrainingSignUpService;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.IocBean;
@IocBean(args = {"refer:dao"})
public class CadreTrainingSignUpServiceImpl extends BaseServiceImpl<CadreTrainingSignUp> implements CadreTrainingSignUpService {
public CadreTrainingSignUpServiceImpl(Dao dao) {
super(dao);
}
}
@@ -0,0 +1,40 @@
// MaternityLeaveCollectExcelVO.java
package com.budwk.app.zhgh.dayofficework.cadreTraining.vo;
import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;
import java.util.Date;
/**
* @author : hongqiwei
* @description :
* @createDate : 2025/9/16 17:08
*/
//工会干部培训,活动报名人导出
@Data
public class CadreTrainingCollectExcelVO {
@Excel(name = "报名时间", width = 20, format = "yyyy-MM-dd")
private Date applyTime;
@Excel(name = "姓名", width = 20)
private String userName;
@Excel(name = "性别", width = 20)
private String sex;
@Excel(name = "分工会", width = 20)
private String unionName;
@Excel(name = "单位", width = 20)
private String unitName;
@Excel(name = "活动名称", width = 20)
private String activityName;
@Excel(name = "电话", width = 20)
private String mobile;
}
@@ -11,6 +11,9 @@ import lombok.EqualsAndHashCode;
@Data
public class RestQueryPageForm extends PageForm {
@ApiModelProperty("年度")
private String year;
@ApiModelProperty("活动ID")
private String actId;
@@ -2,19 +2,32 @@ package com.budwk.app.zhgh.staffbenefit.maternityLeave.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
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.SysOfficeTemplateUtil;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.vo.ProcessTaskVO;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.commons.base.Globals;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.ActivityBudgetVO;
import com.budwk.app.zhgh.staffbenefit.maternityLeave.service.MaternityLeaveService;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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;
@@ -25,6 +38,15 @@ import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
import static cn.dev33.satoken.SaManager.config;
/**
* @author : hongqiwei
* @description :
@@ -38,10 +60,14 @@ import org.nutz.mvc.annotation.Param;
@Slf4j
public class MaternityLeaveMineController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private MaternityLeaveService maternityLeaveService;
@Inject
private SysOfficeTemplateUtil sysOfficeTemplateUtil;
@At("/index")
@@ -105,5 +131,124 @@ public class MaternityLeaveMineController {
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
return Result.success();
}
@At
@Ok("void")
@SaCheckPermission("maternityLeave.mine")
@SLog(tag = "生育休假审批表", msg = "导出生育休假审批表")
public void doExportApply(@Valid String id, HttpServletResponse response) {
HashMap<String, Object> docData = new HashMap<>();
Sql sql = Sqls.create("""
SELECT
info.*,
ins.id AS instanceId
FROM
`maternity_leave` info
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
WHERE
info.id = @id
""").setParam("id", id);
sql.setCallback(Sqls.callback.map());
dao.execute(sql);
NutMap info = (NutMap) sql.getResult();
// 根据性别选择不同的模板和文件名
String sex = info.getString("sex");
String templateName;
String fileName;
if ("女性".equals(sex) || "".equals(sex)) {
templateName = "maternity_leave_woman";
fileName = "女职工生育休假审批表_" + info.getString("userName") + ".docx";
} else {
templateName = "maternity_leave_man";
fileName = "男职工陪护假育儿假审批表_" + info.getString("userName") + ".docx";
}
// 添加日期格式化处理
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 格式化日期字段
if (info.get("birthday") != null) {
if (info.get("birthday") instanceof Date) {
info.put("birthday", sdf.format((Date) info.get("birthday")));
}
}
if (info.get("loverBirthday") != null) {
if (info.get("loverBirthday") instanceof Date) {
info.put("loverBirthday", sdf.format((Date) info.get("loverBirthday")));
}
}
if (info.get("childrenBirthday") != null) {
if (info.get("childrenBirthday") instanceof Date) {
info.put("childrenBirthday", sdf.format((Date) info.get("childrenBirthday")));
}
}
if (info.get("startTime") != null) {
if (info.get("startTime") instanceof Date) {
info.put("startTime", sdf.format((Date) info.get("startTime")));
}
}
if (info.get("endTime") != null) {
if (info.get("endTime") instanceof Date) {
info.put("endTime", sdf.format((Date) info.get("endTime")));
}
}
docData.put("schoolName", Globals.AppName);
docData.put("info", info);
List<ProcessTaskVO> doneTaskVos = new ArrayList<>();
List<ProcessTask> doneTaskList = flowEngine.processTaskService().getDoneTaskList(info.getLong("instanceId"), null);
for (ProcessTask doneTask : doneTaskList) {
ProcessTaskVO taskVO = flowEngine.processTaskService().findById(doneTask.getId());
doneTaskVos.add(taskVO);
}
// 各审批节点处理
doneTaskVos.stream().filter(task -> "分工会审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("fgh", approval);
});
doneTaskVos.stream().filter(task -> "校工会审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xgh", approval);
});
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate(templateName)).render(docData).writeAndClose(byteArrayOutputStream);
CommonDownloadUtil.download(fileName, byteArrayOutputStream.toByteArray(), response);
} catch (IOException e) {
log.error("生育休假审批表导出失败,id:{},错误信息:{}", id, e.getMessage());
}
}
}
@@ -7,6 +7,8 @@ import lombok.EqualsAndHashCode;
import org.nutz.dao.Cnd;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import java.util.List;
/**
* @version 1.0
* @Author zzr
@@ -22,11 +24,11 @@ public class MemberApplyPageForm extends PageForm {
private String unitId;
private String userState;
private List<String> userStates;
private String personType;
private List<String> personTypes;
private String preparedBy;
private List<String> preparedBys;
public static void buildSearch(Cnd cnd, MemberApplyPageForm pageForm) {
if (cnd == null) {
@@ -40,8 +42,8 @@ public class MemberApplyPageForm extends PageForm {
}
cnd.andEX("info.unionId","=",pageForm.getUnionId());
cnd.andEX("info.unitId","=",pageForm.getUnitId());
cnd.andEX("info.userState","=",pageForm.getUserState());
cnd.andEX("info.personType","=",pageForm.getPersonType());
cnd.andEX("info.preparedBy","=",pageForm.getPreparedBy());
cnd.andEX("info.userState","in",pageForm.getUserStates());
cnd.andEX("info.personType","in",pageForm.getPersonTypes());
cnd.andEX("info.preparedBy","in",pageForm.getPreparedBys());
}
}
@@ -8,6 +8,8 @@ import lombok.EqualsAndHashCode;
import org.nutz.dao.Cnd;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import java.util.List;
/**
* @version 1.0
* @Author zzr
@@ -29,15 +31,15 @@ public class MemberChangePageForm extends PageForm {
// 在职状态
@ApiModelProperty("在职状态")
private String userState;
private List<String> userStates;
// 在职状态
@ApiModelProperty("编制类型")
private String preparedBy;
private List<String> preparedBys;
// 人员类型
@ApiModelProperty("人员类型")
private String personType;
private List<String> personTypes;
public void buildSearch(Cnd cnd, String prefix){
@@ -54,8 +56,8 @@ public class MemberChangePageForm extends PageForm {
cnd.andEX(prefix + "unionId", "=", this.getUnionId());
cnd.andEX(prefix + "unitId", "=", this.getUnitId());
cnd.andEX(prefix + "userState", "=", this.getUserState());
cnd.andEX(prefix + "preparedBy", "=", this.getPreparedBy());
cnd.andEX(prefix + "personType", "=", this.getPersonType());
cnd.andEX(prefix + "userState", "in", this.getUserStates());
cnd.andEX(prefix + "preparedBy", "in", this.getPreparedBys());
cnd.andEX(prefix + "personType", "in", this.getPersonTypes());
}
}