This commit is contained in:
2026-07-07 16:14:16 +08:00
parent 2af94299dd
commit 075448ab2b
6 changed files with 325 additions and 41 deletions
@@ -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("报名出行时段不存在或已停用");
@@ -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<NutMap> list = listSql.getList(NutMap.class);
fillSignupMobile(list);
flattenSignupFamilies(list);
Pagination<NutMap> 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<NutMap> rows = querySignupExportRows(pageForm, matterId, keyword, unionId, groupCode);
List<ExcelExportEntity> entities = buildSignupExportEntities();
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entities, rows);
CommonDownloadUtil.download("领办报名人员.xlsx", workbook, response);
}
/**
* 查询领办查看弹窗导出数据,复用查看列表的权限范围和人员组装逻辑,仅去掉分页限制。
*/
private List<NutMap> 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<NutMap> 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<ExcelExportEntity> buildSignupExportEntities() {
List<ExcelExportEntity> 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";
}
}
@@ -0,0 +1,3 @@
-- 疗休养事项选择线路新增最多报名人数,用于报名提交容量控制;为空或0表示不限制。
ALTER TABLE `tour_matter`
ADD COLUMN `maxSignupPeople` int DEFAULT NULL COMMENT '最多报名人数' AFTER `maxGroupPeople`;
@@ -124,7 +124,10 @@ layout("/layouts/platform.html"){
</el-card>
<el-card class="mt10" shadow="never">
<div class="tour-group-view-title">报名人员列表</div>
<div class="tour-group-view-toolbar">
<div class="tour-group-view-title">报名人员列表</div>
<el-button size="small" type="primary" icon="el-icon-download" @click="exportViewData">导出</el-button>
</div>
<el-table
v-loading="viewLoading"
:data="viewTableData"
@@ -396,6 +399,20 @@ layout("/layouts/platform.html"){
}
})
},
exportViewData() {
if (!this.viewRow || !this.viewRow.matterId || !this.viewForm.groupCode) {
this.$message.warning("请先选择需要查看的成团线路")
return
}
this.$downLoad(loc() + "/exportSignupData", {
matterId: this.viewRow.matterId,
keyword: this.viewForm.keyword,
unionId: this.viewForm.unionId,
groupCode: this.viewForm.groupCode,
pageOrderName: this.viewForm.pageOrderName,
pageOrderBy: this.viewForm.pageOrderBy
})
},
loadUnionOptions() {
this.$axios.post(loc() + "/unionOptions").then((res) => {
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;
@@ -376,7 +376,7 @@ layout("/layouts/platform_h5.html"){
</div>
<div class="tour-actions">
<van-button size="small" type="info" plain @click="openView(row)">查看</van-button>
<van-button v-if="canModify(row) || isTravelEnded(row)" size="small" type="info" :disabled="isTravelEnded(row)" @click="openSignup(row)">修改</van-button>
<van-button v-if="showModify(row)" size="small" type="info" :disabled="isTravelEnded(row)" @click="openSignup(row)">修改</van-button>
<van-button v-if="canRevoke(row)" size="small" type="danger" plain @click="revokeSignup(row)">撤回</van-button>
<van-button v-if="showCancel(row)" size="small" type="danger" plain :disabled="isTravelEnded(row)" @click="cancelByRow(row)">取消报名</van-button>
<van-button v-if="showExport(row)" size="small" type="info" plain :disabled="!canExport(row)" @click="downloadExport(row, 'cost')">报销申请</van-button>
@@ -534,7 +534,7 @@ layout("/layouts/platform_h5.html"){
</div>
</div>
<div class="tour-bottom-bar">
<van-button v-if="signupForm.id" type="danger" plain block round :loading="cancelLoading" @click="cancelSignup">取消报名</van-button>
<van-button v-if="showSignupCancel()" type="danger" plain block round :loading="cancelLoading" @click="cancelSignup">取消报名</van-button>
<van-button type="info" block round :loading="signupLoading" @click="submitSignup">提交</van-button>
</div>
</van-popup>
@@ -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: "是否取消您选择的线路?",
@@ -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 ? '取消中...' : '取消报名' }}
</button>
@@ -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: "是否取消您选择的线路,请确认",