lisy 6 mesiacov pred
rodič
commit
49f378cfea

+ 168 - 16
src/views/training/meeting-add/index.vue

@@ -22,14 +22,26 @@
                             </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:ss" 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:ss" 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:ss" 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 dm_training_join_type" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
+                                        <el-radio v-for="item in dm_training_join_type" :key="item.value"
+                                            :label="item.value">{{ item.label }}</el-radio>
                                     </el-radio-group>
                                 </el-form-item>
                             </el-col>
@@ -40,7 +52,8 @@
                             </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">
@@ -48,11 +61,104 @@
                                     <el-input v-model="form.tel" maxlength="20" placeholder="请输入联系电话" clearable />
                                 </el-form-item>
                             </el-col>
+                            <el-col :span="6">
+                                <el-form-item label="报名人数" prop="registrantsNumber">
+                                    <div class="d-flex a-c"><el-radio-group v-model="form.conditions.totalCheck"
+                                            style="flex-wrap: nowrap">
+                                            <el-radio label="0">不限制</el-radio>
+                                            <el-radio label="1">限制</el-radio>
+                                        </el-radio-group>
+                                        <el-input class="pl-10" v-model="form.conditions.total" maxlength="20"
+                                            placeholder="请输入报名人数" clearable
+                                            :disabled="form.conditions.totalCheck !== '1'" />
+                                    </div>
+
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item label="限制条件" prop="restrictiveConditions">
+                                    <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">
+                                                        <el-checkbox v-model="item.check" true-value="1" false-value="0"
+                                                            :label="'所有' + selectDictLabels(vip_level, item.vipLevel, ',') + '参会人数≤'"
+                                                            size="large" /><el-input class="pl-10" v-model="item.total"
+                                                            maxlength="20" placeholder="请输入报名人数" clearable
+                                                            :disabled="!+item.check" />
+                                                    </div>
+                                                </template>
+                                            </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" /><el-input
+                                                            class="pl-10" v-model="item.total" maxlength="20"
+                                                            placeholder="请输入报名人数" clearable :disabled="!+item.check" />
+                                                    </div>
+                                                </template>
+
+                                            </div>
+                                        </div>
+                                    </div>
+                                    <div class="d-flex border">
+                                        <div v-if="form.conditions.levelTotalCheck == '1' && form.conditions.cpyTotalCheck == '1'"
+                                            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" /><el-input
+                                                        class="pl-10" v-model="item.total" maxlength="20"
+                                                        placeholder="请输入报名人数" clearable :disabled="!+item.check" />
+                                                </div>
+                                            </template>
+                                        </div>
+                                        <div v-if="form.conditions.levelTotalCheck == '1' && form.conditions.cpyTotalCheck == '1'"
+                                            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" /><el-input
+                                                        class="pl-10" v-model="item.total" maxlength="20"
+                                                        placeholder="请输入报名人数" clearable :disabled="!+item.check" />
+                                                </div>
+                                            </template>
+                                        </div>
+                                    </div>
+                                </el-form-item>
+                            </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-row>
                         <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">
@@ -72,7 +178,8 @@
                             </el-col>
                             <el-col :span="12">
                                 <el-form-item label="相关文件" prop="attachments">
-                                    <FileUpload v-model="form.attachments" format="array" :limit="20" :fileSize="100"></FileUpload>
+                                    <FileUpload v-model="form.attachments" format="array" :limit="20" :fileSize="100">
+                                    </FileUpload>
                                 </el-form-item>
                             </el-col>
                         </el-row>
@@ -82,7 +189,8 @@
                         <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 v-for="item in yes_no" :key="item.value" :label="item.value">{{ item.label
+                                        }}</el-radio>
                                 </el-radio-group>
                             </el-form-item>
                             <div v-if="+form.certFlag" class="ml-20">
@@ -93,14 +201,17 @@
                             <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-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 dm_training_cert" :key="item.value" :label="item.label" :value="item.value" />
