This commit is contained in:
@jyuhsin
2025-09-15 14:31:17 +08:00
parent 11b90741be
commit 20fe55813f
52 changed files with 5342 additions and 32348 deletions
@@ -0,0 +1,67 @@
package com.budwk.app.flow.handler;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.flow.engine.AssignmentHandler;
import com.budwk.app.flow.engine.core.Execution;
import com.budwk.app.flow.engine.core.ServiceContext;
import com.budwk.app.flow.engine.model.TaskModel;
import com.budwk.app.sys.models.Sys_role;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.sys.services.SysRoleService;
import com.budwk.app.web.controllers.open.commons.service.CommonService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.lang.Lang;
import java.util.List;
/**
* @ClassName FlowCommonDelegationByArgsAssignmentHandler
* @Author JyuHsin
* @Date 2025/9/13 11:13
* @Version 1.0
* @Description TODO
*/
public class FlowGeneralDelegationByArgsAssignmentHandler implements AssignmentHandler {
@Override
public List<String> assign(TaskModel model, Execution execution) {
String sessionId = execution.getArgs().getStr("sessionId");
String delegationId = execution.getArgs().getStr("delegationId");
if (StrUtil.isBlank(sessionId)) {
throw new BaseException("参数 sessionId 不能为空");
}
if (StrUtil.isBlank(delegationId)) {
throw new BaseException("参数 delegationId 不能为空");
}
SysRoleService sysRoleService = ServiceContext.find(SysRoleService.class);
Sys_role role = sysRoleService.getByCode(RoleConstant.TEACHER_CONGRESS_DELEGATION_HEAD);
List<Sys_user_role> roles = ServiceContext.find(Dao.class).query(
Sys_user_role.class,
Cnd.where(Sys_user_role::getRoleId, "=", role.getId())
.and(Sys_user_role::getTcDelegationId, "=", delegationId)
.and(Sys_user_role::getTcSessionId, "=", sessionId)
);
if (Lang.isEmpty(roles)) {
throw new RuntimeException("您所在的代表团没有设置团长,无法流转到下一步,请联系校工会进行设置。");
}
return roles.stream().map(Sys_user_role::getUserId).toList();
}
@Override
public String getMessage() {
return "获取代表团团长(通用版本,根据args中的sessionId和delegationId)";
}
@Override
public int getOrder() {
return AssignmentHandler.super.getOrder();
}
}
@@ -1,96 +0,0 @@
package com.budwk.app.zhgh.activity.family.controller.manage;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.activity.family.models.FamilyActivity;
import com.budwk.app.zhgh.activity.family.models.FamilyUser;
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.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.List;
/**
* @author zxy
* @Description 新建活动
* @createTime 2022年03月07日 10:16:00
*/
@Slf4j
@IocBean
@Api(tags = "新建亲子活动")
@At("/platform/family/manage/activity")
public class FamilyActivityAddController {
@Inject
private Dao dao;
@Inject
private FamilyActivityService familyActivityManageService;
@At
@Ok("json:full")
@ApiOperation("亲子活动新增/修改")
@SaCheckPermission("family.manage.activity")
@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.activity")
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.activity")
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.activity")
public Result getHistoricalActList() {
List<FamilyActivity> query = dao.query(FamilyActivity.class, Cnd.NEW().desc("activityStartTime"));
return Result.success().addData(query);
}
}
@@ -15,6 +15,8 @@ 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;
@@ -38,7 +40,7 @@ import java.util.stream.Collectors;
@IocBean
@Ok("json:full")
@Api(tags = "活动管理")
@At("/platform/family/manage/activity")
@At("/platform/family/manage")
public class FamilyActivityController {
@Inject
@@ -48,14 +50,14 @@ public class FamilyActivityController {
private Dao dao;
@At("")
@SaCheckPermission("family.manage.activity")
@SaCheckPermission("family.manage")
@Ok("beetl:/platform/zhgh/activity/family/manage/index.html")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("family.manage.activity")
@SaCheckPermission("family.manage")
public Result pageData(PageForm pageForm,
@Param(value = "year") Integer year,
@Param(value = "activityName") String activityName) {
@@ -68,7 +70,7 @@ public class FamilyActivityController {
@At
@ApiOperation("活动删除")
@SaCheckPermission("family.manage.activity")
@SaCheckPermission("family.manage")
@SLog(tag = "亲子活动-活动管理", msg = "删除活动")
public Result onDelete(String id) {
Trans.exec(() -> {
@@ -86,7 +88,7 @@ public class FamilyActivityController {
@At
@ApiOperation("活动状态变更")
@SaCheckPermission("family.manage.activity")
@SaCheckPermission("family.manage")
public Result activityStatusChange(FamilyActivity activity) {
familyActivityManageService.updateActivityStatus(activity);
dao.update(Sys_home_activity.class,
@@ -97,7 +99,7 @@ public class FamilyActivityController {
@At
@ApiOperation("查询单个活动")
@SaCheckPermission("family.manage.activity")
@SaCheckPermission("family.manage")
public Result findOne(@Param("id") @NotNull String id) {
NutMap dataMap = familyActivityManageService.findOne(id, null, "");
String activityStartTime = dataMap.getString("activityStartTime");
@@ -142,4 +144,58 @@ public class FamilyActivityController {
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);
}
}
@@ -19,7 +19,6 @@ 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.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@@ -27,7 +26,6 @@ import org.nutz.mvc.annotation.Param;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @Author JyuHsin
@@ -39,7 +37,7 @@ import java.util.concurrent.atomic.AtomicInteger;
@Ok("json:full")
@Api(tags = "亲子活动人员调整")
@At("/platform/family/manage/userAdjust")
public class FamilyUserAdjustController {
public class FamilyAdjustController {
@Inject
private Dao dao;
@@ -48,7 +48,7 @@ import java.util.stream.Collectors;
@Ok("json:full")
@Api(tags = "亲子活动人员黑名单")
@At("/platform/family/userManage")
public class FamilyUserBlackListManageController {
public class FamilyUserManageController {
@Inject
private Dao dao;
@@ -1,98 +0,0 @@
package com.budwk.app.zhgh.activity.trainSignUp.controller.manage;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpActivity;
import com.budwk.app.zhgh.activity.trainSignUp.models.TrainSignUpUser;
import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpActivityService;
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.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.POST;
import org.nutz.mvc.annotation.Param;
import java.util.List;
/**
* @author zxy
* @Description 新建活动
* @createTime 2022年03月07日 10:16:00
*/
@Slf4j
@IocBean
@Api(tags = "新建品牌活动")
@At("/platform/trainSingUp/manage/activity")
public class TrainSignUpActivityAddController {
@Inject
private Dao dao;
@Inject
private TrainSignUpActivityService trainSignUpActivityManageService;
@At
@Ok("json:full")
@ApiOperation("品牌活动新增/修改")
@SaCheckPermission("trainSingUp.manage.activity")
@SLog(tag = "品牌活动-活动管理", msg = "新增/修改活动")
public Result doHandle(TrainSignUpActivity activity) {
if (StrUtil.isBlank(activity.getId())) {
trainSignUpActivityManageService.add(activity, null);
} else {
trainSignUpActivityManageService.edit(activity);
}
return Result.success();
}
@At
@Ok("json:full")
@ApiOperation("获取分工会人数限制")
@SaCheckPermission("trainSingUp.manage.activity")
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 = trainSignUpActivityManageService.listMap(sql);
return Result.success().addData(list);
}
@At
@Ok("json:full")
@ApiOperation("获取报名人员数量")
@SaCheckPermission("trainSingUp.manage.activity")
public Result getRegisterUserCount(@Param(value = "courseId") String courseId) {
return Result.success().addData(dao.count(TrainSignUpUser.class, Cnd.where("courseId", "=", courseId)));
}
@At
@Ok("json:full")
@ApiOperation("获取历史活动列表")
@SaCheckPermission("trainSingUp.manage.activity")
public Result getHistoricalActList() {
List<TrainSignUpActivity> query = dao.query(TrainSignUpActivity.class, Cnd.NEW().desc("activityStartTime"));
return Result.success().addData(query);
}
}
@@ -1,183 +0,0 @@
package com.budwk.app.zhgh.activity.trainSignUp.controller.manage;
import cn.dev33.satoken.annotation.SaCheckPermission;
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.sys.models.Sys_dict;
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.family.models.FamilyCourse;
import com.budwk.app.zhgh.activity.family.service.FamilyActivityStatisticsService;
import com.budwk.app.zhgh.activity.trainSignUp.models.*;
import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpActivityService;
import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpActivityStatisticsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
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.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "活动报名")
@At("/platform/trainSingUp/manage/apply")
public class TrainSignUpActivityApplyController {
@Inject
private TrainSignUpActivityService trainSignUpActivityService;
@Inject
private SysDictService dictService;
@Inject
private TrainSignUpActivityStatisticsService statisticsService;
@At("/")
@SaCheckPermission("trainSingUp.manage.apply")
@Ok("beetl:/platform/zhgh/activity/trainSingUp/apply/index.html")
public void index() {
}
@At("/h5")
@SaCheckPermission("h5.trainSingUp.manage.apply")
@Ok("beetl:/platform/zhghh5/activity/trainSingUp/apply/index.html")
public void h5Index() {
}
@At
@ApiOperation("活动查询")
@SaCheckPermission("trainSingUp.manage.apply")
public Result activityData(PageForm pageForm,
@Param(value = "year") Integer year,
@Param(value = "activityType") Integer activityType) {
Cnd cnd = Cnd.NEW();
cnd.andEX("`year`", "=", year);
//查询报名中
if (activityType == 2) {
cnd.and(new Static("now() > activitySignUpStartTime and 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());
}
Pagination pagination = trainSignUpActivityService.listPage(pageForm.getPageNumber(), pageForm.getPageSize(), cnd);
List<TrainSignUpActivity> trainSignUpActivities = pagination.getList();
Map<String, String> trainSignUpTypeMap = dictService.getSubListByCode("TRAIN_SIGNUP_TYPE").stream().collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName));
trainSignUpActivities.forEach(v -> v.setTrainType(trainSignUpTypeMap.get(v.getTrainType())));
return Result.success(pagination);
}
@At
@ApiOperation("分活动查询")
@SaCheckPermission("trainSingUp.manage.apply")
public Result pageData(PageForm pageForm,
@Param(value = "courseTypeId") String courseTypeId,
@Param(value = "activityId") String activityId,
@Param(value = "assortTypes") String[] assortTypes) {
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,
type.typeName,
tsuc.courseIsLimitApply
FROM
`train_sign_up_course` tsuc
LEFT JOIN train_sign_up_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);
}
List<TrainSignUpCourse> courseArray = trainSignUpActivityService.dao().query(TrainSignUpCourse.class, Cnd.where("activityId", "=", activityId));
courseArray = trainSignUpActivityService.filterCourseByHostUnion(courseArray);
cnd.and("tsuc.id", "in", courseArray.stream().map(TrainSignUpCourse::getId).toList());
cnd.asc("tsuc.orderNum");
cnd.asc("type.code");
sql.setCondition(cnd);
Pagination pagination = trainSignUpActivityService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
List<NutMap> courseList = pagination.getList();
courseList.forEach(c -> {
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", trainSignUpActivityService.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("trainSingUp.manage.apply")
public Result getCourseTime(String id) {
List<TrainSignUpActivityCourse> list = trainSignUpActivityService.dao().query(TrainSignUpActivityCourse.class, Cnd.where("courseId", "=", id));
return Result.success(list);
}
@At
@ApiOperation("查询分类标识集合")
@SaCheckPermission("trainSingUp.manage.apply")
public Result queryCourseAssort(String activityId) {
List<TrainSignUpCourse> courseList = trainSignUpActivityService.dao().query(TrainSignUpCourse.class, Cnd.where(TrainSignUpCourse::getActivityId, "=", activityId).asc(TrainSignUpCourse::getOrderNum));
if(Lang.isEmpty(courseList)) {
return Result.success(new ArrayList<>());
}
List<String> assortList = courseList.stream().map(TrainSignUpCourse::getAssort).filter(StrUtil::isNotBlank).toList();
return Result.success(assortList);
}
}
@@ -7,8 +7,6 @@ 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.FamilyType;
import com.budwk.app.zhgh.activity.family.models.FamilyUser;
import com.budwk.app.zhgh.activity.trainSignUp.models.*;
import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpActivityService;
import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpActivityStatisticsService;
@@ -21,7 +19,6 @@ 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.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@@ -29,7 +26,6 @@ import org.nutz.mvc.annotation.Param;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @Author JyuHsin
@@ -40,8 +36,8 @@ import java.util.concurrent.atomic.AtomicInteger;
@IocBean
@Ok("json:full")
@Api(tags = "品牌活动人员调整")
@At("/platform/trainSingUp/manage/userAdjust")
public class TrainSignUpUserAdjustController {
@At("/platform/trainSingUp/adjust")
public class TrainSignUpAdjustController {
@Inject
private Dao dao;
@@ -53,7 +49,7 @@ public class TrainSignUpUserAdjustController {
private TrainSignUpActivityStatisticsService trainSignUpActivityStatisticsService;
@At("")
@SaCheckPermission("trainSingUp.manage.activity.adjust")
@SaCheckPermission("trainSingUp.adjust")
@Ok("beetl:/platform/zhgh/activity/trainSingUp/userAdjust/index.html")
public void index() {
}
@@ -65,7 +61,7 @@ public class TrainSignUpUserAdjustController {
*/
@At
@ApiOperation("活动列表")
@SaCheckPermission("trainSingUp.manage.activity.adjust")
@SaCheckPermission("trainSingUp.adjust")
public Result activityList(@Param(value = "year") Integer year) {
List<TrainSignUpActivity> activityList = dao.query(TrainSignUpActivity.class, Cnd.NEW().andEX("year", "=", year).andEX("isDisabled", "=", false).desc("activityStartTime"));
return Result.success(activityList);
@@ -73,7 +69,7 @@ public class TrainSignUpUserAdjustController {
@At
@ApiOperation("分页查询")
@SaCheckPermission("trainSingUp.manage.activity.adjust")
@SaCheckPermission("trainSingUp.adjust")
public Result pageData(PageForm pageForm,
@Param(value = "activityId") String activityId) {
Pagination pagination = trainSignUpActivityStatisticsService.pageData(pageForm, activityId);
@@ -82,7 +78,7 @@ public class TrainSignUpUserAdjustController {
@At
@ApiOperation("子活动查询")
@SaCheckPermission("trainSingUp.manage.activity.adjust")
@SaCheckPermission("trainSingUp.adjust")
public Result getCourse(String activityId) {
Sql sql = Sqls.create("""
SELECT
@@ -112,7 +108,7 @@ public class TrainSignUpUserAdjustController {
@At
@ApiOperation("报名用户列表")
@SaCheckPermission("trainSingUp.manage.activity.adjust")
@SaCheckPermission("trainSingUp.adjust")
public Result registerUserList(@Param("courseId") String courseId,
@Param(value = "unionId") String unionId,
@Param(value = "unitId") String unitId,
@@ -124,7 +120,7 @@ public class TrainSignUpUserAdjustController {
@At
@ApiOperation("人员调整")
@SaCheckPermission("trainSingUp.manage.activity.adjust")
@SaCheckPermission("trainSingUp.adjust")
@SLog(tag = "品牌活动-人员调整", msg = "人员调整")
public Result adjust(String activityId, String oldCourseId, String newCourseId, String userId) {
@@ -163,7 +159,7 @@ public class TrainSignUpUserAdjustController {
@At
@ApiOperation("删除报名人员")
@SaCheckPermission("trainSingUp.manage.activity.adjust")
@SaCheckPermission("trainSingUp.adjust")
@SLog(tag = "品牌活动-人员调整", msg = "删除报名人员")
public Result deleteSignUser(String activityId, String courseId, String userId) {
@@ -0,0 +1,428 @@
package com.budwk.app.zhgh.activity.trainSignUp.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.trainSignUp.models.*;
import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpActivityService;
import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpActivityStatisticsService;
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/trainSingUp/apply")
public class TrainSignUpApplyController {
private final ReentrantLock lock = new ReentrantLock(true);
@Inject
private TrainSignUpActivityService trainSignUpActivityService;
@Inject
private SysDictService dictService;
@Inject
private TrainSignUpActivityStatisticsService statisticsService;
@Inject
private Dao dao;
@At("/")
@SaCheckPermission("trainSingUp.apply")
@Ok("beetl:/platform/zhgh/activity/trainSingUp/apply/index.html")
public void index() {
}
@At("/h5")
@SaCheckPermission("h5.trainSingUp.apply")
@Ok("beetl:/platform/zhghh5/activity/trainSignUp/apply/index.html")
public void h5Index() {
}
@At("/list/h5")
@SaCheckPermission("h5.trainSingUp.apply")
@Ok("beetl:/platform/zhghh5/activity/trainSignUp/list/index.html")
public void listIndex() {
}
@At
@ApiOperation("活动查询")
@SaCheckPermission(value = {"trainSingUp.apply", "h5.trainSingUp.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() > activitySignUpStartTime and now() < activitySignUpEndTime"));
}//查询已结束的
else if (activityType == 3) {
cnd.and(new Static("now() > activitySignUpEndTime"));
} else if (activityType == 4) {
cnd.and(new Static("now() < activitySignUpStartTime"));
}
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 train_sign_up_user where userId = '%s')".formatted(SecurityUtil.getUserId())));
}
Pagination pagination = trainSignUpActivityService.listPage(pageForm.getPageNumber(), pageForm.getPageSize(), cnd);
List<TrainSignUpActivity> trainSignUpActivities = pagination.getList();
Map<String, String> trainSignUpTypeMap = dictService.getSubListByCode("TRAIN_SIGNUP_TYPE").stream().collect(Collectors.toMap(Sys_dict::getCode, Sys_dict::getName));
trainSignUpActivities.forEach(v -> v.setTrainType(trainSignUpTypeMap.get(v.getTrainType())));
return Result.success(pagination);
}
@At
@ApiOperation("分活动查询")
@SaCheckPermission(value = {"trainSingUp.apply", "h5.trainSingUp.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
`train_sign_up_course` tsuc
LEFT JOIN train_sign_up_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 train_sign_up_user where userId = '%s')".formatted(SecurityUtil.getUserId())));
}
List<TrainSignUpCourse> courseArray = trainSignUpActivityService.dao().query(TrainSignUpCourse.class, Cnd.where("activityId", "=", activityId));
courseArray = trainSignUpActivityService.filterCourseByHostUnion(courseArray);
cnd.and("tsuc.id", "in", courseArray.stream().map(TrainSignUpCourse::getId).toList());
cnd.asc("tsuc.orderNum");
cnd.asc("type.code");
sql.setCondition(cnd);
Pagination pagination = trainSignUpActivityService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
List<NutMap> courseList = pagination.getList();
courseList.forEach(c -> {
List<TrainSignUpActivityCourse> courseTimes = dao.query(TrainSignUpActivityCourse.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", trainSignUpActivityService.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 = {"trainSingUp.apply", "h5.trainSingUp.apply"}, mode = SaMode.OR)
public Result getCourseTime(String id) {
List<TrainSignUpActivityCourse> list = trainSignUpActivityService.dao().query(TrainSignUpActivityCourse.class, Cnd.where("courseId", "=", id));
return Result.success(list);
}
@At
@ApiOperation("查询分类标识集合")
@SaCheckPermission(value = {"trainSingUp.apply", "h5.trainSingUp.apply"}, mode = SaMode.OR)
public Result queryCourseAssort(String activityId) {
List<TrainSignUpCourse> courseList = trainSignUpActivityService.dao().query(TrainSignUpCourse.class, Cnd.where(TrainSignUpCourse::getActivityId, "=", activityId).asc(TrainSignUpCourse::getOrderNum));
if (Lang.isEmpty(courseList)) {
return Result.success(new ArrayList<>());
}
List<String> assortList = courseList.stream().map(TrainSignUpCourse::getAssort).filter(StrUtil::isNotBlank).toList();
return Result.success(assortList);
}
@At
@ApiOperation("验证是否能报名")
@SaCheckPermission(value = {"trainSingUp.apply", "h5.trainSingUp.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;
TrainSignUpCourse course = dao.fetch(TrainSignUpCourse.class, courseId);
TrainSignUpActivity activity = dao.fetch(TrainSignUpActivity.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 = trainSignUpActivityService.isSignCourseByUser(courseId, SecurityUtil.getUserId());
if (courseByUser) {
return Result.error("抱歉,您已经报名");
}
//判断活动人数
boolean signFull = trainSignUpActivityService.isSignFull(course, currentFamilyNumber);
if (signFull) {
return Result.error("名额剩余数量不足");
}
//判断活动限制
boolean signCourse = trainSignUpActivityService.isSignCourse(course, activity);
if (!signCourse) {
if (activity.getRestrictLimit() != 3) {
return Result.error("您选择的类型已达上限,不能再报该类型的了");
} else {
return Result.error(activity.getActivityName() + "限制报" + activity.getLimitNum() + "个活动,已达上限");
}
}
//判断分工会人数限制
boolean signFullByUnionId = trainSignUpActivityService.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 = {"trainSingUp.apply", "h5.trainSingUp.apply"}, mode = SaMode.OR)
public Result getCourseTimeSelectList(String courseId) {
// 查课程的时间段
List<TrainSignUpActivityCourse> courseList = dao.query(TrainSignUpActivityCourse.class, Cnd.where("courseId", "=", courseId).asc("courseStartTime"));
// 查课程的报名人数
List<TrainSignUpUserCourse> applyUserList = dao.query(TrainSignUpUserCourse.class, Cnd.where("courseId", "=", courseId));
List<TrainSignUpUser> userList = dao.query(TrainSignUpUser.class, Cnd.where("courseId", "=", courseId).and("state", "=", 1));
List<String> idList = userList.stream().map(TrainSignUpUser::getUserId).toList();
applyUserList = applyUserList.stream().filter(o -> idList.contains(o.getUserId())).toList();
// 按照课程下面时间段去分组
Map<String, List<TrainSignUpUserCourse>> collectMap = applyUserList.stream().collect(Collectors.groupingBy(TrainSignUpUserCourse::getActivityCourseId));
List<NutMap> list = courseList.stream().map(v -> {
String id = v.getId();
NutMap nutMap = NutMap.NEW();
List<TrainSignUpUserCourse> trainSignUpUserCourses = collectMap.get(id);
int remainingNum = v.getCourseLimitNum() != null ? v.getCourseLimitNum() : 0;
if (Lang.isNotEmpty(trainSignUpUserCourses)) {
remainingNum = v.getCourseLimitNum() - trainSignUpUserCourses.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 = {"trainSingUp.apply", "h5.trainSingUp.apply"}, mode = SaMode.OR)
public Result validateSourceSignUp(String activityCourseId, String courseId) {
try {
lock.lock();
List<TrainSignUpUser> userList = dao.query(TrainSignUpUser.class, Cnd.where("courseId", "=", courseId).and("state", "=", 1));
List<String> isList = userList.stream().map(TrainSignUpUser::getUserId).toList();
// 该时间段下已报名的人数
int count = dao.count(TrainSignUpUserCourse.class, Cnd.where("activityCourseId", "=", activityCourseId)
.and("courseId", "=", courseId).and("userId", "in", isList));
// 获取该时间段下的活动课程限制报名人数
TrainSignUpActivityCourse course = dao.fetch(TrainSignUpActivityCourse.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 = {"trainSingUp.apply", "h5.trainSingUp.apply"}, mode = SaMode.OR)
@SLog(tag = "品牌活动-活动报名", msg = "活动报名")
public Result doSignUp(TrainSignUpUser trainSignUpUser) {
try {
lock.lock();
boolean courseByUser = trainSignUpActivityService.isSignCourseByUser(trainSignUpUser.getCourseId(), SecurityUtil.getUserId());
if (courseByUser) {
return Result.error("您已报过该活动");
}
//判断人数
int number = 0;
TrainSignUpCourse course = trainSignUpActivityService.dao().fetch(TrainSignUpCourse.class, trainSignUpUser.getCourseId());
TrainSignUpType type = trainSignUpActivityService.dao().fetch(TrainSignUpType.class, course.getCourseType());
if (type != null) {
if (type.getIsBringFamily() && type.getIsAddFamily()) {
List<NutMap> mobileColumnsValue = trainSignUpUser.getMobileColumnsValue();
NutMap map = mobileColumnsValue.stream().filter(o -> "xdqsrs".equals(o.getString("columnCode"))).findAny().orElse(null);
number = map != null ? map.getInt("columnValue") : 0;
}
}
boolean signFull = trainSignUpActivityService.isSignFull(course, number);
if (signFull) {
return Result.error("当前报名人数已满");
}
boolean signFullByUnionId = trainSignUpActivityService.isSignFullByUnionId(course, number);
if (signFullByUnionId) {
return Result.error("该活动您所在的分工会名额不足");
}
trainSignUpActivityService.doSignUp(trainSignUpUser);
return Result.success("报名成功");
} catch (Exception e) {
e.printStackTrace();
return Result.success("报名失败");
} finally {
lock.unlock();
}
}
@At
@ApiOperation("取消报名")
@SaCheckPermission(value = {"trainSingUp.apply", "h5.trainSingUp.apply"}, mode = SaMode.OR)
@SLog(tag = "品牌活动-活动报名", msg = "取消报名")
public Result cancelSignUp(@Param("activityId") String activityId, @Param("courseId") String courseId) {
String userId = SecurityUtil.getUserId();
//取消分两种情况
//第一种没有设置分工会人数限制,那么将候补的人按时间倒叙往上补
//第二种如果设置了分工会人数限制,那么只将本分工会的候补人员按照时间倒叙往上补,如果本分工会没有候补人员,则名额空出来,由校工会手动调整
TrainSignUpCourse course = dao.fetch(TrainSignUpCourse.class, courseId);
TrainSignUpType type = dao.fetch(TrainSignUpType.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<TrainSignUpUser> signUpUsers = dao.query(TrainSignUpUser.class, cnd);
int thisSignUpUserCount = dao.count(TrainSignUpUser.class,
Cnd.where("activityId", "=", activityId)
.and("courseId", "=", courseId).and("userId", "=", userId)
.and("state", "in", List.of(1, 3)));
if (!signUpUsers.isEmpty() && thisSignUpUserCount > 0) {
TrainSignUpUser trainSignUpUser = signUpUsers.get(0);
trainSignUpUser.setState(1);
dao.update(trainSignUpUser);
Sys_user user = dao.fetch(Sys_user.class, trainSignUpUser.getUserId());
//msgApi.sendTextMsg("【" + activity.getActivityName() + "】已候补成功,请按时参加活动!", user.getLoginname());
}
}
//删除报名记录
dao.clear("train_sign_up_user_course", Cnd.where("activityId", "=", activityId)
.and("courseId", "=", courseId).and("userId", "=", userId));
dao.clear("train_sign_up_user", Cnd.where("activityId", "=", activityId)
.and("courseId", "=", courseId).and("userId", "=", userId));
return Result.success();
}
}
@@ -15,9 +15,10 @@ 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.json.Json;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@@ -39,8 +40,8 @@ import java.util.stream.Collectors;
@IocBean
@Ok("json:full")
@Api(tags = "活动管理")
@At("/platform/trainSingUp/manage/activity")
public class TrainSignUpActivityController {
@At("/platform/trainSingUp/manage")
public class TrainSignUpManageController {
@Inject
private TrainSignUpActivityService trainSignUpActivityManageService;
@@ -48,14 +49,14 @@ public class TrainSignUpActivityController {
private Dao dao;
@At("")
@SaCheckPermission("trainSingUp.manage.activity")
@SaCheckPermission("trainSingUp.manage")
@Ok("beetl:/platform/zhgh/activity/trainSingUp/manage/index.html")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("trainSingUp.manage.activity")
@SaCheckPermission("trainSingUp.manage")
public Result pageData(PageForm pageForm,
@Param(value = "year") Integer year,
@Param(value = "activityName") String activityName) {
@@ -68,7 +69,7 @@ public class TrainSignUpActivityController {
@At
@ApiOperation("活动删除")
@SaCheckPermission("trainSingUp.manage.activity")
@SaCheckPermission("trainSingUp.manage")
@SLog(tag = "品牌活动-活动管理", msg = "删除活动")
public Result onDelete(String id) {
Trans.exec(() -> {
@@ -86,7 +87,7 @@ public class TrainSignUpActivityController {
@At
@ApiOperation("活动状态变更")
@SaCheckPermission("trainSingUp.manage.activity")
@SaCheckPermission("trainSingUp.manage")
public Result activityStatusChange(TrainSignUpActivity activity) {
trainSignUpActivityManageService.updateActivityStatus(activity);
dao.update(Sys_home_activity.class,
@@ -97,7 +98,7 @@ public class TrainSignUpActivityController {
@At
@ApiOperation("查询单个活动")
@SaCheckPermission("trainSingUp.manage.activity")
@SaCheckPermission("trainSingUp.manage")
public Result findOne(@Param("id") @NotNull String id) {
NutMap dataMap = trainSignUpActivityManageService.findOne(id, null, "");
String activityStartTime = dataMap.getString("activityStartTime");
@@ -142,4 +143,58 @@ public class TrainSignUpActivityController {
return Result.success().addData(dataMap);
}
@At
@Ok("json:full")
@ApiOperation("品牌活动新增/修改")
@SaCheckPermission("trainSingUp.manage")
@SLog(tag = "品牌活动-活动管理", msg = "新增/修改活动")
public Result doHandle(TrainSignUpActivity activity) {
if (StrUtil.isBlank(activity.getId())) {
trainSignUpActivityManageService.add(activity, null);
} else {
trainSignUpActivityManageService.edit(activity);
}
return Result.success();
}
@At
@Ok("json:full")
@ApiOperation("获取分工会人数限制")
@SaCheckPermission("trainSingUp.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 = trainSignUpActivityManageService.listMap(sql);
return Result.success().addData(list);
}
@At
@Ok("json:full")
@ApiOperation("获取报名人员数量")
@SaCheckPermission("trainSingUp.manage")
public Result getRegisterUserCount(@Param(value = "courseId") String courseId) {
return Result.success().addData(dao.count(TrainSignUpUser.class, Cnd.where("courseId", "=", courseId)));
}
@At
@Ok("json:full")
@ApiOperation("获取历史活动列表")
@SaCheckPermission("trainSingUp.manage")
public Result getHistoricalActList() {
List<TrainSignUpActivity> query = dao.query(TrainSignUpActivity.class, Cnd.NEW().desc("activityStartTime"));
return Result.success().addData(query);
}
}
@@ -42,7 +42,7 @@ import java.util.List;
@IocBean
@Ok("json:full")
@Api(tags = "活动类型管理")
@At("/platform/trainSingUp/manage/type")
@At("/platform/trainSingUp/type")
public class TrainSignUpTypeController {
@Inject
@@ -51,14 +51,14 @@ public class TrainSignUpTypeController {
private BaseService baseService;
@At("")
@SaCheckPermission("trainSingUp.manage.type")
@SaCheckPermission("trainSingUp.type")
@Ok("beetl:/platform/zhgh/activity/trainSingUp/type/index.html")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("trainSingUp.manage.type")
@SaCheckPermission("trainSingUp.type")
public Result pageData(PageForm pageForm,
@Param(value = "typeName") String typeName) {
Cnd cnd = Cnd.NEW();
@@ -89,7 +89,7 @@ public class TrainSignUpTypeController {
@At
@ApiOperation("活动类型新增")
@SaCheckPermission("trainSingUp.manage.type")
@SaCheckPermission("trainSingUp.type")
@SLog(tag = "品牌活动-类型管理", msg = "活动类型新增")
public Result doAdd(@Param("data") String data) throws Exception {
TrainSignUpType type = Json.fromJson(TrainSignUpType.class, data);
@@ -105,7 +105,7 @@ public class TrainSignUpTypeController {
@At
@ApiOperation("活动类型修改")
@SaCheckPermission("trainSingUp.manage.type")
@SaCheckPermission("trainSingUp.type")
@SLog(tag = "品牌活动-类型管理", msg = "活动类型修改")
public Result doEdit(TrainSignUpType type) {
int count = dao.count(TrainSignUpType.class, Cnd.where("code", "=", type.getCode()).and("id", "!=", type.getId()));
@@ -120,7 +120,7 @@ public class TrainSignUpTypeController {
@At
@ApiOperation("活动类型删除")
@SaCheckPermission("trainSingUp.manage.type")
@SaCheckPermission("trainSingUp.type")
@SLog(tag = "品牌活动-类型管理", msg = "活动类型删除")
public Object doDelete(@Param(value = "id") String id) {
dao.clear(TrainSignUpType.class, Cnd.where("id", "=", id));
@@ -131,7 +131,7 @@ public class TrainSignUpTypeController {
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("排序号变更")
@SaCheckPermission("trainSingUp.manage.type")
@SaCheckPermission("trainSingUp.type")
public Object xhChange(String id, Integer xh, boolean toDown) {
if (toDown) {
TrainSignUpType next = dao.fetch(TrainSignUpType.class, Cnd.where("xh", "=", xh + 1));
@@ -158,7 +158,7 @@ public class TrainSignUpTypeController {
@At
@ApiOperation("自定义表单字段类型")
@SaCheckPermission("trainSingUp.manage.type")
@SaCheckPermission("trainSingUp.type")
public Result getColumnType() {
List<String> names = EnumUtil.getNames(ColType.class);
names.add("JSON");
@@ -46,7 +46,7 @@ import java.util.stream.Collectors;
@Ok("json:full")
@Api(tags = "亲子活动人员黑名单")
@At("/platform/trainSingUp/userManage")
public class TrainSignUpUserBlackListManageController {
public class TrainSignUpUserManageController {
@Inject
private Dao dao;
@@ -54,14 +54,14 @@ public class TrainSignUpUserBlackListManageController {
private TrainSignUpBlackListService trainSignUpBlackListService;
@At("")
@SaCheckPermission("trainSingUp.user.activity")
@SaCheckPermission("trainSingUp.userManage")
@Ok("beetl:/platform/zhgh/activity/trainSingUp/userManage/index.html")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("trainSingUp.user.activity")
@SaCheckPermission("trainSingUp.userManage")
public Result pageData(PageForm pageForm,
@Param(value = "activityId") String activityId,
@Param(value = "courseId") String courseId,
@@ -85,7 +85,7 @@ public class TrainSignUpUserBlackListManageController {
@At
@ApiOperation("报名人员处理")
@SaCheckPermission("trainSingUp.user.activity")
@SaCheckPermission("trainSingUp.userManage")
@SLog(tag = "品牌活动-人员管理", msg = "报名人员处理")
public Result doHandleUser(@Param("userId") String userId) {
trainSignUpBlackListService.doHandleUser(userId);
@@ -94,7 +94,7 @@ public class TrainSignUpUserBlackListManageController {
@At
@ApiOperation("根据活动Id获取子活动")
@SaCheckPermission("trainSingUp.user.activity")
@SaCheckPermission("trainSingUp.userManage")
public Result getCourseByActivityId(@Param("activityId") String activityId) {
List<TrainSignUpCourse> list = dao.query(TrainSignUpCourse.class, Cnd.where("activityId", "=", activityId));
return Result.success(list);
@@ -102,7 +102,7 @@ public class TrainSignUpUserBlackListManageController {
@At
@ApiOperation("获取子活动具体时间")
@SaCheckPermission("trainSingUp.user.activity")
@SaCheckPermission("trainSingUp.userManage")
public Result attendClassRecord(String userId) {
trainSignUpBlackListService.attendClassRecord(userId);
return Result.success();
@@ -110,7 +110,7 @@ public class TrainSignUpUserBlackListManageController {
@At
@ApiOperation("获取候补人员")
@SaCheckPermission("trainSingUp.user.activity")
@SaCheckPermission("trainSingUp.userManage")
public Result getReserveUser(String courseId) {
Sql sql = Sqls.create("""
SELECT
@@ -131,7 +131,7 @@ public class TrainSignUpUserBlackListManageController {
@At
@ApiOperation("补充人员")
@SaCheckPermission("trainSingUp.user.activity")
@SaCheckPermission("trainSingUp.userManage")
@SLog(tag = "品牌活动-人员管理", msg = "补充人员")
public Result reserveSingUp(String[] ids, String courseId) {
//先查询这个课程有多少个未签到的人员
@@ -0,0 +1,143 @@
package com.budwk.app.zhgh.activity.trainSignUp.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.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
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 org.nutz.mvc.annotation.Param;
import java.util.Date;
import java.util.List;
/**
* @ClassName TrainsignUpMineController
* @Author JyuHsin
* @Date 2025/9/13 16:56
* @Version 1.0
* @Description TODO
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "活动报名")
@At("/platform/trainSingUp/mine")
public class TrainsignUpMineController {
@Inject
private Dao dao;
@Inject
private TrainSignUpActivityService activityService;
@At("/")
@SaCheckPermission("trainSingUp.mine")
@Ok("beetl:/platform/zhgh/activity/trainSingUp/mine/index.html")
public void index() {
}
@At("/h5")
@SaCheckPermission("h5.trainSingUp.mine")
@Ok("beetl:/platform/zhghh5/activity/trainSignUp/mine/index.html")
public void h5Index() {
}
@At
@ApiOperation("主动扫码签到")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"trainSingUp.mine", "h5.trainSingUp.mine"}, mode = SaMode.OR)
@SLog(tag = "品牌活动-活动签到", msg = "主动扫码签到")
public Result drivingScan(String courseId) {
// 主动扫码签到是用户自己打开扫一扫,扫二维码签到
int count = dao.count(TrainSignUpUserCourse.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");
TrainSignUpUserCourse userCourse = dao.fetch(
TrainSignUpUserCourse.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 = {"trainSingUp.mine", "h5.trainSingUp.mine"}, mode = SaMode.OR)
@SLog(tag = "品牌活动-活动签到", msg = "被动扫码签到")
public Result passiveScan(String id) {
// id表示课程的某个时间段,userId表示是谁出示的二维码
TrainSignUpUserCourse userCourse = dao.fetch(TrainSignUpUserCourse.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 = {"trainSingUp.mine", "h5.trainSingUp.mine"}, mode = SaMode.OR)
public Result queryCourseSign(String courseId) {
Sql sql = Sqls.create("""
SELECT
uc.*,
date(uc.courseStartTime) as courseDate
FROM
`train_sign_up_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);
}
}
@@ -1,375 +0,0 @@
package com.budwk.app.zhgh.activity.trainSignUp.controller.mobile;
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.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_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.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.trainSignUp.models.*;
import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpActivityService;
import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpActivityStatisticsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
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.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.*;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletionException;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
/**
* @author zxy
* @Description TODO
* @createTime 2022年02月25日 13:44:00
*/
@IocBean
@Ok("json:full")
@Api(tags = "亲子活动移动端")
@At("/platform/mobile/trainSignUpActivity")
public class MTrainSignUpActivityController {
private static final String REDIS_KEY_PREFIX = "m_train_sign_up_activity";
private final ReentrantLock lock = new ReentrantLock(true);
@Inject
private Dao dao;
@Inject
private TrainSignUpActivityService trainSignUpActivityService;
@Inject
private RedisService redisService;
@Inject
private TrainSignUpActivityStatisticsService statisticsService;
@At("/trainList")
@Ok("beetl:/platform/zhghh5/activity/trainSignUp/trainList/index.html")
@SaCheckPermission("h5.trainSignUp.sign")
public void trainList() {
}
@At("/trainInfo")
@Ok("beetl:/platform/zhghh5/activity/trainSignUp/trainInfo/index.html")
@SaCheckPermission("h5.trainSignUp.sign")
public void trainInfo() {
}
@At("/activityInfo")
@Ok("beetl:/platform/zhghh5/activity/trainSignUp/activityInfo/index.html")
@SaCheckPermission("h5.trainSignUp.sign")
public void activityInfo() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("h5.trainSignUp.sign")
public Result pageData(PageForm pageForm,
@Param(value = "activityStatus") int activityStatus,
@Param(value = "year") Integer year,
@Param(value = "activityType") Integer activityType) {
Pagination pagination = trainSignUpActivityService.mPageData(pageForm, year, activityStatus, activityType);
return Result.success(pagination);
}
/**
* @param id 活动id
* @param tabIndex 0全部 1我的
* @return
*/
@At
@ApiOperation("查询单个活动")
@SaCheckPermission("h5.trainSignUp.sign")
public Result findOne(@Param("id") String id,
@Param(value = "tabIndex") Integer tabIndex,
@Param(value = "fromMode") String fromMode) {
Cnd cnd = Cnd.NEW();
if (tabIndex > 0) {
List<TrainSignUpUser> mySignCourseList = dao.query(TrainSignUpUser.class, Cnd.where("userId", "=", SecurityUtil.getUserId()).and("activityId", "=", id));
List<String> mySignCourseIdList = mySignCourseList.stream().map(TrainSignUpUser::getCourseId).collect(Collectors.toList());
cnd.and("id", "in", mySignCourseIdList);
}
NutMap nutMap = trainSignUpActivityService.findOne(id, cnd, fromMode);
List<TrainSignUpCourse> courseList = nutMap.getAsList("courseList", TrainSignUpCourse.class);
courseList.forEach(v -> {
if (v.getCourseIsLimitApply() != null && v.getCourseIsLimitApply() && v.getIsSign()) {
TrainSignUpActivityCourse course = dao.fetch(TrainSignUpActivityCourse.class, Cnd.where("courseId", "=", v.getId()));
v.setCourseTimeName(DateUtil.format(course.getCourseStartTime(), "HH:mm") + "" + DateUtil.format(course.getCourseEndTime(), "HH:mm") + "");
}
});
return Result.success(nutMap);
}
@At
@ApiOperation("查询子活动时间段")
@SaCheckPermission("h5.trainSignUp.sign")
public Object getCourseTimeSelectList(String courseId) {
// 查课程的时间段
List<TrainSignUpActivityCourse> courseList = dao.query(TrainSignUpActivityCourse.class, Cnd.where("courseId", "=", courseId));
// 查课程的报名人数
List<TrainSignUpUserCourse> applyUserList = dao.query(TrainSignUpUserCourse.class, Cnd.where("courseId", "=", courseId));
// 按照课程下面时间段去分组
Map<String, List<TrainSignUpUserCourse>> collectMap = applyUserList.stream().collect(Collectors.groupingBy(TrainSignUpUserCourse::getActivityCourseId));
List<NutMap> list = courseList.stream().map(v -> {
String id = v.getId();
NutMap nutMap = NutMap.NEW();
List<TrainSignUpUserCourse> trainSignUpUserCourses = collectMap.get(id);
int remainingNum = v.getCourseLimitNum() != null ? v.getCourseLimitNum() : 0;
if (Lang.isNotEmpty(trainSignUpUserCourses)) {
remainingNum = v.getCourseLimitNum() - trainSignUpUserCourses.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);
return nutMap;
}).filter(v-> v.getInt("remainingNum") != 0).toList();
return Result.success(list);
}
@At
@ApiOperation("活动报名")
@SaCheckPermission("h5.trainSignUp.sign")
@SLog(tag = "品牌活动-活动报名", msg = "活动报名")
public Result doSignUp(TrainSignUpUser trainSignUpUser) {
try {
lock.lock();
boolean courseByUser = trainSignUpActivityService.isSignCourseByUser(trainSignUpUser.getCourseId(), SecurityUtil.getUserId());
if(courseByUser) {
return Result.error("您已报过该活动");
}
//判断人数
int number = 0;
TrainSignUpCourse course = trainSignUpActivityService.dao().fetch(TrainSignUpCourse.class, trainSignUpUser.getCourseId());
TrainSignUpType type = trainSignUpActivityService.dao().fetch(TrainSignUpType.class, course.getCourseType());
if(type != null) {
if(type.getIsBringFamily() && type.getIsAddFamily()) {
List<NutMap> mobileColumnsValue = trainSignUpUser.getMobileColumnsValue();
NutMap map = mobileColumnsValue.stream().filter(o -> "xdqsrs".equals(o.getString("columnCode"))).findAny().orElse(null);
number = map != null ? map.getInt("columnValue") : 0;
}
}
boolean signFull = trainSignUpActivityService.isSignFull(course, number);
if(signFull) {
return Result.error("当前报名人数已满");
}
boolean signFullByUnionId = trainSignUpActivityService.isSignFullByUnionId(course, number);
if(signFullByUnionId) {
return Result.error("该活动您所在的分工会名额不足");
}
trainSignUpActivityService.doSignUp(trainSignUpUser);
return Result.success("报名成功");
} catch (Exception e) {
e.printStackTrace();
return Result.success("报名失败");
} finally {
lock.unlock();
}
}
@At
@ApiOperation("取消报名")
@SaCheckPermission("h5.trainSignUp.sign")
@SLog(tag = "品牌活动-活动报名", msg = "取消报名")
public Result cancelSignUp(@Param("activityId") String activityId, @Param("courseId") String courseId) {
String userId = SecurityUtil.getUserId();
//取消分两种情况
//第一种没有设置分工会人数限制,那么将候补的人按时间倒叙往上补
//第二种如果设置了分工会人数限制,那么只将本分工会的候补人员按照时间倒叙往上补,如果本分工会没有候补人员,则名额空出来,由校工会手动调整
TrainSignUpActivity activity = dao.fetch(TrainSignUpActivity.class, activityId);
TrainSignUpCourse course = dao.fetch(TrainSignUpCourse.class, courseId);
TrainSignUpType type = dao.fetch(TrainSignUpType.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<TrainSignUpUser> signUpUsers = dao.query(TrainSignUpUser.class, cnd);
int thisSignUpUserCount = dao.count(TrainSignUpUser.class,
Cnd.where("activityId", "=", activityId)
.and("courseId", "=", courseId).and("userId", "=", userId)
.and("state", "in", List.of(1, 3)));
if (!signUpUsers.isEmpty() && thisSignUpUserCount > 0) {
TrainSignUpUser trainSignUpUser = signUpUsers.get(0);
trainSignUpUser.setState(1);
dao.update(trainSignUpUser);
Sys_user user = dao.fetch(Sys_user.class, trainSignUpUser.getUserId());
//msgApi.sendTextMsg("【" + activity.getActivityName() + "】已候补成功,请按时参加活动!", user.getLoginname());
}
}
//删除报名记录
dao.clear("train_sign_up_user_course", Cnd.where("activityId", "=", activityId)
.and("courseId", "=", courseId).and("userId", "=", userId));
dao.clear("train_sign_up_user", Cnd.where("activityId", "=", activityId)
.and("courseId", "=", courseId).and("userId", "=", userId));
return Result.success();
}
@At
@ApiOperation("签到")
@SaCheckPermission("h5.trainSignUp.sign")
@SLog(tag = "品牌活动-活动报名", msg = "签到")
public Result doQd(@Param("id") String id, @Param("courseId") String courseId, @Param("point") Double[] points) {
TrainSignUpCourse course = dao.fetch(TrainSignUpCourse.class, courseId);
List<Double> coursePoints = course.getCourseLocationCoordinates();
// if (Lang.isNotEmpty(coursePoints)) {
// //需要签到
// if (ArrayUtil.isEmpty(points) || ArrayUtil.hasNull(points)) {
// return Result.error().addMsg("请获取当前的坐标信息");
// }
// Double[] coursePointArray = coursePoints.toArray(new Double[]{});
// float distance = AMapUtils.calculateLineDistance(new LatLng(points[0], points[1]), new LatLng(coursePointArray[0], coursePointArray[1]));
//
// if (distance > 500) {
// return Result.error().addMsg("请到签到点位附近签到");
// }
// }
trainSignUpActivityService.doQd(id);
return Result.success();
}
/**
* 签到信息
*
* @param activityId
* @return
*/
@At
@ApiOperation("获取签到信息")
@SaCheckPermission("h5.trainSignUp.sign")
public Result getQdInfoList(@Param("activityId") String activityId) {
List<NutMap> list = trainSignUpActivityService.qdInfoByUserId(SecurityUtil.getUserId(), activityId);
return Result.success(list);
}
@At
@ApiOperation("验证是否能报名")
@SaCheckPermission("h5.trainSignUp.sign")
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;
TrainSignUpCourse course = dao.fetch(TrainSignUpCourse.class, courseId);
TrainSignUpActivity activity = dao.fetch(TrainSignUpActivity.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 = trainSignUpActivityService.isSignCourseByUser(courseId, SecurityUtil.getUserId());
if(courseByUser) {
return Result.error("抱歉,您已经报名");
}
//判断活动人数
boolean signFull = trainSignUpActivityService.isSignFull(course, currentFamilyNumber);
if(signFull) {
return Result.error("名额剩余数量不足");
}
//判断活动限制
boolean signCourse = trainSignUpActivityService.isSignCourse(course, activity);
if(!signCourse) {
if(activity.getRestrictLimit() != 3) {
return Result.error("您选择的类型已达上限,不能再报该类型的了");
} else {
return Result.error(activity.getActivityName() + "限制报" + activity.getLimitNum() + "个活动,已达上限");
}
}
//判断分工会人数限制
boolean signFullByUnionId = trainSignUpActivityService.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("h5.trainSignUp.sign")
public Object validateSourceSignUp(String activityCourseId, String courseId) {
try {
lock.lock();
// 该时间段下已报名的人数
int count = dao.count(TrainSignUpUserCourse.class, Cnd.where("activityCourseId", "=", activityCourseId)
.and("courseId", "=", courseId));
// 获取改时间段下的活动课程限制报名人数
TrainSignUpActivityCourse course = dao.fetch(TrainSignUpActivityCourse.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("h5.trainSignUp.sign")
@SLog(tag = "品牌活动-活动报名", msg = "二维码签到")
public Result codeSign(String id, String codeCourseId, String clickCourseId) {
if(StrUtil.isBlank(codeCourseId) || StrUtil.isBlank(clickCourseId)) {
return Result.error("签到失败,没有获取到扫描信息");
}
if(!codeCourseId.equals(clickCourseId)) {
return Result.error("签到失败,二维码与您当前签到信息不符");
}
dao.update(TrainSignUpUserCourse.class, Chain.make("isAttend", true)
.add("attendTime", new Date()), Cnd.where("id", "=", id));
return Result.success();
}
}
@@ -1,217 +0,0 @@
package com.budwk.app.zhgh.activity.trainSignUp.controller.mobile;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpActivityService;
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.dao.util.Daos;
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.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
/**
* 品牌活动扫码
*/
@IocBean
@At("/platform/mobile/trainSignUpActivityScannerQrCode")
@Ok("json:full")
@Slf4j
public class MTrainSignUpActivityScannerQrCodeController {
/*@Inject
private WxTokenUtil;
@Inject
private TrainSignUpActivityService trainSignUpActivityService;
@Inject
private Dao dao;
@At("")
@Ok("beetl:/mobile/scannerQrCode.html")
public void scannerQrCode() {
}
*//**
* 微信js验证
*
* @param url
* @return
*//*
@At("/auth/sign")
@ViReturn
@RequiresAuthentication
public Object wxAuthSign(String url) {
String jsapi_ticket = wxTokenUtil.jsTicket();
return sign(jsapi_ticket, url);
}
*//**
* 二维码信息
*
* @param userId 用户id
* @param signId 签到记录id
* @param activityId 活动id
* @return
*//*
@At("/qrCodeInfo")
@RequiresAuthentication
public Object qrCodeInfo(@Param("userId") String userId, @Param("signId") String signId, @Param("activityId") String activityId) {
if (StrUtil.isBlank(userId) || StrUtil.isBlank(signId) || StrUtil.isBlank(activityId)) {
return Result.error("参数错误");
}
try {
// Sql activitySql = Sqls.create("select activityName,cover from train_sign_up_activity where id = @activityId");
// activitySql.setParam("activityId",activityId);
// NutMap activityMap = (NutMap) Daos.query(dao, activitySql.toString(), Sqls.callback.map());
Sql signSql = Sqls.create("select isAttend,attendTime,isReceive,receiveTime from train_sign_up_user_course where id = @signId");
signSql.setParam("signId", signId);
NutMap attendInfo = (NutMap) Daos.query(dao, signSql.toString(), Sqls.callback.map());
Sql userSql = Sqls.create("select id,username,loginname,unitname,unionname,sex from `user` where id = @userId");
userSql.setParam("userId", userId);
NutMap userMap = (NutMap) Daos.query(dao, userSql.toString(), Sqls.callback.map());
return Result.success(Map.of("signInfo", attendInfo, "userInfo", userMap));
} catch (Exception e) {
log.error(e.getMessage());
return Result.error("获取信息失败");
}
}
@At("/signInfo")
@RequiresAuthentication
public Object signInfo(@Param("signId") String signId) {
if (StrUtil.isBlank(signId)) {
return Result.error("参数错误");
}
try {
Sql signSql = Sqls.create("select isAttend,attendTime from train_sign_up_user_course where id = @signId");
signSql.setParam("signId", signId);
NutMap signInfo = trainSignUpActivityService.fetch(signSql);
return Result.success(signInfo);
} catch (Exception e) {
log.error(e.getMessage());
return Result.error("获取信息失败");
}
}
*//**
* 发放礼品
*
* @param signId
* @return
*//*
@At("/grantGiftByQrCode")
@RequiresAuthentication
public Object grantGiftByQrCode(@Param("signId") String signId) {
if (StrUtil.isBlank(signId)) {
return Result.error("参数错误");
}
try {
Chain chain = Chain.make("isReceive", 1);
chain.add("receiveTime", new Date());
chain.add("giftScannerCodeUserId", ShiroUtil.getPrincipalProperty("id"));
dao.update(TrainSignUpUserCourse.class, chain, Cnd.where("id", "=", signId));
Sql signSql = Sqls.create("select isAttend,attendTime,isReceive,receiveTime from train_sign_up_user_course where id = @signId");
signSql.setParam("signId", signId);
NutMap signInfo = trainSignUpActivityService.fetch(signSql);
return Result.success(signInfo);
} catch (Exception e) {
log.error(e.getMessage());
return Result.error("获取信息失败");
}
}
*//**
* 二维码扫描确认签到
*
* @param signId
* @return
*//*
@At("/confirmSignByQrCode")
@RequiresAuthentication
public Object confirmSignByQrCode(@Param("signId") String signId) {
if (StrUtil.isBlank(signId)) {
return Result.error("参数错误");
}
try {
Chain chain = Chain.make("isAttend", 1);
chain.add("attendTime", new Date());
chain.add("signScannerCodeUserId", ShiroUtil.getPrincipalProperty("id"));
dao.update(TrainSignUpUserCourse.class, chain, Cnd.where("id", "=", signId));
Sql signSql = Sqls.create("select isAttend,attendTime,isReceive,receiveTime from train_sign_up_user_course where id = @signId");
signSql.setParam("signId", signId);
NutMap signInfo = trainSignUpActivityService.fetch(signSql);
return Result.success(signInfo);
} catch (Exception e) {
log.error(e.getMessage());
return Result.error("获取信息失败");
}
}
public static Map<String, String> sign(String jsapi_ticket, String url) {
Map<String, String> ret = new HashMap<String, String>();
String nonce_str = create_nonce_str();
String timestamp = create_timestamp();
String string1;
String signature = "";
//注意这里参数名必须全部小写,且必须有序
string1 = "jsapi_ticket=" + jsapi_ticket +
"&noncestr=" + nonce_str +
"&timestamp=" + timestamp +
"&url=" + url;
System.out.println(string1);
try {
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(string1.getBytes("UTF-8"));
signature = byteToHex(crypt.digest());
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
e.printStackTrace();
}
ret.put("url", url);
ret.put("jsapi_ticket", jsapi_ticket);
ret.put("nonceStr", nonce_str);
ret.put("timestamp", timestamp);
ret.put("signature", signature);
return ret;
}
private static String byteToHex(final byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash) {
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
private static String create_nonce_str() {
return UUID.randomUUID().toString();
}
private static String create_timestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
}*/
}
@@ -60,7 +60,7 @@ import java.util.zip.ZipOutputStream;
@IocBean
@Ok("json:full")
@Api(tags = "品牌活动统计")
@At("/platform/trainSingUp/statistics/activity")
@At("/platform/trainSingUp/statistics")
public class TrainSignUpActivityStatisticsController {
@Inject
@@ -71,14 +71,14 @@ public class TrainSignUpActivityStatisticsController {
private Dao dao;
@At("")
@SaCheckPermission("trainSingUp.statistics.activity")
@SaCheckPermission("trainSingUp.statistics")
@Ok("beetl:/platform/zhgh/activity/trainSingUp/statistics/index.html")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("trainSingUp.statistics.activity")
@SaCheckPermission("trainSingUp.statistics")
public Result pageData(PageForm pageForm,
@Param(value = "activityId") String activityId) {
Pagination pagination = trainSignUpActivityStatisticsService.pageData(pageForm, activityId);
@@ -93,7 +93,7 @@ public class TrainSignUpActivityStatisticsController {
*/
@At
@ApiOperation("活动列表")
@SaCheckPermission("trainSingUp.statistics.activity")
@SaCheckPermission("trainSingUp.statistics")
public Result activityList(@Param(value = "year") Integer year) {
List<TrainSignUpActivity> list = dao.query(TrainSignUpActivity.class, Cnd.NEW().andEX("year", "=", year).desc("activityStartTime"));
return Result.success(list);
@@ -107,14 +107,14 @@ public class TrainSignUpActivityStatisticsController {
*/
@At
@ApiOperation("报名人员列表")
@SaCheckPermission("trainSingUp.statistics.activity")
@SaCheckPermission("trainSingUp.statistics")
public Result registerUserList(@Param(value = "courseId") String courseId) {
return Result.success(trainSignUpActivityStatisticsService.registerUserList(courseId));
}
@At
@ApiOperation("报名动态列")
@SaCheckPermission("trainSingUp.statistics.activity")
@SaCheckPermission("trainSingUp.statistics")
public Object getTaleColumnInfo(@Param(value = "courseId") String courseId) {
return Result.success(trainSignUpActivityStatisticsService.getTaleColumnInfo(courseId));
}
@@ -127,14 +127,14 @@ public class TrainSignUpActivityStatisticsController {
*/
@At
@ApiOperation("获取签到信息")
@SaCheckPermission("trainSingUp.statistics.activity")
@SaCheckPermission("trainSingUp.statistics")
public Result getSignInfo(@Param("courseId") String courseId) {
return Result.success(trainSignUpActivityStatisticsService.getSignInfo(courseId));
}
@At
@ApiOperation("开放报名")
@SaCheckPermission("trainSingUp.statistics.activity")
@SaCheckPermission("trainSingUp.statistics")
public Result signChange(@Param("courseId") String courseId, @Param("openOtherUnion") Boolean openOtherUnion) {
dao.update(TrainSignUpCourse.class, Chain.make("openOtherUnion", openOtherUnion)
, Cnd.where("id", "=", courseId));
@@ -144,7 +144,7 @@ public class TrainSignUpActivityStatisticsController {
@At
@Ok("void")
@ApiOperation("导出签到名单")
@SaCheckPermission("trainSingUp.statistics.activity")
@SaCheckPermission("trainSingUp.statistics")
public void exportSignUser(@Param(value = "activityId") String activityId,
HttpServletResponse response) throws IOException {
try {
@@ -122,8 +122,8 @@ public class TrainSignUpActivity extends BaseModel implements Serializable, SysH
sysHomeActivity.setId(this.getId());
sysHomeActivity.setName(this.getActivityName());
sysHomeActivity.setCover(this.getCover());
sysHomeActivity.setUrl("/platform/trainSingUp/manage/apply");
sysHomeActivity.setH5Url("/platform/mobile/trainSignUpActivity/trainList");
sysHomeActivity.setUrl("/platform/trainSingUp/apply");
sysHomeActivity.setH5Url("/platform/trainSingUp/apply/h5?id=" + this.getId());
if (Lang.isNotEmpty(this.getActivitySignUpStartTime())) {
sysHomeActivity.setStartDate(this.getActivitySignUpStartTime());
sysHomeActivity.setEndDate(this.getActivitySignUpEndTime());
@@ -80,6 +80,11 @@ public class TrainSignUpCourse extends BaseModel implements Serializable {
@Comment("序号")
private int orderNum;
@Column
@ColDefine(customType = "longtext")
@Comment("详细信息")
private String introduce;
@Many(field = "courseId")
private List<TrainSignUpActivityCourse> courseTimeList;
@@ -18,12 +18,15 @@ import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessInstanceStateEnum;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.sys.models.Sys_user_role;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.meeting.model.MeetingInfo;
import com.budwk.app.zhgh.dayofficework.meeting.model.MeetingTimePeriod;
import com.budwk.app.zhgh.dayofficework.meeting.model.MeetingTimePeriodUser;
import com.budwk.app.zhgh.dayofficework.meeting.model.MeetingType;
import com.budwk.app.zhgh.dayofficework.meeting.service.MeetingInfoService;
import com.budwk.app.zhgh.democratic.teachercongress.delegate.models.Teacher_congress_delegate;
import com.budwk.app.zhgh.democratic.teachercongress.delegation.models.Teacher_congress_delegation;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@@ -156,12 +159,23 @@ public class MeetingMineController {
MeetingInfo info = dao.fetch(MeetingInfo.class, user.getMeetingId());
MeetingType meetingType = dao.fetch(MeetingType.class, info.getTypeId());
// 是不是代表
Teacher_congress_delegate delegate = dao.fetch(
Teacher_congress_delegate.class,
Cnd.where("userId", "=", SecurityUtil.getUserId())
.and("sessionId", "=", info.getTeacherCongressSessionId())
);
// 开启流程实例
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
NutMap nutMap = Lang.obj2nutmap(user);
nutMap.put("leaveReason", leaveReason);
args.set(FlowConst.FORM_DATA, nutMap);
if(delegate != null) {
args.set("sessionId", delegate.getSessionId());
args.set("delegationId", delegate.getDelegationId());
}
ProcessInstance instance = flowEngine.startProcessInstanceByKey(meetingType.getDesignId(), user.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
@@ -60,7 +60,7 @@ public class MeetingTimePeriodUser extends BaseModel {
private String unitId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@ColDefine(type = ColType.VARCHAR, width = 200)
@Comment("所属单位")
private String unitName;
@@ -70,7 +70,7 @@ public class MeetingTimePeriodUser extends BaseModel {
private String unionId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@ColDefine(type = ColType.VARCHAR, width = 200)
@Comment("所属工会")
private String unionName;