This commit is contained in:
2026-04-03 17:32:05 +08:00
12 changed files with 235 additions and 14 deletions
@@ -1,7 +1,9 @@
package com.budwk.app.zhgh.club.controller.infoManage; package com.budwk.app.zhgh.club.controller.infoManage;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.annotation.SLog;
@@ -16,11 +18,13 @@ import com.budwk.app.sys.services.SysRoleService;
import com.budwk.app.sys.services.SysUserService; import com.budwk.app.sys.services.SysUserService;
import com.budwk.app.sys.views.View_user; import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService; import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope; import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope;
import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpActivity; import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpActivity;
import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpUser; import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpUser;
import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpUserCourse; import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpUserCourse;
import com.budwk.app.zhgh.club.model.ClubPayRecord;
import com.budwk.app.zhgh.club.model.ClubUser; import com.budwk.app.zhgh.club.model.ClubUser;
import com.budwk.app.zhgh.club.model.SysClub; import com.budwk.app.zhgh.club.model.SysClub;
import com.budwk.app.zhgh.club.param.ClubUserPageForm; import com.budwk.app.zhgh.club.param.ClubUserPageForm;
@@ -307,6 +311,44 @@ public class ClubInfoManageController {
clubUser.setRoleCode(List.of(roleCode)); clubUser.setRoleCode(List.of(roleCode));
} }
dao.insertOrUpdate(clubUser); dao.insertOrUpdate(clubUser);
ClubPayRecord payRecord = dao.fetch(
ClubPayRecord.class,
Cnd.where(ClubPayRecord::getClubId, "=", clubId)
.and(ClubPayRecord::getUserId, "=", user)
.and(ClubPayRecord::getYear, "=", DateUtil.thisYear())
);
if (payRecord == null) {
ClubPayRecord record = new ClubPayRecord();
record.setClubId(clubId);
record.setUserId(user);
record.setYear(DateUtil.thisYear());
record.setPayed(payed != null ? payed : false);
JSONObject log = new JSONObject();
log.set("operatorUserId", SecurityUtil.getUserId());
log.set("operatorUserName", SecurityUtil.getUserUsername());
log.set("operatorTime", DateUtil.now());
log.set("operatorType", "录入成员");
log.set("oldValue", null);
log.set("newValue", payed != null ? payed : false);
record.setOperateLogs(List.of(log));
dao.insert(record);
} else {
payRecord.setPayed(payed != null ? payed : false);
JSONObject log = new JSONObject();
log.set("operatorUserId", SecurityUtil.getUserId());
log.set("operatorUserName", SecurityUtil.getUserUsername());
log.set("operatorTime", DateUtil.now());
log.set("operatorType", "录入成员");
log.set("oldValue", payRecord.getPayed());
log.set("newValue", payed != null ? payed : false);
payRecord.setOperateLogs(List.of(log));
dao.update(payRecord);
}
} }
clubUserService.clubUser2Scope(clubId, Arrays.asList(users)); clubUserService.clubUser2Scope(clubId, Arrays.asList(users));
@@ -383,6 +425,46 @@ public class ClubInfoManageController {
if(Lang.isNotEmpty(clubUserList)) { if(Lang.isNotEmpty(clubUserList)) {
clubUserService.clubUser2Scope(businessId, clubUserList.stream().map(ClubUser::getUserId).toList()); clubUserService.clubUser2Scope(businessId, clubUserList.stream().map(ClubUser::getUserId).toList());
for (ClubUser cUser : clubUserList) {
ClubPayRecord payRecord = dao.fetch(
ClubPayRecord.class,
Cnd.where(ClubPayRecord::getClubId, "=", businessId)
.and(ClubPayRecord::getUserId, "=", cUser.getUserId())
.and(ClubPayRecord::getYear, "=", DateUtil.thisYear())
);
if (payRecord == null) {
ClubPayRecord record = new ClubPayRecord();
record.setClubId(businessId);
record.setUserId(cUser.getUserId());
record.setYear(DateUtil.thisYear());
record.setPayed(false);
JSONObject log = new JSONObject();
log.set("operatorUserId", SecurityUtil.getUserId());
log.set("operatorUserName", SecurityUtil.getUserUsername());
log.set("operatorTime", DateUtil.now());
log.set("operatorType", "导入成员");
log.set("oldValue", null);
log.set("newValue", false);
record.setOperateLogs(List.of(log));
dao.insert(record);
} else {
payRecord.setPayed(false);
JSONObject log = new JSONObject();
log.set("operatorUserId", SecurityUtil.getUserId());
log.set("operatorUserName", SecurityUtil.getUserUsername());
log.set("operatorTime", DateUtil.now());
log.set("operatorType", "导入成员");
log.set("oldValue", payRecord.getPayed());
log.set("newValue", false);
payRecord.setOperateLogs(List.of(log));
dao.update(payRecord);
}
}
} }
//如果有错误数据就返回给前端 //如果有错误数据就返回给前端
@@ -6,13 +6,17 @@ 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.annotation.SLog; import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination; import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm; import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result; import com.budwk.app.base.result.Result;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.club.model.ClubPayRecord; import com.budwk.app.zhgh.club.model.ClubPayRecord;
import com.budwk.app.zhgh.club.model.ClubUserApply; import com.budwk.app.zhgh.club.model.ClubUserApply;
import com.budwk.app.zhgh.club.model.SysClub;
import com.budwk.app.zhgh.club.service.ClubPayRecordService; import com.budwk.app.zhgh.club.service.ClubPayRecordService;
import com.budwk.app.zhgh.club.service.SysClubService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -51,6 +55,9 @@ public class ClubPayRecordController {
@Inject @Inject
private ClubPayRecordService payRecordService; private ClubPayRecordService payRecordService;
@Inject
private SysClubService sysClubService;
@At("") @At("")
@SaCheckPermission("club.infoManage.pay") @SaCheckPermission("club.infoManage.pay")
@Ok("beetl:/platform/zhgh/club/infoManage/pay/index.html") @Ok("beetl:/platform/zhgh/club/infoManage/pay/index.html")
@@ -82,10 +89,16 @@ public class ClubPayRecordController {
$condition $condition
"""); """);
Cnd cnd = Cnd.NEW(); Cnd cnd = Cnd.NEW();
List<String> clubIdList = sysClubService.getMyManageClub().stream()
.map(SysClub::getId)
.toList();
cnd.andEX("cpr.year", "=", year); cnd.andEX("cpr.year", "=", year);
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
cnd.andEX("cpr.clubId", "in", clubIdList);
}else{
cnd.andEX("cpr.clubId", "=", clubId); cnd.andEX("cpr.clubId", "=", clubId);
}
cnd.andEX("cpr.payed", "=", payed); cnd.andEX("cpr.payed", "=", payed);
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup(); SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("u.userName", pageForm.getSearchKeyword()); seg.orLike("u.userName", pageForm.getSearchKeyword());
@@ -66,6 +66,7 @@ public class ClubMyApplyController {
sysClubService.dao().clear(Sys_user_role.class, Cnd.where("clubId", "=", id)); sysClubService.dao().clear(Sys_user_role.class, Cnd.where("clubId", "=", id));
sysClubService.dao().clear(SysClubEvaluate.class, Cnd.where("clubId", "=", id)); sysClubService.dao().clear(SysClubEvaluate.class, Cnd.where("clubId", "=", id));
sysClubService.dao().clear(SysClubExamineRegister.class, Cnd.where("clubId", "=", id)); sysClubService.dao().clear(SysClubExamineRegister.class, Cnd.where("clubId", "=", id));
sysClubService.dao().clear(ClubPayRecord.class, Cnd.where("clubId", "=", id));
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id); flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
return Result.success(); return Result.success();
@@ -179,12 +179,17 @@ public class ClubStatisticsController {
u.mobile, u.mobile,
u.unitname as unitName, u.unitname as unitName,
u.userstate as userState, u.userstate as userState,
club.clubName,
club.foundTime,
c.* c.*
FROM FROM
club_user c club_user c
LEFT JOIN `vw_user` u ON u.id = c.userId LEFT JOIN `vw_user` u ON u.id = c.userId
LEFT JOIN sys_club club ON club.id = c.clubId
$condition $condition
ORDER BY ORDER BY
club.foundTime ASC,
club.clubCode ASC,
CASE CASE
WHEN JSON_CONTAINS(c.roleCode, '"CLUB_PRESIDENT"') THEN 1 WHEN JSON_CONTAINS(c.roleCode, '"CLUB_PRESIDENT"') THEN 1
WHEN JSON_CONTAINS(c.roleCode, '"CLUB_VICE_PRESIDENT"') THEN 2 WHEN JSON_CONTAINS(c.roleCode, '"CLUB_VICE_PRESIDENT"') THEN 2
@@ -254,6 +259,76 @@ public class ClubStatisticsController {
zipOutputStream.close(); zipOutputStream.close();
} }
@At
@Ok("void")
@SaCheckPermission("club.statistics")
public void exportUserDataExcel(String userState,
String sex,
Boolean giveMoney,
HttpServletResponse response) throws IOException {
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + URLUtil.encode("全部人员明细.xlsx"));
Sql sql = Sqls.create("""
SELECT
u.username as userName,
u.loginname as loginName,
u.sex,
u.mobile,
u.unitname as unitName,
u.userstate as userState,
club.clubName,
c.*
FROM
club_user c
LEFT JOIN `vw_user` u ON u.id = c.userId
LEFT JOIN sys_club club ON club.id = c.clubId
$condition
ORDER BY
club.clubCode,
CASE
WHEN JSON_CONTAINS(c.roleCode, '"CLUB_PRESIDENT"') THEN 1
WHEN JSON_CONTAINS(c.roleCode, '"CLUB_VICE_PRESIDENT"') THEN 2
WHEN JSON_CONTAINS(c.roleCode, '"CLUB_SECRETARY"') THEN 3
WHEN JSON_CONTAINS(c.roleCode, '"CLUB_VICE_SECRETARY"') THEN 4
WHEN JSON_CONTAINS(c.roleCode, '"CLUB_MEMBER"') THEN 5
ELSE 99
END
""");
Cnd cnd = Cnd.NEW();
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name(), RoleConstant.SCHOOL_UNION_CLUB_ADMIN.name())) {
Sys_role sysRole = sysRoleService.getByCode(RoleConstant.CLUB_PRESIDENT);
List<Sys_user_role> userRoles = sysClubService.dao().query(Sys_user_role.class, Cnd.where("userId", "=", SecurityUtil.getUserId()).and("roleId", "=", sysRole.getId()));
List<String> myClubId = userRoles.stream().map(Sys_user_role::getClubId).toList();
cnd.and("c.clubId", "in", myClubId);
}
cnd.andEX("u.userState", "=", userState);
cnd.andEX("u.sex", "=", sex);
sql.setCondition(cnd);
List<NutMap> listMap = sysClubService.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);
}
List<ExcelExportEntity> exportEntities = new ArrayList<>();
exportEntities.add(new ExcelExportEntity("社团名称", "clubName", 20));
exportEntities.add(new ExcelExportEntity("姓名", "userName", 20));
exportEntities.add(new ExcelExportEntity("工号", "loginName", 20));
exportEntities.add(new ExcelExportEntity("性别", "sex", 20));
exportEntities.add(new ExcelExportEntity("联系方式", "mobile", 20));
exportEntities.add(new ExcelExportEntity("所在单位", "unitName", 20));
exportEntities.add(new ExcelExportEntity("在职状态", "userState", 20));
exportEntities.add(new ExcelExportEntity("职务", "roleName", 20));
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, listMap);
CommonDownloadUtil.download("全部人员明细.xlsx", workbook, response);
}
@At @At
@Ok("void") @Ok("void")
@SaCheckPermission("club.statistics") @SaCheckPermission("club.statistics")
@@ -310,7 +310,8 @@ public class SysClubExamineServiceImpl extends BaseServiceImpl<SysClubExamineReg
buildPageBaseCondition(cnd, pageForm, "info"); buildPageBaseCondition(cnd, pageForm, "info");
cnd.and("info.userId", "=", SecurityUtil.getUserId()); cnd.and("info.userId", "=", SecurityUtil.getUserId());
cnd.groupBy("info.id"); cnd.groupBy("info.id");
cnd.desc("registerDate"); // cnd.desc("registerDate");
cnd.asc("sc.foundTime");
sql.setCondition(cnd); sql.setCondition(cnd);
return listPageVO(pageForm, sql, ClubExaminePageVo.class); return listPageVO(pageForm, sql, ClubExaminePageVo.class);
} }
@@ -121,7 +121,7 @@ public class SysClubInfoManageServiceImpl extends BaseServiceImpl<ClubCommonPage
cnd.and("c.id", "in", clubIdList); cnd.and("c.id", "in", clubIdList);
} }
cnd.groupBy("c.id"); cnd.groupBy("c.id");
cnd.asc("c.clubCode"); cnd.asc("c.foundTime");
sql.setCondition(cnd); sql.setCondition(cnd);
return listPageVO(pageForm, sql, ClubCommonPageVo.class); return listPageVO(pageForm, sql, ClubCommonPageVo.class);
} }
@@ -3,6 +3,7 @@ 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.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.constant.BpmProcessConstant; 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;
@@ -21,6 +22,7 @@ import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.controllers.open.commons.service.CommonService; import com.budwk.app.web.controllers.open.commons.service.CommonService;
import com.budwk.app.zhgh.club.model.ClubPayRecord;
import com.budwk.app.zhgh.club.model.ClubUser; import com.budwk.app.zhgh.club.model.ClubUser;
import com.budwk.app.zhgh.club.model.SysClub; import com.budwk.app.zhgh.club.model.SysClub;
import com.budwk.app.zhgh.club.model.SysClubSponsor; import com.budwk.app.zhgh.club.model.SysClubSponsor;
@@ -177,6 +179,33 @@ public class SysClubServiceImpl extends BaseServiceImpl<SysClub> implements SysC
return clubUser; return clubUser;
}).toList(); }).toList();
dao().insert(clubUsers); dao().insert(clubUsers);
for (ClubUser clubUser : clubUsers) {
ClubPayRecord payRecord = dao().fetch(
ClubPayRecord.class,
Cnd.where(ClubPayRecord::getClubId, "=", clubUser.getClubId())
.and(ClubPayRecord::getUserId, "=", clubUser.getUserId())
.and(ClubPayRecord::getYear, "=", DateUtil.thisYear())
);
if (payRecord == null) {
ClubPayRecord record = new ClubPayRecord();
record.setClubId(clubUser.getClubId());
record.setUserId(clubUser.getUserId());
record.setYear(DateUtil.thisYear());
record.setPayed(false);
JSONObject log = new JSONObject();
log.set("operatorUserId", SecurityUtil.getUserId());
log.set("operatorUserName", SecurityUtil.getUserUsername());
log.set("operatorTime", DateUtil.now());
log.set("operatorType", "社团创建");
log.set("oldValue", null);
log.set("newValue", false);
record.setOperateLogs(List.of(log));
dao().insert(record);
}
}
} }
return sysClub; return sysClub;
} }
@@ -146,6 +146,7 @@ public class OutlayManageClubQueryServiceImpl extends BaseServiceImpl implements
us.unitName, us.unitName,
us.username, us.username,
us.loginname, us.loginname,
us.retireDate,
club.clubName club.clubName
FROM FROM
`outlay_club_user_back_history` clubUser `outlay_club_user_back_history` clubUser
@@ -64,12 +64,12 @@ const EXAMINE_INFO_COMPONENT = {
</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="lastYearSurplus"></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>
@@ -26,7 +26,7 @@ layout("/layouts/platform.html"){
@change="doSearch" @change="doSearch"
></el-date-picker> ></el-date-picker>
</search-item> </search-item>
<search-item label="社团名称"> <search-item label="社团名称" v-if="$auth.hasRoleOr(['SYSADMIN'])">
<el-select clearable filterable placeholder="请选择社团" @change="doSearch" <el-select clearable filterable placeholder="请选择社团" @change="doSearch"
style="width: 100%;" v-model="pageForm.clubId"> style="width: 100%;" v-model="pageForm.clubId">
<el-option :label="item.clubName" :value="item.id" <el-option :label="item.clubName" :value="item.id"
@@ -37,6 +37,9 @@ layout("/layouts/platform.html"){
<el-button @click="exportUserData(null)" v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN'])" type="primary" size="small"> <el-button @click="exportUserData(null)" v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN'])" type="primary" size="small">
导出全部人员明细 导出全部人员明细
</el-button> </el-button>
<el-button @click="exportUserDataExcel(null)" v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN'])" type="primary" size="small">
导出全部人员明细(EXCEL)
</el-button>
<el-button @click="exportFiles(null)" v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN'])" type="primary" size="small"> <el-button @click="exportFiles(null)" v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN'])" type="primary" size="small">
导出全部上传资料 导出全部上传资料
</el-button> </el-button>
@@ -143,6 +146,16 @@ layout("/layouts/platform.html"){
getRoleName(roleCode) { getRoleName(roleCode) {
return CLUB_ROLE_CONSTANT.getRoleName(roleCode) return CLUB_ROLE_CONSTANT.getRoleName(roleCode)
}, },
exportUserDataExcel(row) {
let params = {
userState: this.pageForm.userState,
sex: this.pageForm.sex
}
if (this.pageForm.giveMoney !== null) {
params.giveMoney = this.pageForm.giveMoney
}
this.$downLoad("/platform/club/statistics/exportUserDataExcel", params)
},
exportUserData(row) { exportUserData(row) {
const id = row === null ? "" : row.id const id = row === null ? "" : row.id
let params = { let params = {
@@ -33,6 +33,12 @@ const clubHistoryBackUser = {
<span class="text-success" v-if="row.payed">已缴</span> <span class="text-success" v-if="row.payed">已缴</span>
<span class="text-danger" v-else>未缴</span> <span class="text-danger" v-else>未缴</span>
</template> </template>
<template scope="{row}" v-else-if="column.prop==='userState'">
<span v-if="row.userState === '退休' && row.retireDate">
{{ row.userState + '(' + row.retireDate + ')' }}
</span>
<span v-else>{{ row.userState }}</span>
</template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!--#include("/layouts/pagination.html"){}#--> <!--#include("/layouts/pagination.html"){}#-->