first commit

This commit is contained in:
@jyuhsin
2025-11-16 13:55:02 +08:00
commit d62e48bf27
4702 changed files with 899773 additions and 0 deletions
@@ -0,0 +1,177 @@
package com.budwk.app.zhgh.activity.basic.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.basic.models.ActivityBasicSettings;
import com.budwk.app.zhgh.activity.basic.models.ActivityEvent;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.Arrays;
import java.util.List;
/**
* @ClassName ActivityBasicEventController
* @Description TODO
* @Author zhf
* @Date 2024/8/5 14:05
*/
@IocBean
@Ok("json:full")
@At("/platform/activity/basic/event")
public class ActivityBasicEventController {
//运动类型id
public static final String EXERCISE_TYPE = "f708d6343c9542b791d32532f860d120";
//比赛组别id
public static final String COMPETITION_CATEGORY = "60f9c36cadce493494a2373cc64d216f";
//距离id
public static final String DISTANCE = "d6d9196e87184729abd0dca1bd5df984";
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@At("")
@Ok("beetl:platform/zhgh/activity/basic/event/index.html")
@SaCheckPermission("activity.basic.event")
public void index() {
}
@At
public Result focusGroup() {
List<ActivityBasicSettings> list = dao.query(ActivityBasicSettings.class, Cnd.where("parentId", "=", COMPETITION_CATEGORY).asc("code"));
return Result.success(list);
}
@At
public Object exerciseType() {
List<ActivityBasicSettings> list = dao.query(ActivityBasicSettings.class, Cnd.where("parentId", "=", EXERCISE_TYPE));
return Result.success(list);
}
@At
public Object focusDistance() {
List<ActivityBasicSettings> list = dao.query(ActivityBasicSettings.class, Cnd.where("parentId", "=", DISTANCE).asc("name"));
return Result.success(list);
}
@At
public Object changeExercise_typeList(String exerciseType) {
List<ActivityBasicSettings> list = dao.query(ActivityBasicSettings.class, Cnd.where("parentId", "=", exerciseType));
return Result.success(list);
}
@At
@SaCheckPermission("activity.basic.event")
public Result pageData(PageForm page,
String group,
String events,
@Param(value = "isMenWomen") String[] isMenWomen,
String activityId) {
Sql sql = Sqls.create("""
SELECT
even.*,
ba.`name` baname,
di.`name` diname,
sp.`name` spname,
exe.`name` exename
FROM
activity_event even
LEFT JOIN activity_school_event ase ON ase.eventId = even.id
LEFT JOIN activity_basic_settings ba ON even.competitionCategory = ba.id
LEFT JOIN activity_basic_settings di ON even.distance = di.id
LEFT JOIN activity_basic_settings sp ON even.sports = sp.id
LEFT JOIN activity_basic_settings exe ON even.exerciseType = exe.id $condition
""");
Cnd cnd = Cnd.NEW();
SqlExpressionGroup sqlExpressionGroup = new SqlExpressionGroup();
if (Arrays.stream(isMenWomen).anyMatch(a -> a.equals("2"))) {
sqlExpressionGroup.and("even.isMenWomen", "=", 1);
}
if (Arrays.stream(isMenWomen).anyMatch(a -> a.equals("3"))) {
sqlExpressionGroup.or("even.isMenWomen", "=", 2);
}
if (Arrays.stream(isMenWomen).anyMatch(a -> a.equals("4"))) {
sqlExpressionGroup.and("even.projectType", "=", 1);
}
if (Arrays.stream(isMenWomen).anyMatch(a -> a.equals("5"))) {
sqlExpressionGroup.or("even.projectType", "=", 2);
}
if (sqlExpressionGroup.getExps().size() > 0) {
cnd.and(sqlExpressionGroup);
}
cnd.groupBy("even.id");
cnd.andEX("even.competitionCategory", "=", group);
cnd.andEX("exe.id", "=", events);
cnd.andEX("ase.activityId", "=", activityId);
cnd.desc("projectCode");
cnd.asc("projectType");
cnd.desc("baname");
cnd.asc("isMenWomen");
sql.setCondition(cnd);
return Result.success(baseService.listPageMap(page.getPageNumber(), page.getPageSize(), sql));
}
@At
@SLog(tag = "体育活动项目管理", msg = "添加项目")
@SaCheckPermission("activity.basic.event")
public Object doAdd(ActivityEvent activityEvent) {
activityEvent.setWhetherEnable(true);
baseService.insert(activityEvent);
return Result.success();
}
@At
@SLog(tag = "体育活动项目管理", msg = "编辑项目")
@SaCheckPermission("activity.basic.event")
public Object doEdit(ActivityEvent activityEvent) {
baseService.update(activityEvent);
return Result.success();
}
@At
@SLog(tag = "体育活动项目管理", msg = "删除项目")
@SaCheckPermission("activity.basic.event")
public Object doDelete(String id) {
baseService.dao().delete(ActivityEvent.class, id);
return Result.success();
}
@At
@SLog(tag = "体育活动项目管理", msg = "批量设置项目年龄限制")
@SaCheckPermission("activity.basic.event")
public Object doAssignmentDate(@Param(value = "eventIds") @Valid String[] eventIds, String startAgeDate, String endAgeDate) {
dao.update(ActivityEvent.class,
Chain.make("startAgeDate", startAgeDate).add("endAgeDate", endAgeDate),
Cnd.where("id", "in", eventIds));
return Result.success();
}
@At
@SaCheckPermission("activity.basic.event")
public Object getProjectCodeIsExist(String projectCode) {
ActivityEvent event = baseService.dao().fetch(ActivityEvent.class, Cnd.where("projectCode", "=", projectCode));
return Result.success(event);
}
}
@@ -0,0 +1,469 @@
package com.budwk.app.zhgh.activity.basic.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.EasyExcel;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.base.utils.easyexcel.EasyExcelUtil;
import com.budwk.app.sys.models.Sys_role;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope;
import com.budwk.app.zhgh.activity.basic.param.ActivityUserScopePageParam;
import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService;
import com.budwk.app.zhgh.activity.basic.template.UserTemp;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.integration.jedis.RedisService;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.AdaptBy;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import org.nutz.mvc.upload.TempFile;
import org.nutz.mvc.upload.UploadAdaptor;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author zxy
* @Description 活动人员分组设置
* @createTime 2022年01月04日 10:15:00
*/
@IocBean
@At("/platform/activity/basic/scope")
@Ok("json:full")
@Slf4j
public class ActivityBasicScopeController {
@Inject
private BaseService baseService;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@Inject
private Dao dao;
@Inject
private RedisService redisService;
@At("")
@Ok("beetl:platform/zhgh/activity/basic/userScope/index.html")
@SaCheckPermission("activity.basic.scope")
public void index() {
}
/**
* 查询可以设置活动的人员
*
* @return {@link Result}
*/
@At
@SaCheckPermission("activity.basic.scope")
public Result pageData(@Param("data") ActivityUserScopePageParam pageForm) {
Sql sql = Sqls.create("""
SELECT
DISTINCT(u.id) as id,
u.loginname AS loginName,
u.username AS userName,
u.sex,
u.birthday,
u.mobile,
u.personType,
u.userState,
u.unitname AS unitName,
u.unionname AS unionName,
TIMESTAMPDIFF(YEAR, u.birthday, CURDATE()) AS age
FROM
`vw_user` u
LEFT JOIN sys_user_role sur on sur.userid = u.id
LEFT JOIN club_user clubuser ON clubuser.userid=u.id
$condition
""");
try {
Cnd cnd = getCnd(pageForm);
sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
} catch (NumberFormatException e) {
return Result.error(e.getMessage() + "请输入数字类型的值");
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
/**
* 设置活动人员
*
* @return Result
*/
@At
@SLog(tag = "活动人员设置", msg = "设置活动人员")
@SaCheckPermission("activity.basic.scope")
public Object doSetActivityUser(@Param("data") ActivityUserScopePageParam activityUserScopePageParam) {
Sql sql = Sqls.create("""
SELECT DISTINCT
( u.id ) AS userId
FROM
`vw_user` u
LEFT JOIN sys_user_role sur ON sur.userid = u.id
LEFT JOIN club_user clubuser ON clubuser.userid=u.id
$condition
""");
Cnd cnd = getCnd(activityUserScopePageParam);
sql.setCondition(cnd);
sql.setCallback(Sqls.callback.entities());
sql.setEntity(dao.getEntity(ActivityUserScope.class));
dao.execute(sql);
List<ActivityUserScope> list = sql.getList(ActivityUserScope.class);
String groupName = null;
int maxCount = 0;
if (activityUserScopePageParam.getSetGroupType() == 1) {
groupName = dao.execute(Sqls.fetchString("select groupName from activity_user_scope where groupId = @groupId").setParam("groupId", activityUserScopePageParam.getSetGroupId())).getString();
} else if (activityUserScopePageParam.getSetGroupType() == 2) {
maxCount = baseService.count(Sqls.create("select max(groupId) from activity_user_scope"));
}
for (ActivityUserScope userScope : list) {
if (activityUserScopePageParam.getSetGroupType() == 1) {
userScope.setGroupId(activityUserScopePageParam.getSetGroupId());
userScope.setGroupName(groupName);
} else if (activityUserScopePageParam.getSetGroupType() == 2) {
userScope.setGroupId(maxCount + 1);
userScope.setGroupName(activityUserScopePageParam.getSetGroupName());
}
userScope.setCreator(SecurityUtil.getUserId());
}
if (list.size() < 500) {
dao.insert(list);
return Result.success(activityUserScopePageParam.getSetGroupType() == 1 ? activityUserScopePageParam.getSetGroupId() : maxCount + 1);
}
//多线程插入
activityBasicScopeService.largeDataInsert(list);
return Result.success(activityUserScopePageParam.getSetGroupType() == 1 ? activityUserScopePageParam.getSetGroupId() : maxCount + 1);
}
/**
* 获取组别
*
* @return
*/
@At
public Object getActivityUserScopeGroup() {
Sql sql = Sqls.create("""
SELECT
groupId,
groupName
FROM
activity_user_scope
$condition
""");
Cnd cnd = Cnd.NEW();
if (!StpUtil.hasRole(RoleConstant.SYSADMIN.name()) &&
!StpUtil.hasRole(RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("creator", "=", SecurityUtil.getUserId());
}
cnd.and("groupId", "IS NOT", null);
cnd.and("groupName", "IS NOT", null);
cnd.groupBy("groupId");
sql.setCondition(cnd);
return Result.success(baseService.listMap(sql));
}
/**
* 查看该人员是否在活动范围中
*
* @param activityGroupId
* @return
*/
@At
public Object getScopeUser(String activityGroupId, @Param(value = "userId") String userId) {
String userid = StrUtil.isNotBlank(userId) ? userId : SecurityUtil.getUserId();
int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", activityGroupId).and("userId", "=", userid));
return Result.success(count);
}
@At
public Object getRoleListByMenuId() {
return Result.success(dao.query(Sys_role.class, Cnd.NEW().desc("code")));
}
/**
* 判断用户权限及获取工会id
*
* @return java.lang.Object
* @author zhf
* @description
*/
@At
public Result getRolesAndUnion() {
return Result.success(new NutMap() {{
addv("is_A06", StpUtil.hasRole(RoleConstant.SCHOOL_UNION_ADMIN.name()));
addv("is_H04", StpUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name()));
addv("is_sysadmin", StpUtil.hasRole(RoleConstant.SYSADMIN.name()));
addv("unionid", SecurityUtil.getUnionId());
}});
}
/**
* 获取用户信息表列
* 提供两种方式
*
* @return {@link Object}
*/
@At
public Object getUserTableColumnInfo() {
try {
//2.从数据库查询
Sql sql = Sqls.create("""
SELECT
COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,
COLUMN_COMMENT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'sys_user'
AND TABLE_SCHEMA = 'budwk_v5_mini'
""");
List<NutMap> sqlDataList = activityBasicScopeService.listMap(sql);
// sqlDataList.forEach(v -> v.put("DATA_TYPE", new String((byte[]) v.get("DATA_TYPE"))));
sqlDataList.forEach(v -> v.put("DATA_TYPE", v.getString("DATA_TYPE")));
return Result.success(sqlDataList);
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());
return Result.error(e.getMessage());
}
}
@At
@Ok("void")
@SaCheckPermission("activity.basic.scope")
public void doExportUser(@Param("data") ActivityUserScopePageParam activityUserScopePageParam, HttpServletResponse response) {
Sql sql = Sqls.create("""
SELECT
DISTINCT(u.id) as id,
u.loginname AS loginName,
u.username AS userName,
u.sex,
u.birthday,
u.mobile,
u.personType,
u.userState,
u.unitname AS unitName,
u.unionname AS unionName,
TIMESTAMPDIFF(YEAR, u.birthday, CURDATE()) AS age
FROM
`vw_user` u
LEFT JOIN sys_user_role sur on sur.userid = u.id
LEFT JOIN sys_club_user clubuser ON clubuser.userid=u.id
$condition
""");
try {
Cnd cnd = getCnd(activityUserScopePageParam);
sql.setCondition(cnd);
List<NutMap> map = baseService.listMap(sql);
List<ExcelExportEntity> entityList = new ArrayList<>();
ExcelExportEntity no = new ExcelExportEntity("序号", "no", 10);
no.setFormat("isAddIndex");
entityList.add(no);
Map<String, String> propMap = Json.fromJson(Map.class, activityUserScopePageParam.getProps());
propMap.forEach((k, v) -> {
entityList.add(new ExcelExportEntity(v, k, 40));
});
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, map);
CommonDownloadUtil.download("人员名单.xlsx", workbook, response);
} catch (Exception e) {
e.printStackTrace();
}
}
private Cnd getCnd(ActivityUserScopePageParam activityUserScopePageParam) {
String IN_OR_NIN_OP = activityUserScopePageParam.getReverseSelection() ? "NOT IN" : "IN";
String EQ_OR_NEQ_OP = activityUserScopePageParam.getReverseSelection() ? "!=" : "=";
Cnd cnd = Cnd.NEW();
if (StrUtil.isNotBlank(activityUserScopePageParam.getPageOrderName()) && StrUtil.isNotBlank(activityUserScopePageParam.getPageOrderBy())) {
cnd.orderBy(activityUserScopePageParam.getPageOrderName(), activityUserScopePageParam.getPageOrderBy().equalsIgnoreCase("ascending") ? "ASC" : "DESC");
}
if (activityUserScopePageParam.getActivityGroupId() != null) {
Sql sqlx = Sqls.createf("SELECT userId FROM activity_user_scope where groupId = '%s'", activityUserScopePageParam.getActivityGroupId());
cnd.and("u.id", activityUserScopePageParam.getReverseSelection() ? "IN" : "NOT IN", sqlx);
}
cnd.andEX("u.id", IN_OR_NIN_OP, activityUserScopePageParam.getUserId());
if (Lang.isNotEmpty(activityUserScopePageParam.getMemberTypes())) {
if (ArrayUtils.contains(activityUserScopePageParam.getMemberTypes(), "工会会员")) {
cnd.and("u.member", EQ_OR_NEQ_OP, 1);
}
if (ArrayUtils.contains(activityUserScopePageParam.getMemberTypes(), "福利会员")) {
cnd.and("u.welfareMember", EQ_OR_NEQ_OP, 1);
}
if (ArrayUtils.contains(activityUserScopePageParam.getMemberTypes(), "基金会员")) {
cnd.and(new Static(" u.loginname " + IN_OR_NIN_OP + " (select loginname from sick_fund_member)"));
}
}
if (!Lang.isEmptyArray(activityUserScopePageParam.getAge())) {
if (!activityUserScopePageParam.getAge()[1].equals("0")) {
if (activityUserScopePageParam.getReverseSelection()) {
cnd.andNot("TIMESTAMPDIFF(YEAR, u.birthday, CURDATE())", "between", activityUserScopePageParam.getAge());
} else {
cnd.and("TIMESTAMPDIFF(YEAR, u.birthday, CURDATE())", "between", activityUserScopePageParam.getAge());
}
}
}
if (StrUtil.isNotBlank(activityUserScopePageParam.getExistsLoginNameRedisKey())) {
List<String> loginNames = redisService.lrange(activityUserScopePageParam.getExistsLoginNameRedisKey(), 0, -1);
cnd.andEX("u.loginname", "in", loginNames);
}
try {
cnd.andEX("u.unionid", EQ_OR_NEQ_OP, activityUserScopePageParam.getUnionId());
cnd.andEX("u.unitid", EQ_OR_NEQ_OP, activityUserScopePageParam.getUnitId());
cnd.andEX("u.personType", IN_OR_NIN_OP, activityUserScopePageParam.getPersonTypes());
cnd.andEX("u.userState", IN_OR_NIN_OP, activityUserScopePageParam.getUserStates());
cnd.andEX("u.sex", IN_OR_NIN_OP, activityUserScopePageParam.getSexTypes());
cnd.andEX("sur.tcSessionId", EQ_OR_NEQ_OP, activityUserScopePageParam.getSessionId());
cnd.andEX("sur.roleId", IN_OR_NIN_OP, activityUserScopePageParam.getRoleIds());
cnd.andEX("clubuser.clubid", EQ_OR_NEQ_OP, activityUserScopePageParam.getClubId());
} catch (Exception e) {
throw new RuntimeException(e);
}
return cnd;
}
@At
@Ok("void")
@ApiOperation("下载导入人员模板")
@SaCheckPermission("activity.basic.user")
public void downloadImport(HttpServletResponse response) {
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();) {
EasyExcel.write(byteArrayOutputStream, UserTemp.class)
.sheet("福利名单导入模版")
.doWrite(ArrayList::new);
CommonDownloadUtil.download("人员导入模板.xlsx", byteArrayOutputStream.toByteArray(), response);
} catch (Exception e) {
e.printStackTrace();
}
}
@At
@SaCheckPermission("activity.basic.user")
@ApiOperation("导入人员核对名单")
@AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"})
public Result doImport(TempFile file) {
String matchUserLoginNamesKey = "ActivityBasicScopeController.doImport.time=" + System.currentTimeMillis();
List<T> ts = EasyExcelUtil.syncReadModel(file.getFile(), UserTemp.class, 0, 1);
List<UserTemp> userImportList = JSONUtil.parseArray(JSONUtil.toJsonStr(ts)).toList(UserTemp.class);
//判断人员哪些存在哪些不存在
Sql sql = Sqls.queryString("""
SELECT
u.loginname
FROM
sys_user u
""");
dao.execute(sql);
String[] sysLoginNames = (String[]) sql.getResult();
//存在的工号
List<String> existsLoginNames = new ArrayList<>();
for (UserTemp excelUser : userImportList) {
if (ArrayUtil.contains(sysLoginNames, excelUser.getLoginName())) {
existsLoginNames.add(excelUser.getLoginName());
} else {
excelUser.setErrorInfo("系统查不到此人");
}
}
//匹配不到的用户
List<UserTemp> errorExcelTempUsers = userImportList.stream().filter(v -> StrUtil.isNotBlank(v.getErrorInfo())).collect(Collectors.toList());
NutMap nutMap = NutMap.NEW();
nutMap.setv("totalCount", userImportList.size());
nutMap.setv("successCount", existsLoginNames.size());
nutMap.setv("errorCount", errorExcelTempUsers.size());
nutMap.setv("errorList", errorExcelTempUsers.stream().map(v -> {
return NutMap.NEW().addv("工号", v.getLoginName()).addv("姓名", v.getUserName()).addv("错误原因", v.getErrorInfo());
}).collect(Collectors.toList()));
nutMap.setv("existsLoginNameRedisKey", matchUserLoginNamesKey);
//保存存在的工号
if (Lang.isNotEmpty(existsLoginNames)) {
redisService.lpush(matchUserLoginNamesKey, existsLoginNames.toArray(new String[0]));
redisService.expire(matchUserLoginNamesKey, 60 * 3);
}
return Result.success(nutMap);
}
@At
@SaCheckPermission("activity.basic.user")
@ApiOperation("清空查询条件")
public Result clearSearchCnd(String existsLoginNameRedisKey) {
if (StrUtil.isNotBlank(existsLoginNameRedisKey)) {
redisService.del(existsLoginNameRedisKey);
}
return Result.success();
}
}
@@ -0,0 +1,289 @@
package com.budwk.app.zhgh.activity.basic.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
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.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.base.utils.easyexcel.EasyExcelUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope;
import com.budwk.app.zhgh.activity.basic.template.UserTemp;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.dao.util.cri.Static;
import org.nutz.integration.jedis.RedisService;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.AdaptBy;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import org.nutz.mvc.upload.TempFile;
import org.nutz.mvc.upload.UploadAdaptor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName ActivityBasicScopeUserDataController
* @Description TODO
* @Author zhf
* @Date 2024/8/6 10:34
*/
@IocBean
@At("/platform/activity/basic/user")
@Ok("json:full")
public class ActivityBasicScopeUserDataController {
@Inject
private BaseService baseService;
@Inject
private RedisService redisService;
@At("")
@Ok("beetl:platform/zhgh/activity/basic/userScopeData/index.html")
@SaCheckPermission("activity.basic.user")
public void index() {
}
@At
@SaCheckPermission("activity.basic.user")
public Result pageData(PageForm pageForm,
@Param(value = "unionId") String unionId,
@Param(value = "unitId") String unitId,
@Param(value = "personType") String personType,
@Param(value = "userState") String userState,
@Param(value = "groupId") Integer groupId,
@Param(value = "existsLoginNameRedisKey") String existsLoginNameRedisKey) {
Sql sql = Sqls.create("""
SELECT
aus.id,
u.username AS userName,
u.loginname AS loginName,
u.sex,
u.birthday,
u.mobile,
u.personType,
u.userState,
u.unitname AS unitName,
u.unionname AS unionName,
aus.groupId,
aus.groupName
FROM
activity_user_scope aus
LEFT JOIN `vw_user` u ON u.id = aus.userId
$condition
""");
Cnd cnd = Cnd.NEW();
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())){
SqlExpressionGroup group = new SqlExpressionGroup();
group.orLike("u.username", pageForm.getSearchKeyword());
group.orLike("u.loginname", pageForm.getSearchKeyword());
cnd.and(group);
}
if (StrUtil.isNotBlank(pageForm.getPageOrderName()) && StrUtil.isNotBlank(pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), pageForm.getPageOrderBy().equalsIgnoreCase("ascending") ? "ASC" : "DESC");
}
cnd.andEX("aus.groupId", "=", groupId);
cnd.andEX("u.unionid", "=", unionId);
cnd.andEX("u.unitid", "=", unitId);
cnd.andEX("u.personType", "=", personType);
cnd.andEX("u.userState", "=", userState);
if (!StpUtil.hasRole(RoleConstant.SYSADMIN.name()) &&
!StpUtil.hasRole(RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("aus.creator", "=", SecurityUtil.getUserId());
}
if (StrUtil.isNotBlank(existsLoginNameRedisKey)) {
List<String> loginNames = redisService.lrange(existsLoginNameRedisKey, 0, -1);
cnd.andEX("u.loginname", "in", loginNames);
}
sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
/**
* 删除一条记录
*
* @param id
* @return
*/
@At
@SLog(tag = "活动人员查询", msg = "删除活动人员")
@SaCheckPermission("activity.basic.user")
@Aop(TransAop.READ_COMMITTED)
public Result doDelete(@Param(value = "id") String id,
@Param(value = "groupId") Integer groupId,
@Param(value = "searchKeyword") String searchKeyword,
@Param(value = "searchName") String searchName,
@Param(value = "unionId") String unionId,
@Param(value = "unitId") String unitId,
@Param(value = "personType") String personType,
@Param(value = "userState") String userState,
@Param(value = "existsLoginNameRedisKey") String existsLoginNameRedisKey) {
List<String> existsLoginNames = new ArrayList<>();
if(StrUtil.isNotBlank(existsLoginNameRedisKey) && redisService.exists(existsLoginNameRedisKey)){
existsLoginNames = redisService.lrange(existsLoginNameRedisKey, 0, -1);
if (StrUtil.isNotBlank(existsLoginNameRedisKey)) {
redisService.del(existsLoginNameRedisKey);
}
}
Sql sql = Sqls.create("select id from `vw_user` u $condition");
Cnd userCnd = Cnd.NEW();
if (StrUtil.isNotBlank(searchName) && StrUtil.isNotBlank(searchKeyword)) {
userCnd.and(Cnd.likeEX(searchName, searchKeyword));
}
userCnd.andEX("u.unionid", "=", unionId);
userCnd.andEX("u.unitid", "=", unitId);
userCnd.andEX("u.personType", "=", personType);
userCnd.andEX("u.userState", "=", userState);
userCnd.andEX("u.id", "=", id);
userCnd.andEX("u.loginname","in",existsLoginNames);
sql.setCondition(userCnd);
Cnd cnd = Cnd.NEW();
cnd.and("groupId", "=", groupId);
if (!StpUtil.hasRole(RoleConstant.SYSADMIN.name()) &&
!StpUtil.hasRole(RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("creator", "=", SecurityUtil.getUserId());
}
if (StrUtil.isNotBlank(id)) {
cnd.and("id", "=", id);
} else {
cnd.and(new Static("userId in (" + sql + ")"));
}
baseService.dao().clear(ActivityUserScope.class, cnd);
baseService.dao().clear(ActivityUserScope.class, Cnd.where(ActivityUserScope::getUserId, "not in", Sqls.create("select id from sys_user")));
return Result.success();
}
@At
@SaCheckPermission("activity.basic.user")
@ApiOperation("导入人员核对名单")
@AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"})
public Result doImport(@Valid String groupId, TempFile file) {
String matchUserLoginNamesKey = "ActivityBasicUserController.doImport.groupId=" + groupId + "time=" + System.currentTimeMillis();
List<T> ts = EasyExcelUtil.syncReadModel(file.getFile(), UserTemp.class, 0, 1);
List<UserTemp> userImportList = JSONUtil.parseArray(JSONUtil.toJsonStr(ts)).toList(UserTemp.class);
//判断人员哪些存在哪些不存在
Sql sql = Sqls.queryString("""
SELECT
u.loginname
FROM
activity_user_scope aus
LEFT JOIN sys_user u ON u.id = aus.userId
WHERE
aus.groupId = @groupId
""").setParam("groupId", groupId);
baseService.execute(sql);
String[] sysLoginNames = (String[]) sql.getResult();
//存在的工号
List<String> existsLoginNames = new ArrayList<>();
for (UserTemp excelUser : userImportList) {
if (ArrayUtil.contains(sysLoginNames, excelUser.getLoginName())) {
existsLoginNames.add(excelUser.getLoginName());
} else {
excelUser.setErrorInfo("系统查不到此人");
}
}
//匹配不到的用户
List<UserTemp> errorExcelTempUsers = userImportList.stream().filter(v -> StrUtil.isNotBlank(v.getErrorInfo())).collect(Collectors.toList());
NutMap nutMap = NutMap.NEW();
nutMap.setv("totalCount", userImportList.size());
nutMap.setv("successCount", existsLoginNames.size());
nutMap.setv("errorCount", errorExcelTempUsers.size());
nutMap.setv("errorList", errorExcelTempUsers.stream().map(v -> {
return NutMap.NEW().addv("工号", v.getLoginName()).addv("姓名", v.getUserName()).addv("错误原因", v.getErrorInfo());
}).collect(Collectors.toList()));
nutMap.setv("existsLoginNameRedisKey", matchUserLoginNamesKey);
//保存存在的工号
if (Lang.isNotEmpty(existsLoginNames)) {
redisService.lpush(matchUserLoginNamesKey, existsLoginNames.toArray(new String[0]));
redisService.expire(matchUserLoginNamesKey, 60 * 3);
}
return Result.success(nutMap);
}
@At
@Ok("void")
@ApiOperation("导出人员名单")
@SaCheckPermission("activity.basic.user")
public void doExportUser(Integer groupId, HttpServletResponse response) {
try {
Sql sql = Sqls.create("""
SELECT
u.username AS userName,
u.loginname AS loginName,
u.sex,
u.mobile,
u.unitname AS unitName,
u.unionName AS unionName
FROM
activity_user_scope aus
LEFT JOIN `vw_user` u ON u.id = aus.userId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("aus.groupId", "=", groupId);
sql.setCondition(cnd);
List<NutMap> listMap = baseService.listMap(sql);
List<ExcelExportEntity> exportEntities = new ArrayList<>();
exportEntities.add(new ExcelExportEntity("姓名", "userName", 20));
exportEntities.add(new ExcelExportEntity("工号", "loginName", 20));
exportEntities.add(new ExcelExportEntity("工会", "unionName", 20));
exportEntities.add(new ExcelExportEntity("单位", "unitName", 20));
exportEntities.add(new ExcelExportEntity("手机号码", "mobile", 20));
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, listMap);
CommonDownloadUtil.download("人员名单.xlsx", workbook, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,125 @@
package com.budwk.app.zhgh.activity.basic.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.basic.models.ActivityBasicSettings;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName ActivityBasicSettings
* @Description TODO
* @Author zhf
* @Date 2024/8/5 11:32
*/
@IocBean
@Ok("json:full")
@At("/platform/activity/basic/settings")
public class ActivityBasicSettingsController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@At("")
@Ok("beetl:platform/zhgh/activity/basic/settings/index.html")
@SaCheckPermission("activity.basic.settings")
public void index() {
}
@At
public Result tree() {
List list = new ArrayList();
ActivityBasicSettings parentId = dao.fetch(ActivityBasicSettings.class, Cnd.where("parentId", "=", "0"));
if (parentId != null) {
parentId.setChild(child(parentId.getId()));
list.add(parentId);
return Result.success().addData(list);
}
return Result.success();
}
private List<ActivityBasicSettings> child(String parentId) {
List<ActivityBasicSettings> basicSettings = dao.query(ActivityBasicSettings.class, Cnd.where("parentId", "=", parentId).asc("code"));
basicSettings.forEach(v -> {
v.setChild(child(v.getId()));
});
return basicSettings;
}
@At
@SaCheckPermission("activity.basic.settings")
public Result pageData(String parentId, PageForm pageForm) {
Cnd cnd = Cnd.NEW();
if (StrUtil.isBlank(parentId)) {
ActivityBasicSettings rootSetting = dao.fetch(ActivityBasicSettings.class, Cnd.where("parentId", "=", 0));
cnd.and("parentId", "=", rootSetting.getId());
} else {
cnd.and("parentId", "=", parentId);
}
Sql sql = Sqls.create("select * from activity_basic_settings $condition");
cnd.asc("code");
sql.setCondition(cnd);
Pagination pagination = baseService.listPage(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@SLog(tag = "活动基础工具设置", msg = "新增信息")
@SaCheckPermission("activity.basic.settings")
public Result doAdd(ActivityBasicSettings activityBasicSettings) {
if (dao.count(ActivityBasicSettings.class, Cnd.where("code", "=", activityBasicSettings.getCode())) > 0) {
return Result.error("代码已存在");
}
dao.update(ActivityBasicSettings.class, Chain.make("hasChildren", true), Cnd.where("id", "=", activityBasicSettings.getParentId()));
dao.insert(activityBasicSettings);
return Result.success();
}
@At
@SLog(tag = "活动基础工具设置", msg = "删除信息")
@SaCheckPermission("activity.basic.settings")
public Result doDelete(String id) {
dao.delete(ActivityBasicSettings.class, id);
dao.clear(ActivityBasicSettings.class, Cnd.where("parentId", "=", id));
return Result.success();
}
@At
@SLog(tag = "活动基础工具设置", msg = "编辑信息")
@SaCheckPermission("activity.basic.settings")
public Result doEditType(ActivityBasicSettings activityBasicSettings) {
dao.updateIgnoreNull(activityBasicSettings);
return Result.success();
}
@At
public Result getActivityTwoLevelType(String code) {
ActivityBasicSettings fetch = dao.fetch(ActivityBasicSettings.class, Cnd.where("code", "=", code));
List<ActivityBasicSettings> query = dao.query(ActivityBasicSettings.class, Cnd.where("parentId", "=", fetch.getId()).asc("code"));
return Result.success(query);
}
}
@@ -0,0 +1,265 @@
package com.budwk.app.zhgh.activity.basic.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNode;
import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.sys.models.Sys_role;
import com.budwk.app.sys.models.Sys_unit;
import com.budwk.app.sys.services.SysRoleService;
import com.budwk.app.sys.services.SysUserService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.basic.models.ActivityBasicUnion;
import com.budwk.app.zhgh.activity.basic.models.ActivityBasicUnit;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName ActivityBasicUnionController
* @Description TODO
* @Author zhf
* @Date 2024/8/6 11:47
*/
@IocBean
@At({"/platform/activity/basic/union", "/platform/activity/basic/union2"})
@Ok("json:full")
public class ActivityBasicUnionController {
@Inject
private BaseService baseService;
@Inject
private SysUserService sysUserService;
@Inject
private SysRoleService sysRoleService;
@Inject
private Dao dao;
@At("")
@Ok("beetl:platform/zhgh/activity/basic/union/index.html")
@SaCheckPermission(value = {"activity.basic.union", "activity.basic.union2"}, mode = SaMode.OR)
public void index() {
}
@At
@SaCheckPermission(value = {"activity.basic.union", "activity.basic.union2"}, mode = SaMode.OR)
public Result tree() {
List<Tree<String>> treeList = null;
try {
boolean schoolUnionAdmin = StpUtil.hasRole("SchoolUnionAdmin");
schoolUnionAdmin = true;
List<TreeNode<String>> nodeList = CollUtil.newArrayList();
nodeList.add(new TreeNode<>("工会委员会", "0", "工会委员会", 1000));
if (schoolUnionAdmin) {
List<ActivityBasicUnion> list = dao.query(ActivityBasicUnion.class, Cnd.NEW().asc("unionCode"));
for (int i = 0; i < list.size(); i++) {
nodeList.add(new TreeNode<>(list.get(i).getId(), "工会委员会", list.get(i).getName(), i));
}
}
treeList = TreeUtil.build(nodeList, "0");
return Result.success().addData(treeList);
} catch (Exception e) {
e.printStackTrace();
return Result.error();
}
}
@At
@SaCheckPermission(value = {"activity.basic.union", "activity.basic.union2"}, mode = SaMode.OR)
public Result pageData(PageForm pageForm) {
Cnd cnd = Cnd.NEW();
ActivityBasicUnit basicUnit = dao.fetch(ActivityBasicUnit.class, Cnd.where("id", "=", SecurityUtil.getUnitId()));
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
cnd.and(Cnd.likeEX("un.name", pageForm.getSearchKeyword()));
}
Sql sql = Sqls.create("""
SELECT
un.*,
(SELECT COUNT(*) FROM activity_basic_unit WHERE unionId=un.id) unitnum,
GROUP_CONCAT( us.username, '(', us.loginname, ')' ) userNames
FROM
activity_basic_union un
LEFT JOIN sys_user_role sur ON un.id = sur.unionId
LEFT JOIN sys_role sr ON sr.id=sur.roleId AND sr.code=@roleCode
LEFT JOIN sys_user us ON us.id = sur.userId
$condition
""").setParam("roleCode", RoleConstant.BRANCH_UNION_CHAIRMAN.name());
cnd.groupBy("un.id");
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
cnd.and("un.id", "=", basicUnit.getUnionId());
}
if (Strings.isNotBlank(pageForm.getPageOrderName()) && Strings.isNotBlank(pageForm.getPageOrderBy())) {
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
} else {
cnd.asc("un.unionCode");
}
sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
public Result findOne(String id) {
ActivityBasicUnion union = dao.fetch(ActivityBasicUnion.class, id);
return Result.success(union);
}
@At
@SaCheckPermission(value = {"activity.basic.union", "activity.basic.union2"}, mode = SaMode.OR)
public Result insert(ActivityBasicUnion union) {
try {
union.setSource("activity");
dao.insert(union);
return Result.success();
} catch (Exception e) {
return Result.error();
}
}
@At
@SaCheckPermission(value = {"activity.basic.union", "activity.basic.union2"}, mode = SaMode.OR)
public Result update(ActivityBasicUnion union) {
try {
dao.updateIgnoreNull(union);
return Result.success();
} catch (Exception e) {
return Result.error();
}
}
@At
@SaCheckPermission(value = {"activity.basic.union", "activity.basic.union2"}, mode = SaMode.OR)
public Result doDeleteUnion(String id, Boolean flag) {
if (flag) {
dao.delete(ActivityBasicUnion.class, id);
} else {
List<ActivityBasicUnit> unitList = dao.query(ActivityBasicUnit.class, Cnd.where("unionId", "=", id));
unitList.forEach(v -> {
Sys_unit unit = dao.fetch(Sys_unit.class, v.getId());
dao.update(ActivityBasicUnit.class, Chain.make("unionId", unit.getUnionId()), Cnd.where("id", "=", unit.getId()));
});
}
//再清除单位对应的工会id
dao.update(ActivityBasicUnit.class, Chain.make("unionId", ""), Cnd.where("unionId", "=", id));
Sys_role sysRole = dao.fetch(Sys_role.class, Cnd.where("code", "=", RoleConstant.BRANCH_UNION_CHAIRMAN.name()));
dao.clear("sys_user_role", Cnd.where("unionId", "=", id).and("roleId", "=", sysRole.getId()));
return Result.success();
}
@At
@SaCheckPermission(value = {"activity.basic.union", "activity.basic.union2"}, mode = SaMode.OR)
public Result getUnionAdminAndUser(String id) {
Sql sqlUser = Sqls.create("""
SELECT
u.id,
u.username,
u.loginname,
CONCAT( u.username, '', u.loginname, '', '-', u.unitname ) `name`
FROM
`vw_user` u
LEFT JOIN activity_basic_unit un ON u.unitid = un.id
WHERE
un.unionid = @id
""").setParam("id", id);
List<NutMap> userDataMap = baseService.listMap(sqlUser);
Sql sqlAdmin = Sqls.create("""
SELECT
userid AS id
FROM
sys_user_role sur
LEFT JOIN sys_role sr ON sr.id = sur.roleId
WHERE
sr.`code` = 'BRANCH_UNION_CHAIRMAN' and sur.unionid =@id
""").setParam("id", id);
List<NutMap> userAdminDataMap = baseService.listMap(sqlAdmin);
List<String> userAdminIds = userAdminDataMap.stream().map(u -> u.getString("id")).collect(Collectors.toList());
return Result.success(NutMap.NEW().addv("userData", userDataMap).addv("userAdminIds", userAdminIds));
}
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"activity.basic.union", "activity.basic.union2"}, mode = SaMode.OR)
public Result doSubmitAdmin(String unionId, @Param(value = "userIds") String[] userIds) {
Sys_role sysRole = dao.fetch(Sys_role.class, Cnd.where("code", "=", RoleConstant.BRANCH_UNION_CHAIRMAN.name()));
//再删除工会负责人的权限
baseService.clear("sys_user_role", Cnd.where("unionId", "=", unionId).and("roleid", "=", sysRole.getId()));
for (String id : userIds) {
baseService.insert("sys_user_role", Chain.make("roleId", sysRole.getId()).add("userId", id).add("unionId", unionId));
}
sysUserService.clearCache();
sysRoleService.clearCache();
return Result.success();
}
@At
public Result branchUnionPartUnitPageData(PageForm pageForm, String unionId) {
Cnd cnd = Cnd.NEW();
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
cnd.and(Cnd.likeEX("name", pageForm.getSearchKeyword()));
}
cnd.and("unionId", "=", unionId);
cnd.asc("unitcode");
List<ActivityBasicUnit> list = dao.query(ActivityBasicUnit.class, cnd);
return Result.success(list);
}
@At
public Result branchUnionPartUnitTransferData(String unionId) {
// List<ActivityBasicUnit> units = dao.query(ActivityBasicUnit.class, Cnd.where("unitLevel", "=", 2).asc("unitcode"));
List<ActivityBasicUnit> units = dao.query(ActivityBasicUnit.class, Cnd.where("unitTypeCode", "=", "1").asc("unitcode"));
List<String> selectUnitIds = units.stream().filter(unit -> StrUtil.isNotBlank(unit.getUnionId()) && unit.getUnionId().equals(unionId)).map(ActivityBasicUnit::getId).toList();
NutMap transferData = NutMap.NEW().addv("selectUnitIds", selectUnitIds).addv("allUnits", units);
return Result.success(transferData);
}
@At
@Aop(TransAop.READ_COMMITTED)
public Result branchUnionPartUnitSet(String unionId, @Param("unitIds") String[] unitIds) {
dao.update(ActivityBasicUnit.class, Chain.make("unionId", null), Cnd.where("unionId", "=", unionId));
if (Lang.isNotEmpty(unitIds)) {
dao.update(ActivityBasicUnit.class, Chain.make("unionId", unionId), Cnd.where("id", "in", unitIds));
}
return Result.success();
}
}
@@ -0,0 +1,122 @@
package com.budwk.app.zhgh.activity.basic.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNode;
import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.sys.models.Sys_unit;
import com.budwk.app.zhgh.activity.basic.models.ActivityBasicUnit;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName ActivityBasicUnitController
* @Description TODO
* @Author zhf
* @Date 2024/8/6 11:45
*/
@IocBean
@At("/platform/activity/basic/unit")
@Ok("json:full")
public class ActivityBasicUnitController {
@Inject
private BaseService baseService;
@Inject
private Dao dao;
@At("")
@Ok("beetl:platform/zhgh/activity/basic/unit/index.html")
@SaCheckPermission("activity.basic.unit")
public void index() {
}
@At
@SaCheckPermission("activity.basic.unit")
public Result pageData(@Param(value = "parentId") String parentId, PageForm pageForm) {
Cnd cnd = Cnd.NEW();
if (StrUtil.isBlank(parentId)) {
cnd.and("parentId", "=", "1");
} else {
cnd.and("parentId", "=", parentId);
}
if (StrUtil.isNotBlank(pageForm.getSearchName()) && StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
cnd.and(Cnd.likeEX(pageForm.getSearchName(), pageForm.getSearchKeyword()));
}
Sql sql = Sqls.create("select id,parentId,name,unitcode,unitLevel,unionId from activity_basic_unit $condition");
cnd.asc("unitcode");
sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@SaCheckPermission("activity.basic.unit")
public Result tree() {
// List list = new ArrayList();
// ActivityBasicUnit parentId = dao.fetch(ActivityBasicUnit.class, Cnd.where("id", "=", "1"));
// if (parentId != null) {
// parentId.setChild(child(parentId.getId()));
// list.add(parentId);
// return Result.success().addData(list);
// }
List<ActivityBasicUnit> list = dao.query(ActivityBasicUnit.class, Cnd.NEW());
List<TreeNode<String>> nodeList = CollUtil.newArrayList();
for (int i = 0; i < list.size(); i++) {
nodeList.add(new TreeNode<>(list.get(i).getId(), list.get(i).getParentId(), list.get(i).getName(), i));
}
List<Tree<String>> treeList = TreeUtil.build(nodeList, "0000");
return Result.success(treeList);
}
private List<ActivityBasicUnit> child(String parentId) {
List<ActivityBasicUnit> units = dao.query(ActivityBasicUnit.class, Cnd.where("parentId", "=", parentId));
units.forEach(unit -> {
unit.setChild(child(unit.getId()));
});
return units;
}
@At
@Aop(TransAop.READ_COMMITTED)
public Result doDelete(String id) {
ActivityBasicUnit unit = dao.fetch(ActivityBasicUnit.class, id);
int count = dao.count(ActivityBasicUnit.class, Cnd.where("parentId", "=", unit.getParentId()).and("id", "!=", id));
dao.update(ActivityBasicUnit.class, Chain.make("hasChildren", count > 0), Cnd.where("id", "=", unit.getParentId()));
delete(id);
return Result.success();
}
private void delete(String id) {
Cnd cnd = Cnd.where("parentId", "=", id);
List<ActivityBasicUnit> units = dao.query(ActivityBasicUnit.class, cnd);
for (ActivityBasicUnit unit : units) {
delete(unit.getId());
}
dao.clear(ActivityBasicUnit.class, cnd);
dao.delete(ActivityBasicUnit.class, id);
}
}
@@ -0,0 +1,70 @@
package com.budwk.app.zhgh.activity.basic.models;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.DB;
import org.nutz.dao.entity.annotation.*;
import java.io.Serializable;
import java.util.List;
/**
* @author zhf
* @date 2021/2/23 15:36
* @description 活动基础设置
*/
@EqualsAndHashCode(callSuper = true)
@Data
@Table("activity_basic_settings")
@Comment("活动基础设置")
public class ActivityBasicSettings extends BaseModel implements Serializable {
@Column
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("父级ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String parentId;
@Column
@Comment("代码")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String code;
@Column
@Comment("名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String name;
@Column
@Comment("备注")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String note;
@Column
@Comment("有子节点")
@Default("0")
private Boolean hasChildren;
@Column
@Comment("排序字段")
@Prev({
@SQL(db = DB.MYSQL, value = "SELECT IFNULL(MAX(location),0)+1 FROM activity_basic_settings"),
@SQL(db = DB.ORACLE, value = "SELECT COALESCE(MAX(location),0)+1 FROM activity_basic_settings")
})
private Integer location;
private List<ActivityBasicSettings> child;
@Column
@Comment("服装项目")
@Default("0")
private Boolean clothing;
}
@@ -0,0 +1,32 @@
package com.budwk.app.zhgh.activity.basic.models;
import com.budwk.app.sys.models.Sys_union;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
/**
* TODO
*
* @Author zhf
* @Date 2022/7/28 13:49
*/
@EqualsAndHashCode(callSuper = true)
@Data
@Table
public class ActivityBasicUnion extends Sys_union {
@Column
@Name
@Comment("工会id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true, nullEffective = true)
private String id;
@Column
@Comment("添加来源")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String source;
}
@@ -0,0 +1,39 @@
package com.budwk.app.zhgh.activity.basic.models;
import com.budwk.app.base.model.BaseModel;
import com.budwk.app.sys.models.Sys_unit;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.DB;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.io.Serializable;
import java.util.List;
/**
* TODO
*
* @Author zhf
* @Date 2022/7/28 10:57
*/
@Data
@Table
@Comment("活动单位")
public class ActivityBasicUnit extends Sys_unit {
private static final long serialVersionUID = 1L;
@Column
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
private List<ActivityBasicUnit> child;
}
@@ -0,0 +1,93 @@
package com.budwk.app.zhgh.activity.basic.models;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import java.io.Serializable;
/**
* @author zhf
* @date 2021/2/24 14:29
* @description 比赛组别
*/
@EqualsAndHashCode(callSuper = true)
@Data
@Comment("比赛项目")
@Table("activity_event")
public class ActivityEvent extends BaseModel implements Serializable {
@Column
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("比赛组别")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String competitionCategory;
@Column
@Comment("距离")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String distance;
@Column
@Comment("运动项目")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String sports;
@Column
@Comment("项目类型")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String projectType;
@Column
@Comment("比赛项目编号")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String projectCode;
@Column
@Comment("男女分组")
@ColDefine(type = ColType.INT, width = 50)
private Integer isMenWomen;
@Column
@Comment("是否趣味")
@ColDefine(type = ColType.BOOLEAN)
private boolean isInterest;
@Column
@Comment("属于那个运动类型")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String exerciseType;
@Column
@Comment("项目全名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String allName;
@Column
@Comment("开始时间")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String startAgeDate;
@Column
@Comment("结束时间")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String endAgeDate;
@Column
@Comment("是否启用")
@ColDefine(type = ColType.BOOLEAN)
private Boolean whetherEnable;
@Column
@Comment("备注")
@ColDefine(type = ColType.TEXT)
private String note;
}
@@ -0,0 +1,54 @@
package com.budwk.app.zhgh.activity.basic.models;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import java.io.Serial;
import java.io.Serializable;
/**
* @author zxy
* @Description 活动人员范围设置
* @createTime 2022年01月04日 11:36:00
*/
@EqualsAndHashCode(callSuper = true)
@Table("activity_user_scope")
@Data
@Comment("活动人员范围设置")
@TableIndexes({
@Index(name = "INDEX_ACTIVITY_USER_SCOPE_GROUPID", fields = {"groupId"}, unique = false),
@Index(name = "INDEX_ACTIVITY_USER_SCOPE_USERID", fields = {"userId"}, unique = false)
})
public class ActivityUserScope extends BaseModel implements Serializable {
@Serial
private static final long serialVersionUID = -5794884307112120554L;
@Id
@Comment("id")
private Integer id;
@Column
@ColDefine
@Comment("groupId")
private Integer groupId;
@Column
@ColDefine(type = ColType.VARCHAR)
@Comment("name")
private String groupName;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("userid")
private String userId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("创建人")
private String creator;
}
@@ -0,0 +1,51 @@
package com.budwk.app.zhgh.activity.basic.param;
import com.budwk.app.base.param.PageForm;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @ClassName ActivityUserScopePageParar
* @Description TODO
* @Author zhf
* @Date 2024/8/5 16:32
*/
@EqualsAndHashCode(callSuper = false)
@Data
public class ActivityUserScopePageParam extends PageForm {
// 工会id
private String unionId;
// 单位id
private String unitId;
// 人类型
private String[] personTypes;
// 用户状态
private String[] userStates;
// 成员类型
private String[] memberTypes;
// 性类型
private String[] sexTypes;
// 年龄
private String[] age;
private Integer activityGroupId;
private Integer setGroupType;
private Integer setGroupId;
private String setGroupName;
// 教师会议id
private String sessionId;
// 角色id
private String[] roleIds;
// 用户id
private String[] userId;
// 俱乐部id
private String clubId;
// 逆向选择
private Boolean reverseSelection;
private String activityUserCnd;
private String props;
private String existsLoginNameRedisKey;
}
@@ -0,0 +1,24 @@
package com.budwk.app.zhgh.activity.basic.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope;
import org.nutz.dao.Cnd;
import org.nutz.dao.sql.Sql;
import java.util.List;
/**
* @author zxy
* @Description TODO
* @createTime 2022年01月06日 09:02:00
*/
public interface ActivityBasicScopeService extends BaseService<ActivityUserScope> {
Sql createSql(Cnd cnd);
/**
* 大量数据插入
*/
void largeDataInsert(List<ActivityUserScope> list) ;
}
@@ -0,0 +1,83 @@
package com.budwk.app.zhgh.activity.basic.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.base.utils.DateUtil;
import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope;
import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.impl.NutTxDao;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.IocBean;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author zxy
* @Description TODO
* @createTime 2022年01月06日 09:03:00
*/
@IocBean(args = {"refer:dao"})
@Slf4j
public class ActivityBasicScopeServiceImpl extends BaseServiceImpl<ActivityUserScope> implements ActivityBasicScopeService {
public ActivityBasicScopeServiceImpl(Dao dao) {
super(dao);
}
@Override
public Sql createSql(Cnd cnd) {
return null;
}
/**
* 大量数据插入
* 注:Future.get()可以同步等待线程执行完成,并且可以监听执行结果
* 你也可以用countDownLatch
*/
@Override
public void largeDataInsert(List<ActivityUserScope> list) {
log.info("开始时间" + DateUtil.getDateTime());
List<List<ActivityUserScope>> splitList = CollectionUtil.split(list, 500);
NutTxDao nutTxDao = new NutTxDao(dao()).setDebug(true);
nutTxDao.beginRC();
ExecutorService executorService = Executors.newWorkStealingPool();
List<Callable<Object>> taskList = new ArrayList<>();
for (List<ActivityUserScope> everyList : splitList) {
taskList.add(() -> nutTxDao.insert(everyList).size());
}
List<Future<Object>> futureList = null;
AtomicInteger atomicInteger = new AtomicInteger();
try {
futureList = executorService.invokeAll(taskList);
for (Future<Object> future : futureList) {
atomicInteger.getAndAdd((Integer) future.get());
}
if (atomicInteger.get() != list.size()) {
throw new RuntimeException("插入数据与期望数据条数不符");
}
nutTxDao.commit();
} catch (Exception e) {
nutTxDao.rollback();
throw new RuntimeException(e);
} finally {
executorService.shutdown();
}
log.info("结束时间" + DateUtil.getDateTime());
}
}
@@ -0,0 +1,27 @@
package com.budwk.app.zhgh.activity.basic.template;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode
@ContentRowHeight(20) // 内容行高
@HeadRowHeight(20) // 表头行高
@ColumnWidth(25)
public class UserTemp {
@ExcelProperty("工号")
private String loginName;
@ExcelProperty("姓名")
private String userName;
@ExcelIgnore
private String errorInfo;
}
@@ -0,0 +1,233 @@
package com.budwk.app.zhgh.activity.culture.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.result.Result;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissue;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissuePerson;
import com.budwk.app.zhgh.activity.culture.service.ActivityCultureService;
import com.budwk.app.zhgh.club.model.ClubUser;
import com.budwk.app.zhgh.club.model.SysClub;
import com.budwk.app.zhgh.club.service.SysClubService;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName ActivityCultureApplyActivityController
* @Description TODO
* @Author zhf
* @Date 2024/8/9 15:57
*/
@IocBean
@Ok("json:full")
@At("/platform/activity/culture/applyActivity")
public class ActivityCultureApplyActivityController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private FlowCommonService flowCommonService;
@Inject
private SysClubService sysClubService;
@Inject
private ActivityCultureService activityCultureService;
@At("/school")
@Ok("beetl:platform/zhgh/activity/culture/school/applyActivity/index.html")
@SaCheckPermission("activity.culture.applyActivity.school")
public void schoolIndex() {
}
@At("/union")
@Ok("beetl:platform/zhgh/activity/culture/union/applyActivity/index.html")
@SaCheckPermission("activity.culture.applyActivity.union")
public void unionIndex() {
}
@At("/club")
@Ok("beetl:platform/zhgh/activity/culture/club/applyActivity/index.html")
@SaCheckPermission("activity.culture.applyActivity.club")
public void clubIndex() {
}
/**
* @param activityScopeGroupId
* @return java.util.List<org.nutz.lang.util.NutMap>
* @author zhf
* @description 根据活动组别查询每个工会可以报名的人数
*/
@At
@SaCheckPermission(value = {"activity.culture.applyActivity.school", "activity.culture.applyActivity.union", "activity.culture.applyActivity.club"}, mode = SaMode.OR)
public Result getUnionData(String activityScopeGroupId) {
List<NutMap> unionData = activityCultureService.getUnionData(activityScopeGroupId);
return Result.success(unionData);
}
@At
@ApiOperation("保存活动申报")
@SLog(tag = "文化活动-活动申报", msg = "保存了一条文化活动记录")
@SaCheckPermission(value = {"activity.culture.applyActivity.school", "activity.culture.applyActivity.union", "activity.culture.applyActivity.club"}, mode = SaMode.OR)
public Result save(@Param("data") ActivityTissue tissue) {
if (tissue.getActivity_type() == 40002) {
tissue.setUnionId(SecurityUtil.getUnionId());
}
tissue.setUserId(SecurityUtil.getUserId());
tissue.setApplyTime(DateUtil.now());
if (StrUtil.isBlank(tissue.getId())){
activityCultureService.insertWith(tissue, "tissuePersonList");
}else{
tissue.getTissuePersonList().forEach(tissuePerson -> tissuePerson.setTissueId(tissue.getId()));
activityCultureService.insertOrUpdate(tissue);
activityCultureService.dao().clear(ActivityTissuePerson.class, Cnd.where(ActivityTissuePerson::getTissueId, "=", tissue.getId()));
activityCultureService.insert(tissue.getTissuePersonList());
}
return Result.success();
}
@At
@SaCheckLogin
@ApiOperation("提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"activity.culture.applyActivity.school", "activity.culture.applyActivity.union", "activity.culture.applyActivity.club"}, mode = SaMode.OR)
public Result submit(@Param("data") ActivityTissue tissue) {
if (tissue.getActivity_type() == 40002) {
tissue.setUnionId(SecurityUtil.getUnionId());
}
tissue.setUserId(SecurityUtil.getUserId());
tissue.setApplyTime(DateUtil.now());
activityCultureService.insertOrUpdate(tissue);
if (List.of(40002, 40003).contains(tissue.getActivity_type()) && tissue.getIsEnrollSystem()) {
// 开启流程实例
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, tissue);
ProcessInstance instance = flowEngine.startProcessInstanceByKey("WHHD", tissue.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
for (ProcessTask task : doingTaskList) {
flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args);
}
return Result.success();
}
if ( tissue.getIsEnrollSystem()) {
Sys_home_activity sysHomeActivity = tissue.covertToSysHomeActivity();
activityCultureService.insertOrUpdate(sysHomeActivity);
}
return Result.success();
}
@At
@SaCheckLogin
@ApiOperation("重新提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"activity.culture.applyActivity.school", "activity.culture.applyActivity.union", "activity.culture.applyActivity.club"}, mode = SaMode.OR)
public Result submitAgain(@Param("data") ActivityTissue tissue, @Param("taskId") Long taskId) {
if (tissue.getActivity_type() == 40002) {
tissue.setUnionId(SecurityUtil.getUnionId());
}
tissue.setUserId(SecurityUtil.getUserId());
tissue.setApplyTime(DateUtil.now());
activityCultureService.insertOrUpdate(tissue);
Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
flowCommonService.executeTask(dict);
return Result.success();
}
@At
@SLog(tag = "文化活动", msg = "编辑了一条文化活动记录", param = true, result = true)
@SaCheckPermission(value = {"activity.culture.applyActivity.school", "activity.culture.applyActivity.union", "activity.culture.applyActivity.club"}, mode = SaMode.OR)
public Result doEdit(@Param("tissue") @Valid ActivityTissue tissue) {
activityCultureService.doEditActivity(tissue);
return Result.success();
}
@At
@SaCheckPermission(value = {"activity.culture.applyActivity.school", "activity.culture.applyActivity.union", "activity.culture.applyActivity.club"}, mode = SaMode.OR)
public Result findUser(String serachWord,
Integer activity_type) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT id userId,username userName,loginname loginName,sex,mobile,unitname unitName,unionname unionName FROM `vw_user`
$condition
limit 0,30
""");
if (!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())) {
if (activity_type == 40002) {
cnd.and("unionId", "=", SecurityUtil.getUnionId());
} else if (activity_type == 40003) {
List<SysClub> myManageClub = sysClubService.getMyManageClub();
List<String> clubIds = myManageClub.stream().map(SysClub::getId).collect(Collectors.toList());
List<ClubUser> list = sysClubService.dao().query(ClubUser.class, Cnd.where(ClubUser::getClubId, "in", clubIds));
List<String> clubUserIds = list.stream().map(ClubUser::getUserId).toList();
cnd.and("id", "in", clubUserIds);
}
}
if (Strings.isNotBlank(serachWord)) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.andLike("username", serachWord);
group.orLike("loginname", serachWord);
cnd.and(group);
}
sql.setCondition(cnd);
return Result.success(activityCultureService.listMap(sql));
}
@At
@SaCheckPermission(value = {"activity.culture.applyActivity.school", "activity.culture.applyActivity.union", "activity.culture.applyActivity.club"}, mode = SaMode.OR)
public Result queryUserByIds(String[] ids) {
Sql sql = Sqls.create("select id,loginname,username,unitname,unionname,sex from vw_user where id in (@id)");
sql.setParam("id", ids);
return Result.success(activityCultureService.listMap(sql));
}
}
@@ -0,0 +1,177 @@
package com.budwk.app.zhgh.activity.culture.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissue;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissuePerson;
import com.budwk.app.zhgh.activity.culture.service.ActivityCultureApplyUserService;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
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.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* @ClassName ActivityCultureApplyUserController
* @Description TODO
* @Author zhf
* @Date 2024/8/10 14:30
*/
@IocBean
@Ok("json:full")
@At("/platform/activity/culture/applyUser")
public class ActivityCultureApplyUserController {
@Inject
private Dao dao;
@Inject
private ActivityCultureApplyUserService activityCultureApplyUserService;
@At("/school")
@Ok("beetl:platform/zhgh/activity/culture/school/applyUser/index.html")
@SaCheckPermission("activity.culture.applyUser.school")
public void schoolIndex() {
}
@At("/union")
@Ok("beetl:platform/zhgh/activity/culture/union/applyUser/index.html")
@SaCheckPermission("activity.culture.applyUser.union")
public void unionIndex() {
}
@At("/club")
@Ok("beetl:platform/zhgh/activity/culture/club/applyUser/index.html")
@SaCheckPermission("activity.culture.applyUser.club")
public void clubIndex() {
}
@At
@SaCheckPermission(value = {"activity.culture.applyUser.school", "activity.culture.applyUser.union", "activity.culture.applyUser.club"}, mode = SaMode.OR)
public Result pageData(PageForm page,
@Valid String year,
String name,
boolean isEnrolled,
Integer activity_type,
@Valid Integer state) {
Pagination pagination = activityCultureApplyUserService.pageData(page, year, name, activity_type, isEnrolled, state);
return Result.success(pagination);
}
@At
@SaCheckLogin
@ApiOperation(value = "报名")
public Result signUp(@Valid String activityId, @Param("teamUserIds") String[] teamUserIds, @Param("ext") String formData, boolean isAgain) {
ActivityTissue tissue = dao.fetch(ActivityTissue.class, activityId);
int count = dao.count(ActivityUserScope.class,
Cnd.where(ActivityUserScope::getUserId, "=", SecurityUtil.getUserId())
.and(ActivityUserScope::getGroupId, "=", tissue.getGroupId()));
if (count == 0) {
return Result.error("您没有权限报名!");
}
JSONObject dynamicFormParam = null;
if (StrUtil.isNotBlank(formData)) {
dynamicFormParam = Json.fromJson(JSONObject.class, formData);
}
if (ObjectUtil.isEmpty(teamUserIds)) {
teamUserIds = new String[]{};
}
synchronized (this) {
if (isAgain) {
//重新报名删除之前的报名信息
activityCultureApplyUserService.cancelSignUp(activityId);
}
activityCultureApplyUserService.signUp(activityId, Arrays.asList(teamUserIds), dynamicFormParam);
return Result.success().addMsg("报名成功!");
}
}
@At
@SLog(tag = "文化活动", msg = "取消报名")
@SaCheckPermission(value = {"activity.culture.applyUser.school", "activity.culture.applyUser.union", "activity.culture.applyUser.club"}, mode = SaMode.OR)
public Result cancelSignUp(@Valid String activityId) {
activityCultureApplyUserService.cancelSignUp(activityId);
return Result.success().addMsg("取消成功!");
}
@At
@SaCheckLogin
@ApiOperation(value = "队友搜索")
public Result queryTeammate(@Valid String keyword, Integer signUpMethod, String tissueId) {
Sql sql = Sqls.create("select id userId,username userName,loginname loginName,sex,mobile,unitName from vw_user $condition limit 0,10");
Cnd cnd = Cnd.NEW();
cnd.or(Cnd.likeEX("username", keyword));
cnd.or(Cnd.likeEX("loginname", keyword));
if (signUpMethod == 3) {
cnd.and("unionid", "=", SecurityUtil.getUnionId());
}
if (StrUtil.isNotBlank(tissueId) && signUpMethod == 2) {
List<ActivityTissuePerson> personList = activityCultureApplyUserService.query(Cnd.where(ActivityTissuePerson::getTissueId, "=", tissueId)
.and(ActivityTissuePerson::getApplyUserId, "!=", SecurityUtil.getUserId()));
List<String> userIds = personList.stream().map(ActivityTissuePerson::getUserId).toList();
cnd.andEX("id", "not in", userIds);
}
sql.setCondition(cnd);
List<NutMap> list = activityCultureApplyUserService.listMap(sql);
return Result.success(list);
}
@At
@SaCheckLogin
@ApiOperation(value = "队友查询")
public Result listTeamUser(@Valid String activityId) {
ActivityTissuePerson tissuePerson = dao.fetch(ActivityTissuePerson.class, Cnd.where(ActivityTissuePerson::getTissueId, "=", activityId).and(ActivityTissuePerson::getUserId, "=", SecurityUtil.getUserId()));
if (ObjectUtil.isNull(tissuePerson)) {
return Result.success(Collections.emptyList());
}
List<ActivityTissuePerson> list = dao.query(ActivityTissuePerson.class, Cnd.where(ActivityTissuePerson::getTissueId, "=", activityId)
.and(ActivityTissuePerson::getApplyUserId, "=", tissuePerson.getApplyUserId())
);
//list中 applyUserId 和 userId 相同的 排在第一位
list.sort(Comparator.comparing(u -> !u.getApplyUserId().equals(u.getUserId())));
return Result.success(list);
}
@At
@SaCheckLogin
@ApiOperation(value = "查询分工会报名人员")
public Result listTeamUserUnion(@Valid String activityId) {
List<ActivityTissuePerson> list = dao.query(ActivityTissuePerson.class, Cnd.where(ActivityTissuePerson::getTissueId, "=", activityId)
.and(ActivityTissuePerson::getApplyUserId, "=", SecurityUtil.getUserId())
);
return Result.success(list);
}
@At
@SaCheckLogin
@ApiOperation(value = "是否报名")
public Result isSignUp(@Valid String activityId) {
return Result.success();
}
}
@@ -0,0 +1,149 @@
package com.budwk.app.zhgh.activity.culture.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissue;
import com.budwk.app.zhgh.activity.culture.service.ActivityCultureService;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Strings;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.List;
/**
* @ClassName ActivityCultureAuditActivityController
* @Description TODO
* @Author zhf
* @Date 2024/8/12 10:48
*/
@IocBean
@Ok("json:full")
@At("/platform/activity/culture/auditActivity")
public class ActivityCultureAuditActivityController {
@At("/union")
@Ok("beetl:platform/zhgh/activity/culture/union/auditActivity/index.html")
@SaCheckPermission("activity.culture.auditActivity.union")
public void unionIndex() {
}
@At("/club")
@Ok("beetl:platform/zhgh/activity/culture/club/auditActivity/index.html")
@SaCheckPermission("activity.culture.auditActivity.club")
public void clubIndex() {
}
@Inject
private ActivityCultureService activityCultureService;
@Inject
private FlowCommonService flowCommonService;
@At
@SaCheckPermission(value = {"activity.culture.auditActivity.union", "activity.culture.auditActivity.club"}, mode = SaMode.OR)
public Result pageData(PageForm page, boolean approval,
String year,
String name,
String unionId,
Integer activity_type) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
tissue.*,
uni.name unionname ,
club.clubName,
abs.`name` projectTypeName,
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 activity_tissue tissue ON tissue.id = ins.businessNo
LEFT JOIN sys_union uni ON uni.id = tissue.unionId
LEFT JOIN sys_club club ON club.id = tissue.clubId
LEFT JOIN activity_basic_settings abs ON abs.`code`=tissue.projectTypeCode
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
$condition
""");
cnd.and("t.taskName", "=", "76a03838-caa4-4561-ba0f-0da0d3a17c37");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
cnd.andEX("YEAR(tissue.startTime)", "=", year);
cnd.andEX("tissue.unionId", "=", unionId);
cnd.andEX("tissue.activity_type", "=", activity_type);
if (approval) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (Strings.isNotBlank(name)) {
cnd.where().andLike("tissue.name", name);
}
if (StrUtil.isNotBlank(page.getPageOrderName()) && StrUtil.isNotBlank(page.getPageOrderBy())) {
cnd.orderBy(page.getPageOrderName(), page.getPageOrderBy().equalsIgnoreCase("ascending") ? "ASC" : "DESC");
} else {
cnd.desc("tissue.startTime");
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
return Result.success(activityCultureService.listPageMap(page.getPageNumber(), page.getPageSize(), sql));
}
@At
@SLog(tag = "文化活动", msg = "校工会审核了一条记录")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"activity.culture.auditActivity.union", "activity.culture.auditActivity.club"}, mode = SaMode.OR)
public Result doReview(@Param("data") String param, String id) {
Dict args = Json.fromJson(Dict.class, param);
ActivityTissue tissue = activityCultureService.dao().fetch(ActivityTissue.class, id);
if (args.getInt("submitType") == 1) {
Sys_home_activity sysHomeActivity = tissue.covertToSysHomeActivity();
activityCultureService.insertOrUpdate(sysHomeActivity);
}
flowCommonService.executeTask(args);
return Result.success();
}
}
@@ -0,0 +1,118 @@
package com.budwk.app.zhgh.activity.culture.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.ObjectUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissue;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissuePerson;
import com.budwk.app.zhgh.activity.culture.service.ActivityCultureService;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
/**
* @ClassName ActivityCultureInfoManageController
* @Description TODO
* @Author zhf
* @Date 2024/8/10 9:12
*/
@IocBean
@Ok("json:full")
@At("/platform/activity/culture/infoManage")
public class ActivityCultureInfoManageController {
@Inject
private ActivityCultureService activityCultureService;
@Inject
private Dao dao;
@At("/school")
@Ok("beetl:platform/zhgh/activity/culture/school/infoManage/index.html")
@SaCheckPermission("activity.culture.infoManage.school")
public void schoolIndex() {
}
@At("/union")
@Ok("beetl:platform/zhgh/activity/culture/union/infoManage/index.html")
@SaCheckPermission("activity.culture.infoManage.union")
public void unionIndex() {
}
@At("/club")
@Ok("beetl:platform/zhgh/activity/culture/club/infoManage/index.html")
@SaCheckPermission("activity.culture.infoManage.club")
public void clubIndex() {
}
@At
@SaCheckPermission(value = {"activity.culture.infoManage.school", "activity.culture.infoManage.union", "activity.culture.infoManage.club"}, mode = SaMode.OR)
public Result pageData(PageForm page, String year,
String name,
String unionId,
@Valid Integer activity_type) {
return Result.success(activityCultureService.pageData(page, year, name, unionId, activity_type));
}
@At
@SaCheckPermission(value = {"activity.culture.infoManage.school", "activity.culture.infoManage.union", "activity.culture.infoManage.club"}, mode = SaMode.OR)
public Result activityStatusChange(@Valid String id, @Valid Boolean isUnseal) {
activityCultureService.update(Chain.make("isUnseal", isUnseal), Cnd.where("id", "=", id));
activityCultureService.dao().update(Sys_home_activity.class,
Chain.make("enable", isUnseal),
Cnd.where("id", "=", id));
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "文化活动", msg = "删除了一条活动")
@SaCheckPermission(value = {"activity.culture.infoManage.school", "activity.culture.infoManage.union", "activity.culture.infoManage.club"}, mode = SaMode.OR)
public Result doDelete(@Valid String id) {
activityCultureService.delete(id);
activityCultureService.dao().clear(ActivityTissuePerson.class, Cnd.where(ActivityTissuePerson::getTissueId, "=", id));
activityCultureService.dao().delete(Sys_home_activity.class, id);
return Result.success();
}
@At
@SaCheckLogin
public Result findOne(@Valid String id) {
return Result.success(activityCultureService.findOne(id));
}
@At
@SaCheckLogin
@ApiOperation("获取活动信息")
public Result activityInfo(@Valid String id){
ActivityTissue tissue = dao.fetch(ActivityTissue.class, id);
String userId = tissue.getUserId();
Sql sql = Sqls.create("select username,loginname from sys_user where id = @userId").setParam("userId", userId);
sql.setCallback(Sqls.callback.map());
dao.execute(sql);
NutMap userMap = (NutMap)sql.getResult();
if(ObjectUtil.isNotNull(userMap)){
tissue.setUsername(userMap.getString("username"));
tissue.setLoginname(userMap.getString("loginname"));
}
return Result.success(tissue);
}
}
@@ -0,0 +1,283 @@
package com.budwk.app.zhgh.activity.culture.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.base.utils.DynamicFormFieldParserUtil;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.commons.base.Globals;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissue;
import com.budwk.app.zhgh.activity.culture.service.ActivityCultureApplyUserService;
import com.budwk.app.zhgh.club.model.SysClub;
import com.budwk.app.zhgh.club.service.SysClubService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @ClassName ActivityCultureUserStatistics
* @Description TODO
* @Author zhf
* @Date 2024/8/10 16:30
*/
@IocBean
@Ok("json:full")
@At("/platform/activity/culture/userStatistics")
@Slf4j
public class ActivityCultureUserStatisticsController {
@Inject
private ActivityCultureApplyUserService activityCultureApplyUserService;
@Inject
private SysClubService sysClubService;
@Inject
private Dao dao;
@At("/school")
@Ok("beetl:platform/zhgh/activity/culture/school/userStatistics/index.html")
@SaCheckPermission("activity.culture.userStatistics.school")
public void schoolIndex() {
}
@At("/union")
@Ok("beetl:platform/zhgh/activity/culture/union/userStatistics/index.html")
@SaCheckPermission("activity.culture.userStatistics.union")
public void unionIndex() {
}
@At("/club")
@Ok("beetl:platform/zhgh/activity/culture/club/userStatistics/index.html")
@SaCheckPermission("activity.culture.userStatistics.club")
public void clubIndex() {
}
@At
@SaCheckPermission(value = {"activity.culture.userStatistics.school", "activity.culture.userStatistics.union", "activity.culture.userStatistics.club"}, mode = SaMode.OR)
public Result pageData(@Valid PageForm page,
@Valid Integer activity_type,
@Valid String activityId,
String unionId) {
ActivityTissue tissue = dao.fetch(ActivityTissue.class, activityId);
Sql sql = Sqls.create("""
SELECT
atp.*
FROM
`activity_tissue_person` atp
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("atp.tissueId", "=", activityId);
cnd.andEX("atp.unionId", "=", unionId);
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
if (List.of(40001, 40002).contains(activity_type)) {
cnd.and("atp.unionId", "=", SecurityUtil.getUnionId());
} else if (activity_type == 40003) {
List<SysClub> myManageClub = sysClubService.getMyManageClub();
List<String> clubIdList = myManageClub.stream().map(SysClub::getId).collect(Collectors.toList());
cnd.and("atp.userId", "in", Sqls.create("SELECT userid FROM club_user WHERE clubId in (@clubIds)").setParam("clubIds", clubIdList));
}
}
if (Strings.isNotBlank(page.getSearchKeyword())) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.orLike("atp.userName", page.getSearchKeyword());
group.orLike("atp.loginName", page.getSearchKeyword());
cnd.and(group);
}
if (StrUtil.isNotBlank(page.getPageOrderName()) && StrUtil.isNotBlank(page.getPageOrderBy())) {
cnd.orderBy(page.getPageOrderName(), page.getPageOrderBy().equalsIgnoreCase("ascending") ? "ASC" : "DESC");
} else {
cnd.desc("atp.applyDateTime");
}
sql.setCondition(cnd);
Pagination pagination = activityCultureApplyUserService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
List<NutMap> list = pagination.getList();
for (NutMap row : list) {
if (StrUtil.isNotBlank(row.getString("dynamicFormData"))) {
Map<String, DynamicFormFieldParserUtil.FieldInfo> dynamicFormFieldInfo = DynamicFormFieldParserUtil.parseFormFields(tissue.getFormConfig(), row.getString("dynamicFormData"));
row.put("dynamicFormFieldInfo", dynamicFormFieldInfo);
}
}
return Result.success(pagination);
}
@At
@SaCheckPermission(value = {"activity.culture.userStatistics.school", "activity.culture.userStatistics.union", "activity.culture.userStatistics.club"}, mode = SaMode.OR)
public Result getActivityByYearOrType(Integer year,
@Valid Integer activity_type) {
Sql sql = Sqls.create("""
SELECT
tissue.*,
uni.name unionname ,
club.clubName,
abs.`name` projectTypeName,
atp.applyUserId,
ins.state instanceState,
CASE WHEN atp.id IS NOT NULL THEN 1 ELSE 0 END AS isEnrolled
FROM
activity_tissue tissue
LEFT JOIN sys_union uni ON uni.id = tissue.unionId
LEFT JOIN sys_club club ON club.id = tissue.clubId
LEFT JOIN activity_basic_settings abs ON abs.`code`=tissue.projectTypeCode
LEFT JOIN activity_tissue_person atp on atp.tissueId=tissue.id AND (atp.applyUserId = @userId OR atp.userId = @userId)
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = tissue.id AND ins.state = 20
$condition
""").setParam("userId", SecurityUtil.getUserId());
Cnd cnd = Cnd.where("tissue.activity_type", "=", activity_type);
cnd.and("tissue.projectTypeCode", "!=", 50004);
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("tissue.signUpMethod", "in", List.of(1, 2, 3));
if (activity_type == 40002) {
cnd.and("tissue.unionId", "=", SecurityUtil.getUnionId());
}
}
// 只查询流程实例状态为20的数据(已完成状态)
if (!List.of(40001).contains(activity_type)) {
cnd.and("ins.state", "=", 20);
}
cnd.andEX("YEAR(tissue.startTime)", "=", year).desc("tissue.startTime");
cnd.groupBy("tissue.id");
sql.setCondition(cnd);
return Result.success(activityCultureApplyUserService.list(sql));
}
@At
@SaCheckPermission(value = {"activity.culture.userStatistics.school", "activity.culture.userStatistics.union", "activity.culture.userStatistics.club"}, mode = SaMode.OR)
@Ok("void")
@ApiOperation("导出报名人员")
public void doExportUser(String id, String unionId, HttpServletResponse response) {
try {
ActivityTissue tissue = dao.fetch(ActivityTissue.class, id);
Sql sql = Sqls.create("""
SELECT
atp.*,
us.idcard idCard
FROM
`activity_tissue_person` atp
left join sys_user us on us.id=atp.userId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("atp.tissueId", "=", id);
cnd.andEX("atp.unionId", "=", unionId);
cnd.asc("atp.applyDateTime");
cnd.desc("atp.applyUserUserName");
sql.setCondition(cnd);
List<NutMap> list = activityCultureApplyUserService.listMap(sql);
//如果有动态表单
if (ObjectUtil.isNotNull(tissue.getFormConfig())) {
for (NutMap row : list) {
Map<String, DynamicFormFieldParserUtil.FieldInfo> dynamicFormFieldInfo = DynamicFormFieldParserUtil.parseFormFields(tissue.getFormConfig(), row.getString("dynamicFormData"));
if (ObjectUtil.isNotNull(dynamicFormFieldInfo)) {
dynamicFormFieldInfo.forEach((k, v) -> {
if (v.getType().equals("upload")) {
String val = ((List<String>) v.getValue()).stream().map(x -> Globals.AppDomain + x).collect(Collectors.joining(","));
row.put(k, val);
} else {
row.put(k, v.getDisplayValue());
}
});
}
}
}
List<ExcelExportEntity> entityList = new ArrayList<>();
entityList.add(new ExcelExportEntity("姓名", "userName", 20));
entityList.add(new ExcelExportEntity("工号", "loginName", 20));
entityList.add(new ExcelExportEntity("性别", "sex", 20));
entityList.add(new ExcelExportEntity("联系方式", "mobile", 20));
entityList.add(new ExcelExportEntity("身份证号", "idCard", 20));
entityList.add(new ExcelExportEntity("单位", "unitName", 20));
entityList.add(new ExcelExportEntity("工会", "unionName", 20));
if (List.of(2,3).contains(tissue.getSignUpMethod())) {
entityList.add(new ExcelExportEntity("报名人姓名", "applyUserUserName", 20));
}
entityList.add(new ExcelExportEntity("报名时间", "applyDateTime", 20));
//如果有动态表单
if (ObjectUtil.isNotNull(tissue.getFormConfig())) {
List<Map<String, Object>> formFields = DynamicFormFieldParserUtil.extractFormFields(tissue.getFormConfig());
System.out.println(formFields);
for (Map<String, Object> formField : formFields) {
entityList.add(new ExcelExportEntity((String) formField.get("title"), formField.get("field"), 20));
}
}
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, list);
CommonDownloadUtil.download("报名人员名单.xlsx", workbook, response);
} catch (Exception e) {
log.error("文化活动报名统计导出失败{}", e.getMessage());
}
}
@At
@SaCheckPermission(value = {"activity.culture.userStatistics.school", "activity.culture.userStatistics.union", "activity.culture.userStatistics.club"}, mode = SaMode.OR)
@Ok("json:full")
@ApiOperation("动态表单字段")
public Result dynamicTableColumns(@Valid String activityId) {
try {
List<NutMap> columns = new ArrayList<>();
ActivityTissue tissue = dao.fetch(ActivityTissue.class, activityId);
if (ObjectUtil.isNotNull(tissue.getFormConfig())) {
List<Map<String, Object>> formFields = DynamicFormFieldParserUtil.extractFormFields(tissue.getFormConfig());
System.out.println(formFields);
for (Map<String, Object> formField : formFields) {
NutMap res = NutMap.NEW()
.addv("label", formField.get("title"))
.addv("type", formField.get("type"))
.addv("field", formField.get("field"));
if (formField.get("type").equals("tableForm")) {
res.put("prop", "dynamicFormFieldInfo." + formField.get("field") + ".tableData");
} else {
res.put("prop", "dynamicFormFieldInfo." + formField.get("field") + ".displayValue");
}
columns.add(res);
}
}
return Result.success(columns);
} catch (Exception e) {
log.error("动态表单字段获取失败{}", e.getMessage());
return Result.error(e.getMessage());
}
}
}
@@ -0,0 +1,61 @@
package com.budwk.app.zhgh.activity.culture.h5Controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissue;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissuePerson;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
import java.util.List;
/**
* @ClassName H5ActivityCultureController
* @Description 手机端文化活动
* @Author zhf
* @Date 2024/8/16 16:42
*/
@IocBean
@Ok("json:full")
@At("/platform/h5/activity/culture")
public class H5ActivityCultureController {
@Inject
private BaseService baseService;
@Inject
private Dao dao;
@At("/applyUser")
@Ok("beetl:platform/zhghh5/activity/culture/applyUser.html")
@SaCheckPermission("h5.activity.culture.applyUser")
public void applyUserIndex() {
}
@At("/signUp")
@Ok("beetl:platform/zhghh5/activity/culture/signUp.html")
@SaCheckPermission("h5.activity.culture.applyUser")
public void applySignUp() {
}
@At
@SaCheckPermission("h5.activity.culture.applyUser")
@ApiOperation("查看活动详情")
public Result info(@Valid String id) {
ActivityTissue info = dao.fetch(ActivityTissue.class, id);
return Result.success(info);
}
}
@@ -0,0 +1,294 @@
package com.budwk.app.zhgh.activity.culture.models;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.model.BaseModel;
import com.budwk.app.base.model.CustomFormField;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.sys.services.SysHomeConvert;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import java.io.Serializable;
import java.util.List;
/**
* @author: Aaron
* @create: 2021-03-09 13:57
* @description: 社团或分工会活动校工会活动
**/
@EqualsAndHashCode(callSuper = true)
@Data
@Comment("文化活动表")
@Table("activity_tissue")
public class ActivityTissue extends BaseModel implements Serializable, SysHomeConvert {
@Column
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("创建人")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String userId;
@Column
@Comment("联系方式")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String mobile;
@Column
@Comment("举办单位")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String helpUnitIds;
@Column
@Comment("协办单位")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> unitId;
@Column
@Comment("活动名称")
@ColDefine(type = ColType.VARCHAR, width = 200)
private String name;
@Column
@Comment("活动编号")
@ColDefine(type = ColType.VARCHAR, width = 200)
private String activityCode;
@Column
@Comment("活动项目类型")
@ColDefine(type = ColType.VARCHAR, width = 200)
private String projectTypeCode;
@Column
@Comment("活动计划开始时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String startPlannedDate;
@Column
@Comment("活动计划结束时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String endPlannedDate;
@Column
@Comment("报名开始时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String applyStartTime;
@Column
@Comment("报名结束时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String applyEndTime;
@Column
@Comment("活动开始时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String startTime;
@Column
@Comment("活动结束时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String endTime;
@Column
@Comment("创建时间")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String applyTime;
@Column
@Comment("活动人数")
@ColDefine(type = ColType.INT, width = 6)
private Integer peopleNum;
@Column
@Comment("活动地点")
@ColDefine(type = ColType.VARCHAR, width = 200)
private String address;
@Column
@Comment("发票")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> billFiles;
@Column
@Comment("照片")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> photoFiles;
@Column
@Comment("其他")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> otherFiles;
@Column
@Comment("活动类型")
@ColDefine(type = ColType.INT, width = 10)
private Integer activity_type;
@Column
@Comment("创建人所属工会")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unionId;
@Column
@Comment("创建人所属社团")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String clubId;
@Column
@Comment("活动内容")
@ColDefine(type = ColType.TEXT)
private String activityContent;
@Column
@Comment("活动考核内容")
@ColDefine(type = ColType.TEXT)
private String activityExamineContent;
@Column
@Comment("报名方式(1.个人 2.分工会 null.不需要报名)")
@ColDefine(type = ColType.INT)
private Integer signUpMethod;
@Column
@Comment("限制方式(1.总人数限制 2.分工会人数限制 null.不限制)")
@ColDefine(type = ColType.INT)
private Integer userNumberLimit;
@Column
@Comment("是否需要签到")
@ColDefine(type = ColType.BOOLEAN)
private boolean needSign;
@Column
@Comment("签到经纬度")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> location;
@Column
@Comment("签到范围")
@ColDefine(type = ColType.INT)
private Integer rangeMeter;
@Column
@Comment("总人数限制")
@ColDefine(type = ColType.INT)
private Integer totalUserNumberLimit;
@Column
@Comment("组队人数")
@ColDefine(type = ColType.INT)
private Integer teamNum;
@Column
@Comment("分工会人数限制")
@ColDefine(type = ColType.MYSQL_JSON)
private List<NutMap> unionUserNumberLimit;
@Column
@Comment("活动总结")
@ColDefine(type = ColType.TEXT)
private String activitySummary;
@Column
@Comment("活动分组id")
@ColDefine(type = ColType.INT)
private Integer groupId;
@Column
@Comment("封面图")
@ColDefine(type = ColType.VARCHAR)
private String cover;
@Column
@Comment("审核状态")
@ColDefine(type = ColType.INT)
private Integer state;
@Column
@Comment("审核id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String auditId;
@Column
@Comment("是否报名系统")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isEnrollSystem;
@Column
@Comment("是否发送系统消息")
@ColDefine(type = ColType.BOOLEAN)
private Boolean xlFlag;
@Column
@Comment("是否开启")
@Default("1")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isUnseal;
@Column
@Comment("物品")
@ColDefine(type = ColType.MYSQL_JSON)
private List<NutMap> goods;
@Column
@Comment("主办单位")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> hostUnitIds;
@Column
@Comment("承办单位")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> undertakeUnitIds;
@Column
@Comment("报名表单配置")
@ColDefine(type = ColType.MYSQL_JSON)
private List<CustomFormField> formFieldConfig;
@Column
@Comment("报名表单配置")
@ColDefine(type = ColType.MYSQL_JSON)
private JSONObject formConfig;
@Many(field = "tissueId")
private List<ActivityTissuePerson> tissuePersonList;
private String username;
private String loginname;
@Override
public Sys_home_activity covertToSysHomeActivity() {
Sys_home_activity sysHomeActivity = new Sys_home_activity();
sysHomeActivity.setId(this.getId());
sysHomeActivity.setName(this.getName());
sysHomeActivity.setCover(this.getCover());
if (this.getActivity_type()==40001){
sysHomeActivity.setUrl("/platform/activity/culture/applyUser/school");
}else if (this.getActivity_type()==40002){
sysHomeActivity.setUrl("/platform/activity/culture/applyUser/union");
}else{
sysHomeActivity.setUrl("/platform/activity/culture/applyUser/club");
}
sysHomeActivity.setH5Url("/platform/h5/activity/culture/signUp?id=" + this.getId());
if (Lang.isNotEmpty(this.getApplyStartTime())) {
sysHomeActivity.setStartDate(DateUtil.parseDate(this.getApplyStartTime()));
sysHomeActivity.setEndDate(DateUtil.parseDate(this.getApplyEndTime()));
}
sysHomeActivity.setAllowUserGroupId(this.getGroupId());
sysHomeActivity.setEnable(this.getIsUnseal());
sysHomeActivity.setClassPath(this.getClass().getPackageName() + this.getClass().getName());
return sysHomeActivity;
}
}
@@ -0,0 +1,115 @@
package com.budwk.app.zhgh.activity.culture.models;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import java.io.Serializable;
/**
* @author: Aaron
* @create: 2021-03-09 14:02
* @description: 活动人员列表
**/
@EqualsAndHashCode(callSuper = true)
@Data
@Comment("文化活动报名表")
@Table("activity_tissue_person")
public class ActivityTissuePerson extends BaseModel implements Serializable {
@Column
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("分工会或社团活动ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String tissueId;
@Column
@Comment("用户ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String userId;
@Column
@Comment("报名人ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String applyUserId;
@Column
@Comment("报名人姓名")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String applyUserUserName;
@Column
@Comment("签字ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String signId;
@Column
@Comment("用户姓名")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String userName;
@Column
@Comment("用户工号")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String loginName;
@Column
@Comment("用户性别")
@ColDefine(type = ColType.VARCHAR, width = 2)
private String sex;
@Column
@Comment("用户手机号")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String mobile;
@Column
@Comment("用户单位ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unitId;
@Column
@Comment("用户单位")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String unitName;
@Column
@Comment("用户工会")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String unionName;
@Column
@Comment("用户工会ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unionId;
@Column
@Comment("是否签到")
@ColDefine(type = ColType.BOOLEAN)
private boolean isSign;
@Column
@Comment("签到时间")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String signTime;
@Column
@Comment("报名时间")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String applyDateTime;
@Column
@Comment("报名表数据")
@ColDefine(type = ColType.MYSQL_JSON)
private JSONObject dynamicFormData;
}
@@ -0,0 +1,38 @@
package com.budwk.app.zhgh.activity.culture.service;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissuePerson;
import org.nutz.lang.util.NutMap;
import java.util.List;
public interface ActivityCultureApplyUserService extends BaseService<ActivityTissuePerson> {
Pagination pageData(PageForm page,
String year,
String name,
Integer activity_type,
boolean isEnrolled,
Integer state);
/**
* 活动报名
*
* @param activityId 活动id
* @param personIds 队友
* @param dynamicFormParam 表单数据
*/
void signUp(String activityId, List<String> personIds, JSONObject dynamicFormParam);
/**
* 取消报名
* @param activityId 活动id
*/
void cancelSignUp(String activityId);
}
@@ -0,0 +1,27 @@
package com.budwk.app.zhgh.activity.culture.service;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissue;
import org.nutz.lang.util.NutMap;
import java.util.List;
public interface ActivityCultureService extends BaseService<ActivityTissue> {
/**
* @param activityScopeGroupId
* @return java.util.List<org.nutz.lang.util.NutMap>
* @author zhf
* @description 根据活动组别查询每个工会可以报名的人数
*/
List<NutMap> getUnionData(String activityScopeGroupId);
void doEditActivity(ActivityTissue tissue);
Object pageData(PageForm page, String year, String name, String unionId, Integer activity_type);
NutMap findOne(String id);
}
@@ -0,0 +1,268 @@
package com.budwk.app.zhgh.activity.culture.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissue;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissuePerson;
import com.budwk.app.zhgh.activity.culture.service.ActivityCultureApplyUserService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import java.util.List;
import java.util.Optional;
/**
* @ClassName ActivityCultureApplyUserServiceImpl
* @Description TODO
* @Author zhf
* @Date 2024/8/10 14:45
*/
@IocBean(args = {"refer:dao"})
public class ActivityCultureApplyUserServiceImpl extends BaseServiceImpl<ActivityTissuePerson> implements ActivityCultureApplyUserService {
public ActivityCultureApplyUserServiceImpl(Dao dao) {
super(dao);
}
@Override
public Pagination pageData(PageForm page, String year, String name, Integer activity_type, boolean isEnrolled, Integer state) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
tissue.*,
uni.name unionname ,
club.clubName,
abs.`name` projectTypeName,
atp.applyUserId,
ins.state instanceState,
CASE WHEN atp.id IS NOT NULL THEN 1 ELSE 0 END AS isEnrolled
FROM
activity_tissue tissue
LEFT JOIN sys_union uni ON uni.id = tissue.unionId
LEFT JOIN sys_club club ON club.id = tissue.clubId
LEFT JOIN activity_basic_settings abs ON abs.`code`=tissue.projectTypeCode
LEFT JOIN activity_tissue_person atp on atp.tissueId=tissue.id AND (atp.applyUserId = @userId OR atp.userId = @userId)
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = tissue.id
$condition
""").setParam("userId", SecurityUtil.getUserId());
if (Strings.isNotBlank(name)) {
cnd.where().andLike("tissue.name", name);
}
// 只查询流程实例状态为20的数据(已完成状态)校工会活动除外
if (!List.of(40001).contains(activity_type)) {
cnd.and("ins.state", "=", 20);
}
cnd.andEX("YEAR(tissue.startTime)", "=", year);
cnd.andEX("tissue.isUnseal", "=", true);
cnd.andEX("tissue.activity_type", "=", activity_type);
cnd.and("tissue.isEnrollSystem", "=", 1);
cnd.andEX("tissue.projectTypeCode", "!=", 50004);
cnd.andEX("tissue.signUpMethod", "in", List.of(1, 2, 3));
if (StrUtil.isNotBlank(page.getPageOrderName()) && StrUtil.isNotBlank(page.getPageOrderBy())) {
cnd.orderBy(page.getPageOrderName(), page.getPageOrderBy().equalsIgnoreCase("ascending") ? "ASC" : "DESC");
} else {
cnd.desc("tissue.startTime");
}
if (state == 1) {
} else if (state == 2) {
cnd.and("tissue.applyStartTime", "<", DateUtil.now());
cnd.and("tissue.applyEndTime", ">", DateUtil.now());
} else if (state == 3) {
cnd.and("tissue.applyEndTime", "<", DateUtil.now());
}
//针对活动组别内人员
cnd.and(new Static("""
EXISTS(
SELECT 1
FROM activity_user_scope
WHERE groupId = tissue.groupId
AND userId = '%s'
)
""".formatted(SecurityUtil.getUserId())));
//是否报名
cnd.and("atp.id", isEnrolled ? "IS NOT" : "IS", null);
cnd.groupBy("tissue.id");
sql.setCondition(cnd);
Pagination pagination = listPageMap(page.getPageNumber(), page.getPageSize(), sql);
return pagination;
}
@Override
public void signUp(String activityId, List<String> personIds, JSONObject dynamicFormParam) {
ActivityTissue tissue = dao().fetch(ActivityTissue.class, activityId);
//通用限制
// 判断是否有权限报名
if (tissue.getGroupId() != null) {
int count = dao().count(ActivityUserScope.class,
Cnd.where(ActivityUserScope::getGroupId, "=", tissue.getGroupId())
.and(ActivityUserScope::getUserId, "=", SecurityUtil.getUserId()));
if (count == 0) {
throw new BaseException("您不在本次活动参加人员范围内!");
}
}
if (ObjectUtil.isNotEmpty(tissue.getUserNumberLimit())) {
//总人数限制
if (tissue.getUserNumberLimit() == 1) {
Integer totalUserNumberLimit = tissue.getTotalUserNumberLimit();
int hasRegisterCount = count(Cnd.where(ActivityTissuePerson::getTissueId, "=", activityId));
if (!(totalUserNumberLimit - hasRegisterCount > 0)) {
throw new BaseException("报名名额已满!");
}
}
//分工会人数限制
if (tissue.getUserNumberLimit() == 2) {
int limitNumByUnion = getLimitNumByUnion(tissue.getUnionUserNumberLimit(), SecurityUtil.getUnionId());
//获取当前该分工会已报多少人
Sql sql = Sqls.create("""
SELECT
count(1)
FROM
activity_tissue_person atp
LEFT JOIN `vw_user` u ON u.id = atp.userId
WHERE
atp.tissueId = @activityId
AND u.unionid = @unionId
""");
sql.setParam("activityId", activityId).setParam("unionId", SecurityUtil.getUnionId());
int hasRegisterCount = count(sql);
if (!(limitNumByUnion - hasRegisterCount > 0)) {
throw new BaseException("该分工会报名名额已满!");
}
}
}
if (tissue.getSignUpMethod() == 1) {
//个人报名独有判断
View_user user = dao().fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId()));
ActivityTissuePerson activityTissuePerson = new ActivityTissuePerson();
activityTissuePerson.setTissueId(activityId);
activityTissuePerson.setUserId(user.getId());
activityTissuePerson.setUserName(user.getUsername());
activityTissuePerson.setLoginName(user.getLoginname());
activityTissuePerson.setSex(user.getSex());
activityTissuePerson.setMobile(user.getMobile());
activityTissuePerson.setUnitId(user.getUnitId());
activityTissuePerson.setUnitName(user.getUnitName());
activityTissuePerson.setUnionId(user.getUnionId());
activityTissuePerson.setUnionName(user.getUnionName());
activityTissuePerson.setApplyDateTime(DateUtil.now());
activityTissuePerson.setApplyUserId(user.getId());
activityTissuePerson.setApplyUserUserName(user.getUsername());
activityTissuePerson.setDynamicFormData(dynamicFormParam);
insert(activityTissuePerson);
} else if (tissue.getSignUpMethod() == 2) {
//组别报名独有判断
//判断自己是否已被别人组别
int count = dao().count(ActivityTissuePerson.class, Cnd.where(ActivityTissuePerson::getTissueId, "=", activityId)
.and(ActivityTissuePerson::getUserId, "=", SecurityUtil.getUserId()));
if (count > 0) {
throw new BaseException("您已被别人组别,请先联系报名人取消!");
}
//查询队友是否有已经报名了的人员
int persons = dao().count(ActivityTissuePerson.class, Cnd.where(ActivityTissuePerson::getTissueId, "=", activityId)
.and(ActivityTissuePerson::getUserId, "in", personIds));
if (persons > 1) {
throw new BaseException("您的队友已被别人组别,请先联系报名人取消!");
}
Sql sql = Sqls.create("""
SELECT
id AS userId,
username AS userName,
loginname AS loginName,
sex,
mobile,
unitName,
unionName,
'$activityId' AS tissueId,
'$applyUserId' AS applyUserId,
'$applyUserUserName' AS applyUserUserName,
'$applyDateTime' AS applyDateTime
FROM
`vw_user`
$condition
""");
sql.setVar("activityId", activityId);
sql.setVar("applyUserId", SecurityUtil.getUserId());
sql.setVar("applyDateTime", DateUtil.now());
sql.setVar("applyUserUserName", SecurityUtil.getUserUsername());
sql.setCondition(Cnd.where("id", "in", personIds));
List<ActivityTissuePerson> fullPersonList = listEntity(sql);
insert(fullPersonList);
} else if (tissue.getSignUpMethod() == 3) {
//分工会报名独有判断
//判断总人数限制
//判断分工会人数限制
Sql sql = Sqls.create("""
SELECT
id AS userId,
username AS userName,
loginname AS loginName,
sex,
mobile,
unitName,
unionName,
'$activityId' AS tissueId,
'$applyUserId' AS applyUserId,
'$applyUserUserName' AS applyUserUserName,
'$applyDateTime' AS applyDateTime
FROM
`vw_user`
$condition
""");
sql.setVar("activityId", activityId);
sql.setVar("applyUserId", SecurityUtil.getUserId());
sql.setVar("applyDateTime", DateUtil.now());
sql.setVar("applyUserUserName", SecurityUtil.getUserUsername());
sql.setCondition(Cnd.where("id", "in", personIds));
List<ActivityTissuePerson> fullPersonList = listEntity(sql);
insert(fullPersonList);
}
}
@Override
public void cancelSignUp(String activityId) {
dao().clear(ActivityTissuePerson.class, Cnd.where(ActivityTissuePerson::getTissueId, "=", activityId)
.and(ActivityTissuePerson::getApplyUserId, "=", SecurityUtil.getUserId()));
}
/**
* 获取某个分工会限制的数量
*
* @param unionUserNumberLimit
* @param unionId
* @return
*/
private int getLimitNumByUnion(List<NutMap> unionUserNumberLimit, String unionId) {
Optional<NutMap> unionLimitOptional = unionUserNumberLimit.stream().filter(v -> v.getString("id").equals(unionId)).findFirst();
return unionLimitOptional.map(map -> map.getInt("limitNum", 0)).orElse(0);
}
}
@@ -0,0 +1,187 @@
package com.budwk.app.zhgh.activity.culture.service.impl;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.model.Audit;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissue;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissuePerson;
import com.budwk.app.zhgh.activity.culture.service.ActivityCultureService;
import com.budwk.app.zhgh.club.model.SysClub;
import com.budwk.app.zhgh.club.service.SysClubService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName ActivityCultureServiceImpl
* @Description TODO
* @Author zhf
* @Date 2024/8/9 17:42
*/
@IocBean(args = {"refer:dao"})
public class ActivityCultureServiceImpl extends BaseServiceImpl<ActivityTissue> implements ActivityCultureService {
public ActivityCultureServiceImpl(Dao dao) {
super(dao);
}
@Inject
private SysClubService sysClubService;
@Override
public List<NutMap> getUnionData(String activityScopeGroupId) {
if (StrUtil.isBlank(activityScopeGroupId)) {
Sql sql = Sqls.create("""
SELECT
gh.id,
gh.name unionname,
count( u.id ) AS teacherCount
FROM
sys_union gh
LEFT JOIN `vw_user` u ON u.unionid = gh.id
GROUP BY
gh.id
""");
return listMap(sql);
} else {
Sql sql = Sqls.create("""
SELECT
gh.id,
gh.name unionname,
( SELECT count( 1 ) FROM `user` WHERE id IN ( SELECT userid FROM activity_user_scope WHERE groupId = @activityScopeGroupId ) AND unionId = gh.id ) as teacherCount
FROM
sys_union gh
LEFT JOIN `vw_user` u ON u.unionid = gh.id
GROUP BY
gh.id
""");
sql.setParam("activityScopeGroupId", activityScopeGroupId);
return listMap(sql);
}
}
@Override
public void doEditActivity(ActivityTissue tissue) {
update(tissue);
}
@Override
public Object pageData(PageForm page, String year, String name, String unionId, Integer activity_type) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
tissue.*,
uni.name unionname ,
club.clubName,
abs.`name` projectTypeName,
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
activity_tissue tissue
LEFT JOIN sys_union uni ON uni.id = tissue.unionId
LEFT JOIN sys_club club ON club.id = tissue.clubId
LEFT JOIN activity_basic_settings abs ON abs.`code`=tissue.projectTypeCode
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = tissue.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(tissue.applyTime)", "=", year);
cnd.andEX("tissue.projectTypeCode", "!=", "50004");
cnd.andEX("tissue.unionId", "=", unionId);
cnd.andEX("tissue.activity_type", "=", activity_type);
if (Strings.isNotBlank(name)) {
cnd.where().andLike("tissue.name", name);
}
SqlExpressionGroup group = new SqlExpressionGroup();
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(),
RoleConstant.SCHOOL_UNION_ADMIN.name())) {
if (AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_ADMIN.name(), RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
group.or("tissue.unionId", "=", SecurityUtil.getUnionId());
} else if (AuthUtil.hasRole(RoleConstant.CLUB_PRESIDENT.name())) {
List<SysClub> myManageClub = sysClubService.getMyManageClub();
List<String> clubIds = myManageClub.stream().map(SysClub::getId).collect(Collectors.toList());
group.or("tissue.clubId", "in", clubIds);
} else {
group.or("tissue.userId", "=", SecurityUtil.getUserId());
}
cnd.and(group);
}
if (StrUtil.isNotBlank(page.getPageOrderName()) && StrUtil.isNotBlank(page.getPageOrderBy())) {
cnd.orderBy(page.getPageOrderName(), page.getPageOrderBy().equalsIgnoreCase("ascending") ? "ASC" : "DESC");
} else {
cnd.desc("tissue.startTime");
}
//cnd.groupBy("tissue.id");
sql.setCondition(cnd);
return this.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
}
@Override
public NutMap findOne(String id) {
Sql sql = Sqls.create("""
SELECT
tissue.*,
uni.name unionname,
club.clubName,
u.username,
u.loginname,
abs.`name` projectTypeName,
aus.groupName
FROM
activity_tissue tissue
LEFT JOIN sys_union uni ON uni.id = tissue.unionId
LEFT JOIN sys_club club ON club.id = tissue.clubId
LEFT JOIN `vw_user` u ON u.id=tissue.userId
LEFT JOIN activity_basic_settings abs ON abs.`code`=tissue.projectTypeCode
LEFT JOIN activity_user_scope aus on aus.groupId=tissue.groupId
WHERE
tissue.id = @id
GROUP BY
tissue.id
""").setParam("id", id);
NutMap nutMap = (NutMap) dao().execute(sql.setCallback(Sqls.callback.map())).getResult();
List<ActivityTissuePerson> personList = dao().query(ActivityTissuePerson.class,
Cnd.where("tissueId", "=", nutMap.getString("id")));
nutMap.setv("tissuePersonList", personList);
if (Strings.isNotBlank(nutMap.getString("auditId"))) {
nutMap.setv("audit", dao().fetch(Audit.class, nutMap.getString("auditId")));
}
return nutMap;
}
}
@@ -0,0 +1,144 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.controller;
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 com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.models.ActivityDeclareInfo;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.service.ActivityDeclareService;
import com.budwk.app.zhgh.staffmanage.member.models.MemberChangeRecord;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameActivityDeclareApplyController
* @Date 2025/7/31 15:46
* @注释
*/
@IocBean
@Ok("json")
@ApiOperation("活动申报")
@At("/platform/activityDeclare/apply")
public class ActivityDeclareApplyController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private FlowCommonService flowCommonService;
@Inject
private ActivityDeclareService activityDeclareService;
@At("")
@SaCheckPermission("activityDeclare.apply")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/apply/index.html")
public void index() {
}
@At
@SaCheckPermission("activityDeclare.apply")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/apply/form.html")
public void form() {
}
@At
@ApiOperation("保存申请")
@SaCheckPermission("member.apply.submit")
@SLog(tag = "活动申报", msg = "保存申请,申请人: ${args[0].username}")
public Result save(@Param("data") ActivityDeclareInfo activityDeclareInfo) {
// 计算预算总金额
double sum = activityDeclareInfo.getBudgets().stream()
.mapToDouble(v -> ObjectUtil.defaultIfNull(v.getBudgetPrice(), 0D))
.sum();
activityDeclareInfo.setBudgetMoney(new BigDecimal(sum));
dao.insertOrUpdate(activityDeclareInfo);
return Result.success();
}
@At
@ApiOperation("提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.apply.submit")
@SLog(tag = "活动申报", msg = "提交申请,申请人: ${args[0].username}")
public Result submit(@Param("data") ActivityDeclareInfo activityDeclareInfo){
activityDeclareInfo.setYear(ObjectUtil.defaultIfNull(activityDeclareInfo.getYear(), DateUtil.thisYear()));
// 计算预算总金额
double sum = activityDeclareInfo.getBudgets().stream()
.mapToDouble(v -> ObjectUtil.defaultIfNull(v.getBudgetPrice(), 0D))
.sum();
activityDeclareInfo.setBudgetMoney(new BigDecimal(sum));
// 保存数据
dao.insertOrUpdate(activityDeclareInfo);
// 开启流程实例
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, activityDeclareInfo);
args.set("type", activityDeclareInfo.getActivityType());
ProcessInstance instance = flowEngine.startProcessInstanceByKey("HDSB", activityDeclareInfo.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
for (ProcessTask task : doingTaskList) {
flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args);
}
return Result.success();
}
@At
@ApiOperation("重新提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.apply.submit")
@SLog(tag = "活动申报", msg = "重新提交申请,申请人: ${args[0].username}")
public Result submitAgain(@Param("data") ActivityDeclareInfo activityDeclareInfo, @Param("taskId") Long taskId) {
activityDeclareInfo.setYear(ObjectUtil.defaultIfNull(activityDeclareInfo.getYear(), DateUtil.thisYear()));
// 计算预算总金额
double sum = activityDeclareInfo.getBudgets().stream()
.mapToDouble(v -> ObjectUtil.defaultIfNull(v.getBudgetPrice(), 0D))
.sum();
activityDeclareInfo.setBudgetMoney(new BigDecimal(sum));
dao.insertOrUpdate(activityDeclareInfo);
Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
dict.set("type", activityDeclareInfo.getActivityType());
flowCommonService.executeTask(dict);
return Result.success();
}
}
@@ -0,0 +1,127 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.service.ActivityDeclareService;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameActivityDeclareBranchUnionController
* @Date 2025/8/1 10:15
* @注释
*/
@IocBean
@Ok("json")
@ApiOperation("活动申报,分工会管理员审核")
@At("/platform/activityDeclare/branchUnion")
public class ActivityDeclareBranchUnionController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private ActivityDeclareService activityDeclareService;
@At("")
@SaCheckPermission("activityDeclare.branchUnion")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/branchunion/index.html")
public void index() {
}
@At
@SaCheckPermission("activityDeclare.branchUnion")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/branchunion/form.html")
public void form() {
}
@At
@ApiOperation("分工会审核列表")
@SaCheckPermission("activityDeclare.branchUnion")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
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 activity_declare_info 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
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
cnd.and("t.taskName", "=", "54f481d7-3239-4cd2-882d-e1cc18ea86eb");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (pageParam.getAudit()) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityDeclareService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
}
@@ -0,0 +1,119 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.service.ActivityDeclareService;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameActivityDeclareClubPrincipalController
* @Date 2025/8/1 10:15
* @注释
*/
@IocBean
@Ok("json")
@ApiOperation("活动申报,协会负责人审核")
@At("/platform/activityDeclare/clubPrincipal")
public class ActivityDeclareClubPrincipalController {
@Inject
private ActivityDeclareService activityDeclareService;
@At("")
@SaCheckPermission("activityDeclare.clubPrincipal")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/clubprincipal/index.html")
public void index() {
}
@At
@SaCheckPermission("activityDeclare.clubPrincipal")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/clubprincipal/form.html")
public void form() {
}
@At
@ApiOperation("活动申报,协会负责人审核列表")
@SaCheckPermission("activityDeclare.clubPrincipal")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
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 activity_declare_info 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
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
cnd.and("t.taskName", "=", "06d5979b-b52f-4df1-8974-087568322cd6");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (pageParam.getAudit()) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityDeclareService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
}
@@ -0,0 +1,296 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.BpmProcessConstant;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.base.utils.SysOfficeTemplateUtil;
import com.budwk.app.bpm.vo.BpmTaskApprovalRecordVo;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.vo.ProcessTaskVO;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.commons.base.Globals;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.models.ActivityDeclareInfo;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.service.ActivityDeclareService;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.models.ActivityReimbursementInfo;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.ActivityBudgetVO;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.*;
/**
* @version 1.0
* @Author zzr
* @nameActivityDeclareMineController
* @Date 2025/8/26 10:14
* @注释
*/
@Slf4j
@IocBean
@Ok("json")
@ApiOperation("我的活动申报")
@At("/platform/activityDeclare/mine")
public class ActivityDeclareMineController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private SysOfficeTemplateUtil sysOfficeTemplateUtil;
@Inject
private ActivityDeclareService activityDeclareService;
@At("")
@SaCheckPermission("activityDeclare.mine")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/mine/index.html")
public void index() {
}
@At
@ApiOperation("活动申报,我的申请列表")
@SaCheckPermission("activityDeclare.mine")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
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' AND taskState in (10,20)) AS startTaskId
FROM
activity_declare_info info
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 cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name())) {
if (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
cnd.and("info.unionId", "=", SecurityUtil.getUnionId());
} else {
cnd.and("info.userId", "=", SecurityUtil.getUserId());
}
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityDeclareService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@ApiOperation("活动申报,查看活动申报")
@SaCheckPermission("activityDeclare.mine")
public Result findOne(@Valid String id) {
ActivityDeclareInfo info = dao.fetch(ActivityDeclareInfo.class, id);
return Result.success().addData(info);
}
@At
@ApiOperation("删除活动申报")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("activityDeclare.mine")
@SLog(tag = "活动申报", msg = "删除活动申报id: ${args[0]}")
public Result onDelete(@Valid String id) {
dao.clear(ActivityDeclareInfo.class, Cnd.where("id", "=", id));
// 删除流程相关
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
// 如果有报销的流程,也一并删除
ActivityReimbursementInfo reimbursementInfo = dao.fetch(ActivityReimbursementInfo.class, Cnd.where("declareId", "=", id));
if (Lang.isNotEmpty(reimbursementInfo)) {
dao.clear(ActivityReimbursementInfo.class, Cnd.where("id", "=", reimbursementInfo.getId()));
// 删除流程相关
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(reimbursementInfo.getId());
}
return Result.success();
}
@At
@Ok("void")
@SaCheckPermission("activityDeclare.mine")
@SLog(tag = "活动申报", msg = "导出活动申报表")
public void doExportDeclare(@Valid String id, HttpServletResponse response) {
HashMap<String, Object> docData = new HashMap<>();
Sql sql = Sqls.create("""
SELECT
info.*,
ins.id AS instanceId
FROM
`activity_declare_info` info
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
WHERE
ins.state = 20 AND info.id = @id
""").setParam("id", id);
sql.setCallback(Sqls.callback.map());
dao.execute(sql);
NutMap info = (NutMap) sql.getResult();
String activityContent = info.getString("activityContent");
info.put("activityContent", sysOfficeTemplateUtil.convertRichTextToDocText(activityContent));
docData.put("schoolName", Globals.AppName);
docData.put("info", info);
List<ProcessTaskVO> doneTaskVos = new ArrayList<>();
List<ProcessTask> doneTaskList = flowEngine.processTaskService().getDoneTaskList(info.getLong("instanceId"), null);
for (ProcessTask doneTask : doneTaskList) {
ProcessTaskVO taskVO = flowEngine.processTaskService().findById(doneTask.getId());
doneTaskVos.add(taskVO);
}
// 分工会审核
doneTaskVos.stream().filter(task -> "分工会审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("fgh", approval);
});
// 协会负责人审核
doneTaskVos.stream().filter(task -> "协会负责人审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xh", approval);
});
// 校工会负责人审核
doneTaskVos.stream().filter(task -> "校工会负责人审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xfzr", approval);
});
// 校工会主席审核
doneTaskVos.stream().filter(task -> "校工会主席审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xzx", approval);
});
String budgetsStr = info.getString("budgets");
List<ActivityBudgetVO> list = JSONUtil.parseArray(budgetsStr).toList(ActivityBudgetVO.class);
for (int i = 0; i < list.size(); i++) {
list.get(i).setRanking(i + 1);
}
docData.put("budgets", list);
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder()
.bind("budgets", policy)
.build();
String fileName = Globals.AppName + "" + info.getString("activityName") + "】申报表.docx";
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("activity_declare"), config).render(docData).writeAndClose(byteArrayOutputStream);
CommonDownloadUtil.download(fileName, byteArrayOutputStream.toByteArray(), response);
} catch (IOException e) {
log.error("活动申报表导出失败,id:{},错误信息:{}", id, e.getMessage());
}
}
}
@@ -0,0 +1,120 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.service.ActivityDeclareService;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameActivityDeclareSchoolPrincipalController
* @Date 2025/8/1 10:16
* @注释
*/
@IocBean
@Ok("json")
@ApiOperation("活动申报,校工会负责人审核")
@At("/platform/activityDeclare/schoolPrincipal")
public class ActivityDeclareSchoolPrincipalController {
@Inject
private ActivityDeclareService activityDeclareService;
@At("")
@SaCheckPermission("activityDeclare.schoolPrincipal")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/schoolprincipal/index.html")
public void index() {
}
@At
@SaCheckPermission("activityDeclare.schoolPrincipal")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/schoolprincipal/form.html")
public void form() {
}
@At
@ApiOperation("活动申报,校工会负责人审核列表")
@SaCheckPermission("activityDeclare.schoolPrincipal")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
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 activity_declare_info 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
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
cnd.and("t.taskName", "=", "5b511275-143f-4ecd-8eff-7c8ad1456b1b");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (pageParam.getAudit()) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityDeclareService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
}
@@ -0,0 +1,118 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.service.ActivityDeclareService;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameActivityDeclareSchoolUnionController
* @Date 2025/8/1 10:16
* @注释
*/
@IocBean
@Ok("json")
@ApiOperation("活动申报,校工会审核")
@At("/platform/activityDeclare/schoolUnion")
public class ActivityDeclareSchoolUnionController {
@Inject
private ActivityDeclareService activityDeclareService;
@At("")
@SaCheckPermission("activityDeclare.schoolUnion")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/schoolunion/index.html")
public void index() {
}
@At
@SaCheckPermission("activityDeclare.schoolUnion")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/schoolunion/form.html")
public void form() {
}
@At
@ApiOperation("活动申报,校工会审核列表")
@SaCheckPermission("activityDeclare.schoolUnion")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
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 activity_declare_info 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
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
cnd.and("t.taskName", "=", "81428a9b-63c0-44b8-a28c-17d282c2cc8e");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (pageParam.getAudit()) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityDeclareService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
}
@@ -0,0 +1,39 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.interceptor;
import cn.hutool.core.date.DateUtil;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowInterceptor;
import com.budwk.app.flow.engine.core.Execution;
import com.budwk.app.flow.engine.core.ServiceContext;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.models.ActivityDeclareInfo;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.json.Json;
/**
* @version 1.0
* @Author zzr
* @nameActivityDeclareInterceptor
* @Date 2025/8/1 11:05
* @注释
*/
public class ActivityDeclareInterceptor implements FlowInterceptor {
@Override
public void intercept(Execution execution) {
String formDataStr = execution.getArgs().getStr(FlowConst.FORM_DATA);
Dao dao = ServiceContext.find(Dao.class);
ActivityDeclareInfo declareInfo = Json.fromJson(ActivityDeclareInfo.class, formDataStr);
declareInfo.setYear(DateUtil.thisYear());
// 设置流程变量
execution.getArgs().set("type", declareInfo.getActivityType());
dao.insertOrUpdate(declareInfo);
execution.getArgs().set(FlowConst.FORM_DATA, Json.toJson(declareInfo));
int instanceId = execution.getArgs().getInt(FlowConst.PROCESS_INSTANCE_ID_KEY);
dao.update(ProcessInstance.class, Chain.make("businessNo", declareInfo.getId()), Cnd.where(ProcessInstance::getId, "=", instanceId));
}
}
@@ -0,0 +1,132 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.models;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.model.BaseModel;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.ActivityBudgetVO;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameActivityDeclareInfo
* @Date 2025/7/31 15:38
* @注释
*/
@Data
@Table
@EqualsAndHashCode(callSuper = true)
public class ActivityDeclareInfo extends BaseModel {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("年份")
@ColDefine(type = ColType.INT, width = 4)
private Integer year;
@Column
@Comment("申请人id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String userId;
@Column
@Comment("申报人工号")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String loginName;
@Column
@Comment("申报人姓名")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String userName;
@Column
@Comment("联系方式")
@ColDefine(type = ColType.VARCHAR, width = 200)
private String mobile;
@Column
@Comment("申报单位(校工会/二级工会名称/协会名称)")
@ColDefine(type = ColType.VARCHAR, width = 200)
private String declareUnitName;
@Column
@Comment("工会id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unionId;
@Column
@Comment("协会id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String clubId;
@Column
@Comment("申请时间")
@ColDefine(type = ColType.DATETIME)
private Date applyTime;
@Column
@Comment("用户签字")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String sign;
@Column
@Comment("活动名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String activityName;
@Column
@Comment("活动地址")
@ColDefine(type = ColType.VARCHAR, width = 150)
private String activityAddress;
@Column
@Comment("活动计划开始时间")
@ColDefine(type = ColType.DATETIME)
private Date planStartTime;
@Column
@Comment("活动计划结束时间")
@ColDefine(type = ColType.DATETIME)
private Date planEndTime;
@Column
@Comment("活动类型")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String activityType;
@Column
@Comment("活动方案及简介")
@ColDefine(type = ColType.TEXT)
private String activityContent;
@Column
@Comment("活动人数")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String activityNumber;
@Column
@Comment("附件")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> files;
@Column
@Comment("活动经费预算")
@ColDefine(type = ColType.MYSQL_JSON)
private List<ActivityBudgetVO> budgets;
@Column
@Comment("预算总金额")
@ColDefine(customType = "decimal(10,2)")
private BigDecimal budgetMoney;
}
@@ -0,0 +1,14 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.models.ActivityDeclareInfo;
/**
* @version 1.0
* @Author zzr
* @nameActivityDeclareService
* @Date 2025/8/1 9:09
* @注释
*/
public interface ActivityDeclareService extends BaseService<ActivityDeclareInfo> {
}
@@ -0,0 +1,22 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.service.impl;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.models.ActivityDeclareInfo;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.service.ActivityDeclareService;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.IocBean;
/**
* @version 1.0
* @Author zzr
* @nameActivityDeclareServiceImpl
* @Date 2025/8/1 9:10
* @注释
*/
@IocBean(args = {"refer:dao"})
public class ActivityDeclareServiceImpl extends BaseServiceImpl<ActivityDeclareInfo> implements ActivityDeclareService {
public ActivityDeclareServiceImpl(Dao dao) {
super(dao);
}
}
@@ -0,0 +1,33 @@
package com.budwk.app.zhgh.activity.declarereimbursement.enums;
import com.budwk.app.base.annotation.DictEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @version 1.0
* @Author zzr
* @nameActivityDeclareReimbursement
* @Date 2025/7/31 17:01
* @注释
*/
@Getter
@AllArgsConstructor
@DictEnum(key = "ActivityDeclareReimbursement", name = "申报类型")
public enum ActivityDeclareReimbursement {
/**
* 校工会
*/
SCHOOL_UNION("校工会活动"),
/**
* 分工会
*/
BRANCH_UNION("分工会活动"),
/**
* 协会
*/
CLUB("协会活动");
private final String typeName;
}
@@ -0,0 +1,237 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller;
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 com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.models.ActivityDeclareInfo;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.models.ActivityReimbursementInfo;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.ActivityReimbursementService;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameActivityReimbursementApplyController
* @Date 2025/7/31 15:47
* @注释
*/
@IocBean
@Ok("json")
@ApiOperation("活动报销")
@At("/platform/activityReimbursement/apply")
public class ActivityReimbursementApplyController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private FlowCommonService flowCommonService;
@Inject
private ActivityReimbursementService activityReimbursementService;
@At("")
@SaCheckPermission("activityReimbursement.apply")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/apply/index.html")
public void index() {
}
@At
@SaCheckPermission("activityReimbursement.apply")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/apply/form.html")
public void form() {
}
@At
@ApiOperation("保存申请")
@SaCheckPermission("member.apply.submit")
@SLog(tag = "活动申报", msg = "保存申请,申请人: ${args[0].username}")
public Result save(@Param("data") ActivityReimbursementInfo activityReimbursementInfo) {
if (StrUtil.isBlank(activityReimbursementInfo.getDeclareId())) {
activityReimbursementInfo.setDeclareId(activityReimbursementInfo.getDeclareId());
}
// 计算实际总金额
double sum = activityReimbursementInfo.getBudgets().stream()
.mapToDouble(v -> ObjectUtil.defaultIfNull(v.getActualPrice(), 0D))
.sum();
activityReimbursementInfo.setActualMoney(new BigDecimal(sum));
dao.insertOrUpdate(activityReimbursementInfo);
return Result.success();
}
@At
@ApiOperation("提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.apply.submit")
@SLog(tag = "活动申报", msg = "提交申请,申请人: ${args[0].username}")
public Result submit(@Param("data") ActivityReimbursementInfo activityReimbursementInfo){
if (StrUtil.isBlank(activityReimbursementInfo.getDeclareId())) {
activityReimbursementInfo.setDeclareId(activityReimbursementInfo.getDeclareId());
}
activityReimbursementInfo.setYear(ObjectUtil.defaultIfNull(activityReimbursementInfo.getYear(), DateUtil.thisYear()));
// 计算实际总金额
double sum = activityReimbursementInfo.getBudgets().stream()
.mapToDouble(v -> ObjectUtil.defaultIfNull(v.getActualPrice(), 0D))
.sum();
activityReimbursementInfo.setActualMoney(new BigDecimal(sum));
dao.insertOrUpdate(activityReimbursementInfo);
// 开启流程实例
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, activityReimbursementInfo);
args.set("type", activityReimbursementInfo.getActivityType());
ProcessInstance instance = flowEngine.startProcessInstanceByKey("HDBX", activityReimbursementInfo.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
for (ProcessTask task : doingTaskList) {
flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args);
}
return Result.success();
}
@At
@ApiOperation("重新提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("member.apply.submit")
@SLog(tag = "活动申报", msg = "重新提交申请,申请人: ${args[0].username}")
public Result submitAgain(@Param("data") ActivityReimbursementInfo activityReimbursementInfo, @Param("taskId") Long taskId) {
if (StrUtil.isBlank(activityReimbursementInfo.getDeclareId())) {
activityReimbursementInfo.setDeclareId(activityReimbursementInfo.getDeclareId());
}
activityReimbursementInfo.setYear(ObjectUtil.defaultIfNull(activityReimbursementInfo.getYear(), DateUtil.thisYear()));
// 计算实际总金额
double sum = activityReimbursementInfo.getBudgets().stream()
.mapToDouble(v -> ObjectUtil.defaultIfNull(v.getActualPrice(), 0D))
.sum();
activityReimbursementInfo.setActualMoney(new BigDecimal(sum));
dao.insertOrUpdate(activityReimbursementInfo);
Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
flowCommonService.executeTask(dict);
return Result.success();
}
@At
@ApiOperation("获取当前用户活动报销")
@SaCheckPermission("activityReimbursement.apply")
public Result getActivityReimbursementByUser(String id) {
if (StrUtil.isNotBlank(id)) {
ActivityReimbursementInfo reimbursementInfo = dao.fetch(ActivityReimbursementInfo.class, id);
ActivityDeclareInfo info = dao.fetch(ActivityDeclareInfo.class, reimbursementInfo.getDeclareId());
return Result.success().addData(List.of(info));
}
// 查询已经报销成功的记录
Sql reiSql = Sqls.create("""
SELECT
info.declareId
FROM
activity_reimbursement_info info
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
WHERE
userId = @userId
AND ins.state IN (10, 20)
""").setParam("userId", SecurityUtil.getUserId());
reiSql.setCallback(Sqls.callback.strList());
dao.execute(reiSql);
List<String> reiDecIdList = reiSql.getList(String.class);
Sql sql = Sqls.create("select declareId from activity_reimbursement_info where userId = @userId").setParam("userId", SecurityUtil.getUserId());
sql.setCallback(Sqls.callback.strList());
dao.execute(sql);
List<String> declareIdList = sql.getList(String.class);
Sql applySql = Sqls.create("""
SELECT
info.*
FROM
activity_declare_info info
LEFT JOIN wf_process_instance ins ON info.id = ins.businessNo
$condition
""");
Cnd cnd = Cnd.NEW();
if (Lang.isNotEmpty(declareIdList)) {
cnd.and("info.id", "not in", declareIdList);
}
if (Lang.isNotEmpty(reiDecIdList)) {
cnd.and("info.id", "not in", reiDecIdList);
}
cnd.and("info.userId", "=", SecurityUtil.getUserId());
cnd.and("ins.state", "=", 20);
applySql.setCondition(cnd);
List<NutMap> resultList = activityReimbursementService.listMap(applySql);
return Result.success().addData(resultList);
}
@At
@ApiOperation("获取收款人卡号")
@SaCheckPermission("activityReimbursement.apply")
public Result getCardNumberByPayeeId(String username) {
Sql sql = Sqls.create("""
SELECT
JT.bankName,
JT.bankCardNum
FROM
activity_reimbursement_info AS info,
JSON_TABLE(
budgets,
'$[*]' COLUMNS(
username VARCHAR(255) PATH '$.username',
bankName VARCHAR(255) PATH '$.bankName',
bankCardNum VARCHAR(255) PATH '$.bankCardNum'
)
) AS JT
WHERE
JT.username = @username
ORDER BY info.applyTime DESC LIMIT 1
""").setParam("username", username);
sql.setCallback(Sqls.callback.map());
dao.execute(sql);
NutMap map = (NutMap) sql.getResult();
return Result.success().addData(map);
}
}
@@ -0,0 +1,274 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.activity.declarereimbursement.enums.ActivityDeclareReimbursement;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.ActivityReimbursementService;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @version 1.0
* @Author zzr
* @nameActivityReimbursementBoardController
* @Date 2025/8/26 16:10
* @注释
*/
@IocBean
@Ok("json")
@ApiOperation("活动报销图表展示")
@At("/platform/activityReimbursement/board")
public class ActivityReimbursementBoardController {
@Inject
private Dao dao;
@Inject
private ActivityReimbursementService activityReimbursementService;
@At("")
@SaCheckPermission("activityReimbursement.board")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/board/index.html")
public void index() {
}
@At
@ApiOperation("获取参与人数和活动报销经费数据")
@SaCheckPermission("activityReimbursement.board")
public Result getNumData(Integer startYear, Integer endYear){
Sql schoolSignNum = activityReimbursementService.getActivityUserNumAndMoneySql(startYear, endYear, false).setParam("type", ActivityDeclareReimbursement.SCHOOL_UNION.name());
Sql unionSignNum = activityReimbursementService.getActivityUserNumAndMoneySql(startYear, endYear, false).setParam("type", ActivityDeclareReimbursement.BRANCH_UNION.name());
Sql clubSignNum = activityReimbursementService.getActivityUserNumAndMoneySql(startYear, endYear, false).setParam("type", ActivityDeclareReimbursement.CLUB.name());
Sql schoolActivityMoney = activityReimbursementService.getActivityUserNumAndMoneySql(startYear, endYear, true).setParam("type", ActivityDeclareReimbursement.SCHOOL_UNION.name());
Sql unionActivityMoney = activityReimbursementService.getActivityUserNumAndMoneySql(startYear, endYear, true).setParam("type", ActivityDeclareReimbursement.BRANCH_UNION.name());
Sql clubActivityMoney = activityReimbursementService.getActivityUserNumAndMoneySql(startYear, endYear, true).setParam("type", ActivityDeclareReimbursement.CLUB.name());
HashMap result = new HashMap() {{
put("schoolSignNum", activityReimbursementService.listMap(schoolSignNum).stream().mapToInt(v->v.getInt("activityNum")).sum());
put("unionSignNum", activityReimbursementService.listMap(unionSignNum).stream().mapToInt(v->v.getInt("activityNum")).sum());
put("clubSignNum", activityReimbursementService.listMap(clubSignNum).stream().mapToInt(v->v.getInt("activityNum")).sum());
put("schoolActivityMoney", activityReimbursementService.count(schoolActivityMoney));
put("unionActivityMoney", activityReimbursementService.count(unionActivityMoney));
put("clubActivityMoney", activityReimbursementService.count(clubActivityMoney));
}};
return Result.success(result);
}
@At
@ApiOperation("获取活动的类型数量柱状图")
@SaCheckPermission("activityReimbursement.board")
public Result getActivityTypeChart(Integer startYear, Integer endYear){
Sql sql = Sqls.create("""
SELECT
count(1)
FROM
activity_reimbursement_info info
LEFT JOIN wf_process_instance ins ON info.id = ins.businessNo
WHERE
ins.state = 30
AND info.activityType = @type
AND info.`year` = @year
""");
List<NutMap> list = new ArrayList<>();
if (startYear == null || endYear == null) {
int nowYear = DateUtil.thisYear();
startYear = nowYear - 9;
endYear = nowYear;
}
for (int i = startYear; i <= endYear; i++) {
final int year = i;
list.add(new NutMap() {{
put("year", year);
put("type", "校工会活动");
put("num", activityReimbursementService.count(sql.setParam("type", ActivityDeclareReimbursement.SCHOOL_UNION.name()).setParam("year", year)));
}});
list.add(new NutMap() {{
put("year", year);
put("type", "分工会活动");
put("num", activityReimbursementService.count(sql.setParam("type", ActivityDeclareReimbursement.BRANCH_UNION.name()).setParam("year", year)));
}});
list.add(new NutMap() {{
put("year", year);
put("type", "社团活动");
put("num", activityReimbursementService.count(sql.setParam("type", ActivityDeclareReimbursement.CLUB.name()).setParam("year", year)));
}});
}
return Result.success().addData(list);
}
@At
@ApiOperation("获取活动的类型数量饼图")
@SaCheckPermission("activityReimbursement.board")
public Result getActivityTypePieNum(Integer startYear, Integer endYear){
Sql sql = Sqls.create("""
SELECT
count(1)
FROM
activity_reimbursement_info info
LEFT JOIN wf_process_instance ins ON info.id = ins.businessNo
WHERE
ins.state = 30
AND activityType = @type
AND `year` <= @startYear
AND `year` >= @endYear
""").setParam("startYear", startYear).setParam("endYear", endYear);
List<NutMap> list = new ArrayList<>();
list.add(new NutMap() {{
put("type", "校工会活动");
put("num", activityReimbursementService.count(sql.setParam("type", ActivityDeclareReimbursement.SCHOOL_UNION.name())));
}});
list.add(new NutMap() {{
put("type", "分工会活动");
put("num", activityReimbursementService.count(sql.setParam("type", ActivityDeclareReimbursement.BRANCH_UNION.name())));
}});
list.add(new NutMap() {{
put("type", "社团活动");
put("num", activityReimbursementService.count(sql.setParam("type", ActivityDeclareReimbursement.CLUB.name())));
}});
return Result.success(list);
}
@At
@ApiOperation("获取活动的经费统计图")
@SaCheckPermission("activityReimbursement.board")
public Result getActivityMoneyChart(Integer startYear, Integer endYear){
Sql sql = Sqls.create("""
SELECT
IFNULL(sum(info.actualMoney), 0) money
FROM
activity_reimbursement_info info
LEFT JOIN wf_process_instance ins ON info.id = ins.businessNo
WHERE
ins.state = 30
AND info.activityType = @type
AND info.`year` = @year
""");
List<NutMap> list = new ArrayList<>();
if (startYear == null || endYear == null) {
int nowYear = DateUtil.thisYear();
startYear = nowYear - 9;
endYear = nowYear;
}
for (int i = startYear; i <= endYear; i++) {
final int year = i;
list.add(new NutMap() {{
put("year", year);
put("type", "校工会费用");
put("num", activityReimbursementService.list(sql.setParam("type", ActivityDeclareReimbursement.SCHOOL_UNION.name()).setParam("year", year)).get(0).getDouble("money"));
}});
list.add(new NutMap() {{
put("year", year);
put("type", "分工会费用");
put("num", activityReimbursementService.list(sql.setParam("type", ActivityDeclareReimbursement.BRANCH_UNION.name()).setParam("year", year)).get(0).getDouble("money"));
}});
list.add(new NutMap() {{
put("year", year);
put("type", "社团费用");
put("num", activityReimbursementService.list(sql.setParam("type", ActivityDeclareReimbursement.CLUB.name()).setParam("year", year)).get(0).getDouble("money"));
}});
}
return Result.success(list);
}
@At
@ApiOperation("获取活动的经费饼图")
@SaCheckPermission("activityReimbursement.board")
public Result getActivityMoneyPieNum(Integer startYear, Integer endYear){
Sql schoolSql = activityReimbursementService.getActivityUserNumAndMoneySql(startYear, endYear, true).setParam("type", ActivityDeclareReimbursement.SCHOOL_UNION.name());
Sql unionSql = activityReimbursementService.getActivityUserNumAndMoneySql(startYear, endYear, true).setParam("type", ActivityDeclareReimbursement.BRANCH_UNION.name());
Sql clubSql = activityReimbursementService.getActivityUserNumAndMoneySql(startYear, endYear, true).setParam("type", ActivityDeclareReimbursement.CLUB.name());
List<NutMap> list = new ArrayList<>();
list.add(new NutMap() {{
put("type", "校工会费用");
put("num", activityReimbursementService.count(schoolSql));
}});
list.add(new NutMap() {{
put("type", "分工会费用");
put("num", activityReimbursementService.count(unionSql));
}});
list.add(new NutMap() {{
put("type", "社团费用");
put("num", activityReimbursementService.count(clubSql));
}});
return Result.success().addData(list);
}
@At
@ApiOperation("所有工会的报销费用或活动数统计")
@SaCheckPermission("activityReimbursement.board")
public Result allUnionActivityAndMoney(Integer year, Boolean isUnionMoney){
Sql sql = Sqls.create("""
SELECT
su.`name` AS unionname,
$unionSql
FROM
sys_union su
LEFT JOIN activity_reimbursement_info info ON su.id = info.unionId
AND info.activityType = "BRANCH_UNION"
AND info.`year` = @year
GROUP BY
su.`name`
ORDER BY
su.unionCode ASC
""").setParam("year", year);
sql.setVar("unionSql", isUnionMoney ? new Static(" COALESCE(SUM(info.actualMoney), 0) AS money ") : new Static(" count(info.id) as money "));
List<NutMap> list = activityReimbursementService.listMap(sql);
return Result.success(list);
}
@At
@ApiOperation("所有协会的报销费用或活动数统计")
@SaCheckPermission("activityReimbursement.board")
public Result allClubActivityAndMoney(Integer year, Boolean isClubMoney) {
Sql sql = Sqls.create("""
SELECT
sc.clubName,
$clubSql
FROM
sys_club sc
LEFT JOIN activity_reimbursement_info info ON sc.id = info.clubId
AND info.`year` = @year
AND info.activityType = "CLUB"
GROUP BY
sc.id
ORDER BY
sc.clubCode ASC
""").setParam("year", year);
sql.setVar("clubSql", isClubMoney ? new Static(" COALESCE(SUM(info.actualMoney), 0) AS money ") : new Static(" count(info.id) as money "));
List<NutMap> list = activityReimbursementService.listMap(sql);
return Result.success(list);
}
}
@@ -0,0 +1,119 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.ActivityReimbursementService;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameActivityReimbursementBranchUnionController
* @Date 2025/8/1 10:15
* @注释
*/
@IocBean
@Ok("json")
@ApiOperation("活动报销,分工会管理员审核")
@At("/platform/activityReimbursement/branchUnion")
public class ActivityReimbursementBranchUnionController {
@Inject
private ActivityReimbursementService activityReimbursementService;
@At("")
@SaCheckPermission("activityReimbursement.branchUnion")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/branchunion/index.html")
public void index() {
}
@At
@SaCheckPermission("activityReimbursement.branchUnion")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/branchunion/form.html")
public void form() {
}
@At
@ApiOperation("活动报销,分工会审核列表")
@SaCheckPermission("activityReimbursement.branchUnion")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
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 activity_reimbursement_info 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
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
cnd.and("t.taskName", "=", "1e4cc473-beae-427d-b9dc-c1c4d0eb07c8");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (pageParam.getAudit()) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityReimbursementService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
}
@@ -0,0 +1,120 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.ActivityReimbursementService;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameActivityReimbursementClubPrincipalController
* @Date 2025/8/1 10:15
* @注释
*/
@IocBean
@Ok("json")
@ApiOperation("活动报销,协会负责人审核")
@At("/platform/activityReimbursement/clubPrincipal")
public class ActivityReimbursementClubPrincipalController {
@Inject
private ActivityReimbursementService activityReimbursementService;
@At("")
@SaCheckPermission("activityReimbursement.clubPrincipal")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/clubprincipal/index.html")
public void index() {
}
@At
@SaCheckPermission("activityReimbursement.clubPrincipal")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/clubprincipal/form.html")
public void form() {
}
@At
@ApiOperation("活动报销,协会负责人审核列表")
@SaCheckPermission("activityReimbursement.clubPrincipal")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
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 activity_reimbursement_info 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
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
cnd.and("t.taskName", "=", "5afcf810-7a8b-4896-9aa7-c99995e0856b");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (pageParam.getAudit()) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityReimbursementService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
}
@@ -0,0 +1,379 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.convert.NumberChineseFormatter;
import cn.hutool.core.convert.NumberWordFormatter;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.base.utils.SysOfficeTemplateUtil;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.vo.ProcessTaskVO;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.web.commons.base.Globals;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.models.ActivityReimbursementInfo;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.ActivityReimbursementService;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.ActivityBudgetVO;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
/**
* @version 1.0
* @Author zzr
* @nameActivityReimbursementMineController
* @Date 2025/8/26 11:16
* @注释
*/
@IocBean
@Ok("json")
@Slf4j
@ApiOperation("我的活动报销")
@At("/platform/activityReimbursement/mine")
public class ActivityReimbursementMineController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private SysOfficeTemplateUtil sysOfficeTemplateUtil;
@Inject
private ActivityReimbursementService activityReimbursementService;
@At("")
@SaCheckPermission("activityReimbursement.mine")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/mine/index.html")
public void index() {
}
@At
@ApiOperation("活动报销,我的申请列表")
@SaCheckPermission("activityReimbursement.mine")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.declareId,
info.userName,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.startTime,
info.endTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
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' AND taskState in (10,20)) AS startTaskId
FROM
activity_reimbursement_info info
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 cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name())) {
if (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
cnd.and("info.unionId", "=", SecurityUtil.getUnionId());
} else {
cnd.and("info.userId", "=", SecurityUtil.getUserId());
}
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
// cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityReimbursementService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@ApiOperation("活动报销,查看活动报销")
@SaCheckPermission("activityReimbursement.mine")
public Result findOne(@Valid String id) {
ActivityReimbursementInfo info = dao.fetch(ActivityReimbursementInfo.class, id);
return Result.success().addData(info);
}
@At
@ApiOperation("删除活动报销")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("activityReimbursement.mine")
@SLog(tag = "活动报销", msg = "删除活动报销id: ${args[0]}")
public Result onDelete(@Valid String id) {
dao.clear(ActivityReimbursementInfo.class, Cnd.where("id", "=", id));
// 删除流程相关
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
return Result.success();
}
@At
@Ok("void")
@SaCheckPermission("activityReimbursement.mine")
@SLog(tag = "活动报销", msg = "导出报销凭证")
public void doExportReimbursement(@Valid String id, HttpServletResponse response) {
HashMap<String, Object> docData = new HashMap<>();
Sql sql = Sqls.create("""
SELECT
info.*,
ins.id AS instanceId
FROM
`activity_reimbursement_info` info
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
WHERE
ins.state = 20 AND info.id = @id
""").setParam("id", id);
sql.setCallback(Sqls.callback.map());
dao.execute(sql);
NutMap info = (NutMap) sql.getResult();
String activityContent = info.getString("activityContent");
if (activityContent != null) {
// 检查是否以<p>标签开头并以</p>标签结尾
if (activityContent.startsWith("<p>") && activityContent.endsWith("</p>")) {
// 去除最外层的<p>和</p>标签
activityContent = activityContent.substring(3, activityContent.length() - 4);
}
// 对处理后的内容进行富文本转换
info.put("activityContent", sysOfficeTemplateUtil.convertRichTextToDocText(activityContent));
}
double actualMoneyNum = info.getDouble("actualMoney");
// 分离整数和小数部分
long integerPart = (long) actualMoneyNum;
int decimalPartValue = (int) Math.round((actualMoneyNum - integerPart) * 100);
// 转换整数部分为中文大写
String integerChinese = NumberChineseFormatter.format(integerPart, true) + "";
// 处理小数部分
String decimalChinese = "";
int jiao = decimalPartValue / 10;
int fen = decimalPartValue % 10;
if (jiao > 0) {
decimalChinese += NumberChineseFormatter.format(jiao, true) + "";
}
if (fen > 0) {
decimalChinese += NumberChineseFormatter.format(fen, true) + "";
}
// 如果没有小数部分,添加"整"字
if (decimalChinese.isEmpty()) {
decimalChinese = "";
}
// 组合结果
String actualMoneyChinese = integerChinese + decimalChinese;
info.put("actualMoney", actualMoneyChinese);
docData.put("schoolName", Globals.AppName);
docData.put("info", info);
// 使用BigDecimal确保精确处理
BigDecimal bd = BigDecimal.valueOf(actualMoneyNum).setScale(2, RoundingMode.HALF_UP);
String moneyStr = bd.toPlainString();
// 分割整数和小数部分
String[] parts = moneyStr.split("\\.");
String integerPartStr = parts[0];
String decimalPartStr = parts.length > 1 ? parts[1] : "00";
// 确保小数部分是两位
if (decimalPartStr.length() < 2) {
decimalPartStr = String.format("%-2s", decimalPartStr).replace(' ', '0');
} else if (decimalPartStr.length() > 2) {
decimalPartStr = decimalPartStr.substring(0, 2);
}
// 处理小数部分(角和分)
int jiaoDigit = 0, fenDigit = 0;
if (decimalPartStr.length() >= 1) jiaoDigit = Character.getNumericValue(decimalPartStr.charAt(0));
if (decimalPartStr.length() >= 2) fenDigit = Character.getNumericValue(decimalPartStr.charAt(1));
// 处理整数部分(各位数值)
String reversed = new StringBuilder(integerPartStr).reverse().toString();
String[] units = {"", "十位", "百位", "千位", "万位", "十万位", "百万位"};
Map<String, Integer> digits = new HashMap<>();
for (int i = 0; i < reversed.length(); i++) {
if (i >= units.length) break;
digits.put(units[i], Character.getNumericValue(reversed.charAt(i)));
}
// 按照one到nine的顺序设置字段(从百万位到分位)
Map<String, Object> digitFields = new HashMap<>();
// one: 百万位
digitFields.put("one", digits.getOrDefault("百万位", 0));
// two: 十万位
digitFields.put("two", digits.getOrDefault("十万位", 0));
// three: 万位
digitFields.put("three", digits.getOrDefault("万位", 0));
// four: 千位
digitFields.put("four", digits.getOrDefault("千位", 0));
// five: 百位
digitFields.put("five", digits.getOrDefault("百位", 0));
// six: 十位
digitFields.put("six", digits.getOrDefault("十位", 0));
// seven: 元位
digitFields.put("seven", digits.getOrDefault("", 0));
// eight: 角
digitFields.put("eight", jiaoDigit);
// nine: 分
digitFields.put("nine", fenDigit);
// 将数字字段添加到info中
info.putAll(digitFields);
List<ProcessTaskVO> doneTaskVos = new ArrayList<>();
List<ProcessTask> doneTaskList = flowEngine.processTaskService().getDoneTaskList(info.getLong("instanceId"), null);
for (ProcessTask doneTask : doneTaskList) {
ProcessTaskVO taskVO = flowEngine.processTaskService().findById(doneTask.getId());
doneTaskVos.add(taskVO);
}
// 分工会审核
doneTaskVos.stream().filter(task -> "分工会审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("fgh", approval);
});
// 协会负责人审核
doneTaskVos.stream().filter(task -> "协会负责人审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xh", approval);
});
// 校工会负责人审核
doneTaskVos.stream().filter(task -> "校工会负责人审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xfzr", approval);
});
// 校工会主席审核
doneTaskVos.stream().filter(task -> "校工会主席审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xzx", approval);
});
String budgetsStr = info.getString("budgets");
List<ActivityBudgetVO> list = JSONUtil.parseArray(budgetsStr).toList(ActivityBudgetVO.class);
for (int i = 0; i < list.size(); i++) {
list.get(i).setRanking(i + 1);
}
docData.put("budgets", list);
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder()
.bind("budgets", policy)
.build();
String fileName = Globals.AppName + "" + info.getString("activityName") + "】报销凭证表.docx";
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("activity_reimbursement_voucher"), config).render(docData).writeAndClose(byteArrayOutputStream);
CommonDownloadUtil.download(fileName, byteArrayOutputStream.toByteArray(), response);
} catch (IOException e) {
log.error("报销凭证表导出失败,id:{},错误信息:{}", id, e.getMessage());
}
}
}
@@ -0,0 +1,119 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.ActivityReimbursementService;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameActivityReimbursementSchoolPrincipalController
* @Date 2025/8/1 10:16
* @注释
*/
@IocBean
@Ok("json")
@ApiOperation("活动报销,校工会负责人审核")
@At("/platform/activityReimbursement/schoolPrincipal")
public class ActivityReimbursementSchoolPrincipalController {
@Inject
private ActivityReimbursementService activityReimbursementService;
@At("")
@SaCheckPermission("activityReimbursement.schoolPrincipal")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/schoolprincipal/index.html")
public void index() {
}
@At
@SaCheckPermission("activityReimbursement.schoolPrincipal")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/schoolprincipal/form.html")
public void form() {
}
@At
@ApiOperation("活动报销,校工会负责人审核列表")
@SaCheckPermission("activityReimbursement.schoolPrincipal")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
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 activity_reimbursement_info 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
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
cnd.and("t.taskName", "=", "6dd2e8b3-fd0d-4b35-bb2a-1eef227cba96");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (pageParam.getAudit()) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityReimbursementService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
}
@@ -0,0 +1,119 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.ActivityReimbursementService;
import com.budwk.app.zhgh.activity.declarereimbursement.vo.CommonPageParam;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameActivityReimbursementSchoolUnionController
* @Date 2025/8/1 10:16
* @注释
*/
@IocBean
@Ok("json")
@ApiOperation("活动报销,校工会审核")
@At("/platform/activityReimbursement/schoolUnion")
public class ActivityReimbursementSchoolUnionController {
@Inject
private ActivityReimbursementService activityReimbursementService;
@At("")
@SaCheckPermission("activityReimbursement.schoolUnion")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/schoolunion/index.html")
public void index() {
}
@At
@SaCheckPermission("activityReimbursement.schoolUnion")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/reimbursement/schoolunion/form.html")
public void form() {
}
@At
@ApiOperation("活动报销,校工会审核列表")
@SaCheckPermission("activityReimbursement.schoolUnion")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
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 activity_reimbursement_info 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
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
cnd.and("t.taskName", "=", "47bfdf53-288c-4352-a403-0653483b54eb");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (pageParam.getAudit()) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
cnd.groupBy("t.id");
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityReimbursementService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
}
@@ -0,0 +1,38 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.interceptor;
import com.budwk.app.flow.constant.FlowConst;
import com.budwk.app.flow.engine.FlowInterceptor;
import com.budwk.app.flow.engine.core.Execution;
import com.budwk.app.flow.engine.core.ServiceContext;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.models.ActivityReimbursementInfo;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.json.Json;
/**
* @version 1.0
* @Author zzr
* @nameActivityReimbursementInterceptor
* @Date 2025/8/1 11:05
* @注释
*/
public class ActivityReimbursementInterceptor implements FlowInterceptor {
@Override
public void intercept(Execution execution) {
String formDataStr = execution.getArgs().getStr(FlowConst.FORM_DATA);
Dao dao = ServiceContext.find(Dao.class);
ActivityReimbursementInfo reimbursementInfo = Json.fromJson(ActivityReimbursementInfo.class, formDataStr);
reimbursementInfo.setDeclareId(reimbursementInfo.getId());
// 设置流程变量
execution.getArgs().set("type", reimbursementInfo.getActivityType());
dao.insertOrUpdate(reimbursementInfo);
execution.getArgs().set(FlowConst.FORM_DATA, Json.toJson(reimbursementInfo));
int instanceId = execution.getArgs().getInt(FlowConst.PROCESS_INSTANCE_ID_KEY);
dao.update(ProcessInstance.class, Chain.make("businessNo", reimbursementInfo.getId()), Cnd.where(ProcessInstance::getId, "=", instanceId));
}
}
@@ -0,0 +1,67 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.models;
import cn.hutool.json.JSONObject;
import com.budwk.app.zhgh.activity.declarereimbursement.declare.models.ActivityDeclareInfo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameActivityReimbursement
* @Date 2025/7/31 15:43
* @注释
*/
@Data
@Table
@EqualsAndHashCode(callSuper = true)
public class ActivityReimbursementInfo extends ActivityDeclareInfo {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("申报id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String declareId;
@Column
@Comment("实际总金额")
@ColDefine(customType = "decimal(10,2)")
private BigDecimal actualMoney;
@Column
@Comment("活动开始时间")
@ColDefine(type = ColType.DATETIME)
private Date startTime;
@Column
@Comment("活动结束时间")
@ColDefine(type = ColType.DATETIME)
private Date endTime;
@Column
@Comment("发票")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> billFiles;
@Column
@Comment("照片")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> photoFiles;
@Column
@Comment("其他")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> otherFiles;
}
@@ -0,0 +1,18 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.models.ActivityReimbursementInfo;
import org.nutz.dao.sql.Sql;
/**
* @version 1.0
* @Author zzr
* @nameActivityReimbursementService
* @Date 2025/8/1 9:10
* @注释
*/
public interface ActivityReimbursementService extends BaseService<ActivityReimbursementInfo> {
Sql getActivityUserNumAndMoneySql(Integer startYear, Integer endYear, Boolean isActivityMoney);
}
@@ -0,0 +1,56 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.impl;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.models.ActivityReimbursementInfo;
import com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.service.ActivityReimbursementService;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.IocBean;
/**
* @version 1.0
* @Author zzr
* @nameActivityReimbursementServiceImpl
* @Date 2025/8/1 9:10
* @注释
*/
@IocBean(args = {"refer:dao"})
public class ActivityReimbursementServiceImpl extends BaseServiceImpl<ActivityReimbursementInfo> implements ActivityReimbursementService {
public ActivityReimbursementServiceImpl(Dao dao) {
super(dao);
}
@Override
public Sql getActivityUserNumAndMoneySql(Integer startYear, Integer endYear, Boolean isActivityMoney) {
if (isActivityMoney) {
return Sqls.create("""
SELECT
SUM(info.actualMoney)
FROM
activity_reimbursement_info info
LEFT JOIN wf_process_instance ins ON info.id = ins.businessNo
WHERE
ins.state = 30
AND info.activityType = @type
AND info.`year` >= @startYear
AND info.`year` <= @endYear
""")
.setParam("startYear", startYear).setParam("endYear", endYear);
} else {
return Sqls.create("""
SELECT
info.activityNumber AS activityNum
FROM
activity_reimbursement_info info
LEFT JOIN wf_process_instance ins ON info.id = ins.businessNo
WHERE
ins.state = 30
AND info.activityType = @type
AND info.`year` >= @startYear
AND info.`year` <= @endYear
""").setParam("startYear", startYear).setParam("endYear", endYear);
}
}
}
@@ -0,0 +1,46 @@
package com.budwk.app.zhgh.activity.declarereimbursement.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @version 1.0
* @Author zzr
* @nameActivityBudget
* @Date 2025/7/31 16:23
* @注释
*/
@Data
@ApiModel("费用预算")
public class ActivityBudgetVO {
private Integer ranking;
@ApiModelProperty(value = "名称")
private String name;
@ApiModelProperty(value = "预算费用")
private Double budgetPrice;
@ApiModelProperty(value = "实际费用")
private Double actualPrice;
@ApiModelProperty(value = "收款人id")
private String payeeId;
@ApiModelProperty(value = "收款人姓名")
private String username;
@ApiModelProperty(value = "收款人工号")
private String loginName;
@ApiModelProperty(value = "支行名称")
private String bankName;
@ApiModelProperty(value = "报销卡号")
private String bankCardNum;
@ApiModelProperty(value = "备注")
private String remark;
}
@@ -0,0 +1,64 @@
package com.budwk.app.zhgh.activity.declarereimbursement.vo;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.declarereimbursement.enums.ActivityDeclareReimbursement;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.Cnd;
import org.nutz.dao.util.cri.SqlExpressionGroup;
/**
* @version 1.0
* @Author zzr
* @nameCommonPageParam
* @Date 2025/7/31 16:44
* @注释
*/
@Data
@ApiModel("通用分页参数")
@EqualsAndHashCode(callSuper = true)
public class CommonPageParam extends PageForm {
private Integer year;
private String clubId;
private String unionId;
public void buildSearch(Cnd cnd, String prefix) {
if (cnd == null) {
cnd = Cnd.NEW();
}
if (StrUtil.isNotBlank(this.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike(prefix + "userName", this.getSearchKeyword());
seg.orLike(prefix + "loginName", this.getSearchKeyword());
cnd.and(seg);
}
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and(prefix + "declareUnitName", "<>", ActivityDeclareReimbursement.SCHOOL_UNION.name());
if (AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_CHAIRMAN.name(),
RoleConstant.BRANCH_UNION_ADMIN.name(),
RoleConstant.BRANCH_UNION_OPERATOR.name())) {
cnd.and(prefix + "unionid", "=", SecurityUtil.getUnionId());
} else if (AuthUtil.hasRoleOr(RoleConstant.CLUB_MANAGER.name(), RoleConstant.CLUB_PRESIDENT.name())) {
// cnd.and(prefix + "clubId", "=", );
} else {
cnd.andEX(prefix + "userId", "=", SecurityUtil.getUserId());
}
} else {
cnd.andEX(prefix + "unionId", "=", this.getUnionId());
cnd.andEX(prefix + "clubId", "=", this.getClubId());
}
}
}
@@ -0,0 +1,25 @@
package com.budwk.app.zhgh.activity.family.constant;
import com.budwk.app.base.annotation.DictEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @Author JyuHsin
* @Date 2022/11/18
* @Description
*/
@Getter
@DictEnum(key = "ColumnFormTypeEnum", name = "控件类型")
@AllArgsConstructor
public enum ColumnFormTypeEnum {
INPUT("INPUT", "输入框"),
SELECT("SELECT", "选择框"),
STEPPER("STEPPER", "步进器"),
//RADIO("RADIO", "单选框"),//选项数组
FILE("FILE", "文件");
private String code;
private String description;
}
@@ -0,0 +1,434 @@
package com.budwk.app.zhgh.activity.family.controller.manage;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_dict;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.services.SysDictService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope;
import com.budwk.app.zhgh.activity.family.models.*;
import com.budwk.app.zhgh.activity.family.service.FamilyActivityService;
import com.budwk.app.zhgh.activity.family.service.FamilyActivityStatisticsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.*;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "活动报名")
@At("/platform/family/apply")
public class FamilyActivityApplyController {
private final ReentrantLock lock = new ReentrantLock(true);
@Inject
private FamilyActivityService familyActivityService;
@Inject
private SysDictService dictService;
@Inject
private FamilyActivityStatisticsService statisticsService;
@Inject
private Dao dao;
@At("/")
@SaCheckPermission("family.apply")
@Ok("beetl:/platform/zhgh/activity/family/apply/index.html")
public void index() {
}
@At("/h5")
@SaCheckPermission("h5.family.apply")
@Ok("beetl:/platform/zhghh5/activity/family/apply/index.html")
public void h5Index() {
}
@At("/list/h5")
@SaCheckPermission("h5.family.apply")
@Ok("beetl:/platform/zhghh5/activity/family/list/index.html")
public void listIndex() {
}
@At
@ApiOperation("活动查询")
@SaCheckPermission(value = {"family.apply", "h5.family.apply"}, mode = SaMode.OR)
public Result activityPageData(PageForm pageForm,
@Param(value = "year") Integer year,
@Param(value = "activityType") Integer activityType,
@Param(value = "id") String id,
@Param(value = "dataType") String dataType) {
Cnd cnd = Cnd.NEW();
cnd.andEX("id", "=", id);
cnd.andEX("`year`", "=", year);
//查询报名中
if (activityType == 2) {
cnd.and(new Static("now() < activitySignUpEndTime"));
}//查询已结束的
else if (activityType == 3) {
cnd.and(new Static("now() >= activityEndTime"));
}
if (AuthUtil.hasRole("H04") && !AuthUtil.hasRoleOr("sysadmin, A06")) {
cnd.and("activityMode", "=", 2).and("createdBy", "=", SecurityUtil.getUserId());
}
if("mine".equals(dataType)) {
cnd.and(new Static("id in (select activityId from family_user where userId = '%s')".formatted(SecurityUtil.getUserId())));
}
Pagination pagination = familyActivityService.listPage(pageForm.getPageNumber(), pageForm.getPageSize(), cnd);
List<FamilyActivity> familyActivities = pagination.getList();
Map<String, String> familyTypeMap = dictService.getSubListByCode("FAMILY_SIGNUP_TYPE").stream().collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName));
familyActivities.forEach(v -> v.setTrainType(familyTypeMap.get(v.getTrainType())));
return Result.success(pagination);
}
@At
@ApiOperation("分活动查询")
@SaCheckPermission(value = {"family.apply", "h5.family.apply"}, mode = SaMode.OR)
public Result pageData(PageForm pageForm,
@Param(value = "courseTypeId") String courseTypeId,
@Param(value = "activityId") String activityId,
@Param(value = "assortTypes") String[] assortTypes,
@Param(value = "dataType") String dataType) {
FamilyActivity activity = dao.fetch(FamilyActivity.class, activityId);
Sql sql = Sqls.create("""
SELECT
tsuc.*,
type.typeName
FROM
`family_course` tsuc
LEFT JOIN family_type type ON type.id = tsuc.courseType
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("type.id", "=", courseTypeId);
cnd.and("tsuc.activityId", "=", activityId);
if(Lang.isNotEmpty(assortTypes)) {
cnd.and("tsuc.assort", "in", assortTypes);
}
if("mine".equals(dataType)) {
cnd.and(new Static("tsuc.id in (select courseId from family_user where userId = '%s')".formatted(SecurityUtil.getUserId())));
}
List<FamilyCourse> courseArray = familyActivityService.dao().query(FamilyCourse.class, Cnd.where("activityId", "=", activityId));
courseArray = familyActivityService.filterCourseByHostUnion(courseArray);
cnd.and("tsuc.id", "in", courseArray.stream().map(FamilyCourse::getId).toList());
cnd.asc("tsuc.orderNum");
cnd.asc("type.code");
sql.setCondition(cnd);
Pagination pagination = familyActivityService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
List<NutMap> courseList = pagination.getList();
courseList.forEach(c -> {
List<FamilyActivityCourse> courseTimes = dao.query(FamilyActivityCourse.class, Cnd.where("courseId", "=", c.getString("id")).asc("courseDate"));
c.put("courseTimes", courseTimes);
c.put("hasRegisterNum", statisticsService.queryCourseCount(c.getString("id"), c.getString("courseType")));
c.put("hasWaitingNum", statisticsService.queryCourseWaitCount(c.getString("id"), c.getString("courseType")));
//当前用户是否报过
c.put("isSign", familyActivityService.isSignCourseByUser(c.getString("id"), SecurityUtil.getUserId()));
if(StrUtil.isNotBlank(c.getString("unionLimit"))) {
List<NutMap> unionLimit = Json.fromJsonAsList(NutMap.class, c.getString("unionLimit"));
if(Lang.isNotEmpty(unionLimit)) {
NutMap nutMap = unionLimit.stream().filter(o -> o.getString("id").equals(SecurityUtil.getUnionId())).findFirst().orElse(null);
if(nutMap != null) {
c.put("coursePeopleNumber", nutMap.getInt("limitCount"));
}
}
}
List<FamilyUser> userList = dao.query(FamilyUser.class, Cnd.where("courseId", "=", c.getString("id")).and("userId", "=", SecurityUtil.getUserId()));
List<String> values = new ArrayList<>();
if(Lang.isNotEmpty(userList)) {
for (FamilyUser familyUser : userList) {
List<List<NutMap>> mobileColumnsValue = familyUser.getMobileColumnsValue();
for (List<NutMap> listMap : mobileColumnsValue) {
NutMap nutMap = listMap.stream().filter(o -> Objects.equals(o.getString("columnCode"), activity.getOnlyKey())).findFirst().orElse(null);
if(nutMap != null) {
values.add(nutMap.getString("columnValue"));
}
}
}
c.put("signValue", String.join("", values));
}
});
return Result.success(pagination);
}
@At
@ApiOperation("获取分活动时间")
@SaCheckPermission(value = {"family.apply", "h5.family.apply"}, mode = SaMode.OR)
public Result getCourseTime(String id) {
List<FamilyActivityCourse> list = familyActivityService.dao().query(FamilyActivityCourse.class, Cnd.where("courseId", "=", id));
return Result.success(list);
}
@At
@ApiOperation("查询分类标识集合")
@SaCheckPermission(value = {"family.apply", "h5.family.apply"}, mode = SaMode.OR)
public Result queryCourseAssort(String activityId) {
List<FamilyCourse> courseList = familyActivityService.dao().query(
FamilyCourse.class,
Cnd.where(FamilyCourse::getActivityId, "=", activityId).asc(FamilyCourse::getOrderNum)
);
if(Lang.isEmpty(courseList)) {
return Result.success(new ArrayList<>());
}
List<String> assortList = courseList.stream().map(FamilyCourse::getAssort).filter(StrUtil::isNotBlank).distinct().toList();
return Result.success(assortList);
}
@At
@ApiOperation("验证是否能报名")
@SaCheckPermission(value = {"family.apply", "h5.family.apply"}, mode = SaMode.OR)
public Result validateSignUp(String courseId,
@Param(value = "currentFamilyNumber") Integer currentFamilyNumber) {
try {
lock.lock();
if(StrUtil.isBlank(courseId)) {
return Result.error(99, "报名信息为空");
}
currentFamilyNumber = currentFamilyNumber != null ? currentFamilyNumber : 0;
FamilyCourse course = dao.fetch(FamilyCourse.class, courseId);
FamilyType type = dao.fetch(FamilyType.class, course.getCourseType());
FamilyActivity activity = dao.fetch(FamilyActivity.class, course.getActivityId());
//判断时间
if(DateUtil.compare(new Date(), activity.getActivitySignUpStartTime(), "yyyy-MM-dd HH:mm:ss") < 0) {
return Result.error(99,"报名未开始");
}
if(DateUtil.compare(new Date(), activity.getActivitySignUpEndTime(), "yyyy-MM-dd HH:mm:ss") > 0) {
return Result.error(99,"报名已结束");
}
//判断活动组别
int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", activity.getActivityGroupId()).and("userId", "=", SecurityUtil.getUserId()));
if(count == 0) {
return Result.error(99,"抱歉,您没有此次活动的权限");
}
if(type.getIsBringFamily() && currentFamilyNumber == 0) {
return Result.error(99, "%s信息不能为空".formatted(activity.getKeyWord()));
}
//判断是否报名
boolean courseByUser = familyActivityService.isSignCourseByUser(courseId, SecurityUtil.getUserId());
if(courseByUser) {
return Result.error(99,"抱歉,您已经报名");
}
//判断活动人数
boolean signFull = familyActivityService.isSignFull(course, currentFamilyNumber);
if(signFull) {
return Result.error(99,"抱歉,报名人数已满");
}
//判断活动限制
boolean signCourse = familyActivityService.isSignCourse(course, activity);
if(!signCourse) {
if(activity.getRestrictLimit() != 3) {
return Result.error(99,"您选择的类型已达上限,不能再报该类型的了");
} else {
return Result.error(99,activity.getActivityName() + "限制报" + activity.getLimitNum() + "个活动,已达上限");
}
}
//判断分工会人数限制
boolean signFullByUnionId = familyActivityService.isSignFullByUnionId(course, currentFamilyNumber);
if(signFullByUnionId) {
return Result.error(99,"您所在的分工会名额不足");
}
return Result.success();
}catch (Exception e) {
e.printStackTrace();
return Result.error(99,"报名失败");
} finally {
lock.unlock();
}
}
@At
@ApiOperation("查询子活动时间段")
@SaCheckPermission(value = {"family.apply", "h5.family.apply"}, mode = SaMode.OR)
public Object getCourseTimeSelectList(String courseId) {
// 查课程的时间段
List<FamilyActivityCourse> courseList = dao.query(FamilyActivityCourse.class, Cnd.where("courseId", "=", courseId).asc("courseStartTime"));
// 查课程的报名人数
List<FamilyUserCourse> applyUserList = dao.query(FamilyUserCourse.class, Cnd.where("courseId", "=", courseId));
List<FamilyUser> userList = dao.query(FamilyUser.class, Cnd.where("courseId", "=", courseId).and("state", "=", 1));
List<String> idList = userList.stream().map(FamilyUser::getUserId).toList();
applyUserList = applyUserList.stream().filter(o -> idList.contains(o.getUserId())).toList();
// 按照课程下面时间段去分组
Map<String, List<FamilyUserCourse>> collectMap = applyUserList.stream().collect(Collectors.groupingBy(FamilyUserCourse::getActivityCourseId));
List<NutMap> list = courseList.stream().map(v -> {
String id = v.getId();
NutMap nutMap = NutMap.NEW();
List<FamilyUserCourse> familyUserCourses = collectMap.get(id);
int remainingNum = v.getCourseLimitNum() != null ? v.getCourseLimitNum() : 0;
if (Lang.isNotEmpty(familyUserCourses)) {
remainingNum = v.getCourseLimitNum() - familyUserCourses.size();
}
nutMap.put("remainingNum", remainingNum);
nutMap.put("text", DateUtil.format(v.getCourseStartTime(), "HH:mm") + "" + DateUtil.format(v.getCourseEndTime(), "HH:mm") + "段(剩" + remainingNum + ")");
nutMap.put("value", id);
nutMap.put("disabled", remainingNum == 0);
return nutMap;
}).filter(v -> v.getInt("remainingNum") != 0).toList();
return Result.success(list);
}
@At
@ApiOperation("验证子活动是否能报名")
@SaCheckPermission(value = {"family.apply", "h5.family.apply"}, mode = SaMode.OR)
public Object validateSourceSignUp(String activityCourseId, String courseId) {
try {
lock.lock();
List<FamilyUser> userList = dao.query(FamilyUser.class, Cnd.where("courseId", "=", courseId).and("state", "=", 1));
List<String> isList = userList.stream().map(FamilyUser::getUserId).toList();
// 该时间段下已报名的人数
int count = dao.count(FamilyUserCourse.class, Cnd.where("activityCourseId", "=", activityCourseId)
.and("courseId", "=", courseId).and("userId", "in", isList));
// 获取改时间段下的活动课程限制报名人数
FamilyActivityCourse course = dao.fetch(FamilyActivityCourse.class, activityCourseId);
Integer courseLimitNum = course.getCourseLimitNum();
// 报名加上自己,如果大于了限制人数,那就无法报名
if (count + 1 > courseLimitNum) {
return Result.error(99,"该时间段名额已报满,请选择其他时段报名");
} else {
return Result.success();
}
} catch (Exception e) {
e.printStackTrace();
return Result.error(99,"报名失败");
} finally {
lock.unlock();
}
}
@At
@ApiOperation("活动报名")
@SaCheckPermission(value = {"family.apply", "h5.family.apply"}, mode = SaMode.OR)
@SLog(tag = "亲子活动-活动报名", msg = "活动报名")
public Result doSignUp(FamilyUser familyUser) {
try {
lock.lock();
FamilyActivity activity = dao.fetch(FamilyActivity.class, familyUser.getActivityId());
if(Lang.isEmpty(familyUser.getMobileColumnsValue())) {
return Result.error(99,"请填写" + activity.getKeyWord() + "信息");
}
boolean courseByUser = familyActivityService.isSignCourseByUser(familyUser.getCourseId(), SecurityUtil.getUserId());
if(courseByUser) {
return Result.error(99,"您已报过该活动");
}
boolean validFamilyCount = familyActivityService.validFamilyCount(familyUser);
if(validFamilyCount) {
return Result.error(99,activity.getKeyWord() + "人数最多为" + activity.getFamilyMaxCount());
}
//判断人数
int number = 0;
FamilyCourse course = familyActivityService.dao().fetch(FamilyCourse.class, familyUser.getCourseId());
FamilyType type = familyActivityService.dao().fetch(FamilyType.class, course.getCourseType());
if(type != null) {
if(type.getIsBringFamily() && type.getIsAddFamily()) {
List<List<NutMap>> mobileColumnsValue = familyUser.getMobileColumnsValue();
number = Lang.isNotEmpty(mobileColumnsValue) ? mobileColumnsValue.size() : 0;
}
}
boolean signFull = familyActivityService.isSignFull(course, number);
if(signFull) {
return Result.error(99,"当前报名人数已满");
}
boolean signFullByUnionId = familyActivityService.isSignFullByUnionId(course, number);
if(signFullByUnionId) {
return Result.error(99,"该活动您所在的分工会名额不足");
}
familyActivityService.doSignUp(familyUser);
return Result.success("祝贺您!您已报名成功!请留意各分场活动的准确时间、地点,提前10-15分钟到达活动现场做好准备。如您因故不能参加活动,还请及时登录系统取消报名,以便将机会留给其他有需要的教职工。谢谢!");
} catch (Exception e) {
e.printStackTrace();
return Result.error("报名失败");
} finally {
lock.unlock();
}
}
@At
@ApiOperation("取消报名")
@SaCheckPermission(value = {"family.apply", "h5.family.apply"}, mode = SaMode.OR)
@SLog(tag = "亲子活动-活动报名", msg = "取消报名")
public Result cancelSignUp(@Param("activityId") String activityId, @Param("courseId") String courseId) {
String userId = SecurityUtil.getUserId();
//取消分两种情况
//第一种没有设置分工会人数限制,那么将候补的人按时间倒叙往上补
//第二种如果设置了分工会人数限制,那么只将本分工会的候补人员按照时间倒叙往上补,如果本分工会没有候补人员,则名额空出来,由校工会手动调整
FamilyCourse course = dao.fetch(FamilyCourse.class, courseId);
FamilyType type = dao.fetch(FamilyType.class, course.getCourseType());
//如果是正常报名取消了,将候补报名的按时间倒叙第一个改为正常报名
Cnd cnd = Cnd.where("activityId", "=", activityId).and("courseId", "=", courseId)
.and("state", "=", 2);
//如果设置了分工会报名人数限制,则只查本分工会
if (Lang.isNotEmpty(course.getUnionLimit())) {
cnd.and(new Static(" userId in (select id from user where unionid = '%s')".formatted(SecurityUtil.getUnionId())));
}
cnd.asc("signUpTime");
if (!type.getIsBringFamily() && course.getReserveMode() == 2) {
List<FamilyUser> signUpUsers = dao.query(FamilyUser.class, cnd);
int thisSignUpUserCount = dao.count(FamilyUser.class,
Cnd.where("activityId", "=", activityId)
.and("courseId", "=", courseId).and("userId", "=", userId)
.and("state", "in", List.of(1, 3)));
if (!signUpUsers.isEmpty() && thisSignUpUserCount > 0) {
FamilyUser familyUser = signUpUsers.get(0);
familyUser.setState(1);
dao.update(familyUser);
Sys_user user = dao.fetch(Sys_user.class, familyUser.getUserId());
//msgApi.sendTextMsg("【" + activity.getActivityName() + "】已候补成功,请按时参加活动!", user.getLoginname());
}
}
//删除报名记录
dao.clear("family_user_course", Cnd.where("activityId", "=", activityId)
.and("courseId", "=", courseId).and("userId", "=", userId));
dao.clear("family_user", Cnd.where("activityId", "=", activityId)
.and("courseId", "=", courseId).and("userId", "=", userId));
return Result.success();
}
}
@@ -0,0 +1,201 @@
package com.budwk.app.zhgh.activity.family.controller.manage;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.zhgh.activity.family.models.*;
import com.budwk.app.zhgh.activity.family.service.FamilyActivityService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import org.nutz.trans.Trans;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author zxy
* @Description 培训报名 活动管理
* @createTime 2022年02月23日 09:57:00
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "活动管理")
@At("/platform/family/manage")
public class FamilyActivityController {
@Inject
private FamilyActivityService familyActivityManageService;
@Inject
private Dao dao;
@At("")
@SaCheckPermission("family.manage")
@Ok("beetl:/platform/zhgh/activity/family/manage/index.html")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("family.manage")
public Result pageData(PageForm pageForm,
@Param(value = "year") Integer year,
@Param(value = "activityName") String activityName) {
Cnd cnd = Cnd.NEW();
cnd.andEX("year", "=", year);
cnd.and(Cnd.likeEX("activityName", activityName));
cnd.orderBy("createdAt", "desc");
return Result.success().addData(familyActivityManageService.pageData(pageForm, cnd));
}
@At
@ApiOperation("活动删除")
@SaCheckPermission("family.manage")
@SLog(tag = "亲子活动-活动管理", msg = "删除活动")
public Result onDelete(String id) {
Trans.exec(() -> {
familyActivityManageService.delete(id);
dao.clear(FamilyCourse.class, Cnd.where("activityId", "=", id));
dao.clear(FamilyActivityCourse.class, Cnd.where("activityId", "=", id));
dao.clear(FamilyUser.class, Cnd.where("activityId", "=", id));
dao.clear(FamilyUserCourse.class, Cnd.where("activityId", "=", id));
dao.clear(FamilyActivity.class, Cnd.where("id", "=", id));
dao.clear(FamilyTypeLimit.class, Cnd.where("activityId", "=", id));
dao.delete(Sys_home_activity.class, id);
});
return Result.success();
}
@At
@ApiOperation("活动状态变更")
@SaCheckPermission("family.manage")
public Result activityStatusChange(FamilyActivity activity) {
familyActivityManageService.updateActivityStatus(activity);
dao.update(Sys_home_activity.class,
Chain.make("enable", !activity.isDisabled()),
Cnd.where("id", "=", activity.getId()));
return Result.success();
}
@At
@ApiOperation("查询单个活动")
@SaCheckPermission("family")
public Result findOne(@Param("id") @NotNull String id) {
NutMap dataMap = familyActivityManageService.findOne(id, null, "");
String activityStartTime = dataMap.getString("activityStartTime");
String activityEndTime = dataMap.getString("activityEndTime");
if(StrUtil.isNotBlank(activityStartTime) && StrUtil.isNotBlank(activityEndTime)) {
dataMap.put("activityTime", List.of(activityStartTime, activityEndTime));
} else {
dataMap.put("activityTime", new ArrayList<>());
}
String activitySignUpStartTime = dataMap.getString("activitySignUpStartTime");
String activitySignUpEndTime = dataMap.getString("activitySignUpEndTime");
if(StrUtil.isNotBlank(activitySignUpStartTime) && StrUtil.isNotBlank(activitySignUpEndTime)) {
dataMap.put("activitySignTime", List.of(activitySignUpStartTime, activitySignUpEndTime));
} else {
dataMap.put("activitySignTime", new ArrayList<>());
}
List<NutMap> courseList = dataMap.getList("courseList", NutMap.class);
//查询所有的课程类型
List<FamilyType> familyTypeList = dao.query(FamilyType.class, Cnd.NEW());
Map<String, String> typeMap = familyTypeList.stream().collect(Collectors.toMap(FamilyType::getId, FamilyType::getTypeName));
courseList.forEach(v -> {
List<NutMap> courseTimeList = v.getList("courseTimeList", NutMap.class);
//选择课程日期 下拉框
List<String> setUpCourseData = courseTimeList.stream().map(cd -> cd.getString("courseDate")).distinct().collect(Collectors.toList());
v.put("setUpCourseData", setUpCourseData);
courseTimeList.forEach(ct -> {
String courseStartTime = DateUtil.format(ct.getTime("courseStartTime"), "HH:mm");
String courseEndTime = DateUtil.format(ct.getTime("courseEndTime"), "HH:mm");
ct.put("courseStartTime", courseStartTime);
ct.put("courseEndTime", courseEndTime);
});
v.put("courseTypeName", typeMap.get(v.getString("courseType")));
});
return Result.success().addData(dataMap);
}
@At
@Ok("json:full")
@ApiOperation("亲子活动新增/修改")
@SaCheckPermission("family.manage")
@SLog(tag = "亲子活动-活动管理", msg = "新增/修改活动")
public Result doHandle(FamilyActivity activity) {
if (StrUtil.isBlank(activity.getId())) {
familyActivityManageService.add(activity, null);
} else {
familyActivityManageService.edit(activity);
}
return Result.success();
}
@At
@Ok("json:full")
@ApiOperation("获取分工会人数限制")
@SaCheckPermission("family.manage")
public Result getUnionLimit(@Param(value = "activityScopeId") String activityScopeId) {
Sql sql = Sqls.create("""
SELECT
gh.id,
gh.name,
gh.unioncode,
(select count(1) from `vw_user` where unionid = gh.id $cnd) as teacherCount,
NULL as ratio,
NULL as limitCount
FROM
sys_union gh
order by gh.unioncode
""");
if (StrUtil.isNotBlank(activityScopeId)) {
sql.setVar("cnd", "AND id in (select userId from activity_user_scope where groupId = '" + activityScopeId + "')");
}
List<NutMap> list = familyActivityManageService.listMap(sql);
return Result.success().addData(list);
}
@At
@Ok("json:full")
@ApiOperation("获取报名人员数量")
@SaCheckPermission("family.manage")
public Result getRegisterUserCount(@Param(value = "courseId") String courseId) {
return Result.success().addData(dao.count(FamilyUser.class, Cnd.where("courseId", "=", courseId)));
}
@At
@Ok("json:full")
@ApiOperation("获取历史活动列表")
@SaCheckPermission("family.manage")
public Result getHistoricalActList() {
List<FamilyActivity> query = dao.query(FamilyActivity.class, Cnd.NEW().desc("activityStartTime"));
return Result.success().addData(query);
}
}
@@ -0,0 +1,176 @@
package com.budwk.app.zhgh.activity.family.controller.manage;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.family.models.*;
import com.budwk.app.zhgh.activity.family.service.FamilyActivityService;
import com.budwk.app.zhgh.activity.family.service.FamilyActivityStatisticsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.ArrayList;
import java.util.List;
/**
* @Author JyuHsin
* @Date 2022/9/21
* @Description 人员调整
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "亲子活动人员调整")
@At("/platform/family/userAdjust")
public class FamilyAdjustController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@Inject
private FamilyActivityService familyActivityManageService;
@Inject
private FamilyActivityStatisticsService familyActivityStatisticsService;
@At("")
@SaCheckPermission("family.adjust")
@Ok("beetl:/platform/zhgh/activity/family/userAdjust/index.html")
public void index() {
}
/**
* 活动list
* @param year 年度
* @return
*/
@At
@ApiOperation("活动列表")
@SaCheckPermission("family.adjust")
public Result activityList(@Param(value = "year") Integer year) {
List<FamilyActivity> activityList = dao.query(FamilyActivity.class, Cnd.NEW().andEX("year", "=", year).andEX("isDisabled", "=", false).desc("activityStartTime"));
return Result.success(activityList);
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("family.adjust")
public Result pageData(PageForm pageForm,
@Param(value = "activityId") String activityId) {
Pagination pagination = familyActivityStatisticsService.pageData(pageForm, activityId);
return Result.success(pagination);
}
@At
@ApiOperation("子活动查询")
@SaCheckPermission("family.adjust")
public Result getCourse(String activityId) {
Sql sql = Sqls.create("""
SELECT
tsuc.id,
tsuc.courseName,
tsuc.coursePeopleNumber,
tsuc.courseType,
tsuc.courseLocation,
tsuc.courseInstructor,
tsuc.courseReservedNumber,
tsuc.waitingNum,
tsuc.reserveMode
FROM
`family_course` tsuc
WHERE
tsuc.activityId = @activityId
ORDER BY courseName asc
""");
sql.setParam("activityId", activityId);
List<NutMap> courseList = baseService.listMap(sql);
courseList.forEach(c -> {
c.put("registerNum", familyActivityStatisticsService.queryCourseCount(c.getString("id"), c.getString("courseType")));
c.put("hasWaitingNum", familyActivityStatisticsService.queryCourseWaitCount(c.getString("id"), c.getString("courseType")));
});
return Result.success(courseList);
}
@At
@ApiOperation("报名用户列表")
@SaCheckPermission("family.adjust")
public Result registerUserList(@Param("courseId") String courseId,
@Param(value = "unionId") String unionId,
@Param(value = "unitId") String unitId,
@Param(value = "searchName") String searchName,
@Param(value = "searchKeyword") String searchKeyword) {
List<NutMap> list = familyActivityStatisticsService.registerUserList(courseId, unionId, unitId, searchName, searchKeyword);
return Result.success(list);
}
@At
@ApiOperation("人员调整")
@SaCheckPermission("family.adjust")
@SLog(tag = "亲子活动-人员调整", msg = "人员调整")
public Result adjust(String activityId, String oldCourseId, String newCourseId, String userId) {
Cnd oldCnd = Cnd.where("activityId", "=", activityId)
.and("courseId", "=", oldCourseId).and("userId", "=", userId);
Cnd newCnd = Cnd.where("activityId", "=", activityId)
.and("courseId", "=", newCourseId).and("userId", "=", userId);
//旧的报名信息
FamilyUser oldfamilyUser = dao.fetch(FamilyUser.class, oldCnd);
oldfamilyUser.setCourseId(newCourseId);
oldfamilyUser.setSignUpTime(DateUtil.date());
dao.update(oldfamilyUser);
//新的课程的信息,上课时间
List<FamilyActivityCourse> activityCourseList = dao.query(FamilyActivityCourse.class, Cnd.where("activityId", "=", activityId)
.and("courseId", "=", newCourseId));
//先清楚旧的信息
dao.clear(FamilyUserCourse.class, oldCnd);
//添加新的信息
List<FamilyUserCourse> familyUserCourseList = new ArrayList<>();
activityCourseList.forEach(item -> {
FamilyUserCourse course = new FamilyUserCourse();
course.setActivityCourseId(activityId);
course.setCourseId(newCourseId);
course.setUserId(userId);
course.setCourseStartTime(item.getCourseStartTime());
course.setCourseEndTime(item.getCourseEndTime());
course.setActivityCourseId(item.getId());
familyUserCourseList.add(course);
});
dao.insert(familyUserCourseList);
return Result.success();
}
@At
@ApiOperation("删除报名人员")
@SaCheckPermission("family.adjust")
@SLog(tag = "亲子活动-人员调整", msg = "删除报名人员")
public Result deleteSignUser(String activityId, String courseId, String userId) {
//删除
Cnd cnd = Cnd.NEW();
cnd.and("activityId", "=", activityId);
cnd.and("courseId", "=", courseId);
cnd.and("userId", "=", userId);
dao.clear(FamilyUser.class, cnd);
dao.clear(FamilyUserCourse.class, cnd);
return Result.success();
}
}
@@ -0,0 +1,165 @@
package com.budwk.app.zhgh.activity.family.controller.manage;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.result.Result;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.family.models.FamilyUserCourse;
import com.budwk.app.zhgh.activity.family.service.FamilyActivityService;
import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpUserCourse;
import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpActivityService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.Date;
import java.util.List;
/**
* @ClassName FamilyMineController
* @Author JyuHsin
* @Date 2025/9/13 16:56
* @Version 1.0
* @Description TODO
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "活动报名")
@At("/platform/family/mine")
public class FamilyMineController {
@Inject
private Dao dao;
@Inject
private FamilyActivityService activityService;
@At("/")
@SaCheckPermission("family.mine")
@Ok("beetl:/platform/zhgh/activity/family/mine/index.html")
public void index() {
}
@At("/h5")
@SaCheckPermission("h5.family.mine")
@Ok("beetl:/platform/zhghh5/activity/family/mine/index.html")
public void h5Index() {
}
@At
@ApiOperation("主动扫码签到")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"family.mine", "h5.family.mine"}, mode = SaMode.OR)
@SLog(tag = "品牌活动-活动签到", msg = "主动扫码签到")
public Result drivingScan(String courseId) {
// 主动扫码签到是用户自己打开扫一扫,扫二维码签到
int count = dao.count(FamilyUserCourse.class, Cnd.where("courseId", "=", courseId).and("userId", "=", SecurityUtil.getUserId()));
if (count == 0) {
return Result.error(99, "未查询到您的报名记录");
}
// 获取现在的日期,并往后推1个小时
String oneHourLater = DateUtil.offsetHour(new Date(), 1).toString("yyyy-MM-dd HH:mm:ss");
FamilyUserCourse userCourse = dao.fetch(
FamilyUserCourse.class,
Cnd.where("courseId", "=", courseId)
.and("userId", "=", SecurityUtil.getUserId())
.and("courseStartTime", "<=", oneHourLater)
.and("courseEndTime", ">=", oneHourLater)
);
if (userCourse == null) {
return Result.error(99, "未到签到时间");
}
userCourse.setAttend(true);
userCourse.setAttendTime(DateUtil.date());
dao.update(userCourse);
return Result.success();
}
@At
@ApiOperation("被动扫码签到")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"family.mine", "h5.family.mine"}, mode = SaMode.OR)
@SLog(tag = "品牌活动-活动签到", msg = "被动扫码签到")
public Result passiveScan(String id) {
// id表示课程的某个时间段,userId表示是谁出示的二维码
FamilyUserCourse userCourse = dao.fetch(FamilyUserCourse.class, id);
if (userCourse == null) {
return Result.error("未查询到报名记录");
}
int isAfter = DateUtil.compare(new Date(), userCourse.getCourseStartTime());
if (isAfter > 0) {
return Result.error("抱歉,已经开始,无法签到");
}
long diffMillis = Math.abs(DateUtil.between(new Date(), userCourse.getCourseStartTime(), DateUnit.MS));
long oneHourInMs = 3600 * 1000;
if (diffMillis > oneHourInMs) {
return Result.error("签到时间为开始前1个小时");
}
userCourse.setAttend(true);
userCourse.setAttendTime(DateUtil.date());
dao.update(userCourse);
return Result.success();
}
@At
@ApiOperation("分活动查询")
@SaCheckPermission(value = {"family.mine", "h5.family.mine"}, mode = SaMode.OR)
public Result queryCourseSign(String courseId) {
Sql sql = Sqls.create("""
SELECT
uc.*,
date(uc.courseStartTime) as courseDate
FROM
`family_user_course` uc
WHERE
courseId = @courseId and userId = @userId
""");
sql.setParam("userId", SecurityUtil.getUserId());
sql.setParam("courseId", courseId);
List<NutMap> listMap = activityService.listMap(sql);
return Result.success(listMap);
}
@At
@ApiOperation("获取我报名的课程")
@SaCheckPermission(value = {"family.apply", "h5.family.apply"}, mode = SaMode.OR)
public Result queryMineCourse(String activityId) {
Sql sql = Sqls.create("""
SELECT
c.*,
u.mobileColumnsValue
FROM
family_user u
LEFT JOIN family_course c ON c.id = u.courseId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("u.activityId", "=", activityId);
cnd.and("u.userId", "=", SecurityUtil.getUserId());
sql.setCondition(cnd);
List<NutMap> listMap = activityService.listMap(sql);
return Result.success(listMap);
}
}
@@ -0,0 +1,167 @@
package com.budwk.app.zhgh.activity.family.controller.manage;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.EnumUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.zhgh.activity.family.models.FamilyMobileSignColumn;
import com.budwk.app.zhgh.activity.family.models.FamilyType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.entity.annotation.ColType;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.List;
/**
* @Author JyuHsin
* @Date 2022/9/22
* @Description
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "活动类型管理")
@At("/platform/family/type")
public class FamilyTypeController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@At("")
@SaCheckPermission("family.type")
@Ok("beetl:/platform/zhgh/activity/family/type/index.html")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("family.type")
public Result pageData(PageForm pageForm,
@Param(value = "typeName") String typeName) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
select * from family_type $condition
""");
if (Strings.isNotBlank(typeName)) {
cnd.and("typeName", "like", "%" + typeName + "%");
}
if(Strings.isNotBlank(pageForm.getPageOrderName()) && Strings.isNotBlank(pageForm.getPageOrderBy())){
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
} else {
cnd.asc("xh");
}
sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
List<NutMap> list = pagination.getList();
list.forEach(item -> {
Cnd c = Cnd.NEW();
c.and("typeId", "=", item.getString("id"));
c.asc("columnIndex");
List<FamilyMobileSignColumn> signColumns = dao.query(FamilyMobileSignColumn.class, c);
item.put("familyMobileSignColumnList", signColumns);
});
return Result.success().addData(pagination);
}
@At
@ApiOperation("活动类型新增")
@SaCheckPermission("family.type")
@SLog(tag = "亲子活动-活动类型管理", msg = "活动类型新增")
public Result doAdd(@Param("data") String data) throws Exception {
FamilyType type = Json.fromJson(FamilyType.class, data);
int count = dao.count(FamilyType.class, Cnd.where("code", "=", type.getCode()));
if (count > 0) {
return Result.error("编码重复!");
}
int totalCount = dao.count(FamilyType.class);
type.setXh(totalCount + 1);
dao.insertWith(type, "familyMobileSignColumnList");
return Result.success();
}
@At
@ApiOperation("活动类型修改")
@SaCheckPermission("family.type")
@SLog(tag = "亲子活动-活动类型管理", msg = "活动类型修改")
public Result doEdit(FamilyType type) {
int count = dao.count(FamilyType.class, Cnd.where("code", "=", type.getCode()).and("id", "!=", type.getId()));
if (count > 0) {
return Result.error("编码重复!");
}
dao.update(type);
dao.clear(FamilyMobileSignColumn.class, Cnd.where("typeId", "=", type.getId()));
dao.insertLinks(type, "familyMobileSignColumnList");
return Result.success();
}
@At
@ApiOperation("活动类型删除")
@SaCheckPermission("family.type")
@SLog(tag = "亲子活动-活动类型管理", msg = "活动类型删除")
public Object doDelete(@Param(value = "id") String id) {
dao.clear(FamilyType.class, Cnd.where("id", "=", id));
dao.clear(FamilyMobileSignColumn.class, Cnd.where("typeId", "=", id));
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("排序号变更")
@SaCheckPermission("family.type")
public Object xhChange(String id, Integer xh, boolean toDown) {
if (toDown) {
FamilyType next = dao.fetch(FamilyType.class, Cnd.where("xh", "=", xh + 1));
next.setXh(next.getXh() - 1);
dao.update(next);
dao.update(FamilyType.class, Chain.make("xh", xh + 1), Cnd.where("id", "=", id));
} else {
FamilyType pre = dao.fetch(FamilyType.class, Cnd.where("xh", "=", xh - 1));
pre.setXh(pre.getXh() + 1);
dao.update(pre);
dao.update(FamilyType.class, Chain.make("xh", xh - 1), Cnd.where("id", "=", id));
}
return Result.success();
}
@At
@ApiOperation("获取所有类型")
@SaCheckLogin
public Result getAllType(@Param(value = "id") String id) {
List<FamilyType> familyTypeList = dao.query(FamilyType.class, Cnd.NEW().andEX("id", "=", id).asc("xh"));
dao.fetchLinks(familyTypeList, "familyMobileSignColumnList", Cnd.NEW().asc("columnIndex"));
return Result.success().addData(familyTypeList);
}
@At
@ApiOperation("自定义表单字段类型")
@SaCheckPermission("family.type")
public Result getColumnType() {
List<String> names = EnumUtil.getNames(ColType.class);
names.add("JSON");
return Result.success(names);
}
}
@@ -0,0 +1,352 @@
package com.budwk.app.zhgh.activity.family.controller.manage;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.afterturn.easypoi.excel.export.ExcelExportService;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.zhgh.activity.family.models.FamilyActivity;
import com.budwk.app.zhgh.activity.family.models.FamilyCourse;
import com.budwk.app.zhgh.activity.family.models.FamilyUser;
import com.budwk.app.zhgh.activity.family.service.FamilyBlackListService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author zxy
* @Description 人员管理
* @createTime 2022年03月07日 14:27:00
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "亲子活动人员黑名单")
@At("/platform/family/userManage")
public class FamilyUserManageController {
@Inject
private Dao dao;
@Inject
private FamilyBlackListService familyBlackListService;
@At("")
@SaCheckPermission("family.userManage")
@Ok("beetl:/platform/zhgh/activity/family/userManage/index.html")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("family.userManage")
public Result pageData(PageForm pageForm,
@Param(value = "activityId") String activityId,
@Param(value = "courseId") String courseId,
@Param(value = "year") Integer year,
@Param(value = "userKeyWord") String userKeyWord) {
Cnd cnd = Cnd.NEW();
cnd.andEX("tsuu.activityId", "=", activityId);
cnd.andEX("tsuu.courseId", "=", courseId);
cnd.andEX("act.year", "=", year);
if (StrUtil.isNotBlank(userKeyWord)) {
SqlExpressionGroup seg = new SqlExpressionGroup();
cnd.and(seg.andLike("u.username", userKeyWord).orLike("u.loginname", userKeyWord));
}
if(Strings.isNotBlank(pageForm.getPageOrderName()) && Strings.isNotBlank(pageForm.getPageOrderBy())){
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
Pagination pagination = familyBlackListService.pageData(pageForm, cnd, activityId, courseId);
return Result.success(pagination);
}
@At
@ApiOperation("报名人员处理")
@SaCheckPermission("family.userManage")
@SLog(tag = "亲子活动-人员调整", msg = "报名人员处理")
public Result doHandleUser(@Param("userId") String userId) {
familyBlackListService.doHandleUser(userId);
return Result.success();
}
@At
@ApiOperation("根据活动Id获取子活动")
@SaCheckPermission("family.userManage")
public Result getCourseByActivityId(@Param("activityId") String activityId) {
List<FamilyCourse> list = dao.query(FamilyCourse.class, Cnd.where("activityId", "=", activityId));
return Result.success(list);
}
@At
@ApiOperation("获取子活动具体时间")
@SaCheckPermission("family.userManage")
public Result attendClassRecord(String userId) {
familyBlackListService.attendClassRecord(userId);
return Result.success();
}
@At
@ApiOperation("获取候补人员")
@SaCheckPermission("family.userManage")
public Result getReserveUser(String courseId) {
Sql sql = Sqls.create("""
SELECT
uc.* ,
(select signUpTime from family_user su where su.activityId=uc.activityId and su.courseId = uc.courseId and su.userId=uc.userId) as signUpTime,
(select state from family_user su where su.activityId=uc.activityId and su.courseId = uc.courseId and su.userId=uc.userId) as state,
u.username,
u.loginname,
u.mobile,
u.unitName,
u.unionName
FROM
family_user_course uc LEFT JOIN `vw_user` u on uc.userId = u.id
WHERE uc.courseId = @courseId and uc.isAttend = false HAVING state = 2 order by signUpTime desc
""").setParam("courseId", courseId);
return Result.success(familyBlackListService.listMap(sql));
}
@At
@ApiOperation("补充人员")
@SaCheckPermission("family.userManage")
@SLog(tag = "亲子活动-人员管理", msg = "补充人员")
public Result reserveSingUp(String[] ids, String courseId) {
//先查询这个课程有多少个未签到的人员
Sql sql = Sqls.create("""
SELECT
uc.* ,
(select signUpTime from family_user su where su.activityId=uc.activityId and su.courseId = uc.courseId and su.userId=uc.userId) as signUpTime,
(select state from family_user su where su.activityId=uc.activityId and su.courseId = uc.courseId and su.userId=uc.userId) as state
FROM
family_user_course uc
WHERE uc.courseId = @courseId and uc.isAttend = false HAVING state = 1 order by signUpTime desc
""").setParam("courseId", courseId);
List<NutMap> list = familyBlackListService.listMap(sql);
if(ids.length > list.size()) {
return Result.error("您选择了" + ids.length + "位,未签到人员只有" + list.size() + "");
}
//ids的长度为几,就搞几个
List<NutMap> mapList = list.subList(0, ids.length);
List<String> idList = mapList.stream().map(o -> o.getString("userId")).collect(Collectors.toList());
//将这几个没签到的设置为4
dao.update(FamilyUser.class, Chain.make("state", 4), Cnd.where("courseId", "=", courseId)
.and("userId", "in", idList));
//将补充的设置为1
dao.update(FamilyUser.class, Chain.make("state", 1), Cnd.where("courseId", "=", courseId)
.and("userId", "in", ids));
return Result.success();
}
@At
@Ok("void")
@ApiOperation("导出签到人员")
public void exportSignPerson(@Param(value = "activityId") String activityId,
HttpServletResponse response) {
FamilyActivity activity = dao.fetch(FamilyActivity.class, activityId);
Sql sql = Sqls.create("""
SELECT
uc.*,
DATE_FORMAT(uc.courseStartTime, '%Y-%m-%d %H:%i:%s') as courseStartTimeExcel,
DATE_FORMAT(uc.courseEndTime, '%Y-%m-%d %H:%i:%s') as courseEndTimeExcel,
DATE_FORMAT(uc.attendTime, '%Y-%m-%d %H:%i:%s') as attendTimeExcel,
u.username,
u.loginname,
u.unitName,
u.unionName,
u.sex
FROM
family_user_course uc
left join family_course course on uc.courseId = course.id
left join `vw_user` u on u.id = uc.userId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("uc.activityId", "=", activityId);
cnd.and("course.isMobileSign", "=", true);
cnd.desc("isAttend").desc("attendTime");
sql.setCondition(cnd);
List<NutMap> userList = familyBlackListService.listMap(sql);
List<FamilyCourse> courseList = dao.query(FamilyCourse.class, Cnd.where("activityId", "=", activityId));
List<Map<String, Object>> sheetsList = new ArrayList<>();
List<ExcelExportEntity> excelCommonExportEntity = new ArrayList<>();
excelCommonExportEntity.add(new ExcelExportEntity("姓名", "username", 20));
excelCommonExportEntity.add(new ExcelExportEntity("工号", "loginname", 20));
excelCommonExportEntity.add(new ExcelExportEntity("单位", "unitName", 20));
excelCommonExportEntity.add(new ExcelExportEntity("分工会", "unionName", 20));
excelCommonExportEntity.add(new ExcelExportEntity("性别", "sex", 20));
excelCommonExportEntity.add(new ExcelExportEntity("开始时间", "courseStartTimeExcel", 22));
excelCommonExportEntity.add(new ExcelExportEntity("结束时间", "courseEndTimeExcel", 22));
excelCommonExportEntity.add(new ExcelExportEntity("是否签到", "isAttend", 20));
excelCommonExportEntity.add(new ExcelExportEntity("签到时间", "attendTimeExcel", 22));
for (FamilyCourse c : courseList) {
if(!c.isMobileSign()) {
continue;
}
String courseId = c.getId();
String courseName = c.getCourseName();
List<NutMap> v = userList.stream().filter(x -> x.getString("courseId").equals(courseId)).collect(Collectors.toList());
ExportParams userExportParams = new ExportParams();
userExportParams.setSheetName(courseName);
List<ExcelExportEntity> currentEntities = new ArrayList<>(excelCommonExportEntity);
for (NutMap userSignData : v) {
if(!userSignData.getBoolean("isAttend")) {
userSignData.put("isAttend", "未签到");
userSignData.put("attendTimeExcel", "未签到");
}else {
userSignData.put("isAttend", "已签到");
}
}
Map<String, Object> userExportMap = new HashMap<>();
userExportMap.put("name", courseName);
userExportMap.put("title", userExportParams);
userExportMap.put("entity", currentEntities);
userExportMap.put("data", v);
sheetsList.add(userExportMap);
}
try {
String fileName = activity.getActivityName() + "签到人员名单.xls";
String disposition = "attachment;filename=" + URLEncoder.encode(fileName, "utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", disposition);
Workbook workbook = new HSSFWorkbook();
for (Map<String, Object> map : sheetsList) {
ExcelExportService service = new ExcelExportService();
service.createSheetForMap(workbook,(ExportParams) map.get("title"),(List<ExcelExportEntity>) map.get("entity"),(Collection<?>) map.get("data"));
}
workbook.write(response.getOutputStream());
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@At
@Ok("void")
@ApiOperation("导出领取人员")
public void exportGiftPerson(@Param(value = "activityId") String activityId,
HttpServletResponse response) {
FamilyActivity activity = dao.fetch(FamilyActivity.class, activityId);
Sql sql = Sqls.create("""
SELECT
uc.*,
DATE_FORMAT(uc.courseStartTime, '%Y-%m-%d %H:%i:%s') as courseStartTimeExcel,
DATE_FORMAT(uc.courseEndTime, '%Y-%m-%d %H:%i:%s') as courseEndTimeExcel,
DATE_FORMAT(uc.receiveTime, '%Y-%m-%d %H:%i:%s') as receiveTimeExcel,
u.username,
u.loginname,
u.unitName,
u.unionName,
u.sex
FROM
family_user_course uc
left join family_course course on uc.courseId = course.id
left join `vw_user` u on u.id = uc.userId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("uc.activityId", "=", activityId);
cnd.and("course.isReceiveGift", "=", true).and("course.giftType" ,"=", 1);
cnd.desc("isReceive").desc("receiveTime");
sql.setCondition(cnd);
List<NutMap> userList = familyBlackListService.listMap(sql);
List<FamilyCourse> courseList = dao.query(FamilyCourse.class, Cnd.where("activityId", "=", activityId));
List<Map<String, Object>> sheetsList = new ArrayList<>();
List<ExcelExportEntity> excelCommonExportEntity = new ArrayList<>();
excelCommonExportEntity.add(new ExcelExportEntity("姓名", "username", 20));
excelCommonExportEntity.add(new ExcelExportEntity("工号", "loginname", 20));
excelCommonExportEntity.add(new ExcelExportEntity("单位", "unitName", 20));
excelCommonExportEntity.add(new ExcelExportEntity("分工会", "unionName", 20));
excelCommonExportEntity.add(new ExcelExportEntity("性别", "sex", 20));
excelCommonExportEntity.add(new ExcelExportEntity("开始时间", "courseStartTimeExcel", 22));
excelCommonExportEntity.add(new ExcelExportEntity("结束时间", "courseEndTimeExcel", 22));
excelCommonExportEntity.add(new ExcelExportEntity("是否领取", "isReceive", 20));
excelCommonExportEntity.add(new ExcelExportEntity("领取时间", "receiveTimeExcel", 22));
for (FamilyCourse c : courseList) {
String courseId = c.getId();
String courseName = c.getCourseName();
List<NutMap> v = userList.stream().filter(x -> x.getString("courseId").equals(courseId)).collect(Collectors.toList());
ExportParams userExportParams = new ExportParams();
userExportParams.setSheetName(courseName);
List<ExcelExportEntity> currentEntities = new ArrayList<>(excelCommonExportEntity);
for (NutMap userSignData : v) {
if(!userSignData.getBoolean("isReceive")) {
userSignData.put("isReceive", "未领取");
userSignData.put("receiveTimeExcel", "未领取");
}else {
userSignData.put("isReceive", "已领取");
}
}
Map<String, Object> userExportMap = new HashMap<>();
userExportMap.put("name", courseName);
userExportMap.put("title", userExportParams);
userExportMap.put("entity", currentEntities);
userExportMap.put("data", v);
sheetsList.add(userExportMap);
}
try {
String fileName = activity.getActivityName() + "礼品领取人员名单.xls";
String disposition = "attachment;filename=" + URLEncoder.encode(fileName, "utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", disposition);
Workbook workbook = new HSSFWorkbook();
for (Map<String, Object> map : sheetsList) {
ExcelExportService service = new ExcelExportService();
service.createSheetForMap(workbook,(ExportParams) map.get("title"),(List<ExcelExportEntity>) map.get("entity"),(Collection<?>) map.get("data"));
}
workbook.write(response.getOutputStream());
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,283 @@
package com.budwk.app.zhgh.activity.family.controller.statistics;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.afterturn.easypoi.excel.export.ExcelExportService;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.sys.models.Sys_file;
import com.budwk.app.sys.utils.SysFileMinIoUtil;
import com.budwk.app.zhgh.activity.family.models.FamilyMobileSignColumn;
import com.budwk.app.zhgh.activity.family.models.FamilyActivity;
import com.budwk.app.zhgh.activity.family.models.FamilyCourse;
import com.budwk.app.zhgh.activity.family.models.FamilyType;
import com.budwk.app.zhgh.activity.family.service.FamilyActivityService;
import com.budwk.app.zhgh.activity.family.service.FamilyActivityStatisticsService;
import io.minio.GetObjectArgs;
import io.minio.MinioClient;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
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.Streams;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author zxy
* @Description 培训报名 统计
* @createTime 2022年02月23日 09:57:00
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "亲子活动统计")
@At("/platform/family/statistics")
public class FamilyActivityStatisticsController {
@Inject
private FamilyActivityService familyActivityManageService;
@Inject
private FamilyActivityStatisticsService familyActivityStatisticsService;
@Inject
private Dao dao;
@At("")
@SaCheckPermission("family.statistics")
@Ok("beetl:/platform/zhgh/activity/family/statistics/index.html")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("family.statistics")
public Result pageData(PageForm pageForm,
@Param(value = "activityId") String activityId) {
Pagination pagination = familyActivityStatisticsService.pageData(pageForm, activityId);
return Result.success(pagination);
}
/**
* 活动list
*
* @param year 年度
* @return
*/
@At
@ApiOperation("活动列表")
@SaCheckPermission("family.statistics")
public Result activityList(@Param(value = "year") Integer year) {
List<FamilyActivity> list = dao.query(FamilyActivity.class, Cnd.NEW().andEX("year", "=", year).desc("activityStartTime"));
return Result.success(list);
}
/**
* 培训班报名人员list
*
* @param courseId
* @return
*/
@At
@ApiOperation("报名人员列表")
@SaCheckPermission("family.statistics")
public Result registerUserList(@Param(value = "courseId") String courseId) {
return Result.success(familyActivityStatisticsService.registerUserList(courseId));
}
@At
@ApiOperation("报名动态列")
@SaCheckPermission("family.statistics")
public Object getTaleColumnInfo(@Param(value = "courseId") String courseId) {
return Result.success(familyActivityStatisticsService.getTaleColumnInfo(courseId));
}
/**
* 培训班上课签到信息
*
* @param courseId
* @return
*/
@At
@ApiOperation("获取签到信息")
@SaCheckPermission("family.statistics")
public Result getSignInfo(@Param("courseId") String courseId) {
return Result.success(familyActivityStatisticsService.getSignInfo(courseId));
}
@At
@ApiOperation("开放报名")
@SaCheckPermission("family.statistics")
public Result signChange(@Param("courseId") String courseId, @Param("openOtherUnion") Boolean openOtherUnion) {
dao.update(FamilyCourse.class, Chain.make("openOtherUnion", openOtherUnion)
, Cnd.where("id", "=", courseId));
return Result.success();
}
@At
@Ok("void")
@ApiOperation("导出签到名单")
@SaCheckPermission("family.statistics")
public void exportSignUser(@Param(value = "activityId") String activityId,
HttpServletResponse response) throws IOException {
try {
FamilyActivity activity = dao.fetch(FamilyActivity.class, activityId);
Sql sql = Sqls.create("""
SELECT
ts.*,
CONCAT(DATE_FORMAT(ac.courseStartTime, '%H:%i:%s'),'至',DATE_FORMAT(ac.courseEndTime, '%H:%i:%s')) AS courseTime,
u.username,
u.loginname,
u.sex,
ifnull(u.mobile, ts.mobile) as newMobile,
u.birthday,
tsc.courseName
FROM
family_user ts
left join family_activity_course ac on ts.activityCourseId = ac.id
left join `vw_user` u on u.id = ts. userId
left join family_course tsc on tsc.id = ts.courseId
WHERE
ts.activityId = @activityId
""").setParam("activityId", activityId);
List<NutMap> userList = familyActivityManageService.listMap(sql);
List<FamilyCourse> courseList = dao.query(FamilyCourse.class, Cnd.where("activityId", "=", activityId));
List<FamilyType> familyTypeList = dao.query(FamilyType.class, Cnd.NEW());
dao.fetchLinks(familyTypeList, "familyMobileSignColumnList", Cnd.NEW().asc("columnIndex"));
Map<String, FamilyType> typeMap = familyTypeList.stream().collect(Collectors.toMap(FamilyType::getId, o -> o));
List<Map<String, Object>> sheetsList = new ArrayList<>();
List<Map<String, String>> basicEntity = List.of(
Map.of("name", "姓名", "key", "username"),
Map.of("name", "工号", "key", "loginname"),
Map.of("name", "单位", "key", "unitName"),
Map.of("name", "分工会", "key", "unionName"),
Map.of("name", "性别", "key", "sex"),
Map.of("name", "手机号", "key", "newMobile"),
Map.of("name", "报名时段", "key", "courseTime")
);
List<ExcelExportEntity> excelCommonExportEntity = basicEntity.stream().map(entity -> {
ExcelExportEntity excelExportEntity = new ExcelExportEntity();
excelExportEntity.setKey(entity.get("key"));
excelExportEntity.setName(entity.get("name"));
excelExportEntity.setWidth(20);
excelExportEntity.setNeedMerge(true);
return excelExportEntity;
}).collect(Collectors.toCollection(ArrayList::new));
for (FamilyCourse c : courseList) {
String k = c.getCourseName();
List<NutMap> courseSignUsers = userList.stream().filter(x -> x.getString("courseName").equals(k)).collect(Collectors.toCollection(ArrayList::new));
ExportParams userExportParams = new ExportParams();
userExportParams.setSheetName(k);
userExportParams.setType(ExcelType.HSSF);
List<ExcelExportEntity> currentEntities = new ArrayList<>(excelCommonExportEntity);
FamilyType signUpType = typeMap.get(c.getCourseType());
if (Lang.isNotEmpty(signUpType.getFamilyMobileSignColumnList())) {
ExcelExportEntity familyEntity = new ExcelExportEntity("家属信息", "familyInfos", 20);
List<ExcelExportEntity> signColumn = signUpType.getFamilyMobileSignColumnList().stream().map(column -> {
ExcelExportEntity entity = new ExcelExportEntity();
entity.setName(column.getColumnName());
entity.setKey(column.getColumnCode());
entity.setWidth(20);
if ("FILE".equals(column.getColumnFormType())) {
entity.setType(2);
entity.setExportImageType(2);
}
return entity;
}).collect(Collectors.toCollection(ArrayList::new));
familyEntity.setList(signColumn);
currentEntities.add(familyEntity);
}
for (NutMap userSignData : courseSignUsers) {
String mobileColumnsValueStr = userSignData.getString("mobileColumnsValue");
if (StrUtil.isNotBlank(mobileColumnsValueStr)) {
JSONArray outerArray = JSONUtil.parseArray(mobileColumnsValueStr);
List<List<JSONObject>> result = outerArray.stream()
.map(item -> {
// 每个 item 又是一个数组
JSONArray innerArray = (JSONArray) item;
return innerArray.toList(JSONObject.class);
})
.toList();
List<NutMap> familyInfos = new ArrayList<>();
for (List<JSONObject> list : result) {
NutMap familyMap = new NutMap();
for (JSONObject column : list) {
if (!"FILE".equals(column.getStr("columnFormType"))) {
familyMap.put(column.getStr("columnCode"), column.getStr("columnValue"));
} else {
if (StrUtil.isNotBlank(column.getStr("columnValue"))) {
List<JSONObject> columnValue = Json.fromJsonAsList(JSONObject.class, column.getStr("columnValue"));
if (columnValue.size() == 1) {
JSONObject sysFile = columnValue.get(0);
Sys_file file = dao.fetch(Sys_file.class, Cnd.where(Sys_file::getDownloadPath, "=", sysFile.get("url")));
byte[] imageBytes = SysFileMinIoUtil.getFileBytes(file.getBucket(), file.getStoragePath());
if (imageBytes.length > 0) {
familyMap.put(column.getStr("columnCode"), imageBytes);
}
}
}
}
}
familyInfos.add(familyMap);
}
userSignData.put("familyInfos", familyInfos);
}
}
Map<String, Object> userExportMap = new HashMap<>();
userExportMap.put("name", k);
userExportMap.put("title", userExportParams);
userExportMap.put("entity", currentEntities);
userExportMap.put("data", courseSignUsers);
sheetsList.add(userExportMap);
}
Workbook workbook = new HSSFWorkbook();
for (Map<String, Object> map : sheetsList) {
ExcelExportService service = new ExcelExportService();
service.createSheetForMap(workbook, (ExportParams) map.get("title"), (List<ExcelExportEntity>) map.get("entity"), (Collection<?>) map.get("data"));
}
CommonDownloadUtil.download(activity.getActivityName() + "报名人员名单" + ".xlsx", workbook, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,162 @@
package com.budwk.app.zhgh.activity.family.models;
import com.budwk.app.base.model.BaseModel;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.sys.services.SysHomeConvert;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import org.nutz.lang.Lang;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* @author NINGMEI
*/
@Data
@Accessors(chain = true)
@Comment("亲子活动")
@Table("family_activity")
@EqualsAndHashCode(callSuper = false)
public class FamilyActivity extends BaseModel implements Serializable, SysHomeConvert {
@Name
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("活动名称")
private String activityName;
@Column
@ColDefine(type = ColType.INT)
@Comment("年度")
private Integer year;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("活动报名开始时间")
private Date activitySignUpStartTime;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("活动报名开始时间")
private Date activitySignUpEndTime;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("活动开始时间")
private Date activityStartTime;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("活动结束时间")
private Date activityEndTime;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否禁用")
@Default("0")
private boolean isDisabled;
@Column
@ColDefine(customType = "longtext")
@Comment("活动介绍")
private String introduce;
@Column
@ColDefine(type = ColType.INT, width = 10)
@Comment("活动限制标识")
private Integer restrictLimit;
@Column
@ColDefine(type = ColType.INT, width = 10)
@Comment("活动限制报名个数")
private Integer limitNum;
@Column
@ColDefine(type = ColType.VARCHAR, width = 100)
@Comment("活动封面")
private String cover;
@Column
@ColDefine(type = ColType.VARCHAR, width = 100)
@Comment("微信群二维码")
private String wechat;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("上课前是否通知")
@Default("0")
private boolean notice;
@Column
@Comment("活动范围Id")
@ColDefine(type = ColType.INT, width = 32)
private Integer activityGroupId;
@Column
@Comment("活动范围名称")
@ColDefine(type = ColType.VARCHAR, width = 40)
private String activityGroupName;
@Many(field = "activityId")
private List<FamilyCourse> courseList;
@Many(field = "activityId")
private List<FamilyTypeLimit> typeLimits;
@Column
@Comment("活动类型")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String trainType;
@Column
@Comment("关键词")
@Default("家属")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String keyWord;
@Column
@Comment("家属最多数")
@ColDefine(type = ColType.INT)
private Integer familyMaxCount;
@Column
@Comment("判断家属数量的唯一标识")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String onlyKey;
@Column
@Comment("主办单位")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> hostUnitIds;
@Column
@Comment("承办单位")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> undertakeUnitIds;
@Override
public Sys_home_activity covertToSysHomeActivity() {
Sys_home_activity sysHomeActivity = new Sys_home_activity();
sysHomeActivity.setId(this.getId());
sysHomeActivity.setName(this.getActivityName());
sysHomeActivity.setCover(this.getCover());
sysHomeActivity.setUrl("/platform/family/apply?id=" + this.getId());
sysHomeActivity.setH5Url("/platform/family/apply/h5?id=" + this.getId());
if (Lang.isNotEmpty(this.getActivitySignUpStartTime())) {
sysHomeActivity.setStartDate(this.getActivitySignUpStartTime());
sysHomeActivity.setEndDate(this.getActivitySignUpEndTime());
}
sysHomeActivity.setAllowUserGroupId(this.getActivityGroupId());
sysHomeActivity.setEnable(!this.isDisabled());
sysHomeActivity.setClassPath(this.getClass().getPackageName() + this.getClass().getName());
return sysHomeActivity;
}
}
@@ -0,0 +1,57 @@
package com.budwk.app.zhgh.activity.family.models;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.Date;
/**
* @author NINGMEI
*/
@Data
@Accessors(chain = true)
@Comment("亲子活动下的子活动")
@Table("family_activity_course")
@EqualsAndHashCode(callSuper = false)
public class FamilyActivityCourse {
@Name
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("活动ID")
private String activityId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("课程ID")
private String courseId;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("课程开始时间")
private Date courseStartTime;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("课程结束时间")
private Date courseEndTime;
@Column
@ColDefine(type = ColType.DATE)
@Comment("课程时间")
private Date courseDate;
@Column
@ColDefine(type = ColType.INT, width = 4)
@Comment("限制人数")
private Integer courseLimitNum;
private Integer hasRegisterNum;
}
@@ -0,0 +1,34 @@
package com.budwk.app.zhgh.activity.family.models;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
/**
* @author NINGMEI
*/
@Data
@Accessors(chain = true)
@Comment("亲子活动黑名单")
@Table("family_black_list")
@EqualsAndHashCode(callSuper = false)
public class FamilyBlackList {
@Name
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("用户id")
private String userId;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否禁用")
private Boolean isDisabled;
}
@@ -0,0 +1,182 @@
package com.budwk.app.zhgh.activity.family.models;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import org.nutz.lang.util.NutMap;
import java.io.Serializable;
import java.util.List;
@Data
@Accessors(chain = true)
@Comment("亲子活动的子活动")
@Table("family_course")
@EqualsAndHashCode(callSuper = false)
public class FamilyCourse extends BaseModel implements Serializable {
@Name
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("活动ID")
private String activityId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("课程名称")
private String courseName;
@Column
@ColDefine(type = ColType.INT)
@Comment("课程人数")
private int coursePeopleNumber;
@Column
@ColDefine(type = ColType.INT)
@Default(value = "0")
@Comment("预留名额")
private int courseReservedNumber;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("课程地点")
private String courseLocation;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("课程类型")
private String courseType;
@Column
@ColDefine(type = ColType.MYSQL_JSON)
@Comment("课程地点坐标")
private List<Double> courseLocationCoordinates;
@Column
@ColDefine(type = ColType.VARCHAR, width = 20)
@Comment("课程讲师")
private String courseInstructor;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("校区")
private String campus;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("报名人数是否限制")
private Boolean courseIsLimitApply;
@Column
@ColDefine(type = ColType.INT)
@Comment("序号")
private int orderNum;
@Column
@ColDefine(customType = "longtext")
@Comment("详细信息")
private String introduce;
@Many(field = "courseId")
private List<FamilyActivityCourse> courseTimeList;
@Column
@Comment("分工会人数限制")
@ColDefine(type = ColType.MYSQL_JSON)
private List<NutMap> unionLimit;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("移动端是否签到")
@Default("0")
private boolean isMobileSign;
@Column
@ColDefine(type = ColType.INT)
@Comment("签到方式 1.扫描二维码签到 2.被扫 3.gps签到")
private Integer signType;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("移动端是否签收礼品")
@Default("0")
private boolean isReceiveGift;
@Column
@ColDefine(type = ColType.INT)
@Comment("领取礼品方式 1.扫描二维码 2.线下")
private Integer giftType;
@Column
@ColDefine(type = ColType.INT)
@Comment("预留名额方式 1.报名人员减少模式 2.报名人数不变模式")
private Integer reserveMode;
@Column
@Comment("承办工会")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String hostUnionId;
@Column
@Comment("对内报名时间")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String interTime;
@Column
@Comment("是否开放给其他工会")
@ColDefine(type = ColType.BOOLEAN, width = 4)
private Boolean openOtherUnion;
@Column
@Comment("分类标识")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String assort;
@Column
@ColDefine(type = ColType.INT)
@Default(value = "0")
@Comment("候补名额数")
private Integer waitingNum;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否限制年龄")
@Default("0")
private boolean familyAgeLimit;
@Column
@ColDefine(type = ColType.INT)
@Comment("最小年龄")
private Integer minAge;
@Column
@ColDefine(type = ColType.INT)
@Comment("最大年龄")
private Integer maxAge;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否限制性别")
@Default("0")
private boolean familySexLimit;
@Column
@ColDefine(type = ColType.VARCHAR)
@Comment("限制性别")
private String familySex;
private Integer hasWaitingNum;
private String courseTimeName;
private Integer hasRegisterNum;
private Boolean isBringFamily;
private Boolean isAddFamily;
private Boolean isSign;
private Boolean canSignThisCourseType;
}
@@ -0,0 +1,92 @@
package com.budwk.app.zhgh.activity.family.models;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* @author NINGMEI
*/
@Data
@Accessors(chain = true)
@Comment("亲子活动移动端动态表单")
@Table("family_mobile_sign_column")
@EqualsAndHashCode(callSuper = false)
public class FamilyMobileSignColumn implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("类型id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String typeId;
@Column
@Comment("字段名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String columnName;
@Column
@Comment("字段编码")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String columnCode;
@Column
@Comment("字段值")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String columnValue;
@Column
@Comment("字段类型")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String columnType;
@Column
@Comment("下拉框的值")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> selectValues;
@Column
@Comment("是否必填")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isRequired;
@Column
@Comment("控件类型")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String columnFormType;
@Column
@Comment("文件个数")
@ColDefine(type = ColType.INT)
private Integer fileNumber;
@Column
@Comment("文件类型")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> fileType;
@Column
@Comment("序号")
@ColDefine(type = ColType.INT, width = 1)
private Integer columnIndex;
@Column
@Comment("验证规则")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String validRule;
}
@@ -0,0 +1,73 @@
package com.budwk.app.zhgh.activity.family.models;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* @author NINGMEI
*/
@Data
@Accessors(chain = true)
@Comment("亲子活动的子活动类型")
@Table("family_type")
@EqualsAndHashCode(callSuper = false)
public class FamilyType extends BaseModel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("类型编码")
@ColDefine(type = ColType.VARCHAR, width = 80)
private String code;
@Column
@Comment("类型名称")
@ColDefine(type = ColType.VARCHAR, width = 80)
private String typeName;
@Column
@Comment("序号")
@ColDefine(type = ColType.INT, width = 1)
private Integer xh;
@Column
@Comment("是否携带家属")
@ColDefine(type = ColType.BOOLEAN)
@Default("1")
private Boolean isBringFamily;
@Column
@Comment("家属纳入总人数")
@ColDefine(type = ColType.BOOLEAN)
@Default("1")
private Boolean isAddFamily;
@Column
@Comment("本人纳入总人数")
@ColDefine(type = ColType.BOOLEAN)
@Default("1")
private Boolean selfAddFamily;
@Many(field = "typeId")
private List<FamilyMobileSignColumn> familyMobileSignColumnList;
@Column
@Comment("家属最多数")
@ColDefine(type = ColType.INT)
private Integer familyMaxCount;
}
@@ -0,0 +1,45 @@
package com.budwk.app.zhgh.activity.family.models;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.io.Serial;
import java.io.Serializable;
/**
* @author NINGMEI
*/
@Data
@Accessors(chain = true)
@Comment("子活动类型限制条件")
@Table("family_type_limit")
@EqualsAndHashCode(callSuper = false)
public class FamilyTypeLimit implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("活动id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String activityId;
@Column
@Comment("活动类型id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String typeId;
@Column
@Comment("限制个数")
@ColDefine(type = ColType.INT, width = 10)
private int limitNum;
}
@@ -0,0 +1,89 @@
package com.budwk.app.zhgh.activity.family.models;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import org.nutz.lang.util.NutMap;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* @author NINGMEI
*/
@Data
@Accessors(chain = true)
@Comment("亲子活动报名人员")
@Table("family_user")
@EqualsAndHashCode(callSuper = false)
@TableIndexes({@Index(name = "INDEX_FAMILY_USER_COURSEID", fields = {"courseId"}, unique = false)})
public class FamilyUser implements Serializable {
@Name
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("活动ID")
private String activityId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("课程ID")
private String courseId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("用户ID")
private String userId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("工会ID")
private String unionId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("单位ID")
private String unitId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 100)
@Comment("工会")
private String unionName;
@Column
@ColDefine(type = ColType.VARCHAR, width = 100)
@Comment("单位")
private String unitName;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("联系方式")
private String mobile;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("报名时间")
private Date signUpTime;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("活动课程时段id")
private String activityCourseId;
@Column
@ColDefine(type = ColType.MYSQL_JSON)
@Comment("手机端报名字段和值")
private List<List<NutMap>> mobileColumnsValue;
@Column
@ColDefine(type = ColType.INT)
@Comment("用户报名状态(1.正常 2.待报名成功 3.也是正常,但是是从2变为1的 4.废弃[就是没签到的意思])")
private Integer state;
}
@@ -0,0 +1,90 @@
package com.budwk.app.zhgh.activity.family.models;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.io.Serializable;
import java.util.Date;
/**
* @author NINGMEI
*/
@Data
@Accessors(chain = true)
@Comment("亲子活动报名人员子活动表")
@Table("family_user_course")
@EqualsAndHashCode(callSuper = false)
@TableIndexes({
@Index(name = "INDEX_FAMILY_USER_COURSE_USERID", fields = {"userId"}, unique = false),
@Index(name = "INDEX_FAMILY_USER_COURSE_COURSEID", fields = {"courseId"}, unique = false)
})
public class FamilyUserCourse implements Serializable {
@Name
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("活动ID")
private String activityId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("课程ID")
private String courseId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("用户ID")
private String userId;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("课程开始时间")
private Date courseStartTime;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("课程结束时间")
private Date courseEndTime;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否上课")
private boolean isAttend;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("上课打卡时间")
private Date attendTime;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否领取礼品")
private Boolean isReceive;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("领取礼品时间")
private Date receiveTime;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("签到扫码人员id(二维码模式)")
private String signScannerCodeUserId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("礼品扫码人员id(二维码模式)")
private String giftScannerCodeUserId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("关联family_activity_course表的id")
private String activityCourseId;
}
@@ -0,0 +1,118 @@
package com.budwk.app.zhgh.activity.family.service;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.family.models.FamilyActivity;
import com.budwk.app.zhgh.activity.family.models.FamilyCourse;
import com.budwk.app.zhgh.activity.family.models.FamilyUser;
import org.nutz.dao.Cnd;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @author NINGMEI
*/
public interface FamilyActivityService extends BaseService<FamilyActivity> {
/**
* 添加活动
* @param activity 活动信息
* @param course 培训班信息
*/
void add(FamilyActivity activity, FamilyCourse course);
/**
* 编辑活动
* @param activity 活动信息
*/
void edit(FamilyActivity activity);
/**
* 更新活动状态
* @param activity 活动信息
*/
void updateActivityStatus(FamilyActivity activity);
/**
* 查询单条活动信息
* @param id 活动ID
* @return 返回的数据与前端符合
*/
NutMap findOne(String id, Cnd cnd, String fromMode);
/**
* pc分页查询
* @param pageForm
* @param cnd
* @return
*/
Pagination pageData(PageForm pageForm, Cnd cnd);
/**
* 手机端分页查询
* @param pageForm 分页
* @param year 年度
* @param activityStatus 报名状态 0全部 1进行中 2结束
* @return
*/
Pagination mPageData(PageForm pageForm, Integer year, int activityStatus, Integer activityType);
/**
* 手机端报名
* @param familyUser 活动ID
*/
void doSignUp(FamilyUser familyUser) throws Exception;
/**
* 异步插入每个报名成功人员的课程数据
* @param activityId
* @param courseId
* @param userId
*/
void asyncInsertUserCourse(String activityId, String courseId, String userId);
/**
* 该培训班每个分工会名额是否报满
* @return
*/
boolean isSignFullByUnionId(FamilyCourse course, Integer currentFamilyNumber);
/**
* 该培训班是否报满
*/
boolean isSignFull(FamilyCourse course, Integer currentFamilyNumber);
boolean validFamilyCount(FamilyUser user);
/**
* 还能报该类型的培训班吗 比如书画班最多报一项 健身班两项
* @return
*/
boolean isSignCourse(FamilyCourse course, FamilyActivity activity);
/**
* 当前用户是否已报过该培训班
* @param courseId
* @param userId
* @return
*/
boolean isSignCourseByUser(String courseId, String userId);
/**
* 手机端签到
* @param id 每个培训班每节课每个用户的记录ID
*/
void doQd(String id);
/**
* 某个用户的签到信息
* @param userId 用户id
* @param activityId 活动id
*/
List<NutMap> qdInfoByUserId(String userId, String activityId);
List<FamilyCourse> filterCourseByHostUnion(List<FamilyCourse> courseList);
}
@@ -0,0 +1,62 @@
package com.budwk.app.zhgh.activity.family.service;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.family.models.FamilyUser;
import org.nutz.lang.util.NutMap;
import java.util.List;
import java.util.Map;
/**
* @author NINGMEI
*/
public interface FamilyActivityStatisticsService extends BaseService<FamilyUser> {
/**
* 统计分页
* @param pageForm
* @param activityId
* @return
*/
Pagination pageData(PageForm pageForm, String activityId);
/**
* 该课程下的报名人员信息
* @param courseId
* @return
*/
List<NutMap> registerUserList(String courseId);
List<NutMap> getTaleColumnInfo(String courseId);
/**
* 该课程下的报名人员信息
* @param courseId
* @return
*/
List<NutMap> registerUserList(String courseId, String unionId, String unitId, String searchName, String searchKeyword);
/**
* 获取每个课程的签到情况
* @param courseId
* @return k->每个培训班每节课的上课时间 v->上课记录list
*/
Map<String, List<NutMap>> getSignInfo(String courseId);
/**
* 报名人员list 导出
* @param activityId
* @return
*/
List<NutMap> baoMingUserList(String activityId);
int queryCourseCount(String courseId, String courseType);
int queryCourseWaitCount(String courseId, String courseType);
int queryCourseCount(String courseId, String courseType, String unionId);
int queryCourseWaitCount(String courseId, String courseType, String unionId);
}
@@ -0,0 +1,37 @@
package com.budwk.app.zhgh.activity.family.service;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.family.models.FamilyBlackList;
import org.nutz.dao.Cnd;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @author NINGMEI
*/
public interface FamilyBlackListService extends BaseService<FamilyBlackList> {
/**
* 分页
* @param pageForm 分页
* @return Pagination
*/
Pagination pageData(PageForm pageForm, Cnd cnd, String activityId, String courseId);
/**
* 拉黑、解封用户
* @param userId
*/
void doHandleUser(String userId);
/**
* 上课记录
* @param userId
* @return
*/
List<NutMap> attendClassRecord(String userId);
}
@@ -0,0 +1,491 @@
package com.budwk.app.zhgh.activity.family.service.impl;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.family.models.*;
import com.budwk.app.zhgh.activity.family.service.FamilyActivityService;
import com.budwk.app.zhgh.activity.family.service.FamilyActivityStatisticsService;
import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpActivityCourse;
import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpUserCourse;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.async.Async;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author NINGMEI
*/
@Slf4j
@IocBean(args = {"refer:dao"})
public class FamilyActivityServiceImpl extends BaseServiceImpl<FamilyActivity> implements FamilyActivityService {
@Inject
private FamilyActivityStatisticsService statisticsService;
public FamilyActivityServiceImpl(Dao dao) {
super(dao);
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void add(FamilyActivity activity, FamilyCourse course) {
dao().insert(activity);
//插入类型限制
List<FamilyTypeLimit> typeLimits = activity.getTypeLimits();
typeLimits.forEach(v -> v.setActivityId(activity.getId()));
dao().insert(typeLimits);
List<FamilyCourse> courseList = activity.getCourseList();
for (FamilyCourse v : courseList) {
v.setActivityId(activity.getId());
v.setOpenOtherUnion(false);
dao().insert(v);
this.setCourseTimeAndInsert(v);
}
if (!activity.isDisabled()) {
Sys_home_activity sysHomeActivity = activity.covertToSysHomeActivity();
dao().insertOrUpdate(sysHomeActivity);
}
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void edit(FamilyActivity activity) {
//修改活动
update(activity);
//修改类型限制
List<FamilyTypeLimit> typeLimits = activity.getTypeLimits();
typeLimits.forEach(v -> v.setActivityId(activity.getId()));
if(Lang.isNotEmpty(typeLimits)) {
insertOrUpdate(typeLimits);
}
List<FamilyCourse> courseList = activity.getCourseList();
courseList.forEach(v -> {
v.setActivityId(activity.getId());
dao().insertOrUpdate(v);
if (Lang.isNotEmpty(v.getCourseTimeList())) {
this.setCourseTimeAndInsert(v);
}
});
//查询原来的活动
List<FamilyCourse> oldCourseList = dao().query(FamilyCourse.class, Cnd.where("activityId", "=", activity.getId()));
//原来的培训班id
List<String> oldCourseIdList = oldCourseList.stream().map(FamilyCourse::getId).toList();
//原来的上课时间
List<FamilyActivityCourse> oldActCourseTimeList = dao().query(FamilyActivityCourse.class, Cnd.where("activityId", "=", activity.getId()));
//现在的上课时间
List<String> nowCourseTimeListId = new ArrayList<>();
activity.getCourseList().forEach(v -> {
if (v.getCourseTimeList() != null) {
nowCourseTimeListId.addAll(v.getCourseTimeList().stream().map(FamilyActivityCourse::getId).toList());
}
});
List<String> deleteCourseTimeListId = oldActCourseTimeList.stream().map(FamilyActivityCourse::getId).filter(id -> !nowCourseTimeListId.contains(id)).collect(Collectors.toList());
List<String> courseIdList = courseList.stream().map(FamilyCourse::getId).collect(Collectors.toList());
//删除关联的培训班
List<String> deleteIdList = oldCourseIdList.stream().filter(v -> !courseIdList.contains(v)).collect(Collectors.toList());
dao().clear(FamilyCourse.class, Cnd.where("id", "in", deleteIdList));
dao().clear(FamilyActivityCourse.class, Cnd.where("id", "in", deleteCourseTimeListId));
dao().clear(FamilyUser.class, Cnd.where("courseId", "not in", courseIdList).and("activityId", "=", activity.getId()));
dao().clear(FamilyUserCourse.class, Cnd.where("courseId", "not in", courseIdList).and("activityId", "=", activity.getId()));
//查询修改过培训时间的记录
Sql tsuucSql = Sqls.create("""
SELECT
tsuuc.id,
tsuac.courseStartTime,
tsuac.courseEndTime
FROM
`family_user_course` tsuuc
LEFT JOIN family_activity_course tsuac ON tsuac.id = tsuuc.activityCourseId
where tsuuc.courseStartTime != tsuac.courseStartTime or tsuuc.courseEndTime != tsuac.courseEndTime
""");
List<NutMap> tsuucList = listMap(tsuucSql);
tsuucList.forEach(v -> {
Chain chain = Chain.make("courseStartTime", v.getTime("courseStartTime"));
chain.add("courseEndTime", v.getTime("courseEndTime"));
Cnd cnd = Cnd.where("id", "=", v.getString("id"));
dao().update("family_user_course", chain, cnd);
});
if (!activity.isDisabled()) {
Sys_home_activity sysHomeActivity = activity.covertToSysHomeActivity();
dao().insertOrUpdate(sysHomeActivity);
} else {
dao().delete(Sys_home_activity.class, activity.getId());
}
}
private void setCourseTimeAndInsert(FamilyCourse course) {
course.getCourseTimeList().forEach(courseTime -> {
Calendar calendar = Calendar.getInstance();
calendar.setTime(courseTime.getCourseDate());
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DATE);
Calendar startCalendar = Calendar.getInstance();
startCalendar.setTime(courseTime.getCourseStartTime());
startCalendar.set(year, month, day);
courseTime.setCourseStartTime(startCalendar.getTime());
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(courseTime.getCourseEndTime());
endCalendar.set(year, month, day);
courseTime.setCourseEndTime(endCalendar.getTime());
courseTime.setActivityId(course.getActivityId());
courseTime.setCourseId(course.getId());
dao().insertOrUpdate(courseTime);
});
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void updateActivityStatus(FamilyActivity activity) {
updateIgnoreNull(activity);
}
@Override
public NutMap findOne(String id, Cnd cnd, String fromMode) {
if (Lang.isEmpty(cnd)) {
cnd = Cnd.NEW();
}
cnd.asc("orderNum").asc("campus").desc("courseLocation").asc("courseType").asc("courseName");
List<FamilyCourse> courseArray = dao().query(FamilyCourse.class, cnd.and("activityId", "=", id));
if (StrUtil.isNotBlank(fromMode) && "mobile".equals(fromMode)) {
courseArray = this.filterCourseByHostUnion(courseArray);
}
FamilyActivity activity = fetchLinks(dao().fetch(FamilyActivity.class, id), "^(conditionStructure|typeLimits)$");
activity.setCourseList(courseArray);
List<FamilyCourse> courseList = activity.getCourseList();
courseList.forEach(c -> {
if (StrUtil.isNotBlank(c.getCourseType())) {
dao().fetchLinks(c, "^(courseTimeList)$", Cnd.NEW().asc("courseStartTime"));
int courseCount = statisticsService.queryCourseCount(c.getId(), c.getCourseType());
c.setHasRegisterNum(courseCount);
int courseWaitCount = statisticsService.queryCourseWaitCount(c.getId(), c.getCourseType());
c.setHasWaitingNum(courseWaitCount);
//当前用户是否报过
c.setIsSign(isSignCourseByUser(c.getId(), SecurityUtil.getUserId()));
}
});
return Lang.obj2nutmap(activity);
}
@Override
public Pagination pageData(PageForm pageForm, Cnd cnd) {
Pagination pagination = listPageLinks(pageForm.getPageNumber(), pageForm.getPageSize(), cnd, "^(courseList)$");
return pagination;
}
@Override
public Pagination mPageData(PageForm pageForm, Integer year, int activityStatus, Integer activityType) {
Cnd cnd = Cnd.NEW();
cnd.andEX("year", "=", year);
switch (activityStatus) {
case 2 -> {
cnd.and(new Static("activitySignUpStartTime < now()"));
cnd.and(new Static("activitySignUpEndTime > now()"));
}
case 3 -> {
cnd.and(new Static("activityStartTime < now()"));
cnd.and(new Static("activityEndTime > now()"));
}
case 4 -> cnd.and(new Static("activityEndTime < now()"));
case 5 -> cnd.and(new Static("activityStartTime < now()"));
case 6 -> cnd.and(new Static("activityStartTime > now()"));
}
if (activityType != null && activityType == 1) {
cnd.and(new Static("id in (select activityId from family_user where userId = '%s')".formatted(SecurityUtil.getUserId())));
}
cnd.and("isDisabled", "=", 0);
cnd.orderBy("activityEndTime", "desc");
cnd.orderBy("isDisabled", "desc");
cnd.orderBy("createdAt", "desc");
return listPage(pageForm.getPageNumber(), pageForm.getPageSize(), cnd);
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void doSignUp(FamilyUser familyUser) throws Exception {
String userId = SecurityUtil.getUserId();
//查询课程
FamilyCourse course = dao().fetch(FamilyCourse.class, familyUser.getCourseId());
FamilyType type = dao().fetch(FamilyType.class, course.getCourseType());
//如果这个课程的预留名额方式为报名人数不变
if (course.getReserveMode() == 2) {
//如果当前报名+已报小于这个课程限制人数
//课程已报人数
int normalCount = statisticsService.queryCourseCount(course.getId(), course.getCourseType());
//+1是算自己
int hasRegisterNum = type.getSelfAddFamily() ? normalCount + 1 : 0;
familyUser.setState((hasRegisterNum + course.getCourseReservedNumber()) > course.getCoursePeopleNumber() ? 2 : 1);
} else {
familyUser.setState(1);
}
View_user user = dao().fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId()));
familyUser.setUnionId(SecurityUtil.getUnionId());
familyUser.setUnionName(user.getUnionName());
familyUser.setUnitId(SecurityUtil.getUnitId());
familyUser.setUnitName(user.getUnitName());
familyUser.setUserId(userId);
familyUser.setSignUpTime(new Date());
dao().insert(familyUser);
if (StrUtil.isNotBlank(familyUser.getActivityCourseId())) {
TrainSignUpActivityCourse fetch = dao().fetch(TrainSignUpActivityCourse.class, familyUser.getActivityCourseId());
TrainSignUpUserCourse userCourse = new TrainSignUpUserCourse();
userCourse.setActivityId(familyUser.getActivityId());
userCourse.setCourseId(familyUser.getCourseId());
userCourse.setUserId(familyUser.getUserId());
userCourse.setCourseStartTime(fetch.getCourseStartTime());
userCourse.setCourseEndTime(fetch.getCourseEndTime());
userCourse.setAttend(false);
userCourse.setAttendTime(null);
userCourse.setActivityCourseId(fetch.getId());
dao().insert(userCourse);
} else {
asyncInsertUserCourse(familyUser.getActivityId(), familyUser.getCourseId(), userId);
}
}
@Async
@Override
public void asyncInsertUserCourse(String activityId, String courseId, String userId) {
log.info("异步插入{}的上课信息,课程ID为{},活动ID为{}", userId, courseId, activityId);
List<FamilyActivityCourse> courseList = dao().query(FamilyActivityCourse.class, Cnd.where("courseId", "=", courseId));
List<FamilyUserCourse> list = new ArrayList<>();
courseList.forEach(v -> {
FamilyUserCourse userCourse = new FamilyUserCourse();
userCourse.setActivityId(activityId);
userCourse.setCourseId(courseId);
userCourse.setUserId(userId);
userCourse.setCourseStartTime(v.getCourseStartTime());
userCourse.setCourseEndTime(v.getCourseEndTime());
userCourse.setAttend(false);
userCourse.setAttendTime(null);
userCourse.setActivityCourseId(v.getId());
list.add(userCourse);
});
dao().insert(list);
}
/**
* 该培训班每个分工会名额是否报满
* @return
*/
@Override
public boolean isSignFullByUnionId(FamilyCourse course, Integer currentFamilyNumber) {
List<NutMap> unionLimit = course.getUnionLimit();
if (Lang.isEmpty(unionLimit)) {
return false;
}
String unionId = SecurityUtil.getUnionId();
NutMap unionLimitMap = unionLimit.stream().filter(v -> v.getString("id").equals(unionId)).findAny().orElse(null);
if (Lang.isEmpty(unionLimitMap)) {
return true;
}
FamilyType type = dao().fetch(FamilyType.class, course.getCourseType());
//分工会限制人数
int limitCount = unionLimitMap.getInt("limitCount");
//该课程已经报名的总人数
int hasSignCount = statisticsService.queryCourseCount(course.getId(), course.getCourseType(), unionId);
int hasWaitCount = statisticsService.queryCourseWaitCount(course.getId(), course.getCourseType());
//+1是算自己
int current = type.getSelfAddFamily() ? 1 : 0;
currentFamilyNumber = type.getIsBringFamily() && type.getIsAddFamily() ? currentFamilyNumber : 0;
//如果还有正常名额
if(limitCount - hasSignCount > 0) {
return (hasSignCount + current + currentFamilyNumber) > limitCount;
} else {
return (hasWaitCount + current + currentFamilyNumber) > course.getWaitingNum();
}
}
@Override
public boolean isSignFull(FamilyCourse course, Integer currentFamilyNumber) {
//课程限制人数
int coursePeopleNumber = course.getCoursePeopleNumber();
if (coursePeopleNumber == 0) {
return true;
}
//查询课程对应的类型
FamilyType type = dao().fetch(FamilyType.class, course.getCourseType());
//课程已报人数
int hasSignCount = statisticsService.queryCourseCount(course.getId(), course.getCourseType());
int hasWaitCount = statisticsService.queryCourseWaitCount(course.getId(), course.getCourseType());
//+1是算自己
int current = type.getSelfAddFamily() ? 1 : 0;
currentFamilyNumber = type.getIsBringFamily() && type.getIsAddFamily() ? currentFamilyNumber : 0;
//如果还有正常名额
if(coursePeopleNumber - hasSignCount > 0) {
return (hasSignCount + current + currentFamilyNumber + course.getCourseReservedNumber()) > coursePeopleNumber;
} else {
return (hasWaitCount + current + currentFamilyNumber) > course.getWaitingNum();
}
}
@Override
public boolean validFamilyCount(FamilyUser user) {
String activityId = user.getActivityId();
// 查询报名记录
List<FamilyUser> list = dao().query(FamilyUser.class, Cnd.where(FamilyUser::getActivityId, "=", activityId).and(FamilyUser::getUserId, "=", SecurityUtil.getUserId()));
if(Lang.isEmpty(list)) {
return false;
}
FamilyActivity activity = dao().fetch(FamilyActivity.class, activityId);
List<List<NutMap>> allMobileColumnsValue = new ArrayList<>(list.stream()
.map(FamilyUser::getMobileColumnsValue)
.filter(Objects::nonNull)
.flatMap(List::stream)
.toList());
allMobileColumnsValue.addAll(user.getMobileColumnsValue());
return allMobileColumnsValue.size() > activity.getFamilyMaxCount();
}
@Override
public boolean isSignCourse(FamilyCourse course, FamilyActivity activity) {
//培训班类型
String courseType = course.getCourseType();
Sql sql = Sqls.create("""
SELECT
count( tsus.id )
FROM
`family_user` tsus
LEFT JOIN family_course tsuc ON tsuc.id = tsus.courseId
WHERE
tsuc.courseType = @courseType
AND tsus.userId = @userId
AND tsus.activityId = @activityId
""");
sql.setParam("courseType", courseType);
sql.setParam("activityId", activity.getId());
sql.setParam("userId", SecurityUtil.getUserId());
int hasRegisterNum = count(sql);
//第一种无限制报名
if (activity.getRestrictLimit() == null || activity.getRestrictLimit() == 1) {
return true;
} else if (activity.getRestrictLimit() == 2) {
FamilyTypeLimit familyTypeLimit = dao().fetch(FamilyTypeLimit.class, Cnd.where("typeId", "=", courseType).and("activityId", "=", activity.getId()));
if (familyTypeLimit == null) {
return true;
}
//此类型的班最多可报几项
int personMaxRegisterNum = familyTypeLimit.getLimitNum();
if (personMaxRegisterNum == 0) {
return true;
}
return hasRegisterNum < personMaxRegisterNum;
} else if (activity.getRestrictLimit() == 3) {
//第三种,限制报几个,不跟类型挂钩
int aCount = dao().count(FamilyUser.class, Cnd.where("activityId", "=", activity.getId()).and("userId", "=", SecurityUtil.getUserId()));
return aCount < activity.getLimitNum();
}
return false;
}
@Override
public boolean isSignCourseByUser(String courseId, String userId) {
return dao().count(FamilyUser.class, Cnd.where("courseId", "=", courseId).and("userId", "=", userId)) > 0;
}
@Override
public void doQd(String id) {
NutMap updateMap = NutMap.NEW();
updateMap.put("isAttend", true);
updateMap.put("attendTime", new Date());
dao().update(FamilyUserCourse.class, Chain.from(updateMap), Cnd.where("id", "=", id));
}
@Override
public List<NutMap> qdInfoByUserId(String userId, String activityId) {
Sql sql = Sqls.create("""
SELECT
c.*,
t.courseLocationCoordinates,
t.isMobileSign,
t.signType,
t.isReceiveGift,
t.giftType,
(select state from family_user su where su.activityId = c.activityId and su.courseId = c.courseId and su.userId = c.userId) as state
FROM
`family_user_course` c
LEFT JOIN family_course t ON t.id = c.courseId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("c.activityId", "=", activityId);
cnd.and("c.userId", "=", userId);
cnd.asc("c.courseStartTime");
sql.setCondition(cnd);
return listMap(sql);
}
@Override
public List<FamilyCourse> filterCourseByHostUnion(List<FamilyCourse> courseList) {
if (Lang.isEmpty(courseList)) {
return new ArrayList<>();
}
return courseList.stream().filter(o -> {
if (StrUtil.isBlank(o.getInterTime()) || o.getOpenOtherUnion() == null || o.getOpenOtherUnion()) {
return true;
} else {
if (SecurityUtil.getUnionId().equals(o.getHostUnionId())) {
return true;
} else {
int compare = cn.hutool.core.date.DateUtil.compare(cn.hutool.core.date.DateUtil.date(), cn.hutool.core.date.DateUtil.parse(o.getInterTime()), "yyyy-MM-dd HH:mm");
return compare >= 0;
}
}
}).toList();
}
}
@@ -0,0 +1,269 @@
package com.budwk.app.zhgh.activity.family.service.impl;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.family.models.FamilyMobileSignColumn;
import com.budwk.app.zhgh.activity.family.models.FamilyCourse;
import com.budwk.app.zhgh.activity.family.models.FamilyType;
import com.budwk.app.zhgh.activity.family.models.FamilyUser;
import com.budwk.app.zhgh.activity.family.service.FamilyActivityStatisticsService;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
* @author zxy
* @Description TODO
* @createTime 2022年03月03日 10:02:00
*/
@IocBean(args = {"refer:dao"})
@Slf4j
public class FamilyActivityStatisticsServiceImpl extends BaseServiceImpl<FamilyUser> implements FamilyActivityStatisticsService {
public FamilyActivityStatisticsServiceImpl(Dao dao) {
super(dao);
}
@Override
public Pagination pageData(PageForm pageForm, String activityId) {
Sql sql = Sqls.create("""
SELECT
tsuc.id,
tsuc.courseName,
tsuc.coursePeopleNumber,
tsuc.courseReservedNumber,
type.typeName as courseType,
tsuc.courseLocation,
tsuc.courseInstructor,
tsuc.reserveMode,
tsuc.isMobileSign,
tsuc.hostUnionId,
tsuc.interTime,
tsuc.waitingNum,
tsuc.openOtherUnion,
tsuc.courseType as cType
FROM
`family_course` tsuc
LEFT JOIN
family_type type on tsuc.courseType = type.id
WHERE
tsuc.activityId = @activityId
ORDER BY tsuc.orderNum
""");
sql.setParam("activityId", activityId);
Pagination pagination = listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
List<NutMap> courseList = pagination.getList();
courseList.forEach(c -> {
c.put("registerNum", queryCourseCount(c.getString("id"), c.getString("cType")));
c.put("hasWaitingNum", queryCourseWaitCount(c.getString("id"), c.getString("cType")));
});
return pagination;
}
@Override
public List<NutMap> registerUserList(String courseId) {
Sql sql = Sqls.create("""
SELECT
u.loginname,
u.username,
u.sex,
tsuu.unionId,
tsuu.unionName,
tsuu.unitId,
tsuu.unitName,
ifnull(tsuu.mobile, u.mobile) as mobile,
tsuu.signUpTime,
tsuu.state,
tsuu.mobileColumnsValue
FROM
family_user tsuu
LEFT JOIN `vw_user` u ON u.id = tsuu.userId
$condition
ORDER BY FIELD( tsuu.state, 1, 3, 2, 4 ),tsuu.signUpTime desc,u.unionid desc, u.unitid desc
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("tsuu.courseId", "=", courseId);
sql.setCondition(cnd);
List<NutMap> listMap = listMap(sql);
for (NutMap nutMap : listMap) {
// 第一步:解析为 JSONArray(外层数组)
JSONArray outerArray = JSONUtil.parseArray(nutMap.getString("mobileColumnsValue"));
// 第二步:转换为 List<List<JSONObject>>
List<List<JSONObject>> result = outerArray.stream()
.map(item -> {
// 每个 item 又是一个数组
JSONArray innerArray = (JSONArray) item;
return innerArray.toList(JSONObject.class);
})
.toList();
nutMap.put("mobileColumnsValue", result);
nutMap.put("familyCount", result.size());
}
return listMap;
}
@Override
public List<NutMap> getTaleColumnInfo(String courseId) {
FamilyCourse course = dao().fetch(FamilyCourse.class, courseId);
FamilyType upType = dao().fetch(FamilyType.class, course.getCourseType());
dao().fetchLinks(upType, "familyMobileSignColumnList", Cnd.NEW().asc("columnIndex"));
List<FamilyMobileSignColumn> columnList = upType.getFamilyMobileSignColumnList();
List<NutMap> columnTableList = columnList.stream().map(o -> NutMap.NEW().setv("label", o.getColumnName()).setv("prop", o.getColumnCode())).collect(Collectors.toList());
return columnTableList;
}
@Override
public List<NutMap> registerUserList(String courseId, String unionId, String unitId, String searchName, String searchKeyword) {
Sql sql = Sqls.create("""
SELECT
tsuu.id,
u.id as userId,
u.loginname,
u.username,
u.unitname,
u.unionname,
u.sex,
ifnull(tsuu.mobile, u.mobile) as mobile,
tsuu.signUpTime,
tsuu.state
FROM
family_user tsuu
LEFT JOIN `vw_user` u ON u.id = tsuu.userId
$condition
ORDER BY FIELD( tsuu.state, 1, 3, 2, 4 ),tsuu.signUpTime desc,u.unionid desc, u.unitid desc
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("tsuu.courseId", "=", courseId);
cnd.andEX("u.unionid", "=", unionId);
cnd.andEX("u.unitid", "=", unitId);
if (StrUtil.isNotBlank(searchKeyword)) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.andLike("username", searchKeyword).orLike("loginname", searchKeyword);
cnd.and(group);
}
sql.setCondition(cnd);
return listMap(sql);
}
@Override
public Map<String, List<NutMap>> getSignInfo(String courseId) {
Sql sql = Sqls.create("""
SELECT
tsuuc.courseStartTime,
tsuuc.courseEndTime,
tsuuc.isAttend,
tsuuc.attendTime,
u.username,
u.loginname,
u.unitname,
u.unionname
FROM
`family_user_course` tsuuc
LEFT JOIN `vw_user` u ON u.id = tsuuc.userId
WHERE
tsuuc.courseId = @courseId
""");
sql.setParam("courseId", courseId);
List<NutMap> list = listMap(sql);
Map<String, List<NutMap>> courseTimeMap = list.stream().map(v -> {
String courseTime = v.getString("courseStartTime") + "" + v.getString("courseEndTime");
v.put("courseTime", courseTime);
return v;
}).collect(Collectors.groupingBy(v -> v.getString("courseTime")));
// 使用Stream API进行降序排序
Map<String, List<NutMap>> sortedDataMap = courseTimeMap.entrySet().stream()
.sorted(Map.Entry.comparingByKey(Comparator.naturalOrder()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
return sortedDataMap;
}
@Override
public List<NutMap> baoMingUserList(String activityId) {
Sql sql = Sqls.create("""
SELECT
u.loginname,
u.username,
u.unitname,
u.unionname,
u.sex,
u.mobile,
uc.courseName,
uc.campus
FROM
`family_user` uu
RIGHT JOIN family_course uc ON uc.id = uu.courseId
LEFT JOIN `vw_user` u ON u.id = uu.userId
WHERE
uc.activityId = @activityId
ORDER BY u.unitCode,u.unioncode,u.sex
""");
sql.setParam("activityId", activityId);
return listMap(sql);
}
@Override
public int queryCourseCount(String courseId, String courseType) {
return this.queryCourseCount(courseId, courseType, null);
}
@Override
public int queryCourseWaitCount(String courseId, String courseType) {
return this.queryCourseWaitCount(courseId, courseType, null);
}
@Override
public int queryCourseCount(String courseId, String courseType, String unionId) {
return this.calcSignCount(courseId, courseType, unionId, List.of(1, 3));
}
@Override
public int queryCourseWaitCount(String courseId, String courseType, String unionId) {
return this.calcSignCount(courseId, courseType, unionId, List.of(2));
}
private int calcSignCount(String courseId, String courseType, String unionId, List<Integer> stateList) {
if(StrUtil.isBlank(courseId) || StrUtil.isBlank(courseType)) {
return 0;
}
FamilyType type = dao().fetch(FamilyType.class, courseType);
AtomicInteger hasRegisterNum = new AtomicInteger();
List<FamilyUser> signUpUsers = dao().query(FamilyUser.class, Cnd.where("courseId", "=", courseId)
.and("state", "in", stateList)
.andEX("unionId", "=", unionId));
signUpUsers.forEach(item -> {
if (type.getSelfAddFamily()) {
hasRegisterNum.getAndIncrement();
}
if (type.getIsBringFamily() && type.getIsAddFamily()) {
List<List<NutMap>> mapList = item.getMobileColumnsValue();
if (Lang.isNotEmpty(mapList)) {
hasRegisterNum.addAndGet(mapList.size());
}
}
});
return hasRegisterNum.get();
}
}
@@ -0,0 +1,103 @@
package com.budwk.app.zhgh.activity.family.service.impl;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.activity.family.models.FamilyBlackList;
import com.budwk.app.zhgh.activity.family.service.FamilyBlackListService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Criteria;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @author zxy
* @Description TODO
* @createTime 2022年03月07日 14:29:00
*/
@IocBean(args = {"refer:dao"})
public class FamilyUserServiceImpl extends BaseServiceImpl<FamilyBlackList> implements FamilyBlackListService {
public FamilyUserServiceImpl(Dao dao) {
super(dao);
}
@Override
public Pagination pageData(PageForm pageForm, Cnd cnd, String activityId, String courseId) {
Sql sql = Sqls.create("""
SELECT
u.id AS userId,
u.username,
u.loginname,
ifnull(tsuu.mobile, u.mobile) as mobile,
u.unitname,
u.unionname,
tsuc.courseName,
tsuu.state,
( SELECT count( 1 ) FROM family_user_course WHERE userId = tsuu.userId $var) courseTotal,
( SELECT count( 1 ) FROM family_user_course WHERE userId = tsuu.userId AND isAttend = 0 and tsuu.state!=2 AND now()> courseEndTime $var) AS absentCount,
if(tsubl.isDisabled=1,true,false) isDisabled,
group_CONCAT( tsuc.courseName ) AS courseNames
FROM
`family_user` tsuu
LEFT JOIN `vw_user` u ON u.id = tsuu.userId
LEFT JOIN family_activity act on act.id = tsuu.activityId
LEFT JOIN family_course tsuc ON tsuc.id = tsuu.courseId
LEFT JOIN family_black_list tsubl on tsubl.userId = tsuu.userId
$condition
ORDER BY FIELD( tsuu.state, 1, 3, 2, 4 )
""");
cnd.groupBy("tsuu.userId");
Criteria varCnd = Cnd.cri();
varCnd.where().setTop(false);
varCnd.where().andEX("activityId", "=", activityId);
varCnd.where().andEX("courseId", "=", courseId);
if (!varCnd.where().isEmpty()) {
sql.vars().set("var", "and " + varCnd.toSql(null));
}
sql.setCondition(cnd);
return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
@Override
public void doHandleUser(String userId) {
FamilyBlackList blackRecord = dao().fetch(FamilyBlackList.class, Cnd.where("userId", "=", userId));
if (Lang.isEmpty(blackRecord)) {
FamilyBlackList blackList = new FamilyBlackList();
blackList.setUserId(userId);
blackList.setIsDisabled(true);
dao().insert(blackList);
} else {
// blackRecord.setIsDisabled(!blackRecord.getIsDisabled());
// dao().update(blackRecord);
dao().delete(blackRecord);
}
}
@Override
public List<NutMap> attendClassRecord(String userId) {
Sql sql = Sqls.create("""
SELECT
c.courseName,
uc.courseStartTime,
courseEndTime,
uc.isAttend,
uc.attendTime
FROM
`family_user_course` uc
LEFT JOIN family_course c ON c.id = uc.courseId
WHERE
uc.userId = @userId
""");
sql.setParam("userId", userId);
return listMap(sql);
}
}
@@ -0,0 +1,25 @@
package com.budwk.app.zhgh.activity.fellowship.constant;
import com.budwk.app.base.annotation.DictEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @Author JyuHsin
* @Date 2022/11/18
* @Description
*/
@Getter
@DictEnum(key = "ColumnFormTypeEnum", name = "控件类型")
@AllArgsConstructor
public enum ColumnFormTypeEnum {
INPUT("INPUT", "输入框"),
SELECT("SELECT", "选择框"),
STEPPER("STEPPER", "步进器"),
//RADIO("RADIO", "单选框"),//选项数组
FILE("FILE", "文件");
private String code;
private String description;
}
@@ -0,0 +1,179 @@
package com.budwk.app.zhgh.activity.fellowship.controller.manage;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipActivity;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipActivityCourse;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipUser;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipUserCourse;
import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityService;
import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityStatisticsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.ArrayList;
import java.util.List;
/**
* @Author JyuHsin
* @Date 2022/9/21
* @Description 人员调整
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "交友联谊人员调整")
@At("/platform/fellowship/adjust")
public class FellowshipAdjustController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@Inject
private FellowshipActivityService fellowshipActivityManageService;
@Inject
private FellowshipActivityStatisticsService fellowshipActivityStatisticsService;
@At("")
@SaCheckPermission("fellowship.adjust")
@Ok("beetl:/platform/zhgh/activity/fellowship/userAdjust/index.html")
public void index() {
}
/**
* 活动list
* @param year 年度
* @return
*/
@At
@ApiOperation("活动列表")
@SaCheckPermission("fellowship.adjust")
public Result activityList(@Param(value = "year") Integer year) {
List<FellowshipActivity> activityList = dao.query(FellowshipActivity.class, Cnd.NEW().andEX("year", "=", year).andEX("isDisabled", "=", false).desc("activityStartTime"));
return Result.success(activityList);
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("fellowship.adjust")
public Result pageData(PageForm pageForm,
@Param(value = "activityId") String activityId) {
Pagination pagination = fellowshipActivityStatisticsService.pageData(pageForm, activityId);
return Result.success(pagination);
}
@At
@ApiOperation("子活动查询")
@SaCheckPermission("fellowship.adjust")
public Result getCourse(String activityId) {
Sql sql = Sqls.create("""
SELECT
tsuc.id,
tsuc.courseName,
tsuc.coursePeopleNumber,
tsuc.courseType,
tsuc.courseLocation,
tsuc.courseInstructor,
tsuc.courseReservedNumber,
tsuc.waitingNum,
tsuc.reserveMode
FROM
`fellowship_course` tsuc
WHERE
tsuc.activityId = @activityId
ORDER BY courseName asc
""");
sql.setParam("activityId", activityId);
List<NutMap> courseList = baseService.listMap(sql);
courseList.forEach(c -> {
c.put("registerNum", fellowshipActivityStatisticsService.queryCourseCount(c.getString("id"), c.getString("courseType")));
c.put("hasWaitingNum", fellowshipActivityStatisticsService.queryCourseWaitCount(c.getString("id"), c.getString("courseType")));
});
return Result.success(courseList);
}
@At
@ApiOperation("报名用户列表")
@SaCheckPermission("fellowship.adjust")
public Result registerUserList(@Param("courseId") String courseId,
@Param(value = "unionId") String unionId,
@Param(value = "unitId") String unitId,
@Param(value = "searchName") String searchName,
@Param(value = "searchKeyword") String searchKeyword) {
List<NutMap> list = fellowshipActivityStatisticsService.registerUserList(courseId, unionId, unitId, searchName, searchKeyword);
return Result.success(list);
}
@At
@ApiOperation("人员调整")
@SaCheckPermission("fellowship.adjust")
@SLog(tag = "交友联谊-人员调整", msg = "人员调整")
public Result adjust(String activityId, String oldCourseId, String newCourseId, String userId) {
Cnd oldCnd = Cnd.where("activityId", "=", activityId)
.and("courseId", "=", oldCourseId).and("userId", "=", userId);
Cnd newCnd = Cnd.where("activityId", "=", activityId)
.and("courseId", "=", newCourseId).and("userId", "=", userId);
//旧的报名信息
FellowshipUser oldfellowshipUser = dao.fetch(FellowshipUser.class, oldCnd);
oldfellowshipUser.setCourseId(newCourseId);
oldfellowshipUser.setSignUpTime(DateUtil.date());
dao.update(oldfellowshipUser);
//新的课程的信息,上课时间
List<FellowshipActivityCourse> activityCourseList = dao.query(FellowshipActivityCourse.class, Cnd.where("activityId", "=", activityId)
.and("courseId", "=", newCourseId));
//先清楚旧的信息
dao.clear(FellowshipUserCourse.class, oldCnd);
//添加新的信息
List<FellowshipUserCourse> fellowshipUserCourseList = new ArrayList<>();
activityCourseList.forEach(item -> {
FellowshipUserCourse course = new FellowshipUserCourse();
course.setActivityCourseId(activityId);
course.setCourseId(newCourseId);
course.setUserId(userId);
course.setCourseStartTime(item.getCourseStartTime());
course.setCourseEndTime(item.getCourseEndTime());
course.setActivityCourseId(item.getId());
fellowshipUserCourseList.add(course);
});
dao.insert(fellowshipUserCourseList);
return Result.success();
}
@At
@ApiOperation("删除报名人员")
@SaCheckPermission("fellowship.adjust")
@SLog(tag = "交友联谊-人员调整", msg = "删除报名人员")
public Result deleteSignUser(String activityId, String courseId, String userId) {
//删除
Cnd cnd = Cnd.NEW();
cnd.and("activityId", "=", activityId);
cnd.and("courseId", "=", courseId);
cnd.and("userId", "=", userId);
dao.clear(FellowshipUser.class, cnd);
dao.clear(FellowshipUserCourse.class, cnd);
return Result.success();
}
}
@@ -0,0 +1,426 @@
package com.budwk.app.zhgh.activity.fellowship.controller.manage;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_dict;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.services.SysDictService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.basic.models.ActivityUserScope;
import com.budwk.app.zhgh.activity.fellowship.models.*;
import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityService;
import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityStatisticsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "活动报名")
@At("/platform/fellowship/apply")
public class FellowshipApplyController {
private final ReentrantLock lock = new ReentrantLock(true);
@Inject
private FellowshipActivityService fellowshipActivityService;
@Inject
private SysDictService dictService;
@Inject
private FellowshipActivityStatisticsService statisticsService;
@Inject
private Dao dao;
@At("/")
@SaCheckPermission("fellowship.apply")
@Ok("beetl:/platform/zhgh/activity/fellowship/apply/index.html")
public void index() {
}
@At("/h5")
@SaCheckPermission("h5.fellowship.apply")
@Ok("beetl:/platform/zhghh5/activity/fellowship/apply/index.html")
public void h5Index() {
}
@At("/list/h5")
@SaCheckPermission("h5.fellowship.apply")
@Ok("beetl:/platform/zhghh5/activity/fellowship/list/index.html")
public void listIndex() {
}
@At
@ApiOperation("活动查询")
@SaCheckPermission(value = {"fellowship.apply", "h5.fellowship.apply"}, mode = SaMode.OR)
public Result activityPageData(PageForm pageForm,
@Param(value = "year") Integer year,
@Param(value = "activityType") Integer activityType,
@Param(value = "id") String id,
@Param(value = "dataType") String dataType) {
Cnd cnd = Cnd.NEW();
cnd.andEX("id", "=", id);
cnd.andEX("`year`", "=", year);
//查询报名中
if (activityType == 2) {
cnd.and(new Static("now() < activitySignUpEndTime"));
}//查询已结束的
else if (activityType == 3) {
cnd.and(new Static("now() >= activityEndTime"));
}
if (AuthUtil.hasRole("H04") && !AuthUtil.hasRoleOr("sysadmin, A06")) {
cnd.and("activityMode", "=", 2).and("createdBy", "=", SecurityUtil.getUserId());
}
if("mine".equals(dataType)) {
cnd.and(new Static("id in (select activityId from fellowship_user where userId = '%s')".formatted(SecurityUtil.getUserId())));
}
Pagination pagination = fellowshipActivityService.listPage(pageForm.getPageNumber(), pageForm.getPageSize(), cnd);
List<FellowshipActivity> fellowshipActivities = pagination.getList();
Map<String, String> fellowshipTypeMap = dictService.getSubListByCode("FELLOWSHIP_TYPE").stream().collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName));
fellowshipActivities.forEach(v -> v.setTrainType(fellowshipTypeMap.get(v.getTrainType())));
return Result.success(pagination);
}
@At
@ApiOperation("分活动查询")
@SaCheckPermission(value = {"fellowship.apply", "h5.fellowship.apply"}, mode = SaMode.OR)
public Result pageData(PageForm pageForm,
@Param(value = "courseTypeId") String courseTypeId,
@Param(value = "activityId") String activityId,
@Param(value = "assortTypes") String[] assortTypes,
@Param(value = "dataType") String dataType) {
Sql sql = Sqls.create("""
SELECT
tsuc.id,
tsuc.activityId,
tsuc.courseName,
tsuc.coursePeopleNumber,
tsuc.courseLocation,
tsuc.courseType,
tsuc.courseLocationCoordinates,
tsuc.courseReservedNumber,
tsuc.courseInstructor,
tsuc.campus,
tsuc.unionLimit,
tsuc.isMobileSign,
tsuc.signType,
tsuc.isReceiveGift,
tsuc.giftType,
tsuc.reserveMode,
tsuc.waitingNum,
tsuc.assort,
tsuc.introduce,
type.typeName,
tsuc.courseIsLimitApply
FROM
`fellowship_course` tsuc
LEFT JOIN fellowship_type type ON type.id = tsuc.courseType
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("type.id", "=", courseTypeId);
cnd.and("tsuc.activityId", "=", activityId);
if (Lang.isNotEmpty(assortTypes)) {
cnd.and("tsuc.assort", "in", assortTypes);
}
if("mine".equals(dataType)) {
cnd.and(new Static("tsuc.id in (select courseId from fellowship_user where userId = '%s')".formatted(SecurityUtil.getUserId())));
}
List<FellowshipCourse> courseArray = fellowshipActivityService.dao().query(FellowshipCourse.class, Cnd.where("activityId", "=", activityId));
courseArray = fellowshipActivityService.filterCourseByHostUnion(courseArray);
cnd.and("tsuc.id", "in", courseArray.stream().map(FellowshipCourse::getId).toList());
cnd.asc("tsuc.orderNum");
cnd.asc("type.code");
sql.setCondition(cnd);
Pagination pagination = fellowshipActivityService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
List<NutMap> courseList = pagination.getList();
courseList.forEach(c -> {
List<FellowshipActivityCourse> courseTimes = dao.query(FellowshipActivityCourse.class, Cnd.where("courseId", "=", c.getString("id")).asc("courseDate"));
c.put("courseTimes", courseTimes);
c.put("hasRegisterNum", statisticsService.queryCourseCount(c.getString("id"), c.getString("courseType")));
c.put("hasWaitingNum", statisticsService.queryCourseWaitCount(c.getString("id"), c.getString("courseType")));
//当前用户是否报过
c.put("isSign", fellowshipActivityService.isSignCourseByUser(c.getString("id"), SecurityUtil.getUserId()));
if (StrUtil.isNotBlank(c.getString("unionLimit"))) {
List<NutMap> unionLimit = Json.fromJsonAsList(NutMap.class, c.getString("unionLimit"));
if (Lang.isNotEmpty(unionLimit)) {
NutMap nutMap = unionLimit.stream().filter(o -> o.getString("id").equals(SecurityUtil.getUnionId())).findFirst().orElse(null);
if (nutMap != null) {
c.put("coursePeopleNumber", nutMap.getInt("limitCount"));
}
}
}
});
return Result.success(pagination);
}
@At
@ApiOperation("获取分活动时间")
@SaCheckPermission(value = {"fellowship.apply", "h5.fellowship.apply"}, mode = SaMode.OR)
public Result getCourseTime(String id) {
List<FellowshipActivityCourse> list = fellowshipActivityService.dao().query(FellowshipActivityCourse.class, Cnd.where("courseId", "=", id));
return Result.success(list);
}
@At
@ApiOperation("查询分类标识集合")
@SaCheckPermission(value = {"fellowship.apply", "h5.fellowship.apply"}, mode = SaMode.OR)
public Result queryCourseAssort(String activityId) {
List<FellowshipCourse> courseList = fellowshipActivityService.dao().query(FellowshipCourse.class, Cnd.where(FellowshipCourse::getActivityId, "=", activityId).asc(FellowshipCourse::getOrderNum));
if (Lang.isEmpty(courseList)) {
return Result.success(new ArrayList<>());
}
List<String> assortList = courseList.stream().map(FellowshipCourse::getAssort).filter(StrUtil::isNotBlank).distinct().toList();
return Result.success(assortList);
}
@At
@ApiOperation("验证是否能报名")
@SaCheckPermission(value = {"fellowship.apply", "h5.fellowship.apply"}, mode = SaMode.OR)
public Result validateSignUp(String courseId,
@Param(value = "currentFamilyNumber") Integer currentFamilyNumber) {
try {
lock.lock();
if (StrUtil.isBlank(courseId)) {
return Result.error("报名信息为空");
}
currentFamilyNumber = currentFamilyNumber != null ? currentFamilyNumber : 0;
FellowshipCourse course = dao.fetch(FellowshipCourse.class, courseId);
FellowshipActivity activity = dao.fetch(FellowshipActivity.class, course.getActivityId());
//判断时间
if (DateUtil.compare(new Date(), activity.getActivitySignUpStartTime(), "yyyy-MM-dd HH:mm:ss") < 0) {
return Result.error("报名未开始");
}
if (DateUtil.compare(new Date(), activity.getActivitySignUpEndTime(), "yyyy-MM-dd HH:mm:ss") > 0) {
return Result.error("报名已结束");
}
//判断活动组别
int count = dao.count(ActivityUserScope.class, Cnd.where("groupId", "=", activity.getActivityGroupId()).and("userId", "=", SecurityUtil.getUserId()));
if (count == 0) {
return Result.error("抱歉,您没有此次活动的权限");
}
//判断是否报名
boolean courseByUser = fellowshipActivityService.isSignCourseByUser(courseId, SecurityUtil.getUserId());
if (courseByUser) {
return Result.error("抱歉,您已经报名");
}
//判断活动人数
boolean signFull = fellowshipActivityService.isSignFull(course, currentFamilyNumber);
if (signFull) {
return Result.error("名额剩余数量不足");
}
//判断活动限制
boolean signCourse = fellowshipActivityService.isSignCourse(course, activity);
if (!signCourse) {
if (activity.getRestrictLimit() != 3) {
return Result.error("您选择的类型已达上限,不能再报该类型的了");
} else {
return Result.error(activity.getActivityName() + "限制报" + activity.getLimitNum() + "个活动,已达上限");
}
}
//判断分工会人数限制
boolean signFullByUnionId = fellowshipActivityService.isSignFullByUnionId(course, currentFamilyNumber);
if (signFullByUnionId) {
return Result.error("您所在的分工会名额不足");
}
return Result.success();
} catch (Exception e) {
e.printStackTrace();
return Result.error("报名失败");
} finally {
lock.unlock();
}
}
@At
@ApiOperation("查询子活动时间段")
@SaCheckPermission(value = {"fellowship.apply", "h5.fellowship.apply"}, mode = SaMode.OR)
public Result getCourseTimeSelectList(String courseId) {
// 查课程的时间段
List<FellowshipActivityCourse> courseList = dao.query(FellowshipActivityCourse.class, Cnd.where("courseId", "=", courseId).asc("courseStartTime"));
// 查课程的报名人数
List<FellowshipUserCourse> applyUserList = dao.query(FellowshipUserCourse.class, Cnd.where("courseId", "=", courseId));
List<FellowshipUser> userList = dao.query(FellowshipUser.class, Cnd.where("courseId", "=", courseId).and("state", "=", 1));
List<String> idList = userList.stream().map(FellowshipUser::getUserId).toList();
applyUserList = applyUserList.stream().filter(o -> idList.contains(o.getUserId())).toList();
// 按照课程下面时间段去分组
Map<String, List<FellowshipUserCourse>> collectMap = applyUserList.stream().collect(Collectors.groupingBy(FellowshipUserCourse::getActivityCourseId));
List<NutMap> list = courseList.stream().map(v -> {
String id = v.getId();
NutMap nutMap = NutMap.NEW();
List<FellowshipUserCourse> fellowshipUserCourses = collectMap.get(id);
int remainingNum = v.getCourseLimitNum() != null ? v.getCourseLimitNum() : 0;
if (Lang.isNotEmpty(fellowshipUserCourses)) {
remainingNum = v.getCourseLimitNum() - fellowshipUserCourses.size();
}
nutMap.put("remainingNum", remainingNum);
nutMap.put("text", DateUtil.format(v.getCourseStartTime(), "MM月dd日 HH:mm") + "" + DateUtil.format(v.getCourseEndTime(), "HH:mm") + "段(剩" + remainingNum + ")");
nutMap.put("value", id);
nutMap.put("disabled", remainingNum == 0);
return nutMap;
}).toList();
return Result.success(list);
}
@At
@ApiOperation("验证子活动是否能报名")
@SaCheckPermission(value = {"fellowship.apply", "h5.fellowship.apply"}, mode = SaMode.OR)
public Result validateSourceSignUp(String activityCourseId, String courseId) {
try {
lock.lock();
List<FellowshipUser> userList = dao.query(FellowshipUser.class, Cnd.where("courseId", "=", courseId).and("state", "=", 1));
List<String> isList = userList.stream().map(FellowshipUser::getUserId).toList();
// 该时间段下已报名的人数
int count = dao.count(FellowshipUserCourse.class, Cnd.where("activityCourseId", "=", activityCourseId)
.and("courseId", "=", courseId).and("userId", "in", isList));
// 获取该时间段下的活动课程限制报名人数
FellowshipActivityCourse course = dao.fetch(FellowshipActivityCourse.class, activityCourseId);
Integer courseLimitNum = course.getCourseLimitNum();
// 报名加上自己,如果大于了限制人数,那就无法报名
if (count + 1 > courseLimitNum) {
return Result.error("该时间段名额已报满,请选择其他时段报名");
} else {
return Result.success();
}
} catch (Exception e) {
e.printStackTrace();
return Result.error("报名失败");
} finally {
lock.unlock();
}
}
@At
@ApiOperation("活动报名")
@SaCheckPermission(value = {"fellowship.apply", "h5.fellowship.apply"}, mode = SaMode.OR)
@SLog(tag = "交友联谊-活动报名", msg = "活动报名")
public Result doSignUp(FellowshipUser fellowshipUser) {
try {
lock.lock();
boolean courseByUser = fellowshipActivityService.isSignCourseByUser(fellowshipUser.getCourseId(), SecurityUtil.getUserId());
if (courseByUser) {
return Result.error("您已报过该活动");
}
//判断人数
int number = 0;
FellowshipCourse course = fellowshipActivityService.dao().fetch(FellowshipCourse.class, fellowshipUser.getCourseId());
FellowshipType type = fellowshipActivityService.dao().fetch(FellowshipType.class, course.getCourseType());
if (type != null) {
if (type.getIsBringFamily() && type.getIsAddFamily()) {
List<NutMap> mobileColumnsValue = fellowshipUser.getMobileColumnsValue();
NutMap map = mobileColumnsValue.stream().filter(o -> "xdqsrs".equals(o.getString("columnCode"))).findAny().orElse(null);
number = map != null ? map.getInt("columnValue") : 0;
}
}
boolean signFull = fellowshipActivityService.isSignFull(course, number);
if (signFull) {
return Result.error("当前报名人数已满");
}
boolean signFullByUnionId = fellowshipActivityService.isSignFullByUnionId(course, number);
if (signFullByUnionId) {
return Result.error("该活动您所在的分工会名额不足");
}
fellowshipActivityService.doSignUp(fellowshipUser);
return Result.success("报名成功");
} catch (Exception e) {
e.printStackTrace();
return Result.success("报名失败");
} finally {
lock.unlock();
}
}
@At
@ApiOperation("取消报名")
@SaCheckPermission(value = {"fellowship.apply", "h5.fellowship.apply"}, mode = SaMode.OR)
@SLog(tag = "交友联谊-活动报名", msg = "取消报名")
public Result cancelSignUp(@Param("activityId") String activityId, @Param("courseId") String courseId) {
String userId = SecurityUtil.getUserId();
//取消分两种情况
//第一种没有设置分工会人数限制,那么将候补的人按时间倒叙往上补
//第二种如果设置了分工会人数限制,那么只将本分工会的候补人员按照时间倒叙往上补,如果本分工会没有候补人员,则名额空出来,由校工会手动调整
FellowshipCourse course = dao.fetch(FellowshipCourse.class, courseId);
FellowshipType type = dao.fetch(FellowshipType.class, course.getCourseType());
//如果是正常报名取消了,将候补报名的按时间倒叙第一个改为正常报名
Cnd cnd = Cnd.where("activityId", "=", activityId).and("courseId", "=", courseId)
.and("state", "=", 2);
//如果设置了分工会报名人数限制,则只查本分工会
if (Lang.isNotEmpty(course.getUnionLimit())) {
cnd.and(new Static(" userId in (select id from user where unionid = '%s')".formatted(SecurityUtil.getUnionId())));
}
cnd.asc("signUpTime");
if (!type.getIsBringFamily() && course.getReserveMode() == 2) {
List<FellowshipUser> signUpUsers = dao.query(FellowshipUser.class, cnd);
int thisSignUpUserCount = dao.count(FellowshipUser.class,
Cnd.where("activityId", "=", activityId)
.and("courseId", "=", courseId).and("userId", "=", userId)
.and("state", "in", List.of(1, 3)));
if (!signUpUsers.isEmpty() && thisSignUpUserCount > 0) {
FellowshipUser fellowshipUser = signUpUsers.get(0);
fellowshipUser.setState(1);
dao.update(fellowshipUser);
Sys_user user = dao.fetch(Sys_user.class, fellowshipUser.getUserId());
//msgApi.sendTextMsg("【" + activity.getActivityName() + "】已候补成功,请按时参加活动!", user.getLoginname());
}
}
//删除报名记录
dao.clear("fellowship_user_course", Cnd.where("activityId", "=", activityId)
.and("courseId", "=", courseId).and("userId", "=", userId));
dao.clear("fellowship_user", Cnd.where("activityId", "=", activityId)
.and("courseId", "=", courseId).and("userId", "=", userId));
return Result.success();
}
}
@@ -0,0 +1,200 @@
package com.budwk.app.zhgh.activity.fellowship.controller.manage;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.zhgh.activity.fellowship.models.*;
import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import org.nutz.trans.Trans;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author zxy
* @Description 培训报名 活动管理
* @createTime 2022年02月23日 09:57:00
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "活动管理")
@At("/platform/fellowship/manage")
public class FellowshipManageController {
@Inject
private FellowshipActivityService fellowshipActivityManageService;
@Inject
private Dao dao;
@At("")
@SaCheckPermission("fellowship.manage")
@Ok("beetl:/platform/zhgh/activity/fellowship/manage/index.html")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("fellowship.manage")
public Result pageData(PageForm pageForm,
@Param(value = "year") Integer year,
@Param(value = "activityName") String activityName) {
Cnd cnd = Cnd.NEW();
cnd.andEX("year", "=", year);
cnd.and(Cnd.likeEX("activityName", activityName));
cnd.orderBy("createdAt", "desc");
return Result.success().addData(fellowshipActivityManageService.pageData(pageForm, cnd));
}
@At
@ApiOperation("活动删除")
@SaCheckPermission("fellowship.manage")
@SLog(tag = "交友联谊-活动管理", msg = "删除活动")
public Result onDelete(String id) {
Trans.exec(() -> {
fellowshipActivityManageService.delete(id);
dao.clear(FellowshipCourse.class, Cnd.where("activityId", "=", id));
dao.clear(FellowshipActivityCourse.class, Cnd.where("activityId", "=", id));
dao.clear(FellowshipUser.class, Cnd.where("activityId", "=", id));
dao.clear(FellowshipUserCourse.class, Cnd.where("activityId", "=", id));
dao.clear(FellowshipActivity.class, Cnd.where("id", "=", id));
dao.clear(FellowshipTypeLimit.class, Cnd.where("activityId", "=", id));
dao.delete(Sys_home_activity.class, id);
});
return Result.success();
}
@At
@ApiOperation("活动状态变更")
@SaCheckPermission("fellowship.manage")
public Result activityStatusChange(FellowshipActivity activity) {
fellowshipActivityManageService.updateActivityStatus(activity);
dao.update(Sys_home_activity.class,
Chain.make("enable", !activity.isDisabled()),
Cnd.where("id", "=", activity.getId()));
return Result.success();
}
@At
@ApiOperation("查询单个活动")
@SaCheckPermission("fellowship")
public Result findOne(@Param("id") @NotNull String id) {
NutMap dataMap = fellowshipActivityManageService.findOne(id, null, "");
String activityStartTime = dataMap.getString("activityStartTime");
String activityEndTime = dataMap.getString("activityEndTime");
if(StrUtil.isNotBlank(activityStartTime) && StrUtil.isNotBlank(activityEndTime)) {
dataMap.put("activityTime", List.of(activityStartTime, activityEndTime));
} else {
dataMap.put("activityTime", new ArrayList<>());
}
String activitySignUpStartTime = dataMap.getString("activitySignUpStartTime");
String activitySignUpEndTime = dataMap.getString("activitySignUpEndTime");
if(StrUtil.isNotBlank(activitySignUpStartTime) && StrUtil.isNotBlank(activitySignUpEndTime)) {
dataMap.put("activitySignTime", List.of(activitySignUpStartTime, activitySignUpEndTime));
} else {
dataMap.put("activitySignTime", new ArrayList<>());
}
List<NutMap> courseList = dataMap.getList("courseList", NutMap.class);
//查询所有的课程类型
List<FellowshipType> fellowshipTypeList = dao.query(FellowshipType.class, Cnd.NEW());
Map<String, String> typeMap = fellowshipTypeList.stream().collect(Collectors.toMap(FellowshipType::getId, FellowshipType::getTypeName));
courseList.forEach(v -> {
List<NutMap> courseTimeList = v.getList("courseTimeList", NutMap.class);
//选择课程日期 下拉框
List<String> setUpCourseData = courseTimeList.stream().map(cd -> cd.getString("courseDate")).distinct().collect(Collectors.toList());
v.put("setUpCourseData", setUpCourseData);
courseTimeList.forEach(ct -> {
String courseStartTime = DateUtil.format(ct.getTime("courseStartTime"), "HH:mm");
String courseEndTime = DateUtil.format(ct.getTime("courseEndTime"), "HH:mm");
ct.put("courseStartTime", courseStartTime);
ct.put("courseEndTime", courseEndTime);
});
v.put("courseTypeName", typeMap.get(v.getString("courseType")));
});
return Result.success().addData(dataMap);
}
@At
@Ok("json:full")
@ApiOperation("交友联谊新增/修改")
@SaCheckPermission("fellowship.manage")
@SLog(tag = "交友联谊-活动管理", msg = "新增/修改活动")
public Result doHandle(FellowshipActivity activity) {
if (StrUtil.isBlank(activity.getId())) {
fellowshipActivityManageService.add(activity, null);
} else {
fellowshipActivityManageService.edit(activity);
}
return Result.success();
}
@At
@Ok("json:full")
@ApiOperation("获取分工会人数限制")
@SaCheckPermission("fellowship.manage")
public Result getUnionLimit(@Param(value = "activityScopeId") String activityScopeId) {
Sql sql = Sqls.create("""
SELECT
gh.id,
gh.name,
gh.unioncode,
(select count(1) from `vw_user` where unionid = gh.id $cnd) as teacherCount,
NULL as ratio,
NULL as limitCount
FROM
sys_union gh
order by gh.unioncode
""");
if (StrUtil.isNotBlank(activityScopeId)) {
sql.setVar("cnd", "AND id in (select userId from activity_user_scope where groupId = '" + activityScopeId + "')");
}
List<NutMap> list = fellowshipActivityManageService.listMap(sql);
return Result.success().addData(list);
}
@At
@Ok("json:full")
@ApiOperation("获取报名人员数量")
@SaCheckPermission("fellowship.manage")
public Result getRegisterUserCount(@Param(value = "courseId") String courseId) {
return Result.success().addData(dao.count(FellowshipUser.class, Cnd.where("courseId", "=", courseId)));
}
@At
@Ok("json:full")
@ApiOperation("获取历史活动列表")
@SaCheckPermission("fellowship.manage")
public Result getHistoricalActList() {
List<FellowshipActivity> query = dao.query(FellowshipActivity.class, Cnd.NEW().desc("activityStartTime"));
return Result.success().addData(query);
}
}
@@ -0,0 +1,163 @@
package com.budwk.app.zhgh.activity.fellowship.controller.manage;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.result.Result;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipUserCourse;
import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.Date;
import java.util.List;
/**
* @ClassName fellowshipMineController
* @Author JyuHsin
* @Date 2025/9/13 16:56
* @Version 1.0
* @Description TODO
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "活动报名")
@At("/platform/fellowship/mine")
public class FellowshipMineController {
@Inject
private Dao dao;
@Inject
private FellowshipActivityService activityService;
@At("/")
@SaCheckPermission("fellowship.mine")
@Ok("beetl:/platform/zhgh/activity/fellowship/mine/index.html")
public void index() {
}
@At("/h5")
@SaCheckPermission("h5.fellowship.mine")
@Ok("beetl:/platform/zhghh5/activity/fellowship/mine/index.html")
public void h5Index() {
}
@At
@ApiOperation("主动扫码签到")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"fellowship.mine", "h5.fellowship.mine"}, mode = SaMode.OR)
@SLog(tag = "交友联谊-活动签到", msg = "主动扫码签到")
public Result drivingScan(String courseId) {
// 主动扫码签到是用户自己打开扫一扫,扫二维码签到
int count = dao.count(FellowshipUserCourse.class, Cnd.where("courseId", "=", courseId).and("userId", "=", SecurityUtil.getUserId()));
if (count == 0) {
return Result.error(99, "未查询到您的报名记录");
}
// 获取现在的日期,并往后推1个小时
String oneHourLater = DateUtil.offsetHour(new Date(), 1).toString("yyyy-MM-dd HH:mm:ss");
FellowshipUserCourse userCourse = dao.fetch(
FellowshipUserCourse.class,
Cnd.where("courseId", "=", courseId)
.and("userId", "=", SecurityUtil.getUserId())
.and("courseStartTime", "<=", oneHourLater)
.and("courseEndTime", ">=", oneHourLater)
);
if (userCourse == null) {
return Result.error(99, "未到签到时间");
}
userCourse.setAttend(true);
userCourse.setAttendTime(DateUtil.date());
dao.update(userCourse);
return Result.success();
}
@At
@ApiOperation("被动扫码签到")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"fellowship.mine", "h5.fellowship.mine"}, mode = SaMode.OR)
@SLog(tag = "交友联谊-活动签到", msg = "被动扫码签到")
public Result passiveScan(String id) {
// id表示课程的某个时间段,userId表示是谁出示的二维码
FellowshipUserCourse userCourse = dao.fetch(FellowshipUserCourse.class, id);
if (userCourse == null) {
return Result.error("未查询到报名记录");
}
int isAfter = DateUtil.compare(new Date(), userCourse.getCourseStartTime());
if (isAfter > 0) {
return Result.error("抱歉,已经开始,无法签到");
}
long diffMillis = Math.abs(DateUtil.between(new Date(), userCourse.getCourseStartTime(), DateUnit.MS));
long oneHourInMs = 3600 * 1000;
if (diffMillis > oneHourInMs) {
return Result.error("签到时间为开始前1个小时");
}
userCourse.setAttend(true);
userCourse.setAttendTime(DateUtil.date());
dao.update(userCourse);
return Result.success();
}
@At
@ApiOperation("分活动查询")
@SaCheckPermission(value = {"fellowship.mine", "h5.fellowship.mine"}, mode = SaMode.OR)
public Result queryCourseSign(String courseId) {
Sql sql = Sqls.create("""
SELECT
uc.*,
date(uc.courseStartTime) as courseDate
FROM
`fellowship_user_course` uc
WHERE
courseId = @courseId and userId = @userId
""");
sql.setParam("userId", SecurityUtil.getUserId());
sql.setParam("courseId", courseId);
List<NutMap> listMap = activityService.listMap(sql);
return Result.success(listMap);
}
@At
@ApiOperation("获取我报名的课程")
@SaCheckPermission(value = {"fellowship.mine", "h5.fellowship.mine"}, mode = SaMode.OR)
public Result queryMineCourse(String activityId) {
Sql sql = Sqls.create("""
SELECT
c.*,
u.mobileColumnsValue
FROM
fellowship_user u
LEFT JOIN fellowship_course c ON c.id = u.courseId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("u.activityId", "=", activityId);
cnd.and("u.userId", "=", SecurityUtil.getUserId());
sql.setCondition(cnd);
List<NutMap> listMap = activityService.listMap(sql);
return Result.success(listMap);
}
}
@@ -0,0 +1,167 @@
package com.budwk.app.zhgh.activity.fellowship.controller.manage;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.EnumUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipMobileSignColumn;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.entity.annotation.ColType;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.List;
/**
* @Author JyuHsin
* @Date 2022/9/22
* @Description
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "活动类型管理")
@At("/platform/fellowship/type")
public class FellowshipTypeController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@At("")
@SaCheckPermission("fellowship.type")
@Ok("beetl:/platform/zhgh/activity/fellowship/type/index.html")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("fellowship.type")
public Result pageData(PageForm pageForm,
@Param(value = "typeName") String typeName) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
select * from fellowship_type $condition
""");
if (Strings.isNotBlank(typeName)) {
cnd.and("typeName", "like", "%" + typeName + "%");
}
if(Strings.isNotBlank(pageForm.getPageOrderName()) && Strings.isNotBlank(pageForm.getPageOrderBy())){
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
} else {
cnd.asc("xh");
}
sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
List<NutMap> list = pagination.getList();
list.forEach(item -> {
Cnd c = Cnd.NEW();
c.and("typeId", "=", item.getString("id"));
c.asc("columnIndex");
List<FellowshipMobileSignColumn> signColumns = dao.query(FellowshipMobileSignColumn.class, c);
item.put("mobileSignColumnList", signColumns);
});
return Result.success().addData(pagination);
}
@At
@ApiOperation("活动类型新增")
@SaCheckPermission("fellowship.type")
@SLog(tag = "交友联谊-类型管理", msg = "活动类型新增")
public Result doAdd(@Param("data") String data) throws Exception {
FellowshipType type = Json.fromJson(FellowshipType.class, data);
int count = dao.count(FellowshipType.class, Cnd.where("code", "=", type.getCode()));
if (count > 0) {
return Result.error("编码重复!");
}
int totalCount = dao.count(FellowshipType.class);
type.setXh(totalCount + 1);
dao.insertWith(type, "mobileSignColumnList");
return Result.success();
}
@At
@ApiOperation("活动类型修改")
@SaCheckPermission("fellowship.type")
@SLog(tag = "交友联谊-类型管理", msg = "活动类型修改")
public Result doEdit(FellowshipType type) {
int count = dao.count(FellowshipType.class, Cnd.where("code", "=", type.getCode()).and("id", "!=", type.getId()));
if (count > 0) {
return Result.error("编码重复!");
}
dao.update(type);
dao.clear(FellowshipMobileSignColumn.class, Cnd.where("typeId", "=", type.getId()));
dao.insertLinks(type, "mobileSignColumnList");
return Result.success();
}
@At
@ApiOperation("活动类型删除")
@SaCheckPermission("fellowship.type")
@SLog(tag = "交友联谊-类型管理", msg = "活动类型删除")
public Object doDelete(@Param(value = "id") String id) {
dao.clear(FellowshipType.class, Cnd.where("id", "=", id));
dao.clear(FellowshipMobileSignColumn.class, Cnd.where("typeId", "=", id));
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("排序号变更")
@SaCheckPermission("fellowship.type")
public Object xhChange(String id, Integer xh, boolean toDown) {
if (toDown) {
FellowshipType next = dao.fetch(FellowshipType.class, Cnd.where("xh", "=", xh + 1));
next.setXh(next.getXh() - 1);
dao.update(next);
dao.update(FellowshipType.class, Chain.make("xh", xh + 1), Cnd.where("id", "=", id));
} else {
FellowshipType pre = dao.fetch(FellowshipType.class, Cnd.where("xh", "=", xh - 1));
pre.setXh(pre.getXh() + 1);
dao.update(pre);
dao.update(FellowshipType.class, Chain.make("xh", xh - 1), Cnd.where("id", "=", id));
}
return Result.success();
}
@At
@ApiOperation("获取所有类型")
@SaCheckLogin
public Result getAllType(@Param(value = "id") String id) {
List<FellowshipType> fellowshipTypeList = dao.query(FellowshipType.class, Cnd.NEW().andEX("id", "=", id).asc("xh"));
dao.fetchLinks(fellowshipTypeList, "mobileSignColumnList", Cnd.NEW().asc("columnIndex"));
return Result.success().addData(fellowshipTypeList);
}
@At
@ApiOperation("自定义表单字段类型")
@SaCheckPermission("fellowship.type")
public Result getColumnType() {
List<String> names = EnumUtil.getNames(ColType.class);
names.add("JSON");
return Result.success(names);
}
}
@@ -0,0 +1,350 @@
package com.budwk.app.zhgh.activity.fellowship.controller.manage;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.afterturn.easypoi.excel.export.ExcelExportService;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipActivity;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipCourse;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipUser;
import com.budwk.app.zhgh.activity.fellowship.service.FellowshipBlackListService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author zxy
* @Description 人员管理
* @createTime 2022年03月07日 14:27:00
*/
@IocBean
@Ok("json:full")
@Api(tags = "交友联谊人员黑名单")
@At("/platform/fellowship/userManage")
public class FellowshipUserManageController {
@Inject
private Dao dao;
@Inject
private FellowshipBlackListService fellowshipBlackListService;
@At("")
@SaCheckPermission("fellowship.userManage")
@Ok("beetl:/platform/zhgh/activity/fellowship/userManage/index.html")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("fellowship.userManage")
public Result pageData(PageForm pageForm,
@Param(value = "activityId") String activityId,
@Param(value = "courseId") String courseId,
@Param(value = "year") Integer year,
@Param(value = "userKeyWord") String userKeyWord) {
Cnd cnd = Cnd.NEW();
cnd.andEX("tsuu.activityId", "=", activityId);
cnd.andEX("tsuu.courseId", "=", courseId);
cnd.andEX("act.year", "=", year);
if (StrUtil.isNotBlank(userKeyWord)) {
SqlExpressionGroup seg = new SqlExpressionGroup();
cnd.and(seg.andLike("u.username", userKeyWord).orLike("u.loginname", userKeyWord));
}
if(Strings.isNotBlank(pageForm.getPageOrderName()) && Strings.isNotBlank(pageForm.getPageOrderBy())){
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
Pagination pagination = fellowshipBlackListService.pageData(pageForm, cnd, activityId, courseId);
return Result.success(pagination);
}
@At
@ApiOperation("报名人员处理")
@SaCheckPermission("fellowship.userManage")
@SLog(tag = "交友联谊-人员管理", msg = "报名人员处理")
public Result doHandleUser(@Param("userId") String userId) {
fellowshipBlackListService.doHandleUser(userId);
return Result.success();
}
@At
@ApiOperation("根据活动Id获取子活动")
@SaCheckPermission("fellowship.userManage")
public Result getCourseByActivityId(@Param("activityId") String activityId) {
List<FellowshipCourse> list = dao.query(FellowshipCourse.class, Cnd.where("activityId", "=", activityId));
return Result.success(list);
}
@At
@ApiOperation("获取子活动具体时间")
@SaCheckPermission("fellowship.userManage")
public Result attendClassRecord(String userId) {
fellowshipBlackListService.attendClassRecord(userId);
return Result.success();
}
@At
@ApiOperation("获取候补人员")
@SaCheckPermission("fellowship.userManage")
public Result getReserveUser(String courseId) {
Sql sql = Sqls.create("""
SELECT
uc.* ,
(select signUpTime from fellowship_user su where su.activityId=uc.activityId and su.courseId = uc.courseId and su.userId=uc.userId) as signUpTime,
(select state from fellowship_user su where su.activityId=uc.activityId and su.courseId = uc.courseId and su.userId=uc.userId) as state,
u.username,
u.loginname,
u.mobile,
u.unitName,
u.unionName
FROM
fellowship_user_course uc LEFT JOIN `vw_user` u on uc.userId = u.id
WHERE uc.courseId = @courseId and uc.isAttend = false HAVING state = 2 order by signUpTime desc
""").setParam("courseId", courseId);
return Result.success(fellowshipBlackListService.listMap(sql));
}
@At
@ApiOperation("补充人员")
@SaCheckPermission("fellowship.userManage")
@SLog(tag = "交友联谊-人员管理", msg = "补充人员")
public Result reserveSingUp(String[] ids, String courseId) {
//先查询这个课程有多少个未签到的人员
Sql sql = Sqls.create("""
SELECT
uc.* ,
(select signUpTime from fellowship_user su where su.activityId=uc.activityId and su.courseId = uc.courseId and su.userId=uc.userId) as signUpTime,
(select state from fellowship_user su where su.activityId=uc.activityId and su.courseId = uc.courseId and su.userId=uc.userId) as state
FROM
fellowship_user_course uc
WHERE uc.courseId = @courseId and uc.isAttend = false HAVING state = 1 order by signUpTime desc
""").setParam("courseId", courseId);
List<NutMap> list = fellowshipBlackListService.listMap(sql);
if(ids.length > list.size()) {
return Result.error("您选择了" + ids.length + "位,未签到人员只有" + list.size() + "");
}
//ids的长度为几,就搞几个
List<NutMap> mapList = list.subList(0, ids.length);
List<String> idList = mapList.stream().map(o -> o.getString("userId")).collect(Collectors.toList());
//将这几个没签到的设置为4
dao.update(FellowshipUser.class, Chain.make("state", 4), Cnd.where("courseId", "=", courseId)
.and("userId", "in", idList));
//将补充的设置为1
dao.update(FellowshipUser.class, Chain.make("state", 1), Cnd.where("courseId", "=", courseId)
.and("userId", "in", ids));
return Result.success();
}
@At
@Ok("void")
@ApiOperation("导出签到人员")
public void exportSignPerson(@Param(value = "activityId") String activityId,
HttpServletResponse response) {
FellowshipActivity activity = dao.fetch(FellowshipActivity.class, activityId);
Sql sql = Sqls.create("""
SELECT
uc.*,
DATE_FORMAT(uc.courseStartTime, '%Y-%m-%d %H:%i:%s') as courseStartTimeExcel,
DATE_FORMAT(uc.courseEndTime, '%Y-%m-%d %H:%i:%s') as courseEndTimeExcel,
DATE_FORMAT(uc.attendTime, '%Y-%m-%d %H:%i:%s') as attendTimeExcel,
u.username,
u.loginname,
u.unitName,
u.unionName,
u.sex
FROM
fellowship_user_course uc
left join fellowship_course course on uc.courseId = course.id
left join `vw_user` u on u.id = uc.userId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("uc.activityId", "=", activityId);
cnd.and("course.isMobileSign", "=", true);
cnd.desc("isAttend").desc("attendTime");
sql.setCondition(cnd);
List<NutMap> userList = fellowshipBlackListService.listMap(sql);
List<FellowshipCourse> courseList = dao.query(FellowshipCourse.class, Cnd.where("activityId", "=", activityId));
List<Map<String, Object>> sheetsList = new ArrayList<>();
List<ExcelExportEntity> excelCommonExportEntity = new ArrayList<>();
excelCommonExportEntity.add(new ExcelExportEntity("姓名", "username", 20));
excelCommonExportEntity.add(new ExcelExportEntity("工号", "loginname", 20));
excelCommonExportEntity.add(new ExcelExportEntity("单位", "unitName", 20));
excelCommonExportEntity.add(new ExcelExportEntity("分工会", "unionName", 20));
excelCommonExportEntity.add(new ExcelExportEntity("性别", "sex", 20));
excelCommonExportEntity.add(new ExcelExportEntity("开始时间", "courseStartTimeExcel", 22));
excelCommonExportEntity.add(new ExcelExportEntity("结束时间", "courseEndTimeExcel", 22));
excelCommonExportEntity.add(new ExcelExportEntity("是否签到", "isAttend", 20));
excelCommonExportEntity.add(new ExcelExportEntity("签到时间", "attendTimeExcel", 22));
for (FellowshipCourse c : courseList) {
if(!c.isMobileSign()) {
continue;
}
String courseId = c.getId();
String courseName = c.getCourseName();
List<NutMap> v = userList.stream().filter(x -> x.getString("courseId").equals(courseId)).collect(Collectors.toList());
ExportParams userExportParams = new ExportParams();
userExportParams.setSheetName(courseName);
List<ExcelExportEntity> currentEntities = new ArrayList<>(excelCommonExportEntity);
for (NutMap userSignData : v) {
if(!userSignData.getBoolean("isAttend")) {
userSignData.put("isAttend", "未签到");
userSignData.put("attendTimeExcel", "未签到");
}else {
userSignData.put("isAttend", "已签到");
}
}
Map<String, Object> userExportMap = new HashMap<>();
userExportMap.put("name", courseName);
userExportMap.put("title", userExportParams);
userExportMap.put("entity", currentEntities);
userExportMap.put("data", v);
sheetsList.add(userExportMap);
}
try {
String fileName = activity.getActivityName() + "签到人员名单.xls";
String disposition = "attachment;filename=" + URLEncoder.encode(fileName, "utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", disposition);
Workbook workbook = new HSSFWorkbook();
for (Map<String, Object> map : sheetsList) {
ExcelExportService service = new ExcelExportService();
service.createSheetForMap(workbook,(ExportParams) map.get("title"),(List<ExcelExportEntity>) map.get("entity"),(Collection<?>) map.get("data"));
}
workbook.write(response.getOutputStream());
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@At
@Ok("void")
@ApiOperation("导出领取人员")
public void exportGiftPerson(@Param(value = "activityId") String activityId,
HttpServletResponse response) {
FellowshipActivity activity = dao.fetch(FellowshipActivity.class, activityId);
Sql sql = Sqls.create("""
SELECT
uc.*,
DATE_FORMAT(uc.courseStartTime, '%Y-%m-%d %H:%i:%s') as courseStartTimeExcel,
DATE_FORMAT(uc.courseEndTime, '%Y-%m-%d %H:%i:%s') as courseEndTimeExcel,
DATE_FORMAT(uc.receiveTime, '%Y-%m-%d %H:%i:%s') as receiveTimeExcel,
u.username,
u.loginname,
u.unitName,
u.unionName,
u.sex
FROM
fellowship_user_course uc
left join fellowship_course course on uc.courseId = course.id
left join `vw_user` u on u.id = uc.userId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("uc.activityId", "=", activityId);
cnd.and("course.isReceiveGift", "=", true).and("course.giftType" ,"=", 1);
cnd.desc("isReceive").desc("receiveTime");
sql.setCondition(cnd);
List<NutMap> userList = fellowshipBlackListService.listMap(sql);
List<FellowshipCourse> courseList = dao.query(FellowshipCourse.class, Cnd.where("activityId", "=", activityId));
List<Map<String, Object>> sheetsList = new ArrayList<>();
List<ExcelExportEntity> excelCommonExportEntity = new ArrayList<>();
excelCommonExportEntity.add(new ExcelExportEntity("姓名", "username", 20));
excelCommonExportEntity.add(new ExcelExportEntity("工号", "loginname", 20));
excelCommonExportEntity.add(new ExcelExportEntity("单位", "unitName", 20));
excelCommonExportEntity.add(new ExcelExportEntity("分工会", "unionName", 20));
excelCommonExportEntity.add(new ExcelExportEntity("性别", "sex", 20));
excelCommonExportEntity.add(new ExcelExportEntity("开始时间", "courseStartTimeExcel", 22));
excelCommonExportEntity.add(new ExcelExportEntity("结束时间", "courseEndTimeExcel", 22));
excelCommonExportEntity.add(new ExcelExportEntity("是否领取", "isReceive", 20));
excelCommonExportEntity.add(new ExcelExportEntity("领取时间", "receiveTimeExcel", 22));
for (FellowshipCourse c : courseList) {
String courseId = c.getId();
String courseName = c.getCourseName();
List<NutMap> v = userList.stream().filter(x -> x.getString("courseId").equals(courseId)).collect(Collectors.toList());
ExportParams userExportParams = new ExportParams();
userExportParams.setSheetName(courseName);
List<ExcelExportEntity> currentEntities = new ArrayList<>(excelCommonExportEntity);
for (NutMap userSignData : v) {
if(!userSignData.getBoolean("isReceive")) {
userSignData.put("isReceive", "未领取");
userSignData.put("receiveTimeExcel", "未领取");
}else {
userSignData.put("isReceive", "已领取");
}
}
Map<String, Object> userExportMap = new HashMap<>();
userExportMap.put("name", courseName);
userExportMap.put("title", userExportParams);
userExportMap.put("entity", currentEntities);
userExportMap.put("data", v);
sheetsList.add(userExportMap);
}
try {
String fileName = activity.getActivityName() + "礼品领取人员名单.xls";
String disposition = "attachment;filename=" + URLEncoder.encode(fileName, "utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", disposition);
Workbook workbook = new HSSFWorkbook();
for (Map<String, Object> map : sheetsList) {
ExcelExportService service = new ExcelExportService();
service.createSheetForMap(workbook,(ExportParams) map.get("title"),(List<ExcelExportEntity>) map.get("entity"),(Collection<?>) map.get("data"));
}
workbook.write(response.getOutputStream());
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,254 @@
package com.budwk.app.zhgh.activity.fellowship.controller.statistics;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.afterturn.easypoi.excel.export.ExcelExportService;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.sys.models.Sys_file;
import com.budwk.app.sys.utils.SysFileMinIoUtil;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipMobileSignColumn;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipActivity;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipCourse;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipType;
import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityService;
import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityStatisticsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
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 org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author zxy
* @Description 培训报名 统计
* @createTime 2022年02月23日 09:57:00
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "交友联谊统计")
@At("/platform/fellowship/statistics")
public class FellowshipActivityStatisticsController {
@Inject
private FellowshipActivityService fellowshipActivityManageService;
@Inject
private FellowshipActivityStatisticsService fellowshipActivityStatisticsService;
@Inject
private Dao dao;
@At("")
@SaCheckPermission("fellowship.statistics")
@Ok("beetl:/platform/zhgh/activity/fellowship/statistics/index.html")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("fellowship.statistics")
public Result pageData(PageForm pageForm,
@Param(value = "activityId") String activityId) {
Pagination pagination = fellowshipActivityStatisticsService.pageData(pageForm, activityId);
return Result.success(pagination);
}
/**
* 活动list
*
* @param year 年度
* @return
*/
@At
@ApiOperation("活动列表")
@SaCheckPermission("fellowship.statistics")
public Result activityList(@Param(value = "year") Integer year) {
List<FellowshipActivity> list = dao.query(FellowshipActivity.class, Cnd.NEW().andEX("year", "=", year).desc("activityStartTime"));
return Result.success(list);
}
/**
* 培训班报名人员list
*
* @param courseId
* @return
*/
@At
@ApiOperation("报名人员列表")
@SaCheckPermission("fellowship.statistics")
public Result registerUserList(@Param(value = "courseId") String courseId) {
return Result.success(fellowshipActivityStatisticsService.registerUserList(courseId));
}
@At
@ApiOperation("报名动态列")
@SaCheckPermission("fellowship.statistics")
public Object getTaleColumnInfo(@Param(value = "courseId") String courseId) {
return Result.success(fellowshipActivityStatisticsService.getTaleColumnInfo(courseId));
}
/**
* 培训班上课签到信息
*
* @param courseId
* @return
*/
@At
@ApiOperation("获取签到信息")
@SaCheckPermission("fellowship.statistics")
public Result getSignInfo(@Param("courseId") String courseId) {
return Result.success(fellowshipActivityStatisticsService.getSignInfo(courseId));
}
@At
@ApiOperation("开放报名")
@SaCheckPermission("fellowship.statistics")
public Result signChange(@Param("courseId") String courseId, @Param("openOtherUnion") Boolean openOtherUnion) {
dao.update(FellowshipCourse.class, Chain.make("openOtherUnion", openOtherUnion)
, Cnd.where("id", "=", courseId));
return Result.success();
}
@At
@Ok("void")
@ApiOperation("导出签到名单")
@SaCheckPermission("fellowship.statistics")
public void exportSignUser(@Param(value = "activityId") String activityId,
HttpServletResponse response) throws IOException {
try {
FellowshipActivity activity = dao.fetch(FellowshipActivity.class, activityId);
Sql sql = Sqls.create("""
SELECT
ts.*,
CONCAT(DATE_FORMAT(ac.courseStartTime, '%H:%i:%s'),'至',DATE_FORMAT(ac.courseEndTime, '%H:%i:%s')) AS courseTime,
u.username,
u.loginname,
u.sex,
ifnull(ts.mobile, u.mobile) as mobile,
u.birthday,
tsc.courseName
FROM
fellowship_user ts
left join fellowship_activity_course ac on ts.activityCourseId = ac.id
left join `vw_user` u on u.id = ts. userId
left join fellowship_course tsc on tsc.id = ts.courseId
WHERE
ts.activityId = @activityId
""").setParam("activityId", activityId);
List<NutMap> userList = fellowshipActivityManageService.listMap(sql);
List<FellowshipCourse> courseList = dao.query(FellowshipCourse.class, Cnd.where("activityId", "=", activityId));
List<FellowshipType> fellowshipTypeList = dao.query(FellowshipType.class, Cnd.NEW());
dao.fetchLinks(fellowshipTypeList, "mobileSignColumnList", Cnd.NEW().asc("columnIndex"));
Map<String, FellowshipType> typeMap = fellowshipTypeList.stream().collect(Collectors.toMap(FellowshipType::getId, o -> o));
List<Map<String, Object>> sheetsList = new ArrayList<>();
List<ExcelExportEntity> excelCommonExportEntity = new ArrayList<>();
excelCommonExportEntity.add(new ExcelExportEntity("姓名", "username", 20));
excelCommonExportEntity.add(new ExcelExportEntity("工号", "loginname", 20));
excelCommonExportEntity.add(new ExcelExportEntity("单位", "unitName", 20));
excelCommonExportEntity.add(new ExcelExportEntity("分工会", "unionName", 20));
excelCommonExportEntity.add(new ExcelExportEntity("性别", "sex", 20));
excelCommonExportEntity.add(new ExcelExportEntity("手机号", "mobile", 20));
excelCommonExportEntity.add(new ExcelExportEntity("生日", "birthday", 20));
excelCommonExportEntity.add(new ExcelExportEntity("报名时段", "courseTime", 20));
for (FellowshipCourse c : courseList) {
String k = c.getCourseName();
List<NutMap> v = userList.stream().filter(x -> x.getString("courseName").equals(k)).collect(Collectors.toList());
ExportParams userExportParams = new ExportParams();
userExportParams.setSheetName(k);
userExportParams.setType(ExcelType.HSSF);
List<ExcelExportEntity> currentEntities = new ArrayList<>();
currentEntities.addAll(excelCommonExportEntity);
FellowshipType signUpType = typeMap.get(c.getCourseType());
if (Lang.isNotEmpty(signUpType.getMobileSignColumnList())) {
for (FellowshipMobileSignColumn column : signUpType.getMobileSignColumnList()) {
ExcelExportEntity entity = new ExcelExportEntity();
entity.setName(column.getColumnName());
entity.setKey(column.getColumnCode());
entity.setWidth(20);
if (column.getColumnFormType().equals("FILE")) {
entity.setType(2);
entity.setExportImageType(2);
}
currentEntities.add(entity);
}
}
for (NutMap userSignData : v) {
String mobileColumnsValueStr = userSignData.getString("mobileColumnsValue");
if (StrUtil.isNotBlank(mobileColumnsValueStr)) {
List<NutMap> mobileColumnsValue = Json.fromJsonAsList(NutMap.class, mobileColumnsValueStr);
for (NutMap cv : mobileColumnsValue) {
if (!"FILE".equals(cv.getString("columnFormType"))) {
userSignData.put(cv.getString("columnCode"), cv.getString("columnValue"));
} else {
if (StrUtil.isNotBlank(cv.getString("columnValue"))) {
List<JSONObject> columnValue = Json.fromJsonAsList(JSONObject.class, cv.getString("columnValue"));
if (columnValue.size() == 1) {
JSONObject sysFile = columnValue.get(0);
Sys_file file = dao.fetch(Sys_file.class, Cnd.where(Sys_file::getDownloadPath, "=", sysFile.get("url")));
byte[] imageBytes = SysFileMinIoUtil.getFileBytes(file.getBucket(), file.getStoragePath());
if (imageBytes.length > 0) {
userSignData.put(cv.getString("columnCode"), imageBytes);
}
}
}
}
}
}
}
Map<String, Object> userExportMap = new HashMap<>();
userExportMap.put("name", k);
userExportMap.put("title", userExportParams);
userExportMap.put("entity", currentEntities);
userExportMap.put("data", v);
sheetsList.add(userExportMap);
}
Workbook workbook = new HSSFWorkbook();
for (Map<String, Object> map : sheetsList) {
ExcelExportService service = new ExcelExportService();
service.createSheetForMap(workbook, (ExportParams) map.get("title"), (List<ExcelExportEntity>) map.get("entity"), (Collection<?>) map.get("data"));
}
workbook.write(response.getOutputStream());
workbook.close();
CommonDownloadUtil.download(activity.getActivityName() + "报名人员名单" + ".xlsx", workbook, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,144 @@
package com.budwk.app.zhgh.activity.fellowship.models;
import com.budwk.app.base.model.BaseModel;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.sys.services.SysHomeConvert;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import org.nutz.lang.Lang;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@Data
@Accessors(chain = true)
@Comment("交友联谊")
@Table
@EqualsAndHashCode(callSuper = false)
public class FellowshipActivity extends BaseModel implements Serializable, SysHomeConvert {
@Name
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("活动名称")
private String activityName;
@Column
@ColDefine(type = ColType.INT)
@Comment("年度")
private Integer year;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("活动报名开始时间")
private Date activitySignUpStartTime;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("活动报名开始时间")
private Date activitySignUpEndTime;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("活动开始时间")
private Date activityStartTime;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("活动结束时间")
private Date activityEndTime;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否禁用")
private boolean isDisabled;
@Column
@ColDefine(customType = "longtext")
@Comment("活动介绍")
private String introduce;
@Column
@ColDefine(type = ColType.INT, width = 10)
@Comment("活动限制标识")
private Integer restrictLimit;
@Column
@ColDefine(type = ColType.INT, width = 10)
@Comment("活动限制报名个数")
private Integer limitNum;
@Column
@ColDefine(type = ColType.VARCHAR, width = 100)
@Comment("活动封面")
private String cover;
@Column
@ColDefine(type = ColType.VARCHAR, width = 100)
@Comment("微信群二维码")
private String wechat;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("上课前是否通知")
private boolean notice;
@Column
@Comment("活动范围Id")
@ColDefine(type = ColType.INT, width = 32)
private Integer activityGroupId;
@Column
@Comment("活动范围名称")
@ColDefine(type = ColType.VARCHAR, width = 40)
private String activityGroupName;
/**
* 所有的培训班
*/
@Many(field = "activityId")
private List<FellowshipCourse> courseList;
@Many(field = "activityId")
private List<FellowshipTypeLimit> typeLimits;
@Column
@Comment("活动类型")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String trainType;
@Column
@Comment("主办单位")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> hostUnitIds;
@Column
@Comment("承办单位")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> undertakeUnitIds;
@Override
public Sys_home_activity covertToSysHomeActivity() {
Sys_home_activity sysHomeActivity = new Sys_home_activity();
sysHomeActivity.setId(this.getId());
sysHomeActivity.setName(this.getActivityName());
sysHomeActivity.setCover(this.getCover());
sysHomeActivity.setUrl("/platform/fellowship/apply?id=" + this.getId());
sysHomeActivity.setH5Url("/platform/fellowship/apply/h5?id=" + this.getId());
if (Lang.isNotEmpty(this.getActivitySignUpStartTime())) {
sysHomeActivity.setStartDate(this.getActivitySignUpStartTime());
sysHomeActivity.setEndDate(this.getActivitySignUpEndTime());
}
sysHomeActivity.setAllowUserGroupId(this.getActivityGroupId());
sysHomeActivity.setEnable(!this.isDisabled());
sysHomeActivity.setClassPath(this.getClass().getPackageName() + this.getClass().getName());
return sysHomeActivity;
}
}
@@ -0,0 +1,54 @@
package com.budwk.app.zhgh.activity.fellowship.models;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.Date;
@Data
@Accessors(chain = true)
@Comment("交友联谊下的子活动")
@Table
@EqualsAndHashCode(callSuper = false)
public class FellowshipActivityCourse {
@Name
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("活动ID")
private String activityId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("课程ID")
private String courseId;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("课程开始时间")
private Date courseStartTime;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("课程结束时间")
private Date courseEndTime;
@Column
@ColDefine(type = ColType.DATE)
@Comment("课程时间")
private Date courseDate;
@Column
@ColDefine(type = ColType.INT, width = 4)
@Comment("限制人数")
private Integer courseLimitNum;
private Integer hasRegisterNum;
}
@@ -0,0 +1,31 @@
package com.budwk.app.zhgh.activity.fellowship.models;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
@Data
@Accessors(chain = true)
@Comment("交友联谊黑名单")
@Table
@EqualsAndHashCode(callSuper = false)
public class FellowshipBlackList {
@Name
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("用户id")
private String userId;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否禁用")
private Boolean isDisabled;
}
@@ -0,0 +1,163 @@
package com.budwk.app.zhgh.activity.fellowship.models;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import org.nutz.lang.util.NutMap;
import java.io.Serializable;
import java.util.List;
@Data
@Accessors(chain = true)
@Comment("交友联谊的子活动")
@Table
@EqualsAndHashCode(callSuper = false)
public class FellowshipCourse extends BaseModel implements Serializable {
@Name
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("活动ID")
private String activityId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("课程名称")
private String courseName;
@Column
@ColDefine(type = ColType.INT)
@Comment("课程人数")
private int coursePeopleNumber;
@Column
@ColDefine(type = ColType.INT)
@Default(value = "0")
@Comment("预留名额")
private int courseReservedNumber;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("课程地点")
private String courseLocation;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("课程类型")
private String courseType;
@Column
@ColDefine(type = ColType.MYSQL_JSON)
@Comment("课程地点坐标")
private List<Double> courseLocationCoordinates;
@Column
@ColDefine(type = ColType.VARCHAR, width = 20)
@Comment("课程讲师")
private String courseInstructor;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("校区")
private String campus;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("报名人数是否限制")
private Boolean courseIsLimitApply;
@Column
@ColDefine(type = ColType.INT)
@Comment("序号")
private int orderNum;
@Column
@ColDefine(customType = "longtext")
@Comment("详细信息")
private String introduce;
@Many(field = "courseId")
private List<FellowshipActivityCourse> courseTimeList;
//已报人数
private Integer hasRegisterNum;
private Boolean isBringFamily;
private Boolean isAddFamily;
//是否报过该课程
private Boolean isSign;
//还能报该类型的课程吗
private Boolean canSignThisCourseType;
@Column
@Comment("分工会人数限制")
@ColDefine(type = ColType.MYSQL_JSON)
private List<NutMap> unionLimit;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("移动端是否签到")
private boolean isMobileSign;
@Column
@ColDefine(type = ColType.INT)
@Comment("签到方式 1.扫描二维码签到 2.被扫 3.gps签到")
private Integer signType;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("移动端是否签收礼品")
private boolean isReceiveGift;
@Column
@ColDefine(type = ColType.INT)
@Comment("领取礼品方式 1.扫描二维码 2.线下")
private Integer giftType;
@Column
@ColDefine(type = ColType.INT)
@Comment("预留名额方式 1.报名人员减少模式 2.报名人数不变模式")
private Integer reserveMode;
@Column
@Comment("承办工会")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String hostUnionId;
@Column
@Comment("对内报名时间")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String interTime;
@Column
@Comment("是否开放给其他工会")
@ColDefine(type = ColType.BOOLEAN, width = 4)
private Boolean openOtherUnion;
@Column
@Comment("分类标识")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String assort;
@Column
@ColDefine(type = ColType.INT)
@Default(value = "0")
@Comment("候补名额数")
private Integer waitingNum;
//候补已报人数
private Integer hasWaitingNum;
private String courseTimeName;
}
@@ -0,0 +1,84 @@
package com.budwk.app.zhgh.activity.fellowship.models;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.List;
@Data
@Accessors(chain = true)
@Comment("交友联谊移动端动态表单")
@Table("fellowship_mobile_sign_column")
@EqualsAndHashCode(callSuper = false)
public class FellowshipMobileSignColumn {
private static final long serialVersionUID = 1L;
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
/**
* train_sign_up_type id
*/
@Column
@Comment("类型id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String typeId;
@Column
@Comment("字段名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String columnName;
@Column
@Comment("字段编码")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String columnCode;
@Column
@Comment("字段值")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String columnValue;
@Column
@Comment("字段类型")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String columnType;
@Column
@Comment("下拉框的值")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> selectValues;
@Column
@Comment("是否必填")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isRequired;
@Column
@Comment("控件类型")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String columnFormType;
@Column
@Comment("文件个数")
@ColDefine(type = ColType.INT)
private Integer fileNumber;
@Column
@Comment("文件类型")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> fileType;
@Column
@Comment("序号")
@ColDefine(type = ColType.INT, width = 1)
private Integer columnIndex;
}
@@ -0,0 +1,65 @@
package com.budwk.app.zhgh.activity.fellowship.models;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
@Data
@Accessors(chain = true)
@Comment("交友联谊的子活动类型")
@Table("fellowship_type")
@EqualsAndHashCode(callSuper = false)
public class FellowshipType extends BaseModel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("类型编码")
@ColDefine(type = ColType.VARCHAR, width = 80)
private String code;
@Column
@Comment("类型名称")
@ColDefine(type = ColType.VARCHAR, width = 80)
private String typeName;
@Column
@Comment("序号")
@ColDefine(type = ColType.INT, width = 1)
private Integer xh;
@Column
@Comment("是否携带家属")
@ColDefine(type = ColType.BOOLEAN)
@Default("0")
private Boolean isBringFamily;
@Column
@Comment("家属纳入总人数")
@ColDefine(type = ColType.BOOLEAN)
@Default("0")
private Boolean isAddFamily;
@Column
@Comment("本人纳入总人数")
@ColDefine(type = ColType.BOOLEAN)
@Default("1")
private Boolean selfAddFamily;
@Many(field = "typeId")
private List<FellowshipMobileSignColumn> mobileSignColumnList;
}
@@ -0,0 +1,40 @@
package com.budwk.app.zhgh.activity.fellowship.models;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.io.Serializable;
@Data
@Accessors(chain = true)
@Comment("交友联谊类型限制条件")
@Table("fellowship_type_limit")
@EqualsAndHashCode(callSuper = false)
public class FellowshipTypeLimit implements Serializable {
private static final long serialVersionUID = 1L;
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("活动id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String activityId;
@Column
@Comment("活动类型id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String typeId;
@Column
@Comment("限制个数")
@ColDefine(type = ColType.INT, width = 10)
private int limitNum;
}
@@ -0,0 +1,86 @@
package com.budwk.app.zhgh.activity.fellowship.models;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import org.nutz.lang.util.NutMap;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@Data
@Accessors(chain = true)
@Comment("交友联谊报名人员")
@Table
@EqualsAndHashCode(callSuper = false)
@TableIndexes({@Index(name = "INDEX_FELLOWSHIP_USER_COURSEID", fields = {"courseId"}, unique = false)})
public class FellowshipUser implements Serializable {
@Name
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("活动ID")
private String activityId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("课程ID")
private String courseId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("用户ID")
private String userId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("工会ID")
private String unionId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("单位ID")
private String unitId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 100)
@Comment("工会")
private String unionName;
@Column
@ColDefine(type = ColType.VARCHAR, width = 100)
@Comment("单位")
private String unitName;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("联系方式")
private String mobile;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("报名时间")
private Date signUpTime;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("活动课程时段id")
private String activityCourseId;
@Column
@ColDefine(type = ColType.MYSQL_JSON)
@Comment("手机端报名字段和值")
private List<NutMap> mobileColumnsValue;
@Column
@ColDefine(type = ColType.INT)
@Comment("用户报名状态(1.正常 2.待报名成功 3.也是正常,但是是从2变为1的 4.废弃[就是没签到的意思])")
private Integer state;
}
@@ -0,0 +1,87 @@
package com.budwk.app.zhgh.activity.fellowship.models;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.io.Serializable;
import java.util.Date;
@Data
@Accessors(chain = true)
@Comment("交友联谊报名人员子活动表")
@Table
@EqualsAndHashCode(callSuper = false)
@TableIndexes({
@Index(name = "INDEX_FELLOWSHIP_USER_COURSE_USERID", fields = {"userId"}, unique = false),
@Index(name = "INDEX_FELLOWSHIP_USER_COURSE_COURSEID", fields = {"courseId"}, unique = false)
})
public class FellowshipUserCourse implements Serializable {
@Name
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("活动ID")
private String activityId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("课程ID")
private String courseId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("用户ID")
private String userId;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("课程开始时间")
private Date courseStartTime;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("课程结束时间")
private Date courseEndTime;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否上课")
private boolean isAttend;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("上课打卡时间")
private Date attendTime;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否领取礼品")
private Boolean isReceive;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("领取礼品时间")
private Date receiveTime;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("签到扫码人员id(二维码模式)")
private String signScannerCodeUserId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("礼品扫码人员id(二维码模式)")
private String giftScannerCodeUserId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("关联train_sign_up_activity_course表的id")
private String activityCourseId;
}
@@ -0,0 +1,127 @@
package com.budwk.app.zhgh.activity.fellowship.service;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipActivity;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipCourse;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipUser;
import org.nutz.dao.Cnd;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @author zxy
* @Description TODO
* @createTime 2022年02月23日 17:14:00
*/
public interface FellowshipActivityService extends BaseService<FellowshipActivity> {
/**
* 添加活动
*
* @param activity 活动信息
* @param course 培训班信息
*/
void add(FellowshipActivity activity, FellowshipCourse course);
/**
* 编辑活动
*
* @param activity 活动信息
*/
void edit(FellowshipActivity activity);
/**
* 更新活动状态
*
* @param activity 活动信息
*/
void updateActivityStatus(FellowshipActivity activity);
/**
* 查询单条活动信息
*
* @param id 活动ID
* @return 返回的数据与前端符合
*/
NutMap findOne(String id, Cnd cnd, String fromMode);
/**
* pc分页查询
*
* @param pageForm
* @param cnd
* @return
*/
Pagination pageData(PageForm pageForm, Cnd cnd);
/**
* 手机端分页查询
*
* @param pageForm 分页
* @param year 年度
* @param activityStatus 报名状态 0全部 1进行中 2结束
* @return
*/
Pagination mPageData(PageForm pageForm, Integer year, int activityStatus, Integer activityType);
/**
* 手机端报名
*/
void doSignUp(FellowshipUser fellowshipUser) throws Exception;
/**
* 异步插入每个报名成功人员的课程数据
*
* @param activityId
* @param courseId
* @param userId
*/
void asyncInsertUserCourse(String activityId, String courseId, String userId);
/**
* 该培训班每个分工会名额是否报满
* @return
*/
boolean isSignFullByUnionId(FellowshipCourse course, Integer currentFamilyNumber);
/**
* 该培训班是否报满
*/
boolean isSignFull(FellowshipCourse course, Integer currentFamilyNumber);
/**
* 还能报该类型的培训班吗 比如书画班最多报一项 健身班两项
* @return
*/
boolean isSignCourse(FellowshipCourse course, FellowshipActivity activity);
/**
* 当前用户是否已报过该培训班
*
* @param courseId
* @param userId
* @return
*/
boolean isSignCourseByUser(String courseId, String userId);
/**
* 手机端签到
*
* @param id 每个培训班每节课每个用户的记录ID
*/
void doQd(String id);
/**
* 某个用户的签到信息
*
* @param userId 用户id
* @param activityId 活动id
*/
List<NutMap> qdInfoByUserId(String userId, String activityId);
List<FellowshipCourse> filterCourseByHostUnion(List<FellowshipCourse> courseList);
}
@@ -0,0 +1,68 @@
package com.budwk.app.zhgh.activity.fellowship.service;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipUser;
import org.nutz.lang.util.NutMap;
import java.util.List;
import java.util.Map;
/**
* @author zxy
* @Description 报名统计service
* @createTime 2022年03月03日 10:00:00
*/
public interface FellowshipActivityStatisticsService extends BaseService<FellowshipUser> {
/**
* 统计分页
*
* @param pageForm
* @param activityId
* @return
*/
Pagination pageData(PageForm pageForm, String activityId);
/**
* 该课程下的报名人员信息
*
* @param courseId
* @return
*/
List<NutMap> registerUserList(String courseId);
List<NutMap> getTaleColumnInfo(String courseId);
/**
* 该课程下的报名人员信息
*
* @param courseId
* @return
*/
List<NutMap> registerUserList(String courseId, String unionId, String unitId, String searchName, String searchKeyword);
/**
* 获取每个课程的签到情况
*
* @param courseId
* @return k->每个培训班每节课的上课时间 v->上课记录list
*/
Map<String, List<NutMap>> getSignInfo(String courseId);
/**
* 报名人员list 导出
* @param activityId
* @return
*/
List<NutMap> baoMingUserList(String activityId);
int queryCourseCount(String courseId, String courseType);
int queryCourseWaitCount(String courseId, String courseType);
int queryCourseCount(String courseId, String courseType, String unionId);
int queryCourseWaitCount(String courseId, String courseType, String unionId);
}
@@ -0,0 +1,43 @@
package com.budwk.app.zhgh.activity.fellowship.service;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipBlackList;
import org.nutz.dao.Cnd;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @author zxy
* @Description TODO
* @createTime 2022年03月07日 14:29:00
*/
public interface FellowshipBlackListService extends BaseService<FellowshipBlackList> {
/**
* 分页
*
* @param pageForm 分页
* @return Pagination
*/
Pagination pageData(PageForm pageForm, Cnd cnd, String activityId, String courseId);
/**
* 拉黑、解封用户
*
* @param userId
*/
void doHandleUser(String userId);
/**
* 上课记录
*
* @param userId
* @return
*/
List<NutMap> attendClassRecord(String userId);
}
@@ -0,0 +1,473 @@
package com.budwk.app.zhgh.activity.fellowship.service.impl;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.fellowship.models.*;
import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityService;
import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityStatisticsService;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.async.Async;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author zxy
* @Description TODO
* @createTime 2022年02月23日 17:14:00
*/
@Slf4j
@IocBean(args = {"refer:dao"})
public class FellowshipActivityServiceImpl extends BaseServiceImpl<FellowshipActivity> implements FellowshipActivityService {
@Inject
private FellowshipActivityStatisticsService statisticsService;
public FellowshipActivityServiceImpl(Dao dao) {
super(dao);
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void add(FellowshipActivity activity, FellowshipCourse course) {
dao().insert(activity);
//插入类型限制
List<FellowshipTypeLimit> typeLimits = activity.getTypeLimits();
typeLimits.forEach(v -> v.setActivityId(activity.getId()));
dao().insert(typeLimits);
List<FellowshipCourse> courseList = activity.getCourseList();
for (FellowshipCourse v : courseList) {
v.setActivityId(activity.getId());
v.setOpenOtherUnion(false);
dao().insert(v);
this.setCourseTimeAndInsert(v);
}
if (!activity.isDisabled()) {
Sys_home_activity sysHomeActivity = activity.covertToSysHomeActivity();
dao().insertOrUpdate(sysHomeActivity);
}
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void edit(FellowshipActivity activity) {
//修改活动
update(activity);
//修改类型限制
List<FellowshipTypeLimit> typeLimits = activity.getTypeLimits();
typeLimits.forEach(v -> v.setActivityId(activity.getId()));
if(Lang.isNotEmpty(typeLimits)) {
insertOrUpdate(typeLimits);
}
List<FellowshipCourse> courseList = activity.getCourseList();
courseList.forEach(v -> {
v.setActivityId(activity.getId());
dao().insertOrUpdate(v);
if (Lang.isNotEmpty(v.getCourseTimeList())) {
this.setCourseTimeAndInsert(v);
}
});
//查询原来的活动
List<FellowshipCourse> oldCourseList = dao().query(FellowshipCourse.class, Cnd.where("activityId", "=", activity.getId()));
//原来的培训班id
List<String> oldCourseIdList = oldCourseList.stream().map(FellowshipCourse::getId).toList();
//原来的上课时间
List<FellowshipActivityCourse> oldActCourseTimeList = dao().query(FellowshipActivityCourse.class, Cnd.where("activityId", "=", activity.getId()));
//现在的上课时间
List<String> nowCourseTimeListId = new ArrayList<>();
activity.getCourseList().forEach(v -> {
if (v.getCourseTimeList() != null) {
nowCourseTimeListId.addAll(v.getCourseTimeList().stream().map(FellowshipActivityCourse::getId).toList());
}
});
List<String> deleteCourseTimeListId = oldActCourseTimeList.stream().map(FellowshipActivityCourse::getId).filter(id -> !nowCourseTimeListId.contains(id)).collect(Collectors.toList());
List<String> courseIdList = courseList.stream().map(FellowshipCourse::getId).collect(Collectors.toList());
//删除关联的培训班
List<String> deleteIdList = oldCourseIdList.stream().filter(v -> !courseIdList.contains(v)).collect(Collectors.toList());
dao().clear(FellowshipCourse.class, Cnd.where("id", "in", deleteIdList));
dao().clear(FellowshipActivityCourse.class, Cnd.where("id", "in", deleteCourseTimeListId));
dao().clear(FellowshipUser.class, Cnd.where("courseId", "not in", courseIdList).and("activityId", "=", activity.getId()));
dao().clear(FellowshipUserCourse.class, Cnd.where("courseId", "not in", courseIdList).and("activityId", "=", activity.getId()));
//查询修改过培训时间的记录
Sql tsuucSql = Sqls.create("""
SELECT
tsuuc.id,
tsuac.courseStartTime,
tsuac.courseEndTime
FROM
`fellowship_user_course` tsuuc
LEFT JOIN fellowship_activity_course tsuac ON tsuac.id = tsuuc.activityCourseId
where tsuuc.courseStartTime != tsuac.courseStartTime or tsuuc.courseEndTime != tsuac.courseEndTime
""");
List<NutMap> tsuucList = listMap(tsuucSql);
tsuucList.forEach(v -> {
Chain chain = Chain.make("courseStartTime", v.getTime("courseStartTime"));
chain.add("courseEndTime", v.getTime("courseEndTime"));
Cnd cnd = Cnd.where("id", "=", v.getString("id"));
dao().update("fellowship_user_course", chain, cnd);
});
if (!activity.isDisabled()) {
Sys_home_activity sysHomeActivity = activity.covertToSysHomeActivity();
dao().insertOrUpdate(sysHomeActivity);
} else {
dao().delete(Sys_home_activity.class, activity.getId());
}
}
private void setCourseTimeAndInsert(FellowshipCourse course) {
course.getCourseTimeList().forEach(courseTime -> {
Calendar calendar = Calendar.getInstance();
calendar.setTime(courseTime.getCourseDate());
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DATE);
Calendar startCalendar = Calendar.getInstance();
startCalendar.setTime(courseTime.getCourseStartTime());
startCalendar.set(year, month, day);
courseTime.setCourseStartTime(startCalendar.getTime());
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(courseTime.getCourseEndTime());
endCalendar.set(year, month, day);
courseTime.setCourseEndTime(endCalendar.getTime());
courseTime.setActivityId(course.getActivityId());
courseTime.setCourseId(course.getId());
dao().insertOrUpdate(courseTime);
});
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void updateActivityStatus(FellowshipActivity activity) {
updateIgnoreNull(activity);
}
@Override
public NutMap findOne(String id, Cnd cnd, String fromMode) {
if (Lang.isEmpty(cnd)) {
cnd = Cnd.NEW();
}
cnd.asc("orderNum").asc("campus").desc("courseLocation").asc("courseType").asc("courseName");
List<FellowshipCourse> courseArray = dao().query(FellowshipCourse.class, cnd.and("activityId", "=", id));
if (StrUtil.isNotBlank(fromMode) && "mobile".equals(fromMode)) {
courseArray = this.filterCourseByHostUnion(courseArray);
}
FellowshipActivity activity = fetchLinks(dao().fetch(FellowshipActivity.class, id), "^(conditionStructure|typeLimits)$");
activity.setCourseList(courseArray);
List<FellowshipCourse> courseList = activity.getCourseList();
courseList.forEach(c -> {
if (StrUtil.isNotBlank(c.getCourseType())) {
dao().fetchLinks(c, "^(courseTimeList)$", Cnd.NEW().asc("courseStartTime"));
int courseCount = statisticsService.queryCourseCount(c.getId(), c.getCourseType());
c.setHasRegisterNum(courseCount);
int courseWaitCount = statisticsService.queryCourseWaitCount(c.getId(), c.getCourseType());
c.setHasWaitingNum(courseWaitCount);
//当前用户是否报过
c.setIsSign(isSignCourseByUser(c.getId(), SecurityUtil.getUserId()));
}
});
return Lang.obj2nutmap(activity);
}
@Override
public Pagination pageData(PageForm pageForm, Cnd cnd) {
Pagination pagination = listPageLinks(pageForm.getPageNumber(), pageForm.getPageSize(), cnd, "^(courseList)$");
return pagination;
}
@Override
public Pagination mPageData(PageForm pageForm, Integer year, int activityStatus, Integer activityType) {
Cnd cnd = Cnd.NEW();
cnd.andEX("year", "=", year);
switch (activityStatus) {
case 2 -> {
cnd.and(new Static("activitySignUpStartTime < now()"));
cnd.and(new Static("activitySignUpEndTime > now()"));
}
case 3 -> {
cnd.and(new Static("activityStartTime < now()"));
cnd.and(new Static("activityEndTime > now()"));
}
case 4 -> cnd.and(new Static("activityEndTime < now()"));
case 5 -> cnd.and(new Static("activityStartTime < now()"));
case 6 -> cnd.and(new Static("activityStartTime > now()"));
}
if (activityType != null && activityType == 1) {
cnd.and(new Static("id in (select activityId from fellowship_user where userId = '%s')".formatted(SecurityUtil.getUserId())));
}
cnd.and("isDisabled", "=", 0);
cnd.orderBy("activityEndTime", "desc");
cnd.orderBy("isDisabled", "desc");
cnd.orderBy("createdAt", "desc");
return listPage(pageForm.getPageNumber(), pageForm.getPageSize(), cnd);
}
@Override
@Aop(TransAop.READ_COMMITTED)
public void doSignUp(FellowshipUser fellowshipUser) throws Exception {
String userId = SecurityUtil.getUserId();
//查询课程
FellowshipCourse course = dao().fetch(FellowshipCourse.class, fellowshipUser.getCourseId());
FellowshipType type = dao().fetch(FellowshipType.class, course.getCourseType());
//如果这个课程的预留名额方式为报名人数不变
if (course.getReserveMode() == 2) {
//如果当前报名+已报小于这个课程限制人数
//课程已报人数
int normalCount = statisticsService.queryCourseCount(course.getId(), course.getCourseType());
//+1是算自己
int hasRegisterNum = type.getSelfAddFamily() ? normalCount + 1 : 0;
fellowshipUser.setState((hasRegisterNum + course.getCourseReservedNumber()) > course.getCoursePeopleNumber() ? 2 : 1);
} else {
fellowshipUser.setState(1);
}
View_user user = dao().fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId()));
fellowshipUser.setUnionId(SecurityUtil.getUnionId());
fellowshipUser.setUnionName(user.getUnionName());
fellowshipUser.setUnitId(SecurityUtil.getUnitId());
fellowshipUser.setUnitName(user.getUnitName());
fellowshipUser.setUserId(userId);
fellowshipUser.setSignUpTime(new Date());
dao().insert(fellowshipUser);
if (StrUtil.isNotBlank(fellowshipUser.getActivityCourseId())) {
FellowshipActivityCourse fetch = dao().fetch(FellowshipActivityCourse.class, fellowshipUser.getActivityCourseId());
FellowshipUserCourse userCourse = new FellowshipUserCourse();
userCourse.setActivityId(fellowshipUser.getActivityId());
userCourse.setCourseId(fellowshipUser.getCourseId());
userCourse.setUserId(fellowshipUser.getUserId());
userCourse.setCourseStartTime(fetch.getCourseStartTime());
userCourse.setCourseEndTime(fetch.getCourseEndTime());
userCourse.setAttend(false);
userCourse.setAttendTime(null);
userCourse.setActivityCourseId(fetch.getId());
dao().insert(userCourse);
} else {
asyncInsertUserCourse(fellowshipUser.getActivityId(), fellowshipUser.getCourseId(), fellowshipUser.getUserId());
}
}
@Async
@Override
public void asyncInsertUserCourse(String activityId, String courseId, String userId) {
log.info("异步插入{}的上课信息,课程ID为{},活动ID为{}", userId, courseId, activityId);
List<FellowshipActivityCourse> courseList = dao().query(FellowshipActivityCourse.class, Cnd.where("courseId", "=", courseId));
List<FellowshipUserCourse> list = new ArrayList<>();
courseList.forEach(v -> {
FellowshipUserCourse userCourse = new FellowshipUserCourse();
userCourse.setActivityId(activityId);
userCourse.setCourseId(courseId);
userCourse.setUserId(userId);
userCourse.setCourseStartTime(v.getCourseStartTime());
userCourse.setCourseEndTime(v.getCourseEndTime());
userCourse.setAttend(false);
userCourse.setAttendTime(null);
userCourse.setActivityCourseId(v.getId());
list.add(userCourse);
});
dao().insert(list);
}
/**
* 该培训班每个分工会名额是否报满
* @return
*/
@Override
public boolean isSignFullByUnionId(FellowshipCourse course, Integer currentFamilyNumber) {
List<NutMap> unionLimit = course.getUnionLimit();
if (Lang.isEmpty(unionLimit)) {
return false;
}
String unionId = SecurityUtil.getUnionId();
NutMap unionLimitMap = unionLimit.stream().filter(v -> v.getString("id").equals(unionId)).findAny().orElse(null);
if (Lang.isEmpty(unionLimitMap)) {
return true;
}
FellowshipType type = dao().fetch(FellowshipType.class, course.getCourseType());
//分工会限制人数
int limitCount = unionLimitMap.getInt("limitCount");
//该课程已经报名的总人数
int hasSignCount = statisticsService.queryCourseCount(course.getId(), course.getCourseType(), unionId);
int hasWaitCount = statisticsService.queryCourseWaitCount(course.getId(), course.getCourseType());
//+1是算自己
int current = type.getSelfAddFamily() ? 1 : 0;
currentFamilyNumber = type.getIsBringFamily() && type.getIsAddFamily() ? currentFamilyNumber : 0;
//如果还有正常名额
if(limitCount - hasSignCount > 0) {
return (hasSignCount + current + currentFamilyNumber) > limitCount;
} else {
return (hasWaitCount + current + currentFamilyNumber) > course.getWaitingNum();
}
}
@Override
public boolean isSignFull(FellowshipCourse course, Integer currentFamilyNumber) {
//课程限制人数
int coursePeopleNumber = course.getCoursePeopleNumber();
if (coursePeopleNumber == 0) {
return true;
}
//查询课程对应的类型
FellowshipType type = dao().fetch(FellowshipType.class, course.getCourseType());
//课程已报人数
int hasSignCount = statisticsService.queryCourseCount(course.getId(), course.getCourseType());
int hasWaitCount = statisticsService.queryCourseWaitCount(course.getId(), course.getCourseType());
//+1是算自己
int current = type.getSelfAddFamily() ? 1 : 0;
currentFamilyNumber = type.getIsBringFamily() && type.getIsAddFamily() ? currentFamilyNumber : 0;
//如果还有正常名额
if(coursePeopleNumber - hasSignCount > 0) {
return (hasSignCount + current + currentFamilyNumber + course.getCourseReservedNumber()) > coursePeopleNumber;
} else {
return (hasWaitCount + current + currentFamilyNumber) > course.getWaitingNum();
}
}
@Override
public boolean isSignCourse(FellowshipCourse course, FellowshipActivity activity) {
//培训班类型
String courseType = course.getCourseType();
Sql sql = Sqls.create("""
SELECT
count( tsus.id )
FROM
`fellowship_user` tsus
LEFT JOIN fellowship_course tsuc ON tsuc.id = tsus.courseId
WHERE
tsuc.courseType = @courseType
AND tsus.userId = @userId
AND tsus.activityId = @activityId
""");
sql.setParam("courseType", courseType);
sql.setParam("activityId", activity.getId());
sql.setParam("userId", SecurityUtil.getUserId());
int hasRegisterNum = count(sql);
//第一种无限制报名
if (activity.getRestrictLimit() == null || activity.getRestrictLimit() == 1) {
return true;
} else if (activity.getRestrictLimit() == 2) {
FellowshipTypeLimit signUpTypeLimit = dao().fetch(FellowshipTypeLimit.class, Cnd.where("typeId", "=", courseType).and("activityId", "=", activity.getId()));
if (signUpTypeLimit == null) {
return true;
}
//此类型的班最多可报几项
int personMaxRegisterNum = signUpTypeLimit.getLimitNum();
if (personMaxRegisterNum == 0) {
return true;
}
return hasRegisterNum < personMaxRegisterNum;
} else if (activity.getRestrictLimit() == 3) {
//第三种,限制报几个,不跟类型挂钩
int aCount = dao().count(FellowshipUser.class, Cnd.where("activityId", "=", activity.getId()).and("userId", "=", SecurityUtil.getUserId()));
return aCount < activity.getLimitNum();
}
return false;
}
@Override
public boolean isSignCourseByUser(String courseId, String userId) {
return dao().count(FellowshipUser.class, Cnd.where("courseId", "=", courseId).and("userId", "=", userId)) > 0;
}
@Override
public void doQd(String id) {
NutMap updateMap = NutMap.NEW();
updateMap.put("isAttend", true);
updateMap.put("attendTime", new Date());
dao().update(FellowshipUserCourse.class, Chain.from(updateMap), Cnd.where("id", "=", id));
}
@Override
public List<NutMap> qdInfoByUserId(String userId, String activityId) {
Sql sql = Sqls.create("""
SELECT
c.*,
t.courseLocationCoordinates,
t.isMobileSign,
t.signType,
t.isReceiveGift,
t.giftType,
(select state from fellowship_user su where su.activityId = c.activityId and su.courseId = c.courseId and su.userId = c.userId) as state
FROM
`fellowship_user_course` c
LEFT JOIN fellowship_course t ON t.id = c.courseId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("c.activityId", "=", activityId);
cnd.and("c.userId", "=", userId);
cnd.asc("c.courseStartTime");
sql.setCondition(cnd);
return listMap(sql);
}
@Override
public List<FellowshipCourse> filterCourseByHostUnion(List<FellowshipCourse> courseList) {
if (Lang.isEmpty(courseList)) {
return new ArrayList<>();
}
return courseList.stream().filter(o -> {
if (StrUtil.isBlank(o.getInterTime()) || o.getOpenOtherUnion() == null || o.getOpenOtherUnion()) {
return true;
} else {
if (SecurityUtil.getUnionId().equals(o.getHostUnionId())) {
return true;
} else {
int compare = cn.hutool.core.date.DateUtil.compare(cn.hutool.core.date.DateUtil.date(), cn.hutool.core.date.DateUtil.parse(o.getInterTime()), "yyyy-MM-dd HH:mm");
return compare >= 0;
}
}
}).toList();
}
}
@@ -0,0 +1,263 @@
package com.budwk.app.zhgh.activity.fellowship.service.impl;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipMobileSignColumn;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipCourse;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipType;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipUser;
import com.budwk.app.zhgh.activity.fellowship.service.FellowshipActivityStatisticsService;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
* @author zxy
* @Description TODO
* @createTime 2022年03月03日 10:02:00
*/
@IocBean(args = {"refer:dao"})
@Slf4j
public class FellowshipActivityStatisticsServiceImpl extends BaseServiceImpl<FellowshipUser> implements FellowshipActivityStatisticsService {
public FellowshipActivityStatisticsServiceImpl(Dao dao) {
super(dao);
}
@Override
public Pagination pageData(PageForm pageForm, String activityId) {
Sql sql = Sqls.create("""
SELECT
tsuc.id,
tsuc.courseName,
tsuc.coursePeopleNumber,
tsuc.courseReservedNumber,
type.typeName as courseType,
tsuc.courseLocation,
tsuc.courseInstructor,
tsuc.reserveMode,
tsuc.isMobileSign,
tsuc.hostUnionId,
tsuc.interTime,
tsuc.waitingNum,
tsuc.openOtherUnion,
tsuc.courseType as cType
FROM
`fellowship_course` tsuc
LEFT JOIN
fellowship_type type on tsuc.courseType = type.id
WHERE
tsuc.activityId = @activityId
ORDER BY tsuc.orderNum
""");
sql.setParam("activityId", activityId);
Pagination pagination = listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
List<NutMap> courseList = pagination.getList();
courseList.forEach(c -> {
c.put("registerNum", queryCourseCount(c.getString("id"), c.getString("cType")));
c.put("hasWaitingNum", queryCourseWaitCount(c.getString("id"), c.getString("cType")));
});
return pagination;
}
@Override
public List<NutMap> registerUserList(String courseId) {
Sql sql = Sqls.create("""
SELECT
u.loginname,
u.username,
u.sex,
tsuu.unionId,
tsuu.unionName,
tsuu.unitId,
tsuu.unitName,
ifnull(tsuu.mobile, u.mobile) as mobile,
tsuu.signUpTime,
tsuu.state,
tsuu.mobileColumnsValue
FROM
fellowship_user tsuu
LEFT JOIN `vw_user` u ON u.id = tsuu.userId
$condition
ORDER BY FIELD( tsuu.state, 1, 3, 2, 4 ),tsuu.signUpTime desc,u.unionid desc, u.unitid desc
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("tsuu.courseId", "=", courseId);
sql.setCondition(cnd);
List<NutMap> list = listMap(sql);
for (NutMap o : list) {
if(StrUtil.isBlank(o.getString("mobileColumnsValue"))) {
continue;
}
List<NutMap> mobileColumnsValue = Json.fromJsonAsList(NutMap.class, o.getString("mobileColumnsValue"));
if(Lang.isNotEmpty(mobileColumnsValue)) {
mobileColumnsValue.forEach(m -> {
o.put(m.getString("columnCode"), m.getString("columnValue"));
});
}
}
return list;
}
@Override
public List<NutMap> getTaleColumnInfo(String courseId) {
FellowshipCourse course = dao().fetch(FellowshipCourse.class, courseId);
FellowshipType upType = dao().fetch(FellowshipType.class, course.getCourseType());
dao().fetchLinks(upType, "mobileSignColumnList", Cnd.NEW().asc("columnIndex"));
List<FellowshipMobileSignColumn> columnList = upType.getMobileSignColumnList();
List<NutMap> columnTableList = columnList.stream().map(o -> NutMap.NEW().setv("label", o.getColumnName()).setv("prop", o.getColumnCode())).collect(Collectors.toList());
return columnTableList;
}
@Override
public List<NutMap> registerUserList(String courseId, String unionId, String unitId, String searchName, String searchKeyword) {
Sql sql = Sqls.create("""
SELECT
tsuu.id,
u.id as userId,
u.loginname,
u.username,
u.unitName,
u.unionName,
u.sex,
ifnull(tsuu.mobile, u.mobile) as mobile,
tsuu.signUpTime,
tsuu.state
FROM
fellowship_user tsuu
LEFT JOIN `vw_user` u ON u.id = tsuu.userId
$condition
ORDER BY FIELD( tsuu.state, 1, 3, 2, 4 ),tsuu.signUpTime desc,u.unionid desc, u.unitid desc
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("tsuu.courseId", "=", courseId);
cnd.andEX("u.unionid", "=", unionId);
cnd.andEX("u.unitid", "=", unitId);
if (StrUtil.isNotBlank(searchKeyword)) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.andLike("username", searchKeyword).orLike("loginname", searchKeyword);
cnd.and(group);
}
sql.setCondition(cnd);
return listMap(sql);
}
@Override
public Map<String, List<NutMap>> getSignInfo(String courseId) {
Sql sql = Sqls.create("""
SELECT
tsuuc.courseStartTime,
tsuuc.courseEndTime,
tsuuc.isAttend,
tsuuc.attendTime,
u.username,
u.loginname,
u.unitname,
u.unionname
FROM
`fellowship_user_course` tsuuc
LEFT JOIN `vw_user` u ON u.id = tsuuc.userId
WHERE
tsuuc.courseId = @courseId
""");
sql.setParam("courseId", courseId);
List<NutMap> list = listMap(sql);
Map<String, List<NutMap>> courseTimeMap = list.stream().map(v -> {
String courseTime = v.getString("courseStartTime") + "" + v.getString("courseEndTime");
v.put("courseTime", courseTime);
return v;
}).collect(Collectors.groupingBy(v -> v.getString("courseTime")));
// 使用Stream API进行降序排序
Map<String, List<NutMap>> sortedDataMap = courseTimeMap.entrySet().stream()
.sorted(Map.Entry.comparingByKey(Comparator.naturalOrder()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
return sortedDataMap;
}
@Override
public List<NutMap> baoMingUserList(String activityId) {
Sql sql = Sqls.create("""
SELECT
u.loginname,
u.username,
u.unitname,
u.unionname,
u.sex,
u.mobile,
uc.courseName,
uc.campus
FROM
`fellowship_user` uu
RIGHT JOIN fellowship_course uc ON uc.id = uu.courseId
LEFT JOIN `vw_user` u ON u.id = uu.userId
WHERE
uc.activityId = @activityId
ORDER BY u.unitCode,u.unioncode,u.sex
""");
sql.setParam("activityId", activityId);
return listMap(sql);
}
@Override
public int queryCourseCount(String courseId, String courseType) {
return this.queryCourseCount(courseId, courseType, null);
}
@Override
public int queryCourseWaitCount(String courseId, String courseType) {
return this.queryCourseWaitCount(courseId, courseType, null);
}
@Override
public int queryCourseCount(String courseId, String courseType, String unionId) {
return this.calcSignCount(courseId, courseType, unionId, List.of(1, 3));
}
@Override
public int queryCourseWaitCount(String courseId, String courseType, String unionId) {
return this.calcSignCount(courseId, courseType, unionId, List.of(2));
}
private int calcSignCount(String courseId, String courseType, String unionId, List<Integer> stateList) {
if(StrUtil.isBlank(courseId) || StrUtil.isBlank(courseType)) {
return 0;
}
FellowshipType type = dao().fetch(FellowshipType.class, courseType);
AtomicInteger hasRegisterNum = new AtomicInteger();
List<FellowshipUser> signUpUsers = dao().query(FellowshipUser.class, Cnd.where("courseId", "=", courseId)
.and("state", "in", stateList)
.andEX("unionId", "=", unionId));
signUpUsers.forEach(item -> {
if (type.getSelfAddFamily()) {
hasRegisterNum.getAndIncrement();
}
if(type.getIsBringFamily() && type.getIsAddFamily()) {
List<NutMap> mobileColumnsValue = item.getMobileColumnsValue();
NutMap map = mobileColumnsValue.stream().filter(o -> "xdqsrs".equals(o.getString("columnCode"))).findAny().orElse(null);
int number = map != null ? map.getInt("columnValue") : 0;
hasRegisterNum.addAndGet(number);
}
});
return hasRegisterNum.get();
}
}
@@ -0,0 +1,103 @@
package com.budwk.app.zhgh.activity.fellowship.service.impl;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.activity.fellowship.models.FellowshipBlackList;
import com.budwk.app.zhgh.activity.fellowship.service.FellowshipBlackListService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Criteria;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @author zxy
* @Description TODO
* @createTime 2022年03月07日 14:29:00
*/
@IocBean(args = {"refer:dao"})
public class FellowshipUserServiceImpl extends BaseServiceImpl<FellowshipBlackList> implements FellowshipBlackListService {
public FellowshipUserServiceImpl(Dao dao) {
super(dao);
}
@Override
public Pagination pageData(PageForm pageForm, Cnd cnd, String activityId, String courseId) {
Sql sql = Sqls.create("""
SELECT
u.id AS userId,
u.username,
u.loginname,
ifnull(tsuu.mobile, u.mobile) as mobile,
u.unitName,
u.unionName,
tsuc.courseName,
tsuu.state,
( SELECT count( 1 ) FROM fellowship_user_course WHERE userId = tsuu.userId $var) courseTotal,
( SELECT count( 1 ) FROM fellowship_user_course WHERE userId = tsuu.userId AND isAttend = 0 and tsuu.state!=2 AND now()> courseEndTime $var) AS absentCount,
if(tsubl.isDisabled=1,true,false) isDisabled,
group_CONCAT( tsuc.courseName ) AS courseNames
FROM
`fellowship_user` tsuu
LEFT JOIN `vw_user` u ON u.id = tsuu.userId
LEFT JOIN fellowship_activity act on act.id = tsuu.activityId
LEFT JOIN fellowship_course tsuc ON tsuc.id = tsuu.courseId
LEFT JOIN fellowship_black_list tsubl on tsubl.userId = tsuu.userId
$condition
ORDER BY FIELD( tsuu.state, 1, 3, 2, 4 )
""");
cnd.groupBy("tsuu.userId");
Criteria varCnd = Cnd.cri();
varCnd.where().setTop(false);
varCnd.where().andEX("activityId", "=", activityId);
varCnd.where().andEX("courseId", "=", courseId);
if (!varCnd.where().isEmpty()) {
sql.vars().set("var", "and " + varCnd.toSql(null));
}
sql.setCondition(cnd);
return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
@Override
public void doHandleUser(String userId) {
FellowshipBlackList blackRecord = dao().fetch(FellowshipBlackList.class, Cnd.where("userId", "=", userId));
if (Lang.isEmpty(blackRecord)) {
FellowshipBlackList blackList = new FellowshipBlackList();
blackList.setUserId(userId);
blackList.setIsDisabled(true);
dao().insert(blackList);
} else {
// blackRecord.setIsDisabled(!blackRecord.getIsDisabled());
// dao().update(blackRecord);
dao().delete(blackRecord);
}
}
@Override
public List<NutMap> attendClassRecord(String userId) {
Sql sql = Sqls.create("""
SELECT
c.courseName,
uc.courseStartTime,
courseEndTime,
uc.isAttend,
uc.attendTime
FROM
`fellowship_user_course` uc
LEFT JOIN fellowship_course c ON c.id = uc.courseId
WHERE
uc.userId = @userId
""");
sql.setParam("userId", userId);
return listMap(sql);
}
}
@@ -0,0 +1,16 @@
package com.budwk.app.zhgh.activity.fitnesswalk.contants;
import lombok.Data;
import java.util.List;
/**
* 获取活动的树形结构
*/
@Data
public class Cascader {
private String value;
private String label;
private List<Cascader> children;
}
@@ -0,0 +1,18 @@
package com.budwk.app.zhgh.activity.fitnesswalk.contants;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum FitnessWalkMode {
PUNCH("punch", "打卡"),
STEP_COUNT("stepCount", "计步"),
GPS("gps", "GPS");
private final String value;
private final String desc;
}
@@ -0,0 +1,133 @@
package com.budwk.app.zhgh.activity.fitnesswalk.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.fitnesswalk.utils.WeAppCloudUtil;
import io.swagger.annotations.ApiOperation;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
@IocBean
@Ok("json")
@ApiOperation("健步走-同步绑定记录")
@At("/platform/fitnessWalk/bindingRecord")
public class FitnessWalkActivityBindingRecordController {
@Inject
private WeAppCloudUtil weAppCloudUtil;
@At("")
@Ok("beetl:/platform/zhgh/activity/fitnesswalk/bindingRecord.html")
@SaCheckPermission("fitnessWalk.bindingRecord")
public void index() {
}
/**
* 获取用户绑定记录
* @param keyWord
* @param unionId
* @param searchName
* @param searchKeyword
* @param pageNumber
* @param pageSize
* @param pageOrderName
* @param pageOrderBy
* @return
* @throws IOException
*/
@At
@ApiOperation("获取用户绑定记录")
@SaCheckPermission("fitnessWalk.bindingRecord")
public Result pageData(@Param("keyWord") String keyWord,
@Param("unionId") String unionId,
@Param("searchName") String searchName,
@Param("searchKeyword") String searchKeyword,
@Param("pageNumber") int pageNumber, @Param("pageSize") int pageSize,
@Param("pageOrderName") String pageOrderName,
@Param("pageOrderBy") String pageOrderBy) {
int skip = (pageNumber == 1 ? 0 : (pageNumber - 1)) * pageSize;
StringBuilder sql = new StringBuilder("db.collection('login_record')");
if (StrUtil.isNotBlank(keyWord)) {
sql.append(".where(");
sql.append("_.or([");
sql.append("{loginname:{$regex:'").append(keyWord).append("',$options:'i'}},");
sql.append("{username:{$regex:'").append(keyWord).append("',$options:'i'}}");
sql.append("])");
sql.append(")");
}
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
sql.append(".where({'data.unionid':'").append(SecurityUtil.getUnionId()).append("'})");
} else {
if (Strings.isNotBlank(unionId)) {
sql.append(".where({'data.unionid':'").append(unionId).append("'})");
}
}
sql.append(".field({ data: false })");
sql.append(".skip(").append(skip).append(")");
sql.append(".limit(").append(pageSize).append(")");
sql.append(".get()");
try {
JSONObject jsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.QUERY, sql.toString());
List<NutMap> data = jsonObject.getJSONArray("data").stream()
.map(v -> JSONUtil.toBean((String) v, NutMap.class))
.collect(Collectors.toList());
JSONObject pager = jsonObject.getJSONObject("pager");
Pagination pagination = new Pagination(pageNumber, pageSize, pager.getInt("Total"), data);
return Result.success().addData(pagination);
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
/**
* 删除绑定记录
* @param ids
* @return
*/
@At
@ApiOperation("删除绑定记录")
@SLog(tag = "健步走-同步绑定记录", msg = "删除绑定记录")
@SaCheckPermission("fitnessWalk.bindingRecord")
public Result delete(String[] ids) {
String sql = "db.collection('login_record').where({_id:_.in(" + Json.toJson(ids) + ")}).remove()";
weAppCloudUtil.request(WeAppCloudUtil.CRUD.DELETE, sql);
return Result.success();
}
/**
* 删除所有绑定记录
* @return
*/
@At
@ApiOperation("删除所有绑定记录")
@SLog(tag = "健步走-同步绑定记录", msg = "删除所有绑定记录")
@SaCheckPermission("fitnessWalk.bindingRecord")
public Result deleteAll() {
String sql = "db.collection('login_record').where({_id: _.neq('0')}).remove()";
weAppCloudUtil.request(WeAppCloudUtil.CRUD.DELETE, sql);
return Result.success();
}
}

Some files were not shown because too many files have changed in this diff Show More