This commit is contained in:
@jyuhsin
2026-01-24 17:37:29 +08:00
parent 6a07605b39
commit 7637981eba
11 changed files with 1557 additions and 998 deletions
@@ -86,6 +86,7 @@ public class ClubEvaluateApplyController {
Dict args = Dict.create(); Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode()); args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, evaluate); args.set(FlowConst.FORM_DATA, evaluate);
args.set("clubId", evaluate.getClubId());
ProcessInstance instance = flowEngine.startProcessInstanceByKey("XHPY", evaluate.getId(), SecurityUtil.getUserId(), args); ProcessInstance instance = flowEngine.startProcessInstanceByKey("XHPY", evaluate.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务 // 自动完成第一个申请任务
@@ -106,6 +107,7 @@ public class ClubEvaluateApplyController {
Dict dict = Dict.create(); Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId); dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode()); dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
dict.set("clubId", clubEvaluate.getClubId());
flowCommonService.executeTask(dict); flowCommonService.executeTask(dict);
return Result.success(); return Result.success();
} }
@@ -38,15 +38,9 @@ import java.util.Map;
@At("/platform/club/evaluate/clubAudit") @At("/platform/club/evaluate/clubAudit")
public class ClubEvaluateClubAuditController { public class ClubEvaluateClubAuditController {
@Inject
private CommonService commonService;
@Inject @Inject
private SysClubEvaluateService sysClubEvaluateService; private SysClubEvaluateService sysClubEvaluateService;
@Inject
private BpmService bpmService;
@At("") @At("")
@Ok("beetl:/platform/zhgh/club/evaluate/clubAudit/index.html") @Ok("beetl:/platform/zhgh/club/evaluate/clubAudit/index.html")
@SaCheckPermission("club.evaluate.clubAudit") @SaCheckPermission("club.evaluate.clubAudit")
@@ -59,30 +53,4 @@ public class ClubEvaluateClubAuditController {
Pagination<ClubEvaluatePageVo> pagination = sysClubEvaluateService.clubAuditPageData(pageForm); Pagination<ClubEvaluatePageVo> pagination = sysClubEvaluateService.clubAuditPageData(pageForm);
return Result.success(pagination); return Result.success(pagination);
} }
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("club.evaluate.clubAudit")
@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<String> schoolUnionApprovalLoginName = commonService.findUsersLoginNameByRoleCode(RoleConstant.SCHOOL_UNION_CLUB_ADMIN, Cnd.NEW());
assignments.addAll(schoolUnionApprovalLoginName);
}
bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), approvalParam.getBpmTaskApprovalTypeEnum(), variables, assignments);
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("club.evaluate.clubAudit")
@SLog(tag = "协会管理系统-协会评优", msg = "会长撤回评优申请")
public Result revoke(@Valid String taskId) {
bpmService.revokeTask(taskId);
return Result.success();
}
} }
@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Dict; import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.annotation.SLog;
@@ -21,6 +22,7 @@ import com.budwk.app.zhgh.club.model.SysClub;
import com.budwk.app.zhgh.club.model.SysClubExamineRegister; import com.budwk.app.zhgh.club.model.SysClubExamineRegister;
import com.budwk.app.zhgh.club.service.SysClubExamineService; import com.budwk.app.zhgh.club.service.SysClubExamineService;
import com.budwk.app.zhgh.club.service.SysClubService; import com.budwk.app.zhgh.club.service.SysClubService;
import com.budwk.app.zhgh.dayofficework.outlay.outlayManage.club.model.OutlayManageClub;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd; import org.nutz.dao.Cnd;
@@ -67,14 +69,14 @@ public class ClubExamineApplyController {
@At @At
@SaCheckLogin @SaCheckLogin
public Result getCount(String id, Integer year) { public Result getCount(String id, Integer year, String clubId) {
if(StrUtil.isBlank(id)) { if(StrUtil.isBlank(clubId)) {
return Result.error("协会信息为空,请核查"); return Result.error("协会信息为空,请核查");
} }
if(year == null) { if(year == null) {
return Result.error("年份信息为空,请核查"); return Result.error("年份信息为空,请核查");
} }
List<SysClubExamineRegister> list = dao.query(SysClubExamineRegister.class, Cnd.where("clubId", "=", id).and("year(registerDate)", "=", year)); List<SysClubExamineRegister> list = dao.query(SysClubExamineRegister.class, Cnd.where("clubId", "=", clubId).and("year(registerDate)", "=", year).andEX("id", "!=", id));
List<ProcessInstance> instanceList = dao.query( List<ProcessInstance> instanceList = dao.query(
ProcessInstance.class, ProcessInstance.class,
Cnd.where(ProcessInstance::getBusinessNo, "in", list.stream().map(SysClubExamineRegister::getId).toList()) Cnd.where(ProcessInstance::getBusinessNo, "in", list.stream().map(SysClubExamineRegister::getId).toList())
@@ -92,11 +94,11 @@ public class ClubExamineApplyController {
@At @At
@SaCheckLogin @SaCheckLogin
public Result getClubUserNum(String clubId) { public Result getClubUserNum(String clubId, Integer year) {
if(StrUtil.isBlank(clubId)) { if(StrUtil.isBlank(clubId)) {
return Result.error("协会信息为空,请核查"); return Result.error("协会信息为空,请核查");
} }
List<NutMap> result = sysClubExamineService.getClubUserNum(clubId); List<NutMap> result = sysClubExamineService.getClubUserNum(clubId, year);
return Result.success(result); return Result.success(result);
} }
@@ -124,15 +126,20 @@ public class ClubExamineApplyController {
@At @At
@SaCheckLogin @SaCheckLogin
public Result getXghBkMoney(@Valid String clubId) { public Result getXghBkMoney(@Valid String clubId, Integer year) {
/*jf_club club = dao().fetch(jf_club.class, Cnd.where("club_id", "=", id)); OutlayManageClub club = dao.fetch(
Double total_quota = Double.valueOf(club.getTotal_quota());*/ OutlayManageClub.class,
return Result.success(0); Cnd.where("clubId", "=", clubId)
.and("year", "=", year)
.desc("year")
);
Number number = ObjectUtil.defaultIfNull(club.getTotalQuota(), 0);
return Result.success(number.floatValue());
} }
@At @At
@SaCheckLogin @SaCheckLogin
public Result getLasYearSurplus(String clubId) { public Result getLastYearSurplus(String clubId) {
if(StrUtil.isBlank(clubId)) { if(StrUtil.isBlank(clubId)) {
return Result.error("协会信息为空,请核查"); return Result.error("协会信息为空,请核查");
} }
@@ -190,6 +197,7 @@ public class ClubExamineApplyController {
Dict args = Dict.create(); Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode()); args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, reg); args.set(FlowConst.FORM_DATA, reg);
args.set("clubId", reg.getClubId());
ProcessInstance instance = flowEngine.startProcessInstanceByKey("XHNS", reg.getId(), SecurityUtil.getUserId(), args); ProcessInstance instance = flowEngine.startProcessInstanceByKey("XHNS", reg.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务 // 自动完成第一个申请任务
@@ -218,7 +226,18 @@ public class ClubExamineApplyController {
Dict dict = Dict.create(); Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId); dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode()); dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
dict.set("clubId", examineRegister.getClubId());
flowCommonService.executeTask(dict); flowCommonService.executeTask(dict);
return Result.success(); return Result.success();
} }
@At
@ApiOperation("获取上一年度的数据")
@SaCheckPermission("club.examine.apply")
public Result getLastData(String clubId, Integer year) {
if (year == null) {
year = DateUtil.thisYear();
}
return Result.success();
}
} }
@@ -53,30 +53,4 @@ public class ClubExamineClubAuditController {
Pagination<ClubExaminePageVo> pagination = sysClubExamineService.clubAuditPageData(pageForm); Pagination<ClubExaminePageVo> pagination = sysClubExamineService.clubAuditPageData(pageForm);
return Result.success(pagination); return Result.success(pagination);
} }
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("club.examine.clubAudit")
@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<String> schoolUnionApprovalLoginName = commonService.findUsersLoginNameByRoleCode(RoleConstant.SCHOOL_UNION_CLUB_ADMIN, Cnd.NEW());
assignments.addAll(schoolUnionApprovalLoginName);
}
bpmService.completeTask(approvalParam.getProcessInstanceTaskId(), approvalParam.getBpmTaskApprovalTypeEnum(), variables, assignments);
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("club.examine.clubAudit")
@SLog(tag = "协会管理系统-协会年审", msg = "会长撤回年度考核")
public Result revoke(@Valid String taskId) {
bpmService.revokeTask(taskId);
return Result.success();
}
} }
@@ -13,7 +13,7 @@ import java.util.List;
public interface SysClubExamineService extends BaseService<SysClubExamineRegister> { public interface SysClubExamineService extends BaseService<SysClubExamineRegister> {
List<NutMap> getClubUserNum(@Valid String clubId); List<NutMap> getClubUserNum(@Valid String clubId, Integer year);
List<NutMap> getJgUser(@Valid String clubId); List<NutMap> getJgUser(@Valid String clubId);
@@ -82,13 +82,11 @@ public class SysClubEvaluateServiceImpl extends BaseServiceImpl<SysClubEvaluate>
@Override @Override
public Pagination<ClubEvaluatePageVo> clubAuditPageData(ClubUserPageForm pageForm) { public Pagination<ClubEvaluatePageVo> clubAuditPageData(ClubUserPageForm pageForm) {
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
cnd.and("nd.nodeCode","=",20); cnd.and("t.taskName", "=", "ec81591d-da91-412a-90c9-df853dcef478");
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name(), RoleConstant.SCHOOL_UNION_CLUB_ADMIN.name())) { cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
cnd.and("ce.userId", "=", SecurityUtil.getUserId()); Sql sql = generateSql(pageForm, cnd);
} return listPageVO(pageForm, sql, ClubEvaluatePageVo.class);
Sql sql = generateSql(pageForm, cnd);
return listPageVO(pageForm, sql, ClubEvaluatePageVo.class);
} }
@Override @Override
@@ -3,13 +3,11 @@ package com.budwk.app.zhgh.club.service.impl;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination; import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.base.utils.PageUtil; import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum; import com.budwk.app.flow.enums.ProcessInstanceStateEnum;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.sys.services.SysDictService; import com.budwk.app.sys.services.SysDictService;
import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.AuthUtil;
@@ -29,199 +27,311 @@ import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json; import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap; import org.nutz.lang.util.NutMap;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
@IocBean(args = {"refer:dao"}) @IocBean(args = {"refer:dao"})
public class SysClubExamineServiceImpl extends BaseServiceImpl<SysClubExamineRegister> implements SysClubExamineService { public class SysClubExamineServiceImpl extends BaseServiceImpl<SysClubExamineRegister> implements SysClubExamineService {
@Inject @Inject
private SysDictService sysDictService; private SysDictService sysDictService;
@Inject
private SysClubService sysClubService;
@Inject public SysClubExamineServiceImpl(Dao dao) {
private SysClubService sysClubService; super(dao);
}
@Inject @Override
private BpmService bpmService; public List<NutMap> getClubUserNum(String clubId, Integer year) {
// 定义统计的用户状态类型
List<String> userStateList = List.of("在职", "退休");
List<NutMap> result = new ArrayList<>();
public SysClubExamineServiceImpl(Dao dao) { // 查询上一年度考核登记数据(用于获取年初人数)
super(dao); SysClubExamineRegister examineRegister = dao().fetch(SysClubExamineRegister.class,
} Cnd.where("year", "=", year - 1).and("clubId", "=", clubId));
@Override // 构建协会用户申请记录查询SQL(关联用户信息、流程实例)
public List<NutMap> getClubUserNum(String clubId) { Sql sql = Sqls.create("""
// List<Sys_dict> userType = sysDictService.getSubListByCode("USER_STATE"); SELECT
// List<Sys_dict> userStateList = userType.stream() cu.*,
// .filter(v -> v.getName().equals("在职") || v.getName().equals("在岗") || v.getName().equals("退休")) year(cu.applyDate) as applyYear,
// .toList(); u.userState,
// u.retireDate
// Sql sql = Sqls.create(""" FROM
// SELECT club_user_apply cu
// cu.*, LEFT JOIN sys_user u ON cu.userId = u.id
// u.userState LEFT JOIN wf_process_instance ins ON ins.businessNo = cu.id
// FROM $condition
// club_user cu """);
// LEFT JOIN sys_user u ON cu.userId = u.id Cnd cnd = Cnd.NEW();
// where cu.clubId = @clubId cnd.and("cu.clubId", "=", clubId);
// """).setParam("clubId", clubId); cnd.and("ins.state", "=", ProcessInstanceStateEnum.FINISHED.getCode());
// List<NutMap> userList = listMap(sql); cnd.groupBy("cu.clubId, cu.userId, cu.mode");
// List<NutMap> result = new ArrayList<>(); sql.setCondition(cnd);
// userStateList.forEach(v -> { List<NutMap> userList = listMap(sql);
// List<NutMap> personTypeUser = userList.stream().filter(u -> StrUtil.isNotBlank(u.getString("userState")) && u.getString("userState").equals(v.getName())).toList();
// NutMap nutMap = new NutMap();
// nutMap.addv("userState", v.getName());
// //获取今年年初人数
// int yearFirst = personTypeUser.stream().filter(u -> !u.getString("joinTime").substring(0, 4).equals(DateUtil.thisYear() + "") && StrUtil.isBlank(u.getString("changeTime"))).toList().size();
// nutMap.addv("yearFirstNum", yearFirst);
//
// //获取今年人数
// int thisYear = personTypeUser.stream().filter(u -> u.getString("joinTime").substring(0, 4).equals(DateUtil.thisYear() + "")).toList().size();
// nutMap.addv("yearAddNum", thisYear);
// //获取今年比去年减少了多少个人
// int yearEditNum = personTypeUser.stream().filter(u -> StrUtil.isNotBlank(u.getString("changeTime")) && u.getString("changeTime").substring(0, 4).equals(DateUtil.thisYear() + "") && !u.getBoolean("isNormal")).toList().size();
// nutMap.addv("yearEditNum", yearEditNum);
//
// //总人数
// int thisYearNum = personTypeUser.stream().filter(u -> StrUtil.isBlank(u.getString("changeTime"))).toList().size();
// nutMap.addv("thisYearNum", thisYearNum);
// result.add(nutMap);
// });
// return result;
return null;
}
@Override // 遍历在职/退休状态,分别统计人员变动数据
public List<NutMap> getJgUser(String clubId) { for (String userState : userStateList) {
Sql sql = Sqls.create(""" NutMap nutMap = new NutMap();
SELECT nutMap.addv("userState", userState);
cl.*,
u.username as userName,
u.loginname as loginName,
u.unitname as unitName,
u.mobile
FROM
club_user cl
LEFT JOIN `vw_user` u ON cl.userId = u.id
WHERE
cl.clubId = @clubId
AND NOT JSON_CONTAINS(cl.roleCode, '"CLUB_MEMBER"')
ORDER BY
CASE
WHEN JSON_CONTAINS(cl.roleCode, '"CLUB_PRESIDENT"') THEN 1
WHEN JSON_CONTAINS(cl.roleCode, '"CLUB_VICE_PRESIDENT"') THEN 2
WHEN JSON_CONTAINS(cl.roleCode, '"CLUB_SECRETARY"') THEN 3
WHEN JSON_CONTAINS(cl.roleCode, '"CLUB_VICE_SECRETARY"') THEN 4
WHEN JSON_CONTAINS(cl.roleCode, '"CLUB_MEMBER"') THEN 5
ELSE 99
END
""").setParam("clubId", clubId);
List<NutMap> listMap = listMap(sql);
for (NutMap nutMap : listMap) {
List<String> list = Json.fromJsonAsList(String.class, nutMap.getString("roleCode"));
String roleName = SysClubUserServiceImpl.convertRoleName(list);
nutMap.put("roleName", roleName);
nutMap.put("roleCode", list);
}
return listMap;
}
@Override // 根据用户状态匹配对应的人员类型集合
public SysClubExamineRegister doAdd(SysClubExamineRegister examineRegister, String incomeDetailed, String incomeCensus) { List<String> personTypeList = switch (userState) {
List<SysClubExamineRegisterDetailed> detailedList = Json.fromJsonAsList(SysClubExamineRegisterDetailed.class, incomeDetailed); case "在职" -> List.of("在职", "在岗");
List<JSONObject> incomeCensusList = Json.fromJsonAsList(JSONObject.class, incomeCensus); case "退休" -> List.of("退休", "退休【变号】");
examineRegister.setRegisterDate(DateUtil.now()); default -> new ArrayList<>();
examineRegister.setUserId(SecurityUtil.getUserId()); };
examineRegister.setIncomeCensus(incomeCensusList);
SysClubExamineRegister examineReg = dao().insert(examineRegister);
detailedList.forEach(v -> {
v.setRegisterId(examineRegister.getId());
});
dao().insert(detailedList);
return examineReg;
}
@Override // 过滤出符合当前人员类型的用户(非空判断避免NPE)
public SysClubExamineRegister doEdit(SysClubExamineRegister examineRegister, String incomeDetailed, String incomeCensus) { List<NutMap> personTypeUsers = userList.stream()
List<SysClubExamineRegisterDetailed> detailedList = Json.fromJsonAsList(SysClubExamineRegisterDetailed.class, incomeDetailed); .filter(u -> StrUtil.isNotBlank(u.getString("userState"))
List<JSONObject> incomeCensusList = Json.fromJsonAsList(JSONObject.class, incomeCensus); && personTypeList.contains(u.getString("userState")))
examineRegister.setRegisterDate(DateUtil.now()); .collect(Collectors.toList());
examineRegister.setIncomeCensus(incomeCensusList);
updateIgnoreNull(examineRegister);
dao().clear(SysClubExamineRegisterDetailed.class, Cnd.where("registerId", "=", examineRegister.getId()));
detailedList.forEach(v -> {
v.setRegisterId(examineRegister.getId());
});
insert(detailedList);
return examineRegister;
}
@Override // 初始化年末人数为0
public Pagination<ClubExaminePageVo> minePageData(ClubUserPageForm pageForm) { int thisYearNum = 0;
Cnd cnd = Cnd.NEW(); if (!Lang.isEmpty(personTypeUsers)) {
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) { // 统计年末人数:加入协会且无退出记录的用户数量
List<SysClub> myManageClub = sysClubService.getMyManageClub(); List<String> exitUserIds = personTypeUsers.stream()
cnd.and("info.clubId", "in", myManageClub.stream().map(SysClub::getId).toList()); .filter(u -> u.getInt("mode") == 0)
} .map(u -> u.getString("userId"))
Sql sql = Sqls.create(""" .toList();
SELECT
info.*,
u.username as concatPersonName,
sc.concatPersonMobile,
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
`sys_club_examine_register` info
LEFT JOIN sys_club sc ON sc.id = info.clubId
LEFT JOIN `vw_user` u ON u.id = sc.concatPerson
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.andEX("YEAR(info.registerDate)", "=", pageForm.getYear());
cnd.andEX("sc.id", "=", pageForm.getClubId());
cnd.and("info.userId", "=", SecurityUtil.getUserId());
cnd.groupBy("info.id"); thisYearNum = (int) personTypeUsers.stream()
cnd.desc("registerDate"); .filter(u -> u.getInt("mode") == 1)
sql.setCondition(cnd); .filter(u -> !exitUserIds.contains(u.getString("userId")))
return listPageVO(pageForm, sql, ClubExaminePageVo.class); .count();
} }
@Override // 统计今年退休人数:已入会且退休日期在本年度的用户
public Pagination<ClubExaminePageVo> clubAuditPageData(ClubUserPageForm pageForm) { int retireCount = (int) personTypeUsers.stream()
Cnd cnd = Cnd.NEW(); .filter(u -> u.getTime("retireDate") != null
cnd.and("nd.nodeCode","=",20); && u.getInt("mode") == 1
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name(), RoleConstant.SCHOOL_UNION_CLUB_ADMIN.name())) { && DateUtil.year(u.getTime("retireDate")) == year)
cnd.and("scer.userId", "=", SecurityUtil.getUserId()); .count();
}
Sql sql = generateSql(pageForm, cnd);
return listPageVO(pageForm, sql, ClubExaminePageVo.class);
}
@Override // 封装年初人数:从上一年度登记数据中获取,无数据则为0
public Pagination<ClubExaminePageVo> schoolAuditPageData(ClubUserPageForm pageForm) { if (Lang.isNotEmpty(examineRegister) && Lang.isNotEmpty(examineRegister.getChangeUserNum())) {
Cnd cnd = Cnd.NEW(); JSONObject uState = examineRegister.getChangeUserNum().stream()
cnd.and("t.taskName", "=", "ed4f6e9f-f0ea-4a73-ad57-bfcd8dd4d4bd"); .filter(c -> c.getStr("userState").equals(userState))
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); .findFirst()
Sql sql = generateSql(pageForm, cnd); .orElse(null);
return listPageVO(pageForm, sql, ClubExaminePageVo.class); nutMap.addv("yearFirstNum", Lang.isEmpty(uState) ? 0 : uState.getInt("thisYearNum"));
} } else {
nutMap.addv("yearFirstNum", 0);
}
// 统计年度增加相关数据
int joinThisYear = (int) personTypeUsers.stream()
.filter(u -> u.getInt("mode") == 1 && u.getInt("applyYear") == year)
.count();
int thisYearJoinAndRetire = (int) userList.stream()
.filter(u -> u.getInt("mode") == 1 && u.getInt("applyYear") == year
&& u.getTime("retireDate") != null
&& DateUtil.year(u.getTime("retireDate")) == year)
.count();
int beforeYearJoinAndRetire = (int) userList.stream()
.filter(u -> u.getInt("mode") == 1 && u.getInt("applyYear") == year
&& u.getTime("retireDate") != null
&& DateUtil.year(u.getTime("retireDate")) < year)
.count();
// 按用户状态封装年度增加人数
nutMap.addv("yearAddNum", "在职".equals(userState)
? joinThisYear + thisYearJoinAndRetire
: beforeYearJoinAndRetire + retireCount);
// 统计年度减少相关数据
int quitThisYear = (int) personTypeUsers.stream()
.filter(u -> u.getInt("mode") == 0 && u.getInt("applyYear") == year)
.count();
// 在职人员年度减少:退休人数+主动退出人数;退休人员仅统计主动退出
if ("在职".equals(userState)) {
int retireThisYear = (int) userList.stream()
.filter(u -> u.getTime("retireDate") != null
&& DateUtil.year(u.getTime("retireDate")) == year)
.count();
nutMap.addv("yearReduceNum", retireThisYear + quitThisYear);
} else {
nutMap.addv("yearReduceNum", quitThisYear);
}
// 封装年末人数
nutMap.addv("thisYearNum", thisYearNum);
result.add(nutMap);
}
return result;
}
@Override
public List<NutMap> getJgUser(String clubId) {
// 构建协会管理人员查询SQL(排除普通成员,按职务排序)
Sql sql = Sqls.create("""
SELECT
cl.*,
u.username as userName,
u.loginname as loginName,
u.unitname as unitName,
u.mobile
FROM
club_user cl
LEFT JOIN `vw_user` u ON cl.userId = u.id
WHERE
cl.clubId = @clubId
AND NOT JSON_CONTAINS(cl.roleCode, '"CLUB_MEMBER"')
ORDER BY
CASE
WHEN JSON_CONTAINS(cl.roleCode, '"CLUB_PRESIDENT"') THEN 1
WHEN JSON_CONTAINS(cl.roleCode, '"CLUB_VICE_PRESIDENT"') THEN 2
WHEN JSON_CONTAINS(cl.roleCode, '"CLUB_SECRETARY"') THEN 3
WHEN JSON_CONTAINS(cl.roleCode, '"CLUB_VICE_SECRETARY"') THEN 4
WHEN JSON_CONTAINS(cl.roleCode, '"CLUB_MEMBER"') THEN 5
ELSE 99
END
""").setParam("clubId", clubId);
// 执行查询并处理角色编码转换
List<NutMap> listMap = listMap(sql);
for (NutMap nutMap : listMap) {
String roleCodeStr = nutMap.getString("roleCode");
List<String> list = StrUtil.isBlank(roleCodeStr)
? new ArrayList<>()
: Json.fromJsonAsList(String.class, roleCodeStr);
String roleName = SysClubUserServiceImpl.convertRoleName(list);
nutMap.put("roleName", roleName);
nutMap.put("roleCode", list);
}
return listMap;
}
@Override
public SysClubExamineRegister doAdd(SysClubExamineRegister examineRegister, String incomeDetailed, String incomeCensus) {
// JSON转换为实体列表(空值判断避免转换异常)
List<SysClubExamineRegisterDetailed> detailedList = StrUtil.isNotBlank(incomeDetailed)
? Json.fromJsonAsList(SysClubExamineRegisterDetailed.class, incomeDetailed)
: new ArrayList<>();
List<JSONObject> incomeCensusList = StrUtil.isNotBlank(incomeCensus)
? Json.fromJsonAsList(JSONObject.class, incomeCensus)
: new ArrayList<>();
// 封装新增基础信息
examineRegister.setRegisterDate(DateUtil.now());
examineRegister.setUserId(SecurityUtil.getUserId());
examineRegister.setIncomeCensus(incomeCensusList);
// 插入主表并批量插入明细(设置关联ID)
SysClubExamineRegister examineReg = dao().insert(examineRegister);
detailedList.forEach(v -> v.setRegisterId(examineRegister.getId()));
if (!Lang.isEmpty(detailedList)) {
dao().insert(detailedList);
}
return examineReg;
}
@Override
public SysClubExamineRegister doEdit(SysClubExamineRegister examineRegister, String incomeDetailed, String incomeCensus) {
// JSON转换为实体列表(空值判断避免转换异常)
List<SysClubExamineRegisterDetailed> detailedList = StrUtil.isNotBlank(incomeDetailed)
? Json.fromJsonAsList(SysClubExamineRegisterDetailed.class, incomeDetailed)
: new ArrayList<>();
List<JSONObject> incomeCensusList = StrUtil.isNotBlank(incomeCensus)
? Json.fromJsonAsList(JSONObject.class, incomeCensus)
: new ArrayList<>();
// 封装编辑信息,更新主表(忽略空值)
examineRegister.setRegisterDate(DateUtil.now());
examineRegister.setIncomeCensus(incomeCensusList);
updateIgnoreNull(examineRegister);
// 清空原有明细,插入新明细(设置关联ID)
dao().clear(SysClubExamineRegisterDetailed.class, Cnd.where("registerId", "=", examineRegister.getId()));
detailedList.forEach(v -> v.setRegisterId(examineRegister.getId()));
if (!Lang.isEmpty(detailedList)) {
insert(detailedList);
}
return examineRegister;
}
@Override
public Pagination<ClubExaminePageVo> minePageData(ClubUserPageForm pageForm) {
Cnd cnd = Cnd.NEW();
// 非系统管理员,仅查询自己管理的协会(空集合判断避免in查询异常)
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
List<SysClub> myManageClub = sysClubService.getMyManageClub();
if (!Lang.isEmpty(myManageClub)) {
cnd.and("info.clubId", "in", myManageClub.stream().map(SysClub::getId).collect(Collectors.toList()));
} else {
// 无管理协会,返回空分页结果
return new Pagination<>(pageForm.getPageNumber(), pageForm.getPageSize(), 0, new ArrayList<>());
}
}
// 构建我的考核登记分页查询SQL
Sql sql = Sqls.create("""
SELECT
info.*,
u.username as concatPersonName,
sc.concatPersonMobile,
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
`sys_club_examine_register` info
LEFT JOIN sys_club sc ON sc.id = info.clubId
LEFT JOIN `vw_user` u ON u.id = sc.concatPerson
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
""");
// 构建基础分页查询条件
buildPageBaseCondition(cnd, pageForm, "info");
cnd.and("info.userId", "=", SecurityUtil.getUserId());
cnd.groupBy("info.id");
cnd.desc("registerDate");
sql.setCondition(cnd);
return listPageVO(pageForm, sql, ClubExaminePageVo.class);
}
@Override
public Pagination<ClubExaminePageVo> clubAuditPageData(ClubUserPageForm pageForm) {
Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "ed4f6e9f-f0ea-4a73-ad57-bfcd8dd4d4bd");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
Sql sql = generateSql(pageForm, cnd);
return listPageVO(pageForm, sql, ClubExaminePageVo.class);
}
@Override
public Pagination<ClubExaminePageVo> schoolAuditPageData(ClubUserPageForm pageForm) {
Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "ed4f6e9f-f0ea-4a73-ad57-bfcd8dd4d4bd");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
Sql sql = generateSql(pageForm, cnd);
return listPageVO(pageForm, sql, ClubExaminePageVo.class);
}
@Override @Override
public Pagination<ClubExaminePageVo> schoolLeaderAuditPageData(ClubUserPageForm pageForm) { public Pagination<ClubExaminePageVo> schoolLeaderAuditPageData(ClubUserPageForm pageForm) {
@@ -232,77 +342,106 @@ public class SysClubExamineServiceImpl extends BaseServiceImpl<SysClubExamineReg
return listPageVO(pageForm, sql, ClubExaminePageVo.class); return listPageVO(pageForm, sql, ClubExaminePageVo.class);
} }
@Override @Override
public ClubExamineVo findOne(String id) { public ClubExamineVo findOne(String id) {
Sql sql = Sqls.create(""" // 构建单条考核登记查询SQL(关联协会、联系人信息)
SELECT Sql sql = Sqls.create("""
scer.*, SELECT
u.username as concatPersonName, scer.*,
sc.concatPersonMobile u.username as concatPersonName,
FROM sc.concatPersonMobile
`sys_club_examine_register` scer FROM
LEFT JOIN sys_club sc ON sc.id = scer.clubId `sys_club_examine_register` scer
LEFT JOIN `vw_user` u ON u.id = sc.concatPerson LEFT JOIN sys_club sc ON sc.id = scer.clubId
WHERE scer.id = @id LEFT JOIN `vw_user` u ON u.id = sc.concatPerson
""").setParam("id", id); WHERE scer.id = @id
ClubExamineVo clubExamineVo = fetchVO(sql, ClubExamineVo.class); """).setParam("id", id);
List<SysClubExamineRegisterDetailed> detailedList = dao().query(SysClubExamineRegisterDetailed.class, Cnd.where("registerId", "=", id).asc("location")); // 查询主表数据并关联明细数据
clubExamineVo.setDetailedList(detailedList); ClubExamineVo clubExamineVo = fetchVO(sql, ClubExamineVo.class);
return clubExamineVo; if (Lang.isNotEmpty(clubExamineVo)) {
} List<SysClubExamineRegisterDetailed> detailedList = dao().query(SysClubExamineRegisterDetailed.class,
Cnd.where("registerId", "=", id).asc("location"));
clubExamineVo.setDetailedList(detailedList);
}
return clubExamineVo;
}
private Sql generateSql(ClubUserPageForm pageForm, Cnd cnd) { /**
Sql sql = Sqls.create(""" * 生成审核分页通用SQL
SELECT * @param pageForm 分页查询参数
info.*, * @param cnd 自定义查询条件
u.username as concatPersonName, * @return 构建后的Sql对象
club.concatPersonMobile, */
dict.name as typeName, private Sql generateSql(ClubUserPageForm pageForm, Cnd cnd) {
ins.id AS instanceId, // 构建审核通用分页查询SQL
ins.businessNo, Sql sql = Sqls.create("""
ins.state instanceState, SELECT
ins.variable instanceVariable, info.*,
ins.processDefineId instanceProcessDefineId, u.username as concatPersonName,
t.id taskId, club.concatPersonMobile,
t.taskName AS taskKey, dict.name as typeName,
t.displayName taskName, ins.id AS instanceId,
t.taskType, ins.businessNo,
t.performType taskPerformType, ins.state instanceState,
t.taskState, ins.variable instanceVariable,
t.finishTime, ins.processDefineId instanceProcessDefineId,
t.taskParentId, t.id taskId,
t.variable taskVariable, t.taskName AS taskKey,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName, t.displayName taskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke t.taskType,
FROM t.performType taskPerformType,
wf_process_task t t.taskState,
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId t.finishTime,
LEFT JOIN sys_club_examine_register info ON info.id = ins.businessNo t.taskParentId,
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id t.variable taskVariable,
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10 IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10 IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
LEFT JOIN sys_club club on club.id = info.clubId FROM
LEFT JOIN sys_dict dict ON dict.CODE = club.clubType wf_process_task t
LEFT JOIN `vw_user` u ON u.id = club.concatPerson LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
$condition LEFT JOIN sys_club_examine_register 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
LEFT JOIN sys_club club on club.id = info.clubId
LEFT JOIN sys_dict dict ON dict.CODE = club.clubType
LEFT JOIN `vw_user` u ON u.id = club.concatPerson
$condition
""");
// 构建基础分页查询条件
buildPageBaseCondition(cnd, pageForm, "info");
cnd.andEX("info.clubId", "=", pageForm.getClubId()); // 按审核状态过滤任务(已审核/待审核)
cnd.andEX("YEAR(info.registerDate)", "=", pageForm.getYear()); if (pageForm.getAudit()) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (pageForm.getAudit()) { // 处理排序:无自定义排序则按登记日期降序
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
} else { cnd.desc("registerDate");
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); } else {
} cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { }
cnd.desc("registerDate");
} else {
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
cnd.groupBy("t.id"); cnd.groupBy("t.id");
sql.setCondition(cnd); sql.setCondition(cnd);
return sql; return sql;
} }
/**
* 构建分页查询基础条件(年度、协会ID)
* @param cnd 条件对象
* @param pageForm 分页参数
* @param tableAlias 表别名
*/
private void buildPageBaseCondition(Cnd cnd, ClubUserPageForm pageForm, String tableAlias) {
if (pageForm.getYear() != null) {
cnd.andEX("YEAR(" + tableAlias + ".registerDate)", "=", pageForm.getYear());
}
if (StrUtil.isNotBlank(pageForm.getClubId())) {
cnd.andEX(tableAlias + ".clubId", "=", pageForm.getClubId());
}
}
} }
@@ -9,11 +9,11 @@ layout("/layouts/platform.html"){
<search @search="doSearch"> <search @search="doSearch">
<search-item label="年度"> <search-item label="年度">
<el-date-picker <el-date-picker
placeholder="请选择年度" placeholder="请选择年度"
type="year" type="year"
style="width: 100%" style="width: 100%"
v-model="pageForm.year" v-model="pageForm.year"
value-format="yyyy" value-format="yyyy"
></el-date-picker> ></el-date-picker>
</search-item> </search-item>
<search-item label="协会名称"> <search-item label="协会名称">
@@ -31,37 +31,33 @@ layout("/layouts/platform.html"){
<el-radio-button :label="false">未审核</el-radio-button> <el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group> </el-radio-group>
</table-tool> </table-tool>
<el-table :data="tableData" :size="tableSize"> <el-table :data="tableData">
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column> <el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column> <el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="协会编码" prop="clubCode" sortable show-overflow-tooltip></el-table-column> <el-table-column label="协会编码" prop="clubCode" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="协会类型" prop="typeName" sortable show-overflow-tooltip></el-table-column> <el-table-column label="协会类型" prop="typeName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="成立时间" prop="foundTime" sortable show-overflow-tooltip> <el-table-column label="成立时间" prop="foundTime" sortable show-overflow-tooltip>
<template slot-scope="{row}"> <template slot-scope="{row}">
<span>{{ $moment(row.foundTime).format('YYYY-MM-DD') }}</span> <span>{{ row.foundTime ? $moment(row.foundTime).format('YYYY-MM-DD') : '无' }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="年度" prop="applyTime" sortable show-overflow-tooltip> <el-table-column label="年度" prop="applyYear" sortable show-overflow-tooltip>
<template slot-scope="{row}"> <template slot-scope="{row}">
<span>{{ $moment(row.applyTime).format('YYYY') }}</span> <span>{{ $moment(row.applyTime).format('YYYY') }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="申请时间" prop="applyTime" sortable show-overflow-tooltip></el-table-column> <el-table-column label="申请时间" prop="applyTime" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="processInstanceNodeName" show-overflow-tooltip></el-table-column> <el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" width="300px"> <el-table-column label="流程状态" prop="instanceState" show-overflow-tooltip>
<template v-slot="{ row }">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="300">
<template slot-scope="{row}"> <template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button> <el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'" @click="openApproval(row)" size="mini" type="primary"> <el-button v-if="row.taskState === 10" @click="onAudit(row)" size="mini" type="primary">审核</el-button>
审核 <el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回</el-button>
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -69,21 +65,26 @@ layout("/layouts/platform.html"){
</el-card> </el-card>
<template #public> <template #public>
<evaluate-info ref="evaluateInfoRef"></evaluate-info> <evaluate-info ref="evaluateInfoRef">
<div v-if="showApprovalForm"> <div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div> <div class="process-title">
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px"> {{formData.taskName}}
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]"> </div>
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea> <el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
</el-form-item> class="flow-task-form">
</el-form> <el-form-item label="审批意见" prop="tf_opinion"
<el-row type="flex" justify="end"> :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-button plain @click="$refs.guava.index()">取消</el-button> <user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
<el-button type="danger" @click="doApproval('BACK')">退回</el-button> </el-form-item>
<el-button type="danger" @click="doApproval('REJECT')">拒绝</el-button> </el-form>
<el-button type="primary" @click="doApproval('PASS')">同意</el-button> <el-row type="flex" justify="end">
</el-row> <el-button @click="$refs.guava.index()" size="small">取消</el-button>
</div> <el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
</el-row>
</div>
</evaluate-info>
</template> </template>
</guava> </guava>
</div> </div>
@@ -93,6 +94,7 @@ layout("/layouts/platform.html"){
new Vue({ new Vue({
el: "#app", el: "#app",
mixins: [initTableMixins], mixins: [initTableMixins],
dicts: ["PROCESS_INSTANCE_STATE"],
data() { data() {
return { return {
pageForm: { pageForm: {
@@ -111,42 +113,47 @@ layout("/layouts/platform.html"){
methods: { methods: {
openView(row) { openView(row) {
this.$refs.guava.public(() => { this.$refs.guava.public(() => {
this.$refs.evaluateInfoRef.onOpen(row.id) this.$refs.evaluateInfoRef.onOpen(row)
this.showApprovalForm = false this.showApprovalForm = false
}) })
}, },
openApproval(row) { onAudit(row) {
this.$refs.guava.public(() => { this.$refs.guava.public(() => {
this.$refs.evaluateInfoRef.onOpen(row.id) this.formData = {
this.formData = row.approvalParam processTaskId: row.taskId,
this.showApprovalForm = true taskName: row.curTaskName
})
},
doApproval(approvalType) {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
} }
this.showApprovalForm = true
this.$refs.evaluateInfoRef.onOpen(row)
}) })
}, },
openRevoke(taskId) { handleTaskAction(val) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", { this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消",
type: "info" type: "info"
}).then(() => { }).then(() => {
this.$axios.post(loc() + "/revoke", { taskId }).then((res) => { this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) { if (res.code === 0) {
this.$message.success(res.msg) this.$message.success(res.msg)
this.doSearch() this.doSearch()
File diff suppressed because it is too large Load Diff
@@ -2,9 +2,7 @@
layout("/layouts/platform.html"){ layout("/layouts/platform.html"){
#--> #-->
<style> <style>
.left-span-label {
margin: 20px 0;
}
</style> </style>
<div id="app" v-cloak> <div id="app" v-cloak>
@@ -13,11 +11,12 @@ layout("/layouts/platform.html"){
<search @search="doSearch"> <search @search="doSearch">
<search-item label="年度"> <search-item label="年度">
<el-date-picker <el-date-picker
placeholder="请选择年度" placeholder="请选择年度"
type="year" type="year"
style="width: 100%" style="width: 100%"
v-model="pageForm.year" v-model="pageForm.year"
value-format="yyyy" value-format="yyyy"
@change="doSearch"
></el-date-picker> ></el-date-picker>
</search-item> </search-item>
<search-item label="协会名称"> <search-item label="协会名称">
@@ -35,7 +34,7 @@ layout("/layouts/platform.html"){
<el-radio-button :label="false">未审核</el-radio-button> <el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group> </el-radio-group>
</table-tool> </table-tool>
<el-table :data="tableData" :size="tableSize"> <el-table :data="tableData">
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column> <el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
<el-table-column label="年度" prop="year" sortable show-overflow-tooltip></el-table-column> <el-table-column label="年度" prop="year" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column> <el-table-column label="协会名称" prop="clubName" sortable show-overflow-tooltip></el-table-column>
@@ -45,21 +44,17 @@ layout("/layouts/platform.html"){
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="申请时间" prop="registerDate" sortable show-overflow-tooltip></el-table-column> <el-table-column label="申请时间" prop="registerDate" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="当前节点" prop="processInstanceNodeName" show-overflow-tooltip></el-table-column> <el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" width="300px"> <el-table-column label="流程状态" prop="instanceState" show-overflow-tooltip>
<template slot-scope="{row}"> <template v-slot="{ row }">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="300">
<template v-slot="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button> <el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.processInstanceTaskStatus==='ACTIVE'" @click="openApproval(row)" size="mini" type="primary"> <el-button v-if="row.taskState === 10" @click="onAudit(row)" size="mini" type="primary">审核</el-button>
审核 <el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回</el-button>
</el-button>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -67,21 +62,26 @@ layout("/layouts/platform.html"){
</el-card> </el-card>
<template #public> <template #public>
<examine-info ref="examineInfoRef"></examine-info> <examine-info ref="examineInfoRef">
<div v-if="showApprovalForm"> <div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div> <div class="process-title">
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px"> {{formData.taskName}}
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]"> </div>
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea> <el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
</el-form-item> class="flow-task-form">
</el-form> <el-form-item label="审批意见" prop="tf_opinion"
<el-row type="flex" justify="end"> :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-button plain @click="$refs.guava.index()">取消</el-button> <user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
<el-button type="danger" @click="doApproval('BACK')">退回</el-button> </el-form-item>
<el-button type="danger" @click="doApproval('REJECT')">拒绝</el-button> </el-form>
<el-button type="primary" @click="doApproval('PASS')">同意</el-button> <el-row type="flex" justify="end">
</el-row> <el-button @click="$refs.guava.index()" size="small">取消</el-button>
</div> <el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
</el-row>
</div>
</examine-info>
</template> </template>
</guava> </guava>
</div> </div>
@@ -109,42 +109,47 @@ layout("/layouts/platform.html"){
methods: { methods: {
openView(row) { openView(row) {
this.$refs.guava.public(() => { this.$refs.guava.public(() => {
this.$refs.examineInfoRef.onOpen(row.id) this.$refs.examineInfoRef.onOpen(row)
this.showApprovalForm = false this.showApprovalForm = false
}) })
}, },
openApproval(row) { onAudit(row) {
this.$refs.guava.public(() => { this.$refs.guava.public(() => {
this.$refs.examineInfoRef.onOpen(row.id) this.formData = {
this.formData = row.approvalParam processTaskId: row.taskId,
this.showApprovalForm = true taskName: row.curTaskName
})
},
doApproval(approvalType) {
this.formData.bpmTaskApprovalType = approvalType
this.$refs.approvalFormRef.validate((valid) => {
if (valid) {
this.$axios
.post(loc() + "/approval", {
approval: JSON.stringify(this.formData)
})
.then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
} }
this.showApprovalForm = true
this.$refs.examineInfoRef.onOpen(row)
}) })
}, },
openRevoke(taskId) { handleTaskAction(val) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", { this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消",
type: "info" type: "info"
}).then(() => { }).then(() => {
this.$axios.post(loc() + "/revoke", { taskId }).then((res) => { this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) { if (res.code === 0) {
this.$message.success(res.msg) this.$message.success(res.msg)
this.doSearch() this.doSearch()
@@ -16,15 +16,15 @@ const EXAMINE_INFO_COMPONENT = {
<file-preview :files="viewData.summaryFiles" complete_result></file-preview> <file-preview :files="viewData.summaryFiles" complete_result></file-preview>
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
<!-- <div class="process-title">协会成员变化情况</div>--> <div class="process-title">协会成员变化情况</div>
<!-- <el-table :data="viewData.changeUserNum" max-height="300">--> <el-table :data="viewData.changeUserNum" max-height="300">
<!-- <el-table-column label="序号" type="index" width="50"></el-table-column>--> <el-table-column label="序号" type="index" width="50"></el-table-column>
<!-- <el-table-column label="教职工类别" prop="userState"></el-table-column>--> <el-table-column label="教职工类别" prop="userState"></el-table-column>
<!-- <el-table-column label="年初人员" prop="yearFirstNum"></el-table-column>--> <el-table-column label="年初人员" prop="yearFirstNum"></el-table-column>
<!-- <el-table-column label="年度增加" prop="yearAddNum"></el-table-column>--> <el-table-column label="年度增加" prop="yearAddNum"></el-table-column>
<!-- <el-table-column label="年度减少" prop="yearEditNum"></el-table-column>--> <el-table-column label="年度减少" prop="yearReduceNum"></el-table-column>
<!-- <el-table-column label="年末人数" prop="thisYearNum"></el-table-column>--> <el-table-column label="年末人数" prop="thisYearNum"></el-table-column>
<!-- </el-table>--> </el-table>
<slot></slot> <slot></slot>
<snaker-chart ref="snakerChartRef"></snaker-chart> <snaker-chart ref="snakerChartRef"></snaker-chart>
@@ -43,7 +43,7 @@ const EXAMINE_INFO_COMPONENT = {
<div class="process-title">下一年度活动计划</div> <div class="process-title">下一年度活动计划</div>
<el-table :data="viewData.plans" max-height="300"> <el-table :data="viewData.plans" max-height="300">
<el-table-column label="序号" type="index" width="50"></el-table-column> <el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column label="活动时间" prop="activityTime"></el-table-column> <!--<el-table-column label="活动时间" prop="activityTime"></el-table-column>-->
<el-table-column label="活动主题/赛事名称" prop="activityName" show-overflow-tooltip></el-table-column> <el-table-column label="活动主题/赛事名称" prop="activityName" show-overflow-tooltip></el-table-column>
<el-table-column label="活动/赛事主办单位" prop="activityUnit" show-overflow-tooltip></el-table-column> <el-table-column label="活动/赛事主办单位" prop="activityUnit" show-overflow-tooltip></el-table-column>
<el-table-column label="活动地点" prop="activityAddress" show-overflow-tooltip></el-table-column> <el-table-column label="活动地点" prop="activityAddress" show-overflow-tooltip></el-table-column>
@@ -56,23 +56,22 @@ const EXAMINE_INFO_COMPONENT = {
<el-table-column label="日期" prop="date"></el-table-column> <el-table-column label="日期" prop="date"></el-table-column>
<el-table-column label="项目内容" prop="content"></el-table-column> <el-table-column label="项目内容" prop="content"></el-table-column>
<el-table-column label="收入类型" prop="incomeType"></el-table-column> <el-table-column label="收入类型" prop="incomeType"></el-table-column>
<el-table-column label="金额(元)" prop="money"></el-table-column> <el-table-column label="年初余额" prop="qcMoney"></el-table-column>
<!-- <el-table-column label="年初余额" prop="qcMoney"></el-table-column>--> <el-table-column label="收入" prop="income"></el-table-column>
<!-- <el-table-column label="收入" prop="income"></el-table-column>--> <el-table-column label="支出" prop="expend"></el-table-column>
<!-- <el-table-column label="支出" prop="expend"></el-table-column>--> <el-table-column label="年度结余" prop="qmMoney"></el-table-column>
<!-- <el-table-column label="年度结余" prop="qmMoney"></el-table-column>-->
<el-table-column label="备注" prop="notes"></el-table-column> <el-table-column label="备注" prop="notes"></el-table-column>
</el-table> </el-table>
<!-- <div class="process-title">统计</div>--> <div class="process-title">统计</div>
<!-- <el-table v-if="viewData" :data="viewData.incomeCensus" max-height="300">--> <el-table v-if="viewData" :data="viewData.incomeCensus" max-height="300">
<!-- <el-table-column label="去年年度结余" prop="lasYearSurplus"></el-table-column>--> <el-table-column label="去年年度结余" prop="lastYearSurplus"></el-table-column>
<!-- <el-table-column label="会费收入" prop="income"></el-table-column>--> <el-table-column label="会费收入" prop="income"></el-table-column>
<!-- <el-table-column label="校工会拨款" prop="allocate"></el-table-column>--> <el-table-column label="校工会拨款" prop="allocate"></el-table-column>
<!-- <el-table-column label="社会赞助" prop="support"></el-table-column>--> <el-table-column label="社会赞助" prop="support"></el-table-column>
<!-- <el-table-column label="年度总支出" prop="totalExpend"></el-table-column>--> <el-table-column label="年度总支出" prop="totalExpend"></el-table-column>
<!-- <el-table-column label="年度结余" prop="surplus">--> <el-table-column label="年度结余" prop="surplus">
<!-- </el-table-column>--> </el-table-column>
<!-- </el-table>--> </el-table>
</el-tab-pane> </el-tab-pane>
<el-tab-pane name="4" label="协会成员"> <el-tab-pane name="4" label="协会成员">
<div class="process-title">协会成员</div> <div class="process-title">协会成员</div>
@@ -145,7 +144,8 @@ const EXAMINE_INFO_COMPONENT = {
}, },
async getClubUserNum(clubId) { async getClubUserNum(clubId) {
const resp = await this.$axios.post("/platform/club/examine/apply/getClubUserNum", { const resp = await this.$axios.post("/platform/club/examine/apply/getClubUserNum", {
clubId: clubId clubId: clubId,
year: this.row.year
}) })
this.$set(this.viewData, "changeUserNum", resp.data) this.$set(this.viewData, "changeUserNum", resp.data)
}, },