diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/tour/controller/TourMySignupController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/tour/controller/TourMySignupController.java index dccbe3f..aaf800d 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/tour/controller/TourMySignupController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/tour/controller/TourMySignupController.java @@ -145,6 +145,8 @@ public class TourMySignupController { IFNULL(GROUP_CONCAT(DISTINCT task.displayName), IF(ins.id IS NULL, '', '结束')) AS curTaskName, IFNULL(f.familyCount, 0) AS familyCount, COALESCE(m.travelEndTime, tp.travelEndTime) AS travelEndTime, + COALESCE(NULLIF(s.signupStartTime, ''), m.signupStartTime) AS signupStartTime, + COALESCE(NULLIF(s.signupEndTime, ''), m.signupEndTime) AS signupEndTime, CASE WHEN IFNULL(NULLIF(m.undertakeStatus, ''), 'unclaimed') = 'claimed' THEN COALESCE(u.name, '校工会') ELSE '' @@ -166,6 +168,7 @@ public class TourMySignupController { GROUP BY ledgerId ) f ON f.ledgerId = t.id LEFT JOIN tour_matter m ON m.id = t.matterId AND m.delFlag = 0 + LEFT JOIN tour_setting s ON s.id = m.settingId AND s.delFlag = 0 LEFT JOIN sys_union u ON u.id = m.unionId LEFT JOIN ( SELECT @@ -290,6 +293,8 @@ public class TourMySignupController { m.unionId AS matterUnionId, m.travelStartTime, m.travelEndTime, + COALESCE(NULLIF(s.signupStartTime, ''), m.signupStartTime) AS signupStartTime, + COALESCE(NULLIF(s.signupEndTime, ''), m.signupEndTime) AS signupEndTime, m.maxSignupPeople, CASE WHEN IFNULL(m.travelStartTime, '') <> '' AND IFNULL(m.travelEndTime, '') <> '' @@ -324,6 +329,10 @@ public class TourMySignupController { if (isTravelEnded(matter.getString("travelEndTime"))) { return Result.error("线路出行已结束,不能修改"); } + Result signupEndResult = checkSignupEndTime(ledger); + if (signupEndResult != null) { + return signupEndResult; + } Cnd familyCnd = Cnd.where(TourLedgerFamily::getDelFlag, "=", false) .and(TourLedgerFamily::getLedgerId, "=", ledger.getId()); familyCnd.asc(TourLedgerFamily::getCreatedAt); @@ -516,6 +525,10 @@ public class TourMySignupController { if (ledger == null) { return Result.error("报名记录不存在"); } + Result signupEndResult = checkSignupEndTime(ledger); + if (signupEndResult != null) { + return signupEndResult; + } tourLedgerFamilyService.clear(Cnd.where(TourLedgerFamily::getLedgerId, "=", ledger.getId())); tourLedgerDirectRelativeService.clear(Cnd.where(TourLedgerDirectRelative::getLedgerId, "=", ledger.getId())); tourLedgerService.clear(Cnd.where(TourLedger::getId, "=", ledger.getId())); @@ -531,6 +544,10 @@ public class TourMySignupController { if (ledger == null) { return Result.error("报名记录不存在"); } + Result signupEndResult = checkSignupEndTime(ledger); + if (signupEndResult != null) { + return signupEndResult; + } tourLedgerFamilyService.clear(Cnd.where(TourLedgerFamily::getLedgerId, "=", ledger.getId())); tourLedgerDirectRelativeService.clear(Cnd.where(TourLedgerDirectRelative::getLedgerId, "=", ledger.getId())); tourLedgerService.clear(Cnd.where(TourLedger::getId, "=", ledger.getId())); @@ -601,6 +618,29 @@ public class TourMySignupController { return null; } + /** + * 修改和取消报名都必须受有效报名结束时间控制,避免前端隐藏按钮后仍可直接调用接口。 + */ + private Result checkSignupEndTime(TourLedger ledger) { + if (ledger == null || StrUtil.isBlank(ledger.getMatterId())) { + return null; + } + TourMatter matter = tourMatterService.fetch(ledger.getMatterId()); + if (matter == null || Boolean.TRUE.equals(matter.getDelFlag()) || !Boolean.TRUE.equals(matter.getEnabled())) { + return null; + } + TourSetting setting = tourLedgerService.dao().fetch(TourSetting.class, matter.getSettingId()); + String signupEndTime = defaultIfBlank(setting == null ? "" : setting.getSignupEndTime(), matter.getSignupEndTime()); + if (StrUtil.isBlank(signupEndTime)) { + return null; + } + String now = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + if (now.compareTo(normalizeDateTime(signupEndTime, true)) > 0) { + return Result.error("报名已结束,不能修改或取消报名"); + } + return null; + } + private Result checkSignupRule(TourLedger ledger, TourMatter matter, TourLedger oldLedger, int currentPeopleCount) { if (matter == null || Boolean.TRUE.equals(matter.getDelFlag()) || !Boolean.TRUE.equals(matter.getEnabled())) { return Result.error("报名出行时段不存在或已停用"); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/tour/controller/TourUndertakeController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/tour/controller/TourUndertakeController.java index d110258..937ff35 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/tour/controller/TourUndertakeController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/tour/controller/TourUndertakeController.java @@ -1,16 +1,22 @@ package com.budwk.app.zhgh.dayofficework.tour.controller; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.StrUtil; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.param.PageForm; import com.budwk.app.base.result.Result; +import com.budwk.app.base.utils.CommonDownloadUtil; import com.budwk.app.sys.models.Sys_union; import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.dayofficework.tour.service.TourLedgerService; import com.budwk.app.zhgh.dayofficework.tour.service.TourMatterService; +import org.apache.poi.ss.usermodel.Workbook; import org.nutz.dao.Cnd; import org.nutz.dao.Sqls; import org.nutz.dao.sql.Sql; @@ -21,6 +27,7 @@ import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; +import javax.servlet.http.HttpServletResponse; import java.time.LocalDate; import java.util.ArrayList; import java.util.HashMap; @@ -263,10 +270,20 @@ public class TourUndertakeController { Cnd cnd = buildSignupQueryCnd(matterId, keyword, unionId, groupCode); Sql countSql = Sqls.create(""" SELECT COUNT(1) - FROM tour_ledger t - INNER JOIN tour_matter m ON m.id = t.matterId - INNER JOIN tour_line l ON l.id = m.lineId - $condition + FROM ( + SELECT t.id AS rowId + FROM tour_ledger t + INNER JOIN tour_matter m ON m.id = t.matterId + INNER JOIN tour_line l ON l.id = m.lineId + $condition + UNION ALL + SELECT f.id AS rowId + FROM tour_ledger t + INNER JOIN tour_matter m ON m.id = t.matterId + INNER JOIN tour_line l ON l.id = m.lineId + INNER JOIN tour_ledger_family f ON f.ledgerId = t.id AND f.delFlag = 0 + $condition + ) p """); countSql.setCondition(cnd); countSql.setCallback(Sqls.callback.integer()); @@ -274,26 +291,63 @@ public class TourUndertakeController { int count = countSql.getInt(); Sql listSql = Sqls.create(""" - SELECT - t.id, - t.jobNo, - t.userName, - t.gender, - '' AS mobile, - t.idCard, - t.unionId, - t.unionName, - t.signupTime, - t.groupCode, - t.groupName - FROM tour_ledger t - INNER JOIN tour_matter m ON m.id = t.matterId - INNER JOIN tour_line l ON l.id = m.lineId - $condition - ORDER BY $orderColumn $orderBy, t.signupTime ASC, t.createdAt ASC + SELECT * + FROM ( + SELECT + t.id, + t.id AS ledgerId, + t.jobNo, + t.userName, + t.gender, + '' AS mobile, + t.idCard, + t.unionId, + t.unionName, + t.signupTime, + t.groupCode, + t.groupName, + 1 AS staffRow, + '教职工' AS rowTypeName, + '' AS relationship, + t.userName AS relatedStaffName, + 0 AS rowSort, + t.createdAt AS ledgerCreatedAt, + t.createdAt + FROM tour_ledger t + INNER JOIN tour_matter m ON m.id = t.matterId + INNER JOIN tour_line l ON l.id = m.lineId + $condition + UNION ALL + SELECT + f.id, + t.id AS ledgerId, + '' AS jobNo, + f.familyName AS userName, + f.gender, + '' AS mobile, + f.idCard, + t.unionId, + '' AS unionName, + t.signupTime, + t.groupCode, + t.groupName, + 0 AS staffRow, + '家属' AS rowTypeName, + f.relationship, + t.userName AS relatedStaffName, + 1 AS rowSort, + t.createdAt AS ledgerCreatedAt, + f.createdAt + FROM tour_ledger t + INNER JOIN tour_matter m ON m.id = t.matterId + INNER JOIN tour_line l ON l.id = m.lineId + INNER JOIN tour_ledger_family f ON f.ledgerId = t.id AND f.delFlag = 0 + $condition + ) p + ORDER BY $orderColumn $orderBy, p.signupTime ASC, p.ledgerCreatedAt ASC, p.rowSort ASC, p.createdAt ASC """); listSql.setCondition(cnd); - listSql.setVar("orderColumn", getSignupOrderColumn(pageForm.getPageOrderName())); + listSql.setVar("orderColumn", getSignupUnionOrderColumn(pageForm.getPageOrderName())); listSql.setVar("orderBy", "ascending".equals(pageForm.getPageOrderBy()) ? "asc" : "desc"); listSql.setPager(tourLedgerService.dao().createPager(pageForm.getPageNumber(), pageForm.getPageSize())); listSql.setCallback(Sqls.callback.maps()); @@ -301,11 +355,130 @@ public class TourUndertakeController { List list = listSql.getList(NutMap.class); fillSignupMobile(list); - flattenSignupFamilies(list); Pagination pagination = new Pagination<>(pageForm.getPageNumber(), pageForm.getPageSize(), count, list); return Result.success(pagination); } + /** + * 导出领办查看弹窗中的报名人员数据,导出范围复用查看弹窗的事项、成团、关键字和工会条件。 + */ + @At + @SaCheckPermission("tour.undertake") + @Ok("void") + public void exportSignupData(PageForm pageForm, String matterId, String keyword, String unionId, String groupCode, + HttpServletResponse response) { + if (StrUtil.isBlank(pageForm.getPageOrderName())) { + pageForm.defaultSortAsc("signupTime"); + } + // 导出不分页,保持筛选、排序、手机号补充和家属平铺逻辑与查看弹窗一致。 + List rows = querySignupExportRows(pageForm, matterId, keyword, unionId, groupCode); + List entities = buildSignupExportEntities(); + + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entities, rows); + CommonDownloadUtil.download("领办报名人员.xlsx", workbook, response); + } + + /** + * 查询领办查看弹窗导出数据,复用查看列表的权限范围和人员组装逻辑,仅去掉分页限制。 + */ + private List querySignupExportRows(PageForm pageForm, String matterId, String keyword, String unionId, String groupCode) { + Cnd cnd = buildSignupQueryCnd(matterId, keyword, unionId, groupCode); + Sql listSql = Sqls.create(""" + SELECT * + FROM ( + SELECT + t.id, + t.id AS ledgerId, + t.jobNo, + t.userName, + t.gender, + '' AS mobile, + t.idCard, + t.unionId, + t.unionName, + t.signupTime, + t.groupCode, + t.groupName, + 1 AS staffRow, + '教职工' AS rowTypeName, + '' AS relationship, + t.userName AS relatedStaffName, + 0 AS rowSort, + t.createdAt AS ledgerCreatedAt, + t.createdAt + FROM tour_ledger t + INNER JOIN tour_matter m ON m.id = t.matterId + INNER JOIN tour_line l ON l.id = m.lineId + $condition + UNION ALL + SELECT + f.id, + t.id AS ledgerId, + '' AS jobNo, + f.familyName AS userName, + f.gender, + '' AS mobile, + f.idCard, + t.unionId, + '' AS unionName, + t.signupTime, + t.groupCode, + t.groupName, + 0 AS staffRow, + '家属' AS rowTypeName, + f.relationship, + t.userName AS relatedStaffName, + 1 AS rowSort, + t.createdAt AS ledgerCreatedAt, + f.createdAt + FROM tour_ledger t + INNER JOIN tour_matter m ON m.id = t.matterId + INNER JOIN tour_line l ON l.id = m.lineId + INNER JOIN tour_ledger_family f ON f.ledgerId = t.id AND f.delFlag = 0 + $condition + ) p + ORDER BY $orderColumn $orderBy, p.signupTime ASC, p.ledgerCreatedAt ASC, p.rowSort ASC, p.createdAt ASC + """); + listSql.setCondition(cnd); + listSql.setVar("orderColumn", getSignupUnionOrderColumn(pageForm.getPageOrderName())); + listSql.setVar("orderBy", "ascending".equals(pageForm.getPageOrderBy()) ? "asc" : "desc"); + listSql.setCallback(Sqls.callback.maps()); + tourLedgerService.dao().execute(listSql); + + List list = listSql.getList(NutMap.class); + fillSignupMobile(list); + // 补齐导出专用序号和成团展示字段,确保 Excel 列显示与查看弹窗一致。 + for (int i = 0; i < list.size(); i++) { + NutMap item = list.get(i); + item.put("indexNo", i + 1); + String groupCodeText = item.getString("groupCode", ""); + String groupNameText = item.getString("groupName", ""); + item.put("groupInfo", StrUtil.isBlank(groupCodeText) ? "未成团" : groupCodeText + (StrUtil.isBlank(groupNameText) ? "" : " " + groupNameText)); + } + return list; + } + + /** + * 定义领办查看弹窗导出列,字段顺序与弹窗表格保持一致。 + */ + private List buildSignupExportEntities() { + List entities = new ArrayList<>(); + entities.add(new ExcelExportEntity("序号", "indexNo", 10)); + entities.add(new ExcelExportEntity("工号", "jobNo", 14)); + entities.add(new ExcelExportEntity("姓名", "userName", 14)); + entities.add(new ExcelExportEntity("性别", "gender", 10)); + entities.add(new ExcelExportEntity("手机号码", "mobile", 18)); + entities.add(new ExcelExportEntity("身份证号", "idCard", 24)); + entities.add(new ExcelExportEntity("所属工会", "unionName", 24)); + entities.add(new ExcelExportEntity("人员类型", "rowTypeName", 12)); + entities.add(new ExcelExportEntity("亲属关系", "relationship", 14)); + entities.add(new ExcelExportEntity("成团信息", "groupInfo", 24)); + entities.add(new ExcelExportEntity("关联教职工名称", "relatedStaffName", 18)); + return entities; + } + /** * 领办线路查看以团为单位,报名人员查询必须固定到当前点击的成团编码。 */ @@ -535,25 +708,25 @@ public class TourUndertakeController { return "l.lineName"; } - private String getSignupOrderColumn(String orderName) { + private String getSignupUnionOrderColumn(String orderName) { if ("jobNo".equals(orderName)) { - return "t.jobNo"; + return "p.jobNo"; } if ("userName".equals(orderName)) { - return "t.userName"; + return "p.userName"; } if ("gender".equals(orderName)) { - return "t.gender"; + return "p.gender"; } if ("idCard".equals(orderName)) { - return "t.idCard"; + return "p.idCard"; } if ("unionName".equals(orderName)) { - return "t.unionName"; + return "p.unionName"; } - if ("groupName".equals(orderName)) { - return "t.groupCode"; + if ("groupCode".equals(orderName) || "groupName".equals(orderName)) { + return "p.groupCode"; } - return "t.signupTime"; + return "p.signupTime"; } } diff --git a/src/main/resources/db/tour_matter_add_max_signup_people.sql b/src/main/resources/db/tour_matter_add_max_signup_people.sql new file mode 100644 index 0000000..6015902 --- /dev/null +++ b/src/main/resources/db/tour_matter_add_max_signup_people.sql @@ -0,0 +1,3 @@ +-- 疗休养事项选择线路新增最多报名人数,用于报名提交容量控制;为空或0表示不限制。 +ALTER TABLE `tour_matter` + ADD COLUMN `maxSignupPeople` int DEFAULT NULL COMMENT '最多报名人数' AFTER `maxGroupPeople`; diff --git a/src/main/resources/views/platform/zhgh/dayofficework/Tour/undertake/index.html b/src/main/resources/views/platform/zhgh/dayofficework/Tour/undertake/index.html index a34f3a9..48f51b4 100644 --- a/src/main/resources/views/platform/zhgh/dayofficework/Tour/undertake/index.html +++ b/src/main/resources/views/platform/zhgh/dayofficework/Tour/undertake/index.html @@ -124,7 +124,10 @@ layout("/layouts/platform.html"){ -
报名人员列表
+
+
报名人员列表
+ 导出 +
{ if (res.code === 0) { @@ -443,9 +460,14 @@ layout("/layouts/platform.html"){ font-size: 14px; font-weight: 600; line-height: 16px; - margin-bottom: 12px; padding-left: 10px; } + .tour-group-view-toolbar { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 12px; + } .tour-undertake-tip { margin-top: 8px; color: #f56c6c; diff --git a/src/main/resources/views/platform/zhghh5/dayofficework/tour/mysignup/index.html b/src/main/resources/views/platform/zhghh5/dayofficework/tour/mysignup/index.html index 189e5a9..0b51739 100644 --- a/src/main/resources/views/platform/zhghh5/dayofficework/tour/mysignup/index.html +++ b/src/main/resources/views/platform/zhghh5/dayofficework/tour/mysignup/index.html @@ -376,7 +376,7 @@ layout("/layouts/platform_h5.html"){
查看 - 修改 + 修改 撤回 取消报名 报销申请 @@ -534,7 +534,7 @@ layout("/layouts/platform_h5.html"){
- 取消报名 + 取消报名 提交
@@ -696,17 +696,35 @@ layout("/layouts/platform_h5.html"){ } return row.taskKey === "startTask" || !row.instanceId }, + showModify(row) { + return (this.canModify(row) || this.isTravelEnded(row)) && !this.isSignupEnded(row) + }, isTravelEnded(row) { if (!row || !row.travelEndTime) return false const text = String(row.travelEndTime).trim() const date = new Date((text.length === 10 ? text + " 23:59:59" : text).replace(/-/g, "/")) return !isNaN(date.getTime()) && new Date().getTime() > date.getTime() }, + parseSignupDate(value, endOfDay) { + if (!value) return null + const text = String(value).trim() + if (!text) return null + const normalized = text.length === 10 ? text + (endOfDay ? " 23:59:59" : " 00:00:00") : text + const date = new Date(normalized.replace(/-/g, "/")) + return isNaN(date.getTime()) ? null : date + }, + isSignupEnded(row) { + const end = this.parseSignupDate(row && row.signupEndTime, true) + return !!(end && new Date().getTime() > end.getTime()) + }, canRevoke(row) { return this.isApprovalRow(row) && this.toBoolean(row.canRevoke) }, showCancel(row) { - return !this.isApprovalRow(row) || this.canModify(row) + return (!this.isApprovalRow(row) || this.canModify(row)) && !this.isSignupEnded(row) + }, + showSignupCancel() { + return !!(this.signupForm && this.signupForm.id) && !this.isSignupEnded(this.signupForm) }, showExport(row) { return this.toBoolean(row && row.overCostReimbursed) @@ -767,6 +785,10 @@ layout("/layouts/platform_h5.html"){ return (this.toBoolean(this.detail && this.detail.hasFamily) || this.detailFamilyData.length > 0) && !this.isDetailDirectFamilyLine() }, openSignup(row) { + if (this.isSignupEnded(row)) { + vant.Toast("报名已结束,不能修改报名") + return + } this.$axios.post("/platform/tour/mysignup/signupDetail", { id: row.id }).then((res) => { if (res.code !== 0) { vant.Toast(res.msg || "查询失败") @@ -802,6 +824,8 @@ layout("/layouts/platform_h5.html"){ travelPeriod: matter.travelPeriod || "", travelStartTime: matter.travelStartTime || "", travelEndTime: matter.travelEndTime || "", + signupStartTime: matter.signupStartTime || ledger.signupStartTime || "", + signupEndTime: matter.signupEndTime || ledger.signupEndTime || "", allowOverReimbursement: matter.allowOverReimbursement, overCostReimbursed: false, hasFamily: false, @@ -820,6 +844,8 @@ layout("/layouts/platform_h5.html"){ travelPeriod: matter.travelPeriod || "", travelStartTime: matter.travelStartTime || "", travelEndTime: matter.travelEndTime || "", + signupStartTime: matter.signupStartTime || ledger.signupStartTime || "", + signupEndTime: matter.signupEndTime || ledger.signupEndTime || "", allowOverReimbursement: matter.allowOverReimbursement, overCostReimbursed: ledger.overCostReimbursed === true || ledger.overCostReimbursed === 1 || ledger.overCostReimbursed === "1", hasFamily: ledger.hasFamily === true || ledger.hasFamily === 1 || ledger.hasFamily === "1" @@ -968,6 +994,10 @@ layout("/layouts/platform_h5.html"){ return true }, submitSignup() { + if (this.isSignupEnded(this.signupForm)) { + vant.Toast("报名已结束,不能修改报名") + return + } if (!this.validateSelfInfo() || !this.validateFamilies() || !this.validateDirectRelative()) return const families = this.allowFamily && this.signupForm.hasFamily ? this.familyData : [] const form = Object.assign({}, this.signupForm, { @@ -998,6 +1028,10 @@ layout("/layouts/platform_h5.html"){ vant.Toast("暂无可取消的报名记录") return } + if (this.isSignupEnded(row)) { + vant.Toast("报名已结束,不能取消报名") + return + } vant.Dialog.confirm({ title: "温馨提醒", message: "是否取消您选择的线路?", diff --git a/src/main/resources/views/platform/zhghh5/dayofficework/tour/signup/list.html b/src/main/resources/views/platform/zhghh5/dayofficework/tour/signup/list.html index 5b70dfd..65cb296 100644 --- a/src/main/resources/views/platform/zhghh5/dayofficework/tour/signup/list.html +++ b/src/main/resources/views/platform/zhghh5/dayofficework/tour/signup/list.html @@ -486,8 +486,8 @@ layout("/layouts/platform_h5.html"){ v-if="showCancel(row)" type="button" class="tour-line-action tour-line-action--danger" - :class="{'tour-line-action--disabled': isTravelEnded(row) || cancelLoadingLedgerId === row.ledgerId}" - :disabled="isTravelEnded(row) || cancelLoadingLedgerId === row.ledgerId" + :class="{'tour-line-action--disabled': isTravelEnded(row) || isSignupEnded(row) || cancelLoadingLedgerId === row.ledgerId}" + :disabled="isTravelEnded(row) || isSignupEnded(row) || cancelLoadingLedgerId === row.ledgerId" @click.stop="cancelByRow(row)"> {{ cancelLoadingLedgerId === row.ledgerId ? '取消中...' : '取消报名' }} @@ -599,7 +599,7 @@ layout("/layouts/platform_h5.html"){ if (!row || !this.isSigned(row)) { return false } - return this.isInSignupWindow(row) && (!this.isApprovalSignup(row) || this.canModifySignup(row)) + return this.isInSignupWindow(row) && !this.isSignupEnded(row) && (!this.isApprovalSignup(row) || this.canModifySignup(row)) }, signupActionText(row) { if (this.isSigned(row)) { @@ -614,7 +614,7 @@ layout("/layouts/platform_h5.html"){ return "报名" }, showSignupAction(row) { - return this.isSigned(row) && this.isInSignupWindow(row) && this.canModifySignup(row) + return this.isSigned(row) && this.isInSignupWindow(row) && !this.isSignupEnded(row) && this.canModifySignup(row) }, signupActionDisabled(row) { return !!(this.isSigned(row) && this.isApprovalSignup(row) && (this.isRejectedSignup(row) || (!this.canRevokeSignup(row) && !this.canModifySignup(row)))) @@ -628,6 +628,10 @@ layout("/layouts/platform_h5.html"){ const now = new Date().getTime() return start !== null && end !== null && now >= start && now <= end }, + isSignupEnded(row) { + const end = this.parseSignupDate(row && row.signupEndTime, true) + return end !== null && new Date().getTime() > end + }, parseSignupDate(value, endOfDay) { const text = String(value || "").trim() if (!text) { @@ -644,6 +648,10 @@ layout("/layouts/platform_h5.html"){ if (this.signupActionDisabled(row)) { return } + if (this.isSigned(row) && this.isSignupEnded(row)) { + vant.Toast("报名已结束,不能修改报名") + return + } if (this.canRevokeSignup(row)) { this.revokeSignup(row) return @@ -686,6 +694,10 @@ layout("/layouts/platform_h5.html"){ vant.Toast("暂无可取消的报名记录") return } + if (this.isSignupEnded(row)) { + vant.Toast("报名已结束,不能取消报名") + return + } vant.Dialog.confirm({ title: "温馨提示", message: "是否取消您选择的线路,请确认",