lisy hai 5 meses
pai
achega
4dda0506a0

+ 36 - 28
src/components/ImageUpload/index.vue

@@ -1,28 +1,32 @@
 <template>
-    <div class="component-upload-image">
-        <el-upload ref="imageUpload" multiple :action="uploadImgUrl" list-type="picture-card" :on-success="handleUploadSuccess" :before-upload="handleBeforeUpload" :limit="limit" :on-error="handleUploadError" :on-exceed="handleExceed" :before-remove="handleDelete" :show-file-list="true" :headers="headers" :file-list="fileList" :on-preview="handlePictureCardPreview" :class="{ hide: fileList.length >= limit }">
-            <el-icon class="avatar-uploader-icon">
-                <plus />
-            </el-icon>
-        </el-upload>
-        <!-- 上传提示 -->
-        <div v-if="showTip" class="el-upload__tip">
-            请上传
-            <template v-if="fileSize">
-                大小不超过
-                <b style="color: #f56c6c">{{ fileSize }}MB</b>
-            </template>
-            <template v-if="fileType">
-                格式为
-                <b style="color: #f56c6c">{{ fileType.join('/') }}</b>
-            </template>
-            的文件
-        </div>
-
-        <el-dialog v-model="dialogVisible" title="预览" width="800px" append-to-body>
-            <img :src="dialogImageUrl" style="display: block; max-width: 100%; margin: 0 auto" />
-        </el-dialog>
+  <div class="component-upload-image">
+    <el-upload ref="imageUpload" multiple :action="uploadImgUrl" list-type="picture-card"
+      :on-success="handleUploadSuccess" :before-upload="handleBeforeUpload" :limit="limit" :on-error="handleUploadError"
+      :on-exceed="handleExceed" :before-remove="handleDelete" :show-file-list="true" :headers="headers"
+      :file-list="fileList" :on-preview="handlePictureCardPreview" :class="{ hide: fileList.length >= limit }">
+      <el-icon class="avatar-uploader-icon">
+        <plus />
+        <div v-if="isShowPrompt" class="f-s-14 d-flex w-90 c-primary" style="position: absolute;top:80%">点击上传图片</div>
+      </el-icon>
+    </el-upload>
+    <!-- 上传提示 -->
+    <div v-if="showTip" class="el-upload__tip">
+      请上传
+      <template v-if="fileSize">
+        大小不超过
+        <b style="color: #f56c6c">{{ fileSize }}MB</b>
+      </template>
+      <template v-if="fileType">
+        格式为
+        <b style="color: #f56c6c">{{ fileType.join('/') }}</b>
+      </template>
+      的文件
     </div>
+
+    <el-dialog v-model="dialogVisible" title="预览" width="800px" append-to-body>
+      <img :src="dialogImageUrl" style="display: block; max-width: 100%; margin: 0 auto" />
+    </el-dialog>
+  </div>
 </template>
 
 <script setup lang="ts">
