|
@@ -88,9 +88,8 @@
|
|
|
<el-checkbox v-model="item.check" true-value="1" false-value="0"
|
|
<el-checkbox v-model="item.check" true-value="1" false-value="0"
|
|
|
:label="'所有' + selectDictLabels(vip_level, item.vipLevel, ',') + '参会人数≤'"
|
|
:label="'所有' + selectDictLabels(vip_level, item.vipLevel, ',') + '参会人数≤'"
|
|
|
size="large" />
|
|
size="large" />
|
|
|
- <el-input class="pl-10" v-model="item.total"
|
|
|
|
|
- maxlength="20" placeholder="请输入报名人数"
|
|
|
|
|
- :disabled="!+item.check" />
|
|
|
|
|
|
|
+ <el-input class="pl-10" v-model="item.total" maxlength="20"
|
|
|
|
|
+ placeholder="请输入报名人数" :disabled="!+item.check" />
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
</div>
|
|
</div>
|
|
@@ -108,7 +107,7 @@
|
|
|
:label="selectDictLabels(vip_level, item.vipLevel, ',') + '限制每家单位人数≤'"
|
|
:label="selectDictLabels(vip_level, item.vipLevel, ',') + '限制每家单位人数≤'"
|
|
|
size="large" true-value="1" false-value="0" /><el-input
|
|
size="large" true-value="1" false-value="0" /><el-input
|
|
|
class="pl-10" v-model="item.total" maxlength="20"
|
|
class="pl-10" v-model="item.total" maxlength="20"
|
|
|
- placeholder="请输入报名人数" :disabled="!+item.check" />
|
|
|
|
|
|
|
+ placeholder="请输入报名人数" :disabled="!+item.check" />
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
@@ -124,7 +123,7 @@
|
|
|
:label="'所有' + selectDictLabels(vip_level, item.vipLevel, ',') + '参会人数≤'"
|
|
:label="'所有' + selectDictLabels(vip_level, item.vipLevel, ',') + '参会人数≤'"
|
|
|
size="large" true-value="1" false-value="0" /><el-input
|
|
size="large" true-value="1" false-value="0" /><el-input
|
|
|
class="pl-10" v-model="item.total" maxlength="20"
|
|
class="pl-10" v-model="item.total" maxlength="20"
|
|
|
- placeholder="请输入报名人数" :disabled="!+item.check" />
|
|
|
|
|
|
|
+ placeholder="请输入报名人数" :disabled="!+item.check" />
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
</div>
|
|
</div>
|
|
@@ -136,7 +135,7 @@
|
|
|
:label="selectDictLabels(vip_level, item.vipLevel, ',') + '限制每家单位人数≤'"
|
|
:label="selectDictLabels(vip_level, item.vipLevel, ',') + '限制每家单位人数≤'"
|
|
|
size="large" true-value="1" false-value="0" /><el-input
|
|
size="large" true-value="1" false-value="0" /><el-input
|
|
|
class="pl-10" v-model="item.total" maxlength="20"
|
|
class="pl-10" v-model="item.total" maxlength="20"
|
|
|
- placeholder="请输入报名人数" :disabled="!+item.check" />
|
|
|
|
|
|
|
+ placeholder="请输入报名人数" :disabled="!+item.check" />
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
</div>
|
|
</div>
|
|
@@ -198,68 +197,136 @@
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
</div>
|
|
</div>
|
|
|
- <div class="pd-16 border-bottom">
|
|
|
|
|
- <div class="info-title mb-10">证书信息</div>
|
|
|
|
|
- <div class="d-flex j-start a-c">
|
|
|
|
|
- <el-form-item label="是否颁发证书" prop="certFlag">
|
|
|
|
|
- <el-radio-group v-model="form.certFlag">
|
|
|
|
|
- <el-radio v-for="item in yes_no" :key="item.value" :label="item.value">{{ item.label
|
|
|
|
|
|
|
+ <div class="pd-16 border-bottom d-flex">
|
|
|
|
|
+ <div class="w-50% pr-80">
|
|
|
|
|
+ <div class="info-title mb-10">证书信息</div>
|
|
|
|
|
+ <div class="d-flex j-start a-c">
|
|
|
|
|
+ <el-form-item label="是否颁发证书" prop="certFlag">
|
|
|
|
|
+ <el-radio-group v-model="form.certFlag">
|
|
|
|
|
+ <el-radio v-for="item in yes_no" :key="item.value" :label="item.value">{{
|
|
|
|
|
+ item.label
|
|
|
}}</el-radio>
|
|
}}</el-radio>
|
|
|
- </el-radio-group>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <div v-if="+form.certFlag" class="ml-20">
|
|
|
|
|
- <el-button @click="addCertInfo" type="primary">新增证书</el-button>
|
|
|
|
|
|
|
+ </el-radio-group>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <div v-if="+form.certFlag" class="ml-20">
|
|
|
|
|
+ <el-button @click="addCertInfo" type="primary">新增证书</el-button>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
- </div>
|
|
|
|
|
- <template v-if="form.certFlag">
|
|
|
|
|
- <template v-for="(item, index) in form.certificateInfo" :key="index">
|
|
|
|
|
- <el-row :gutter="20" class="bg-#f4f4f4 pd-16 mb-10">
|
|
|
|
|
- <el-col :span="6">
|
|
|
|
|
- <el-form-item label="证书名称" :prop="`certificateInfo.${index}.certType`"
|
|
|
|
|
- :rules="[{ required: true, message: '请选择证书名称', trigger: 'change' }]">
|
|
|
|
|
- <el-select v-model="item.certType" placeholder="证书名称" clearable>
|
|
|
|
|
- <el-option v-for="item in lm_training_cert" :key="item.value"
|
|
|
|
|
- :label="item.label" :value="item.value" />
|
|
|
|
|
- </el-select>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- <el-col :span="6">
|
|
|
|
|
- <el-form-item :prop="`certificateInfo.${index}.certImg`"
|
|
|
|
|
- :rules="[{ required: true, message: '请上传证书图片', trigger: 'change' }]">
|
|
|
|
|
- <template #label>
|
|
|
|
|
- <span>证书模板图片</span>
|
|
|
|
|
- <el-button @click="goEditor()" type="primary" text>去编辑模板图片</el-button>
|
|
|
|
|
- </template>
|
|
|
|
|
- <ImageUpload v-model="item.certImg" :fileSize="40" :limit="1"></ImageUpload>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- <el-col :span="6">
|
|
|
|
|
- <el-form-item>
|
|
|
|
|
- <el-button type="danger" @click="deleteItem(index)">删除</el-button>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- </el-row>
|
|
|
|
|
|
|
+ <template v-if="form.certFlag">
|
|
|
|
|
+ <template v-for="(item, index) in form.certificateInfo" :key="index">
|
|
|
|
|
+ <el-row :gutter="20" class="bg-#f4f4f4 pd-16 mb-10">
|
|
|
|
|
+ <el-col :span="6">
|
|
|
|
|
+ <el-form-item label="证书名称" :prop="`certificateInfo.${index}.certType`"
|
|
|
|
|
+ :rules="[{ required: true, message: '请选择证书名称', trigger: 'change' }]">
|
|
|
|
|
+ <el-select v-model="item.certType" placeholder="证书名称" clearable>
|
|
|
|
|
+ <el-option v-for="item in lm_training_cert" :key="item.value"
|
|
|
|
|
+ :label="item.label" :value="item.value" />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :span="6">
|
|
|
|
|
+ <el-form-item :prop="`certificateInfo.${index}.certImg`"
|
|
|
|
|
+ :rules="[{ required: true, message: '请上传证书图片', trigger: 'change' }]">
|
|
|
|
|
+ <template #label>
|
|
|
|
|
+ <span>证书模板图片</span>
|
|
|
|
|
+ <el-button @click="goEditor()" type="primary"
|
|
|
|
|
+ text>去编辑模板图片</el-button>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <ImageUpload v-model="item.certImg" :fileSize="40" :limit="1">
|
|
|
|
|
+ </ImageUpload>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :span="6">
|
|
|
|
|
+ <el-form-item>
|
|
|
|
|
+ <el-button type="danger" @click="deleteItem(index)">删除</el-button>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ </template>
|
|
|
</template>
|
|
</template>
|
|
|
- </template>
|
|
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="w-50% pl-80 pr-80 d-flex flex-cln j-c a-c">
|
|
|
|
|
+ <el-button type="primary" class="w-100%" plain style="height: 70px; margin-bottom: 20px;"
|
|
|
|
|
+ @click="showSignIn = true">
|
|
|
|
|
+ 点击去编辑报名信息></el-button>
|
|
|
|
|
+ <div class="w-400 h-700 border over-auto">
|
|
|
|
|
+ <div class="pd-10 border bg-#fafafa">
|
|
|
|
|
+ <div class="pt-10 f-s-20 f-w-6 d-flex j-c a-c flex-cln ">
|
|
|
|
|
+ 报名信息
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="f-s-12 f-w-4 d-flex j-start c-#BBBBBB">此页面为意向人报名时所见页面:</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <template v-for="(field, index) in fixedField" :key="index">
|
|
|
|
|
+ <div class="meeting-custom-wrapper">
|
|
|
|
|
+ <MeetingCustom :field="field" @click="showSignIn = true" v-if="field" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <template v-for="(field, index) in fields" :key="index">
|
|
|
|
|
+ <div class="meeting-custom-wrapper" @click.stop="showSignIn = true">
|
|
|
|
|
+ <MeetingCustom :field="field" style="pointer-events: none" v-if="field" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
</div>
|
|
</div>
|
|
|
</el-form>
|
|
</el-form>
|
|
|
|
|
+ <MeetingEditors v-if="showSignIn" v-model:show="showSignIn" v-model:info="fields" />
|
|
|
</div>
|
|
</div>
|
|
|
<div class="d-flex a-c j-c pd-16">
|
|
<div class="d-flex a-c j-c pd-16">
|
|
|
- <el-button @click="router.go(-1)">取消</el-button>
|
|
|
|
|
|
|
+ <el-button @click="Cancel">取消</el-button>
|
|
|
<el-button @click="save" type="primary">提交</el-button>
|
|
<el-button @click="save" type="primary">提交</el-button>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
-
|
|
|
|
|
<script setup name="lmmeeting-meeting-add" lang="ts">
|
|
<script setup name="lmmeeting-meeting-add" lang="ts">
|
|
|
import { ref, reactive, onMounted } from 'vue';
|
|
import { ref, reactive, onMounted } from 'vue';
|
|
|
import { debounce } from 'lodash';
|
|
import { debounce } from 'lodash';
|
|
|
import { useRouter } from 'vue-router';
|
|
import { useRouter } from 'vue-router';
|
|
|
import { trainingAdd, trainingDetail, trainingUpdate } from '@/api/training';
|
|
import { trainingAdd, trainingDetail, trainingUpdate } from '@/api/training';
|
|
|
import { checkPermi } from '@/utils/permission';
|
|
import { checkPermi } from '@/utils/permission';
|
|
|
|
|
+import { FieldDefinition, FieldType } from '../models/type'
|
|
|
|
|
+// 需要添加以下导入
|
|
|
|
|
+import MeetingCustom from '../models/meeting-custom.vue'
|
|
|
|
|
+import MeetingEditors from '../models/meeting-editors.vue'
|
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
const { dm_training_join_type, yes_no, lm_training_cert, vip_level } = toRefs<any>(proxy?.useDict('dm_training_join_type', 'yes_no', 'lm_training_cert', 'vip_level'));
|
|
const { dm_training_join_type, yes_no, lm_training_cert, vip_level } = toRefs<any>(proxy?.useDict('dm_training_join_type', 'yes_no', 'lm_training_cert', 'vip_level'));
|
|
|
|
|
+const fields = ref<FieldDefinition[]>([])
|
|
|
|
|
+const changefields = ref(true)
|
|
|
|
|
+const showSignIn = ref(false);
|
|
|
|
|
+const fixedField = ref<FieldDefinition[]>([{
|
|
|
|
|
+ name: `ent-${generateSecureRandomString()}`,
|
|
|
|
|
+ label: '企业名称', type: '1',
|
|
|
|
|
+ required: '1', readonly: '0',
|
|
|
|
|
+}, {
|
|
|
|
|
+ name: `name-${generateSecureRandomString()}`,
|
|
|
|
|
+ label: '姓名', type: '1', readonly: '0',
|
|
|
|
|
+ required: '1'
|
|
|
|
|
+}, {
|
|
|
|
|
+ name: `pos-${generateSecureRandomString()}`,
|
|
|
|
|
+ label: '职务', type: '1', readonly: '0',
|
|
|
|
|
+ required: '1'
|
|
|
|
|
+}, {
|
|
|
|
|
+ name: `Con-${generateSecureRandomString()}`,
|
|
|
|
|
+ label: '联系方式', type: '1', readonly: '0',
|
|
|
|
|
+ required: '1'
|
|
|
|
|
+}])
|
|
|
|
|
+function generateSecureRandomString(length = 8) {
|
|
|
|
|
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
|
|
|
|
|
+ const randomValues = new Uint32Array(length);
|
|
|
|
|
+ window.crypto.getRandomValues(randomValues);
|
|
|
|
|
+ let result = '';
|
|
|
|
|
+ randomValues.forEach((value) => {
|
|
|
|
|
+ result += chars[value % chars.length];
|
|
|
|
|
+ });
|
|
|
|
|
+ return result;
|
|
|
|
|
+}
|
|
|
|
|
+const Cancel = () => {
|
|
|
|
|
+ // localStorage.removeItem('RegistrationInformation');
|
|
|
|
|
+ router.go(-1)
|
|
|
|
|
+}
|
|
|
const router = useRouter();
|
|
const router = useRouter();
|
|
|
const route = useRoute();
|
|
const route = useRoute();
|
|
|
const form = ref<any>({
|
|
const form = ref<any>({
|
|
@@ -304,14 +371,13 @@ const rules = reactive({
|
|
|
certFlag: [{ required: true, message: '请选择是否颁发证书', trigger: 'change' }],
|
|
certFlag: [{ required: true, message: '请选择是否颁发证书', trigger: 'change' }],
|
|
|
certificateInfo: [{ required: true, message: '请选择证书名称', trigger: 'change' }],
|
|
certificateInfo: [{ required: true, message: '请选择证书名称', trigger: 'change' }],
|
|
|
description: [{ required: true, message: '请输入培训详情', trigger: 'blur' }],
|
|
description: [{ required: true, message: '请输入培训详情', trigger: 'blur' }],
|
|
|
|
|
+ eleSignature: [{ required: true, message: '请输入培训详情', trigger: 'blur' }],
|
|
|
// coverImg: [{ required: true, message: '请上传封面图', trigger: 'change' }],
|
|
// coverImg: [{ required: true, message: '请上传封面图', trigger: 'change' }],
|
|
|
// trainingImg: [{ required: true, message: '请上传会议图', trigger: 'change' }],
|
|
// trainingImg: [{ required: true, message: '请上传会议图', trigger: 'change' }],
|
|
|
contactName: [{ required: true, message: '请输入会议联系人', trigger: 'blur' }],
|
|
contactName: [{ required: true, message: '请输入会议联系人', trigger: 'blur' }],
|
|
|
tel: [{ required: true, message: '请输入联系电话', trigger: 'blur' }],
|
|
tel: [{ required: true, message: '请输入联系电话', trigger: 'blur' }],
|
|
|
});
|
|
});
|
|
|
const formRef = ref();
|
|
const formRef = ref();
|
|
|
-const levelTotalCheck = ref("0")
|
|
|
|
|
-const cpyTotalCheck = ref("0")
|
|
|
|
|
const save = debounce(async () => {
|
|
const save = debounce(async () => {
|
|
|
await formRef.value.validate();
|
|
await formRef.value.validate();
|
|
|
const params = {
|
|
const params = {
|
|
@@ -321,15 +387,22 @@ const save = debounce(async () => {
|
|
|
signupStart: form.value.signupsTime ? form.value.signupsTime[0] : undefined,
|
|
signupStart: form.value.signupsTime ? form.value.signupsTime[0] : undefined,
|
|
|
signupEnd: form.value.signupsTime ? form.value.signupsTime[1] : undefined,
|
|
signupEnd: form.value.signupsTime ? form.value.signupsTime[1] : undefined,
|
|
|
certificateInfo: +form.value.certFlag ? form.value.certificateInfo : undefined,
|
|
certificateInfo: +form.value.certFlag ? form.value.certificateInfo : undefined,
|
|
|
|
|
+ questions: (fields.value).map((item, index) => ({
|
|
|
|
|
+ ...item,
|
|
|
|
|
+ sort: index + 1 // 从 1 开始
|
|
|
|
|
+ }))
|
|
|
};
|
|
};
|
|
|
const res = form.value.id ? await trainingUpdate(params) : await trainingAdd(params);
|
|
const res = form.value.id ? await trainingUpdate(params) : await trainingAdd(params);
|
|
|
if (res && res.code === 200) {
|
|
if (res && res.code === 200) {
|
|
|
|
|
+ // localStorage.removeItem('RegistrationInformation');
|
|
|
|
|
+
|
|
|
router.go(-1);
|
|
router.go(-1);
|
|
|
}
|
|
}
|
|
|
}, 500);
|
|
}, 500);
|
|
|
const goEditor = () => {
|
|
const goEditor = () => {
|
|
|
window.open('https://lm.yujin.shuziyunyao.com/poster#/editor', '_blank');
|
|
window.open('https://lm.yujin.shuziyunyao.com/poster#/editor', '_blank');
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
const addCertInfo = () => {
|
|
const addCertInfo = () => {
|
|
|
if (!form.value.certificateInfo) {
|
|
if (!form.value.certificateInfo) {
|
|
|
form.value.certificateInfo = [];
|
|
form.value.certificateInfo = [];
|
|
@@ -352,12 +425,27 @@ const getMeetingDetail = async () => {
|
|
|
trainingTime: res.data.trainingStart && res.data.trainingEnd ? [res.data.trainingStart, res.data.trainingEnd] : undefined,
|
|
trainingTime: res.data.trainingStart && res.data.trainingEnd ? [res.data.trainingStart, res.data.trainingEnd] : undefined,
|
|
|
signupsTime: res.data.signupStart && res.data.signupEnd ? [res.data.signupStart, res.data.signupEnd] : undefined
|
|
signupsTime: res.data.signupStart && res.data.signupEnd ? [res.data.signupStart, res.data.signupEnd] : undefined
|
|
|
};
|
|
};
|
|
|
-
|
|
|
|
|
|
|
+ fields.value = res.data.questions
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
|
getMeetingDetail();
|
|
getMeetingDetail();
|
|
|
|
|
+ // if (localStorage.getItem('RegistrationInformation')) {
|
|
|
|
|
+ // fields.value = JSON.parse(localStorage.getItem('RegistrationInformation'))
|
|
|
|
|
+ // }
|
|
|
});
|
|
});
|
|
|
|
|
+// watch(
|
|
|
|
|
+// () => showSignIn.value,
|
|
|
|
|
+// () => {
|
|
|
|
|
+// if (localStorage.getItem('RegistrationInformation')) {
|
|
|
|
|
+// fields.value = JSON.parse(localStorage.getItem('RegistrationInformation'))
|
|
|
|
|
+// } else {
|
|
|
|
|
+// console.log(fields.value);
|
|
|
|
|
+// }
|
|
|
|
|
+
|
|
|
|
|
+// },
|
|
|
|
|
+// { immediate: true }
|
|
|
|
|
+// );
|
|
|
</script>
|
|
</script>
|
|
|
<style scoped>
|
|
<style scoped>
|
|
|
.border {
|
|
.border {
|