|
|
@@ -53,8 +53,35 @@
|
|
|
<el-input v-model="form.tel" maxlength="20" placeholder="请输入联系电话" clearable />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
- <el-col :span="12">
|
|
|
- <el-form-item label="可报名单位类型" prop="conditions.typeCheck">
|
|
|
+ <el-col :span="6">
|
|
|
+ <div class="d-flex flex-cln j-st" style="">
|
|
|
+ <el-form-item label="发放积分" prop="pointsFlag" class="">
|
|
|
+ <el-radio-group v-model="form.pointsFlag" style="flex-wrap: nowrap">
|
|
|
+ <el-radio label="1">是</el-radio>
|
|
|
+ <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">
|
|
|
+ <div class="d-flex f-s-14" style="white-space: nowrap;">
|
|
|
+ <div>每成功参会(签到成功)1人发放</div>
|
|
|
+ <el-input v-model="form.points" style="width: 45px" />
|
|
|
+ <div>个单位积分。</div>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="6">
|
|
|
+ <el-form-item label="是否电子手签" prop="eleSignature">
|
|
|
+ <div class="d-flex a-c">
|
|
|
+ <el-radio-group v-model="form.eleSignature" style="flex-wrap: nowrap">
|
|
|
+ <el-radio label="1">是</el-radio>
|
|
|
+ <el-radio label="0">否</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="24">
|
|
|
+ <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">
|
|
|
{{ selectDictLabels(lm_check_join_type, city.vipLevel, ',') }}
|
|
|
@@ -76,7 +103,7 @@
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
- <el-col :span="12" v-if="form?.conditions?.totalCheck == '1'">
|
|
|
+ <el-col :span="18" v-if="form?.conditions?.totalCheck == '1'">
|
|
|
<el-form-item prop="restrictiveConditions">
|
|
|
<template #label>
|
|
|
<span>限制条件</span>
|
|
|
@@ -136,31 +163,53 @@
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
- <el-col :span="6">
|
|
|
- <el-form-item label="是否电子手签" prop="eleSignature">
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-form-item label="是否收取参会费用" prop="meetingCharge.hasFee">
|
|
|
<div class="d-flex a-c">
|
|
|
- <el-radio-group v-model="form.eleSignature" style="flex-wrap: nowrap">
|
|
|
- <el-radio label="1">是</el-radio>
|
|
|
+ <el-radio-group v-model="form.meetingCharge.hasFee" style="flex-wrap: nowrap">
|
|
|
<el-radio label="0">否</el-radio>
|
|
|
+ <el-radio label="1">是</el-radio>
|
|
|
</el-radio-group>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="12">
|
|
|
- <div class="d-flex" style="align-items: flex-end;">
|
|
|
- <el-form-item label="发放积分" prop="pointsFlag" class="">
|
|
|
- <el-radio-group v-model="form.pointsFlag" style="flex-wrap: nowrap">
|
|
|
- <el-radio label="1">是</el-radio>
|
|
|
- <el-radio label="0">否</el-radio>
|
|
|
+ <el-form-item prop="meetingCharge.pricing" v-if="form.meetingCharge.hasFee == '1'">
|
|
|
+ <div class="d-flex">
|
|
|
+ <div class="c-#606266 f-w-6" style="">收费标准:</div>
|
|
|
+ <el-input class="flex1 pl-5" v-model="form.meetingCharge.pricing" maxlength="20" placeholder="请输入收费标准" clearable style="max-width: 200px;" />
|
|
|
+ <div class="pl-10">元/人</div>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item v-if="form.meetingCharge.hasFee == '1'" prop="meetingCharge.hasFlatFee">
|
|
|
+ <div>
|
|
|
+ <el-radio-group v-model="form.meetingCharge.hasFlatFee" style="display: flex;flex-direction: column;align-items: flex-start;">
|
|
|
+ <el-radio label="0">所有人统一收取标准费用</el-radio>
|
|
|
+ <el-radio label="1">
|
|
|
+ 按报名人员类型收取,不同人员收取不同费用
|
|
|
+ <span class="c-999">(不作设置默认统一收取标准费用。)</span>
|
|
|
+ </el-radio>
|
|
|
</el-radio-group>
|
|
|
- </el-form-item>
|
|
|
- <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" />
|
|
|
- <div>个单位积分。</div>
|
|
|
- </div>
|
|
|
- </el-form-item>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ <div ref="hasFee" class="d-flex flex-cln" v-if="form?.meetingCharge?.hasFee == '1' && form?.meetingCharge?.hasFlatFee == '1'">
|
|
|
+ <div class="pl-10 pr-10 pt-5 pb-5 border">
|
|
|
+ <template v-for="(item, index) in form.meetingCharge.typeCharge" :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-select v-model="item.certType" placeholder="" clearable style="width: 100px" :disabled="!+item.check">
|
|
|
+ <el-option v-for="items in hasPartialFree" :key="items.value" :label="items.label" :value="items.value" />
|
|
|
+ </el-select>
|
|
|
+ <div class="d-flex a-c">
|
|
|
+ <div v-if="item.vipLevel != 'P'" class="pl-10 f-s-14" style="white-space: nowrap;">每个单位免费</div>
|
|
|
+ <div v-else class="pl-10 f-s-14" style="white-space: nowrap;">免费</div>
|
|
|
+ <el-input class="pl-10" v-model="item.total" maxlength="20" placeholder="请输入免费人数" style="width: 130px" :disabled="!+item.check || item?.certType !== '1'" />
|
|
|
+ <div class="f-s-14" style="white-space: nowrap;">人,其余每人收费</div>
|
|
|
+ <el-input class="pl-10" v-model="item.cost" maxlength="20" placeholder="请输入费用" style="width: 130px" :disabled="!+item.check || item?.certType !== '1'" />
|
|
|
+ <div f-s-14>元</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <el-empty :image-size="20" description="请先选择报名人员类型" v-if="checkedVipLevels.length == 0" />
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
@@ -300,6 +349,7 @@ const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
const { lm_training_join_type, yes_no, lm_training_cert, lm_check_join_type } = toRefs<any>(proxy?.useDict('lm_training_join_type', 'yes_no', 'lm_training_cert', 'lm_check_join_type'));
|
|
|
const fields = ref<FieldDefinition[]>([])
|
|
|
const showSignIn = ref(false);
|
|
|
+const hasFee = ref<any>()
|
|
|
const fixedField = ref<FieldDefinition[]>([{
|
|
|
name: `ent-${generateSecureRandomString()}`,
|
|
|
label: '企业名称', type: '1',
|
|
|
@@ -315,7 +365,14 @@ const fixedField = ref<FieldDefinition[]>([{
|
|
|
}, {
|
|
|
name: `Con-${generateSecureRandomString()}`,
|
|
|
label: '联系方式', type: '1', readonly: '0',
|
|
|
- required: '1', pattern: '/^\d{11}$/'
|
|
|
+ required: '1'
|
|
|
+}])
|
|
|
+const hasPartialFree = ref([{
|
|
|
+ label: '全部免费',
|
|
|
+ value: '0'
|
|
|
+}, {
|
|
|
+ label: '部分免费',
|
|
|
+ value: '1'
|
|
|
}])
|
|
|
const scrollOptions = {
|
|
|
block: 'center',
|
|
|
@@ -453,7 +510,74 @@ const form = ref<any>({
|
|
|
vipLevel: '10',
|
|
|
check: "0",
|
|
|
total: ''
|
|
|
- }]
|
|
|
+ }],
|
|
|
+ },
|
|
|
+ // 收取参会费用
|
|
|
+ meetingCharge: {
|
|
|
+ hasFee: null,//是否收取参会费用
|
|
|
+ pricing: null,//收费标准
|
|
|
+ hasFlatFee: null,//收费标准类型 0所有人统一收取费用 1按报名人员类型收取
|
|
|
+ typeCharge: [
|
|
|
+ {
|
|
|
+ vipLevel: '0',
|
|
|
+ check: "0",
|
|
|
+ total: '',
|
|
|
+ certType: '1',
|
|
|
+ cost: null
|
|
|
+ },{
|
|
|
+ vipLevel: '1',
|
|
|
+ check: "0",
|
|
|
+ total: '',
|
|
|
+ certType: '1',
|
|
|
+ cost: null
|
|
|
+ }, {
|
|
|
+ vipLevel: '3',
|
|
|
+ check: "0",
|
|
|
+ total: '',
|
|
|
+ certType: '1',
|
|
|
+ cost: null
|
|
|
+ }, {
|
|
|
+ vipLevel: '5',
|
|
|
+ check: "0",
|
|
|
+ total: '',
|
|
|
+ certType: '1',
|
|
|
+ cost: null
|
|
|
+ },
|
|
|
+ {
|
|
|
+ vipLevel: '6',
|
|
|
+ check: "0",
|
|
|
+ total: '',//免费的人数
|
|
|
+ certType: '1',//全部免费还是部分免费 0全部 1部分
|
|
|
+ cost: null //每人收费多少
|
|
|
+ },
|
|
|
+ {
|
|
|
+ vipLevel: '7',
|
|
|
+ check: "0",
|
|
|
+ total: '',//免费的人数
|
|
|
+ certType: '1',//全部免费还是部分免费 0全部 1部分
|
|
|
+ cost: null //每人收费多少
|
|
|
+ },
|
|
|
+ {
|
|
|
+ vipLevel: '9',
|
|
|
+ check: "0",
|
|
|
+ total: '',//免费的人数
|
|
|
+ certType: '1',//全部免费还是部分免费 0全部 1部分
|
|
|
+ cost: null //每人收费多少
|
|
|
+ },
|
|
|
+ {
|
|
|
+ vipLevel: '10',
|
|
|
+ check: "0",
|
|
|
+ total: '',//免费的人数
|
|
|
+ certType: '1',//全部免费还是部分免费 0全部 1部分
|
|
|
+ cost: null //每人收费多少
|
|
|
+ },
|
|
|
+ {
|
|
|
+ vipLevel: "P",
|
|
|
+ check: "0",
|
|
|
+ total: '',
|
|
|
+ certType: '1',
|
|
|
+ cost: null
|
|
|
+ }],
|
|
|
}
|
|
|
});
|
|
|
|
|
|
@@ -484,12 +608,12 @@ const rules = reactive({
|
|
|
trainingTime: [{ required: true, message: '请选择会议时间', trigger: 'blur' }],
|
|
|
joinType: [{ required: true, message: '请选择会议方式', trigger: 'change' }],
|
|
|
trainingLocation: [{ required: true, message: '请输入会议地点', trigger: 'blur' }],
|
|
|
- 'conditions.totalCheck': [{ message: '请选择是否限制报名人数', trigger: 'change' }],
|
|
|
+ 'conditions.totalCheck': [{ required: true, message: '请选择是否限制报名人数', trigger: 'change' }],
|
|
|
'conditions.typeCheck': [
|
|
|
{
|
|
|
validator: (rule, value, callback) => {
|
|
|
setTimeout(() => {
|
|
|
- const isChecked = value.some(item => item.check == "1");
|
|
|
+ const isChecked = value?.some(item => item.check == "1");
|
|
|
if (!isChecked) {
|
|
|
callback(new Error('请至少选择一种可报名单位类型'));
|
|
|
} else {
|
|
|
@@ -501,6 +625,9 @@ const rules = reactive({
|
|
|
trigger: 'change' // 触发校验的时机
|
|
|
}
|
|
|
],
|
|
|
+ 'meetingCharge.hasFee': [{ required: true, message: '请选择是否收取参会费用', trigger: 'change' }],
|
|
|
+ 'meetingCharge.pricing': [{ required: true, message: '请输入收费标准', trigger: 'blur' }],
|
|
|
+ 'meetingCharge.hasFlatFee': [{ required: true, message: '请选择收费标准', trigger: 'change' }],
|
|
|
certFlag: [{ required: true, message: '请选择是否颁发证书', trigger: 'change' }],
|
|
|
certificateInfo: [{ required: true, message: '请选择证书名称', trigger: 'change' }],
|
|
|
description: [{ required: true, message: '请输入会议详情', trigger: 'blur' }],
|
|
|
@@ -514,16 +641,28 @@ const rules = reactive({
|
|
|
const formRef = ref();
|
|
|
const save = debounce(async () => {
|
|
|
await formRef.value.validate();
|
|
|
- form.value.conditions.typeCheck.forEach(typeItem => {
|
|
|
+ if (+form.value?.meetingCharge?.hasFee && +form.value?.meetingCharge?.hasFlatFee) {
|
|
|
+ form.value.meetingCharge.typeCharge.forEach((i) => {
|
|
|
+ if (+i.check && +i.certType) {
|
|
|
+ if (!+i.cost || !+i.total) {
|
|
|
+ hasFee.value.scrollIntoView({
|
|
|
+ behavior: 'smooth',
|
|
|
+ block: 'nearest'
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ form?.value?.conditions?.typeCheck?.forEach(typeItem => {
|
|
|
if (typeItem.check === "0") {
|
|
|
// Update cpyCheck
|
|
|
- const cpyItem = form.value.conditions.cpyCheck.find(item => item.vipLevel === typeItem.vipLevel);
|
|
|
+ const cpyItem = form.value?.conditions?.cpyCheck?.find(item => item.vipLevel === typeItem.vipLevel);
|
|
|
if (cpyItem) {
|
|
|
cpyItem.check = "0";
|
|
|
}
|
|
|
|
|
|
// Update levelCheck
|
|
|
- const levelItem = form.value.conditions.levelCheck.find(item => item.vipLevel === typeItem.vipLevel);
|
|
|
+ const levelItem = form.value?.conditions?.levelCheck?.find(item => item.vipLevel === typeItem.vipLevel);
|
|
|
if (levelItem) {
|
|
|
levelItem.check = "0";
|
|
|
}
|
|
|
@@ -531,11 +670,11 @@ const save = debounce(async () => {
|
|
|
});
|
|
|
const params = {
|
|
|
...form.value,
|
|
|
- trainingStart: form.value.trainingTime ? form.value.trainingTime[0] : undefined,
|
|
|
- trainingEnd: form.value.trainingTime ? form.value.trainingTime[1] : undefined,
|
|
|
- signupStart: form.value.signupsTime ? form.value.signupsTime[0] : undefined,
|
|
|
- signupEnd: form.value.signupsTime ? form.value.signupsTime[1] : undefined,
|
|
|
- certificateInfo: +form.value.certFlag ? form.value.certificateInfo : undefined,
|
|
|
+ trainingStart: form.value?.trainingTime ? form.value.trainingTime[0] : undefined,
|
|
|
+ trainingEnd: form.value?.trainingTime ? form.value.trainingTime[1] : undefined,
|
|
|
+ signupStart: form.value?.signupsTime ? form.value.signupsTime[0] : undefined,
|
|
|
+ signupEnd: form.value?.signupsTime ? form.value.signupsTime[1] : undefined,
|
|
|
+ certificateInfo: +form.value?.certFlag ? form.value.certificateInfo : undefined,
|
|
|
questions: fields.value.map((item, index) => ({
|
|
|
...item,
|
|
|
sort: index + 1 // 从 1 开始
|
|
|
@@ -547,7 +686,7 @@ const save = debounce(async () => {
|
|
|
}
|
|
|
}, 500);
|
|
|
const goEditor = () => {
|
|
|
- window.open('https://lm.yujin.shuziyunyao.com/poster#/editortype=1', '_blank');
|
|
|
+ window.open('https://lm.yujin.shuziyunyao.com/poster#/editor?type=1', '_blank');
|
|
|
}
|
|
|
|
|
|
const addCertInfo = () => {
|
|
|
@@ -571,9 +710,12 @@ const getMeetingDetail = async () => {
|
|
|
...res.data,
|
|
|
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,
|
|
|
- conditions: (res.data?.conditions?.typeCheck == null) ? form.value.conditions : (res.data?.conditions || form.value.conditions)
|
|
|
- };
|
|
|
+ conditions: (res.data?.conditions?.typeCheck == null) ? form.value.conditions : (res.data?.conditions || form.value.conditions),
|
|
|
+ meetingCharge: res.data?.meetingCharge || form.value.meetingCharge};
|
|
|
fields.value = res.data.questions
|
|
|
+ if (form.value?.meetingCharge.pricing && typeof form.value?.meetingCharge.pricing === 'string') {
|
|
|
+ form.value.meetingCharge.pricing = Number(form.value?.meetingCharge.pricing)
|
|
|
+ }
|
|
|
form?.value?.conditions?.typeCheck?.forEach((i) => {
|
|
|
if (i.check == '1') {
|
|
|
checkedVipLevels.value.push(i)
|