activityDetail.vue 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997
  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. console.log(1);
  554. uni.navigateTo({
  555. url: "/activityPages/networkAttend/networkAttend?url=" + this.detailData.OnlineParticipation,
  556. });
  557. } else {
  558. console.log(2);
  559. uni.navigateToMiniProgram({
  560. appId: "wxade30ff0c4ee757d",
  561. path: this.detailData.OnlineParticipation,
  562. });
  563. }
  564. },
  565. // 弹框的回调事件
  566. cancelEnsure() {
  567. this.getActivityDetail();
  568. },
  569. // 跳转
  570. goDetail(id) {
  571. uni.navigateTo({
  572. url: "/pageMy/reportDetail/reportDetail?id=" + id,
  573. });
  574. },
  575. // 提问
  576. async askingGo(type = "") {
  577. await activity.checkAskActivity({ ActivityId: Number(this.id), PageRouter: this.$store.state.pageRouterActivity });
  578. uni.navigateTo({
  579. url: "/activityPages/generationAsk/generationAsk?id=" + this.id + "&type=" + type,
  580. });
  581. },
  582. // 复制的操作
  583. copyLink(type) {
  584. uni.setClipboardData({
  585. data: type == 1 ? this.detailData.LinkParticipants || this.detailData.OnlineParticipation : this.detailData.TencentConferenceNumber,
  586. success: function () {
  587. uni.showToast({
  588. title: `复制成功${type == 1 ? ",可在浏览器打开" : ""}`,
  589. icon: "none",
  590. duration: 2000,
  591. });
  592. },
  593. });
  594. },
  595. // 跳转产业标签
  596. goDustrialHandler(item) {
  597. if (!item.IsJump) return;
  598. if (item.IsResearch) {
  599. //严选
  600. uni.navigateTo({ url: "/reportPages/researchTheme/researchTheme?id=" + item.IndustrialManagementId });
  601. } else {
  602. //非严选
  603. uni.navigateTo({ url: "/reportPages/IndustryReport/IndustryReport?id=" + item.IndustrialManagementId });
  604. }
  605. },
  606. // 音频点击暂停播放
  607. audioPlayBack() {
  608. if (this.$store.state.audioBg.activityId == this.detailData.ActivityId) {
  609. if (this.globalBgAudioManager.paused) {
  610. this.globalBgAudioManager.play();
  611. } else {
  612. this.globalBgAudioManager.pause();
  613. }
  614. } else {
  615. this.$store.commit("audioBg/addAudio", {
  616. list: this.detailData.VoiceList,
  617. activityId: this.detailData.ActivityId,
  618. activityTitle: this.detailData.ActivityName,
  619. });
  620. }
  621. },
  622. // 拖动进度条
  623. handleAudioSliderChangeing(e) {
  624. this.curTime = e.detail.value;
  625. },
  626. // 拖动进度条
  627. handleAudioSliderChange(e) {
  628. const value = e.detail.value;
  629. this.globalBgAudioManager.seek(value);
  630. this.$refs.childrenAudio.isRecord = false;
  631. setTimeout(() => {
  632. this.$store.commit("audioBg/setSlide", false);
  633. }, 300);
  634. },
  635. // 手指离开拖动进度条
  636. touchstartHandler() {
  637. this.$store.commit("audioBg/setSlide", true);
  638. },
  639. //倍速播放
  640. isTimesHandler(i) {
  641. if (this.$store.state.audioBg.activityId == this.detailData.ActivityId) {
  642. let index = i == 3 ? 0 : i + 1;
  643. this.$store.commit("audioBg/setMultiple", this.timesTheSpeed[index].value);
  644. this.globalBgAudioManager.playbackRate = this.isTimes;
  645. this.globalBgAudioManager.startTime = this.curTime;
  646. if (this.globalBgAudioManager.paused) {
  647. this.globalBgAudioManager.play();
  648. }
  649. } else {
  650. this.$store.commit("audioBg/removeAudio");
  651. this.$store.commit("audioBg/addAudio", {
  652. list: this.detailData.VoiceList,
  653. activityId: this.detailData.ActivityId,
  654. activityTitle: this.detailData.ActivityName,
  655. });
  656. }
  657. this.$refs.childrenAudio.isRecord = false;
  658. },
  659. //快进 快退
  660. speedReverseHandler(type) {
  661. let isTime = type == "reverse" ? this.curTime - 15 : this.curTime + 15;
  662. isTime = isTime <= 0 ? 0 : isTime >= this.detailData.VoiceList.PlaySeconds ? this.detailData.VoiceList.PlaySeconds - 1 : isTime;
  663. this.globalBgAudioManager.seek(isTime);
  664. this.$refs.childrenAudio.isRecord = false;
  665. },
  666. //视频元数据加载完成时触发
  667. loadedmetadataHandle() {
  668. this.videoContext = wx.createVideoContext(this.detailData.ActivityId.toString(), this);
  669. let curVideoTime = 0;
  670. if (this.activityVideoId == this.detailData.ActivityId) {
  671. curVideoTime = this.$store.state.videoPlay.palyCurrentTime;
  672. } else {
  673. this.$store.commit("videoPlay/playVideoActivity", this.detailData.ActivityId);
  674. }
  675. this.videoContext.seek(curVideoTime);
  676. },
  677. //视频播放结束
  678. handleVideoEnd() {
  679. // 此处因为如果不调用退出全屏方法 安卓和ios页面均会表现异常,安卓横屏不恢复竖屏,ios底部tabbar渲染异常
  680. this.videoContext.exitFullScreen();
  681. },
  682. //视频时间的更新
  683. handleVideoTimeUpdate(e) {
  684. let time = parseInt(e.detail.currentTime);
  685. this.$store.commit("videoPlay/palyTimeUpdate", time);
  686. },
  687. //视频的播放事件
  688. handelVideoPlay() {
  689. if (!this.isVideoPlay) {
  690. Home.microAideoHistoryAdd({ VideoId: this.detailData.ActivityId, SourceType: 2 });
  691. }
  692. this.isVideoPlay = true;
  693. },
  694. // 微路演留言
  695. myLeavingMessageHandler() {
  696. let title = this.detailData.FileType == 1 ? this.detailData.VoiceList.Name : this.detailData.VideoDetail.Title;
  697. uni.navigateTo({
  698. url: "/activityPages/generationAsk/generationAsk?id=" + this.detailData.ActivityId + "&type=文章&roadshow=" + this.detailData.FileType + "&roadshowTitle=" + title,
  699. });
  700. },
  701. // 微路演收藏
  702. async isCollectionHandeler() {
  703. await this.$store.dispatch("showLoginModal");
  704. const res = await Home.microRoadshowCollect({
  705. Id: this.detailData.FileType == 1 ? this.detailData.VoiceList.ActivityVoiceId : this.detailData.VideoDetail.Id,
  706. SourceType: this.detailData.FileType,
  707. PageRouter: this.$store.state.pageRouterReport,
  708. });
  709. if (res.Ret === 200) {
  710. uni.showToast({
  711. title: res.Msg,
  712. duration: 2000,
  713. });
  714. this.detailData.IsCollect = !this.detailData.IsCollect;
  715. }
  716. },
  717. articleLinkHandler() {
  718. if (this.detailData.ArticleList.length === 1) {
  719. uni.navigateTo({
  720. url: "/pageMy/reportDetail/reportDetail?id=" + this.detailData.ArticleList[0].ArticleId,
  721. });
  722. } else {
  723. this.selectShowLink = true;
  724. }
  725. },
  726. // 去往报名详情
  727. goSingUpDetail() {
  728. uni.navigateTo({
  729. url: "/pages-message/activityTemplate/activityTemplate?id=" + this.id,
  730. });
  731. },
  732. },
  733. onLoad(option) {
  734. this.id = option.id || "";
  735. this.isSendWx = option.IsSendWx || "";
  736. // 详情页面不写路径
  737. },
  738. onShow() {
  739. this.getActivityDetail();
  740. this.$store.commit("setRouterReport", "活动详情");
  741. },
  742. /**
  743. * 用户点击分享
  744. */
  745. onShareAppMessage: function (res) {
  746. return {
  747. title: this.isHorzMobile ? "好友向您推荐此内容,上传名片享查研观向免费月卡!" : "活动详情",
  748. path: "/activityPages/activityDetail/activityDetail?id=" + this.id,
  749. success: (res) => {},
  750. fail: (err) => {},
  751. };
  752. },
  753. };
  754. </script>
  755. <style scoped lang="scss">
  756. .activity-detail {
  757. background-color: $uni-color-new;
  758. padding: 25rpx 34rpx 150rpx;
  759. .audio-card-activity {
  760. width: 100%;
  761. padding: 25rpx;
  762. background-color: #fff;
  763. border-radius: 16rpx;
  764. margin-bottom: 25rpx;
  765. .slider {
  766. width: 100%;
  767. margin: 0;
  768. }
  769. .slider-paly {
  770. display: flex;
  771. height: 80rpx;
  772. align-items: center;
  773. padding-left: 20rpx;
  774. }
  775. .card-title {
  776. word-break: break-all;
  777. margin: 40rpx 0 20rpx;
  778. }
  779. .card-time {
  780. display: flex;
  781. justify-content: space-between;
  782. color: #999999;
  783. font-size: 20rpx;
  784. }
  785. .title-image {
  786. display: flex;
  787. justify-content: flex-end;
  788. image {
  789. width: 48rpx;
  790. height: 48rpx;
  791. margin-left: 48rpx;
  792. }
  793. }
  794. .is-paly-card {
  795. width: 70rpx;
  796. height: 70rpx;
  797. flex-shrink: 0;
  798. margin-left: 30rpx;
  799. image {
  800. width: 70rpx;
  801. height: 70rpx;
  802. }
  803. }
  804. .fast-reverse {
  805. display: flex;
  806. align-items: center;
  807. justify-content: center;
  808. margin-top: 30rpx;
  809. .speed-button {
  810. width: 96rpx;
  811. height: 47rpx;
  812. background: #eaeaea;
  813. border-radius: 8rpx;
  814. text-align: center;
  815. line-height: 47rpx;
  816. margin: 0 70rpx;
  817. padding-left: 0;
  818. }
  819. .speed-img {
  820. width: 50rpx;
  821. height: 50rpx;
  822. }
  823. }
  824. }
  825. .video-play {
  826. width: 100%;
  827. video {
  828. width: 100%;
  829. height: 318rpx;
  830. }
  831. }
  832. .new_icon {
  833. width: 60rpx;
  834. height: 30rpx;
  835. margin: 0 20rpx 0rpx 0;
  836. display: inline-block;
  837. vertical-align: middle;
  838. }
  839. .activity-content {
  840. width: 100%;
  841. padding: 20rpx 30rpx 100rpx;
  842. background-color: #fff;
  843. border-radius: 16rpx;
  844. overflow: hidden;
  845. .notice {
  846. margin-bottom: 20rpx;
  847. }
  848. /deep/ .van-notice-bar {
  849. height: 62rpx;
  850. }
  851. .content-title {
  852. margin: 10rpx 0 30rpx;
  853. }
  854. .content-item {
  855. display: flex;
  856. font-size: 28rpx;
  857. line-height: 40rpx;
  858. color: #333;
  859. margin-bottom: 20rpx;
  860. align-items: flex-start;
  861. vertical-align: text-top;
  862. .city {
  863. display: flex;
  864. align-items: center;
  865. image {
  866. width: 28rpx;
  867. height: 28rpx;
  868. }
  869. }
  870. .item-left {
  871. width: 140rpx;
  872. flex-shrink: 0;
  873. }
  874. .item-right {
  875. color: #333;
  876. }
  877. .dustrial-content {
  878. display: flex;
  879. flex-wrap: wrap;
  880. .item {
  881. display: flex;
  882. align-items: center;
  883. padding-left: 0;
  884. margin-left: 0;
  885. }
  886. .dustrial-li {
  887. display: flex;
  888. align-items: center;
  889. font-size: 22rpx;
  890. height: 40rpx;
  891. padding: 0 13rpx;
  892. margin: 0 20rpx 10rpx 0;
  893. background-color: #f0f1f3;
  894. }
  895. .dustrial-item {
  896. padding: 0 20rpx;
  897. background: #e5efff;
  898. border-radius: 4rpx;
  899. color: $uni-color-new;
  900. border-radius: 4rpx;
  901. font-weight: 600;
  902. }
  903. }
  904. .content-item-link {
  905. display: flex;
  906. .copy-link {
  907. flex-shrink: 0;
  908. margin-left: 20rpx;
  909. }
  910. }
  911. }
  912. .content-bottom {
  913. margin-top: 100rpx;
  914. font-size: 24rpx;
  915. font-weight: 600;
  916. .make-outbound {
  917. color: #fff;
  918. margin: 0 auto;
  919. width: 504rpx;
  920. height: 60rpx;
  921. border-radius: 8rpx;
  922. background-color: $uni-color-new;
  923. }
  924. .make-conference {
  925. margin: 20rpx auto;
  926. width: 504rpx;
  927. padding: 12rpx;
  928. line-height: 36rpx;
  929. background-color: #e5efff;
  930. color: $uni-color-new;
  931. border-radius: 8rpx;
  932. view {
  933. font-weight: 400;
  934. font-size: 20rpx;
  935. }
  936. }
  937. .make-conference-remind {
  938. text-align: center;
  939. }
  940. }
  941. }
  942. .top-img-box {
  943. width: 160rpx;
  944. height: 48rpx;
  945. margin: -20rpx 0 0 -30rpx;
  946. }
  947. .sign-in-img-box {
  948. width: 704rpx;
  949. height: 1121rpx;
  950. background-color: #fff;
  951. border-radius: 8rpx;
  952. overflow: hidden;
  953. image {
  954. width: 100%;
  955. height: calc(100% - 108rpx);
  956. }
  957. .button-box {
  958. display: flex;
  959. align-items: center;
  960. height: 102rpx;
  961. border-top: 1rpx solid #f0f0f0;
  962. text {
  963. flex: 1;
  964. height: 100%;
  965. display: flex;
  966. align-items: center;
  967. justify-content: center;
  968. }
  969. text:last-child {
  970. border-left: 1rpx solid #f0f0f0;
  971. color: #3385ff;
  972. }
  973. }
  974. }
  975. .custom-class-popup {
  976. border-radius: 8rpx;
  977. overflow: hidden;
  978. }
  979. }
  980. </style>