@@ -50,6 +54,10 @@ const props = defineProps({
     type: Boolean,
     default: true
   },
+  isShowPrompt: {
+    type: Boolean,
+    default: false
+  },
   // 是否支持压缩,默认否
   compressSupport: {
     type: Boolean,
@@ -92,11 +100,11 @@ watch(
           list = val as OssVO[];
         }
       } else if (val.startsWith('http')) {
-        if (val.split(',').length > 0){
+        if (val.split(',').length > 0) {
           val.split(',').forEach((item) => {
-          list.push({ url: item });
-        });
-        }else {
+            list.push({ url: item });
+          });
+        } else {
           list = [{
             url: val
           }];
@@ -196,7 +204,7 @@ const handleDelete = (file: UploadFile): boolean => {
 
   if (props.isString) {
     var findex = fileList.value.map((f) => f.url).indexOf(file.url);
-  }else {
+  } else {
     var findex = fileList.value.map((f) => f.name).indexOf(file.name);
   }
   if (findex > -1 && uploadList.value.length === number.value) {

+ 134 - 14
src/views/training/meeting-add/index.vue

@@ -53,6 +53,19 @@
                                     <el-input v-model="form.tel" maxlength="20" placeholder="请输入联系电话" clearable />
                                 </el-form-item>
                             </el-col>
+                            <el-col :span="12">
+                                <el-form-item label="可报名人员类型" prop="tel">
+                                    <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, ',') }}
+                                        </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>
+                                </el-form-item>
+                            </el-col>
                             <el-col :span="6">
                                 <el-form-item label="报名人数" prop="conditions.totalCheck">
                                     <div class="d-flex a-c">
@@ -77,45 +90,49 @@
                                         <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" />
+                                                <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">
-                                                            <el-checkbox v-model="item.check" true-value="1" false-value="0" :label="'所有' + selectDictLabels(vip_level, item.vipLevel, ',') + '参会人数≤'" size="large" />
+                                                        <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" />
                                                 </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">
-                                                            <el-checkbox v-model="item.check" :label="selectDictLabels(vip_level, item.vipLevel, ',') + '限制每家单位人数≤'" size="large" true-value="1" false-value="0" />
+                                                        <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" />
                                                 </div>
                                             </div>
                                         </div>
                                         <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">
-                                                        <el-checkbox v-model="item.check" :label="'所有' + selectDictLabels(vip_level, item.vipLevel, ',') + '参会人数≤'" size="large" true-value="1" false-value="0" />
+                                                    <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">
-                                                        <el-checkbox v-model="item.check" :label="selectDictLabels(vip_level, item.vipLevel, ',') + '限制每家单位人数≤'" size="large" true-value="1" false-value="0" />
+                                                    <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>
                                     </div>
                                 </el-form-item>
@@ -130,6 +147,19 @@
                                     </div>
                                 </el-form-item>
                             </el-col>
+                            <el-col :span="6">
+                                <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-radio-group>
+                                    </el-form-item>
+                                    <el-form-item prop="points" v-if="form.pointsFlag == '1'" class="flex1 pl-10">
+                                        <el-input v-model="form.points" placeholder="每成功参会(签到成功)1人发放XXX(自填)个单位积分。" />
+                                    </el-form-item>
+                                </div>
+                            </el-col>
                         </el-row>
                         <el-row :gutter="20">
                             <el-col :span="12">
@@ -182,7 +212,7 @@
                                 <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 }}
+                                            {{ item.label }}
                                         </el-radio>
                                     </el-radio-group>
                                 </el-form-item>
