huangxw há 6 meses atrás
pai
commit
16122d5aa1

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

@@ -13,10 +13,11 @@
             <div class="flex1 over-auto">
                 <el-form ref="formRef" label-width="auto" label-position="top" :model="form" :rules="rules">
                     <div class="pd-16 border-bottom ov-hd">
+                        <div class="info-title mb-10">会议信息</div>
                         <el-row :gutter="20">
                             <el-col :span="6">
                                 <el-form-item label="会议名称" prop="trainingName">
-                                    <el-input v-model="form.trainingName" maxlength="100" placeholder="请输入会议名称" clearable />
+                                    <el-input v-model="form.trainingName" placeholder="请输入会议名称" clearable />
                                 </el-form-item>
                             </el-col>
                             <el-col :span="6">
@@ -38,24 +39,25 @@
                                 </el-form-item>
                             </el-col>
                             <el-col :span="6">
-                                <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-group>
+                                <el-form-item label="会议联系人" prop="contactName">
+                                    <el-input v-model="form.contactName" maxlength="40" placeholder="请输入会议联系人" clearable />
                                 </el-form-item>
                             </el-col>
-                            <el-col v-if="+form?.certFlag" :span="6">
-                                <el-form-item label="证书名称" prop="certificateInfo">
-                                    <el-select v-model="form.certificateInfo" multiple placeholder="证书名称" clearable>
-                                        <el-option v-for="item in lm_training_cert" :key="item.value" :label="item.label" :value="item.value" />
-                                    </el-select>
+                            <el-col :span="6">
+                                <el-form-item label="联系电话" prop="tel">
+                                    <el-input v-model="form.tel" maxlength="20" placeholder="请输入联系电话" clearable />
                                 </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" maxlength="300" placeholder="请输入培训详情" />
+                                    <el-input v-model="form.description" :rows="4" type="textarea" placeholder="请输入培训详情" />
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item label="与会须知" prop="description">
+                                    <el-input v-model="form.notice" :rows="4" type="textarea" placeholder="请输入与会须知" />
                                 </el-form-item>
                             </el-col>
                             <el-col :span="12">
@@ -75,6 +77,46 @@
                             </el-col>
                         </el-row>
                     </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 }}</el-radio>
+                                </el-radio-group>
+                            </el-form-item>
+                            <div v-if="+form.certFlag" class="ml-20">
+                                <el-button @click="addCertInfo">新增证书</el-button>
+                            </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 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' }]">
+                                            <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>
+                    </div>
                 </el-form>
             </div>
             <div class="d-flex a-c j-c pd-16">
