diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/constant/ColumnFormTypeEnum.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/constant/ColumnFormTypeEnum.java new file mode 100644 index 00000000..e138e1a7 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/constant/ColumnFormTypeEnum.java @@ -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; +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipAdjustController.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipAdjustController.java new file mode 100644 index 00000000..39a7fda4 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipAdjustController.java @@ -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 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 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 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 activityCourseList = dao.query(FellowshipActivityCourse.class, Cnd.where("activityId", "=", activityId) + .and("courseId", "=", newCourseId)); + //先清楚旧的信息 + dao.clear(FellowshipUserCourse.class, oldCnd); + //添加新的信息 + List 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(); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipApplyController.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipApplyController.java new file mode 100644 index 00000000..8de3fc7a --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipApplyController.java @@ -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 fellowshipActivities = pagination.getList(); + Map 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 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 courseList = pagination.getList(); + + courseList.forEach(c -> { + List 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 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 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 courseList = fellowshipActivityService.dao().query(FellowshipCourse.class, Cnd.where(FellowshipCourse::getActivityId, "=", activityId).asc(FellowshipCourse::getOrderNum)); + if (Lang.isEmpty(courseList)) { + return Result.success(new ArrayList<>()); + } + List 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 courseList = dao.query(FellowshipActivityCourse.class, Cnd.where("courseId", "=", courseId).asc("courseStartTime")); + + // 查课程的报名人数 + List applyUserList = dao.query(FellowshipUserCourse.class, Cnd.where("courseId", "=", courseId)); + + List userList = dao.query(FellowshipUser.class, Cnd.where("courseId", "=", courseId).and("state", "=", 1)); + List idList = userList.stream().map(FellowshipUser::getUserId).toList(); + + applyUserList = applyUserList.stream().filter(o -> idList.contains(o.getUserId())).toList(); + + // 按照课程下面时间段去分组 + Map> collectMap = applyUserList.stream().collect(Collectors.groupingBy(FellowshipUserCourse::getActivityCourseId)); + List list = courseList.stream().map(v -> { + String id = v.getId(); + NutMap nutMap = NutMap.NEW(); + List 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 userList = dao.query(FellowshipUser.class, Cnd.where("courseId", "=", courseId).and("state", "=", 1)); + List 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 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 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(); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipManageController.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipManageController.java new file mode 100644 index 00000000..73ccdab1 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipManageController.java @@ -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 courseList = dataMap.getList("courseList", NutMap.class); + + //查询所有的课程类型 + List fellowshipTypeList = dao.query(FellowshipType.class, Cnd.NEW()); + Map typeMap = fellowshipTypeList.stream().collect(Collectors.toMap(FellowshipType::getId, FellowshipType::getTypeName)); + + courseList.forEach(v -> { + + List courseTimeList = v.getList("courseTimeList", NutMap.class); + //选择课程日期 下拉框 + List 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 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 query = dao.query(FellowshipActivity.class, Cnd.NEW().desc("activityStartTime")); + return Result.success().addData(query); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipMineController.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipMineController.java new file mode 100644 index 00000000..22958cdf --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipMineController.java @@ -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 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 listMap = activityService.listMap(sql); + return Result.success(listMap); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipTypeController.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipTypeController.java new file mode 100644 index 00000000..d2b00eb2 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipTypeController.java @@ -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 list = pagination.getList(); + list.forEach(item -> { + Cnd c = Cnd.NEW(); + c.and("typeId", "=", item.getString("id")); + c.asc("columnIndex"); + List signColumns = dao.query(FellowshipMobileSignColumn.class, c); + item.put("trainMobileSignColumnList", 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, "trainMobileSignColumnList"); + 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, "trainMobileSignColumnList"); + 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 fellowshipTypeList = dao.query(FellowshipType.class, Cnd.NEW().andEX("id", "=", id).asc("xh")); + dao.fetchLinks(fellowshipTypeList, "trainMobileSignColumnList", Cnd.NEW().asc("columnIndex")); + return Result.success().addData(fellowshipTypeList); + } + + @At + @ApiOperation("自定义表单字段类型") + @SaCheckPermission("fellowship.type") + public Result getColumnType() { + List names = EnumUtil.getNames(ColType.class); + names.add("JSON"); + return Result.success(names); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipUserManageController.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipUserManageController.java new file mode 100644 index 00000000..ba171878 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/manage/FellowshipUserManageController.java @@ -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 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 list = fellowshipBlackListService.listMap(sql); + if(ids.length > list.size()) { + return Result.error("您选择了" + ids.length + "位,未签到人员只有" + list.size() + "位"); + } + //ids的长度为几,就搞几个 + List mapList = list.subList(0, ids.length); + List 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 userList = fellowshipBlackListService.listMap(sql); + + List courseList = dao.query(FellowshipCourse.class, Cnd.where("activityId", "=", activityId)); + + List> sheetsList = new ArrayList<>(); + + List 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 v = userList.stream().filter(x -> x.getString("courseId").equals(courseId)).collect(Collectors.toList()); + ExportParams userExportParams = new ExportParams(); + userExportParams.setSheetName(courseName); + + List currentEntities = new ArrayList<>(excelCommonExportEntity); + for (NutMap userSignData : v) { + if(!userSignData.getBoolean("isAttend")) { + userSignData.put("isAttend", "未签到"); + userSignData.put("attendTimeExcel", "未签到"); + }else { + userSignData.put("isAttend", "已签到"); + } + } + + Map 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 map : sheetsList) { + ExcelExportService service = new ExcelExportService(); + service.createSheetForMap(workbook,(ExportParams) map.get("title"),(List) 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 userList = fellowshipBlackListService.listMap(sql); + + List courseList = dao.query(FellowshipCourse.class, Cnd.where("activityId", "=", activityId)); + + List> sheetsList = new ArrayList<>(); + + List 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 v = userList.stream().filter(x -> x.getString("courseId").equals(courseId)).collect(Collectors.toList()); + ExportParams userExportParams = new ExportParams(); + userExportParams.setSheetName(courseName); + + List currentEntities = new ArrayList<>(excelCommonExportEntity); + for (NutMap userSignData : v) { + if(!userSignData.getBoolean("isReceive")) { + userSignData.put("isReceive", "未领取"); + userSignData.put("receiveTimeExcel", "未领取"); + }else { + userSignData.put("isReceive", "已领取"); + } + } + + Map 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 map : sheetsList) { + ExcelExportService service = new ExcelExportService(); + service.createSheetForMap(workbook,(ExportParams) map.get("title"),(List) map.get("entity"),(Collection) map.get("data")); + } + + workbook.write(response.getOutputStream()); + workbook.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/statistics/FellowshipActivityStatisticsController.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/statistics/FellowshipActivityStatisticsController.java new file mode 100644 index 00000000..e99e3ded --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/controller/statistics/FellowshipActivityStatisticsController.java @@ -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 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 userList = fellowshipActivityManageService.listMap(sql); + + List courseList = dao.query(FellowshipCourse.class, Cnd.where("activityId", "=", activityId)); + + List fellowshipTypeList = dao.query(FellowshipType.class, Cnd.NEW()); + dao.fetchLinks(fellowshipTypeList, "mobileSignColumnList", Cnd.NEW().asc("columnIndex")); + Map typeMap = fellowshipTypeList.stream().collect(Collectors.toMap(FellowshipType::getId, o -> o)); + + List> sheetsList = new ArrayList<>(); + + List 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 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 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 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 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 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 map : sheetsList) { + ExcelExportService service = new ExcelExportService(); + service.createSheetForMap(workbook, (ExportParams) map.get("title"), (List) 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(); + } + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipActivity.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipActivity.java new file mode 100644 index 00000000..9dfaa16a --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipActivity.java @@ -0,0 +1,134 @@ +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 courseList; + + @Many(field = "activityId") + private List typeLimits; + + @Column + @Comment("活动类型") + @ColDefine(type = ColType.VARCHAR, width = 20) + private String trainType; + + @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; + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipActivityCourse.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipActivityCourse.java new file mode 100644 index 00000000..3ff3d5a9 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipActivityCourse.java @@ -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; + +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipBlackList.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipBlackList.java new file mode 100644 index 00000000..1152abea --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipBlackList.java @@ -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; + +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipCourse.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipCourse.java new file mode 100644 index 00000000..b75b702c --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipCourse.java @@ -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 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 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 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; + +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipMobileSignColumn.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipMobileSignColumn.java new file mode 100644 index 00000000..ea50fd3c --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipMobileSignColumn.java @@ -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 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 fileType; + + @Column + @Comment("序号") + @ColDefine(type = ColType.INT, width = 1) + private Integer columnIndex; + +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipType.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipType.java new file mode 100644 index 00000000..e8bc8f04 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipType.java @@ -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 mobileSignColumnList; +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipTypeLimit.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipTypeLimit.java new file mode 100644 index 00000000..266744c3 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipTypeLimit.java @@ -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; +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipUser.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipUser.java new file mode 100644 index 00000000..c15237fd --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipUser.java @@ -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 mobileColumnsValue; + + @Column + @ColDefine(type = ColType.INT) + @Comment("用户报名状态(1.正常 2.待报名成功 3.也是正常,但是是从2变为1的 4.废弃[就是没签到的意思])") + private Integer state; + +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipUserCourse.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipUserCourse.java new file mode 100644 index 00000000..701dfc86 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/models/FellowshipUserCourse.java @@ -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; + +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/FellowshipActivityService.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/FellowshipActivityService.java new file mode 100644 index 00000000..91405138 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/FellowshipActivityService.java @@ -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 { + + /** + * 添加活动 + * + * @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 qdInfoByUserId(String userId, String activityId); + + List filterCourseByHostUnion(List courseList); +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/FellowshipActivityStatisticsService.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/FellowshipActivityStatisticsService.java new file mode 100644 index 00000000..7bf35839 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/FellowshipActivityStatisticsService.java @@ -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 { + + /** + * 统计分页 + * + * @param pageForm + * @param activityId + * @return + */ + Pagination pageData(PageForm pageForm, String activityId); + + /** + * 该课程下的报名人员信息 + * + * @param courseId + * @return + */ + List registerUserList(String courseId); + + List getTaleColumnInfo(String courseId); + + /** + * 该课程下的报名人员信息 + * + * @param courseId + * @return + */ + List registerUserList(String courseId, String unionId, String unitId, String searchName, String searchKeyword); + + /** + * 获取每个课程的签到情况 + * + * @param courseId + * @return k->每个培训班每节课的上课时间 v->上课记录list + */ + Map> getSignInfo(String courseId); + + /** + * 报名人员list 导出 + * @param activityId + * @return + */ + List 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); +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/FellowshipBlackListService.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/FellowshipBlackListService.java new file mode 100644 index 00000000..da32388a --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/FellowshipBlackListService.java @@ -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 { + + /** + * 分页 + * + * @param pageForm 分页 + * @return Pagination + */ + Pagination pageData(PageForm pageForm, Cnd cnd, String activityId, String courseId); + + /** + * 拉黑、解封用户 + * + * @param userId + */ + void doHandleUser(String userId); + + /** + * 上课记录 + * + * @param userId + * @return + */ + List attendClassRecord(String userId); + + +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/impl/FellowshipActivityServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/impl/FellowshipActivityServiceImpl.java new file mode 100644 index 00000000..f78208f9 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/impl/FellowshipActivityServiceImpl.java @@ -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 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 typeLimits = activity.getTypeLimits(); + typeLimits.forEach(v -> v.setActivityId(activity.getId())); + dao().insert(typeLimits); + + List 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 typeLimits = activity.getTypeLimits(); + typeLimits.forEach(v -> v.setActivityId(activity.getId())); + if(Lang.isNotEmpty(typeLimits)) { + insertOrUpdate(typeLimits); + } + + List courseList = activity.getCourseList(); + courseList.forEach(v -> { + v.setActivityId(activity.getId()); + dao().insertOrUpdate(v); + if (Lang.isNotEmpty(v.getCourseTimeList())) { + this.setCourseTimeAndInsert(v); + } + }); + + //查询原来的活动 + List oldCourseList = dao().query(FellowshipCourse.class, Cnd.where("activityId", "=", activity.getId())); + //原来的培训班id + List oldCourseIdList = oldCourseList.stream().map(FellowshipCourse::getId).toList(); + + //原来的上课时间 + List oldActCourseTimeList = dao().query(FellowshipActivityCourse.class, Cnd.where("activityId", "=", activity.getId())); + + //现在的上课时间 + List nowCourseTimeListId = new ArrayList<>(); + activity.getCourseList().forEach(v -> { + if (v.getCourseTimeList() != null) { + nowCourseTimeListId.addAll(v.getCourseTimeList().stream().map(FellowshipActivityCourse::getId).toList()); + } + }); + + List deleteCourseTimeListId = oldActCourseTimeList.stream().map(FellowshipActivityCourse::getId).filter(id -> !nowCourseTimeListId.contains(id)).collect(Collectors.toList()); + List courseIdList = courseList.stream().map(FellowshipCourse::getId).collect(Collectors.toList()); + + //删除关联的培训班 + List 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 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 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 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 courseList = dao().query(FellowshipActivityCourse.class, Cnd.where("courseId", "=", courseId)); + List 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 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 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 filterCourseByHostUnion(List 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(); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/impl/FellowshipActivityStatisticsServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/impl/FellowshipActivityStatisticsServiceImpl.java new file mode 100644 index 00000000..c9219913 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/impl/FellowshipActivityStatisticsServiceImpl.java @@ -0,0 +1,260 @@ +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 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 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 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 list = listMap(sql); + list.forEach(o -> { + List 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 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 columnList = upType.getMobileSignColumnList(); + List columnTableList = columnList.stream().map(o -> NutMap.NEW().setv("label", o.getColumnName()).setv("prop", o.getColumnCode())).collect(Collectors.toList()); + return columnTableList; + } + + @Override + public List 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> 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 list = listMap(sql); + + Map> 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> sortedDataMap = courseTimeMap.entrySet().stream() + .sorted(Map.Entry.comparingByKey(Comparator.reverseOrder())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); + + return sortedDataMap; + } + + @Override + public List 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 stateList) { + if(StrUtil.isBlank(courseId) || StrUtil.isBlank(courseType)) { + return 0; + } + FellowshipType type = dao().fetch(FellowshipType.class, courseType); + AtomicInteger hasRegisterNum = new AtomicInteger(); + List 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 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(); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/impl/FellowshipUserServiceImpl.java b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/impl/FellowshipUserServiceImpl.java new file mode 100644 index 00000000..a7710d82 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/activity/fellowship/service/impl/FellowshipUserServiceImpl.java @@ -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 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 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); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/club/model/ClubUserApply.java b/src/main/java/com/budwk/app/zhgh/club/model/ClubUserApply.java index f48b7257..a10df965 100644 --- a/src/main/java/com/budwk/app/zhgh/club/model/ClubUserApply.java +++ b/src/main/java/com/budwk/app/zhgh/club/model/ClubUserApply.java @@ -76,6 +76,11 @@ public class ClubUserApply extends BaseModel { @ColDefine(type = ColType.VARCHAR, width = 500) private String awardsExperience; + @Column + @ColDefine(type = ColType.VARCHAR,width = 500) + @Comment("签字") + private String signature; + @Column @Comment("申请时间") @ColDefine(type = ColType.DATETIME) diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateBranchUnionApprovalController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateBranchUnionApprovalController.java index 3066e36e..fcf0f144 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateBranchUnionApprovalController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/evaluation/controller/EvaluateBranchUnionApprovalController.java @@ -88,7 +88,7 @@ public class EvaluateBranchUnionApprovalController { """); Cnd cnd = Cnd.NEW(); cnd.and("t.taskName", "=", "3bdaa29d-e5eb-4e3e-b7f1-14d03bedd078"); - cnd.and("info.evaluateId", "=", pageForm.getEvaluateId()); + cnd.andEX("info.evaluateId", "=", pageForm.getEvaluateId()); cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); if (approval) { cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/controller/RetireSouvenirsBatchController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/controller/RetireSouvenirsBatchController.java index 9ce322cb..88804ce3 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/controller/RetireSouvenirsBatchController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/controller/RetireSouvenirsBatchController.java @@ -136,6 +136,7 @@ public class RetireSouvenirsBatchController { entities.add(new ExcelExportEntity("工号", "loginName", 20)); entities.add(new ExcelExportEntity("姓名", "userName", 20)); entities.add(new ExcelExportEntity("退休时间", "retireTime", 20)); + entities.add(new ExcelExportEntity("所属单位", "unitName", 20)); ExportParams exportParams = new ExportParams(); Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entities, Collections.emptyList()); CommonDownloadUtil.download("退休人员名单导入模版.xlsx", workbook, response); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/controller/RetireSouvenirsLedgerController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/controller/RetireSouvenirsLedgerController.java index b56112d2..a035109b 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/controller/RetireSouvenirsLedgerController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/retiresouvenirs/controller/RetireSouvenirsLedgerController.java @@ -92,7 +92,13 @@ public class RetireSouvenirsLedgerController { @SLog(tag = "退休人员纪念品-人员台账", msg = "设置领取状态") public Result receive(String id) { RetireSouvenirsLedger ledger = ledgerService.fetch(id); - ledger.setReceive(!ledger.getReceive()); + boolean newReceiveStatus = !ledger.getReceive(); + ledger.setReceive(newReceiveStatus); + if (newReceiveStatus) { + ledger.setReceiveTime(DateUtil.now()); + } else { + ledger.setReceiveTime(null); + } ledgerService.update(ledger); return Result.success(); } @@ -188,6 +194,7 @@ public class RetireSouvenirsLedgerController { u.unionName, if(l.receive = true, '已领取', '未领取') as receiveStatus, DATE_FORMAT(l.retireTime, '%Y-%m') as retireTimeFormat, + DATE_FORMAT(l.receiveTime, '%Y-%m-%d') as receiveTimeFormat, (select count(1) from retire_souvenirs_msg where batchId = l.batchId and userId = l.userId) as msgCount FROM retire_souvenirs_ledger l diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/meetings/controller/TeacherCongressMeetingController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/meetings/controller/TeacherCongressMeetingController.java index d4ae8556..88cc8897 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/meetings/controller/TeacherCongressMeetingController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/meetings/controller/TeacherCongressMeetingController.java @@ -43,9 +43,10 @@ public class TeacherCongressMeetingController { @At @SaCheckPermission("tc.delegate.meetings") - public Result pageData(@Valid PageForm pageForm, String sessionId, String type) { + public Result pageData(@Valid PageForm pageForm, String sessionId, String type, String meetingType) { Sql sql = Sqls.create("select * from teacher_congress_meeting $condition"); Cnd cnd = Cnd.NEW(); + cnd.andEX("meetingType", "=", meetingType); cnd.andEX("sessionId", "=", sessionId); cnd.andEX("type", "=", type); if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/meetings/controller/TeacherCongressMeetingFileController.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/meetings/controller/TeacherCongressMeetingFileController.java index 1f71f7fd..e167c13b 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/meetings/controller/TeacherCongressMeetingFileController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/meetings/controller/TeacherCongressMeetingFileController.java @@ -45,9 +45,10 @@ public class TeacherCongressMeetingFileController { @At @SaCheckPermission("tc.delegate.meetings.file") - public Result pageData(@Valid PageForm pageForm, String sessionId) { + public Result pageData(@Valid PageForm pageForm, String sessionId, String meetingType) { Sql sql = Sqls.create("select * from Teacher_congress_meeting_file $condition"); Cnd cnd = Cnd.NEW(); + cnd.andEX("meetingType", "=", meetingType); cnd.andEX("sessionId","=",sessionId); cnd.and(Cnd.likeEX("name", pageForm.getSearchKeyword())); sql.setCondition(cnd); diff --git a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/meetings/models/Teacher_congress_meeting_file.java b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/meetings/models/Teacher_congress_meeting_file.java index 8f1efeb5..a80860c9 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/meetings/models/Teacher_congress_meeting_file.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/teachercongress/meetings/models/Teacher_congress_meeting_file.java @@ -7,6 +7,8 @@ import lombok.EqualsAndHashCode; import org.nutz.dao.entity.annotation.*; import org.nutz.dao.interceptor.annotation.PrevInsert; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; import java.util.List; @Data @@ -63,5 +65,12 @@ public class Teacher_congress_meeting_file extends BaseModel { @ColDefine(type = ColType.MYSQL_JSON) private List files; + @Column + @Comment("会议活动所属类型(delegation:代表团/union:分工会)") + @ColDefine(type = ColType.VARCHAR) + @NotBlank(message = "会议活动所属类型不能为空") + @Size(max = 32) + private String meetingType; + } diff --git a/src/main/resources/static/components/plugins/sysUpload/h5Index.vue b/src/main/resources/static/components/plugins/sysUpload/h5Index.vue index 69fffc65..1155afbc 100644 --- a/src/main/resources/static/components/plugins/sysUpload/h5Index.vue +++ b/src/main/resources/static/components/plugins/sysUpload/h5Index.vue @@ -105,6 +105,14 @@ module.exports = { isImage: ["jpg", "jpeg", "png", "gif", "bmp", "webp"].includes(v.name.split(".").pop().toLowerCase()) } }) + } else if(typeof val === "string") { + this.fileList = [ + { + url: val, + status: null, + isImage: true + } + ] } else { val = JSON.parse(val) this.fileList = val.map((v) => { diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/apply/applyForm.js b/src/main/resources/views/platform/zhgh/activity/fellowship/apply/applyForm.js new file mode 100644 index 00000000..9d89e632 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/apply/applyForm.js @@ -0,0 +1,210 @@ +const applyForm = { + template: /*language=HTML*/ ` +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 取 消 + 提 交 + + +
+ `, + store, + dicts: ["FELLOWSHIP_TYPE"], + data() { + return { + signDialog: false, + formData: {}, + courseRow: {}, + courseTimeSelectList: [], + } + }, + methods: { + async getCourseTimeSelectList(o) { + const resp = await $.post('/platform/fellowship/apply/getCourseTimeSelectList',{ courseId: o.id }) + if (resp.code === 0) { + this.courseTimeSelectList = resp.data + } else { + this.$message.warning('获取时段信息失败,请联系管理员') + } + }, + async onOpen(row, course) { + this.initData(row, course) + if (row.courseIsLimitApply) { + await this.getCourseTimeSelectList(row) + } + this.courseRow = row + this.signDialog = true + this.$nextTick(() => { + this.$refs.form.clearValidate() + }) + }, + async validateSignUp() { + // 获取家属人数 + let familyCount = this.formData.mobileSignColumnList.filter(o => o.columnCode === 'xdqsrs').reduce((sum, item) => { + return sum + (Number(item.columnValue) || 0) + }, 0) + const res = await this.$axios.post("/platform/fellowship/apply/validateSignUp", { + courseId: this.formData.courseId, + currentFamilyNumber: familyCount + }) + return res.code === 0 + }, + async validateCourseTime() { + const res = await this.$axios.post('/platform/fellowship/apply/validateSourceSignUp', { + activityCourseId: this.formData.activityCourseId, + courseId: this.courseRow.id + }) + return res.code === 0 + }, + async onSubmit() { + if(!await this.validateSignUp()) return + + this.$refs["form"].validate(async (valid) => { + if (valid) { + if(this.courseRow.courseIsLimitApply && !await this.validateCourseTime()) return + this.$confirm("您确定要提交吗?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }).then(async () => { + const mobileColumnsValue = this.formData.mobileSignColumnList.map((v) => { + return { + columnName: v.columnName, + columnValue: v.columnValue, + columnCode: v.columnCode, + columnFormType: v.columnFormType + } + }) + this.formData.mobileColumnsValue = JSON.stringify(mobileColumnsValue) + const resp = await this.$axios.post("/platform/fellowship/apply/doSignUp", this.formData) + if (resp.code === 0) { + this.signDialog = false + this.$message.success(resp.msg) + this.$emit('refresh') + } else { + this.$message.warning(resp.msg) + } + }) + } + }) + }, + initData(row, course) { + this.$set(this.formData, 'username', this.$store.state.user.username) + this.$set(this.formData, 'loginname', this.$store.state.user.loginname) + this.$set(this.formData, 'unionName', this.$store.state.user.union.name) + this.$set(this.formData, 'unitName', this.$store.state.user.unit.name) + this.$set(this.formData, 'sex', this.$store.state.user.sex) + this.$set(this.formData, 'activityId', row.activityId) + this.$set(this.formData, 'courseId', row.id) + this.$set(this.formData, 'mobileSignColumnList', course.mobileSignColumnList) + + this.formData.mobileSignColumnList.forEach((item) => { + item.columnValue = this.$store.state.user[item.columnCode] || "" + }) + }, + }, + style: /*language=CSS*/ ` + + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/apply/courseList.js b/src/main/resources/views/platform/zhgh/activity/fellowship/apply/courseList.js new file mode 100644 index 00000000..4b2a9eaf --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/apply/courseList.js @@ -0,0 +1,340 @@ + +const courseList = { + template: /*language=HTML*/ ` +
+ + + + + 类  型: + + + + + + + + 分类标识: + + + {{ item }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 取 消 + + + + +
+ + 取 消 + +
+ + +
+ + 取 消 + +
+ + +
+ `, + dicts: ["FELLOWSHIP_TYPE"], + mixins: [initTableMixins], + components: { + "apply-form": applyForm, + }, + data() { + return { + pageForm: { + assortTypes: [], + }, + assortList: [], + courseTimeListDialog: false, + viewMapDialog: false, + courseTimeList: [], + tableColumns: [ + { prop: "courseName", label: "名称" }, + { prop: "typeName", label: "类型", width: 130}, + { prop: "campus", label: "校区", width: 160 }, + { prop: "courseLocationCoordinates", label: "地点", width: 200 }, + { prop: "courseInstructor", label: "联系人", width: 100 }, + { prop: "courseTime", label: "时间", width: 160 }, + { prop: "introduce", label: "详细信息", width: 100 }, + { prop: "applyNum", label: "已报名人数", width: 200 } + ], + activity: {}, + courseTypeList: [], + + trainType: '', + pdf: false, + infoVisible: false, + introduce: '', + } + }, + methods: { + async onPreview(introduce) { + try { + const parser = new DOMParser(); + const doc = parser.parseFromString(introduce, 'text/html'); + const link = doc.querySelector('a'); + const href = link.getAttribute('href'); + + const id = href.substring(href.indexOf("=") + 1) + const res = await this.$axios.post("/platform/sys/file/previewFileData", { ids: JSON.stringify([id]) }) + + this.pdf = true + window.open("/assets/platform/plugins/pdfJs/web/viewer.html?file=" + encodeURIComponent(res.data[0].downloadPath), res.data[0].name) + } catch (e) { + this.introduce = introduce + this.pdf = false + this.infoVisible = true + } + }, + tagClick(key, val) { + let idx = this.pageForm[key].indexOf(val) + if (idx !== -1) { + this.pageForm[key].splice(idx, 1) + } else { + this.pageForm[key].push(val) + } + this.doSearch() + }, + async onOpen(row) { + this.activity = row + this.$set(this.pageForm, 'activityId', row.id) + await this.pageData() + await this.getCourseTypeList() + this.queryCourseAssort() + }, + onSign(row) { + const course = this.courseTypeList.find((v) => v.id === row.courseType) + this.$axios.post("/platform/fellowship/apply/validateSignUp", {courseId: row.id}) + .then((res) => { + if (res.code !== 0) { + this.$alert(res.msg, "提示", { + confirmButtonText: "确定", + type: "warning" + }) + } else { + let lave = row.coursePeopleNumber - (row.hasRegisterNum + row.courseReservedNumber) + if(row.reserveMode === 2 && lave <= 0) { + this.$alert('您当前的报名为候补报名状态', "提示", { + confirmButtonText: "确定", + type: "warning" + }) + } + this.$refs.formRef.onOpen(row, course) + } + }) + }, + onCancel(row) { + this.$confirm("您确定要取消吗?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "info" + }).then(async () => { + const resp = await this.$axios.post("/platform/fellowship/apply/cancelSignUp", { + activityId: row.activityId, + courseId: row.id + }) + if (resp.code === 0) { + await this.pageData() + this.$message.success(resp.msg) + } else { + this.$message.warning(resp.msg) + } + }) + }, + async getCourseTypeList() { + const resp = await this.$axios.post("/platform/fellowship/type/getAllType") + if (resp.code === 0) { + this.courseTypeList = resp.data + } + }, + async openViewCourseTime(id) { + const resp = await this.$axios.post(loc() + "/getCourseTime", { id: id }) + this.courseTimeList = resp.data + this.courseTimeListDialog = true + }, + openViewMap(point) { + if (!Array.isArray(point)) { + this.$message.warning("没有设置点位,无法通过地图查看") + return + } + this.viewMapDialog = true + this.$nextTick(() => { + const viewMap = new AMap.Map("viewMap", { + resizeEnable: true, + center: point, + zoom: 16 + }) + if (viewMarker) { + viewMap.remove(viewMarker) + } + viewMarker = new AMap.Marker({ + position: point, + offset: new AMap.Pixel(-13, -30) + }) + viewMap.add(viewMarker) + viewMap.setFitView(null, false, [150, 60, 100, 60]) + }) + }, + calcSignUpCount(o) { + let lave = o.coursePeopleNumber - (o.hasRegisterNum + o.courseReservedNumber) + if(o.reserveMode === 2) { + let lave2 = o.waitingNum - o.hasWaitingNum + return "余" + lave +"/" + o.coursePeopleNumber + "人" + + ",候补余" + lave2 + "/" + o.waitingNum + "人" + } else { + return "余" + lave +"/" + o.coursePeopleNumber + "人" + } + }, + async pageData() { + const pageForm = clone({...this.pageForm}) + pageForm.assortTypes = JSON.stringify(pageForm.assortTypes) + const resp = await this.$axios.post(loc() + "/pageData", pageForm) + if (resp.code === 0) { + this.tableData = resp.data.list + this.pageForm.totalCount = resp.data.totalCount + } else { + this.$message.warning(resp.msg) + } + }, + queryCourseAssort() { + this.$axios.post(loc() + "/queryCourseAssort", {activityId: this.activity.id}) + .then((resp) => { + this.assortList = resp.data + }) + }, + }, + created() { + + }, + style: /*language=CSS*/ ` + /deep/ .glow-box { + min-height: calc(100vh - 56px - 40px - 50px - 80px); + max-height: calc(100vh - 56px - 40px - 50px - 80px); + overflow-y: auto; + background: #F0F2F5; + } + /deep/ img { + width: 100%; + height: 180px; + } + /deep/ .title { + background: white; + height: 20px; + } + /deep/ .query-row { + display: flex; + align-items: center; + padding: 6px 0; + } + /deep/ .query-row:not(:last-child) { + border-bottom: 1px dashed rgb(230, 230, 230); + } + /deep/ .query-row > .query-title { + width: 100px; + max-width: 100px; + min-width: 100px; + overflow: hidden; + } + /deep/ .query-row > .query-content { + min-width: 200px; + overflow: hidden; + } + /deep/ .query-row > .query-content > .el-tag { + margin-bottom: 5px; + margin-top: 5px; + } + /deep/ @media screen and (max-width: 992px) { + .query-row:nth-child(4) .query-content .el-col:not(:last-child) { + margin-bottom: 5px; + } + + .query-title { + display: none; + } + } + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/apply/index.html b/src/main/resources/views/platform/zhgh/activity/fellowship/apply/index.html new file mode 100644 index 00000000..4389b909 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/apply/index.html @@ -0,0 +1,175 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/manage/basicForm.js b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/basicForm.js new file mode 100644 index 00000000..060f2ed5 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/basicForm.js @@ -0,0 +1,593 @@ + + +const basicForm = { + template: /*language=HTML*/ ` +
+ +
+ + + + + 沿用之前活动 + 不沿用之前活动 + + + + + + + + + + + + + + + + + + + + + 通知 + 不通知 + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+ 设置 +
+
+
+
+ + + + + + + +
+ + + + + + + + + + + + + +
+
+
+
{{trainType + '信息(温馨提示:如不需要人数限制,下方人数框填写0或者不填)'}}
+
+ 添加{{ trainType }} +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
个人报名数量限制
+ + + 无限制 + 按类型限制 + 按活动限制 + +
+
注:无限制指对报名的个数不做任何限制
+
+
+ 设置报名限制 + 注:按类型限制指对每个类型下的个数进行限制 +
+
+
+
+ + 注:按活动限制指只能报{{formData.limitNum}}个,不与类型关联 +
+
+
+
+
+
+
+ 取消 + 上一步 + 下一步 + 保存 + 提交 +
+ + + + + + + + + + + 取消 + 确定 + + + + + + + + +
+ `, + dicts: ["USER_CAMPUS", "FELLOWSHIP_TYPE"], + data() { + return { + signUpDialog: false, + step: 1, + formData: { + notice: false, + courseList: [ + { orderNum: 1, courseName: "", courseTimeList: [], isMobileSign: false, isReceiveGift: false, reserveMode: 1, courseIsLimitApply: false }, + ], + conditionStructure: { + method: "AND", + conditions: [{}] + }, + restrictLimit: 1, + limitNum: 1, + typeLimits: [] + }, + historicalActList: [], + trainTypeList: [], + trainType: "培训班", + activityGroupList: [], + pickerOptions: { + disabledDate(time) { + return time.getTime() < Date.now() - 24 * 60 * 60 * 1000 + } + }, + campusList: [], + courseTypeList: [], + } + }, + components: { + "drawer-user-scope": httpVueLoader("/components/module/activity/DrawerUserScope.vue"), + "course-time": courseTime, + "custom-form": customForm, + }, + methods: { + async validNumber(row, old) { + if (GetQueryString("id") === "") { + if (row.courseReservedNumber > row.coursePeopleNumber && row.reserveMode === 1) { + this.$alert("预留人数不能大于" + this.trainType + "人数!", "提示", { + confirmButtonText: "确定" + }) + row.courseReservedNumber = 0 + } + } else { + const registerUserCount = await this.getRegisterUserCount(row.id) + if (row.courseReservedNumber + registerUserCount > row.coursePeopleNumber) { + if (row.reserveMode === 1) { + let num = row.coursePeopleNumber - registerUserCount + let str = + "您设置的" + + this.trainType + + "人数为" + + row.coursePeopleNumber + + "人,当前报名人数为" + + registerUserCount + + "人,预留名额上限为" + + num + + "人!" + this.$alert(str, "提示", { + confirmButtonText: "确定" + }) + row.courseReservedNumber = 0 + } + } + } + }, + async getRegisterUserCount(courseId) { + const resp = await this.$axios.post("/platform/fellowship/manage/getRegisterUserCount", { courseId }) + return resp.code === 0 ? resp.data : 0 + }, + courseTypeChange(val, row) { + row.reserveMode = 1 + }, + setSignUpCondition() { + if (this.formData.courseList !== undefined && this.formData.courseList.length > 0) { + const courseValid = this.formData.courseList.some((item, index) => { + if (item.courseType === undefined) { + this.$message.warning("请在" + (index + 1) + "行" + this.trainType + "信息中选择类型!") + return true + } + return false + }) + if (courseValid) { + return + } + const array = [...new Set(this.formData.courseList.map((o) => o.courseType))] + const typeArray = clone([...this.courseTypeList].filter((x) => array.some((y) => x.id === y))) + const arr = [] + typeArray.forEach((item) => { + const t = this.formData.typeLimits.find(o => o.typeId === item.id) + if (t) { + const type = this.courseTypeList.find(o => o.id === t.typeId) + t.code = type.code + t.typeName = type.typeName + arr.push(t) + } else { + arr.push({ + code: item.code, + typeName: item.typeName, + typeId: item.id, + limitNum: 0 + }) + } + }) + this.formData.typeLimits = arr + this.signUpDialog = true + } else { + this.$message.warning("请在" + this.trainType + "信息中选择类型!") + } + }, + doLimitNum() { + this.signUpDialog = false + }, + openMoreInfo(row, index) { + this.$refs.customFormRef.onOpen(this.formData, row, index) + }, + async removeTableCourse(index) { + const confirm = await this.$confirm( + "请确认是否删除此" + this.trainType + "?如果该" + this.trainType + "已有报名人员,会随之一起删除!确定吗?", + "提示", + { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + } + ) + if (confirm) { + this.formData.courseList.splice(index, 1) + } + }, + openSetUpCourseTime(index) { + this.$refs.courseTimeRef.onOpen(this.formData, index) + }, + courseOrderNumChange() { + this.formData.courseList = this.formData.courseList.sort((a, b) => a.orderNum - b.orderNum) + }, + addCourse() { + this.formData.courseList.push({ courseTimeList: [], isMobileSign: false, isReceiveGift: false, reserveMode: 1, courseIsLimitApply: false }) + }, + async historicalActChange(val) { + const resp = await this.$axios.post("/platform/fellowship/manage/findOne", {id: val}) + if (resp.code === 0) { + this.formData = resp.data + this.typeChange(this.formData.trainType) + this.formData.id = "" + } + }, + typeChange(val) { + const type = this.dict.type.FELLOWSHIP_TYPE.find(o => o.code === val) + this.trainType = type?.name || "培训班" + }, + changeActivity(val) { + if (val) { + const group = this.activityGroupList.find(v => v.groupId === val) + this.$set(this.formData, "activityGroupName", group.groupName) + } else { + this.$set(this.formData, "activityGroupName", "全部教职工") + } + }, + async getActivityGroup() { + const { data } = await this.$axios.post("/platform/activity/basic/scope/getActivityUserScopeGroup") + return data + }, + async getHistoricalActList() { + const resp = await this.$axios.post("/platform/fellowship/manage/getHistoricalActList", {}) + return resp.data + }, + async onSave() { + let valid = false + this.$refs.form.validateField("activityName", (errMsg) => { + valid = errMsg === "" + }) + if (!valid) { + this.$message.warning("请输入活动名称") + return + } + await this.doHandle('保存') + }, + onSubmit() { + this.$refs["form"].validate(async (valid, errMsg) => { + if (valid) { + const courseValid = this.formData.courseList.some((v, i) => { + const basicValid = v.courseName && v.coursePeopleNumber && v.courseLocation && v.courseInstructor && v.courseType + const timeValid = + v.courseTimeList.length > 0 && + v.courseTimeList.every((x) => { + return x.courseStartTime && x.courseEndTime && x.courseStartTime < x.courseEndTime + }) + if (!timeValid) { + this.$message.warning("第" + (i + 1) + "行时间填写有误,请核查") + return true + } + if (!basicValid) { + this.$message.warning("第" + (i + 1) + "行信息填写有误,请核查") + return true + } + if (v.isMobileSign === true && v.signType === 3 && (v.courseLocationCoordinates === undefined || v.courseLocationCoordinates.length < 2)) { + this.$message.warning("第" + (i + 1) + "行地点坐标填写有误,请核查") + return true + } + if (v.isMobileSign === true && v.signType === 3 && (v.signType === "" || v.signType === undefined)) { + this.$message.warning("第" + (i + 1) + "行签到方式填写有误,请核查") + return true + } + return false + }) + if (courseValid) return + if (this.formData.restrictLimit === 2 && this.formData.typeLimits.length === 0) { + this.$message.warning("请设置报名限制") + return + } + this.formData.isDisabled = false + await this.doHandle('提交') + } else { + if(Object.keys(errMsg).length > 0) { + this.$message.warning(errMsg[Object.keys(errMsg)[0]][0].message) + return + } + this.$message.warning("存在必填项未填写") + } + }) + }, + async doHandle(type) { + const cloneData = clone(this.formData) + cloneData.activitySignUpStartTime = cloneData.activitySignTime !== undefined ? cloneData.activitySignTime[0] : null + cloneData.activitySignUpEndTime = cloneData.activitySignTime !== undefined ? cloneData.activitySignTime[1] : null + cloneData.activityStartTime = cloneData.activityTime !== undefined ? cloneData.activityTime[0] : null + cloneData.activityEndTime = cloneData.activityTime !== undefined ? cloneData.activityTime[1] : null + if (cloneData.activityStartTime !== undefined && cloneData.activityStartTime !== null) { + cloneData.year = new Date(cloneData.activityStartTime).getFullYear() + } + cloneData.typeLimits = JSON.stringify(this.formData.typeLimits) + cloneData.courseList = JSON.stringify(cloneData.courseList) + const confirm = await this.$confirm("您确定要" + type + "吗?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }) + if (confirm !== "confirm") return + const resp = await this.$axios.post("/platform/fellowship/manage/doHandle", cloneData) + if (resp.code === 0) { + this.$message.success(resp.msg) + this.step = 1 + this.$emit('refresh') + this.$emit('back') + } else { + this.$message.warning(resp.msg) + } + }, + async getAllType() { + const resp = await this.$axios.post("/platform/fellowship/type/getAllType", {}) + return resp.data + }, + async init(row) { + if (row && row.id) { + const resp = await this.$axios.post("/platform/fellowship/manage/findOne", {id: row.id}) + if (resp.code === 0) { + this.formData = resp.data + this.typeChange(this.formData.trainType) + } + } + }, + async initData(row) { + this.activityGroupList = await this.getActivityGroup() + this.historicalActList = await this.getHistoricalActList() + this.courseTypeList = await this.getAllType() + await this.init(row) + }, + }, + watch: { + 'formData.restrictLimit'(val) { + if (!this.formData.id) { + this.formData.limitNum = val === 3 ? 1 : '' + } + }, + 'formData.activityGroupId': { + async handler(newVal, oldVal) { + this.activityGroupList = await this.getActivityGroup() + this.userScopeDialog = false + }, + deep: true + }, + }, + style: /*language=CSS*/ ` + + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/manage/courseTime.js b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/courseTime.js new file mode 100644 index 00000000..5b17666d --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/courseTime.js @@ -0,0 +1,215 @@ +const courseTime = { + template: /*language=HTML*/ ` +
+ +
温馨提示:有人员报名后,禁止修改下列时间,如有修改,请联系管理员
+
选择日期
+ +
设置时间
+ + + + 一键设置开始/结束时间 + 报名人数是否限制: + + + + + + + + + + + + + + + + + + + + + + + 确定 + +
+
+ `, + dicts: ["FELLOWSHIP_TYPE"], + data() { + const that = this + return { + setUpCourseDialog: false, + courseIndex: 0, + formData: {}, + courseTimeOneKeySet: { + startTime: "", + endTime: "" + }, + setUpCoursePickerOptions: { + disabledDate(time) { + return ( + time.getTime() < Date.parse(that.$moment(that.formData.activityTime[0]).format("YYYY-MM-DD") + " 00:00:00") || + time.getTime() > Date.parse(that.$moment(that.formData.activityTime[1]).format("YYYY-MM-DD") + " 00:00:00") + ) + } + }, + } + }, + methods: { + removeSetUpTableCourseRow(row, index) { + this.formData.courseList[this.courseIndex].courseTimeList.splice(index, 1) + //培训时间列表日期数组 + const courseDateArray = this.formData.courseList[this.courseIndex].courseTimeList.map((v) => + this.$moment(v.courseDate).format("YYYY-MM-DD") + ) + //选择课程日期数组 + const scdList = this.formData.courseList[this.courseIndex].setUpCourseData + + this.formData.courseList[this.courseIndex].setUpCourseData = scdList.filter((v) => { + return courseDateArray.includes(this.$moment(v).format("YYYY-MM-DD")) + }) + }, + oneKeySetStartEndTime() { + const { startTime, endTime } = this.courseTimeOneKeySet + this.formData.courseList[this.courseIndex].courseTimeList.forEach((v) => { + this.$set(v, "courseStartTime", startTime) + this.$set(v, "courseEndTime", endTime) + }) + this.$forceUpdate() + }, + setUpCourseDataChange(val) { + if (!val) { + this.formData.courseList[this.courseIndex].courseTimeList = [] + return + } + //培训时间日期Set + if (this.formData.courseList[this.courseIndex].courseTimeList === undefined) { + this.$set(this.formData.courseList[this.courseIndex], "courseTimeList", []) + } + const ctList = new Set( + this.formData.courseList[this.courseIndex].courseTimeList.map((v) => this.$moment(v.courseDate).format("YYYY-MM-DD")) + ) + val.forEach((v) => { + if (!ctList.has(v)) { + this.formData.courseList[this.courseIndex].courseTimeList.push({ + courseDate: v, + courseTime: null + }) + } + }) + this.formData.courseList[this.courseIndex].courseTimeList = this.formData.courseList[this.courseIndex].courseTimeList.filter((v) => { + return val.includes(this.$moment(v.courseDate).format("YYYY-MM-DD")) + }) + this.formData.courseList[this.courseIndex].courseTimeList.sort((a, b) => { + return Date.parse(a["courseDate"]) - Date.parse(b["courseDate"]) + }) + }, + //设置课程时间确定 + doConfirmSetUpCourse() { + const courseTableData = this.formData.courseList[this.courseIndex].courseTimeList + if (courseTableData.length === 0) { + this.$message.warning("请填写时间!") + return + } + if (courseTableData && courseTableData.length > 0) { + const valid = courseTableData.every((v) => v.courseStartTime && v.courseEndTime && v.courseStartTime < v.courseEndTime) + if (!valid) { + this.$message.warning("时间填写不完整或者有误!") + return + } + this.setUpCourseDialog = false + } + }, + onOpen(formData, index) { + this.formData = formData + this.courseIndex = index + if (!this.formData.activityTime || this.formData.activityTime.length === 0) { + this.$message.warning("请先设置活动起止时间") + return + } + this.courseIndex = index + this.setUpCourseDialog = true + }, + }, + created() { + if(!this.formData.courseList) { + this.formData = {courseList: [{unionLimit: []}]} + } + }, + style: /*language=CSS*/ ` + + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/manage/customForm.js b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/customForm.js new file mode 100644 index 00000000..d4c05184 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/customForm.js @@ -0,0 +1,210 @@ + +const customForm = { + template: /*language=HTML*/ ` +
+ + + + 分工会人数限制 + + + + 设置分工会人数限制 + + + 已设置 + + 未设置 + + + + + + 承办工会 + + + + + + + + + + + 对内报名时间 + + + + + + + + + 是否签到 + + + + 签到 + 不签到 + + + + + + + 签到方式 + + + + 扫描二维码 + 被扫 + GPS定位签到 + + + + + + + 地点坐标 + + + 设置签到点 + + + + + + 是否领取礼品 + + + + 领取 + 不领取 + + + + + + + 领取方式 + + + + 扫描二维码 + 面对面确认 + + + + + + + 报名方式 + + + + 报名人员减少模式 + 候补模式 + + + + + + 候补数量 + + + + + + + + + 详细信息 + + + + + + +
+ 取 消 + 保 存 +
+
+ + + + + 确 定 + + + + +
+ `, + dicts: ["FELLOWSHIP_TYPE"], + data() { + return { + moreInfoDrawer: false, + unionList: [], + formData: {}, + moreInfoRow: {}, + moreInfoIndex: 0, + + mapDialog: false, + mapIndex: 0, + } + }, + components: { + "union-form": unionForm, + "map-container": httpVueLoader("/components/plugins/mapContainer/MapContainer.vue?v=1.0.1") + }, + methods: { + openMap(index) { + this.mapIndex = index + this.mapDialog = true + }, + openSetUpUnionLimit(index) { + this.$refs.unionFormRef.onOpen(this.formData, index) + }, + async onOpen(formData, chooseRow, index) { + this.formData = formData + this.moreInfoRow = chooseRow + this.moreInfoIndex = index + this.unionList = await this.$businessTool.listUnion() + this.moreInfoDrawer = true + }, + }, + created() { + if(!this.formData.courseList) { + this.formData = {courseList: [{unionLimit: []}]} + } + }, + style: /*language=CSS*/ ` + + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/manage/index.html b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/index.html new file mode 100644 index 00000000..7d03454d --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/index.html @@ -0,0 +1,212 @@ + + + + +
+ + + + + + + + + + + + + + + + 新建活动 + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + 关 闭 + +
+
+
+ + + + diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/manage/info.js b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/info.js new file mode 100644 index 00000000..2de86d96 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/info.js @@ -0,0 +1,111 @@ +const info = { + template: /*language=HTML*/ ` +
+ + + + {{viewData.activityName}} + {{viewData.year}} + {{$moment(viewData.createdAt).format('YYYY-MM-DD HH:mm:ss')}} + {{viewData.activityStartTime}} + {{viewData.activityEndTime}} + {{viewData.activitySignUpStartTime}} + {{viewData.activitySignUpEndTime}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 关 闭 + + + + +
+
+
+ `, + dicts: ["FELLOWSHIP_TYPE"], + data() { + return { + trainType: '', + viewData: {}, + courseTimeListDialog: false, + courseTimeList: [], + + viewMapDialog: false, + } + }, + methods: { + initData(id) { + this.$axios.post("/platform/fellowship/manage/findOne", { id: id }) + .then((resp) => { + if (resp.code === 0) { + this.viewData = resp.data + const type = this.dict.type.FELLOWSHIP_TYPE.find((o) => o.code === resp.data.trainType) + this.trainType = type?.name || "培训班" + } + }) + }, + openViewCourseTime(courseTimeList) { + this.courseTimeList = courseTimeList + this.courseTimeListDialog = true + }, + openViewMap(point) { + if (!Array.isArray(point)) { + this.$message.warning("没有设置点位,无法通过地图查看") + return + } + this.viewMapDialog = true + this.$nextTick(() => { + viewMap = new AMap.Map("viewMap", { + resizeEnable: true, + center: point, + zoom: 16 + }) + if (viewMarker) { + viewMap.remove(viewMarker) + } + viewMarker = new AMap.Marker({ + position: point, + offset: new AMap.Pixel(-13, -30) + }) + viewMap.add(viewMarker) + viewMap.setFitView(null, false, [150, 60, 100, 60]) + }) + }, + }, + style: /*language=CSS*/ ` + /deep/ .el-button--text { + padding: 0; + } + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/manage/makeQrcode.js b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/makeQrcode.js new file mode 100644 index 00000000..c96de11c --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/makeQrcode.js @@ -0,0 +1,84 @@ +const makeQrcode = { + template: /*language=HTML*/ ` +
+ + + + + + + + + + + + + + + + + + + + + + 关 闭 + + +
+ `, + dicts: ["FELLOWSHIP_TYPE"], + data() { + return { + courseDialog: false, + trainType: "", + courseList: [], + } + }, + methods: { + initData(row) { + this.courseList = row.courseList + const type = this.dict.type.FELLOWSHIP_TYPE.find((o) => o.code === row.trainType) + this.trainType = type?.name || "培训班" + this.courseDialog = true + }, + makeCourseCode(row) { + const url = '/platform/fellowship/mine/drivingScan' + const data = url + '?courseId=' + row.id + console.log(data) + const content = jrQrcode.getQrBase64(data) + let image = new Image() + image.src = content + let viewer = new Viewer(image, { + zIndex: 99999999, + }) + viewer.show() + }, + }, + style: /*language=CSS*/ ` + + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/manage/unionForm.js b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/unionForm.js new file mode 100644 index 00000000..b12becbe --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/manage/unionForm.js @@ -0,0 +1,221 @@ +const unionForm = { + template: /*language=HTML*/ ` +
+ +
+
分段设置
+
+ 应用分段设置 +
+
+ + + + + + + + + + + + + + + + + +
+ ({{index+1}}). + {{item}} +
+
+ +
+
比例设置
+
+ 一键比例: + + 应用比例设置 +
+
+ + + + + + + + + + + + +
+ 限制总人数:{{summaryCount}}人 +
+ 清空分工会人数限制 + 取消 + 确定 +
+
+
+ `, + dicts: ["FELLOWSHIP_TYPE"], + data() { + return { + formData: {}, + unionLimitIndex: 0, + setUpUnionLimitDialog: false, + unionList: [], + unionUserNumCalc: [{}], + unionUserNumOneKeyRatio: null, + summaryCount: 0, + } + }, + computed: { + unionUserNumCalcTips() { + return this.unionUserNumCalc.map((v) => { + return ( + (v.startNum ? v.startNum : "?") + + "-" + + (v.endNum ? v.endNum : "?") + + "人的分工会,限报" + + (v.resultNum ? v.resultNum : "?") + + "人" + ) + }) + } + }, + methods: { + calSummaryCount() { + const array = this.formData.courseList[this.unionLimitIndex].unionLimit + if (array) { + this.summaryCount = array.reduce((prev, curr) => { + const value = Number(curr.limitCount) + if (!isNaN(value)) { + return prev + curr.limitCount + } else { + return prev + } + }, 0) + } + }, + async onOpen(formData, index) { + this.unionList = await this.$businessTool.listUnion() + this.formData = formData + this.unionLimitIndex = index + this.setUpUnionLimitDialog = true + if ( + !this.formData.courseList[this.unionLimitIndex].unionLimit || + this.formData.courseList[this.unionLimitIndex].unionLimit.length === 0 + ) { + const resp = await this.$axios.get("/platform/fellowship/manage/getUnionLimit", { + activityScopeId: this.formData.activityGroupId + }) + if (resp.code === 0) { + this.$set(this.formData.courseList[this.unionLimitIndex], "unionLimit", resp.data) + } + } + this.summaryCount = this.formData.courseList[this.unionLimitIndex].unionLimit.reduce((prev, curr) => { + const value = Number(curr.limitCount) + if (!isNaN(value)) { + return prev + curr.limitCount + } else { + return prev + } + }, 0) + }, + unionLimitQuickSetting() { + this.unionUserNumCalc.forEach((v, i) => { + const startNum = v.startNum + const endNum = v.endNum + const resultNum = v.resultNum + if (startNum > endNum) { + this.$message.warning("第" + (i + 1) + "行设置错误") + } else { + this.formData.courseList[this.unionLimitIndex].unionLimit.forEach((x) => { + if (x.teacherCount >= startNum && x.teacherCount <= endNum) { + x.limitCount = resultNum + } + }) + this.calSummaryCount() + } + }) + }, + doConfirmSetUpUnionLimit() { + this.setUpUnionLimitDialog = false + }, + //应用比例设置 + applyScaleSettings() { + this.formData.courseList[this.unionLimitIndex].unionLimit.forEach((v) => { + v.limitCount = parseFloat(((v.teacherCount * this.unionUserNumOneKeyRatio) / 100).toFixed(0)) + if (v.ratio) { + v.limitCount = parseFloat(((v.teacherCount * v.ratio) / 100).toFixed(0)) + } + }) + this.calSummaryCount() + }, + async clearUnionLimit() { + const confirm = await this.$confirm("确定要清空分工会人数限制吗, 是否继续?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }) + if ("confirm" === confirm) { + this.formData.courseList[this.unionLimitIndex].unionLimit = [] + this.unionUserNumOneKeyRatio = null + this.unionUserNumCalc = [{}] + this.setUpUnionLimitDialog = false + } + }, + }, + created() { + if(!this.formData.courseList) { + this.formData = {courseList: [{unionLimit: []}]} + } + }, + style: /*language=CSS*/ ` + + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/statistics/index.html b/src/main/resources/views/platform/zhgh/activity/fellowship/statistics/index.html new file mode 100644 index 00000000..98847f2a --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/statistics/index.html @@ -0,0 +1,156 @@ + + + + +
+ + + + + + + + + + + + + + + + 导出报名人员 + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/statistics/info.js b/src/main/resources/views/platform/zhgh/activity/fellowship/statistics/info.js new file mode 100644 index 00000000..e50f1302 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/statistics/info.js @@ -0,0 +1,98 @@ +const info = { + template: /*language=HTML*/ ` +
+ + + + + + + + + + + + + + {{key}} + + + + + + + + + + + + + +
+ `, + dicts: ["FELLOWSHIP_TYPE"], + data() { + return { + registerUserTableData: [], + registerUserTableColumns: [ + { label: "姓名", prop: "username" }, + { label: "工号", prop: "loginname" }, + { label: "单位", prop: "unitName" }, + { label: "分工会", prop: "unionName" }, + { label: "联系方式", prop: "mobile" }, + { label: "报名时间", prop: "signUpTime" }, + { label: "报名状态", prop: "state" } + ], + cloneTableColumns: [ + {label: '姓名', prop: 'username'}, + {label: '工号', prop: 'loginname'}, + {label: '单位', prop: 'unitName'}, + {label: '分工会', prop: 'unionName'}, + {label: '联系方式', prop: 'mobile'}, + {label: '报名时间', prop: 'signUpTime'}, + {label: '报名状态', prop: 'state'}, + ], + userSignInfo: {}, + clickRow: {} + } + }, + methods: { + async onOpen(row) { + this.clickRow = row + const resp_register = await this.$axios.post(loc() + "/registerUserList", {courseId: row.id}) + this.registerUserTableData = resp_register.data + const resp_signInfo = await this.$axios.post(loc() + "/getSignInfo", {courseId: row.id}) + this.userSignInfo = resp_signInfo.data + const resp_columnInfo = await $.get(loc() + '/getTaleColumnInfo', {courseId: row.id}) + if (resp_columnInfo.data) { + this.registerUserTableColumns = [] + this.registerUserTableColumns = this.cloneTableColumns.concat(resp_columnInfo.data) + } + } + }, + style: /*language=CSS*/ ` + + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/type/basicForm.js b/src/main/resources/views/platform/zhgh/activity/fellowship/type/basicForm.js new file mode 100644 index 00000000..c4444eac --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/type/basicForm.js @@ -0,0 +1,350 @@ +const basicForm = { + template: /*language=HTML*/ ` +
+ + + + + + + + + + 携带 + 不携带 + + + + + 纳入 + 不纳入 + + + + + 纳入 + 不纳入 + + + + +
+
+ 报名填写字段 + + 注:移动端报名时字段的显示顺序会按照下面表格中的序号进行排列、字段编码不能重复 + +
+
+ + + 添加 + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 取 消 + 确 定 +
+ + + + + + + + + + + +
+ 取 消 + 确 定 +
+
+
+ `, + dicts: ["FELLOWSHIP_TYPE"], + data() { + return { + formData: { + mobileSignColumnList: [{ isRequired: false }], + isBringFamily: false, + isAddFamily: false, + selfAddFamily: true, + }, + rules: { + typeName: [{ required: true, message: "请输入类型名称", trigger: ["change", "blur"] }], + code: [{ required: true, message: "请输入类型编码", trigger: ["change", "blur"] }], + isBringFamily: [{ required: true, message: "请选择是否携带家属", trigger: ["blur", "change"] }], + isAddFamily: [{ required: true, message: "请选择家属是否纳入总人数", trigger: ["blur", "change"] }] + }, + columnTypeOptions: [], + columnFormTypeList: [], + clickRow: {}, + paramFormRules: { + selectValues: [{ required: true, message: "请选择选项列表", trigger: ["blur"] }], + fileType: [{ required: true, message: "请选择文件类型", trigger: ["blur"] }], + fileNumber: [{ required: true, message: "请输入文件个数", trigger: ["blur", "change"] }] + }, + detailedParamsVisible: false, + } + }, + methods: { + isBringFamilyInput(o) { + this.$set(this.formData, "isAddFamily", o === true ? false : null) + if (o === true) { + this.formData.mobileSignColumnList.unshift({ + columnName: "携带亲属人数", + columnCode: "xdqsrs", + columnFormType: "INPUT", + columnType: "INT", + isRequired: true + }) + } else { + this.formData.mobileSignColumnList.forEach((item, index) => { + if (item.columnCode === "xdqsrs" && this.formData.isBringFamily === false) { + this.formData.mobileSignColumnList.splice(index, 1) + } + }) + } + }, + columnFormTypeChange(val, index) { + if (val === "FILE") { + this.formData.mobileSignColumnList[index].columnType = "JSON" + this.formData.mobileSignColumnList[index].isDisabled = true + } else { + this.formData.mobileSignColumnList[index].columnType = "" + this.formData.mobileSignColumnList[index].isDisabled = false + } + }, + doHandle() { + if (this.formData.id) { + this.doEdit() + } else { + this.doAdd() + } + }, + async doDetailParams() { + const isValid = await this.$refs["paramForm"].validate() + if (isValid) { + this.detailedParamsVisible = false + } + }, + openDetailedParams(row, index) { + this.clickRow = row + this.detailedParamsVisible = true + if (this.$refs["paramForm"]) this.$refs["paramForm"].clearValidate() + }, + doAdd() { + this.$refs["addForm"].validate((valid) => { + if (valid) { + const newListLength = new Set(this.formData.mobileSignColumnList.map((item) => item.columnCode)).size + const listLength = this.formData.mobileSignColumnList.length + if (listLength > newListLength) { + this.$message.warning('字段编码不能重复') + return + } + const cloneData = clone(this.formData) + this.$axios.post(loc() + "/doAdd", { data: JSON.stringify(cloneData) }).then((res) => { + if (res.code === 0) { + this.$message.success(res.msg) + this.$emit('refresh') + } else { + this.$message.error(res.msg) + } + }) + } + }) + }, + doEdit() { + this.$refs["addForm"].validate((valid) => { + if (valid) { + const newListLength = new Set(this.formData.mobileSignColumnList.map((item) => item.columnCode)).size + const listLength = this.formData.mobileSignColumnList.length + if (listLength > newListLength) { + this.$message.warning('字段编码不能重复') + return + } + const cloneData = clone(this.formData) + cloneData.mobileSignColumnList = JSON.stringify(cloneData.mobileSignColumnList) + this.$axios.post(loc() + "/doEdit", cloneData).then((res) => { + if (res.code === 0) { + this.$message.success(res.msg) + this.$emit('refresh') + } else { + this.$message.error(res.msg) + } + }) + } + }) + }, + async getColTypeOptions() { + const resp = await this.$axios.get(loc() + "/getColumnType") + this.columnTypeOptions = resp.data + }, + async getEnumOptions() { + const resp = await this.$axios.post("/open/common/dictEnumOptions", { name: "ColumnFormTypeEnum" }) + return resp.data + }, + initData(row) { + if(row && row.id) { + this.formData = JSON.parse(JSON.stringify(row)) + this.formData.mobileSignColumnList.forEach((item) => { + item.isDisabled = item.columnFormType === "FILE" + }) + } else { + this.formData = { + mobileSignColumnList: [{ isRequired: false }], + isBringFamily: false, + isAddFamily: false, + selfAddFamily: true, + } + if (this.$refs["addForm"]) this.$refs["addForm"].resetFields() + } + }, + }, + async created() { + await this.getColTypeOptions() + this.columnFormTypeList = await this.getEnumOptions() + }, + style: /*language=CSS*/ ` + + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/type/index.html b/src/main/resources/views/platform/zhgh/activity/fellowship/type/index.html new file mode 100644 index 00000000..7aee3621 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/type/index.html @@ -0,0 +1,120 @@ + + + + +
+ + + + + + +
+ + diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/userAdjust/index.html b/src/main/resources/views/platform/zhgh/activity/fellowship/userAdjust/index.html new file mode 100644 index 00000000..0d29639b --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/userAdjust/index.html @@ -0,0 +1,144 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/userAdjust/userInfo.js b/src/main/resources/views/platform/zhgh/activity/fellowship/userAdjust/userInfo.js new file mode 100644 index 00000000..753a54c5 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/userAdjust/userInfo.js @@ -0,0 +1,226 @@ +const userInfo = { + template: /*language=HTML*/ ` +
+
{{ registerCourse.courseName + '报名人员' }}
+
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + 注:如单选为灰色选择不了,则表示对应的{{ trainType }}人数已满!候补报名不做调整。 + + + + + + + + + + + + + 取 消 + 确 定 + + +
+ `, + dicts: ["FELLOWSHIP_TYPE"], + data() { + return { + afterAdjustCourse: "", + adjustDialogVisible: false, + unionList: [], + unitList: [], + registerForm: { + unionId: "", + unitId: "" + }, + registerCourse: {}, + courseList: [], + userInfo: {}, + chooseRow: {}, + registerUserTableData: [], + registerUserTableColumns: [ + { label: "姓名", prop: "username" }, + { label: "工号", prop: "loginname" }, + { label: "单位", prop: "unitName" }, + { label: "分工会", prop: "unionName" }, + { label: "联系方式", prop: "mobile" }, + { label: "报名时间", prop: "signUpTime" }, + { label: "报名状态", prop: "state" } + ], + trainType: '', + activity: {}, + } + }, + methods: { + async onOpen(row, activity) { + this.registerCourse = row + this.registerForm.courseId = row.id + this.activity = activity + const resp_register = await this.$axios.post(loc() + "/registerUserList", this.registerForm) + this.registerUserTableData = resp_register.data + + const type = this.dict.type.FELLOWSHIP_TYPE.find(o => o.code === activity.trainType) + this.trainType = type?.name || "培训班" + }, + getCurrentRow(row) { + this.chooseRow = row + }, + async doAdjust() { + if (!this.afterAdjustCourse) { + this.$message.warning("请选择要调整的" + this.trainType + "!") + return + } + this.$confirm( + "您确定要将" + + "" + + this.userInfo.username + + "" + + "的报名信息调整到" + + "" + + this.chooseRow.courseName + + "" + + "中吗?", + "提示", + { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning", + dangerouslyUseHTMLString: true + } + ) + .then(async () => { + const loading = this.$loading({ + lock: true, + text: "努力调整中,感谢您的耐心等待。。。", + spinner: "el-icon-loading", + background: "rgba(0, 0, 0, 0.7)" + }) + const resp = await this.$axios.post(loc() + "/adjust", { + activityId: this.activity.id, + oldCourseId: this.registerCourse.id, + newCourseId: this.afterAdjustCourse, + userId: this.userInfo.userId + }) + loading.close() + if (resp.code === 0) { + this.$message.success(resp.msg) + this.adjustDialogVisible = false + await this.registerSearch() + this.$emit("refresh", null) + } else { + this.$message.warning(resp.msg) + } + }) + .catch(() => {}) + }, + async adjust(o) { + this.userInfo = o + this.afterAdjustCourse = "" + await this.getCourse(this.activity.id) + this.adjustDialogVisible = true + }, + deleteSignUser(o) { + this.$confirm("您确定要删除" + "" + o.username + "" + "的报名信息吗?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning", + dangerouslyUseHTMLString: true + }) + .then(async () => { + const resp = await this.$axios.post(loc() + "/deleteSignUser", { + activityId: this.activity.id, + courseId: this.registerCourse.id, + userId: o.userId + }) + if (resp.code === 0) { + this.$message.success(resp.msg) + await this.registerSearch() + this.$emit("refresh", null) + } else { + this.$message.warning(resp.msg) + } + }) + .catch(() => {}) + }, + async registerSearch() { + this.registerForm.courseId = this.registerCourse.id + const resp_register = await $.get(loc() + "/registerUserList", this.registerForm) + this.registerUserTableData = resp_register.data + }, + async getCourse(val) { + const {data} = await this.$axios.post(loc() + "/getCourse", {activityId: val}) + this.courseList = data + }, + async getUnitList() { + this.unitList = await this.$businessTool.listUnit(this.registerForm.unionId) + } + }, + async created() { + this.unionList = await this.$businessTool.listUnion() + this.unitList = await this.$businessTool.listUnit(this.registerForm.unionId) + }, + style: /*language=CSS*/ ` + /deep/ .adjustDialog .el-radio__label { + display: none; + } + /deep/ .adjustDialog .el-dialog__body { + max-height: 600px; + overflow-y: auto; + } + ` +} diff --git a/src/main/resources/views/platform/zhgh/activity/fellowship/userManage/index.html b/src/main/resources/views/platform/zhgh/activity/fellowship/userManage/index.html new file mode 100644 index 00000000..5f086e32 --- /dev/null +++ b/src/main/resources/views/platform/zhgh/activity/fellowship/userManage/index.html @@ -0,0 +1,235 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + 补充人员 + 导出签到名单 + 导出领取名单 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 取 消 + 确 定 + + +
+ + + + diff --git a/src/main/resources/views/platform/zhgh/club/common/clubUserJoin.js b/src/main/resources/views/platform/zhgh/club/common/clubUserJoin.js index 37ffcab2..1821ff27 100644 --- a/src/main/resources/views/platform/zhgh/club/common/clubUserJoin.js +++ b/src/main/resources/views/platform/zhgh/club/common/clubUserJoin.js @@ -53,6 +53,12 @@ const clubUserJoin = { + + + 暂无 +