activityDetail.vue 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010
  1. <template>
  2. <block>
  3. <view class="container activity-detail">
  4. <is-track-follow :isShowFollowButton.sync="detailData.IsShowFollowButton" source="activity" :sourceId="detailData.ActivityId" :isFollowData.sync="detailData.IsFollowButton" />
  5. <view class="" v-if="haveAuth == 1">
  6. <block v-if="detailData.YidongActivityUrl">
  7. <web-view :src="detailData.YidongActivityUrl"></web-view>
  8. </block>
  9. <block v-else>
  10. <block v-if="detailData.FileType == 1">
  11. <!-- 音频模块 -->
  12. <view class="audio-card-activity" v-if="detailData.VoiceList && detailData.VoiceList.Url">
  13. <view class="slider-paly">
  14. <view style="flex: 1; padding-top: 20rpx">
  15. <slider
  16. activeColor="#376CBB"
  17. :max="detailData.VoiceList.PlaySeconds"
  18. :value="curTime"
  19. @touchstart="touchstartHandler"
  20. @change="handleAudioSliderChange($event)"
  21. @changing="handleAudioSliderChangeing($event)"
  22. block-size="16"
  23. class="slider"
  24. />
  25. <view class="card-time">
  26. <view class="time">{{ curTime | formatVoiceTime }}</view>
  27. <view class="time">{{ detailData.VoiceList.PlaySeconds | formatVoiceTime }}</view>
  28. </view>
  29. </view>
  30. <view class="is-paly-card">
  31. <image
  32. @click.stop="audioPlayBack"
  33. class=""
  34. :src="
  35. curVoiceId === detailData.ActivityId && !curAudioPaused
  36. ? 'https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/play_icon.gif'
  37. : 'https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/pause_icon.png'
  38. "
  39. ></image>
  40. </view>
  41. </view>
  42. <view class="fast-reverse">
  43. <image @click="speedReverseHandler('reverse')" class="speed-img" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/fastReverse_icon.png"></image>
  44. <block v-for="(item, index) in timesTheSpeed" :key="item.value">
  45. <view class="speed-button" v-if="isTimes == item.value" @click="isTimesHandler(index)">
  46. {{ item.name }}
  47. </view>
  48. </block>
  49. <image @click="speedReverseHandler('speed')" class="speed-img" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/speed_icon.png"></image>
  50. </view>
  51. <text class="card-title global_title text_twoLine">
  52. {{ detailData.VoiceList.Name }}
  53. </text>
  54. <view class="title-image">
  55. <image @click="myLeavingMessageHandler" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/new_cygx/leaving_message.png"></image>
  56. <image
  57. @click="isCollectionHandeler"
  58. :src="detailData.IsCollect ? 'https://hzchart.oss-cn-shanghai.aliyuncs.com/new_cygx/collected_icon.png' : 'https://hzchart.oss-cn-shanghai.aliyuncs.com/new_cygx/not_collected.png'"
  59. ></image>
  60. </view>
  61. </view>
  62. </block>
  63. <!-- 视频模块 -->
  64. <block v-if="detailData.FileType == 2">
  65. <view class="audio-card-activity video-play" v-if="detailData.VideoDetail && detailData.VideoDetail.ResourceUrl">
  66. <video
  67. :id="detailData.ActivityId"
  68. :src="detailData.VideoDetail.ResourceUrl"
  69. enable-play-gesture
  70. :custom-cache="false"
  71. object-fit="contain"
  72. show-mute-btn
  73. @ended="handleVideoEnd"
  74. @play="handelVideoPlay"
  75. @loadedmetadata="loadedmetadataHandle"
  76. @timeupdate="handleVideoTimeUpdate"
  77. ></video>
  78. <view class="card-title global_title text_twoLine">
  79. {{ detailData.VideoDetail.Title }}
  80. </view>
  81. <view class="title-image">
  82. <image @click="myLeavingMessageHandler" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/new_cygx/leaving_message.png"></image>
  83. <image
  84. @click="isCollectionHandeler"
  85. :src="detailData.IsCollect ? 'https://hzchart.oss-cn-shanghai.aliyuncs.com/new_cygx/collected_icon.png' : 'https://hzchart.oss-cn-shanghai.aliyuncs.com/new_cygx/not_collected.png'"
  86. ></image>
  87. </view>
  88. </view>
  89. </block>
  90. <!-- 内容部分 -->
  91. <view class="activity-content">
  92. <image class="top-img-box" v-if="detailData.IsResearchPoints" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/new_cygx/research_points.png"></image>
  93. <image class="top-img-box" v-else-if="detailData.IsResearch" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/new_cygx/Research_normal.png"></image>
  94. <!-- 头部滚动显示 -->
  95. <view class="notice" v-if="detailData.IsLimitPeople">
  96. <van-notice-bar
  97. custom-class="custom-class-notice"
  98. color="#E37318"
  99. background="#FFF1E9"
  100. text="该活动参与名额有限,报名客户请按时参加,若不能按时参加请及时取消报名,爽约会影响您的后续报名资格"
  101. />
  102. </view>
  103. <view v-if="detailData.ActivityName" class="global_title content-title">
  104. {{ detailData.ActivityName }}
  105. </view>
  106. <!-- 活动类型 -->
  107. <view class="content-item">
  108. <text class="item-left" v-if="detailData.ActivityTypeName">活动类型:</text>
  109. <view class="city">
  110. <text style="color: #333">
  111. <block v-if="detailData.ChartPermissionName !== '买方研选'">({{ detailData.ChartPermissionName }})</block>
  112. {{ detailData.ActivityTypeName }}
  113. </text>
  114. <image v-if="detailData.City" style="margin-left: 15rpx" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/new_cygx/position.png" mode=""></image>
  115. <text v-if="detailData.City">{{ detailData.City }}</text>
  116. </view>
  117. </view>
  118. <!-- 产业标签 -->
  119. <view v-if="detailData.Listndustrial.length" class="content-item">
  120. <view class="item-left">产业标签:</view>
  121. <view class="item-right dustrial-content">
  122. <view class="item" v-for="item in detailData.Listndustrial" :key="item.IndustrialManagementId">
  123. <view :class="['dustrial-li', item.IsJump && 'dustrial-item']" @click="goDustrialHandler(item)">{{ item.IndustryName }} </view>
  124. <image v-if="item.IndustryNewLabel" class="new_icon" src="https://hzstatic.hzinsights.com/cygx/icon/new_report.png" mode=""></image>
  125. </view>
  126. </view>
  127. </view>
  128. <view v-if="detailData.ActivityTimeText" class="content-item">
  129. <view class="item-left">活动时间:</view>
  130. <view class="item-right">{{ detailData.ActivityTimeText }}</view>
  131. </view>
  132. <view v-if="detailData.DistinguishedGuest" class="content-item">
  133. <view class="item-left">嘉&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;宾:</view>
  134. <view class="item-right">{{ detailData.DistinguishedGuest }}</view>
  135. </view>
  136. <view v-if="detailData.Host" class="content-item">
  137. <view class="item-left">主&nbsp;&nbsp;持&nbsp;人:</view>
  138. <view class="item-right">{{ detailData.Host }}</view>
  139. </view>
  140. <view v-if="detailData.Speaker" class="content-item">
  141. <view class="item-left">主&nbsp;&nbsp;讲&nbsp;人:</view>
  142. <view class="item-right">{{ detailData.Speaker }}</view>
  143. </view>
  144. <view v-if="detailData.Expert" class="content-item">
  145. <view class="item-left">专家背景:</view>
  146. <view class="item-right">
  147. <rich-text :nodes="detailData.Expert"></rich-text>
  148. </view>
  149. </view>
  150. <view v-if="detailData.MainlandTell" class="content-item">
  151. <view class="item-left">大陆拨入:</view>
  152. <view class="item-right" style="color: #376cbb" @click="phonebtn(detailData.MainlandTell)">{{ detailData.MainlandTell }}</view>
  153. </view>
  154. <view v-if="detailData.HongKongTell" class="content-item">
  155. <view class="item-left">香港拨入:</view>
  156. <view class="item-right" style="color: #376cbb" @click="phonebtn(detailData.HongKongTell)">{{ detailData.HongKongTell }}</view>
  157. </view>
  158. <view v-if="detailData.TaiwanTell" class="content-item">
  159. <view class="item-left">台湾拨入:</view>
  160. <view class="item-right" style="color: #376cbb" @click="phonebtn(detailData.TaiwanTell)">{{ detailData.TaiwanTell }}</view>
  161. </view>
  162. <view v-if="detailData.AmericaTell" class="content-item">
  163. <view class="item-left">美国拨入:</view>
  164. <view class="item-right" style="color: #376cbb" @click="phonebtn(detailData.AmericaTell)">{{ detailData.AmericaTell }}</view>
  165. </view>
  166. <view v-if="detailData.ParticipationCode && isUserBindingPhoneNumber" class="content-item">
  167. <view class="item-left">拨入密码:</view>
  168. <view class="item-right">{{ [1, 2, 3].includes(detailData.ActivityTypeId) && detailData.IsLimitPeople && !detailData.IsSignup ? "请报名获取" : detailData.ParticipationCode }}</view>
  169. </view>
  170. <view class="content-item" v-if="detailData.OnlineParticipation && isUserBindingPhoneNumber">
  171. <view class="item-left">网络参会:</view>
  172. <view class="item-right content-item-link" v-if="[1, 2].includes(detailData.ActivityTypeId) && detailData.IsLimitPeople && !detailData.IsSignup"> 请报名获取 </view>
  173. <view class="item-right content-item-link" style="color: #376cbb" v-else>
  174. <view class="text_oneLine" @click="networkBtn">{{ detailData.OnlineParticipation }}</view>
  175. <view class="copy-link" @click="copyLink(1)">复制链接</view>
  176. </view>
  177. </view>
  178. <view class="content-item" v-if="detailData.LinkParticipants && isUserBindingPhoneNumber">
  179. <view class="item-left">链接参会:</view>
  180. <view class="item-right content-item-zoom" style="color: #376cbb">
  181. <view>
  182. <view class="default text_zoom" v-if="!detailData.IsSignup && detailData.ActivityTypeName == '公司调研电话会' && detailData.IsLimitPeople">请报名获取 </view>
  183. <blcok v-else>
  184. <text class="default text_zoom">{{ detailData.LinkParticipants }}</text>
  185. <view> 点击<text class="default copy-link copy-zoom" @click="copyLink(1)">复制链接</text>在手机浏览器打开,并输入会议密码 </view>
  186. </blcok>
  187. </view>
  188. </view>
  189. </view>
  190. <view v-if="detailData.AppAttendance" class="content-item">
  191. <view class="item-left">App参会: </view>
  192. <view class="item-right">
  193. <rich-text :nodes="detailData.AppAttendance"></rich-text>
  194. </view>
  195. </view>
  196. <view v-if="detailData.ConferencePassword && isUserBindingPhoneNumber" class="content-item">
  197. <view class="item-left">拨入密码:</view>
  198. <view class="item-right">{{ detailData.ActivityTypeName == "公司调研电话会" && detailData.IsLimitPeople && !detailData.IsSignup ? "请报名获取" : detailData.ConferencePassword }}</view>
  199. </view>
  200. <view v-if="detailData.Address && isUserBindingPhoneNumber" class="content-item">
  201. <view class="item-left">活动地址:</view>
  202. <view class="item-right" v-if="!detailData.IsSignup && detailData.ActivityTypeName == '公司线下调研' && detailData.IsLimitPeople">请报名获取 </view>
  203. <text class="item-right text-copy" user-select v-else>{{ detailData.Address }}</text>
  204. </view>
  205. <view v-if="detailData.Highlights" class="content-item">
  206. <view class="item-left">活动亮点: </view>
  207. <view class="item-right">
  208. <rich-text :nodes="detailData.Highlights"></rich-text>
  209. </view>
  210. </view>
  211. <view class="content-item" v-if="detailData.ArticleList.length">
  212. <view class="item-left">相关报告:</view>
  213. <view class="item-right look-link" style="color: #376cbb" @click="articleLinkHandler"> 点击查看 </view>
  214. </view>
  215. <view class="content-item" v-if="detailData.TencentConferenceNumber">
  216. <view class="item-left" style="width: 170rpx">腾讯会议号:</view>
  217. <view class="item-right content-item-link" v-if="!detailData.IsSignup && (detailData.IsYidongConduct || detailData.IsLimitPeople)">请报名获取</view>
  218. <view class="item-right content-item-link" style="color: #376cbb" v-else>
  219. <view class="">
  220. <text class="default tencent text_oneLine">{{ detailData.TencentConferenceNumber }}</text>
  221. <text class="default copy-link" @click="copyLink(2)">复制会议号</text>
  222. </view>
  223. </view>
  224. </view>
  225. <view v-if="detailData.Theme" class="content-item">
  226. <view class="item-left">主&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;题: </view>
  227. <view class="item-right">
  228. <rich-text :nodes="detailData.Theme"></rich-text>
  229. </view>
  230. </view>
  231. <view v-if="detailData.Remarks" class="content-item">
  232. <view class="item-left">备&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注: </view>
  233. <view class="item-right">
  234. <rich-text :nodes="detailData.Remarks"></rich-text>
  235. </view>
  236. </view>
  237. <!-- 操作按钮部分 -->
  238. <view class="content-bottom" v-if="isUserBindingPhoneNumber">
  239. <block v-if="detailData.ActiveState == 1">
  240. <view class="make-outbound global_content_center" @click="signupIsAddOfCancel(1)" v-if="detailData.IsShowOutboundCall">
  241. {{ detailData.LimitPeopleNum > 0 ? `${showOutboundCall}(${detailData.SignupNum}/${detailData.LimitPeopleNum})` : showOutboundCall }}
  242. </view>
  243. <view @click="meetingReminderCancel" class="make-conference make-conference-remind" v-if="detailData.IsShowMeetingReminder">
  244. {{ detailData.IsCancelMeetingReminder == 1 ? "取消会议提醒" : "会议提醒" }}
  245. <view>(会前15分钟推送微信消息提醒)</view>
  246. </view>
  247. <view v-if="detailData.IsShowAppointment" @click="summaryIsHandel" class="make-conference global_content_center">{{ detailData.IsAppointment == 1 ? "取消纪要" : "预约纪要" }}</view>
  248. <view v-if="detailData.IsShowHelpSsk" class="make-conference global_content_center" @click="askingGo"> 帮我带问 </view>
  249. <view class="make-outbound global_content_center" @click="wanttosignup" v-if="!detailData.IsSignup && detailData.IsShowSignup">
  250. {{ detailData.LimitPeopleNum > 0 ? `我要报名(${detailData.SignupNum}/${detailData.LimitPeopleNum})` : "我要报名" }}
  251. </view>
  252. <view v-if="detailData.IsSignup && detailData.IsShowSignup" class="make-outbound global_content_center" @click="signupIsAddOfCancel(2)">
  253. {{ detailData.LimitPeopleNum > 0 ? `${showWay}(${detailData.SignupNum}/${detailData.LimitPeopleNum})` : showWay }}
  254. </view>
  255. </block>
  256. <view class="content-bottom" v-if="detailData.ActiveState == 2 && detailData.ActivityTypeId == 1">
  257. <view class="make-conference make-conference-remind" @click="askingGo('提问')">
  258. 实时提问
  259. <text>会议过程中,分析师可替您提问专家</text>
  260. </view>
  261. </view>
  262. </view>
  263. <view class="content-bottom" v-else>
  264. <view class="make-outbound global_content_center" @click="pleaseGoLogin"> 请登录后报名 </view>
  265. </view>
  266. </view>
  267. </block>
  268. <!-- 参会方式的弹出层 -->
  269. <SelectPopup :selectShow.sync="selectShow" @signupIsAddOfCancel="signupIsAddOfCancel" :selectYdong="selectYdong" />
  270. <view class="select-box">
  271. <u-popup v-model="selectShowLink" mode="bottom">
  272. <view style="color: #376cbb" class="text_oneLine article-title" @click="goDetail(item.ArticleId)" v-for="item in detailData.ArticleList" :key="item.ArticleId"> {{ item.Title }}</view>
  273. <view style="color: #a9afb8" @click="selectShowLink = false">取消</view>
  274. </u-popup>
  275. </view>
  276. <!-- 各种弹框部分 -->
  277. <modalDialog
  278. :isShow="isShow"
  279. :signupType="signupType"
  280. :goFollow="goFollow"
  281. :isCancelShow="isCancelShow"
  282. :idTypeCancel="idTypeCancel"
  283. :editIsShow="editIsShow"
  284. :countryCode="countryCode"
  285. :mobileEdit="mobileEdit"
  286. :goOnNextStep="goOnNextStep"
  287. :jurisdictionList="jurisdictionList"
  288. :mailboxBinding="mailboxBinding"
  289. />
  290. </view>
  291. <!-- 权限部分 -->
  292. <view v-else>
  293. <jurisdiction :idAct="id" :jurisdictionList="jurisdictionList"></jurisdiction>
  294. </view>
  295. <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" />
  296. <view v-show="false">
  297. <audioModule ref="childrenAudio" :showAudioPop="showAudioPop" />
  298. </view>
  299. <suspenButton v-if="showSingInImg" :showSingInImg.sync="showSingInImg" type="活动详情">
  300. <template slot="center">
  301. <image mode="widthFix" style="height: 120rpx; width: 120rpx" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/sing_in_icon.png"> </image>
  302. </template>
  303. <template slot="top">
  304. <image @click.stop="isDlgImg = true" mode="widthFix" style="height: 120rpx; width: 120rpx" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/sign_in_img.png"> </image>
  305. </template>
  306. <template slot="left">
  307. <image @click.stop="goSingUpDetail" mode="widthFix" style="height: 120rpx; width: 120rpx" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/sing_up_details.png"> </image>
  308. </template>
  309. </suspenButton>
  310. <van-popup custom-class="custom-class-popup" :show="isDlgImg" @close="onCloseHandler">
  311. <view class="sign-in-img-box">
  312. <image :src="detailData.SigninImg"></image>
  313. <view class="button-box">
  314. <text @click="onCloseHandler">关闭</text>
  315. <text @click="downloadImage">保存图片</text>
  316. </view>
  317. </view>
  318. </van-popup>
  319. <!-- 各种弹框部分 -->
  320. <ShowResearchDlg :isResearchModalShow.sync="isResearchModalShow" :jurisdictionList="jurisdictionList" :checkResearchList.sync="checkResearchList" />
  321. </view>
  322. <Loading />
  323. </block>
  324. </template>
  325. <script>
  326. import { activity, User, Home } from "@/config/api.js";
  327. import modalDialog from "@/components/modalDialog.vue";
  328. import jurisdiction from "./jurisdiction/components.vue";
  329. import freeCharge from "@/components/freeCharge";
  330. import audioModule from "@/components/audioModule/index";
  331. import manageMixin from "./manageMixin";
  332. import IsTrackFollow from "@/components/isTrackFollow.vue";
  333. import SelectPopup from "@/components/activity/selectPopup";
  334. import NotHaveLogin from "@/components/notHaveLogin.vue";
  335. import suspenButton from "@/components/suspen_button.vue";
  336. import ShowResearchDlg from "@/components/activity/showResearchDlg.vue";
  337. let app = getApp({ allowDefault: true });
  338. export default {
  339. filters: {
  340. formatVoiceTime(e) {
  341. let m = parseInt(e / 60);
  342. let s = parseInt(e % 60);
  343. return `${m > 9 ? m : "0" + m}:${s > 9 ? s : "0" + s}`;
  344. },
  345. },
  346. data() {
  347. return {
  348. id: "",
  349. detailData: {},
  350. isShowJurisdiction: false,
  351. isGain: true,
  352. signupType: "", //关注类型
  353. goFollow: false, //是否关注公众号
  354. isShow: false, //弹框
  355. isCancelShow: false,
  356. idTypeCancel: {
  357. id: "",
  358. type: 1,
  359. cutId: "",
  360. state: "",
  361. },
  362. selectShow: false, // 参会方式的隐藏显示
  363. selectYdong: false, // 参会方式展示的文案
  364. haveAuth: "",
  365. jurisdictionList: {},
  366. editIsShow: false, //外呼莫泰框
  367. countryCode: "", //外呼区号
  368. mobileEdit: "", //外呼手机号
  369. goOnNextStep: "", //设置外呼号后弹出哪个
  370. mailboxBinding: false, //是否绑定邮箱
  371. play: false,
  372. timesTheSpeed: [
  373. { name: "倍速", value: 1 },
  374. { name: "1.25倍", value: 1.25 },
  375. { name: "1.5倍", value: 1.5 },
  376. { name: "2倍", value: 2 },
  377. ],
  378. curTime: 0,
  379. videoContext: null,
  380. isVideoPlay: false,
  381. selectShowLink: false,
  382. isSendWx: "",
  383. isDlgImg: false,
  384. showSingInImg: false,
  385. isResearchModalShow: false,
  386. checkResearchList: {},
  387. };
  388. },
  389. mixins: [manageMixin],
  390. computed: {
  391. curVoiceId() {
  392. //当前正在播放的音频id
  393. return this.$store.state.audioBg.activityId;
  394. },
  395. curAudioPaused() {
  396. //当前音频是否暂停状态
  397. return this.$store.state.audioBg.paused;
  398. },
  399. //视频的id
  400. activityVideoId() {
  401. return this.$store.state.videoPlay.playVideoActId;
  402. },
  403. //报名的显示
  404. showWay() {
  405. let text = this.detailData.SignupType == 1 ? "取消外呼" : "取消报名";
  406. return text;
  407. },
  408. showOutboundCall() {
  409. let text = this.detailData.IsSignup ? "取消外呼" : "预约外呼";
  410. return text;
  411. },
  412. //几倍的播放数度
  413. isTimes() {
  414. let isMultiple = this.curVoiceId === this.detailData.ActivityId ? this.$store.state.audioBg.multiple : 1;
  415. return isMultiple;
  416. },
  417. showAudioPop() {
  418. return this.$store.state.audioBg.show;
  419. },
  420. },
  421. components: {
  422. modalDialog,
  423. jurisdiction,
  424. freeCharge,
  425. audioModule,
  426. IsTrackFollow,
  427. SelectPopup,
  428. NotHaveLogin,
  429. suspenButton,
  430. ShowResearchDlg,
  431. },
  432. watch: {
  433. haveAuth: {
  434. handler() {
  435. if (this.haveAuth == 1) {
  436. this.$store.dispatch("statistics", { PageType: "ActivitParticulars", DetailId: this.id });
  437. }
  438. },
  439. immediate: true,
  440. },
  441. "$store.state.audioBg.curTime": {
  442. handler(newVal) {
  443. this.curTime = this.curVoiceId === this.detailData.ActivityId ? newVal : 0;
  444. },
  445. immediate: true,
  446. deep: true,
  447. },
  448. },
  449. methods: {
  450. downloadImage() {
  451. wx.downloadFile({
  452. url: this.detailData.SigninImg,
  453. success(res) {
  454. wx.saveImageToPhotosAlbum({
  455. filePath: res.tempFilePath,
  456. success(data) {
  457. wx.showModal({
  458. title: "提示",
  459. content: "保存成功",
  460. modalType: false,
  461. });
  462. },
  463. fail(err) {
  464. if (
  465. err.errMsg === "saveImageToPhotosAlbum:fail:auth denied" ||
  466. err.errMsg === "saveImageToPhotosAlbum:fail auth deny" ||
  467. err.errMsg === "saveImageToPhotosAlbum:fail authorize no response"
  468. ) {
  469. wx.showModal({
  470. title: "提示",
  471. content: "需要您授权保存相册",
  472. modalType: false,
  473. success: (modalSuccess) => {
  474. wx.openSetting({
  475. success(settingdata) {
  476. console.log("settingdata", settingdata);
  477. if (settingdata.authSetting["scope.writePhotosAlbum"]) {
  478. wx.showModal({
  479. title: "提示",
  480. content: "获取权限成功,再次点击图片即可保存",
  481. modalType: false,
  482. });
  483. } else {
  484. wx.showModal({
  485. title: "提示",
  486. content: "获取权限失败,将无法保存到相册哦~",
  487. modalType: false,
  488. });
  489. }
  490. },
  491. fail(failData) {
  492. console.log("failData", failData);
  493. },
  494. complete(finishData) {
  495. console.log("finishData", finishData);
  496. },
  497. });
  498. },
  499. });
  500. }
  501. },
  502. });
  503. },
  504. });
  505. },
  506. onCloseHandler() {
  507. this.isDlgImg = false;
  508. },
  509. // 获取详情
  510. getActivityDetail() {
  511. activity
  512. .getActivityDetail({
  513. ActivityId: this.id,
  514. PageRouter: this.$store.state.pageRouterActivity,
  515. IsSendWx: this.isSendWx,
  516. })
  517. .then((res) => {
  518. if (res.Ret == 200) {
  519. this.$store.commit("setRouterActivity", "活动详情");
  520. this.haveAuth = res.Data.HasPermission;
  521. this.jurisdictionList = res.Data;
  522. if (res.Data.HasPermission == 1) {
  523. this.detailData = res.Data.Detail;
  524. this.showSingInImg = this.detailData.IsShowSigninButton;
  525. this.synchronization();
  526. }
  527. }
  528. });
  529. },
  530. // 同步数据
  531. synchronization() {
  532. let pages = getCurrentPages();
  533. let prevPage = pages[pages.length - 2];
  534. let path = prevPage ? prevPage.$page.fullPath : "";
  535. if (path.includes("/activityPages/themeActivity/themeActivity") || path.includes("/pages-search/indedxSearch/indedxSearch?source=活动详情页面")) {
  536. const index = prevPage.$vm.collectList.findIndex((item) => item.ActivityId == this.id);
  537. prevPage.$vm.collectList[index].IsSignup = this.detailData.IsSignup;
  538. prevPage.$vm.collectList[index].SignupNum = this.detailData.SignupNum;
  539. prevPage.$vm.collectList[index].SignupType = this.detailData.SignupType;
  540. prevPage.$vm.collectList[index].IsAppointment = this.detailData.IsAppointment;
  541. prevPage.$vm.collectList[index].IsCancelMeetingReminder = this.detailData.IsCancelMeetingReminder;
  542. }
  543. },
  544. // 拨打电话
  545. phonebtn(phone) {
  546. uni.makePhoneCall({
  547. phoneNumber: phone,
  548. });
  549. },
  550. // 跳转新的小程序
  551. networkBtn() {
  552. if (this.detailData.OnlineParticipation.includes("http")) {
  553. uni.navigateTo({
  554. url: "/activityPages/networkAttend/networkAttend?url=" + this.detailData.OnlineParticipation,
  555. });
  556. } else {
  557. uni.navigateToMiniProgram({
  558. appId: "wxade30ff0c4ee757d",
  559. path: this.detailData.OnlineParticipation,
  560. });
  561. }
  562. },
  563. // 弹框的回调事件
  564. cancelEnsure() {
  565. this.getActivityDetail();
  566. },
  567. // 跳转
  568. goDetail(id) {
  569. uni.navigateTo({
  570. url: "/pageMy/reportDetail/reportDetail?id=" + id,
  571. });
  572. },
  573. // 提问
  574. async askingGo(type = "") {
  575. const res = await activity.checkAskActivity({ ActivityId: Number(this.id), PageRouter: this.$store.state.pageRouterActivity });
  576. if (res.Ret === 200) {
  577. if (res.Data.SignupStatus === "Success") {
  578. uni.navigateTo({
  579. url: "/activityPages/generationAsk/generationAsk?id=" + this.id + "&type=" + type,
  580. });
  581. } else {
  582. uni.showModal({
  583. confirmText: "知道了",
  584. confirmColor: "#376cbb",
  585. content: res.Msg || res.Data.PopupMsg,
  586. showCancel: false,
  587. success: (res) => {
  588. if (res.confirm) {
  589. this.getActivityDetail();
  590. }
  591. },
  592. });
  593. }
  594. }
  595. },
  596. // 复制的操作
  597. copyLink(type) {
  598. uni.setClipboardData({
  599. data: type == 1 ? this.detailData.LinkParticipants || this.detailData.OnlineParticipation : this.detailData.TencentConferenceNumber,
  600. success: function () {
  601. uni.showToast({
  602. title: `复制成功${type == 1 ? ",可在浏览器打开" : ""}`,
  603. icon: "none",
  604. duration: 2000,
  605. });
  606. },
  607. });
  608. },
  609. // 跳转产业标签
  610. goDustrialHandler(item) {
  611. if (!item.IsJump) return;
  612. if (item.IsResearch) {
  613. //严选
  614. uni.navigateTo({ url: "/reportPages/researchTheme/researchTheme?id=" + item.IndustrialManagementId });
  615. } else {
  616. //非严选
  617. uni.navigateTo({ url: "/reportPages/IndustryReport/IndustryReport?id=" + item.IndustrialManagementId });
  618. }
  619. },
  620. // 音频点击暂停播放
  621. audioPlayBack() {
  622. if (this.$store.state.audioBg.activityId == this.detailData.ActivityId) {
  623. if (this.globalBgAudioManager.paused) {
  624. this.globalBgAudioManager.play();
  625. } else {
  626. this.globalBgAudioManager.pause();
  627. }
  628. } else {
  629. this.$store.commit("audioBg/addAudio", {
  630. list: this.detailData.VoiceList,
  631. activityId: this.detailData.ActivityId,
  632. activityTitle: this.detailData.ActivityName,
  633. });
  634. }
  635. },
  636. // 拖动进度条
  637. handleAudioSliderChangeing(e) {
  638. this.curTime = e.detail.value;
  639. },
  640. // 拖动进度条
  641. handleAudioSliderChange(e) {
  642. const value = e.detail.value;
  643. this.globalBgAudioManager.seek(value);
  644. this.$refs.childrenAudio.isRecord = false;
  645. setTimeout(() => {
  646. this.$store.commit("audioBg/setSlide", false);
  647. }, 300);
  648. },
  649. // 手指离开拖动进度条
  650. touchstartHandler() {
  651. this.$store.commit("audioBg/setSlide", true);
  652. },
  653. //倍速播放
  654. isTimesHandler(i) {
  655. if (this.$store.state.audioBg.activityId == this.detailData.ActivityId) {
  656. let index = i == 3 ? 0 : i + 1;
  657. this.$store.commit("audioBg/setMultiple", this.timesTheSpeed[index].value);
  658. this.globalBgAudioManager.playbackRate = this.isTimes;
  659. this.globalBgAudioManager.startTime = this.curTime;
  660. if (this.globalBgAudioManager.paused) {
  661. this.globalBgAudioManager.play();
  662. }
  663. } else {
  664. this.$store.commit("audioBg/removeAudio");
  665. this.$store.commit("audioBg/addAudio", {
  666. list: this.detailData.VoiceList,
  667. activityId: this.detailData.ActivityId,
  668. activityTitle: this.detailData.ActivityName,
  669. recordList: this.detailData
  670. });
  671. }
  672. this.$refs.childrenAudio.isRecord = false;
  673. },
  674. //快进 快退
  675. speedReverseHandler(type) {
  676. let isTime = type == "reverse" ? this.curTime - 15 : this.curTime + 15;
  677. isTime = isTime <= 0 ? 0 : isTime >= this.detailData.VoiceList.PlaySeconds ? this.detailData.VoiceList.PlaySeconds - 1 : isTime;
  678. this.globalBgAudioManager.seek(isTime);
  679. this.$refs.childrenAudio.isRecord = false;
  680. },
  681. //视频元数据加载完成时触发
  682. loadedmetadataHandle() {
  683. this.videoContext = wx.createVideoContext(this.detailData.ActivityId.toString(), this);
  684. let curVideoTime = 0;
  685. if (this.activityVideoId == this.detailData.ActivityId) {
  686. curVideoTime = this.$store.state.videoPlay.palyCurrentTime;
  687. } else {
  688. this.$store.commit("videoPlay/playVideoActivity", this.detailData.ActivityId);
  689. }
  690. this.videoContext.seek(curVideoTime);
  691. },
  692. //视频播放结束
  693. handleVideoEnd() {
  694. // 此处因为如果不调用退出全屏方法 安卓和ios页面均会表现异常,安卓横屏不恢复竖屏,ios底部tabbar渲染异常
  695. this.videoContext.exitFullScreen();
  696. },
  697. //视频时间的更新
  698. handleVideoTimeUpdate(e) {
  699. let time = parseInt(e.detail.currentTime);
  700. this.$store.commit("videoPlay/palyTimeUpdate", time);
  701. },
  702. //视频的播放事件
  703. handelVideoPlay() {
  704. if (!this.isVideoPlay) {
  705. Home.microAideoHistoryAdd({ SourceId: this.detailData.ActivityId, SourceType: 2 });
  706. }
  707. this.isVideoPlay = true;
  708. },
  709. // 微路演留言
  710. myLeavingMessageHandler() {
  711. let title = this.detailData.FileType == 1 ? this.detailData.VoiceList.Name : this.detailData.VideoDetail.Title;
  712. uni.navigateTo({
  713. url: "/activityPages/generationAsk/generationAsk?id=" + this.detailData.ActivityId + "&type=文章&roadshow=" + this.detailData.FileType + "&roadshowTitle=" + title,
  714. });
  715. },
  716. // 微路演收藏
  717. async isCollectionHandeler() {
  718. await this.$store.dispatch("showLoginModal");
  719. const res = await Home.microRoadshowCollect({
  720. SourceId: this.detailData.FileType == 1 ? this.detailData.VoiceList.ActivityVoiceId : this.detailData.VideoDetail.Id,
  721. SourceType: this.detailData.FileType,
  722. PageRouter: this.$store.state.pageRouterReport,
  723. });
  724. if (res.Ret === 200) {
  725. uni.showToast({
  726. title: res.Msg,
  727. duration: 2000,
  728. });
  729. this.detailData.IsCollect = !this.detailData.IsCollect;
  730. }
  731. },
  732. articleLinkHandler() {
  733. if (this.detailData.ArticleList.length === 1) {
  734. uni.navigateTo({
  735. url: "/pageMy/reportDetail/reportDetail?id=" + this.detailData.ArticleList[0].ArticleId,
  736. });
  737. } else {
  738. this.selectShowLink = true;
  739. }
  740. },
  741. // 去往报名详情
  742. goSingUpDetail() {
  743. uni.navigateTo({
  744. url: "/pages-message/activityTemplate/activityTemplate?id=" + this.id,
  745. });
  746. },
  747. },
  748. onLoad(option) {
  749. this.id = option.id || "";
  750. this.isSendWx = option.IsSendWx || "";
  751. // 详情页面不写路径
  752. },
  753. onShow() {
  754. this.getActivityDetail();
  755. this.$store.commit("setRouterReport", "活动详情");
  756. },
  757. /**
  758. * 用户点击分享
  759. */
  760. onShareAppMessage: function (res) {
  761. return {
  762. title: this.isHorzMobile ? "好友向您推荐此内容,上传名片享查研观向免费月卡!" : "活动详情",
  763. path: "/activityPages/activityDetail/activityDetail?id=" + this.id,
  764. success: (res) => {},
  765. fail: (err) => {},
  766. };
  767. },
  768. };
  769. </script>
  770. <style scoped lang="scss">
  771. .activity-detail {
  772. background-color: $uni-color-new;
  773. padding: 25rpx 34rpx 150rpx;
  774. .audio-card-activity {
  775. width: 100%;
  776. padding: 25rpx;
  777. background-color: #fff;
  778. border-radius: 16rpx;
  779. margin-bottom: 25rpx;
  780. .slider {
  781. width: 100%;
  782. margin: 0;
  783. }
  784. .slider-paly {
  785. display: flex;
  786. height: 80rpx;
  787. align-items: center;
  788. padding-left: 20rpx;
  789. }
  790. .card-title {
  791. word-break: break-all;
  792. margin: 40rpx 0 20rpx;
  793. }
  794. .card-time {
  795. display: flex;
  796. justify-content: space-between;
  797. color: #999999;
  798. font-size: 20rpx;
  799. }
  800. .title-image {
  801. display: flex;
  802. justify-content: flex-end;
  803. image {
  804. width: 48rpx;
  805. height: 48rpx;
  806. margin-left: 48rpx;
  807. }
  808. }
  809. .is-paly-card {
  810. width: 70rpx;
  811. height: 70rpx;
  812. flex-shrink: 0;
  813. margin-left: 30rpx;
  814. image {
  815. width: 70rpx;
  816. height: 70rpx;
  817. }
  818. }
  819. .fast-reverse {
  820. display: flex;
  821. align-items: center;
  822. justify-content: center;
  823. margin-top: 30rpx;
  824. .speed-button {
  825. width: 96rpx;
  826. height: 47rpx;
  827. background: #eaeaea;
  828. border-radius: 8rpx;
  829. text-align: center;
  830. line-height: 47rpx;
  831. margin: 0 70rpx;
  832. padding-left: 0;
  833. }
  834. .speed-img {
  835. width: 50rpx;
  836. height: 50rpx;
  837. }
  838. }
  839. }
  840. .video-play {
  841. width: 100%;
  842. video {
  843. width: 100%;
  844. height: 318rpx;
  845. }
  846. }
  847. .new_icon {
  848. width: 60rpx;
  849. height: 30rpx;
  850. margin: 0 20rpx 0rpx 0;
  851. display: inline-block;
  852. vertical-align: middle;
  853. }
  854. .activity-content {
  855. width: 100%;
  856. padding: 20rpx 30rpx 100rpx;
  857. background-color: #fff;
  858. border-radius: 16rpx;
  859. overflow: hidden;
  860. .notice {
  861. margin-bottom: 20rpx;
  862. }
  863. /deep/ .van-notice-bar {
  864. height: 62rpx;
  865. }
  866. .content-title {
  867. margin: 10rpx 0 30rpx;
  868. }
  869. .content-item {
  870. display: flex;
  871. font-size: 28rpx;
  872. line-height: 40rpx;
  873. color: #333;
  874. margin-bottom: 20rpx;
  875. align-items: flex-start;
  876. vertical-align: text-top;
  877. .city {
  878. display: flex;
  879. align-items: center;
  880. image {
  881. width: 28rpx;
  882. height: 28rpx;
  883. }
  884. }
  885. .item-left {
  886. width: 140rpx;
  887. flex-shrink: 0;
  888. }
  889. .item-right {
  890. color: #333;
  891. }
  892. .dustrial-content {
  893. display: flex;
  894. flex-wrap: wrap;
  895. .item {
  896. display: flex;
  897. align-items: center;
  898. padding-left: 0;
  899. margin-left: 0;
  900. }
  901. .dustrial-li {
  902. display: flex;
  903. align-items: center;
  904. font-size: 22rpx;
  905. height: 40rpx;
  906. padding: 0 13rpx;
  907. margin: 0 20rpx 10rpx 0;
  908. background-color: #f0f1f3;
  909. }
  910. .dustrial-item {
  911. padding: 0 20rpx;
  912. background: #e5efff;
  913. border-radius: 4rpx;
  914. color: $uni-color-new;
  915. border-radius: 4rpx;
  916. font-weight: 600;
  917. }
  918. }
  919. .content-item-link {
  920. display: flex;
  921. .copy-link {
  922. flex-shrink: 0;
  923. margin-left: 20rpx;
  924. }
  925. }
  926. }
  927. .content-bottom {
  928. margin-top: 100rpx;
  929. font-size: 24rpx;
  930. font-weight: 600;
  931. .make-outbound {
  932. color: #fff;
  933. margin: 0 auto;
  934. width: 504rpx;
  935. height: 60rpx;
  936. border-radius: 8rpx;
  937. background-color: $uni-color-new;
  938. }
  939. .make-conference {
  940. margin: 20rpx auto;
  941. width: 504rpx;
  942. padding: 12rpx;
  943. line-height: 36rpx;
  944. background-color: #e5efff;
  945. color: $uni-color-new;
  946. border-radius: 8rpx;
  947. view {
  948. font-weight: 400;
  949. font-size: 20rpx;
  950. }
  951. }
  952. .make-conference-remind {
  953. text-align: center;
  954. }
  955. }
  956. }
  957. .top-img-box {
  958. width: 160rpx;
  959. height: 48rpx;
  960. margin: -20rpx 0 0 -30rpx;
  961. }
  962. .sign-in-img-box {
  963. width: 704rpx;
  964. height: 1121rpx;
  965. background-color: #fff;
  966. border-radius: 8rpx;
  967. overflow: hidden;
  968. image {
  969. width: 100%;
  970. height: calc(100% - 108rpx);
  971. }
  972. .button-box {
  973. display: flex;
  974. align-items: center;
  975. height: 102rpx;
  976. border-top: 1rpx solid #f0f0f0;
  977. text {
  978. flex: 1;
  979. height: 100%;
  980. display: flex;
  981. align-items: center;
  982. justify-content: center;
  983. }
  984. text:last-child {
  985. border-left: 1rpx solid #f0f0f0;
  986. color: #3385ff;
  987. }
  988. }
  989. }
  990. .custom-class-popup {
  991. border-radius: 8rpx;
  992. overflow: hidden;
  993. }
  994. }
  995. </style>