@@ -91,7 +133,7 @@ import { debounce } from 'lodash';
 import { useRouter } from 'vue-router';
 import { trainingAdd, trainingDetail, trainingUpdate } from '@/api/training';
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { dm_training_join_type, yes_no, lm_training_cert } = toRefs<any>(proxy?.useDict('dm_training_join_type', 'yes_no', 'lm_training_cert'));
+const { dm_training_join_type, yes_no, dm_training_cert } = toRefs<any>(proxy?.useDict('dm_training_join_type', 'yes_no', 'dm_training_cert'));
 const router = useRouter();
 const route = useRoute();
 const form = ref<any>({
@@ -108,22 +150,39 @@ const rules = reactive({
     description: [{ required: true, message: '请输入培训详情', trigger: 'blur' }],
     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 save = debounce(async () => {
     await formRef.value.validate();
-    console.log('form.value', form.value);
     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
     };
     const res = form.value.id ? await trainingUpdate(params) : await trainingAdd(params);
     if (res && res.code === 200) {
         router.go(-1);
     }
 }, 500);
+const goEditor = () => {
+    window.open('https://lm.yujin.shuziyunyao.com/poster#/editor', '_blank');
+}
+const addCertInfo = () => {
+    if (!form.value.certificateInfo) {
+        form.value.certificateInfo = [];
+    }
+    form.value.certificateInfo.push({
+        certName: undefined,
+        certImg: undefined
+    });
+};
+const deleteItem = (index: number) => {
+    form.value.certificateInfo.splice(index, 1);
+};
 // 获取专家详情
 const getMeetingDetail = async () => {
     if (route.query?.id) {
@@ -131,7 +190,7 @@ 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
         };
     }
 };

+ 24 - 4
src/views/training/meeting-detail/index.vue

@@ -17,22 +17,25 @@
                         <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="是否颁发证书:">{{ selectDictLabel(dm_training_join_type, form?.certFlag) || '-' }}</el-descriptions-item>
-                        <el-descriptions-item label="证书名称:">{{ selectDictLabels(dm_training_cert, form?.certificateInfo, ',') }}</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">
+                    <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>
-                    <el-divider />
                     <div class="d-flex f-s-14 c-666">
                         <div class="flex1">
                             <div class="c-333 mb-10">封面图:</div>
@@ -51,6 +54,23 @@
                             </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 ">

+ 5 - 5
src/views/training/meeting/index.vue

@@ -32,7 +32,7 @@
                     <div>
                         <searchTabs v-model="queryParams.status" @change="handleQuery" :list="tabs" key-label="name" key-count="num" key-value="type"></searchTabs>
                     </div>
-                    <el-button type="primary" @click="router.push({ path: 'lmmeetingadd' })">新增会议</el-button>
+                    <el-button type="primary" @click="router.push({ path: 'meeting-add' })">新增会议</el-button>
                 </div>
                 <div class="flex1 ov-hd">
                     <vxe-table :loading="loading" border :data="dataList" min-height="0" max-height="100%">
@@ -57,7 +57,7 @@
                         <vxe-column field="certCount" title="领取证书人数" width="80" />
                         <vxe-column title="创建人" align="center" field="createByName" width="80" :formatter="colNoData" />
                         <vxe-column title="创建时间" align="center" field="createTime" min-width="100" :formatter="colNoData" />
-                        <vxe-column field="trainingStatus" title="会议状态" width="80">
+                        <vxe-column field="certFlag" title="会议状态" width="80">
                             <template #default="{ row }">
                                 <DictTag :options="dm_training_status" :value="row?.trainingStatus"></DictTag>
                             </template>
@@ -72,7 +72,7 @@
                                 <span></span>
                                 <el-button v-if="['1', '0'].includes(row?.trainingStatus)" @click="trainingSignIn(row)" style="color: #0079fe;" text>签到二维码</el-button>
                                 <span></span>
-                                <el-button @click="router.push({ path: 'lmmeetingdetail', query: { id: row?.id } })" style="color: #0079fe;" text>详情</el-button>
+                                <el-button @click="router.push({ path: 'meeting-detail', query: { id: row?.id } })" style="color: #0079fe;" text>详情</el-button>
                                 <span></span>
                                 <el-button text type="danger" @click="deleteRow(row)">删除</el-button>
                             </template>
@@ -83,7 +83,7 @@
             </div>
         </div>
     </div>
-    <SignInCode v-if="showSignIn" v-model:show="showSignIn" :info="rowInfo"></SignInCode>
+    <SignInCode v-if="showSignIn" v-model:show="showSignIn" :info="rowInfo" :dict="{ dm_training_join_type }"></SignInCode>
 </template>
 
 <script setup name="meeting" lang="ts">
@@ -162,7 +162,7 @@ const trainingOff = async (row: any) => {
 };
 /** 编辑会议 */
 const editRow = (row) => {
-    router.push({ path: 'lmmeetingadd', query: { id: row.id } });
+    router.push({ path: 'meeting-add', query: { id: row.id } });
 };
 
 /** 删除会议 */

+ 2 - 0
src/views/training/models/sign-in-code.vue

@@ -5,6 +5,8 @@
                 <div v-if="info" ref="codeImgRef" style="width: 400px; margin: 0 auto;">
                     <div class="mb-6 f-w-6 f-s-16 c-333">{{ info?.trainingName }}</div>
                     <div class="mb-6">培训时间:{{ info?.trainingStart  }}~{{ info?.trainingEnd }}</div>
+                    <div class="mb-6">培训方式:{{ selectDictLabel(dict.dm_training_join_type, info.joinType) }}</div>
+                    <div class="mb-6">联系电话:{{ info?.tel }}</div>
                     <div>签到二维码</div>
                     <div class="d-flex j-c a-c pd-20">
                         <vueQr :text="VITE_APP_SHARE_QR_CODE_URL + '/meeting-sign-in?meetid=' + info?.id" :size="300"></vueQr>