+                                                <el-option v-for="item in dm_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' }]">
+                                        <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>
@@ -132,12 +243,43 @@ import { ref, reactive, onMounted } from 'vue';
 import { debounce } from 'lodash';
 import { useRouter } from 'vue-router';
 import { trainingAdd, trainingDetail, trainingUpdate } from '@/api/training';
+import { checkPermi } from '@/utils/permission';
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { dm_training_join_type, yes_no, dm_training_cert } = toRefs<any>(proxy?.useDict('dm_training_join_type', 'yes_no', 'dm_training_cert'));
+const { dm_training_join_type, yes_no, dm_training_cert, vip_level } = toRefs<any>(proxy?.useDict('dm_training_join_type', 'yes_no', 'dm_training_cert', 'vip_level'));
 const router = useRouter();
 const route = useRoute();
 const form = ref<any>({
-    id: undefined
+    id: undefined,
+    conditions: {
+        levelTotalCheck: '0',
+        cpyTotalCheck: '0',
+        levelCheck: [{
+            vipLevel: '1',
+            check: "0",
+            total: ''
+        }, {
+            vipLevel: '3',
+            check: "0",
+            total: ''
+        }, {
+            vipLevel: '5',
+            check: "0",
+            total: ''
+        }],
+        cpyCheck: [{
+            vipLevel: '1',
+            check: "0",
+            total: ''
+        }, {
+            vipLevel: '3',
+            check: "0",
+            total: ''
+        }, {
+            vipLevel: '5',
+            check: "0",
+            total: ''
+        }]
+    }
 });
 const rules = reactive({
     // 自动生成全部
@@ -148,20 +290,23 @@ const rules = reactive({
     certFlag: [{ required: true, message: '请选择是否颁发证书', trigger: 'change' }],
     certificateInfo: [{ required: true, message: '请选择证书名称', trigger: 'change' }],
     description: [{ required: true, message: '请输入培训详情', trigger: 'blur' }],
-    coverImg: [{ required: true, message: '请上传封面图', trigger: 'change' }],
-    trainingImg: [{ required: true, message: '请上传会议图', trigger: 'change' }],
+    // coverImg: [{ required: true, message: '请上传封面图', trigger: 'change' }],
+    // trainingImg: [{ required: true, message: '请上传会议图', trigger: 'change' }],
     contactName: [{ required: true, message: '请输入会议联系人', trigger: 'blur' }],
     tel: [{ required: true, message: '请输入联系电话', trigger: 'blur' }],
 });
 const formRef = ref();
-
+const levelTotalCheck = ref("0")
+const cpyTotalCheck = ref("0")
 const save = debounce(async () => {
     await formRef.value.validate();
     const params = {
         ...form.value,
         trainingStart: form.value.trainingTime ? form.value.trainingTime[0] : undefined,
         trainingEnd: form.value.trainingTime ? form.value.trainingTime[1] : undefined,
-        certificateInfo: +form.value.certFlag ? form.value.certificateInfo : 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,
     };
     const res = form.value.id ? await trainingUpdate(params) : await trainingAdd(params);
     if (res && res.code === 200) {
@@ -190,11 +335,18 @@ const getMeetingDetail = async () => {
         if (!res || res.code !== 200) return;
         form.value = {
             ...res.data,
-            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
         };
+
     }
 };
 onMounted(() => {
     getMeetingDetail();
 });
 </script>
+<style scoped>
+.border {
+    border: 1px solid #dcdfe6;
+}
+</style>

+ 38 - 106
src/views/training/meeting-detail/index.vue

@@ -1,7 +1,7 @@
 <template>
     <div class="p-3">
         <div class="bg-fff flex1 ov-hd d-flex flex-cln">
-            <div class="d-flex a-c pd-16 border-bottom">
+            <div class="d-flex a-c pd-16">
                 <div class="f-s-20 c-333 f-w-7 mr-10">会议详情</div>
                 <el-button @click="router.go(-1)" type="primary" text>
                     <el-icon>
@@ -10,126 +10,36 @@
                     返回上一级
                 </el-button>
             </div>
-            <div class="flex1 over-auto">
-                <div class="pd-16 ov-hd">
-                    <el-descriptions :column="4">
-                        <el-descriptions-item label="会议名称:">{{ form?.trainingName || '-' }}</el-descriptions-item>
-                        <el-descriptions-item label="培训时间:">{{ form?.trainingStart }}~{{ form?.trainingEnd }}</el-descriptions-item>
-                        <el-descriptions-item label="培训方式:">{{ selectDictLabel(dm_training_join_type, form?.joinType) || '-' }}</el-descriptions-item>
-                        <el-descriptions-item label="培训地点:">{{ form?.trainingLocation || '-' }}</el-descriptions-item>
-                        <el-descriptions-item label="联系人:">{{ form?.contactName || '-' }}</el-descriptions-item>
-                        <el-descriptions-item label="联系电话:">{{ form?.tel || '-' }}</el-descriptions-item>
-                        <el-descriptions-item label="创建人:">{{ form?.createByName || '-' }}</el-descriptions-item>
-                        <el-descriptions-item label="创建时间:">{{ form?.createTime || '-' }}</el-descriptions-item>
-                    </el-descriptions>
-                    <div class="d-flex f-s-14 c-666 mb-10">
-                        <div class="flex1">
-                            <div class="c-333 mb-10">培训详情:</div>
-                            <div>{{ form?.description || '-' }}</div>
-                        </div>
-                        <div class="flex1">
-                            <div class="c-333 mb-10">与会须知:</div>
-                            <div>{{ form?.notice || '-' }}</div>
-                        </div>
-                        <div v-if="form?.attachments" class="flex1">
-                            <div class="c-333 mb-10">相关文件:</div>
-                            <FileLook v-model="form.attachments" :span="12"></FileLook>
-                        </div>
-                    </div>
-                    <div class="d-flex f-s-14 c-666">
-                        <div class="flex1">
-                            <div class="c-333 mb-10">封面图:</div>
-                            <div>
-                                <ImagePreview :src="form?.coverImgUrl" :width="100"></ImagePreview>
-                            </div>
-                        </div>
-                        <div v-if="form?.attachments" class="flex1">
-                            <div class="c-333 mb-10">会议图:</div>
-                            <div class="d-flex flex-wrap">
-                                <template v-for="(item, index) in form?.trainingImg" :key="index">
-                                    <div class="mr-10 mb-10">
-                                        <ImagePreview :src="item" :width="100"></ImagePreview>
-                                    </div>
-                                </template>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="f-s-14">
-                        <div class="c-333 mb-10">是否颁发证书: {{ +form?.certFlag ? '是' : '否' }}</div>
-                        <vxe-table v-if="+form?.certFlag" border :data="form?.certificateInfo" min-height="0">
-                            <!-- 序号 -->
-                            <vxe-column type="seq" width="60" title="序号" align="center" />
-                            <vxe-column title="证书名称" min-width="100">
-                                <template #default="{ row }">
-                                    <DictTag :options="dm_training_cert" :value="row?.certType"></DictTag>
-                                </template>
-                            </vxe-column>
-                            <vxe-column title="证书模板">
-                                <template #default="{ row }">
-                                    <ImagePreview :src="row?.certImgUrl" :width="100"></ImagePreview>
-                                </template>
-                            </vxe-column>
-                        </vxe-table>
-                    </div>
-                    <el-divider />
-                    <div class="d-flex mb-16">
-                        <div class="info-title ">
-                            <span>参会人员信息</span>
-                            <span class="f-s-14 c-666">(报名:{{ form?.joinCount }}人 | 签到:{{ form?.signCount }}人 | 领取证书:{{ form?.certCount }}人)</span>
-                        </div>
-                    </div>
-                    <div>
-                        <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="auto">
-                            <el-form-item label="姓名:" prop="name">
-                                <el-input v-model="queryParams.name" placeholder="请输入姓名" clearable style="width: 180px" />
-                            </el-form-item>
-                            <el-form-item label="企业名称:" prop="company">
-                                <el-input v-model="queryParams.company" placeholder="请输入企业名称" clearable style="width: 180px" />
-                            </el-form-item>
-                            <el-form-item label="参会状态:" prop="signupStatus">
-                                <el-select v-model="queryParams.signupStatus" placeholder="请选择参会状态" clearable style="width: 180px">
-                                    <el-option v-for="item in dm_training_signup_status_list" :key="item.value" :label="item.label" :value="item.value" />
-                                </el-select>
-                            </el-form-item>
-                            <el-form-item>
-                                <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-                                <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-                            </el-form-item>
-                        </el-form>
-                    </div>
-                    <vxe-table :loading="loading" border :data="list" min-height="0">
-                        <!-- 序号 -->
-                        <vxe-column type="seq" width="60" title="序号" align="center" />
-                        <vxe-column title="企业名称" field="company" min-width="100" :formatter="colNoData" />
-                        <vxe-column title="姓名" field="name" min-width="100" :formatter="colNoData" />
-                        <vxe-column title="职务" field="position" min-width="100" :formatter="colNoData" />
-                        <vxe-column title="联系方式" field="contact" min-width="100" :formatter="colNoData" />
-                        <vxe-column title="备注" field="remark" min-width="100" :formatter="colNoData" />
-                        <vxe-column title="报名时间" align="center" field="createTime" min-width="100" :formatter="colNoData" />
-                        <vxe-column title="参会状态" min-width="100" fixed="right">
-                            <template #default="{ row }">
-                                <DictTag :options="dm_training_signup_status_list" :value="row?.signupStatusForPc"></DictTag>
-                            </template>
-                        </vxe-column>
-                    </vxe-table>
-                    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+            <div class="border-botttom pl-20">
+                <div class="d-flex">
+                    <template v-for="(item, index) in tabs" :key="index">
+                        <div class="tabs-item" @click="() => { activeName = item.value }"
+                            :class="{ checked: activeName === item.value }">{{ item.label }}</div>
+                    </template>
                 </div>
             </div>
+            <MeetingDetailInfo v-if="activeName === '1'" :form="form" />
+            <MeetingDetailAttend v-if="activeName === '2'" :form="form" />
         </div>
     </div>
 </template>
 
 <script setup name="meeting-detail" lang="ts">
 import { ref, reactive, onMounted } from 'vue';
-import { debounce } from 'lodash';
+import { MeetingDetailInfo } from '../models';
 import router from '@/router';
 import { trainingDetailById, trainingMembers } from '@/api/training';
 import { FileLook } from '@/views/models';
 import { colNoData } from '@/utils/noData';
+import MeetingDetailAttend from '../models/meeting-detail-attend.vue'
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { dm_training_join_type, yes_no, dm_training_cert, dm_training_status, dm_training_signup_status_list } = toRefs<any>(proxy?.useDict('dm_training_join_type', 'yes_no', 'dm_training_cert', 'dm_training_status', 'dm_training_signup_status_list'));
 // 获取详情
-
+const tabs = ref([
+    { label: '会议信息', value: '1' },
+    { label: '参会人员信息', value: '2' },
+])
+const activeName = ref('1');
 const form = ref<any>(null);
 const query = useRoute().query;
 const getDetail = async () => {
@@ -170,3 +80,25 @@ onMounted(() => {
     getList();
 });
 </script>
+<style scoped lang="scss">
+.tabs-item {
+    margin-right: 20px;
+    padding: 8px 20px;
+    font-size: 14px;
+    border-color: #d7d7d7;
+    border-style: solid;
+    border-width: 1px 1px 0 1px;
+    cursor: pointer;
+    user-select: none;
+
+    &.checked {
+        color: #fff;
+        border-color: var(--el-color-primary);
+        background-color: var(--el-color-primary);
+    }
+}
+
+.border-botttom {
+    border-bottom: 1px solid #d7d7d7;
+}
+</style>

+ 3 - 1
src/views/training/models/index.ts

@@ -1 +1,3 @@
-export { default as SignInCode } from './sign-in-code.vue'; // 查看签到码
+export { default as SignInCode } from './sign-in-code.vue'; // 查看签到码
+export { default as MeetingDetailInfo } from './meeting-detail-info.vue';
+export { default as MeetingDetailattend } from './meeting-detail-attend.vue';

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

@@ -0,0 +1,169 @@
+<template>
+    <div class="pd-16">
+        <div class="d-flex mb-16 flex-cln">
+            <div class="info-title">
+                报名限制条件
+            </div>
+            <div class="bg-#fafafa pd-20" v-if="form?.conditions?.totalCheck == '0' || !form?.conditions?.totalCheck">无
+            </div>
+            <div class="bg-#fafafa pd-20 d-flex" v-else>
+                <div> <template v-for="(item, index) in form?.conditions?.levelCheck" :key="index">
+                        <div class="d-flex a-c pd-5">
+                            <span v-if="+item.check">所有<span class="f-w-6">{{ selectDictLabels(vip_level, item.vipLevel,
+                                ',') }}</span>参会人数 ≤ {{ item.total
+                                    }}</span>
+                        </div>
+                    </template></div>
+                <div> <template v-for="(item, index) in form?.conditions?.cpyCheck" :key="index">
+                        <div class="d-flex a-c pd-5">
+                            <span v-if="+item.check"><span class="f-w-6">{{ selectDictLabels(vip_level, item.vipLevel,
+                                ',') }}</span>限制每家单位人数≤{{ item.total
+                                    }}</span>
+                        </div>
+                    </template></div>
+            </div>
+        </div>
+        <div class="d-flex mb-16 ">
+            <div class="info-title">
+                <span>参会人员信息</span>
+                <span class="f-s-14 c-666">(报名:{{ form?.joinCount }}人 | 签到:{{ form?.signCount }}人 | 领取证书:{{
+                    form?.certCount }}人)</span>
+            </div>
+        </div>
+
+
+        <div class="d-flex a-c j-sb">
+            <searchTabs v-model="queryParams.res" @change="handleQuery" :list="tabs" key-label="name" key-count="num"
+                key-value="type"></searchTabs>
+
+            <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="auto">
+                <el-form-item label="姓名:" prop="name">
+                    <el-input v-model="queryParams.name" placeholder="请输入姓名" clearable style="width: 180px" />
+                </el-form-item>
+                <el-form-item label="企业名称:" prop="company">
+                    <el-input v-model="queryParams.company" placeholder="请输入企业名称" clearable style="width: 180px" />
+                </el-form-item>
+                <el-form-item label="参会状态:" prop="signupStatus">
+                    <el-select v-model="queryParams.signupStatus" placeholder="请选择参会状态" clearable style="width: 180px">
+                        <el-option v-for="item in dm_training_signup_status_list" :key="item.value" :label="item.label"
+                            :value="item.value" />
+                    </el-select>
+                </el-form-item>
+                <el-form-item>
+                    <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+                    <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+                </el-form-item>
+            </el-form>
+        </div>
+        <vxe-table :loading="loading" border :data="list" min-height="0">
+            <!-- 序号 -->
+            <vxe-column type="seq" width="60" title="序号" align="center" />
+            <vxe-column title="企业名称" field="company" min-width="100" :formatter="colNoData" />
+            <vxe-column title="姓名" field="name" min-width="100" :formatter="colNoData" />
+            <vxe-column title="职务" field="position" min-width="100" :formatter="colNoData" />
+            <vxe-column title="联系方式" field="contact" min-width="100" :formatter="colNoData" />
+            <vxe-column title="备注" field="remark" min-width="100" :formatter="colNoData" />
+            <vxe-column title="报名时间" align="center" field="createTime" min-width="100" :formatter="colNoData" />
+            <vxe-column title="参会状态" min-width="100" fixed="right">
+                <template #default="{ row }">
+                    <DictTag :options="dm_training_signup_status_list" :value="row?.signupStatusForPc">
+                    </DictTag>
+                </template>
+            </vxe-column>
+            <vxe-column title="审核状态" min-width="100" fixed="right">
+                <template #default="{ row }">
+                    <DictTag :options="cpy_res_status" :value="row?.res">
+                    </DictTag>
+                </template>
+            </vxe-column>
+            <vxe-column title="操作" width="250" align="center" fixed="right">
+                <template #default="{ row }">
+                    <el-button type="text" size="small"> 通过</el-button>
+                    <el-button size="small" type="danger">不通过 </el-button>
+                </template>
+            </vxe-column>
+        </vxe-table>
+
+        <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
+            v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </div>
+
+</template>
+<script setup name="MeetingDetailInfo" lang="ts">
+import { ref, reactive, onMounted } from 'vue';
+import { trainingDetailById, trainingMembers } from '@/api/training';
+import { searchTabs } from '@/views/models';
+import { colNoData } from '@/utils/noData';
+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 props = defineProps({
+    form: {
+        type: Object,
+        default: () => ({})
+    },
+});
+
+
+const query = useRoute().query;
+// const getDetail = async () => {
+//     const res = await trainingDetailById(query?.id as string);
+//     if (res.code === 200) {
+//         form.value = res.data;
+//     } else {
+//         ElMessage.error(res.msg);
+//     }
+// };
+const queryParams = ref<any>({
+    pageNum: 1,
+    pageSize: 10,
+    trainingId: query?.id || ''
+});
+const loading = ref(false);
+const total = ref(0);
+const list = ref<any>([]);
+const tabs = ref([]);
+const getList = async () => {
+    loading.value = true;
+    const res = await trainingMembers(queryParams.value);
+    if (!res || res.code !== 200) return;
+    list.value = res.rows;
+    total.value = res.total;
+    loading.value = false;
+};
+const handleQuery = () => {
+    queryParams.value.pageNum = 1;
+    getList();
+};
+const queryFormRef = ref<ElFormInstance>();
+const resetQuery = () => {
+    queryFormRef.value?.resetFields();
+    handleQuery();
+};
+onMounted(() => {
+    // getDetail();
+    getList();
+});
+</script>
+<style scoped lang="scss">
+.tabs-item {
+    margin-right: 20px;
+    padding: 8px 20px;
+    font-size: 14px;
+    border-color: #d7d7d7;
+    border-style: solid;
+    border-width: 1px 1px 0 1px;
+    cursor: pointer;
+    user-select: none;
+
+    &.checked {
+        color: #fff;
+        border-color: var(--el-color-primary);
+        background-color: var(--el-color-primary);
+    }
+}
+
+.border-botttom {
+    border-bottom: 1px solid #d7d7d7;
+}
+</style>

+ 116 - 0
src/views/training/models/meeting-detail-info.vue

@@ -0,0 +1,116 @@
+<template>
+    <div class="flex1 over-auto">
+        <div class="pd-16 ov-hd">
+            <div><span class="c-primary">|</span> 会议基本信息</div>
+            <el-descriptions :column="4">
+                <el-descriptions-item label="会议名称:">{{ form?.trainingName || '-' }}</el-descriptions-item>
+                <el-descriptions-item label="培训时间:">{{ form?.trainingStart }}~{{ form?.trainingEnd
+                    }}</el-descriptions-item>
+                <el-descriptions-item label="报名时间:">{{ form?.signupStart }}~{{ form?.signupEnd
+                    }}</el-descriptions-item>
+                <el-descriptions-item label="培训方式:">{{ selectDictLabel(dm_training_join_type, form?.joinType) ||
+                    '-'
+                    }}</el-descriptions-item>
+                <el-descriptions-item label="培训地点:">{{ form?.trainingLocation || '-' }}</el-descriptions-item>
+                <el-descriptions-item label="联系人:">{{ form?.contactName || '-' }}</el-descriptions-item>
+                <el-descriptions-item label="联系电话:">{{ form?.tel || '-' }}</el-descriptions-item>
+                <el-descriptions-item label="报名人数:" v-if="form?.conditions.totalCheck
+                    == '1'">限制 {{
+                        form?.conditions.total }}</el-descriptions-item>
+                <el-descriptions-item label="报名人数:" v-else> 不限制</el-descriptions-item>
+                <el-descriptions-item label="限制条件:" v-if="form?.conditions">{{ form?.conditions?.levelTotalCheck == '1'
+                    ?
+                    '按盟员单位等级限制' : '' }} {{
+                        form.conditions.cpyTotalCheck == '1'
+                            ? '按每家企业人数限制' : '' }}</el-descriptions-item>
+                <el-descriptions-item label="是否电子手签:">{{ form?.eleSignature == '1' ? "是" : '否' }}</el-descriptions-item>
+                <el-descriptions-item label="创建人:">{{ form?.createByName || '-' }}</el-descriptions-item>
+                <el-descriptions-item label="创建时间:">{{ form?.createTime || '-' }}</el-descriptions-item>
+            </el-descriptions>
+            <div class="d-flex f-s-14 c-666 mb-10">
+                <div class="flex1">
+                    <div class="c-333 mb-10">培训详情:</div>
+                    <div>{{ form?.description || '-' }}</div>
+                </div>
+                <div class="flex1">
+                    <div class="c-333 mb-10">与会须知:</div>
+                    <div>{{ form?.notice || '-' }}</div>
+                </div>
+                <div v-if="form?.attachments" class="flex1">
+                    <div class="c-333 mb-10">相关文件:</div>
+                    <FileLook v-model="form.attachments" :span="12"></FileLook>
+                </div>
+            </div>
+            <div class="d-flex f-s-14 c-666">
+                <div class="flex1">
+                    <div class="c-333 mb-10">封面图:</div>
+                    <div>
+                        <ImagePreview :src="form?.coverImgUrl" :width="100"></ImagePreview>
+                    </div>
+                </div>
+                <div v-if="form?.attachments" class="flex1">
+                    <div class="c-333 mb-10">会议图:</div>
+                    <div class="d-flex flex-wrap">
+                        <template v-for="(item, index) in form?.trainingImg" :key="index">
+                            <div class="mr-10 mb-10">
+                                <ImagePreview :src="item" :width="100"></ImagePreview>
+                            </div>
+                        </template>
+                    </div>
+                </div>
+            </div>
+            <div class="f-s-14">
+                <div class="c-333 mb-10">是否颁发证书: {{ +form?.certFlag ? '是' : '否' }}</div>
+                <vxe-table v-if="+form?.certFlag" border :data="form?.certificateInfo" min-height="0">
+                    <!-- 序号 -->
+                    <vxe-column type="seq" width="60" title="序号" align="center" />
+                    <vxe-column title="证书名称" min-width="100">
+                        <template #default="{ row }">
+                            <DictTag :options="dm_training_cert" :value="row?.certType"></DictTag>
+                        </template>
+                    </vxe-column>
+                    <vxe-column title="证书模板">
+                        <template #default="{ row }">
+                            <ImagePreview :src="row?.certImgUrl" :width="100"></ImagePreview>
+                        </template>
+                    </vxe-column>
+                </vxe-table>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script setup name="MeetingDetailInfo" lang="ts">
+import { FileLook } from '@/views/models';
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { dm_training_join_type, yes_no, dm_training_cert, dm_training_status, dm_training_signup_status_list } = toRefs<any>(proxy?.useDict('dm_training_join_type', 'yes_no', 'dm_training_cert', 'dm_training_status', 'dm_training_signup_status_list'));
+const props = defineProps({
+    form: {
+        type: Object,
+        default: () => ({})
+    },
+});
+
+</script>
+<style scoped lang="scss">
+.tabs-item {
+    margin-right: 20px;
+    padding: 8px 20px;
+    font-size: 14px;
+    border-color: #d7d7d7;
+    border-style: solid;
+    border-width: 1px 1px 0 1px;
+    cursor: pointer;
+    user-select: none;
+
+    &.checked {
+        color: #fff;
+        border-color: var(--el-color-primary);
+        background-color: var(--el-color-primary);
+    }
+}
+
+.border-botttom {
+    border-bottom: 1px solid #d7d7d7;
+}
+</style>