This commit is contained in:
@jyuhsin
2026-01-22 13:53:50 +08:00
parent 7eac8b00b5
commit c50bcbf869
52 changed files with 1454 additions and 446 deletions
@@ -31,6 +31,7 @@ RoleConstant {
SCHOOL_UNION_ARTICLE_FGH_ADMIN("校工会分工会新闻审批管理员"),
SCHOOL_UNION_ARTICLE_ADMIN("校工会新闻审批管理员"),
SCHOOL_OUTLAY_ADMIN("校工会经费管理员"),
SCHOOL_PUBLICITY_AND_CULTURAL("校宣传与文体办公室负责人"),
BRANCH_UNION_ADMIN("分工会管理员"),
BRANCH_UNION_CHAIRMAN("分工会主席"),
@@ -0,0 +1,55 @@
package com.budwk.app.flow.handler;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.flow.engine.AssignmentHandler;
import com.budwk.app.flow.engine.core.Execution;
import com.budwk.app.flow.engine.core.ServiceContext;
import com.budwk.app.flow.engine.model.TaskModel;
import com.budwk.app.sys.models.Sys_role;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.lang.Lang;
import java.util.List;
/**
* @ClassName FlowRoleHandler
* @Author JyuHsin
* @Date 2026/1/15 15:56
* @Version 1.0
* @Description 根据传入的角色获取审核人
*/
public class FlowRoleHandler implements AssignmentHandler {
@Override
public List<String> assign(TaskModel model, Execution execution) {
String roleCode = execution.getArgs().getStr("roleCode");
if (StrUtil.isBlank(roleCode)) {
throw new BaseException("参数 roleCode 不能为空");
}
CommonService commonService = ServiceContext.find(CommonService.class);
List<Sys_user> users = commonService.findUserInfoByRoleCode(roleCode);
if(Lang.isEmpty(users)) {
throw new BaseException("未查询到相关审批人");
}
return users.stream().map(Sys_user::getId).toList();
}
@Override
public String getMessage() {
return "根据传入的角色获取审核人(通用版本,根据args中的roleCode";
}
@Override
public int getOrder() {
return AssignmentHandler.super.getOrder();
}
}
@@ -23,6 +23,7 @@ import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.sys.services.SysMsgService;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.club.model.ClubUser;
@@ -53,133 +54,140 @@ import java.util.List;
@Ok("json:full")
public class ClubUserJoinApplyController {
@Inject
private Dao dao;
@Inject
private CommonService commonService;
@Inject
private SysMsgService sysMsgService;
@Inject
private FlowEngine flowEngine;
@Inject
private FlowCommonService flowCommonService;
@Inject
private Dao dao;
@Inject
private CommonService commonService;
@Inject
private SysMsgService sysMsgService;
@Inject
private FlowEngine flowEngine;
@Inject
private FlowCommonService flowCommonService;
@At("/")
@At("/")
@SaCheckPermission("club.join.apply")
@Ok("beetl:/platform/zhgh/club/join/apply/index.html")
public void index() {}
@Ok("beetl:/platform/zhgh/club/join/apply/index.html")
public void index() {
}
@At("/h5")
@SaCheckPermission("h5.club.join.apply")
@Ok("beetl:/platform/zhghh5/club/apply/index.html")
public void h5Index() {}
public void h5Index() {
}
@At
@ApiOperation("详情")
@At
@ApiOperation("详情")
@SaCheckPermission(value = {"club.join.apply", "h5.club.join.apply"}, mode = SaMode.OR)
public Result info(@Valid String id) {
Sql sql = Sqls.create("""
SELECT
cua.*,
club.clubName,
u.loginname AS loginName,
u.username AS userName,
u.sex,
u.unitName,
u.unionName,
u.technicalTitle,
u.education,
u.academicDegree
FROM
club_user_apply cua
LEFT JOIN sys_club club ON club.id = cua.clubId
LEFT JOIN vw_user u ON u.id = cua.userId
WHERE cua.id = @id
""").setParam("id", id);
sql.setCallback(Sqls.callback.map());
dao.execute(sql);
return Result.success(sql.getResult());
}
public Result info(@Valid String id) {
Sql sql = Sqls.create("""
SELECT
cua.*,
club.clubName,
u.loginname AS loginName,
u.username AS userName,
u.sex,
u.unitName,
u.unionName,
u.technicalTitle,
u.education,
u.academicDegree
FROM
club_user_apply cua
LEFT JOIN sys_club club ON club.id = cua.clubId
LEFT JOIN vw_user u ON u.id = cua.userId
WHERE cua.id = @id
""").setParam("id", id);
sql.setCallback(Sqls.callback.map());
dao.execute(sql);
return Result.success(sql.getResult());
}
@At
@ApiOperation("保存申请")
@At
@ApiOperation("保存申请")
@SaCheckPermission(value = {"club.join.apply", "h5.club.join.apply"}, mode = SaMode.OR)
@SLog(tag = "协会管理系统-申请入会", msg = "保存协会入会")
public Result save(@Param("data") ClubUserApply clubUserApply) {
clubUserApply.setRoleCode(RoleConstant.CLUB_MEMBER.name());
clubUserApply.setMode(true);
clubUserApply.setApplyDate(new Date());
dao.insertOrUpdate(clubUserApply);
return Result.success();
}
public Result save(@Param("data") ClubUserApply clubUserApply) {
clubUserApply.setRoleCode(RoleConstant.CLUB_MEMBER.name());
clubUserApply.setMode(true);
clubUserApply.setApplyDate(new Date());
dao.insertOrUpdate(clubUserApply);
return Result.success();
}
@At
@ApiOperation("提交")
@At
@ApiOperation("提交")
@SaCheckPermission(value = {"club.join.apply", "h5.club.join.apply"}, mode = SaMode.OR)
@Aop(TransAop.READ_COMMITTED)
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "协会管理系统-申请入会", msg = "申请协会入会")
public Result submit(ClubUserApply clubUserApply) {
ClubUserApply userApply = dao.fetch(ClubUserApply.class, Cnd.where("userId", "=", clubUserApply.getUserId()).and("clubId", "=", clubUserApply.getClubId()).and("mode", "=", 1).desc(ClubUserApply::getApplyDate));
if (ObjectUtil.isNotEmpty(userApply) && StrUtil.isBlank(userApply.getId())) {
ProcessInstance processInstance = dao.fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", userApply.getId()));
if (!List.of(ProcessInstanceStateEnum.REJECT.getCode(),ProcessInstanceStateEnum.FINISHED.getCode()).contains(processInstance.getState())) {
return Result.error("您有该协会的申请记录尚未完成,请到我的申请里查看!");
}
}
public Result submit(ClubUserApply clubUserApply) {
ClubUserApply userApply = dao.fetch(ClubUserApply.class, Cnd.where("userId", "=", clubUserApply.getUserId()).and("clubId", "=", clubUserApply.getClubId()).and("mode", "=", 1).desc(ClubUserApply::getApplyDate));
if (ObjectUtil.isNotEmpty(userApply) && StrUtil.isBlank(userApply.getId())) {
ProcessInstance processInstance = dao.fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", userApply.getId()));
if (!List.of(ProcessInstanceStateEnum.REJECT.getCode(), ProcessInstanceStateEnum.FINISHED.getCode()).contains(processInstance.getState())) {
return Result.error("您有该协会的申请记录尚未完成,请到我的申请里查看!");
}
}
clubUserApply.setRoleCode(RoleConstant.CLUB_MEMBER.name());
clubUserApply.setMode(true);
clubUserApply.setApplyDate(new Date());
dao.insertOrUpdate(clubUserApply);
clubUserApply.setRoleCode(RoleConstant.CLUB_MEMBER.name());
clubUserApply.setMode(true);
clubUserApply.setApplyDate(new Date());
dao.insertOrUpdate(clubUserApply);
// 开启流程实例
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, clubUserApply);
// 开启流程实例
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, clubUserApply);
args.set("clubId", clubUserApply.getClubId());
ProcessInstance instance = flowEngine.startProcessInstanceByKey("XHRH", clubUserApply.getId(), SecurityUtil.getUserId(), args);
ProcessInstance instance = flowEngine.startProcessInstanceByKey("XHRH", clubUserApply.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();
}
// 自动完成第一个申请任务
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
for (ProcessTask task : doingTaskList) {
flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args);
}
return Result.success();
}
@At
@ApiOperation("重新提交申请")
@Aop(TransAop.READ_COMMITTED)
@At
@ApiOperation("重新提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"club.join.apply", "h5.club.join.apply"}, mode = SaMode.OR)
public Result submitAgain(@Param("data") ClubUserApply clubUserApply, @Param("taskId") Long taskId) {
dao.insertOrUpdate(clubUserApply);
public Result submitAgain(@Param("data") ClubUserApply clubUserApply, @Param("taskId") Long taskId) {
dao.insertOrUpdate(clubUserApply);
Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
dict.set("clubId", clubUserApply.getClubId());
flowCommonService.executeTask(dict);
return Result.success();
}
flowCommonService.executeTask(dict);
return Result.success();
}
@At
@ApiOperation("校验是否申请过协会")
@At
@ApiOperation("校验是否申请过协会")
@SaCheckPermission(value = {"club.join.apply", "h5.club.join.apply"}, mode = SaMode.OR)
public Result checkApplyClub(@Valid String clubId) {
ClubUserApply userApply = dao.fetch(ClubUserApply.class, Cnd.where("userId", "=", SecurityUtil.getUserId()).and("clubId", "=", clubId).and("mode", "=", 1).desc(ClubUserApply::getApplyDate));
ClubUser clubUser = dao.fetch(ClubUser.class, Cnd.where("userId", "=", SecurityUtil.getUserId()).and("clubId", "=", clubId));
if (ObjectUtil.isEmpty(userApply) && ObjectUtil.isEmpty(clubUser)) {
return Result.success();
}
public Result checkApplyClub(@Valid String clubId) {
View_user user = dao.fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId()));
if (user.getMember() != 1) {
return Result.error(99, "抱歉,您不满足入会的条件!");
}
if (ObjectUtil.isNotEmpty(clubUser)) {
return Result.error(99, "请勿重复申请!");
}
ClubUserApply userApply = dao.fetch(ClubUserApply.class, Cnd.where("userId", "=", SecurityUtil.getUserId()).and("clubId", "=", clubId).and("mode", "=", 1).desc(ClubUserApply::getApplyDate));
ClubUser clubUser = dao.fetch(ClubUser.class, Cnd.where("userId", "=", SecurityUtil.getUserId()).and("clubId", "=", clubId));
if (ObjectUtil.isEmpty(userApply) && ObjectUtil.isEmpty(clubUser)) {
return Result.success();
}
ProcessInstance processInstance = dao.fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", userApply.getId()));
if (!List.of(ProcessInstanceStateEnum.REJECT.getCode(),ProcessInstanceStateEnum.FINISHED.getCode()).contains(processInstance.getState())) {
return Result.error(99, "您有该协会的申请记录尚未完成,请到我的申请里查看!");
}
return Result.success();
}
if (ObjectUtil.isNotEmpty(clubUser)) {
return Result.error(99, "请勿重复申请!");
}
ProcessInstance processInstance = dao.fetch(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "=", userApply.getId()));
if (!List.of(ProcessInstanceStateEnum.REJECT.getCode(), ProcessInstanceStateEnum.FINISHED.getCode()).contains(processInstance.getState())) {
return Result.error(99, "您有该协会的申请记录尚未完成,请到我的申请里查看!");
}
return Result.success();
}
}
@@ -79,6 +79,7 @@ public class ClubUserJoinMineController {
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
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
@@ -88,6 +89,7 @@ public class ClubUserJoinMineController {
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
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
@@ -0,0 +1,186 @@
package com.budwk.app.zhgh.club.controller.infoManage;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
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.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.club.model.ClubPayRecord;
import com.budwk.app.zhgh.club.model.ClubUserApply;
import com.budwk.app.zhgh.club.service.ClubPayRecordService;
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;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
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;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/**
* @ClassName ClubPayRecordController
* @Author JyuHsin
* @Date 2026/1/17 15:39
* @Version 1.0
* @Description TODO
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "协会缴费记录")
@At("/platform/club/pay")
public class ClubPayRecordController {
@Inject
private ClubPayRecordService payRecordService;
@At("")
@SaCheckPermission("club.infoManage.pay")
@Ok("beetl:/platform/zhgh/club/infoManage/pay/index.html")
public void index() {
}
@At
@SaCheckPermission("club.infoManage.pay")
public Result pageData(@Valid PageForm pageForm,
@Param("year") Integer year,
@Param("clubId") String clubId,
@Param("payed") Integer payed,
@Param("assign") Integer assign) {
Sql sql = Sqls.create("""
SELECT
cpr.*,
c.clubName,
u.loginName,
u.userName,
u.unitName,
u.retireDate,
(SELECT createdAt FROM club_user WHERE clubId = cpr.clubId AND userId = cpr.userId ORDER BY createdAt LIMIT 1) AS applyTime,
u.userState
FROM
`club_pay_record` cpr
LEFT JOIN sys_club c ON cpr.clubid = c.id
LEFT JOIN vw_user u ON u.id = cpr.userId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("cpr.year", "=", year);
cnd.andEX("cpr.clubId", "=", clubId);
cnd.andEX("cpr.payed", "=", payed);
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("u.userName", pageForm.getSearchKeyword());
seg.orLike("u.loginName", pageForm.getSearchKeyword());
cnd.and(seg);
}
if (assign != null) {
SqlExpressionGroup mainGroup = new SqlExpressionGroup();
if (assign == 0) {
SqlExpressionGroup noAssignGroup = new SqlExpressionGroup();
// 不拨付条件1:payed=false(原代码第一行直接return false
noAssignGroup.or("cpr.payed", "=", false);
// 不拨付条件2:payed=true,但用户状态是退休 且 无退休日期
SqlExpressionGroup retireNoDateGroup = new SqlExpressionGroup();
retireNoDateGroup.and("cpr.payed", "=", true);
retireNoDateGroup.and("u.userState", "=", "退休");
retireNoDateGroup.and("u.retireDate", "is", null);
// 不拨付条件3:payed=true,用户状态是退休,有退休日期,但退休年份 < 缴费年份
SqlExpressionGroup retireYearLessGroup = new SqlExpressionGroup();
retireYearLessGroup.and("cpr.payed", "=", true);
retireYearLessGroup.and("u.userState", "=", "退休");
retireYearLessGroup.and("u.retireDate", "is not", null);
// 计算缴费年份
// 退休年份 < 缴费年份
retireYearLessGroup.and("YEAR(u.retireDate)", "<", "cpr.year");
// 合并所有不拨付条件(满足任一即不拨付)
noAssignGroup.or(retireNoDateGroup);
noAssignGroup.or(retireYearLessGroup);
mainGroup.and(noAssignGroup);
} else {
SqlExpressionGroup assignGroup = new SqlExpressionGroup();
// 拨付前提:payed必须为true
assignGroup.and("cpr.payed", "=", true);
// 拨付条件1:用户状态≠退休
SqlExpressionGroup userNotRetireGroup = new SqlExpressionGroup();
userNotRetireGroup.or("u.userState", "<>", "退休");
// 拨付条件2:用户状态=退休,有退休日期,且退休年份≥缴费年份
SqlExpressionGroup retireQualifiedGroup = new SqlExpressionGroup();
retireQualifiedGroup.and("u.userState", "=", "退休");
retireQualifiedGroup.and("u.retireDate", "is not", null);
retireQualifiedGroup.and("YEAR(u.retireDate)", ">=", "cpr.year");
// 合并拨付条件(满足任一即拨付)
userNotRetireGroup.or(retireQualifiedGroup);
assignGroup.and(userNotRetireGroup);
mainGroup.and(assignGroup);
}
cnd.and(mainGroup);
}
sql.setCondition(cnd);
Pagination pagination = payRecordService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
List<NutMap> list = pagination.getList();
for (NutMap nutMap : list) {
boolean assigned = payRecordService.calAssigned(nutMap.getString("id"));
nutMap.put("assign", assigned);
}
return Result.success(pagination);
}
@At
@ApiOperation("修改协会成员缴费状态")
@SaCheckPermission("club.infoManage.pay")
@SLog(tag = "协会管理系统-缴费记录", msg = "修改协会成员缴费状态")
public Result handle(@Param("ids") String[] ids,
@Param("payed") Boolean payed) {
List<ClubPayRecord> list = payRecordService.query(Cnd.where("id", "in", ids));
for (ClubPayRecord payRecord : list) {
List<JSONObject> logs = Optional.ofNullable(payRecord.getOperateLogs()).orElseGet(ArrayList::new);
JSONObject log = new JSONObject();
log.set("operatorUserId", SecurityUtil.getUserId());
log.set("operatorUserName", SecurityUtil.getUserUsername());
log.set("operatorTime", DateUtil.now());
log.set("operatorType", "缴费管理-手动设置");
log.set("oldValue", payRecord.getPayed());
log.set("newValue", payed);
logs.add(log);
payRecord.setOperateLogs(logs);
payRecord.setPayed(payed);
}
payRecordService.update(list);
return Result.success();
}
}
@@ -7,6 +7,7 @@ import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.club.param.ClubUserPageForm;
import com.budwk.app.zhgh.club.service.SysClubService;
import com.budwk.app.zhgh.club.vo.ClubRegisterPageVo;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
@@ -37,26 +38,10 @@ public class ClubConfirmController {
public void index() {
}
@At
@SaCheckPermission("club.register.clubConfirm")
public Result pageData(@Valid ClubUserPageForm pageForm) {
Pagination pagination = sysClubService.clubConfirmPageData(pageForm);
return Result.success(pagination);
}
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("club.register.clubConfirm")
@SLog(tag = "协会管理系统-协会注册", msg = "协会确认")
public Result doAudit() {
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("club.register.clubConfirm")
@SLog(tag = "协会管理系统-协会注册", msg = "协会确认撤回")
public Result withdraw(@Valid Long processTaskId) {
return Result.success();
}
@At
@SaCheckPermission("club.register.clubConfirm")
public Result pageData(@Valid ClubUserPageForm pageForm) {
Pagination<ClubRegisterPageVo> pagination = sysClubService.clubConfirmPageData(pageForm);
return Result.success(pagination);
}
}
@@ -0,0 +1,64 @@
package com.budwk.app.zhgh.club.controller.register;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.lang.Dict;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.zhgh.club.param.ClubUserPageForm;
import com.budwk.app.zhgh.club.service.SysClubService;
import com.budwk.app.zhgh.club.vo.ClubRegisterPageVo;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
/**
* @ClassName ClubOfficeAuditController
* @Author JyuHsin
* @Date 2026/1/15 16:32
* @Version 1.0
* @Description TODO
*/
@IocBean
@Ok("json")
@At("/platform/club/register/officeAudit")
public class ClubOfficeAuditController {
@Inject
private SysClubService sysClubService;
@Inject
private FlowCommonService flowCommonService;
@At("")
@Ok("beetl:/platform/zhgh/club/register/officeAudit/index.html")
@SaCheckPermission("club.register.officeAudit")
public void index() {}
@At
@SaCheckPermission("club.register.officeAudit")
public Result pageData(@Valid ClubUserPageForm pageForm) {
Pagination<ClubRegisterPageVo> pagination = sysClubService.officeAuditPageData(pageForm);
return Result.success(pagination);
}
@At("/executeTask")
@ApiOperation("执行任务")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("club.register.officeAudit")
public Result executeTask(@Param("data") String param) {
Dict args = Json.fromJson(Dict.class, param);
args.set("roleCode", RoleConstant.SCHOOL_UNION_CLUB_ADMIN.name());
flowCommonService.executeTask(args);
return Result.success();
}
}
@@ -7,6 +7,7 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.result.Result;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine;
@@ -97,6 +98,7 @@ public class ClubRegistApplyController {
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, sysClub);
args.set("roleCode", RoleConstant.SCHOOL_PUBLICITY_AND_CULTURAL.name());
ProcessInstance instance = flowEngine.startProcessInstanceByKey("XHZC", sysClub.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
@@ -53,36 +53,10 @@ public class ClubSchoolLeaderAuditController {
public void index() {
}
@At
@SaCheckPermission("club.register.schoolLeaderAudit")
public Result pageData(@Valid ClubUserPageForm pageForm) {
Pagination<ClubRegisterPageVo> pagination = sysClubService.schoolLeaderAuditPageData(pageForm);
return Result.success(pagination);
}
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("club.register.schoolLeaderAudit")
@SLog(tag = "协会管理系统-协会注册", msg = "分管领导审核注册协会")
public Result approval(@Valid @Param("approval") BpmTaskApprovalParam approvalParam) {
approvalParam.getBpmTaskApprovalTypeEnum();
Map<String, Object> variables = BeanUtil.beanToMap(approvalParam);
List<String> assignments = new ArrayList<>();
if(approvalParam.getBpmTaskApprovalTypeEnum().equals(BpmTaskApprovalTypeEnum.PASS)){
List<Sys_user> schoolClubManageUser = commonService.findUserInfoByRoleCode(RoleConstant.SCHOOL_UNION_CLUB_ADMIN.name());
assignments.addAll(schoolClubManageUser.stream().map(Sys_user::getLoginname).toList());
}
bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), approvalParam.getBpmTaskApprovalTypeEnum(), variables, assignments);
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("club.register.schoolLeaderAudit")
@SLog(tag = "协会管理系统-协会注册", msg = "分管领导撤回注册协会")
public Result revoke(@Valid String taskId) {
bpmService.revokeTask(taskId);
return Result.success();
}
@At
@SaCheckPermission("club.register.schoolLeaderAudit")
public Result pageData(@Valid ClubUserPageForm pageForm) {
Pagination<ClubRegisterPageVo> pagination = sysClubService.schoolLeaderAuditPageData(pageForm);
return Result.success(pagination);
}
}
@@ -1,10 +1,13 @@
package com.budwk.app.zhgh.club.interceptor;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowInterceptor;
import com.budwk.app.flow.engine.core.Execution;
import com.budwk.app.flow.engine.core.ServiceContext;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.sys.models.Sys_role;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.sys.services.SysRoleService;
@@ -31,31 +34,37 @@ public class ClubRegisterInterceptor implements FlowInterceptor {
public void intercept(Execution execution) {
String formDataStr = execution.getArgs().getStr(FlowConst.FORM_DATA);
SysClub club = Json.fromJson(SysClub.class, formDataStr);
Dao dao = ServiceContext.find(Dao.class);
SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class);
SysUserService sysUserService = ServiceContext.find(SysUserService.class);
// 因为是前置节点,所以要有if
Dict args = execution.getArgs();
Integer submitType = args.getInt("submitType");
if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.AGREE.getCode())) {
SysClub club = Json.fromJson(SysClub.class, formDataStr);
// 审核通过,就给角色,找理事机构
List<ClubUser> clubUsers = dao.query(
ClubUser.class,
Cnd.where("clubId", "=", club.getId())
);
List<Sys_user_role> list = new ArrayList<>();
for (ClubUser clubUser : clubUsers) {
for (String role : clubUser.getRoleCode()) {
Sys_user_role userRole = new Sys_user_role();
Sys_role sysRole = sysRoleService.getByCode(role);
userRole.setRoleId(sysRole.getId());
userRole.setUserId(clubUser.getUserId());
userRole.setClubId(club.getId());
list.add(userRole);
Dao dao = ServiceContext.find(Dao.class);
SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class);
SysUserService sysUserService = ServiceContext.find(SysUserService.class);
// 审核通过,就给角色,找理事机构
List<ClubUser> clubUsers = dao.query(
ClubUser.class,
Cnd.where("clubId", "=", club.getId())
);
List<Sys_user_role> list = new ArrayList<>();
for (ClubUser clubUser : clubUsers) {
for (String role : clubUser.getRoleCode()) {
Sys_user_role userRole = new Sys_user_role();
Sys_role sysRole = sysRoleService.getByCode(role);
userRole.setRoleId(sysRole.getId());
userRole.setUserId(clubUser.getUserId());
userRole.setClubId(club.getId());
list.add(userRole);
}
}
}
dao.insert(list);
sysUserService.clearCache();
sysRoleService.clearCache();
dao.insert(list);
sysUserService.clearCache();
sysRoleService.clearCache();
}
}
}
@@ -1,14 +1,20 @@
package com.budwk.app.zhgh.club.interceptor;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONObject;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowInterceptor;
import com.budwk.app.flow.engine.core.Execution;
import com.budwk.app.flow.engine.core.ServiceContext;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.club.model.ClubPayRecord;
import com.budwk.app.zhgh.club.model.ClubUser;
import com.budwk.app.zhgh.club.model.ClubUserApply;
import com.budwk.app.zhgh.club.service.SysClubUserService;
import org.bouncycastle.jcajce.provider.util.SecretKeyUtil;
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.json.Json;
@@ -28,15 +34,47 @@ public class ClubUserJoinInterceptor implements FlowInterceptor {
@Aop(TransAop.READ_COMMITTED)
public void intercept(Execution execution) {
// 获取表单参数
String formDataStr = execution.getArgs().getStr(FlowConst.FORM_DATA);
Boolean payed = execution.getArgs().getBool(FlowConst.TASK_FORM_DATA_PREFIX + "payed");
ClubUserApply clubUserApply = Json.fromJson(ClubUserApply.class, formDataStr);
// 获取操作类
Dao dao = ServiceContext.find(Dao.class);
SysClubUserService userService = ServiceContext.find(SysClubUserService.class);
// 将申请信息复制一份,插入协会成员表
ClubUser clubUser = BeanUtil.copyProperties(clubUserApply, ClubUser.class);
dao.insert(clubUser);
// 还要加到协会成员缴费表中
// 对了,如果同一个人,在同一年,多次加入同一协会,则只插入一条
int count = dao.count(
ClubPayRecord.class,
Cnd.where(ClubPayRecord::getClubId, "=", clubUser.getClubId())
.and(ClubPayRecord::getUserId, "=", clubUser.getUserId())
.and(ClubPayRecord::getYear, "=", DateUtil.thisYear())
);
if (count == 0) {
ClubPayRecord record = new ClubPayRecord();
record.setClubId(clubUser.getClubId());
record.setUserId(clubUser.getUserId());
record.setYear(DateUtil.thisYear());
record.setPayed(payed);
JSONObject log = new JSONObject();
log.set("operatorUserId", SecurityUtil.getUserId());
log.set("operatorUserName", SecurityUtil.getUserUsername());
log.set("operatorTime", DateUtil.now());
log.set("operatorType", "入会审核");
log.set("oldValue", null);
log.set("newValue", payed);
record.setOperateLogs(List.of(log));
dao.insert(record);
}
// 江苏卫生才有的,cao,将申请的人加入到活动组别里面去
userService.clubUser2Scope(clubUser.getClubId(), List.of(clubUser.getUserId()));
}
}
@@ -0,0 +1,58 @@
package com.budwk.app.zhgh.club.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;
/**
* @ClassName ClubPayRecord
* @Author JyuHsin
* @Date 2026/1/17 15:31
* @Version 1.0
* @Description TODO
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Table("club_pay_record")
@TableMeta("{'mysql-charset':'utf8mb4'}")
@Comment("协会会员缴费记录表")
public class ClubPayRecord extends BaseModel {
@Name
@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("协会ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String clubId;
@Column
@Comment("用户ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String userId;
@Column
@Comment("是否缴费")
@ColDefine(type = ColType.BOOLEAN)
@Default(value = "0")
private Boolean payed;
// 防止有人今天操作缴费,明天操作未缴费,还是记录一下吧
@Column
@Comment("操作记录")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> operateLogs;
}
@@ -0,0 +1,26 @@
package com.budwk.app.zhgh.club.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.club.model.ClubPayRecord;
/**
* @ClassName ClubPayRecordService
* @Author JyuHsin
* @Date 2026/1/17 15:40
* @Version 1.0
* @Description TODO
*/
public interface ClubPayRecordService extends BaseService<ClubPayRecord> {
/**
* 获取协会成员是否拨付
* @param userId
* @param clubId
*/
boolean calAssigned(String userId, String clubId);
boolean calAssigned(String primaryId);
boolean calAssigned(ClubPayRecord payRecord);
}
@@ -39,6 +39,8 @@ public interface SysClubService extends BaseService<SysClub> {
Pagination<ClubRegisterPageVo> schoolLeaderAuditPageData(@Valid ClubUserPageForm pageForm);
Pagination<ClubRegisterPageVo> officeAuditPageData(@Valid ClubUserPageForm pageForm);
Pagination<ClubRegisterPageVo> schoolReplyPageData(@Valid ClubUserPageForm pageForm);
Pagination<ClubRegisterPageVo> clubConfirmPageData(@Valid ClubUserPageForm pageForm);
@@ -0,0 +1,62 @@
package com.budwk.app.zhgh.club.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.zhgh.club.model.ClubPayRecord;
import com.budwk.app.zhgh.club.service.ClubPayRecordService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import java.util.Objects;
/**
* @ClassName ClubPayRecordServiceImpl
* @Author JyuHsin
* @Date 2026/1/17 15:40
* @Version 1.0
* @Description TODO
*/
@IocBean(args = {"refer:dao"})
public class ClubPayRecordServiceImpl extends BaseServiceImpl<ClubPayRecord> implements ClubPayRecordService {
public ClubPayRecordServiceImpl(Dao dao) {
super(dao);
}
@Override
public boolean calAssigned(String userId, String clubId) {
Cnd cnd = Cnd.NEW();
cnd.and("userId", "=", userId);
cnd.and("clubId", "=", clubId);
cnd.desc(ClubPayRecord::getCreatedAt);
ClubPayRecord payRecord = dao().fetch(ClubPayRecord.class, cnd);
return calAssigned(payRecord);
}
@Override
public boolean calAssigned(String primaryId) {
ClubPayRecord payRecord = fetch(primaryId);
return calAssigned(payRecord);
}
@Override
public boolean calAssigned(ClubPayRecord payRecord) {
// 如果是未缴费,直接是不拨付
if (!payRecord.getPayed()) {
return false;
}
Sys_user user = dao().fetch(Sys_user.class, payRecord.getUserId());
if (!Objects.equals("退休", user.getUserState())) {
return true;
}
if (Lang.isEmpty(user.getRetireDate())) {
return false;
}
int retireYear = DateUtil.year(user.getRetireDate());
return retireYear >= (payRecord.getYear() != null ? payRecord.getYear() : DateUtil.thisYear());
}
}
@@ -227,6 +227,7 @@ public class SysClubServiceImpl extends BaseServiceImpl<SysClub> implements SysC
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
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
@@ -236,6 +237,7 @@ public class SysClubServiceImpl extends BaseServiceImpl<SysClub> implements SysC
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
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
$condition
""");
Cnd cnd = Cnd.NEW();
@@ -245,18 +247,29 @@ public class SysClubServiceImpl extends BaseServiceImpl<SysClub> implements SysC
cnd.andEX("year(info.createTime)", "=", pageForm.getYear());
cnd.and("info.userId", "=", SecurityUtil.getUserId());
cnd.desc("createTime");
cnd.groupBy("info.id");
sql.setCondition(cnd);
return listPageVO(pageForm, sql, ClubRegisterPageVo.class);
}
@Override
public Pagination<ClubRegisterPageVo> schoolLeaderAuditPageData(ClubUserPageForm pageForm) {
Cnd cnd = Cnd.NEW();
cnd.and("nd.nodeCode", "=", 20);
Sql sql = generateSql(pageForm, cnd);
return listPageVO(pageForm, sql, ClubRegisterPageVo.class);
Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "1e239d94-a6ec-4561-8cff-0645b0b82a96");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
Sql sql = generateSql(pageForm, cnd);
return listPageVO(pageForm, sql, ClubRegisterPageVo.class);
}
@Override
public Pagination<ClubRegisterPageVo> officeAuditPageData(ClubUserPageForm pageForm) {
Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "b4adf2d7-fb95-4444-b212-6d2a08e9cffd");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
Sql sql = generateSql(pageForm, cnd);
return listPageVO(pageForm, sql, ClubRegisterPageVo.class);
}
@Override
public Pagination<ClubRegisterPageVo> schoolReplyPageData(ClubUserPageForm pageForm) {
Cnd cnd = Cnd.NEW();
@@ -268,10 +281,11 @@ public class SysClubServiceImpl extends BaseServiceImpl<SysClub> implements SysC
@Override
public Pagination<ClubRegisterPageVo> clubConfirmPageData(ClubUserPageForm pageForm) {
Cnd cnd = Cnd.NEW();
cnd.and("nd.nodeCode", "=", 80);
Sql sql = generateSql(pageForm, cnd);
return listPageVO(pageForm, sql, ClubRegisterPageVo.class);
Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "b57dc4e4-12cd-4f3c-b400-b34ebcf2f2d4");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
Sql sql = generateSql(pageForm, cnd);
return listPageVO(pageForm, sql, ClubRegisterPageVo.class);
}
private Sql generateSql(ClubUserPageForm pageForm, Cnd cnd) {