@@ -264,7 +294,7 @@ import { FieldDefinition } from '../models/type'
 import meetingCustomPreview from '../models/meeting-custom-preview.vue'
 import MeetingEditors from '../models/meeting-editors.vue'
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { lm_training_join_type, yes_no, lm_training_cert, vip_level } = toRefs<any>(proxy?.useDict('lm_training_join_type', 'yes_no', 'lm_training_cert', 'vip_level'));
+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 fixedField = ref<FieldDefinition[]>([{
@@ -304,7 +334,41 @@ const form = ref<any>({
     conditions: {
         levelTotalCheck: '0',
         cpyTotalCheck: '0',
+        typeCheck: [
+            {
+                vipLevel: "1",
+                check: "1"
+            },
+            {
+                vipLevel: "3",
+                check: "1"
+            },
+            {
+                vipLevel: "5",
+                check: "1"
+            },
+            {
+                vipLevel: "6",
+                check: "1"
+            },
+            {
+                vipLevel: "7",
+                check: "1"
+            },
+            {
+                vipLevel: "9",
+                check: "1"
+            },
+            {
+                vipLevel: "10",
+                check: "1"
+            }
+        ],
         levelCheck: [{
+            vipLevel: '0',
+            check: "0",
+            total: ''
+        }, {
             vipLevel: '1',
             check: "0",
             total: ''
@@ -316,8 +380,30 @@ const form = ref<any>({
             vipLevel: '5',
             check: "0",
             total: ''
+        },
+        {
+            vipLevel: "6",
+            check: "0",
+            total: ''
+        },
+        {
+            vipLevel: "7",
+            check: "0",
+            total: ''
+        },
+        {
+            vipLevel: "9",
+            check: "0",
+        },
+        {
+            vipLevel: "10",
+            total: ''
         }],
         cpyCheck: [{
+            vipLevel: '0',
+            check: "0",
+            total: ''
+        }, {
             vipLevel: '1',
             check: "0",
             total: ''
@@ -329,20 +415,56 @@ const form = ref<any>({
             vipLevel: '5',
             check: "0",
             total: ''
+        }, {
+            vipLevel: '6',
+            check: "0",
+            total: ''
+        }, {
+            vipLevel: '7',
+            check: "0",
+            total: ''
+        }, {
+            vipLevel: '9',
+            check: "0",
+            total: ''
+        }, {
+            vipLevel: '10',
+            check: "0",
+            total: ''
         }]
     }
 });
+
+const checkAll = ref(false)
+const checkedVipLevels = ref([])
+// 选项变化时的处理
+const handleCheckedChange = (selectedValues: string[]) => {
+    // 更新typeCheck中的check状态
+    form.value.conditions.typeCheck.forEach(item => {
+        item.check = selectedValues.includes(item.vipLevel) ? "1" : "0"
+    })
+}
+
+// 全选/取消全选
+const handleCheckAllChange = (val: boolean) => {
+    checkedVipLevels.value = val
+        ? form.value.conditions.typeCheck.map(item => item)
+        : []
+    handleCheckedChange(checkedVipLevels.value)
+    checkAll.value = val
+}
 const rules = reactive({
     // 自动生成全部
     trainingName: [{ required: true, message: '请输入会议名称', trigger: 'blur' }],
     trainingTime: [{ required: true, message: '请选择会议时间', trigger: 'blur' }],
     joinType: [{ required: true, message: '请选择会议方式', trigger: 'change' }],
     trainingLocation: [{ required: true, message: '请输入会议地点', trigger: 'blur' }],
-    'conditions.totalCheck':[{ required: true, message: '请选择是否限制报名人数', trigger: 'change' }],
+    'conditions.totalCheck': [{ required: true, message: '请选择是否限制报名人数', trigger: 'change' }],
     certFlag: [{ required: true, message: '请选择是否颁发证书', trigger: 'change' }],
     certificateInfo: [{ required: true, message: '请选择证书名称', trigger: 'change' }],
     description: [{ required: true, message: '请输入培训详情', trigger: 'blur' }],
     eleSignature: [{ required: true, message: '请选择是否电子手签', trigger: 'blur' }],
+    pointsFlag: [{ required: true, message: '请选择是否发放积分', trigger: 'blur' }],
     // coverImg: [{ required: true, message: '请上传封面图', trigger: 'change' }],
     // trainingImg: [{ required: true, message: '请上传会议图', trigger: 'change' }],
     contactName: [{ required: true, message: '请输入会议联系人', trigger: 'blur' }],
@@ -350,8 +472,6 @@ const rules = reactive({
 });
 const formRef = ref();
 const save = debounce(async () => {
-    console.log('123123');
-
     await formRef.value.validate();
     const params = {
         ...form.value,

+ 4 - 1
src/views/training/meeting/index.vue

@@ -89,7 +89,10 @@
                                 <span></span>
                                 <el-button v-if="['3'].includes(row?.trainingStatus)" type="primary" @click="editRow(row)" text>编辑</el-button>
                                 <span></span>
-                                <el-button @click="router.push({ path: 'lmmeetingdetail', query: { id: row?.id } })" style="color: #0079fe;" text>人员管理及详情</el-button>
+                                <el-badge :value="row.waitCount" class="item" :offset="[-10, 5]" v-if="+row.waitCount">
+                                    <el-button @click="router.push({ path: 'lmmeetingdetail', query: { id: row?.id } })" style="color: #0079fe;" text>人员管理及详情</el-button>
+                                </el-badge>
+                                <el-button v-else @click="router.push({ path: 'lmmeetingdetail', query: { id: row?.id } })" style="color: #0079fe;" text>人员管理及详情</el-button>
                                 <span></span>
                                 <el-button text type="danger" @click="deleteRow(row)">删除</el-button>
                             </template>

+ 17 - 9
src/views/training/models/meeting-custom-preview.vue

@@ -25,7 +25,8 @@
             </div>
             <div v-else-if="field.name.includes('desc1-')" prop="defValue" :rules="[{ required: true, message: '请输入描述', trigger: 'blur' }]">
                 <el-tag type="info" size="small">文本描述</el-tag>
-                <el-input
+                <div class="pb-5 f-s-16 f-w-6 c-#606266 pt-5">{{ field.defValue }}</div>
+                <!-- <el-input
                     class="pd-5 no-disabled-input"
                     v-model="field.defValue"
                     :placeholder="'请输入'"
@@ -34,7 +35,7 @@
                             minRows: 4, maxRows: 7
                         }"
                     style="width: 340px;font-weight: 600;"
-                />
+                /> -->
             </div>
             <div class="d-flex flex-cln" v-else>
                 <div class="pb-5 f-s-16 f-w-6 c-#606266">{{ field.label }}</div>
@@ -109,18 +110,25 @@
                         <el-tag type="info" size="small" v-if="field.name.includes('file1-')">文件</el-tag>
                         <el-tag type="info" size="small" v-if="field.name.includes('pic2-')">图文描述</el-tag>
                     </div>
-                    <div class="pb-5 f-s-16 f-w-6 c-#606266">{{ field.label }}</div>
-                    <el-input ref="titleInput" class="pd-5 no-disabled-input" v-model="field.label" :placeholder="'请输入标题'" style="width: 340px;font-size: 16px;" clearable />
+                    <div class="pb-5 f-s-16 f-w-6 c-#606266 pt-5">{{ field.label }}</div>
+                    <!-- <el-input ref="titleInput" class="pd-5 no-disabled-input" v-model="field.label" :placeholder="'请输入标题'" style="width: 340px;font-size: 16px;" clearable /> -->
                 </div>
             </div>
-            <ImageUpload v-if="!field.name.includes('pic2')" v-model="field.defValue" :limit="1" isString class="pl-5 noup"></ImageUpload>
+            <ImageUpload v-if="!field.name.includes('pic2')" v-model="field.defValue" :limit="1" isString class="pl-5 noup" :isShowTip="false"></ImageUpload>
             <div prop="defValue" v-if="field.name.includes('pic2')">
-                <div>
-                    <ImageUpload v-model="field.defValue" :limit="3" isString class="pl-5 up"></ImageUpload>
+                <!-- <div>
+                    <ImageUpload v-model="field.defValue" :limit="3" isString class="pl-5 up" :isShowTip="false"></ImageUpload>
+                </div> -->
+                <div class="d-flex flex-wrap" v-if="field.defValue">
+                    <template v-for="(item, index) in field.defValue.split(',')" :key="index">
+                        <div class="mr-10 mb-10">
+                            <ImagePreview :src="item" :width="100" :height="100"></ImagePreview>
+                        </div>
+                    </template>
                 </div>
             </div>
-            <div class="f-s-12 c-999 pl-5">参会者点击可上传文件/图片</div>
-            <div class="f-s-12 c-999 pl-5">单个图片/文件大小不超过100MB;</div>
+            <div class="f-s-12 c-333 pl-5 pt-15" v-if="!field.name.includes('pic2')">参会者点击可上传文件/图片</div>
+            <div class="f-s-12 c-999 pl-5">单个图片/文件大小不超过10MB;</div>
             <div class="f-s-12 c-999 pl-5">支持格式:gif、png、jpg、jpeg、bmp、doc、docx、pdf、xls、xlsx、ppt.pptx、txt、zip、gzip、rar、mp4、mov</div>
         </template>
     </div>

+ 4 - 4
src/views/training/models/meeting-custom.vue

@@ -126,14 +126,14 @@
                         <el-input ref="titleInput" class="pd-5 no-disabled-input" v-show="showtitle" v-model="field.label" :placeholder="'请输入标题'" style="width: 340px;font-size: 16px;" clearable @blur="showtitle = false" />
                     </div>
                 </el-form-item>
-                <ImageUpload v-if="!field.name.includes('pic2')" v-model="field.defValue" :limit="1" isString class="pl-5 noup"></ImageUpload>
+                <ImageUpload v-if="!field.name.includes('pic2')" v-model="field.defValue" :limit="1" isString class="pl-5 noup" :isShowTip="false"></ImageUpload>
                 <el-form-item prop="defValue" v-if="field.name.includes('pic2')">
                     <div>
-                        <ImageUpload v-model="field.defValue" :limit="3" isString class="pl-5 up"></ImageUpload>
+                        <ImageUpload v-model="field.defValue" :limit="3" isString class="pl-5 up" :isShowTip="false" :isShowPrompt="true"></ImageUpload>
                     </div>
                 </el-form-item>
-                <div class="f-s-12 c-999 pl-5">参会者点击可上传文件/图片</div>
-                <div class="f-s-12 c-999 pl-5">单个图片/文件大小不超过100MB;</div>
+                <div class="f-s-12 c-333 pl-5 pt-15" v-if="!field.name.includes('pic2')">参会者点击可上传文件/图片</div>
+                <div class="f-s-12 c-999 pl-5">单个图片/文件大小不超过10MB;</div>
                 <div class="f-s-12 c-999 pl-5">支持格式:gif、png、jpg、jpeg、bmp、doc、docx、pdf、xls、xlsx、ppt.pptx、txt、zip、gzip、rar、mp4、mov</div>
             </template>
         </el-form>

+ 4 - 4
src/views/training/models/meeting-detail-attend.vue

@@ -12,7 +12,7 @@
                                 <span v-if="+item.check">
                                     所有
                                     <span class="f-w-6">
-                                        {{ selectDictLabels(vip_level,item.vipLevel,',') }}
+                                        {{ selectDictLabels(lm_check_join_type,item.vipLevel,',') }}
                                     </span>
                                     参会人数 ≤
                                     {{ item.total}}
@@ -25,7 +25,7 @@
                             <div class="d-flex a-c pd-5">
                                 <span v-if="+item.check">
                                     <span class="f-w-6">
-                                        {{ selectDictLabels(vip_level,
+                                        {{ selectDictLabels(lm_check_join_type,
                                     item.vipLevel,
                                     ',') }}
                                     </span>
@@ -73,7 +73,7 @@
             <vxe-column title="盟员等级" field="vipLevel" min-width="100" :formatter="colNoData" align="center">
                 <template #default="{ row }">
                     <div class="d-flex a-c j-c">
-                        <DictTag :options="vip_level" :value="row?.signupStatusForPc"></DictTag>
+                        <DictTag :options="lm_check_join_type" :value="row?.signupStatusForPc"></DictTag>
                     </div>
                 </template>
             </vxe-column>
@@ -140,7 +140,7 @@ import { colNoData } from '@/utils/noData';
 import registrationInfo from './registration-info.vue';
 import { debounce } from 'lodash';
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { cpy_res_status, dm_training_signup_status_list, vip_level } = toRefs<any>(proxy?.useDict('cpy_res_status', 'dm_training_signup_status_list', 'vip_level'));
+const { cpy_res_status, dm_training_signup_status_list, lm_check_join_type } = toRefs<any>(proxy?.useDict('cpy_res_status', 'dm_training_signup_status_list', 'lm_check_join_type'));
 // 获取详情
 const props = defineProps({
     form: {