This commit is contained in:
2025-09-24 21:26:57 +08:00
parent 99a2748330
commit f9adf7c4fd
10 changed files with 489 additions and 192 deletions
@@ -127,6 +127,11 @@ public class ActivityTissue extends BaseModel implements Serializable, SysHomeCo
@ColDefine(type = ColType.MYSQL_JSON) @ColDefine(type = ColType.MYSQL_JSON)
private List<Sys_file> otherFiles; private List<Sys_file> otherFiles;
@Column
@Comment("风险告知书上传")
@ColDefine(type = ColType.TEXT)
private String riskText;
@Column @Column
@Comment("活动类型") @Comment("活动类型")
@ColDefine(type = ColType.INT, width = 10) @ColDefine(type = ColType.INT, width = 10)
@@ -91,6 +91,7 @@ public class UnionActivityRegisterController {
act.groupId, act.groupId,
act.signStartTime, act.signStartTime,
act.signEndTime, act.signEndTime,
act.riskText,
abs.`name` AS projectTypeName, abs.`name` AS projectTypeName,
creater.username AS createUserName, creater.username AS createUserName,
creater.mobile as createUserMobile creater.mobile as createUserMobile
@@ -70,6 +70,11 @@ public class TrainSignUpActivity extends BaseModel implements Serializable, SysH
@Comment("活动介绍") @Comment("活动介绍")
private String introduce; private String introduce;
@Column
@ColDefine(customType = "longtext")
@Comment("风险告知书")
private String riskText;
@Column @Column
@ColDefine(type = ColType.INT, width = 10) @ColDefine(type = ColType.INT, width = 10)
@Comment("活动限制标识") @Comment("活动限制标识")
@@ -1,7 +1,8 @@
<template> <template>
<div> <div>
<div v-if="view" class="viewFile"> <div v-if="view" class="viewFile">
<div v-for="(file,index) in files" class="viewFileItem" title="点击查看" @click="showSource(file,index,$event,files)"> <div v-for="(file,index) in files" class="viewFileItem" title="点击查看"
@click="showSource(file,index,$event,files)">
<template v-if="resolvingShowByFileName(file.filename) == 1"> <template v-if="resolvingShowByFileName(file.filename) == 1">
<el-image <el-image
@@ -18,7 +19,7 @@
</svg> </svg>
</template> </template>
<div :title="file.filename" class="viewFileName" title="点击下载" @click.stop="downLoadFile(file)"> <div :title="file.filename" class="viewFileName" title="点击下载" @click.stop="downLoadFile(file)">
<i class="el-icon-download"></i> {{file.filename }} <i class="el-icon-download"></i> {{ file.filename }}
</div> </div>
</div> </div>
</div> </div>
@@ -32,6 +33,12 @@
:on-success="onSuccess" :on-success="onSuccess"
:file-list="fileList" :file-list="fileList"
:on-exceed="handleExceed" :on-exceed="handleExceed"
class="x100000 upload-card" class="x100000 upload-card"
drag drag
:on-preview="handlePreview" :on-preview="handlePreview"
@@ -43,14 +50,15 @@
<span @click.stop="openPicture"><em>图库上传</em></span> <span @click.stop="openPicture"><em>图库上传</em></span>
<!-- <slot name="el-upload__tip"></slot>--> <!-- <slot name="el-upload__tip"></slot>-->
<div class="el-upload__tip" slot="tip" v-if="showTip"> </div>
<div class="el-upload__tip" slot="tip">
请上传 请上传
<template v-if="max">最多<b style="color: #f56c6c">{{ max }}</b></template>
<template v-if="max_size"> 大小不超过 <b style="color: #f56c6c">{{ max_size / 1024 / 1024 }}MB</b></template> <template v-if="max_size"> 大小不超过 <b style="color: #f56c6c">{{ max_size / 1024 / 1024 }}MB</b></template>
<template v-if="size"> 尺寸为 <b style="color: #f56c6c">{{ size }}</b></template> <template v-if="size"> 尺寸为 <b style="color: #f56c6c">{{ size }}</b></template>
<template v-if="type"> 格式为 <b style="color: #f56c6c">{{ type.join("/") }}</b></template> <template v-if="type"> 格式为 <b style="color: #f56c6c">{{ type.join("/") }}</b></template>
的文件 的文件
</div> </div>
</div>
</el-upload> </el-upload>
@@ -71,6 +79,7 @@
<!-- <slot name="el-upload__tip"></slot>--> <!-- <slot name="el-upload__tip"></slot>-->
<div class="el-upload__tip" slot="tip" v-if="showTip"> <div class="el-upload__tip" slot="tip" v-if="showTip">
请上传 请上传
<template v-if="max">最多<b style="color: #f56c6c">{{ max }}</b></template>
<template v-if="max_size"> 大小不超过 <b style="color: #f56c6c">{{ max_size / 1024 / 1024 }}MB</b></template> <template v-if="max_size"> 大小不超过 <b style="color: #f56c6c">{{ max_size / 1024 / 1024 }}MB</b></template>
<template v-if="size"> 尺寸为 <b style="color: #f56c6c">{{ size }}</b></template> <template v-if="size"> 尺寸为 <b style="color: #f56c6c">{{ size }}</b></template>
<template v-if="type"> 格式为 <b style="color: #f56c6c">{{ type.join("/") }}</b></template> <template v-if="type"> 格式为 <b style="color: #f56c6c">{{ type.join("/") }}</b></template>
@@ -558,7 +567,7 @@ module.exports = {
computed: { computed: {
// 是否显示提示 // 是否显示提示
showTip() { showTip() {
return this.isShowTip && (this.type || this.max_size); return this.isShowTip && (this.type != null || this.max_size != null);
}, },
}, },
watch: { watch: {
@@ -570,8 +579,8 @@ module.exports = {
/** /**
* 查看资源 * 查看资源
*/ */
showSource(showItem, index, e,files) { showSource(showItem, index, e, files) {
const picArray = files.filter(o => [1,2,3].includes(this.resolvingShowByFileName(o.filename))) const picArray = files.filter(o => [1, 2, 3].includes(this.resolvingShowByFileName(o.filename)))
const viewFileParent = $(e.target).closest(".viewFile") const viewFileParent = $(e.target).closest(".viewFile")
const show = this.resolvingShowByFileName(showItem.filename) const show = this.resolvingShowByFileName(showItem.filename)
@@ -718,7 +727,7 @@ module.exports = {
}, },
change(fileList) { change(fileList) {
//此处要把origin传到父组件 防止图库里的图片被删除 //此处要把origin传到父组件 防止图库里的图片被删除
this.$emit("update:files",fileList.filter(v=>v.data || v.id).map(v => { this.$emit("update:files", fileList.filter(v => v.data || v.id).map(v => {
return { return {
origin: v.origin, origin: v.origin,
...v.data ...v.data
@@ -10,16 +10,30 @@ layout("/mobile/platform.html"){
width: 100%; width: 100%;
} }
.remark-content{ .remark-content {
width: 100%; width: 100%;
max-width: 100%; max-width: 100%;
height: calc(100vh - 46px - 44px); /* height: calc(100vh - 46px - 44px);
overflow-y: auto; overflow-y: auto;
padding: 10px; padding: 10px;*/
} }
.remark-content *{ .risk-dialog-wrapper {
max-width: 100%!important; display: flex;
flex-direction: column;
max-height: 70vh; /* 限制 ActionSheet 最大高度,避免全屏 */
padding: 16px;
box-sizing: border-box;
}
.remark-scrollable {
flex: 1;
overflow-y: auto; /* 内容超出时滚动 */
padding-bottom: 16px; /* 给按钮留点空间 */
}
.remark-content * {
max-width: 100% !important;
} }
.joinPopup { .joinPopup {
@@ -38,7 +52,7 @@ layout("/mobile/platform.html"){
<div style="margin: 20px 20px 10px 20px" <div style="margin: 20px 20px 10px 20px"
v-if="moment(o.applyStartTime).valueOf() < moment().valueOf() && moment().valueOf() < moment(o.applyEndTime).valueOf()"> v-if="moment(o.applyStartTime).valueOf() < moment().valueOf() && moment().valueOf() < moment(o.applyEndTime).valueOf()">
<van-button :color="themeColor" @click="doSave()" <van-button :color="themeColor" @click="openRiskText"
block style="border-radius: 10px" block style="border-radius: 10px"
type="info" type="info"
v-if="!isRegister && !isRegisterFull"> v-if="!isRegister && !isRegisterFull">
@@ -79,9 +93,23 @@ layout("/mobile/platform.html"){
</div>--> </div>-->
<van-popup class="joinPopup" position="right" v-model:show="showActivityInfoPopup"> <van-popup class="joinPopup" position="right" v-model:show="showActivityInfoPopup">
<van-nav-bar @click-left="showActivityInfoPopup = false" fixed left-arrow placeholder title="活动内容"></van-nav-bar> <van-nav-bar @click-left="showActivityInfoPopup = false" fixed left-arrow placeholder
title="活动内容"></van-nav-bar>
<div class="remark-content" v-html="activityContent" @click="remarkClick"></div> <div class="remark-content" v-html="activityContent" @click="remarkClick"></div>
</van-popup> </van-popup>
<van-action-sheet v-model="riskTextDialogVisible" closeable :close-on-click-overlay="false"
title="风险告知书">
<div class="risk-dialog-wrapper">
<div class="remark-scrollable">
<div class="remark-content" v-html="o.riskText"></div>
</div>
<van-button :color="themeColor" @click=" doSave()"
block style="border-radius: 10px; margin-top: 16px;"
type="info" :disabled="submitDisabled">
{{ seconds <= 0 ? '去报名' :(seconds+'秒后去报名') }}
</van-button>
</div>
</van-action-sheet>
</div> </div>
@@ -99,17 +127,46 @@ layout("/mobile/platform.html"){
isSign: false, isSign: false,
activityContent: '', activityContent: '',
showActivityInfoPopup: false showActivityInfoPopup: false,
riskTextDialogVisible: false,
submitDisabled: false,
seconds: 0,
interval: null
} }
}, },
methods: { methods: {
remarkClick(event){ openRiskText() {
if (this.o.riskText) {
this.openInterval()
return
}
this.doSave()
},
openInterval() {
this.seconds = 3
this.submitDisabled = true
this.riskTextDialogVisible = true
this.$nextTick(() => {
this.interval = setInterval(() => {
this.seconds--
if (this.seconds <= 0) {
this.seconds = 0
this.submitDisabled = false
clearInterval(this.interval)
this.interval = null
}
}, 1000)
})
},
remarkClick(event) {
//如果点击的是图片 //如果点击的是图片
if(event.target.tagName === 'IMG'){ if (event.target.tagName === 'IMG') {
vant.ImagePreview([event.target.src]) vant.ImagePreview([event.target.src])
} }
}, },
showActivityInfo(activityContent){ showActivityInfo(activityContent) {
console.log(activityContent) console.log(activityContent)
this.activityContent = '' this.activityContent = ''
this.activityContent = activityContent this.activityContent = activityContent
@@ -177,7 +234,8 @@ layout("/mobile/platform.html"){
message: resp.msg, message: resp.msg,
}).then(() => { }).then(() => {
window.location.reload() window.location.reload()
}).catch(() => {}) }).catch(() => {
})
// setTimeout(() => { // setTimeout(() => {
// this.$toast.success(resp.msg) // this.$toast.success(resp.msg)
// pjaxReplace('/mobile/activity/unionActivity') // pjaxReplace('/mobile/activity/unionActivity')
@@ -152,12 +152,25 @@ layout("/mobile/platform.html"){
.van-tabs__nav--complete { .van-tabs__nav--complete {
padding: 0; padding: 0;
} }
.risk-dialog-wrapper {
display: flex;
flex-direction: column;
max-height: 70vh; /* 限制 ActionSheet 最大高度,避免全屏 */
padding: 16px;
box-sizing: border-box;
}
.remark-scrollable {
flex: 1;
overflow-y: auto; /* 内容超出时滚动 */
padding-bottom: 16px; /* 给按钮留点空间 */
}
.remark-content{ .remark-content{
width: 100%; width: 100%;
max-width: 100%; max-width: 100%;
height: calc(100vh - 46px - 44px); /* height: calc(100vh - 46px - 44px);
overflow-y: auto; overflow-y: auto;*/
} }
.remark-content *{ .remark-content *{
@@ -272,7 +285,7 @@ layout("/mobile/platform.html"){
<van-button type="primary" color="#1867b0" round size="mini" <van-button type="primary" color="#1867b0" round size="mini"
v-if="activityStatus !== '1' && o.isSign === false" v-if="activityStatus !== '1' && o.isSign === false"
style="position: absolute; left: 74%; bottom: 10%; width: 74px; height: 28px" style="position: absolute; left: 74%; bottom: 10%; width: 74px; height: 28px"
@click.stop="signUp(o)"> @click.stop="openRiskText(o)">
我要报名 我要报名
</van-button> </van-button>
@@ -434,6 +447,20 @@ layout("/mobile/platform.html"){
</van-tabs> </van-tabs>
</van-popup> </van-popup>
<van-action-sheet v-model="riskTextDialogVisible" closeable :close-on-click-overlay="false"
title="风险告知书">
<div class="risk-dialog-wrapper">
<div class="remark-scrollable">
<div class="remark-content" v-html="activity.riskText"></div>
</div>
<van-button :color="themeColor" @click="riskTextDialogVisible=false;signUp(choose)"
block style="border-radius: 10px; margin-top: 16px;"
type="info" :disabled="submitDisabled">
{{ seconds <= 0 ? '去报名' :(seconds+'秒后去报名') }}
</van-button>
</div>
</van-action-sheet>
<div> <div>
<van-tabbar v-model="tarBarActive"> <van-tabbar v-model="tarBarActive">
<van-tabbar-item icon="home-o" replace @click="pjaxReplace('/platform/mobile/trainSignUpActivity/trainList')">活动报名</van-tabbar-item> <van-tabbar-item icon="home-o" replace @click="pjaxReplace('/platform/mobile/trainSignUpActivity/trainList')">活动报名</van-tabbar-item>
@@ -498,12 +525,42 @@ layout("/mobile/platform.html"){
clickCourseRemark: {}, clickCourseRemark: {},
signUsers: [], signUsers: [],
riskTextDialogVisible: false,
submitDisabled: false,
seconds: 0,
interval: null
} }
}, },
components: { components: {
'train-dynamic-form': httpVueLoader('/components/mobile/common/TrainDynamicForm.vue') 'train-dynamic-form': httpVueLoader('/components/mobile/common/TrainDynamicForm.vue')
}, },
methods: { methods: {
openRiskText(o) {
this.choose = o
if (this.activity.riskText) {
this.openInterval()
return
}
this.signUp(o)
},
openInterval() {
this.seconds = 3
this.submitDisabled = true
this.riskTextDialogVisible = true
this.$nextTick(() => {
this.interval = setInterval(() => {
this.seconds--
if (this.seconds <= 0) {
this.seconds = 0
this.submitDisabled = false
clearInterval(this.interval)
this.interval = null
}
}, 1000)
})
},
async remarkActiveClick(name, title) { async remarkActiveClick(name, title) {
if (name === 1) { if (name === 1) {
//获取报名人员 //获取报名人员
@@ -429,7 +429,8 @@
<el-col :span="24"> <el-col :span="24">
<el-form-item label="活动介绍" prop="activityContent" :rules="{required:true,message: '请输入活动介绍', trigger: 'blur'}"> <el-form-item label="活动介绍" prop="activityContent"
:rules="{required:true,message: '请输入活动介绍', trigger: 'blur'}">
<text-editor v-model="formData.activityContent" ref="contentEditor"></text-editor> <text-editor v-model="formData.activityContent" ref="contentEditor"></text-editor>
<!-- <el-input--> <!-- <el-input-->
<!-- :rows="7"--> <!-- :rows="7"-->
@@ -439,6 +440,11 @@
<!-- </el-input>--> <!-- </el-input>-->
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24">
<el-form-item label="风险告知书" prop="riskText">
<text-editor v-model="formData.riskText" ref="riskTextEditor"></text-editor>
</el-form-item>
</el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="附件上传" prop="otherFiles"> <el-form-item label="附件上传" prop="otherFiles">
@@ -447,6 +453,7 @@
</el-col> </el-col>
<el-col :span="24" v-if="formData.isEnrollSystem === false"> <el-col :span="24" v-if="formData.isEnrollSystem === false">
<el-form-item label="活动考核内容" prop="activityExamineContent"> <el-form-item label="活动考核内容" prop="activityExamineContent">
<el-input <el-input
@@ -809,9 +816,9 @@
await this.$refs['addForm'].validate() await this.$refs['addForm'].validate()
}, },
plannedDateChange(val) { plannedDateChange(val) {
if (val){ if (val) {
val[0]=moment(val[0]).format('YYYY-MM-DD HH:mm') val[0] = moment(val[0]).format('YYYY-MM-DD HH:mm')
val[1]=moment(val[1]).format('YYYY-MM-DD HH:mm') val[1] = moment(val[1]).format('YYYY-MM-DD HH:mm')
} }
this.$set(this.formData, "time", val) this.$set(this.formData, "time", val)
@@ -78,7 +78,8 @@
<span v-if="row.signUpMethod===1">个人报名</span> <span v-if="row.signUpMethod===1">个人报名</span>
<span v-else-if="row.signUpMethod===2">分工会报名</span> <span v-else-if="row.signUpMethod===2">分工会报名</span>
<span v-else-if="row.signUpMethod===3" <span v-else-if="row.signUpMethod===3"
style="color: #fd835a">组队报名<span style="color: black">(每组限报 <span style="color: red">{{row.teamNum}}</span> 人)</span></span> style="color: #fd835a">组队报名<span style="color: black">(每组限报 <span
style="color: red">{{row.teamNum}}</span> 人)</span></span>
<span v-else-if="!row.signUpMethod">无需报名</span> <span v-else-if="!row.signUpMethod">无需报名</span>
</template> </template>
@@ -90,19 +91,22 @@
<el-table-column align="center" header-align="center" label="操作" prop="userOnline" width="250px"> <el-table-column align="center" header-align="center" label="操作" prop="userOnline" width="250px">
<template scope="{row}"> <template scope="{row}">
<el-button :loading="row.loading" @click="openView(row)" size="mini" type="primary">查看</el-button> <el-button :loading="row.loading" @click="openView(row)" size="mini" type="primary">查看
</el-button>
<template <template
v-if="moment(row.applyStartTime).valueOf()<moment().valueOf()&&moment(row.applyEndTime).valueOf()>moment().valueOf()" v-if="moment(row.applyStartTime).valueOf()<moment().valueOf()&&moment(row.applyEndTime).valueOf()>moment().valueOf()"
> >
<el-button :loading="row.loading" @click="openAudit(row)" size="mini" type="primary" v-if="row.signUpMethod === 2"> <el-button :loading="row.loading" @click="openRiskText(row)" size="mini" type="primary"
v-if="row.signUpMethod === 2">
报名 报名
</el-button> </el-button>
<el-button :loading="row.loading" @click="openAudit(row)" size="mini" type="primary" v-if="row.signUpMethod === 3"> <el-button :loading="row.loading" @click="openRiskText(row)" size="mini" type="primary"
v-if="row.signUpMethod === 3">
{{ row.countUser > 0 ? '修改' : '报名' }} {{ row.countUser > 0 ? '修改' : '报名' }}
</el-button> </el-button>
<el-button <el-button
:loading="row.loading" :loading="row.loading"
@click="doAdd(row)" @click="openRiskText(row)"
size="mini" size="mini"
type="primary" type="primary"
v-if="row.signUpMethod === 1&&row.countUser===0" v-if="row.signUpMethod === 1&&row.countUser===0"
@@ -146,13 +150,17 @@
<el-card class="mt10" shadow="never"> <el-card class="mt10" shadow="never">
<el-table :data="escalationTableData" max-height="500px"> <el-table :data="escalationTableData" max-height="500px">
<el-table-column align="center" header-align="center" label="序号" type="index" width="100"></el-table-column> <el-table-column align="center" header-align="center" label="序号" type="index"
width="100"></el-table-column>
<el-table-column align="center" header-align="center" label="姓名" prop="username"></el-table-column> <el-table-column align="center" header-align="center" label="姓名"
prop="username"></el-table-column>
<el-table-column align="center" header-align="center" label="教工号" prop="loginname"></el-table-column> <el-table-column align="center" header-align="center" label="教工号"
prop="loginname"></el-table-column>
<el-table-column align="center" header-align="center" label="单位" prop="unitname" sortable></el-table-column> <el-table-column align="center" header-align="center" label="单位" prop="unitname"
sortable></el-table-column>
<!--<el-table-column align="center" header-align="center" label="操作" sortable> <!--<el-table-column align="center" header-align="center" label="操作" sortable>
<template scope="{$index,row}"> <template scope="{$index,row}">
@@ -170,6 +178,21 @@
<tissue-info ref="info"></tissue-info> <tissue-info ref="info"></tissue-info>
</template> </template>
</guava> </guava>
<el-dialog
:close-on-click-modal="false"
:visible.sync="riskTextDialogVisible"
title="风险告知书"
width="70%"
>
<div v-html="rowData.riskText"></div>
<span class="dialog-footer" slot="footer">
<el-button @click="closeRiskText" type="primary" :disabled="submitDisabled">
{{ seconds <= 0 ? '去报名' :(seconds+'秒后去报名') }}
</el-button>
</span>
</el-dialog>
</div> </div>
<script> <script>
@@ -184,19 +207,23 @@
year: new Date().getFullYear() + "" year: new Date().getFullYear() + ""
}, },
tableColumns: [ tableColumns: [
{ prop: "name", label: "活动名称" }, {prop: "name", label: "活动名称"},
{ prop: "address", label: "活动地点" }, {prop: "address", label: "活动地点"},
{ prop: "projectTypeName", label: "活动项目类型" }, {prop: "projectTypeName", label: "活动项目类型"},
{ prop: "tussueName", label: "举办单位" }, {prop: "tussueName", label: "举办单位"},
{ prop: "time", label: "活动日期" }, {prop: "time", label: "活动日期"},
{ prop: "totalApplyNum", label: "已报名人数", width: 160 }, {prop: "totalApplyNum", label: "已报名人数", width: 160},
{ prop: "signUpMethod", label: "报名方式", sortable: true, width: 200 }, {prop: "signUpMethod", label: "报名方式", sortable: true, width: 200},
{ prop: "countUser", label: "我的报名", sortable: true } {prop: "countUser", label: "我的报名", sortable: true}
], ],
leftData: [], leftData: [],
rightData: [], rightData: [],
rowData: {} rowData: {},
riskTextDialogVisible: false,
submitDisabled: false,
seconds: 0,
interval: null
} }
}, },
components: { components: {
@@ -208,8 +235,55 @@
} }
}, },
methods: { methods: {
openInterval() {
this.seconds = 3
this.submitDisabled = true
this.riskTextDialogVisible = true
this.$nextTick(() => {
this.interval = setInterval(() => {
this.seconds--
if (this.seconds <= 0) {
this.seconds = 0
this.submitDisabled = false
clearInterval(this.interval)
this.interval = null
}
}, 1000)
})
},
closeRiskText() {
this.riskTextDialogVisible = false
const loading = this.$loading({
lock: true,
text: '数据加载中...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
setTimeout(() => {
loading.close()
if (this.rowData.signUpMethod === 1) {
this.doAdd(this.rowData)
} else {
this.openAudit(this.rowData)
}
}, 500)
},
openRiskText(row) {
this.rowData = row
if (row.riskText) {
this.openInterval()
return
}
if (row.signUpMethod === 1) {
this.doAdd(row)
} else {
this.openAudit(row)
}
},
openView(row) { openView(row) {
const { id } = row const {id} = row
this.$refs.info.getInfo(id) this.$refs.info.getInfo(id)
this.$refs.guava.view() this.$refs.guava.view()
}, },
@@ -220,7 +294,7 @@
} }
this.submitLoading = true this.submitLoading = true
const { code, msg } = await $.get("/mobile/activity/unionActivity/doSaveUnionRegister", { const {code, msg} = await $.get("/mobile/activity/unionActivity/doSaveUnionRegister", {
activityId: this.tissueId, activityId: this.tissueId,
personIds: JSON.stringify(this.rightData) personIds: JSON.stringify(this.rightData)
}) })
@@ -241,7 +315,7 @@
}) })
if (confirm === "confirm") { if (confirm === "confirm") {
row.loading = true row.loading = true
const { code, msg } = await $.get("/mobile/activity/unionActivity/doSingleCancelRegister", { const {code, msg} = await $.get("/mobile/activity/unionActivity/doSingleCancelRegister", {
activityId: row.id activityId: row.id
}) })
if (code === 0) { if (code === 0) {
@@ -262,7 +336,7 @@
}) })
if (confirm === "confirm") { if (confirm === "confirm") {
row.loading = true row.loading = true
const { code, msg } = await $.get("/mobile/activity/unionActivity/doSingleRegister", { const {code, msg} = await $.get("/mobile/activity/unionActivity/doSingleRegister", {
activityId: row.id activityId: row.id
}) })
if (code === 0) { if (code === 0) {
@@ -287,13 +361,13 @@
this.tableLoading = true this.tableLoading = true
this.$refs.guava.edit() this.$refs.guava.edit()
const { data } = await $.get("/platform/activity/applyUser/selfUnionUsers", { const {data} = await $.get("/platform/activity/applyUser/selfUnionUsers", {
groupId: row.groupId, groupId: row.groupId,
tissueId: row.id tissueId: row.id
}) })
this.leftData = data this.leftData = data
const { data: rightData } = await $.get("/platform/activity/applyUser/getReportedUser", { const {data: rightData} = await $.get("/platform/activity/applyUser/getReportedUser", {
tissueId: row.id tissueId: row.id
}) })
@@ -282,7 +282,8 @@ layout("/layouts/platform.html"){
show-overflow-tooltip> show-overflow-tooltip>
<template scope="{row}" v-if="column.prop=='courseLocationCoordinates'"> <template scope="{row}" v-if="column.prop=='courseLocationCoordinates'">
<el-button style="padding: 0" @click="openViewMap(row.courseLocationCoordinates)" type="text"> <el-button style="padding: 0" @click="openViewMap(row.courseLocationCoordinates)"
type="text">
{{row.courseLocation}} {{row.courseLocation}}
</el-button> </el-button>
</template> </template>
@@ -292,8 +293,10 @@ layout("/layouts/platform.html"){
<span style="color: #e5a15e">活动时间另行通知</span> <span style="color: #e5a15e">活动时间另行通知</span>
</template> </template>
<template v-else> <template v-else>
<el-button v-if="row.courseList && row.courseList.length == 1" type="text" style="padding: 0"> <el-button v-if="row.courseList && row.courseList.length == 1" type="text"
{{moment(row.courseList[0].courseStartTime).format('MM-DD HH:mm')}}至{{moment(row.courseList[0].courseStartTime).format('MM-DD HH:mm')}} style="padding: 0">
{{moment(row.courseList[0].courseStartTime).format('MM-DD
HH:mm')}}至{{moment(row.courseList[0].courseStartTime).format('MM-DD HH:mm')}}
</el-button> </el-button>
<el-button v-else style="padding: 0" @click="openViewCourseTime(row)" type="text"> <el-button v-else style="padding: 0" @click="openViewCourseTime(row)" type="text">
点击查看{{trainType}}时间 点击查看{{trainType}}时间
@@ -315,9 +318,12 @@ layout("/layouts/platform.html"){
<el-table-column align="center" label="操作" width="150px"> <el-table-column align="center" label="操作" width="150px">
<template slot-scope="scope"> <template slot-scope="scope">
<!-- <el-button type="primary" size="small">查看信息</el-button>--> <!-- <el-button type="primary" size="small">查看信息</el-button>-->
<el-button v-if="!scope.row.isSign" type="primary" size="mini" @click="doApply(scope.row)">我要报名</el-button> <el-button v-if="!scope.row.isSign" type="primary" size="mini"
<el-button v-else type="danger" size="mini" @click="doCancel(scope.row)">取消报名</el-button> @click="openRiskText(scope.row)">我要报名
</el-button>
<el-button v-else type="danger" size="mini" @click="doCancel(scope.row)">取消报名
</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -402,7 +408,8 @@ layout("/layouts/platform.html"){
message: (['SELECT', 'FILE'].includes(column.columnFormType) ? '请选择' : '请填写') + column.columnName, message: (['SELECT', 'FILE'].includes(column.columnFormType) ? '请选择' : '请填写') + column.columnName,
trigger: 'blur'}"> trigger: 'blur'}">
<!--文本框--> <!--文本框-->
<template v-if="!['SELECT'].includes(column.columnFormType) && ['VARCHAR','TEXT','INT'].includes(column.columnType)"> <template
v-if="!['SELECT'].includes(column.columnFormType) && ['VARCHAR','TEXT','INT'].includes(column.columnType)">
<el-input <el-input
v-model="column.columnValue" v-model="column.columnValue"
:placeholder="'请填写' + column.columnName" :placeholder="'请填写' + column.columnName"
@@ -410,7 +417,8 @@ layout("/layouts/platform.html"){
></el-input> ></el-input>
</template> </template>
<!--选择框--> <!--选择框-->
<template v-else-if="['SELECT'].includes(column.columnFormType) && ['VARCHAR','TEXT','INT'].includes(column.columnType)"> <template
v-else-if="['SELECT'].includes(column.columnFormType) && ['VARCHAR','TEXT','INT'].includes(column.columnType)">
<el-select v-model="column.columnValue" <el-select v-model="column.columnValue"
:placeholder="'请选择' + column.columnName" :placeholder="'请选择' + column.columnName"
style="width: 100%"> style="width: 100%">
@@ -463,7 +471,8 @@ layout("/layouts/platform.html"){
<el-input v-model="registerForm.searchKeyword" placeholder="请输入姓名查询" size="small"></el-input> <el-input v-model="registerForm.searchKeyword" placeholder="请输入姓名查询" size="small"></el-input>
</div> </div>
<div class="btn-group tool-button mt5"> <div class="btn-group tool-button mt5">
<el-select v-model="registerForm.unionId" clearable filterable placeholder="请选择院级工会" size="small"> <el-select v-model="registerForm.unionId" clearable filterable placeholder="请选择院级工会"
size="small">
<el-option <el-option
v-for="item in unionList" v-for="item in unionList"
:key="item.id" :key="item.id"
@@ -482,9 +491,11 @@ layout("/layouts/platform.html"){
<el-button icon="el-icon-search" type="primary" @click="getSignUsers" size="small"></el-button> <el-button icon="el-icon-search" type="primary" @click="getSignUsers" size="small"></el-button>
</div> </div>
<el-table :data="signUsers" max-height="500" size="small"> <el-table :data="signUsers" max-height="500" size="small">
<el-table-column prop="username" label="姓名" header-align="center" align="center"></el-table-column> <el-table-column prop="username" label="姓名" header-align="center"
align="center"></el-table-column>
<el-table-column prop="sex" label="性别" header-align="center" align="center"></el-table-column> <el-table-column prop="sex" label="性别" header-align="center" align="center"></el-table-column>
<el-table-column prop="unionname" label="所属工会" header-align="center" align="center"></el-table-column> <el-table-column prop="unionname" label="所属工会" header-align="center"
align="center"></el-table-column>
</el-table> </el-table>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
@@ -492,6 +503,21 @@ layout("/layouts/platform.html"){
<el-button type="primary" @click="remarkShow = false">关 闭</el-button> <el-button type="primary" @click="remarkShow = false">关 闭</el-button>
</el-row> </el-row>
</el-dialog> </el-dialog>
<el-dialog
:close-on-click-modal="false"
:visible.sync="riskTextDialogVisible"
title="风险告知书"
width="70%"
>
<div v-html="trainSignUpActivity.riskText"></div>
<span class="dialog-footer" slot="footer">
<el-button @click="closeRiskText" type="primary" :disabled="submitDisabled">
{{ seconds <= 0 ? '去报名' :(seconds+'秒后去报名') }}
</el-button>
</span>
</el-dialog>
</div> </div>
<script> <script>
@@ -512,13 +538,13 @@ layout("/layouts/platform.html"){
activityList: [], activityList: [],
courseTypeList: [], courseTypeList: [],
tableColumns: [ tableColumns: [
{ prop: "courseName", label: "名称" }, {prop: "courseName", label: "名称"},
{ prop: "lxname", label: "类型" }, {prop: "lxname", label: "类型"},
{ prop: "coursePeopleNumber", label: "总人数" }, {prop: "coursePeopleNumber", label: "总人数"},
{ prop: "courseLocationCoordinates", label: "地点" }, {prop: "courseLocationCoordinates", label: "地点"},
{ prop: "courseInstructor", label: "联系人" }, {prop: "courseInstructor", label: "联系人"},
{ prop: "courseTime", label: "时间" }, {prop: "courseTime", label: "时间"},
{ prop: "applyNum", label: "已报名人数" } {prop: "applyNum", label: "已报名人数"}
], ],
viewMapDialog: false, viewMapDialog: false,
courseTimeListDialog: false, courseTimeListDialog: false,
@@ -541,9 +567,54 @@ layout("/layouts/platform.html"){
unionId: '', unionId: '',
}, },
unionList: [], unionList: [],
riskTextDialogVisible: false,
submitDisabled: false,
seconds: 0,
interval: null,
rowData: {}
} }
}, },
methods: { methods: {
openInterval() {
this.seconds = 3
this.submitDisabled = true
this.riskTextDialogVisible = true
this.$nextTick(() => {
this.interval = setInterval(() => {
this.seconds--
if (this.seconds <= 0) {
this.seconds = 0
this.submitDisabled = false
clearInterval(this.interval)
this.interval = null
}
}, 1000)
})
},
closeRiskText() {
this.riskTextDialogVisible = false
const loading = this.$loading({
lock: true,
text: '数据加载中...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
setTimeout(() => {
loading.close()
this.doApply(this.rowData)
}, 500)
},
openRiskText(row) {
this.rowData = row
if (this.trainSignUpActivity.riskText) {
this.openInterval()
return
}
this.doApply(row)
},
async remarkActiveClick(tab) { async remarkActiveClick(tab) {
if (tab.name === 'second') { if (tab.name === 'second') {
//获取报名人员 //获取报名人员
@@ -555,7 +626,7 @@ layout("/layouts/platform.html"){
const {data} = await $.get('/platform/trainSingUp/manage/userAdjust/registerUserList', this.registerForm) const {data} = await $.get('/platform/trainSingUp/manage/userAdjust/registerUserList', this.registerForm)
this.signUsers = data this.signUsers = data
}, },
openViewRemark(row){ openViewRemark(row) {
this.remarkActive = 'first' this.remarkActive = 'first'
this.signUsers = [] this.signUsers = []
if (!row.remarks) { if (!row.remarks) {
@@ -565,37 +636,37 @@ layout("/layouts/platform.html"){
this.courseRemark = row this.courseRemark = row
this.remarkShow = true this.remarkShow = true
}, },
async doCancel(row){ async doCancel(row) {
const msg = '您确认要取消' + row.courseName + '的报名吗?' const msg = '您确认要取消' + row.courseName + '的报名吗?'
this.$confirm(msg, '提示', { this.$confirm(msg, '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
}).then(async () => { }).then(async () => {
const resp = await $.post('/platform/mobile/trainSignUpActivity/cancelSignUp',{ const resp = await $.post('/platform/mobile/trainSignUpActivity/cancelSignUp', {
activityId:row.activityId, activityId: row.activityId,
courseId:row.id courseId: row.id
}) })
if (resp.code === 0){ if (resp.code === 0) {
await this.pageData() await this.pageData()
this.$message.success(resp.msg) this.$message.success(resp.msg)
}else { } else {
this.$message.warning(resp.msg) this.$message.warning(resp.msg)
} }
}) })
}, },
calcSignUpCount(o) { calcSignUpCount(o) {
if(o.reserveMode === 2) { if (o.reserveMode === 2) {
let lave = 0 let lave = 0
let lave2 = 0 let lave2 = 0
if(o.hasRegisterNum < o.coursePeopleNumber) { if (o.hasRegisterNum < o.coursePeopleNumber) {
lave = o.coursePeopleNumber - o.hasRegisterNum lave = o.coursePeopleNumber - o.hasRegisterNum
lave2 = o.courseReservedNumber lave2 = o.courseReservedNumber
} else { } else {
lave = 0 lave = 0
lave2 = (o.coursePeopleNumber + o.courseReservedNumber) - o.hasRegisterNum lave2 = (o.coursePeopleNumber + o.courseReservedNumber) - o.hasRegisterNum
} }
let str = "<span style='color: red'>余" + lave +"</span>/" + o.coursePeopleNumber + "人" let str = "<span style='color: red'>余" + lave + "</span>/" + o.coursePeopleNumber + "人"
+ "<span style='color: red'>候补余" + lave2 + "</span>/" + o.courseReservedNumber + "人)" + "<span style='color: red'>候补余" + lave2 + "</span>/" + o.courseReservedNumber + "人)"
return str return str
} else { } else {
@@ -603,7 +674,7 @@ layout("/layouts/platform.html"){
return "<span style='color: #ff8400'>无名额限制</span>/已报<span style='color: red'>" + o.hasRegisterNum + "</span>人)" return "<span style='color: #ff8400'>无名额限制</span>/已报<span style='color: red'>" + o.hasRegisterNum + "</span>人)"
} else { } else {
let lave = o.coursePeopleNumber - (o.hasRegisterNum + o.courseReservedNumber) let lave = o.coursePeopleNumber - (o.hasRegisterNum + o.courseReservedNumber)
return "<span style='color: red'>余" + lave +"</span>/" + o.coursePeopleNumber + "人)" return "<span style='color: red'>余" + lave + "</span>/" + o.coursePeopleNumber + "人)"
} }
} }
}, },
@@ -611,7 +682,7 @@ layout("/layouts/platform.html"){
//获取家属是多少人 //获取家属是多少人
let per = 0 let per = 0
this.formData.trainMobileSignColumnList.forEach(item => { this.formData.trainMobileSignColumnList.forEach(item => {
if(item.columnCode === 'xdqsrs') { if (item.columnCode === 'xdqsrs') {
per += Number(item.columnValue) per += Number(item.columnValue)
} }
}) })
@@ -620,7 +691,7 @@ layout("/layouts/platform.html"){
courseId: this.choose.id, courseId: this.choose.id,
currentFamilyNumber: per, currentFamilyNumber: per,
}) })
if(res.code !== 0) { if (res.code !== 0) {
this.$message.warning(res.msg) this.$message.warning(res.msg)
return return
} }
@@ -641,7 +712,7 @@ layout("/layouts/platform.html"){
} }
}) })
this.formData.mobileColumnsValue = JSON.stringify(mobileColumnsValue) this.formData.mobileColumnsValue = JSON.stringify(mobileColumnsValue)
const resp = await $.post('/platform/mobile/trainSignUpActivity/doSignUp',this.formData) const resp = await $.post('/platform/mobile/trainSignUpActivity/doSignUp', this.formData)
if (resp.code === 0) { if (resp.code === 0) {
await this.pageData() await this.pageData()
this.$message.success(resp.msg) this.$message.success(resp.msg)
@@ -742,7 +813,7 @@ layout("/layouts/platform.html"){
const resp = await $.post(loc() + '/activityData', this.pageForm) const resp = await $.post(loc() + '/activityData', this.pageForm)
if (resp.code === 0) { if (resp.code === 0) {
this.activityList = resp.data this.activityList = resp.data
if(this.activityList.length > 0) { if (this.activityList.length > 0) {
await this.openApply(this.activityList[0]) await this.openApply(this.activityList[0])
} }
} else { } else {
@@ -129,7 +129,8 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="活动类型" prop="trainType" :rules="{required:true,message: '请选择活动类型', trigger: 'blur'}"> <el-form-item label="活动类型" prop="trainType"
:rules="{required:true,message: '请选择活动类型', trigger: 'blur'}">
<el-select @change="typeChange" filterable placeholder="请选择活动类型" <el-select @change="typeChange" filterable placeholder="请选择活动类型"
style="width: 100%" v-model="formData.trainType"> style="width: 100%" v-model="formData.trainType">
<el-option :label="item.name" :value="item.code" v-for="item in trainTypeList"></el-option> <el-option :label="item.name" :value="item.code" v-for="item in trainTypeList"></el-option>
@@ -139,21 +140,25 @@
</el-row> </el-row>
<el-form-item :rules="{required:true,message: '请输入活动介绍', trigger: 'blur'}" label="活动介绍" prop="introduce"> <el-form-item :rules="{required:true,message: '请输入活动介绍', trigger: 'blur'}" label="活动介绍" prop="introduce">
<text-editor v-model="formData.introduce" ></text-editor> <text-editor v-model="formData.introduce"></text-editor>
</el-form-item>
<el-form-item label="风险告知书" prop="riskText">
<text-editor v-model="formData.riskText"></text-editor>
</el-form-item> </el-form-item>
<el-form-item label="封面图片" prop="cover" :rules="{required:true,message: '请上传活动移动端封面图片', trigger: 'blur'}"> <el-form-item label="封面图片" prop="cover"
:rules="{required:true,message: '请上传活动移动端封面图片', trigger: 'blur'}">
<el-col :span="12"> <el-col :span="12">
<image-Upload :file-size="10" :file-type="['jpg','jpeg','png','JPG','JPEG','PNG']" <image-Upload :file-size="10" :file-type="['jpg','jpeg','png','JPG','JPEG','PNG']"
:height="70" :limit="1" :height="70" :limit="1"
:width="140" :width="140"
ref="coverFileUpload" ref="coverFileUpload"
v-model="formData.cover"></image-Upload> v-model="formData.cover"></image-Upload>
<!-- <file-upload ref="coverFileUpload" :files.sync="formData.cover" :max="1" :type="['jpg','jpeg','png','JPG','JPEG','PNG']">--> <!-- <file-upload ref="coverFileUpload" :files.sync="formData.cover" :max="1" :type="['jpg','jpeg','png','JPG','JPEG','PNG']">-->
<!-- <template #el-upload__tip>--> <!-- <template #el-upload__tip>-->
<!-- <div class="el-upload__tip" slot="tip">请上传一张jpg/png/jpeg等格式,且不大于2M的照片</div>--> <!-- <div class="el-upload__tip" slot="tip">请上传一张jpg/png/jpeg等格式,且不大于2M的照片</div>-->
<!-- </template>--> <!-- </template>-->
<!-- </file-upload>--> <!-- </file-upload>-->
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="微信群二维码" prop="wechat"> <el-form-item label="微信群二维码" prop="wechat">
@@ -162,11 +167,11 @@
:limit="1" :limit="1"
:width="140" :width="140"
v-model="formData.wechat"></image-Upload> v-model="formData.wechat"></image-Upload>
<!-- <file-upload :files.sync="formData.wechat" :max="1" :type="['jpg','jpeg','png','JPG','JPEG','PNG']">--> <!-- <file-upload :files.sync="formData.wechat" :max="1" :type="['jpg','jpeg','png','JPG','JPEG','PNG']">-->
<!-- <template #el-upload__tip>--> <!-- <template #el-upload__tip>-->
<!-- <div slot="tip" class="el-upload__tip">请上传一张jpg/png/jpeg等格式,且不大于2M的照片</div>--> <!-- <div slot="tip" class="el-upload__tip">请上传一张jpg/png/jpeg等格式,且不大于2M的照片</div>-->
<!-- </template>--> <!-- </template>-->
<!-- </file-upload>--> <!-- </file-upload>-->
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-form-item> </el-form-item>
@@ -519,7 +524,10 @@
</el-table> </el-table>
<el-row class="mt20" justify="end" type="flex"> <el-row class="mt20" justify="end" type="flex">
<div class="text-danger" style="width: 100%;font-size: 18px;display: flex;align-items: center;font-weight: bold">限制总人数:{{summaryCount}}人</div> <div class="text-danger"
style="width: 100%;font-size: 18px;display: flex;align-items: center;font-weight: bold">
限制总人数:{{summaryCount}}人
</div>
<el-button @click="clearUnionLimit" type="danger">清空分工会人数限制</el-button> <el-button @click="clearUnionLimit" type="danger">清空分工会人数限制</el-button>
<el-button @click="setUpUnionLimitDialog=false">取消</el-button> <el-button @click="setUpUnionLimitDialog=false">取消</el-button>
<el-button @click="doConfirmSetUpUnionLimit" type="primary">确定</el-button> <el-button @click="doConfirmSetUpUnionLimit" type="primary">确定</el-button>
@@ -535,8 +543,10 @@
<span>分工会人数限制</span> <span>分工会人数限制</span>
</el-col> </el-col>
<el-col :span="20"> <el-col :span="20">
<el-button @click="openSetUpUnionLimit(moreInfoIndex)" type="primary" size="small">设置分工会人数限制</el-button> <el-button @click="openSetUpUnionLimit(moreInfoIndex)" type="primary" size="small">设置分工会人数限制
<span v-if="formData.courseList[moreInfoIndex].unionLimit && formData.courseList[moreInfoIndex].unionLimit.length > 0" class="text-success"> </el-button>
<span v-if="formData.courseList[moreInfoIndex].unionLimit && formData.courseList[moreInfoIndex].unionLimit.length > 0"
class="text-success">
已设置 已设置
</span> </span>
<span v-else class="text-danger"> <span v-else class="text-danger">