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();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, evaluate);
args.set("clubId", evaluate.getClubId());
ProcessInstance instance = flowEngine.startProcessInstanceByKey("XHPY", evaluate.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
@@ -106,6 +107,7 @@ public class ClubEvaluateApplyController {
Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
dict.set("clubId", clubEvaluate.getClubId());
flowCommonService.executeTask(dict);
return Result.success();
}
@@ -38,15 +38,9 @@ import java.util.Map;
@At("/platform/club/evaluate/clubAudit")
public class ClubEvaluateClubAuditController {
@Inject
private CommonService commonService;
@Inject
private SysClubEvaluateService sysClubEvaluateService;
@Inject
private BpmService bpmService;
@At("")
@Ok("beetl:/platform/zhgh/club/evaluate/clubAudit/index.html")
@SaCheckPermission("club.evaluate.clubAudit")
@@ -59,30 +53,4 @@ public class ClubEvaluateClubAuditController {
Pagination<ClubEvaluatePageVo> pagination = sysClubEvaluateService.clubAuditPageData(pageForm);
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.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
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.service.SysClubExamineService;
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 org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
@@ -67,14 +69,14 @@ public class ClubExamineApplyController {
@At
@SaCheckLogin
public Result getCount(String id, Integer year) {
if(StrUtil.isBlank(id)) {
public Result getCount(String id, Integer year, String clubId) {
if(StrUtil.isBlank(clubId)) {
return Result.error("协会信息为空,请核查");
}
if(year == null) {
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(
ProcessInstance.class,
Cnd.where(ProcessInstance::getBusinessNo, "in", list.stream().map(SysClubExamineRegister::getId).toList())
@@ -92,11 +94,11 @@ public class ClubExamineApplyController {
@At
@SaCheckLogin
public Result getClubUserNum(String clubId) {
public Result getClubUserNum(String clubId, Integer year) {
if(StrUtil.isBlank(clubId)) {
return Result.error("协会信息为空,请核查");
}
List<NutMap> result = sysClubExamineService.getClubUserNum(clubId);
List<NutMap> result = sysClubExamineService.getClubUserNum(clubId, year);
return Result.success(result);
}
@@ -124,15 +126,20 @@ public class ClubExamineApplyController {
@At
@SaCheckLogin
public Result getXghBkMoney(@Valid String clubId) {
/*jf_club club = dao().fetch(jf_club.class, Cnd.where("club_id", "=", id));
Double total_quota = Double.valueOf(club.getTotal_quota());*/
return Result.success(0);
public Result getXghBkMoney(@Valid String clubId, Integer year) {
OutlayManageClub club = dao.fetch(
OutlayManageClub.class,
Cnd.where("clubId", "=", clubId)
.and("year", "=", year)
.desc("year")
);
Number number = ObjectUtil.defaultIfNull(club.getTotalQuota(), 0);
return Result.success(number.floatValue());
}
@At
@SaCheckLogin
public Result getLasYearSurplus(String clubId) {
public Result getLastYearSurplus(String clubId) {
if(StrUtil.isBlank(clubId)) {
return Result.error("协会信息为空,请核查");
}
@@ -190,6 +197,7 @@ public class ClubExamineApplyController {
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, reg);
args.set("clubId", reg.getClubId());
ProcessInstance instance = flowEngine.startProcessInstanceByKey("XHNS", reg.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
@@ -218,7 +226,18 @@ public class ClubExamineApplyController {
Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
dict.set("clubId", examineRegister.getClubId());
flowCommonService.executeTask(dict);
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);
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> {
List<NutMap> getClubUserNum(@Valid String clubId);
List<NutMap> getClubUserNum(@Valid String clubId, Integer year);
List<NutMap> getJgUser(@Valid String clubId);
@@ -82,13 +82,11 @@ public class SysClubEvaluateServiceImpl extends BaseServiceImpl<SysClubEvaluate>
@Override
public Pagination<ClubEvaluatePageVo> clubAuditPageData(ClubUserPageForm pageForm) {
Cnd cnd = Cnd.NEW();
cnd.and("nd.nodeCode","=",20);
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name(), RoleConstant.SCHOOL_UNION_CLUB_ADMIN.name())) {
cnd.and("ce.userId", "=", SecurityUtil.getUserId());
}
Sql sql = generateSql(pageForm, cnd);
return listPageVO(pageForm, sql, ClubEvaluatePageVo.class);
Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "ec81591d-da91-412a-90c9-df853dcef478");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
Sql sql = generateSql(pageForm, cnd);
return listPageVO(pageForm, sql, ClubEvaluatePageVo.class);
}
@Override
@@ -3,13 +3,11 @@ package com.budwk.app.zhgh.club.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum;
import com.budwk.app.bpm.service.BpmService;
import com.budwk.app.flow.enums.ProcessInstanceStateEnum;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.sys.services.SysDictService;
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.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@IocBean(args = {"refer:dao"})
public class SysClubExamineServiceImpl extends BaseServiceImpl<SysClubExamineRegister> implements SysClubExamineService {
@Inject
private SysDictService sysDictService;
@Inject
private SysDictService sysDictService;
@Inject
private SysClubService sysClubService;
@Inject
private SysClubService sysClubService;
public SysClubExamineServiceImpl(Dao dao) {
super(dao);
}
@Inject
private BpmService bpmService;
@Override
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
public List<NutMap> getClubUserNum(String clubId) {
// List<Sys_dict> userType = sysDictService.getSubListByCode("USER_STATE");
// List<Sys_dict> userStateList = userType.stream()
// .filter(v -> v.getName().equals("在职") || v.getName().equals("在岗") || v.getName().equals("退休"))
// .toList();
//
// Sql sql = Sqls.create("""
// SELECT
// cu.*,
// u.userState
// FROM
// club_user cu
// LEFT JOIN sys_user u ON cu.userId = u.id
// where cu.clubId = @clubId
// """).setParam("clubId", clubId);
// List<NutMap> userList = listMap(sql);
// List<NutMap> result = new ArrayList<>();
// userStateList.forEach(v -> {
// 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;
}
// 构建协会用户申请记录查询SQL(关联用户信息、流程实例)
Sql sql = Sqls.create("""
SELECT
cu.*,
year(cu.applyDate) as applyYear,
u.userState,
u.retireDate
FROM
club_user_apply cu
LEFT JOIN sys_user u ON cu.userId = u.id
LEFT JOIN wf_process_instance ins ON ins.businessNo = cu.id
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("cu.clubId", "=", clubId);
cnd.and("ins.state", "=", ProcessInstanceStateEnum.FINISHED.getCode());
cnd.groupBy("cu.clubId, cu.userId, cu.mode");
sql.setCondition(cnd);
List<NutMap> userList = listMap(sql);
@Override
public List<NutMap> getJgUser(String clubId) {
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) {
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;
}
// 遍历在职/退休状态,分别统计人员变动数据
for (String userState : userStateList) {
NutMap nutMap = new NutMap();
nutMap.addv("userState", userState);
@Override
public SysClubExamineRegister doAdd(SysClubExamineRegister examineRegister, String incomeDetailed, String incomeCensus) {
List<SysClubExamineRegisterDetailed> detailedList = Json.fromJsonAsList(SysClubExamineRegisterDetailed.class, incomeDetailed);
List<JSONObject> incomeCensusList = Json.fromJsonAsList(JSONObject.class, incomeCensus);
examineRegister.setRegisterDate(DateUtil.now());
examineRegister.setUserId(SecurityUtil.getUserId());
examineRegister.setIncomeCensus(incomeCensusList);
SysClubExamineRegister examineReg = dao().insert(examineRegister);
detailedList.forEach(v -> {
v.setRegisterId(examineRegister.getId());
});
dao().insert(detailedList);
return examineReg;
}
// 根据用户状态匹配对应的人员类型集合
List<String> personTypeList = switch (userState) {
case "在职" -> List.of("在职", "在岗");
case "退休" -> List.of("退休", "退休【变号】");
default -> new ArrayList<>();
};
@Override
public SysClubExamineRegister doEdit(SysClubExamineRegister examineRegister, String incomeDetailed, String incomeCensus) {
List<SysClubExamineRegisterDetailed> detailedList = Json.fromJsonAsList(SysClubExamineRegisterDetailed.class, incomeDetailed);
List<JSONObject> incomeCensusList = Json.fromJsonAsList(JSONObject.class, incomeCensus);
examineRegister.setRegisterDate(DateUtil.now());
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;
}
// 过滤出符合当前人员类型的用户(非空判断避免NPE)
List<NutMap> personTypeUsers = userList.stream()
.filter(u -> StrUtil.isNotBlank(u.getString("userState"))
&& personTypeList.contains(u.getString("userState")))
.collect(Collectors.toList());
@Override
public Pagination<ClubExaminePageVo> minePageData(ClubUserPageForm pageForm) {
Cnd cnd = Cnd.NEW();
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
List<SysClub> myManageClub = sysClubService.getMyManageClub();
cnd.and("info.clubId", "in", myManageClub.stream().map(SysClub::getId).toList());
}
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
""");
cnd.andEX("YEAR(info.registerDate)", "=", pageForm.getYear());
cnd.andEX("sc.id", "=", pageForm.getClubId());
cnd.and("info.userId", "=", SecurityUtil.getUserId());
// 初始化年末人数为0
int thisYearNum = 0;
if (!Lang.isEmpty(personTypeUsers)) {
// 统计年末人数:加入协会且无退出记录的用户数量
List<String> exitUserIds = personTypeUsers.stream()
.filter(u -> u.getInt("mode") == 0)
.map(u -> u.getString("userId"))
.toList();
cnd.groupBy("info.id");
cnd.desc("registerDate");
sql.setCondition(cnd);
return listPageVO(pageForm, sql, ClubExaminePageVo.class);
}
thisYearNum = (int) personTypeUsers.stream()
.filter(u -> u.getInt("mode") == 1)
.filter(u -> !exitUserIds.contains(u.getString("userId")))
.count();
}
@Override
public Pagination<ClubExaminePageVo> clubAuditPageData(ClubUserPageForm pageForm) {
Cnd cnd = Cnd.NEW();
cnd.and("nd.nodeCode","=",20);
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name(), RoleConstant.SCHOOL_UNION_CLUB_ADMIN.name())) {
cnd.and("scer.userId", "=", SecurityUtil.getUserId());
}
Sql sql = generateSql(pageForm, cnd);
return listPageVO(pageForm, sql, ClubExaminePageVo.class);
}
// 统计今年退休人数:已入会且退休日期在本年度的用户
int retireCount = (int) personTypeUsers.stream()
.filter(u -> u.getTime("retireDate") != null
&& u.getInt("mode") == 1
&& DateUtil.year(u.getTime("retireDate")) == year)
.count();
@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);
}
// 封装年初人数:从上一年度登记数据中获取,无数据则为0
if (Lang.isNotEmpty(examineRegister) && Lang.isNotEmpty(examineRegister.getChangeUserNum())) {
JSONObject uState = examineRegister.getChangeUserNum().stream()
.filter(c -> c.getStr("userState").equals(userState))
.findFirst()
.orElse(null);
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
public Pagination<ClubExaminePageVo> schoolLeaderAuditPageData(ClubUserPageForm pageForm) {
@@ -232,77 +342,106 @@ public class SysClubExamineServiceImpl extends BaseServiceImpl<SysClubExamineReg
return listPageVO(pageForm, sql, ClubExaminePageVo.class);
}
@Override
public ClubExamineVo findOne(String id) {
Sql sql = Sqls.create("""
SELECT
scer.*,
u.username as concatPersonName,
sc.concatPersonMobile
FROM
`sys_club_examine_register` scer
LEFT JOIN sys_club sc ON sc.id = scer.clubId
LEFT JOIN `vw_user` u ON u.id = sc.concatPerson
WHERE scer.id = @id
""").setParam("id", id);
ClubExamineVo clubExamineVo = fetchVO(sql, ClubExamineVo.class);
List<SysClubExamineRegisterDetailed> detailedList = dao().query(SysClubExamineRegisterDetailed.class, Cnd.where("registerId", "=", id).asc("location"));
clubExamineVo.setDetailedList(detailedList);
return clubExamineVo;
}
@Override
public ClubExamineVo findOne(String id) {
// 构建单条考核登记查询SQL(关联协会、联系人信息)
Sql sql = Sqls.create("""
SELECT
scer.*,
u.username as concatPersonName,
sc.concatPersonMobile
FROM
`sys_club_examine_register` scer
LEFT JOIN sys_club sc ON sc.id = scer.clubId
LEFT JOIN `vw_user` u ON u.id = sc.concatPerson
WHERE scer.id = @id
""").setParam("id", id);
// 查询主表数据并关联明细数据
ClubExamineVo clubExamineVo = fetchVO(sql, ClubExamineVo.class);
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("""
SELECT
info.*,
u.username as concatPersonName,
club.concatPersonMobile,
dict.name as typeName,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
FROM
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN 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
""");
/**
* 生成审核分页通用SQL
* @param pageForm 分页查询参数
* @param cnd 自定义查询条件
* @return 构建后的Sql对象
*/
private Sql generateSql(ClubUserPageForm pageForm, Cnd cnd) {
// 构建审核通用分页查询SQL
Sql sql = Sqls.create("""
SELECT
info.*,
u.username as concatPersonName,
club.concatPersonMobile,
dict.name as typeName,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
FROM
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN 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()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.desc("registerDate");
} 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");
sql.setCondition(cnd);
return sql;
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
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-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
<search-item label="协会名称">
@@ -31,37 +31,33 @@ layout("/layouts/platform.html"){
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</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 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="typeName" sortable show-overflow-tooltip></el-table-column>
<el-table-column label="成立时间" prop="foundTime" sortable show-overflow-tooltip>
<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>
</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}">
<span>{{ $moment(row.applyTime).format('YYYY') }}</span>
</template>
</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="操作" width="300px">
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<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}">
<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>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
</el-button>
<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>
</template>
</el-table-column>
</el-table>
@@ -69,21 +65,26 @@ layout("/layouts/platform.html"){
</el-card>
<template #public>
<evaluate-info ref="evaluateInfoRef"></evaluate-info>
<div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval('BACK')">退回</el-button>
<el-button type="danger" @click="doApproval('REJECT')">拒绝</el-button>
<el-button type="primary" @click="doApproval('PASS')">同意</el-button>
</el-row>
</div>
<evaluate-info ref="evaluateInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
<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>
</guava>
</div>
@@ -93,6 +94,7 @@ layout("/layouts/platform.html"){
new Vue({
el: "#app",
mixins: [initTableMixins],
dicts: ["PROCESS_INSTANCE_STATE"],
data() {
return {
pageForm: {
@@ -111,42 +113,47 @@ layout("/layouts/platform.html"){
methods: {
openView(row) {
this.$refs.guava.public(() => {
this.$refs.evaluateInfoRef.onOpen(row.id)
this.$refs.evaluateInfoRef.onOpen(row)
this.showApprovalForm = false
})
},
openApproval(row) {
onAudit(row) {
this.$refs.guava.public(() => {
this.$refs.evaluateInfoRef.onOpen(row.id)
this.formData = row.approvalParam
this.showApprovalForm = true
})
},
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.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
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("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post(loc() + "/revoke", { taskId }).then((res) => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
File diff suppressed because it is too large Load Diff
@@ -2,9 +2,7 @@
layout("/layouts/platform.html"){
#-->
<style>
.left-span-label {
margin: 20px 0;
}
</style>
<div id="app" v-cloak>
@@ -13,11 +11,12 @@ layout("/layouts/platform.html"){
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
@change="doSearch"
></el-date-picker>
</search-item>
<search-item label="协会名称">
@@ -35,7 +34,7 @@ layout("/layouts/platform.html"){
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</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 label="年度" prop="year" 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>
</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="操作" width="300px">
<template slot-scope="{row}">
<el-table-column label="当前节点" prop="curTaskName" show-overflow-tooltip></el-table-column>
<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 v-slot="{row}">
<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>
<el-button
v-if="row.processInstanceTaskStatus==='COMPLETE' && !row.nextTaskIsComplete"
@click="openRevoke(row.processInstanceTaskId)"
size="mini"
type="danger"
>
撤回
</el-button>
<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>
</template>
</el-table-column>
</el-table>
@@ -67,21 +62,26 @@ layout("/layouts/platform.html"){
</el-card>
<template #public>
<examine-info ref="examineInfoRef"></examine-info>
<div v-if="showApprovalForm">
<div class="process-title">{{formData.processInstanceNodeName}}</div>
<el-form :model="formData" ref="approvalFormRef" label-position="left" label-width="80px">
<el-form-item label="审核意见" prop="approvalOpinion" :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button plain @click="$refs.guava.index()">取消</el-button>
<el-button type="danger" @click="doApproval('BACK')">退回</el-button>
<el-button type="danger" @click="doApproval('REJECT')">拒绝</el-button>
<el-button type="primary" @click="doApproval('PASS')">同意</el-button>
</el-row>
</div>
<examine-info ref="examineInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
<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>
</guava>
</div>
@@ -109,42 +109,47 @@ layout("/layouts/platform.html"){
methods: {
openView(row) {
this.$refs.guava.public(() => {
this.$refs.examineInfoRef.onOpen(row.id)
this.$refs.examineInfoRef.onOpen(row)
this.showApprovalForm = false
})
},
openApproval(row) {
onAudit(row) {
this.$refs.guava.public(() => {
this.$refs.examineInfoRef.onOpen(row.id)
this.formData = row.approvalParam
this.showApprovalForm = true
})
},
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.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
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("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post(loc() + "/revoke", { taskId }).then((res) => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
@@ -16,15 +16,15 @@ const EXAMINE_INFO_COMPONENT = {
<file-preview :files="viewData.summaryFiles" complete_result></file-preview>
</el-descriptions-item>
</el-descriptions>
<!-- <div class="process-title">协会成员变化情况</div>-->
<!-- <el-table :data="viewData.changeUserNum" max-height="300">-->
<!-- <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="yearFirstNum"></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="thisYearNum"></el-table-column>-->
<!-- </el-table>-->
<div class="process-title">协会成员变化情况</div>
<el-table :data="viewData.changeUserNum" max-height="300">
<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="yearFirstNum"></el-table-column>
<el-table-column label="年度增加" prop="yearAddNum"></el-table-column>
<el-table-column label="年度减少" prop="yearReduceNum"></el-table-column>
<el-table-column label="年末人数" prop="thisYearNum"></el-table-column>
</el-table>
<slot></slot>
<snaker-chart ref="snakerChartRef"></snaker-chart>
@@ -43,7 +43,7 @@ const EXAMINE_INFO_COMPONENT = {
<div class="process-title">下一年度活动计划</div>
<el-table :data="viewData.plans" max-height="300">
<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="activityUnit" 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="content"></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="income"></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="qcMoney"></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="qmMoney"></el-table-column>
<el-table-column label="备注" prop="notes"></el-table-column>
</el-table>
<!-- <div class="process-title">统计</div>-->
<!-- <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="income"></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="totalExpend"></el-table-column>-->
<!-- <el-table-column label="年度结余" prop="surplus">-->
<!-- </el-table-column>-->
<!-- </el-table>-->
<div class="process-title">统计</div>
<el-table v-if="viewData" :data="viewData.incomeCensus" max-height="300">
<el-table-column label="去年年度结余" prop="lastYearSurplus"></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="support"></el-table-column>
<el-table-column label="年度总支出" prop="totalExpend"></el-table-column>
<el-table-column label="年度结余" prop="surplus">
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane name="4" label="协会成员">
<div class="process-title">协会成员</div>
@@ -145,7 +144,8 @@ const EXAMINE_INFO_COMPONENT = {
},
async getClubUserNum(clubId) {
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)
},