|
|
@@ -11,7 +11,7 @@
|
|
|
</el-button>
|
|
|
</div>
|
|
|
<div class="flex1 over-auto">
|
|
|
- <el-form ref="formRef" label-width="auto" label-position="top" :model="form" :rules="rules">
|
|
|
+ <el-form ref="formRef" label-width="auto" label-position="top" :model="form" :rules="rules" :scroll-into-view-options="scrollOptions" scroll-to-error>
|
|
|
<div class="pd-16 border-bottom ov-hd">
|
|
|
<div class="info-title mb-10">会议信息</div>
|
|
|
<el-row :gutter="20">
|
|
|
@@ -22,24 +22,19 @@
|
|
|
</el-col>
|
|
|
<el-col :span="6">
|
|
|
<el-form-item label="会议时间" prop="trainingTime">
|
|
|
- <el-date-picker v-model="form.trainingTime" type="datetimerange"
|
|
|
- value-format="YYYY-MM-DD HH:mm:ss" date-format="YYYY-MM-DD" time-format="HH:mm"
|
|
|
- range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" />
|
|
|
+ <el-date-picker v-model="form.trainingTime" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss" date-format="YYYY-MM-DD" time-format="HH:mm" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="6">
|
|
|
<el-form-item label="报名时间" prop="signupTime">
|
|
|
- <el-date-picker v-model="form.signupsTime" type="datetimerange"
|
|
|
- value-format="YYYY-MM-DD HH:mm:ss" date-format="YYYY-MM-DD" time-format="HH:mm"
|
|
|
- range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" />
|
|
|
+ <el-date-picker v-model="form.signupsTime" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss" date-format="YYYY-MM-DD" time-format="HH:mm" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="6">
|
|
|
<el-form-item label="会议方式" prop="joinType">
|
|
|
<!-- 单选框 -->
|
|
|
<el-radio-group v-model="form.joinType">
|
|
|
- <el-radio v-for="item in lm_training_join_type" :key="item.value"
|
|
|
- :label="item.value">{{ item.label }}</el-radio>
|
|
|
+ <el-radio v-for="item in lm_training_join_type" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
@@ -50,8 +45,7 @@
|
|
|
</el-col>
|
|
|
<el-col :span="6">
|
|
|
<el-form-item label="会议联系人" prop="contactName">
|
|
|
- <el-input v-model="form.contactName" maxlength="40" placeholder="请输入会议联系人"
|
|
|
- clearable />
|
|
|
+ <el-input v-model="form.contactName" maxlength="40" placeholder="请输入会议联系人" clearable />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="6">
|
|
|
@@ -62,16 +56,14 @@
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="可报名人员类型" prop="conditions.typeCheck">
|
|
|
<el-checkbox-group v-model="checkedVipLevels" @change="handleCheckedChange">
|
|
|
- <el-checkbox v-for="city in form.conditions.typeCheck" :key="city" :label="city"
|
|
|
- :value="city">
|
|
|
+ <el-checkbox v-for="city in form.conditions.typeCheck" :key="city" :label="city" :value="city">
|
|
|
{{ selectDictLabels(lm_check_join_type, city.vipLevel, ',') }}
|
|
|
</el-checkbox>
|
|
|
</el-checkbox-group>
|
|
|
<div @click="handleCheckAllChange(true)" v-if="!checkAll" class="pl-10 c-s-p">
|
|
|
<u>全选</u>
|
|
|
</div>
|
|
|
- <div @click="handleCheckAllChange(false)" v-else class="pl-10 c-s-p"><u>取消全选</u>
|
|
|
- </div>
|
|
|
+ <div @click="handleCheckAllChange(false)" v-else class="pl-10 c-s-p"><u>取消全选</u></div>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="6">
|
|
|
@@ -93,86 +85,53 @@
|
|
|
<div class="d-flex flex-cln pl-10">
|
|
|
<div class="d-flex">
|
|
|
<div class="c-#606266 f-w-6" style="">报名总人数限制:</div>
|
|
|
- <el-input class="flex1 pl-5" v-model="form.conditions.total" maxlength="20"
|
|
|
- placeholder="请输入报名人数" clearable
|
|
|
- :disabled="form.conditions.totalCheck !== '1'"
|
|
|
- style="max-width: 200px;" />
|
|
|
+ <el-input class="flex1 pl-5" v-model="form.conditions.total" maxlength="20" placeholder="请输入报名人数" clearable :disabled="form.conditions.totalCheck !== '1'" style="max-width: 200px;" />
|
|
|
</div>
|
|
|
<div class="c-#606266 f-w-6" style="">条件限制:</div>
|
|
|
<div class="d-flex">
|
|
|
<div class="d-flex flex-cln">
|
|
|
- <el-checkbox v-model="form.conditions.levelTotalCheck" label="按单位类型限制"
|
|
|
- size="large" true-value="1" false-value="0" />
|
|
|
- <div v-if="form.conditions.levelTotalCheck == '1' && form.conditions.cpyTotalCheck == '0'"
|
|
|
- class="pl-10 pr-10 pt-5 pb-5 border">
|
|
|
- <template v-for="(item, index) in form.conditions.levelCheck"
|
|
|
- :key="index">
|
|
|
- <div class="d-flex a-c"
|
|
|
- v-if="checkedVipLevels.some(items => items.vipLevel === item.vipLevel)">
|
|
|
- <el-checkbox v-model="item.check" true-value="1"
|
|
|
- false-value="0"
|
|
|
- :label="'所有' + selectDictLabels(lm_check_join_type, item.vipLevel, ',') + '参会人数≤'"
|
|
|
- size="large" />
|
|
|
- <el-input class="pl-10" v-model="item.total" maxlength="20"
|
|
|
- placeholder="请输入报名人数" :disabled="!+item.check" />
|
|
|
+ <el-checkbox v-model="form.conditions.levelTotalCheck" label="按单位类型限制" size="large" true-value="1" false-value="0" />
|
|
|
+ <div v-if="form.conditions.levelTotalCheck == '1' && form.conditions.cpyTotalCheck == '0'" class="pl-10 pr-10 pt-5 pb-5 border">
|
|
|
+ <template v-for="(item, index) in form.conditions.levelCheck" :key="index">
|
|
|
+ <div class="d-flex a-c" v-if="checkedVipLevels.some(items => items.vipLevel === item.vipLevel)">
|
|
|
+ <el-checkbox v-model="item.check" true-value="1" false-value="0" :label="'所有' + selectDictLabels(lm_check_join_type, item.vipLevel, ',') + '参会人数≤'" size="large" />
|
|
|
+ <el-input class="pl-10" v-model="item.total" maxlength="20" placeholder="请输入报名人数" :disabled="!+item.check" />
|
|
|
</div>
|
|
|
</template>
|
|
|
- <el-empty :image-size="20" description="请先选择报名人员类型"
|
|
|
- v-if="checkedVipLevels.length == 0" />
|
|
|
+ <el-empty :image-size="20" description="请先选择报名人员类型" v-if="checkedVipLevels.length == 0" />
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="d-flex flex-cln ml-20">
|
|
|
- <el-checkbox v-model="form.conditions.cpyTotalCheck" label="按每家单位人数限制"
|
|
|
- size="large" true-value="1" false-value="0" />
|
|
|
- <div v-if="form.conditions.cpyTotalCheck == '1' && form.conditions.levelTotalCheck == '0'"
|
|
|
- class="pl-10 pr-10 pt-5 pb-5 border">
|
|
|
- <template v-for="(item, index) in form.conditions.cpyCheck"
|
|
|
- :key="index">
|
|
|
- <div class="d-flex a-c"
|
|
|
- v-if="checkedVipLevels.some(items => items.vipLevel === item.vipLevel)">
|
|
|
- <el-checkbox v-model="item.check"
|
|
|
- :label="selectDictLabels(lm_check_join_type, item.vipLevel, ',') + '限制每家单位人数≤'"
|
|
|
- size="large" true-value="1" false-value="0" />
|
|
|
- <el-input class="pl-10" v-model="item.total" maxlength="20"
|
|
|
- placeholder="请输入报名人数" :disabled="!+item.check" />
|
|
|
+ <el-checkbox v-model="form.conditions.cpyTotalCheck" label="按每家单位人数限制" size="large" true-value="1" false-value="0" />
|
|
|
+ <div v-if="form.conditions.cpyTotalCheck == '1' && form.conditions.levelTotalCheck == '0'" class="pl-10 pr-10 pt-5 pb-5 border">
|
|
|
+ <template v-for="(item, index) in form.conditions.cpyCheck" :key="index">
|
|
|
+ <div class="d-flex a-c" v-if="checkedVipLevels.some(items => items.vipLevel === item.vipLevel)">
|
|
|
+ <el-checkbox v-model="item.check" :label="selectDictLabels(lm_check_join_type, item.vipLevel, ',') + '限制每家单位人数≤'" size="large" true-value="1" false-value="0" />
|
|
|
+ <el-input class="pl-10" v-model="item.total" maxlength="20" placeholder="请输入报名人数" :disabled="!+item.check" />
|
|
|
</div>
|
|
|
</template>
|
|
|
- <el-empty :image-size="20" description="请先选择报名人员类型"
|
|
|
- v-if="checkedVipLevels.length == 0" />
|
|
|
+ <el-empty :image-size="20" description="请先选择报名人员类型" v-if="checkedVipLevels.length == 0" />
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="d-flex border"
|
|
|
- v-if="form.conditions.levelTotalCheck == '1' && form.conditions.cpyTotalCheck == '1'">
|
|
|
+ <div class="d-flex border" v-if="form.conditions.levelTotalCheck == '1' && form.conditions.cpyTotalCheck == '1'">
|
|
|
<div class="pl-10 pr-10 pt-5 pb-5 ">
|
|
|
- <template v-for="(item, index) in form.conditions.levelCheck"
|
|
|
- :key="index">
|
|
|
- <div class="d-flex a-c"
|
|
|
- v-if="checkedVipLevels.some(items => items.vipLevel === item.vipLevel)">
|
|
|
- <el-checkbox v-model="item.check"
|
|
|
- :label="'所有' + selectDictLabels(lm_check_join_type, item.vipLevel, ',') + '参会人数≤'"
|
|
|
- size="large" true-value="1" false-value="0" />
|
|
|
- <el-input class="pl-10" v-model="item.total" maxlength="20"
|
|
|
- placeholder="请输入报名人数" :disabled="!+item.check" />
|
|
|
+ <template v-for="(item, index) in form.conditions.levelCheck" :key="index">
|
|
|
+ <div class="d-flex a-c" v-if="checkedVipLevels.some(items => items.vipLevel === item.vipLevel)">
|
|
|
+ <el-checkbox v-model="item.check" :label="'所有' + selectDictLabels(lm_check_join_type, item.vipLevel, ',') + '参会人数≤'" size="large" true-value="1" false-value="0" />
|
|
|
+ <el-input class="pl-10" v-model="item.total" maxlength="20" placeholder="请输入报名人数" :disabled="!+item.check" />
|
|
|
</div>
|
|
|
</template>
|
|
|
</div>
|
|
|
<div class="pl-10 pr-10 pt-5 pb-5">
|
|
|
- <template v-for="(item, index) in form.conditions.cpyCheck"
|
|
|
- :key="index">
|
|
|
- <div class="d-flex a-c"
|
|
|
- v-if="checkedVipLevels.some(items => items.vipLevel === item.vipLevel)">
|
|
|
- <el-checkbox v-model="item.check"
|
|
|
- :label="selectDictLabels(lm_check_join_type, item.vipLevel, ',') + '限制每家单位人数≤'"
|
|
|
- size="large" true-value="1" false-value="0" />
|
|
|
- <el-input class="pl-10" v-model="item.total" maxlength="20"
|
|
|
- placeholder="请输入报名人数" :disabled="!+item.check" />
|
|
|
+ <template v-for="(item, index) in form.conditions.cpyCheck" :key="index">
|
|
|
+ <div class="d-flex a-c" v-if="checkedVipLevels.some(items => items.vipLevel === item.vipLevel)">
|
|
|
+ <el-checkbox v-model="item.check" :label="selectDictLabels(lm_check_join_type, item.vipLevel, ',') + '限制每家单位人数≤'" size="large" true-value="1" false-value="0" />
|
|
|
+ <el-input class="pl-10" v-model="item.total" maxlength="20" placeholder="请输入报名人数" :disabled="!+item.check" />
|
|
|
</div>
|
|
|
</template>
|
|
|
</div>
|
|
|
- <div class="flex1 ml--10"><el-empty :image-size="20"
|
|
|
- description="请先选择报名人员类型" v-if="checkedVipLevels.length == 0" />
|
|
|
- </div>
|
|
|
+ <div class="flex1 ml--10"><el-empty :image-size="20" description="请先选择报名人员类型" v-if="checkedVipLevels.length == 0" /></div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
@@ -195,8 +154,7 @@
|
|
|
<el-radio label="0">否</el-radio>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="" prop="points" v-if="form.pointsFlag == '1'"
|
|
|
- class="flex1 pl-10">
|
|
|
+ <el-form-item label="" prop="points" v-if="form.pointsFlag == '1'" class="flex1 pl-10">
|
|
|
<div class="d-flex f-s-14">
|
|
|
<div>每成功参会(签到成功)1人发放</div>
|
|
|
<el-input v-model="form.points" style="width: 60px" />
|
|
|
@@ -209,8 +167,7 @@
|
|
|
<el-row :gutter="20">
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="会议详情" prop="description">
|
|
|
- <el-input v-model="form.description" :rows="4" type="textarea"
|
|
|
- placeholder="请输入会议详情" />
|
|
|
+ <el-input v-model="form.description" :rows="4" type="textarea" placeholder="请输入会议详情" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
@@ -245,8 +202,7 @@
|
|
|
<span class="c-999 f-s-12 f-w-4">(此模块报名审核通过后才可查看)</span>
|
|
|
</template>
|
|
|
<div class="d-flex flex-cln mt-10 f-s-12 c-#606266">
|
|
|
- <FileUpload v-model="form.attachments" format="array" :limit="20"
|
|
|
- :fileSize="100"></FileUpload>
|
|
|
+ <FileUpload v-model="form.attachments" format="array" :limit="20" :fileSize="100"></FileUpload>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
@@ -368,6 +324,10 @@ const fixedField = ref<FieldDefinition[]>([{
|
|
|
label: '联系方式', type: '1', readonly: '0',
|
|
|
required: '1'
|
|
|
}])
|
|
|
+const scrollOptions = {
|
|
|
+ block: 'center',
|
|
|
+ behavior: 'smooth'
|
|
|
+};
|
|
|
function generateSecureRandomString(length = 8) {
|
|
|
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
|
|
|
const randomValues = new Uint32Array(length);
|
|
|
@@ -525,7 +485,20 @@ const rules = reactive({
|
|
|
joinType: [{ required: true, message: '请选择会议方式', trigger: 'change' }],
|
|
|
trainingLocation: [{ required: true, message: '请输入会议地点', trigger: 'blur' }],
|
|
|
'conditions.totalCheck': [{ required: true, message: '请选择是否限制报名人数', trigger: 'change' }],
|
|
|
- "conditions.typeCheck": [{ required: true, message: '请选择是否限制报名人员类型', trigger: 'change' }],
|
|
|
+ 'conditions.typeCheck': [
|
|
|
+ {
|
|
|
+ validator: (rule, value, callback) => {
|
|
|
+ // 检查至少选择了一个选项(至少有一个 check 为 "1")
|
|
|
+ const isChecked = value.some(item => item.check === "1");
|
|
|
+ if (!isChecked) {
|
|
|
+ callback(new Error('请至少选择一种可报名人员类型'));
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ trigger: 'change' // 触发校验的时机
|
|
|
+ }
|
|
|
+ ],
|
|
|
certFlag: [{ required: true, message: '请选择是否颁发证书', trigger: 'change' }],
|
|
|
certificateInfo: [{ required: true, message: '请选择证书名称', trigger: 'change' }],
|
|
|
description: [{ required: true, message: '请输入培训详情', trigger: 'blur' }],
|
|
|
@@ -540,8 +513,6 @@ const formRef = ref();
|
|
|
const save = debounce(async () => {
|
|
|
await formRef.value.validate();
|
|
|
form.value.conditions.typeCheck.forEach(typeItem => {
|
|
|
- console.log(typeItem);
|
|
|
-
|
|
|
if (typeItem.check === "0") {
|
|
|
// Update cpyCheck
|
|
|
const cpyItem = form.value.conditions.cpyCheck.find(item => item.vipLevel === typeItem.vipLevel);
|