meeting-detail-info.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <template>
  2. <div class="flex1 over-auto">
  3. <div class="pd-16 ov-hd">
  4. <div class="info-title f-s-18 c-333 f-w-7 pb-10">会议基本信息</div>
  5. <el-descriptions :column="4">
  6. <el-descriptions-item min-width="100px" label="会议名称:">{{ form?.trainingName || '-' }}</el-descriptions-item>
  7. <el-descriptions-item min-width="100px" label="会议时间:">{{ form?.trainingStart }}~{{ form?.trainingEnd}}</el-descriptions-item>
  8. <el-descriptions-item min-width="100px" label="报名时间:">{{ form?.signupStart }}~{{ form?.signupEnd }}</el-descriptions-item>
  9. <el-descriptions-item min-width="100px" label="会议方式:">
  10. {{ selectDictLabel(dm_training_join_type, form?.joinType) || '-'}}
  11. </el-descriptions-item>
  12. <el-descriptions-item min-width="100px" label="会议地点:">{{ form?.trainingLocation || '-' }}</el-descriptions-item>
  13. <el-descriptions-item min-width="100px" label="联系人:">{{ form?.contactName || '-' }}</el-descriptions-item>
  14. <el-descriptions-item min-width="100px" label="联系电话:">{{ form?.tel || '-' }}</el-descriptions-item>
  15. <el-descriptions-item min-width="100px" label="可参会单位类型:">
  16. <template v-for="item,index in form.conditions.typeCheck" :key="index">
  17. <span class="pr-5" v-if="item.check =='1'">{{ selectDictLabel(lm_check_join_type, item?.vipLevel) || '-'}}</span>
  18. </template>
  19. </el-descriptions-item>
  20. <el-descriptions-item min-width="100px" label="报名人数:" v-if="form?.conditions.totalCheck == '1'">
  21. 限制{{form?.conditions.total }}
  22. </el-descriptions-item>
  23. <el-descriptions-item min-width="100px" label="报名人数:" v-else>不限制</el-descriptions-item>
  24. <el-descriptions-item min-width="100px" label="限制条件:" v-if="form?.conditions">
  25. {{ form?.conditions?.levelTotalCheck == '1'?'按单位类型限制' : '' }}
  26. {{form.conditions.cpyTotalCheck == '1'? '按每家企业人数限制' : '' }}
  27. <span v-if="form?.conditions?.levelTotalCheck !== '1' && form.conditions.cpyTotalCheck !== '1'">{{ '-' }}</span>
  28. </el-descriptions-item>
  29. <el-descriptions-item min-width="100px" label="是否电子手签:">{{ form?.eleSignature == '1' ? "是" : '否' }}</el-descriptions-item>
  30. <el-descriptions-item min-width="100px" label="是否发放积分:">{{ form?.pointsFlag == '1' ? "是" : '否' }}</el-descriptions-item>
  31. <el-descriptions-item min-width="100px" label="每成功参会(签到成功)1人发放积分数:" v-if="form?.pointsFlag == '1'">{{ form?.points || '-' }}</el-descriptions-item>
  32. <el-descriptions-item min-width="100px" label="创建人:">{{ form?.createByName || '-' }}</el-descriptions-item>
  33. <el-descriptions-item min-width="100px" label="创建时间:">{{ form?.createTime || '-' }}</el-descriptions-item>
  34. </el-descriptions>
  35. <div class="d-flex f-s-14 c-666 mb-10">
  36. <div class="flex1">
  37. <div class="c-333 mb-10">
  38. 会议详情:
  39. <span v-if="!form?.description">-</span>
  40. </div>
  41. <div v-if="form?.description">{{ form?.description || '-' }}</div>
  42. </div>
  43. <div v-if="form?.attachments" class="flex1">
  44. <div class="c-333 mb-10">
  45. 与会须知:
  46. <span v-if="!form?.notice">-</span>
  47. </div>
  48. <div v-if="form?.notice">{{ form?.notice || '-' }}</div>
  49. </div>
  50. </div>
  51. <div class="d-flex f-s-14 c-666 mb-10">
  52. <div class="flex1">
  53. <div class="c-333 mb-10">
  54. 会议备注:
  55. <span v-if="!form?.remark">-</span>
  56. </div>
  57. <div v-if="form?.remark">{{ form?.remark || '-' }}</div>
  58. </div>
  59. <div v-if="form?.attachments" class="flex1">
  60. <div class="c-333 mb-10">
  61. 相关文件:
  62. <span v-if="form?.attachments.length==0">-</span>
  63. </div>
  64. <FileLook v-if="form?.attachments.length!==0" v-model="form.attachments" :span="12"></FileLook>
  65. </div>
  66. </div>
  67. <div class="d-flex f-s-14 c-666">
  68. <div class="flex1">
  69. <div class="c-333 mb-10">
  70. 微信群聊二维码:
  71. <span v-if="!form?.wechatQrCodeUrl">-</span>
  72. </div>
  73. <div class="d-flex flex-wrap" v-if="form?.wechatQrCodeUrl ">
  74. <ImagePreview :src="form?.wechatQrCodeUrl " :width="100" :height="100"></ImagePreview>
  75. </div>
  76. </div>
  77. <div class="flex1">
  78. <div class="c-333 mb-10">
  79. 封面图:
  80. <span v-if="!form?.coverImgUrl">-</span>
  81. </div>
  82. <div v-if="form?.coverImgUrl">
  83. <ImagePreview :src="form?.coverImgUrl" :width="100" :height="100"></ImagePreview>
  84. </div>
  85. </div>
  86. <div class="flex1">
  87. <div class="c-333 mb-10">
  88. 会议图:
  89. <span v-if="form?.trainingImg.length == 0">-</span>
  90. </div>
  91. <div class="d-flex flex-wrap" v-if="form?.trainingImg.length !== 0">
  92. <template v-for="(item, index) in form?.trainingImg" :key="index">
  93. <div class="mr-10 mb-10">
  94. <ImagePreview :src="item" :width="100" :height="100"></ImagePreview>
  95. </div>
  96. </template>
  97. </div>
  98. </div>
  99. </div>
  100. <div class="f-s-14">
  101. <div class="c-333 mb-10">是否颁发证书: {{ +form?.certFlag ? '是' : '否' }}</div>
  102. <vxe-table v-if="+form?.certFlag" border :data="form?.certificateInfo" min-height="0">
  103. <!-- 序号 -->
  104. <vxe-column type="seq" width="60" title="序号" align="center" />
  105. <vxe-column title="证书名称" min-width="100">
  106. <template #default="{ row }">
  107. <DictTag :options="dm_training_cert" :value="row?.certType"></DictTag>
  108. </template>
  109. </vxe-column>
  110. <vxe-column title="证书模板">
  111. <template #default="{ row }">
  112. <ImagePreview :src="row?.certImgUrl" :width="100"></ImagePreview>
  113. </template>
  114. </vxe-column>
  115. </vxe-table>
  116. </div>
  117. <div class="f-s-14">
  118. <div class="c-333 mb-10">报名信息:</div>
  119. <div class="w-400 h-700 border over-auto">
  120. <div class="pd-10 border bg-#fafafa">
  121. <div class="pt-10 f-s-20 f-w-6 d-flex j-c a-c flex-cln ">报名信息</div>
  122. <div class="f-s-12 f-w-4 d-flex j-start c-red">此页面为意向人报名时所见页面:</div>
  123. </div>
  124. <template v-for="(item, index) in fixedField" :key="index">
  125. <div class="pd-15 border1 c-#D7D7D7 d-flex j-sb">
  126. <span class="c-#606266 f-s-16 f-w-6">{{ item.label }}</span>
  127. <span class="f-s-14">请输入</span>
  128. </div>
  129. </template>
  130. <template v-for="(field, index) in fields" :key="index">
  131. <div class="meeting-custom-wrapper">
  132. <meetingCustomPreview :field="field" style="pointer-events: none" v-if="field" />
  133. </div>
  134. </template>
  135. <div class="pd-15 border1 c-#D7D7D7 d-flex j-sb">
  136. <span class="c-#606266 f-s-16 f-w-6">备注</span>
  137. <span>请输入</span>
  138. </div>
  139. </div>
  140. </div>
  141. </div>
  142. </div>
  143. </template>
  144. <script setup name="MeetingDetailInfo" lang="ts">
  145. import { ref, onMounted } from 'vue';
  146. import { FileLook } from '@/views/models';
  147. import { FieldDefinition } from './type'
  148. import meetingCustomPreview from './meeting-custom-preview.vue'
  149. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  150. const { dm_training_join_type, lm_check_join_type, dm_training_cert, lm_training_status, dm_training_signup_status_list } = toRefs<any>(proxy?.useDict('dm_training_join_type', 'lm_check_join_type', 'dm_training_cert', 'lm_training_status', 'dm_training_signup_status_list'));
  151. const props = defineProps({
  152. form: {
  153. type: Object,
  154. default: () => ({})
  155. },
  156. });
  157. const fields = ref<FieldDefinition[]>([])
  158. const fixedField = ref<FieldDefinition[]>([{
  159. name: `ent-${generateSecureRandomString()}`,
  160. label: '企业名称', type: '1',
  161. required: '1', readonly: '0',
  162. }, {
  163. name: `name-${generateSecureRandomString()}`,
  164. label: '姓名', type: '1', readonly: '0',
  165. required: '1'
  166. }, {
  167. name: `pos-${generateSecureRandomString()}`,
  168. label: '职务', type: '1', readonly: '0',
  169. required: '1'
  170. }, {
  171. name: `Con-${generateSecureRandomString()}`,
  172. label: '联系方式', type: '1', readonly: '0',
  173. required: '1',pattern:'/^\d{11}$/'
  174. }])
  175. function generateSecureRandomString(length = 8) {
  176. const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
  177. const randomValues = new Uint32Array(length);
  178. window.crypto.getRandomValues(randomValues);
  179. let result = '';
  180. randomValues.forEach((value) => {
  181. result += chars[value % chars.length];
  182. });
  183. return result;
  184. }
  185. onMounted(() => {
  186. fields.value = props.form.questions
  187. });
  188. </script>
  189. <style scoped lang="scss">
  190. .tabs-item {
  191. margin-right: 20px;
  192. padding: 8px 20px;
  193. font-size: 14px;
  194. border-color: #d7d7d7;
  195. border-style: solid;
  196. border-width: 1px 1px 0 1px;
  197. cursor: pointer;
  198. user-select: none;
  199. &.checked {
  200. color: #fff;
  201. border-color: var(--el-color-primary);
  202. background-color: var(--el-color-primary);
  203. }
  204. }
  205. .border-botttom {
  206. border-bottom: 1px solid #d7d7d7;
  207. }
  208. .border {
  209. border: 1px solid #dcdfe6;
  210. }
  211. </style>