This commit is contained in:
@jyuhsin
2026-01-22 17:32:06 +08:00
parent c50bcbf869
commit 6a07605b39
27 changed files with 515 additions and 41 deletions
@@ -0,0 +1,60 @@
package com.budwk.app.task.job.club;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONObject;
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 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.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName ClubGeneratePayRecordJob
* @Author JyuHsin
* @Date 2026/1/22 16:56
* @Version 1.0
* @Description 每年的1月1日生成协会成员下年的缴费记录
*/
@IocBean
public class ClubGeneratePayRecordJob implements Job {
@Inject
private Dao dao;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
// 当前年份
int thisYear = DateUtil.thisYear();
// 获取最新的协会成员信息
List<ClubUser> clubUserList = dao.query(ClubUser.class, Cnd.NEW());
// 生成缴费记录对象
List<ClubPayRecord> list = new ArrayList<>();
for (ClubUser clubUser : clubUserList) {
ClubPayRecord clubPayRecord = new ClubPayRecord();
clubPayRecord.setYear(thisYear);
clubPayRecord.setClubId(clubUser.getClubId());
clubPayRecord.setUserId(clubUser.getUserId());
clubPayRecord.setPayed(false);
JSONObject log = new JSONObject();
log.set("operatorUserId", "task");
log.set("operatorUserName", "定时任务");
log.set("operatorTime", DateUtil.now());
log.set("operatorType", "缴费管理-定时任务自动设置");
log.set("oldValue", null);
log.set("newValue", false);
clubPayRecord.setOperateLogs(List.of(log));
list.add(clubPayRecord);
}
dao.insert(list);
}
}
@@ -120,18 +120,28 @@ public class ClubUserJoinApplyController {
@ApiOperation("提交")
@SaCheckPermission(value = {"club.join.apply", "h5.club.join.apply"}, mode = SaMode.OR)
@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())) {
@SLog(tag = "协会管理系统-申请入/退", msg = "申请协会入/退")
public Result submit(@Param("data") ClubUserApply clubUserApply,
@Param("mode") Boolean mode) {
if(mode == false) {
clubUserApply = dao.fetch(
ClubUserApply.class,
Cnd.where("userId", "=", SecurityUtil.getUserId())
.and("clubId", "=", clubUserApply.getClubId())
.desc("applyDate")
);
}
ClubUserApply userApply = dao.fetch(ClubUserApply.class, Cnd.where("userId", "=", clubUserApply.getUserId()).and("clubId", "=", clubUserApply.getClubId()).and("mode", "=", mode).desc(ClubUserApply::getApplyDate));
if (ObjectUtil.isNotEmpty(userApply) && StrUtil.isNotBlank(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.setId(null);
clubUserApply.setRoleCode(RoleConstant.CLUB_MEMBER.name());
clubUserApply.setMode(true);
clubUserApply.setMode(mode);
clubUserApply.setApplyDate(new Date());
dao.insertOrUpdate(clubUserApply);
@@ -140,7 +150,7 @@ public class ClubUserJoinApplyController {
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(mode ? "XHRH" : "XHTH", clubUserApply.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
@@ -99,7 +99,13 @@ public class ClubUserJoinApprovalController {
""");
Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "1625a683-3890-4788-95b7-cab8240f6731");
if(pageForm.getMode() == null) {
cnd.and("t.taskName", "in", List.of("1625a683-3890-4788-95b7-cab8240f6731", "ae7337f8-b435-458d-abd9-4fa4f8d69f0b"));
} else if(pageForm.getMode()) {
cnd.and("t.taskName", "=", "1625a683-3890-4788-95b7-cab8240f6731");
} else {
cnd.and("t.taskName", "=", "ae7337f8-b435-458d-abd9-4fa4f8d69f0b");
}
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
cnd.andEX("YEAR(info.applyDate)","=",pageForm.getYear());
@@ -1,6 +1,7 @@
package com.budwk.app.zhgh.club.controller.apply;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
@@ -41,12 +42,17 @@ public class ClubUserMineClubController {
@Ok("beetl:/platform/zhgh/club/join/mineclub/index.html")
public void index() {}
@At("/h5")
@SaCheckPermission("h5.club.join.mine.club")
@Ok("beetl:/platform/zhghh5/club/mineclub/index.html")
public void h5Index() {}
@At
@SaCheckPermission("club.join.mine.club")
@SaCheckPermission(value = {"club.join.mine.club", "h5.club.join.mine.club"}, mode = SaMode.OR)
public Result pageData(@Valid ClubUserPageForm pageForm) {
List<ClubUser> query = dao.query(ClubUser.class, Cnd.where("userId", "=", SecurityUtil.getUserId()).groupBy("clubId"));
if (Lang.isEmpty(query)) {
return Result.success();
return Result.success(new Pagination());
}
List<String> clubIds = query.stream().map(ClubUser::getClubId).toList();
@@ -57,6 +63,7 @@ public class ClubUserMineClubController {
Sql sql = Sqls.create("""
SELECT
club.*,
club.id as clubId,
COUNT(DISTINCT ( uc.userId )) AS currentPeopleNum,
presidentUser.username AS clubLeader,
secretaryUser.username AS clubSecretary
@@ -80,7 +87,7 @@ public class ClubUserMineClubController {
}
@At
@SaCheckPermission("club.join.mine.club")
@SaCheckPermission(value = {"club.join.mine.club", "h5.club.join.mine.club"}, mode = SaMode.OR)
public Result getClubUsers(@Valid String clubId) {
List<NutMap> clubUser = clubUserService.getClubUser(clubId);
return Result.success(clubUser);
@@ -5,6 +5,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.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
@@ -12,14 +13,13 @@ 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.ProcessInstanceStateEnum;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.club.model.ClubUser;
import com.budwk.app.zhgh.club.model.SysClub;
import com.budwk.app.zhgh.club.model.SysClubManager;
import com.budwk.app.zhgh.club.model.SysClubRule;
import com.budwk.app.zhgh.club.model.*;
import com.budwk.app.zhgh.club.param.ClubUserPageForm;
import com.budwk.app.zhgh.club.service.SysClubInfoManageService;
import com.budwk.app.zhgh.club.service.impl.SysClubUserServiceImpl;
@@ -33,6 +33,7 @@ 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.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@@ -130,6 +131,24 @@ public class ClubChangeManagerController {
@SLog(tag = "协会管理系统-信息管理", msg = "提交变更理事机构")
public Object submit(@Param("data") SysClubManager clubManager) {
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
String errMsg = "校工会审核" + clubManager.getPeriod() + "的换届报告通过后才能变更理事成员";
// 查询这个届数有没有上传换届报告,并且审核通过
List<SysClubRefresh> list = dao.query(
SysClubRefresh.class,
Cnd.where(SysClubRefresh::getClubId, "=", clubManager.getClubId())
.and(SysClubRefresh::getPeriod, "=", clubManager.getPeriod())
);
if (Lang.isEmpty(list)) {
return Result.error(99, errMsg);
}
List<String> idList = list.stream().map(SysClubRefresh::getId).toList();
int count = dao.count(ProcessInstance.class, Cnd.where(ProcessInstance::getBusinessNo, "in", idList).and(ProcessInstance::getState, "in", List.of(ProcessInstanceStateEnum.FINISHED.getCode())));
if (count == 0) {
return Result.error(99, errMsg);
}
}
ClubUser clubUser = dao.fetch(ClubUser.class, Cnd.where(ClubUser::getClubId, "=", clubManager.getClubId()).and(ClubUser::getUserId, "=", clubManager.getUserId()));
clubManager.setUserId(SecurityUtil.getUserId());
clubManager.setUserName(SecurityUtil.getUserUsername());
@@ -73,7 +73,8 @@ public class ClubPayRecordController {
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
u.userState,
(select count(1) from club_user where clubId = cpr.clubId and userId = cpr.userId) as count
FROM
`club_pay_record` cpr
LEFT JOIN sys_club c ON cpr.clubid = c.id
@@ -0,0 +1,49 @@
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.sys.models.Sys_user_role;
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.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;
import java.util.List;
/**
* @ClassName ClubUserJoinInterceptor
* @Author JyuHsin
* @Date 2025/8/22 16:07
* @Version 1.0
* @Description TODO
*/
public class ClubUserExitInterceptor implements FlowInterceptor {
@Override
@Aop(TransAop.READ_COMMITTED)
public void intercept(Execution execution) {
// 获取表单参数
String formDataStr = execution.getArgs().getStr(FlowConst.FORM_DATA);
ClubUserApply clubUserApply = Json.fromJson(ClubUserApply.class, formDataStr);
// 获取操作类
Dao dao = ServiceContext.find(Dao.class);
// 删人
dao.clear(ClubUser.class, Cnd.where(ClubUser::getUserId, "=", clubUserApply.getUserId()).and(ClubUser::getClubId, "=", clubUserApply.getClubId()));
// 删角色
dao.clear(Sys_user_role.class, Cnd.where(Sys_user_role::getUserId, "=", clubUserApply.getUserId()).and(Sys_user_role::getClubId, "=", clubUserApply.getClubId()));
}
}
@@ -41,7 +41,6 @@ public class ClubUserJoinInterceptor implements FlowInterceptor {
// 获取操作类
Dao dao = ServiceContext.find(Dao.class);
SysClubUserService userService = ServiceContext.find(SysClubUserService.class);
// 将申请信息复制一份,插入协会成员表
ClubUser clubUser = BeanUtil.copyProperties(clubUserApply, ClubUser.class);
@@ -49,13 +48,13 @@ public class ClubUserJoinInterceptor implements FlowInterceptor {
// 还要加到协会成员缴费表中
// 对了,如果同一个人,在同一年,多次加入同一协会,则只插入一条
int count = dao.count(
ClubPayRecord payRecord = dao.fetch(
ClubPayRecord.class,
Cnd.where(ClubPayRecord::getClubId, "=", clubUser.getClubId())
.and(ClubPayRecord::getUserId, "=", clubUser.getUserId())
.and(ClubPayRecord::getYear, "=", DateUtil.thisYear())
);
if (count == 0) {
if (payRecord == null) {
ClubPayRecord record = new ClubPayRecord();
record.setClubId(clubUser.getClubId());
record.setUserId(clubUser.getUserId());
@@ -72,9 +71,22 @@ public class ClubUserJoinInterceptor implements FlowInterceptor {
record.setOperateLogs(List.of(log));
dao.insert(record);
} else {
payRecord.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", payRecord.getPayed());
log.set("newValue", payed);
payRecord.setOperateLogs(List.of(log));
dao.update(payRecord);
}
// 江苏卫生才有的,cao,将申请的人加入到活动组别里面去
userService.clubUser2Scope(clubUser.getClubId(), List.of(clubUser.getUserId()));
// userService.clubUser2Scope(clubUser.getClubId(), List.of(clubUser.getUserId()));
}
}
@@ -68,4 +68,9 @@ public class SysClubManager extends BaseModel {
@Comment("变更的身份")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> nowRoleCode;
@Column
@Comment("届数")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String period;
}
@@ -59,4 +59,9 @@ public class SysClubRefresh extends BaseModel {
@Comment("文件")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> files;
@Column
@Comment("届数")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String period;
}
@@ -13,5 +13,6 @@ public class ClubUserJoinPageForm extends PageForm {
private String userName;
private String unionId;
private String unitId;
private Boolean mode;
}
@@ -67,6 +67,7 @@ public class SysClubServiceImpl extends BaseServiceImpl<SysClub> implements SysC
Sql sql = Sqls.create("""
SELECT
club.*,
club.id as clubId,
u.username as concatPersonName,
(select GROUP_CONCAT(username) from sys_user where id in (select userId from club_user u where u.clubId=club.id and JSON_CONTAINS(u.roleCode, '"CLUB_PRESIDENT"'))) as clubLeader,
(select GROUP_CONCAT(username) from sys_user where id in (select userId from club_user u where u.clubId=club.id and JSON_CONTAINS(u.roleCode, '"CLUB_SECRETARY"'))) as clubSecretary,
@@ -25,6 +25,7 @@ public class ClubCommonPageVo extends SysClub {
private Integer status;
private Integer exitStatus;
private String clubLeader;
private String clubId;
@ApiModelProperty("秘书长")
private String clubSecretary;