From f3c3adaa8006e2187d2e6795c9b15f031c7a23f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=8C=E5=85=88=E8=88=9C?= <2499071264@qq.com> Date: Fri, 11 Sep 2026 13:45:00 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=B4=BB=E5=8A=A8?= =?UTF-8?q?=E4=BA=BA=E6=95=B0=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/TrainSignUpApplyController.java | 72 ++++++++++++++++--- .../manage/TrainSignUpManageController.java | 20 ++++++ .../components/plugins/sysUpload/index.vue | 6 +- .../activity/trainSignUp/apply/applyForm.js | 13 ++-- .../activity/trainSignUp/apply/courseList.js | 29 +++++--- .../activity/trainSignUp/apply/index.html | 1 + .../activity/trainSignUp/manage/basicForm.js | 18 +++++ .../activity/trainSignUp/manage/courseTime.js | 10 ++- .../activity/trainSignUp/manage/unionForm.js | 10 ++- .../activity/trainSignUp/common/times.js | 15 +++- .../activity/trainSignUp/list/applyForm.js | 20 ++++-- .../activity/trainSignUp/list/index.html | 41 ++++++++--- 12 files changed, 210 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyController.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyController.java index 5a0dce0..621f3c2 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpApplyController.java @@ -86,6 +86,7 @@ public class TrainSignUpApplyController { @Param(value = "id") String id, @Param(value = "dataType") String dataType) { Cnd cnd = Cnd.NEW(); + cnd.and("isDisabled", "=", false); cnd.andEX("id", "=", id); cnd.andEX("`year`", "=", year); //查询报名中 @@ -150,6 +151,7 @@ public class TrainSignUpApplyController { Cnd cnd = Cnd.NEW(); cnd.andEX("type.id", "=", courseTypeId); cnd.and("tsuc.activityId", "=", activityId); + cnd.and(new Static("tsuc.activityId in (select id from train_sign_up_activity where isDisabled = 0)")); if (Lang.isNotEmpty(assortTypes)) { cnd.and("tsuc.assort", "in", assortTypes); @@ -174,6 +176,7 @@ public class TrainSignUpApplyController { List courseTimes = dao.query(TrainSignUpActivityCourse.class, Cnd.where("courseId", "=", c.getString("id")).asc("courseDate")); c.put("courseTimes", courseTimes); + c.put("quotaScope", "活动"); c.put("hasRegisterNum", statisticsService.queryCourseCount(c.getString("id"), c.getString("courseType"))); c.put("hasWaitingNum", statisticsService.queryCourseWaitCount(c.getString("id"), c.getString("courseType"))); //当前用户是否报过 @@ -184,7 +187,10 @@ public class TrainSignUpApplyController { if (Lang.isNotEmpty(unionLimit)) { NutMap nutMap = unionLimit.stream().filter(o -> o.getString("id").equals(SecurityUtil.getUnionId())).findFirst().orElse(null); if (nutMap != null) { + c.put("quotaScope", "本工会"); c.put("coursePeopleNumber", nutMap.getInt("limitCount")); + c.put("hasRegisterNum", statisticsService.queryCourseCount(c.getString("id"), c.getString("courseType"), SecurityUtil.getUnionId())); + c.put("courseReservedNumber", 0); } } } @@ -225,7 +231,11 @@ public class TrainSignUpApplyController { currentFamilyNumber = currentFamilyNumber != null ? currentFamilyNumber : 0; TrainSignUpCourse course = dao.fetch(TrainSignUpCourse.class, courseId); + if (course == null) return Result.error("子活动不存在"); TrainSignUpActivity activity = dao.fetch(TrainSignUpActivity.class, course.getActivityId()); + if (activity == null || activity.isDisabled()) { + return Result.error("活动已关闭或不存在,无法报名"); + } //判断时间 if (DateUtil.compare(new Date(), activity.getActivitySignUpStartTime(), "yyyy-MM-dd HH:mm:ss") < 0) { @@ -282,6 +292,23 @@ public class TrainSignUpApplyController { @ApiOperation("查询子活动时间段") @SaCheckPermission(value = {"trainSignUp.apply", "h5.trainSignUp.apply"}, mode = SaMode.OR) public Result getCourseTimeSelectList(String courseId) { + TrainSignUpCourse course = dao.fetch(TrainSignUpCourse.class, courseId); + if (course == null) return Result.error("子活动不存在"); + int normalRemaining = Integer.MAX_VALUE; + if (course.getCoursePeopleNumber() > 0) { + normalRemaining = Math.max(0, course.getCoursePeopleNumber() - course.getCourseReservedNumber() + - statisticsService.queryCourseCount(courseId, course.getCourseType())); + } + if (Lang.isNotEmpty(course.getUnionLimit())) { + String unionId = SecurityUtil.getUnionId(); + NutMap union = course.getUnionLimit().stream().filter(v -> v.getString("id").equals(unionId)).findFirst().orElse(null); + int unionRemaining = union == null || StrUtil.isBlank(unionId) ? 0 : Math.max(0, union.getInt("limitCount") + - statisticsService.queryCourseCount(courseId, course.getCourseType(), unionId)); + normalRemaining = Math.min(normalRemaining, unionRemaining); + } + final int availableNormal = normalRemaining; + boolean signFull = trainSignUpActivityService.isSignFull(course, 0) + || trainSignUpActivityService.isSignFullByUnionId(course, 0); // 查课程的时间段 List courseList = dao.query(TrainSignUpActivityCourse.class, Cnd.where("courseId", "=", courseId).asc("courseStartTime")); @@ -299,14 +326,20 @@ public class TrainSignUpApplyController { String id = v.getId(); NutMap nutMap = NutMap.NEW(); List trainSignUpUserCourses = collectMap.get(id); - int remainingNum = v.getCourseLimitNum() != null ? v.getCourseLimitNum() : 0; - if (Lang.isNotEmpty(trainSignUpUserCourses)) { - remainingNum = v.getCourseLimitNum() - trainSignUpUserCourses.size(); - } + int timeRemaining = Math.max(0, (v.getCourseLimitNum() == null ? 0 : v.getCourseLimitNum()) + - (trainSignUpUserCourses == null ? 0 : trainSignUpUserCourses.size())); + int remainingNum = Math.min(timeRemaining, availableNormal); + boolean expired = v.getCourseEndTime() == null || !v.getCourseEndTime().after(new Date()); + boolean disabled = expired || signFull || timeRemaining == 0; nutMap.put("remainingNum", remainingNum); - nutMap.put("text", DateUtil.format(v.getCourseStartTime(), "MM月dd日 HH:mm") + "至" + DateUtil.format(v.getCourseEndTime(), "HH:mm") + "段(剩" + remainingNum + ")"); + nutMap.put("limitNum", v.getCourseLimitNum() == null ? 0 : v.getCourseLimitNum()); + String timeText = DateUtil.format(v.getCourseStartTime(), "MM月dd日 HH:mm") + " - " + DateUtil.format(v.getCourseEndTime(), "HH:mm"); + nutMap.put("timeText", timeText); + nutMap.put("text", timeText + " (余" + remainingNum + ")"); + nutMap.put("expired", expired); + nutMap.put("endTime", v.getCourseEndTime() == null ? 0 : v.getCourseEndTime().getTime()); nutMap.put("value", id); - nutMap.put("disabled", remainingNum == 0); + nutMap.put("disabled", disabled); return nutMap; }).toList(); return Result.success(list); @@ -319,15 +352,27 @@ public class TrainSignUpApplyController { try { lock.lock(); + if (StrUtil.isBlank(activityCourseId) || StrUtil.isBlank(courseId)) { + return Result.error("请选择报名时间段"); + } + TrainSignUpActivityCourse course = dao.fetch(TrainSignUpActivityCourse.class, activityCourseId); + if (course == null || !courseId.equals(course.getCourseId())) { + return Result.error("报名时间段无效,请重新选择"); + } + if (course.getCourseEndTime() == null || !course.getCourseEndTime().after(new Date())) { + return Result.error("该时间段已结束,无法报名,请重新选择"); + } List userList = dao.query(TrainSignUpUser.class, Cnd.where("courseId", "=", courseId).and("state", "=", 1)); List isList = userList.stream().map(TrainSignUpUser::getUserId).toList(); // 该时间段下已报名的人数 - int count = dao.count(TrainSignUpUserCourse.class, Cnd.where("activityCourseId", "=", activityCourseId) + int count = isList.isEmpty() ? 0 : dao.count(TrainSignUpUserCourse.class, Cnd.where("activityCourseId", "=", activityCourseId) .and("courseId", "=", courseId).and("userId", "in", isList)); // 获取该时间段下的活动课程限制报名人数 - TrainSignUpActivityCourse course = dao.fetch(TrainSignUpActivityCourse.class, activityCourseId); Integer courseLimitNum = course.getCourseLimitNum(); + if (courseLimitNum == null || courseLimitNum < 1) { + return Result.error("该时间段名额设置无效,暂不能报名"); + } // 报名加上自己,如果大于了限制人数,那就无法报名 if (count + 1 > courseLimitNum) { return Result.error("该时间段名额已报满,请选择其他时段报名"); @@ -356,6 +401,11 @@ public class TrainSignUpApplyController { //判断人数 int number = 0; TrainSignUpCourse course = trainSignUpActivityService.dao().fetch(TrainSignUpCourse.class, trainSignUpUser.getCourseId()); + if (course == null) return Result.error("子活动不存在"); + TrainSignUpActivity activity = dao.fetch(TrainSignUpActivity.class, course.getActivityId()); + if (activity == null || activity.isDisabled()) { + return Result.error("活动已关闭或不存在,无法报名"); + } TrainSignUpType type = trainSignUpActivityService.dao().fetch(TrainSignUpType.class, course.getCourseType()); if (type != null) { if (type.getIsBringFamily() && type.getIsAddFamily()) { @@ -372,6 +422,12 @@ public class TrainSignUpApplyController { if (signFullByUnionId) { return Result.error("该活动您所在的分工会名额不足"); } + if (Boolean.TRUE.equals(course.getCourseIsLimitApply())) { + Result timeResult = validateSourceSignUp(trainSignUpUser.getActivityCourseId(), course.getId()); + if (!timeResult.isSuccess()) { + return timeResult; + } + } trainSignUpActivityService.doSignUp(trainSignUpUser); return Result.success("报名成功"); } catch (Exception e) { diff --git a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpManageController.java b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpManageController.java index 21fc469..a0e8bb7 100644 --- a/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpManageController.java +++ b/src/main/java/com/budwk/app/zhgh/activity/trainSignUp/controller/manage/TrainSignUpManageController.java @@ -154,6 +154,26 @@ public class TrainSignUpManageController { @SaCheckPermission("trainSignUp.manage") @SLog(tag = "品牌活动-活动管理", msg = "新增/修改活动") public Result doHandle(TrainSignUpActivity activity) { + if (activity.getCourseList() != null) { + for (int i = 0; i < activity.getCourseList().size(); i++) { + TrainSignUpCourse course = activity.getCourseList().get(i); + int peopleNumber = course.getCoursePeopleNumber(); + if (peopleNumber <= 0) continue; + if (Boolean.TRUE.equals(course.getCourseIsLimitApply()) && course.getCourseTimeList() != null) { + long timeTotal = course.getCourseTimeList().stream() + .mapToLong(v -> v.getCourseLimitNum() == null ? 0 : v.getCourseLimitNum()).sum(); + if (timeTotal > peopleNumber) { + return Result.error("第" + (i + 1) + "行各时间段限制人数合计为" + timeTotal + "人,不能超过子活动人数" + peopleNumber + "人"); + } + } + if (course.getUnionLimit() != null) { + long unionTotal = course.getUnionLimit().stream().mapToLong(v -> v.getInt("limitCount", 0)).sum(); + if (unionTotal > peopleNumber) { + return Result.error("第" + (i + 1) + "行分工会限制总人数为" + unionTotal + "人,不能超过子活动人数" + peopleNumber + "人"); + } + } + } + } if (StrUtil.isBlank(activity.getId())) { trainSignUpActivityManageService.add(activity, null); } else { diff --git a/src/main/resources/static/components/plugins/sysUpload/index.vue b/src/main/resources/static/components/plugins/sysUpload/index.vue index 83b916a..e18c634 100644 --- a/src/main/resources/static/components/plugins/sysUpload/index.vue +++ b/src/main/resources/static/components/plugins/sysUpload/index.vue @@ -382,10 +382,8 @@ module.exports = { handleRemove(file, fileList) { if (this.upload_result_category === "interval") { - if (this.upload_result_type === "id") { - } - if (this.upload_result_type === "url") { - } + this.$emit("update:value", fileList.map((e) => e.response.data).join(",")) + return } if (this.upload_result_category === "array") { diff --git a/src/main/resources/views/platform/zhgh/activity/trainSignUp/apply/applyForm.js b/src/main/resources/views/platform/zhgh/activity/trainSignUp/apply/applyForm.js index 54d868c..774f41b 100644 --- a/src/main/resources/views/platform/zhgh/activity/trainSignUp/apply/applyForm.js +++ b/src/main/resources/views/platform/zhgh/activity/trainSignUp/apply/applyForm.js @@ -46,9 +46,11 @@ const applyForm = { :rules="{ required: true, message: '请选择报名时段', trigger: 'blur'}"> + :key="item.value"> + {{item.timeText}} (余{{item.remainingNum}}) + @@ -123,12 +125,13 @@ const applyForm = { async getCourseTimeSelectList(o) { const resp = await $.post('/platform/trainSignUp/apply/getCourseTimeSelectList',{ courseId: o.id }) if (resp.code === 0) { - this.courseTimeSelectList = resp.data + this.courseTimeSelectList = resp.data.filter(item => !item.expired && item.endTime > Date.now()) } else { this.$message.warning('获取时段信息失败,请联系管理员') } }, async onOpen(row, course) { + this.$set(this.formData, "activityCourseId", undefined) this.initData(row, course) if (row.courseIsLimitApply) { await this.getCourseTimeSelectList(row) @@ -192,8 +195,8 @@ const applyForm = { 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, '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) diff --git a/src/main/resources/views/platform/zhgh/activity/trainSignUp/apply/courseList.js b/src/main/resources/views/platform/zhgh/activity/trainSignUp/apply/courseList.js index 59d0cff..48c62fd 100644 --- a/src/main/resources/views/platform/zhgh/activity/trainSignUp/apply/courseList.js +++ b/src/main/resources/views/platform/zhgh/activity/trainSignUp/apply/courseList.js @@ -187,6 +187,17 @@ const courseList = { this.queryCourseAssort() }, onSign(row) { + const user = this.$store.state.user + const missingFields = [] + if (!user?.unit?.name) missingFields.push("所属单位") + if (!user?.union?.name) missingFields.push("所属工会") + if (missingFields.length > 0) { + this.$alert("您的" + missingFields.join("、") + "信息缺失,暂无法报名,请联系管理员完善人员信息", "提示", { + confirmButtonText: "确定", + type: "warning" + }) + return + } const course = this.courseTypeList.find((v) => v.id === row.courseType) this.$axios.post("/platform/trainSignUp/apply/validateSignUp", {courseId: row.id}) .then((res) => { @@ -260,17 +271,19 @@ const courseList = { }) }, calcSignUpCount(o) { - if(!o.coursePeopleNumber) { - return "名额数不限制" + const scope = o.quotaScope || "活动" + if(!Number(o.coursePeopleNumber) && scope !== "本工会") { + return "已报名" + (Number(o.hasRegisterNum) || 0) + "人" } - let lave = o.coursePeopleNumber - (o.hasRegisterNum + o.courseReservedNumber) + const remaining = Math.max(0, o.coursePeopleNumber - (o.hasRegisterNum + o.courseReservedNumber)) + if(o.courseIsLimitApply) { + return "余" + remaining + "/" + o.coursePeopleNumber + "人" + } + let text = "余" + remaining + "/" + o.coursePeopleNumber + "人" if(o.reserveMode === 2) { - let lave2 = o.waitingNum - o.hasWaitingNum - return "余" + lave +"/" + o.coursePeopleNumber + "人" - + ",候补余" + lave2 + "/" + o.waitingNum + "人" - } else { - return "余" + lave +"/" + o.coursePeopleNumber + "人" + text += ",活动候补余" + Math.max(0, o.waitingNum - o.hasWaitingNum) + "/" + o.waitingNum + "人" } + return text }, async pageData() { const pageForm = clone({...this.pageForm}) diff --git a/src/main/resources/views/platform/zhgh/activity/trainSignUp/apply/index.html b/src/main/resources/views/platform/zhgh/activity/trainSignUp/apply/index.html index a7c74d8..ea6a0ec 100644 --- a/src/main/resources/views/platform/zhgh/activity/trainSignUp/apply/index.html +++ b/src/main/resources/views/platform/zhgh/activity/trainSignUp/apply/index.html @@ -106,6 +106,7 @@ layout("/layouts/platform.html"){ new Vue({ el: "#app", + store, mixins: [initTableMixins], components: { "course-list": courseList, diff --git a/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/basicForm.js b/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/basicForm.js index be620f4..152fa65 100644 --- a/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/basicForm.js +++ b/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/basicForm.js @@ -567,6 +567,24 @@ const basicForm = { }) }, async doHandle(type) { + const limitInvalid = this.formData.courseList.some((course, index) => { + if (!(course.coursePeopleNumber > 0)) return false + const rowLabel = "第" + (index + 1) + "行" + if (course.courseIsLimitApply) { + const timeTotal = (course.courseTimeList || []).reduce((sum, item) => sum + (Number(item.courseLimitNum) || 0), 0) + if (timeTotal > course.coursePeopleNumber) { + this.$message.warning(rowLabel + "各时间段限制人数合计为" + timeTotal + "人,不能超过子活动人数" + course.coursePeopleNumber + "人") + return true + } + } + const unionTotal = (course.unionLimit || []).reduce((sum, item) => sum + (Number(item.limitCount) || 0), 0) + if (unionTotal > course.coursePeopleNumber) { + this.$message.warning(rowLabel + "分工会限制总人数为" + unionTotal + "人,不能超过子活动人数" + course.coursePeopleNumber + "人") + return true + } + return false + }) + if (limitInvalid) return const cloneData = clone(this.formData) cloneData.activitySignUpStartTime = cloneData.activitySignTime !== undefined ? cloneData.activitySignTime[0] : null cloneData.activitySignUpEndTime = cloneData.activitySignTime !== undefined ? cloneData.activitySignTime[1] : null diff --git a/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/courseTime.js b/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/courseTime.js index 56f2a29..d850c0e 100644 --- a/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/courseTime.js +++ b/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/courseTime.js @@ -179,7 +179,15 @@ const courseTime = { }, //设置课程时间确定 doConfirmSetUpCourse() { - const courseTableData = this.formData.courseList[this.courseIndex].courseTimeList + const course = this.formData.courseList[this.courseIndex] + const courseTableData = course.courseTimeList + if (course.coursePeopleNumber > 0 && course.courseIsLimitApply) { + const total = courseTableData.reduce((sum, item) => sum + (Number(item.courseLimitNum) || 0), 0) + if (total > course.coursePeopleNumber) { + this.$message.warning("各时间段限制人数合计为" + total + "人,不能超过子活动人数" + course.coursePeopleNumber + "人") + return + } + } if (courseTableData.length === 0) { this.$message.warning("请填写时间!") return diff --git a/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/unionForm.js b/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/unionForm.js index 448efbb..6111976 100644 --- a/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/unionForm.js +++ b/src/main/resources/views/platform/zhgh/activity/trainSignUp/manage/unionForm.js @@ -134,7 +134,7 @@ const unionForm = { this.summaryCount = array.reduce((prev, curr) => { const value = Number(curr.limitCount) if (!isNaN(value)) { - return prev + curr.limitCount + return prev + value } else { return prev } @@ -160,7 +160,7 @@ const unionForm = { this.summaryCount = this.formData.courseList[this.unionLimitIndex].unionLimit.reduce((prev, curr) => { const value = Number(curr.limitCount) if (!isNaN(value)) { - return prev + curr.limitCount + return prev + value } else { return prev } @@ -184,6 +184,12 @@ const unionForm = { }) }, doConfirmSetUpUnionLimit() { + const course = this.formData.courseList[this.unionLimitIndex] + this.calSummaryCount() + if (course.coursePeopleNumber > 0 && this.summaryCount > course.coursePeopleNumber) { + this.$message.warning("分工会限制总人数为" + this.summaryCount + "人,不能超过子活动人数" + course.coursePeopleNumber + "人") + return + } this.setUpUnionLimitDialog = false }, //应用比例设置 diff --git a/src/main/resources/views/platform/zhghh5/activity/trainSignUp/common/times.js b/src/main/resources/views/platform/zhghh5/activity/trainSignUp/common/times.js index f001bf8..9cb63ae 100644 --- a/src/main/resources/views/platform/zhghh5/activity/trainSignUp/common/times.js +++ b/src/main/resources/views/platform/zhghh5/activity/trainSignUp/common/times.js @@ -6,9 +6,10 @@ const times = {
-