change
This commit is contained in:
+40
@@ -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("报名出行时段不存在或已停用");
|
||||
|
||||
+205
-32
@@ -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: "是否取消您选择的线路,请确认",
|
||||
|
||||
Reference in New Issue
Block a user