meeting-detail-info.vue 13 KB

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