南大三十年教职工疗休养

This commit is contained in:
2026-07-04 01:08:45 +08:00
parent f637e02c08
commit 67c21e5dfa
5 changed files with 255 additions and 97 deletions
@@ -73,7 +73,7 @@ layout("/layouts/platform.html"){
<el-table-column label="工号" prop="loginName" width="120" align="center" header-align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="所在单位" prop="unitName" min-width="180" align="center" header-align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="线路" prop="lineName" min-width="200" sortable="custom" align="center" header-align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="出行时间" prop="travelPeriod" min-width="180" align="center" header-align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="出行时间" prop="travelPeriod" min-width="180" align="center" header-align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="出行时段" prop="periodName" min-width="180" align="center" header-align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="乘车地点" prop="boardingPlace" min-width="140" align="center" header-align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="已上传图片数量" width="140" align="center" header-align="center">
@@ -159,7 +159,7 @@ layout("/layouts/platform.html"){
</el-form-item>
</el-col>
<el-col :span="18" v-if="assignForm.personType === 'FORMAL'">
<el-form-item label="出行时间">
<el-form-item label="出行时间">
<div class="period-button-list">
<el-button
v-for="item in assignPeriodOptions"
@@ -177,6 +177,10 @@ layout("/layouts/platform.html"){
</el-form>
<div class="quota-bar">
<div class="quota-item quota-item-total">
<span class="quota-label">分工会总名额</span>
<span>{{ quotaInfo.branchTotalQuota }}</span>
</div>
<div class="quota-item">
<span class="quota-label">正式名额</span>
<span>{{ quotaInfo.formalQuota }}</span>
@@ -424,6 +428,9 @@ layout("/layouts/platform.html"){
color: #303133;
background: #fafafa;
}
.quota-item-total {
min-width: 150px;
}
.quota-label {
font-weight: 600;
margin-right: 10px;
@@ -503,6 +510,7 @@ layout("/layouts/platform.html"){
assignMatterOptions: [],
assignPeriodOptions: [],
quotaInfo: {
branchTotalQuota: 0,
formalQuota: 0,
backupQuota: 0,
formalUsed: 0,
@@ -511,6 +519,7 @@ layout("/layouts/platform.html"){
backupRemaining: 0
},
assignDialogVisible: false,
assignOpenToken: 0,
candidateLoading: false,
candidateSelectLoading: false,
candidateData: [],
@@ -617,6 +626,7 @@ layout("/layouts/platform.html"){
},
defaultQuotaInfo() {
return {
branchTotalQuota: 0,
formalQuota: 0,
backupQuota: 0,
formalUsed: 0,
@@ -726,21 +736,11 @@ layout("/layouts/platform.html"){
window.location.href = loc() + "/exportData?" + params.toString()
},
openAssign() {
const token = this.nextAssignOpenToken()
const year = this.pageForm.year || moment().format("YYYY")
this.assignForm = this.defaultAssignForm(year)
this.candidateForm = this.defaultCandidateForm()
this.assignPeriodOptions = []
this.quotaInfo = this.defaultQuotaInfo()
this.candidateData = []
this.selectedCandidates = []
this.selectedCandidateIds = []
this.candidateUserOptions = []
this.assignDialogVisible = true
this.loadAssignSettingOptions()
},
resetAssignDialog() {
this.assignForm = this.defaultAssignForm(moment().format("YYYY"))
this.candidateForm = this.defaultCandidateForm()
this.assignSettingOptions = []
this.assignMatterOptions = []
this.assignPeriodOptions = []
this.quotaInfo = this.defaultQuotaInfo()
@@ -749,8 +749,37 @@ layout("/layouts/platform.html"){
this.selectedCandidateIds = []
this.candidateUserOptions = []
this.assignSubmitting = false
this.candidateLoading = false
this.candidateSelectLoading = false
this.assignDialogVisible = true
this.loadAssignSettingOptions(token)
},
resetAssignDialog() {
this.assignOpenToken += 1
this.assignForm = this.defaultAssignForm(moment().format("YYYY"))
this.candidateForm = this.defaultCandidateForm()
this.assignSettingOptions = []
this.assignMatterOptions = []
this.assignPeriodOptions = []
this.quotaInfo = this.defaultQuotaInfo()
this.candidateData = []
this.selectedCandidates = []
this.selectedCandidateIds = []
this.candidateUserOptions = []
this.assignSubmitting = false
this.candidateLoading = false
this.candidateSelectLoading = false
},
// 人员分配弹窗每次打开都生成新的批次标记,旧请求返回时不再覆盖新弹窗数据。
nextAssignOpenToken() {
this.assignOpenToken += 1
return this.assignOpenToken
},
isCurrentAssignOpen(token) {
return this.assignDialogVisible && token === this.assignOpenToken
},
assignYearChange() {
const token = this.assignOpenToken
this.assignForm.settingId = ""
this.assignForm.matterId = ""
this.assignForm.periodId = ""
@@ -761,9 +790,10 @@ layout("/layouts/platform.html"){
this.candidateUserOptions = []
this.candidateForm.keyword = ""
this.clearCandidateSelection()
this.loadAssignSettingOptions()
this.loadAssignSettingOptions(token)
},
assignSettingChange() {
const token = this.assignOpenToken
this.assignForm.matterId = ""
this.assignForm.periodId = ""
this.assignMatterOptions = []
@@ -772,30 +802,32 @@ layout("/layouts/platform.html"){
this.candidateUserOptions = []
this.candidateForm.keyword = ""
this.clearCandidateSelection()
this.loadAssignMatterOptions()
this.loadAssignTravelPeriods(true)
this.loadCandidatePageData()
this.loadAssignMatterOptions(token)
this.loadAssignTravelPeriods(token)
this.loadCandidatePageData(token)
},
assignPersonTypeChange() {
if (this.assignForm.personType === "BACKUP") {
this.assignForm.matterId = ""
}
this.loadQuotaInfo()
this.loadQuotaInfo(this.assignOpenToken)
},
loadAssignSettingOptions() {
loadAssignSettingOptions(token) {
token = token || this.assignOpenToken
this.$axios.post(loc() + "/settingOptions", {year: this.assignForm.year}).then((res) => {
if (!this.isCurrentAssignOpen(token)) return
if (res.code === 0) {
this.assignSettingOptions = res.data || []
// 人员分配弹窗独立默认取当前年度第一条配置,再加载名额、线路和候选人员。
if (!this.assignForm.settingId && this.assignSettingOptions.length > 0) {
this.assignForm.settingId = this.assignSettingOptions[0].id
this.loadAssignMatterOptions()
this.loadAssignTravelPeriods(true)
this.loadCandidatePageData()
this.loadAssignMatterOptions(token)
this.loadAssignTravelPeriods(token)
this.loadCandidatePageData(token)
} else if (this.assignForm.settingId) {
this.loadAssignMatterOptions()
this.loadAssignTravelPeriods(true)
this.loadCandidatePageData()
this.loadAssignMatterOptions(token)
this.loadAssignTravelPeriods(token)
this.loadCandidatePageData(token)
} else {
this.assignMatterOptions = []
this.assignPeriodOptions = []
@@ -806,46 +838,50 @@ layout("/layouts/platform.html"){
}
})
},
loadAssignTravelPeriods(defaultFirst) {
loadAssignTravelPeriods(token) {
token = token || this.assignOpenToken
if (!this.assignForm.settingId) {
this.assignPeriodOptions = []
this.assignForm.periodId = ""
this.loadQuotaInfo()
this.loadQuotaInfo(token)
return
}
this.$axios.post(loc() + "/travelPeriodOptions", {settingId: this.assignForm.settingId}).then((res) => {
if (!this.isCurrentAssignOpen(token)) return
if (res.code === 0) {
this.assignPeriodOptions = res.data || []
const hasCurrent = this.assignPeriodOptions.some(item => item.id === this.assignForm.periodId)
if ((defaultFirst || !hasCurrent) && this.assignPeriodOptions.length > 0) {
this.assignForm.periodId = this.assignPeriodOptions[0].id
} else if (!hasCurrent) {
if (!hasCurrent) {
this.assignForm.periodId = ""
}
} else {
this.assignPeriodOptions = []
this.assignForm.periodId = ""
}
this.loadQuotaInfo()
this.loadQuotaInfo(token)
})
},
loadAssignMatterOptions() {
loadAssignMatterOptions(token) {
token = token || this.assignOpenToken
if (!this.assignForm.settingId) {
this.assignMatterOptions = []
return
}
this.$axios.post(loc() + "/matterOptions", {settingId: this.assignForm.settingId}).then((res) => {
if (!this.isCurrentAssignOpen(token)) return
if (res.code === 0) {
this.assignMatterOptions = res.data || []
}
})
},
loadQuotaInfo() {
loadQuotaInfo(token) {
token = token || this.assignOpenToken
if (!this.assignForm.settingId) {
this.quotaInfo = this.defaultQuotaInfo()
return
}
this.$axios.post(loc() + "/quotaInfo", {settingId: this.assignForm.settingId}).then((res) => {
if (!this.isCurrentAssignOpen(token)) return
if (res.code === 0) {
const baseQuota = Object.assign(this.defaultQuotaInfo(), res.data || {})
if (this.assignForm.personType === "FORMAL") {
@@ -855,16 +891,18 @@ layout("/layouts/platform.html"){
}
this.quotaInfo = baseQuota
if (this.assignForm.personType === "FORMAL" && this.assignForm.periodId) {
this.loadPeriodQuotaInfo()
this.loadPeriodQuotaInfo(token)
}
}
})
},
loadPeriodQuotaInfo() {
loadPeriodQuotaInfo(token) {
token = token || this.assignOpenToken
this.$axios.post(loc() + "/periodQuotaInfo", {
settingId: this.assignForm.settingId,
periodId: this.assignForm.periodId
}).then((res) => {
if (!this.isCurrentAssignOpen(token)) return
if (res.code === 0) {
const periodQuota = res.data || {}
this.quotaInfo = Object.assign({}, this.quotaInfo, {
@@ -876,13 +914,29 @@ layout("/layouts/platform.html"){
})
},
toggleAssignPeriod(item) {
const token = this.assignOpenToken
this.assignForm.periodId = this.assignForm.periodId === item.id ? "" : item.id
// 选择出行时间段时提醒先核对分配批次,避免批次线路时间与时间段不一致。
if (this.assignForm.periodId) {
this.$message({
type: "warning",
message: this.assignPeriodCheckMessage(),
duration: 5000
})
}
this.candidateForm.pageNumber = 1
this.clearCandidateSelection()
this.loadQuotaInfo()
this.loadCandidatePageData()
this.loadQuotaInfo(token)
this.loadCandidatePageData(token)
},
loadCandidatePageData() {
assignPeriodCheckMessage() {
if (!this.assignForm.matterId) {
return "请选择分配批次,并确认选中的 “分配批次” 与 “出行时间段” 出行时间是否一致"
}
return "请确认选中的 “分配批次” 与 “出行时间段” 出行时间是否一致"
},
loadCandidatePageData(token) {
token = token || this.assignOpenToken
if (!this.assignForm.settingId) {
this.candidateData = []
this.candidateForm.totalCount = 0
@@ -897,6 +951,7 @@ layout("/layouts/platform.html"){
keyword: (this.selectedCandidateIds || []).length > 0 ? "" : this.candidateForm.keyword,
userIds: JSON.stringify(this.selectedCandidateIds || [])
}).then((res) => {
if (!this.isCurrentAssignOpen(token)) return
if (res.code === 0) {
const data = res.data || {}
this.candidateData = (data.list || []).map(item => Object.assign({}, item, {
@@ -909,7 +964,9 @@ layout("/layouts/platform.html"){
this.$message.warning(res.msg || "候选人员查询失败")
}
}).finally(() => {
this.candidateLoading = false
if (this.isCurrentAssignOpen(token)) {
this.candidateLoading = false
}
})
},
candidateSearch() {
@@ -948,6 +1005,7 @@ layout("/layouts/platform.html"){
// 人员选择器复用候选人员接口,后端会限定为当前登录人所在分工会会员。
this.candidateForm.keyword = keyword || ""
this.candidateSelectLoading = true
const token = this.assignOpenToken
this.$axios.post(loc() + "/candidatePageData", {
pageNumber: 1,
pageSize: 20,
@@ -955,12 +1013,15 @@ layout("/layouts/platform.html"){
retiringSoon: this.normalizeCandidateFilterValue(this.candidateForm.retiringSoon),
keyword: keyword || ""
}).then((res) => {
if (!this.isCurrentAssignOpen(token)) return
if (res.code === 0) {
const data = res.data || {}
this.candidateUserOptions = this.mergeOptionLists(this.selectedCandidates, data.list || [])
}
}).finally(() => {
this.candidateSelectLoading = false
if (this.isCurrentAssignOpen(token)) {
this.candidateSelectLoading = false
}
})
},
candidateUserSelectChange(userIds) {
@@ -1149,7 +1210,7 @@ layout("/layouts/platform.html"){
return
}
if (this.assignForm.personType === "FORMAL" && !this.assignForm.periodId) {
this.$message.warning("请选择出行时间")
this.$message.warning("请选择出行时间")
return
}
this.$confirm("确定保存当前人员分配吗?", "提示", {
@@ -91,7 +91,7 @@ layout("/layouts/platform.html"){
<el-table-column label="所属分工会" prop="unionName" min-width="160" sortable="custom" align="center" header-align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="所在单位" prop="unitName" min-width="180" align="center" header-align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="线路" prop="lineName" min-width="200" sortable="custom" align="center" header-align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="出行时间" prop="travelPeriod" min-width="180" align="center" header-align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="出行时间" prop="travelPeriod" min-width="180" align="center" header-align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="出行时段" prop="periodName" min-width="180" align="center" header-align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="乘车地点" prop="boardingPlace" min-width="140" align="center" header-align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="已上传图片数量" width="140" align="center" header-align="center">
@@ -475,6 +475,7 @@ layout("/layouts/platform.html"){
assignMatterOptions: [],
unionOptions: [],
assignDialogVisible: false,
assignOpenToken: 0,
remindDialogVisible: false,
remindSubmitting: false,
candidateLoading: false,
@@ -760,28 +761,47 @@ layout("/layouts/platform.html"){
})
},
openAssign() {
const token = this.nextAssignOpenToken()
const year = this.pageForm.year || moment().format("YYYY")
this.assignForm = this.defaultAssignForm(year)
this.assignForm.matterId = ""
this.candidateForm = this.defaultCandidateForm()
this.candidateData = []
this.selectedCandidates = []
this.selectedCandidateIds = []
this.candidateUserOptions = []
this.assignDialogVisible = true
this.loadAssignSettingOptions()
},
resetAssignDialog() {
this.assignForm = this.defaultAssignForm(moment().format("YYYY"))
this.candidateForm = this.defaultCandidateForm()
this.assignSettingOptions = []
this.assignMatterOptions = []
this.candidateData = []
this.selectedCandidates = []
this.selectedCandidateIds = []
this.candidateUserOptions = []
this.assignSubmitting = false
this.candidateLoading = false
this.candidateSelectLoading = false
this.assignDialogVisible = true
this.loadAssignSettingOptions(token)
},
resetAssignDialog() {
this.assignOpenToken += 1
this.assignForm = this.defaultAssignForm(moment().format("YYYY"))
this.candidateForm = this.defaultCandidateForm()
this.assignSettingOptions = []
this.assignMatterOptions = []
this.candidateData = []
this.selectedCandidates = []
this.selectedCandidateIds = []
this.candidateUserOptions = []
this.assignSubmitting = false
this.candidateLoading = false
this.candidateSelectLoading = false
},
// 人员分配弹窗每次打开都生成新的批次标记,旧请求返回时不再覆盖新弹窗数据。
nextAssignOpenToken() {
this.assignOpenToken += 1
return this.assignOpenToken
},
isCurrentAssignOpen(token) {
return this.assignDialogVisible && token === this.assignOpenToken
},
assignYearChange() {
const token = this.assignOpenToken
this.assignForm.settingId = ""
this.assignForm.matterId = ""
this.assignMatterOptions = []
@@ -789,31 +809,34 @@ layout("/layouts/platform.html"){
this.candidateUserOptions = []
this.candidateForm.keyword = ""
this.clearCandidateSelection()
this.loadAssignSettingOptions()
this.loadCandidatePageData()
this.loadAssignSettingOptions(token)
this.loadCandidatePageData(token)
},
assignSettingChange() {
const token = this.assignOpenToken
this.assignForm.matterId = ""
this.assignMatterOptions = []
this.selectedCandidateIds = []
this.candidateUserOptions = []
this.candidateForm.keyword = ""
this.clearCandidateSelection()
this.loadAssignMatterOptions()
this.loadCandidatePageData()
this.loadAssignMatterOptions(token)
this.loadCandidatePageData(token)
},
loadAssignSettingOptions() {
loadAssignSettingOptions(token) {
token = token || this.assignOpenToken
this.$axios.post(loc() + "/settingOptions", {year: this.assignForm.year}).then((res) => {
if (!this.isCurrentAssignOpen(token)) return
if (res.code === 0) {
this.assignSettingOptions = res.data || []
// 人员分配弹窗独立于主列表筛选,默认取当前年度第一条可用配置。
if (!this.assignForm.settingId && this.assignSettingOptions.length > 0) {
this.assignForm.settingId = this.assignSettingOptions[0].id
this.loadAssignMatterOptions()
this.loadCandidatePageData()
this.loadAssignMatterOptions(token)
this.loadCandidatePageData(token)
} else if (this.assignForm.settingId) {
this.loadAssignMatterOptions()
this.loadCandidatePageData()
this.loadAssignMatterOptions(token)
this.loadCandidatePageData(token)
} else {
this.assignMatterOptions = []
this.candidateData = []
@@ -822,18 +845,21 @@ layout("/layouts/platform.html"){
}
})
},
loadAssignMatterOptions() {
loadAssignMatterOptions(token) {
token = token || this.assignOpenToken
if (!this.assignForm.settingId) {
this.assignMatterOptions = []
return
}
this.$axios.post(loc() + "/matterOptions", {settingId: this.assignForm.settingId}).then((res) => {
if (!this.isCurrentAssignOpen(token)) return
if (res.code === 0) {
this.assignMatterOptions = res.data || []
}
})
},
loadCandidatePageData() {
loadCandidatePageData(token) {
token = token || this.assignOpenToken
if (!this.assignForm.settingId) {
this.candidateData = []
this.candidateForm.totalCount = 0
@@ -851,6 +877,7 @@ layout("/layouts/platform.html"){
keyword: (this.selectedCandidateIds || []).length > 0 ? "" : this.candidateForm.keyword,
userIds: JSON.stringify(this.selectedCandidateIds || [])
}).then((res) => {
if (!this.isCurrentAssignOpen(token)) return
if (res.code === 0) {
const data = res.data || {}
this.candidateData = (data.list || []).map(item => Object.assign({}, item, {
@@ -864,7 +891,9 @@ layout("/layouts/platform.html"){
this.$message.warning(res.msg || "候选人员查询失败")
}
}).finally(() => {
this.candidateLoading = false
if (this.isCurrentAssignOpen(token)) {
this.candidateLoading = false
}
})
},
assignMatterChange(value) {
@@ -922,6 +951,7 @@ layout("/layouts/platform.html"){
// 人员选择器复用候选人员接口,校工会可按分工会过滤,也可不选分工会查询全部会员。
this.candidateForm.keyword = keyword || ""
this.candidateSelectLoading = true
const token = this.assignOpenToken
this.$axios.post(loc() + "/candidatePageData", {
pageNumber: 1,
pageSize: 20,
@@ -932,12 +962,15 @@ layout("/layouts/platform.html"){
lastThirtyJoined: this.normalizeCandidateFilterValue(this.candidateForm.lastThirtyJoined),
keyword: keyword || ""
}).then((res) => {
if (!this.isCurrentAssignOpen(token)) return
if (res.code === 0) {
const data = res.data || {}
this.candidateUserOptions = this.mergeOptionLists(this.selectedCandidates, data.list || [])
}
}).finally(() => {
this.candidateSelectLoading = false
if (this.isCurrentAssignOpen(token)) {
this.candidateSelectLoading = false
}
})
},
candidateUserSelectChange(userIds) {
@@ -379,7 +379,6 @@ layout("/layouts/platform_h5.html"){
<van-button v-if="canModify(row) || isTravelEnded(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="showLeaveThirtyTeachTour(row)" size="small" type="danger" plain :loading="leaveLoading" @click="leaveThirtyTeachTour(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>
<van-button v-if="showDirectRelativeExport(row)" size="small" type="info" plain :disabled="!canDirectRelativeExport(row)" @click="downloadExport(row, 'direct')">亲属线路申请</van-button>
</div>
@@ -470,8 +469,9 @@ layout("/layouts/platform_h5.html"){
<div class="tour-section-title">教职工信息</div>
<van-field label="姓名" readonly v-model="signupForm.userName"></van-field>
<van-field label="工号" readonly v-model="signupForm.jobNo"></van-field>
<van-field label="身份证号" v-model="signupForm.idCard" maxlength="30" placeholder="请填写身份证号"></van-field>
<van-field label="身份证号" readonly v-model="signupForm.idCard"></van-field>
<van-field label="年龄" readonly :value="staffAge(signupForm)"></van-field>
<van-field label="手机号" readonly v-model="signupForm.mobile"></van-field>
<van-field label="所在工会" readonly v-model="signupForm.unionName"></van-field>
</div>
@@ -480,13 +480,13 @@ layout("/layouts/platform_h5.html"){
<van-field label="报名线路" readonly v-model="signupForm.lineName"></van-field>
<van-field label="线路类型" readonly v-model="signupForm.lineType"></van-field>
<van-field label="出行时间" readonly v-model="signupForm.travelPeriod"></van-field>
<van-field readonly clickable is-link label="乘车地点" v-model="signupForm.boardingPlace" placeholder="请选择乘车地点" @click="openBoardingPlacePicker"></van-field>
<van-field v-if="fillBedInfo" readonly clickable is-link label="床型" v-model="signupForm.bedType" placeholder="请选择床型" @click="openBedPicker('self')"></van-field>
<van-field v-if="fillBedInfo" label="床位信息" v-model="signupForm.bedInfo" maxlength="100" placeholder="请输入床位信息"></van-field>
<van-field v-if="fillBedInfo" label="意向拼床人" v-model="signupForm.intendedRoommate" maxlength="100" placeholder="请输入意向拼床人"></van-field>
<van-field required readonly clickable is-link label="乘车地点" v-model="signupForm.boardingPlace" placeholder="请选择乘车地点" @click="openBoardingPlacePicker"></van-field>
<van-field v-if="fillBedInfo" label="床型" readonly v-model="signupForm.bedType"></van-field>
<van-field v-if="fillBedInfo" label="床位信息" readonly v-model="signupForm.bedInfo"></van-field>
<van-field v-if="fillBedInfo" label="意向拼床人" readonly v-model="signupForm.intendedRoommate"></van-field>
<van-field v-if="canApplyOverReimbursement(signupForm)" class="tour-over-cost" label="报销超出费用">
<template #input>
<van-radio-group v-model="signupForm.overCostReimbursed" direction="horizontal">
<van-radio-group v-model="signupForm.overCostReimbursed" direction="horizontal" disabled>
<van-radio :name="true"></van-radio>
<van-radio :name="false"></van-radio>
</van-radio-group>
@@ -499,12 +499,12 @@ layout("/layouts/platform_h5.html"){
<div v-if="isDirectFamilyLine(signupForm)" class="tour-section">
<div class="tour-section-title">直系亲属线路</div>
<van-field label="亲属姓名" v-model="directRelativeForm.relativeName" maxlength="100" placeholder="请输入亲属姓名"></van-field>
<van-field label="所在单位" v-model="directRelativeForm.unitName" maxlength="100" placeholder="请输入所在单位"></van-field>
<van-field readonly clickable is-link label="亲属关系" v-model="directRelativeForm.relationshipName" placeholder="请选择亲属关系" @click="openDirectRelativePicker"></van-field>
<van-field label="线路名称" v-model="directRelativeForm.lineName" maxlength="100" placeholder="请输入线路名称"></van-field>
<van-field label="出行开始" v-model="directRelativeForm.travelStartTime" type="date" placeholder="请选择出行开始日期"></van-field>
<van-field label="出行结束" v-model="directRelativeForm.travelEndTime" type="date" placeholder="请选择出行结束日期"></van-field>
<van-field label="亲属姓名" readonly v-model="directRelativeForm.relativeName"></van-field>
<van-field label="所在单位" readonly v-model="directRelativeForm.unitName"></van-field>
<van-field label="亲属关系" readonly v-model="directRelativeForm.relationshipName"></van-field>
<van-field label="线路名称" readonly v-model="directRelativeForm.lineName"></van-field>
<van-field label="出行开始" readonly v-model="directRelativeForm.travelStartTime"></van-field>
<van-field label="出行结束" readonly v-model="directRelativeForm.travelEndTime"></van-field>
</div>
<div v-if="allowFamily && !isDirectFamilyLine(signupForm)" class="tour-section">
@@ -512,29 +512,26 @@ layout("/layouts/platform_h5.html"){
<div v-for="(item,index) in familyData" :key="index" class="tour-family-card">
<div class="tour-family-head">
<span>家属{{ index + 1 }}</span>
<van-button size="mini" type="danger" plain @click="removeFamily(index)">删除</van-button>
</div>
<van-field label="姓名" v-model="item.familyName" maxlength="100" placeholder="请填写姓名"></van-field>
<van-field label="年龄" v-model.number="item.age" type="digit" placeholder="请填写年龄"></van-field>
<van-field label="姓名" readonly v-model="item.familyName"></van-field>
<van-field label="年龄" readonly v-model="item.age"></van-field>
<van-field label="性别">
<template #input>
<van-radio-group v-model="item.gender" direction="horizontal">
<van-radio-group v-model="item.gender" direction="horizontal" disabled>
<van-radio name="男"></van-radio>
<van-radio name="女"></van-radio>
</van-radio-group>
</template>
</van-field>
<van-field label="身份证号" v-model="item.idCard" maxlength="18" placeholder="请填写身份证号" @blur="normalizeFamilyIdCard(item)"></van-field>
<van-field readonly clickable is-link label="关系" v-model="item.relationship" placeholder="请选择关系" @click="openRelationshipPicker(index)"></van-field>
<van-field v-if="fillBedInfo" readonly clickable is-link label="床型" v-model="item.bedType" placeholder="请选择床型" @click="openBedPicker('family', index)"></van-field>
<van-field v-if="fillBedInfo" label="床位" v-model="item.bedInfo" maxlength="100" placeholder="请输入床位信息"></van-field>
<van-field v-if="fillBedInfo" label="意向拼床人" v-model="item.intendedRoommate" maxlength="100" placeholder="请输入意向拼床人"></van-field>
<van-field label="身份证号" readonly v-model="item.idCard"></van-field>
<van-field label="关系" readonly v-model="item.relationship"></van-field>
<van-field v-if="fillBedInfo" label="床型" readonly v-model="item.bedType"></van-field>
<van-field v-if="fillBedInfo" label="床位" readonly v-model="item.bedInfo"></van-field>
<van-field v-if="fillBedInfo" label="意向拼床人" readonly v-model="item.intendedRoommate"></van-field>
</div>
<van-cell title="添加家属" is-link @click="addFamily"></van-cell>
</div>
</div>
<div class="tour-bottom-bar">
<van-button v-if="showCancel(signupForm)" 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>
@@ -623,7 +620,7 @@ layout("/layouts/platform_h5.html"){
return this.directRelativeOptions.map(item => ({ text: item.name || item.code, item }))
},
boardingPlaceColumns() {
return this.boardingPlaceOptions
return [""].concat(this.boardingPlaceOptions || [])
}
},
methods: {
@@ -986,7 +983,7 @@ layout("/layouts/platform_h5.html"){
this.boardingPlacePickerVisible = true
},
confirmBoardingPlace(value) {
this.signupForm.boardingPlace = value
this.signupForm.boardingPlace = value || ""
this.boardingPlacePickerVisible = false
},
normalizeFamilyIdCard(row) {
@@ -1032,11 +1029,11 @@ layout("/layouts/platform_h5.html"){
vant.Toast("请选择乘车地点")
return
}
if (!this.validateFamilies() || !this.validateDirectRelative()) return
const families = this.allowFamily && this.signupForm.hasFamily ? this.familyData : []
// H5 修改页当前只允许调整乘车地点,家属、直系亲属等历史报名信息仅展示不参与提交校验。
const form = Object.assign({}, this.signupForm, {
families: JSON.stringify(families),
directRelative: this.isDirectFamilyLine(this.signupForm) ? JSON.stringify(this.directRelativeForm) : ""
boardingPlaceOnly: true,
families: "[]",
directRelative: ""
})
this.signupLoading = true
this.$axios.post("/platform/thirtyTeachTour/mysignup/doSignup", form).then((res) => {