activityDetail.vue 39 KB

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