| 
									
										
										
										
											2025-01-28 15:25:35 +08:00
										 |  |  | <template> | 
					
						
							|  |  |  |   <!-- 竖屏 playStyle: 1-竖屏 2-横屏--> | 
					
						
							|  |  |  |   <SScreen | 
					
						
							|  |  |  |     v-if=" | 
					
						
							|  |  |  |       videoDetail.playStyle === 1 && | 
					
						
							|  |  |  |       isPlay && | 
					
						
							|  |  |  |       ![5, 6].includes(videoDetail.status) | 
					
						
							|  |  |  |     " | 
					
						
							|  |  |  |     :detail="videoDetail" | 
					
						
							|  |  |  |   ></SScreen> | 
					
						
							|  |  |  |   <HScreen | 
					
						
							|  |  |  |     :detail="videoDetail" | 
					
						
							|  |  |  |     v-else-if="isPlay && ![5, 6].includes(videoDetail.status)" | 
					
						
							|  |  |  |     @updateVideoDetail="updateVideoDetail" | 
					
						
							|  |  |  |   /> | 
					
						
							|  |  |  |   <NoLookTip v-if="[5, 6].includes(videoDetail.status)" text="该视频已下架" /> | 
					
						
							| 
									
										
										
										
											2025-02-11 21:47:01 +08:00
										 |  |  |   <NoLookTip | 
					
						
							|  |  |  |     v-else-if="noAuth" | 
					
						
							|  |  |  |     :text="`${store.state.userInfo.account}账号暂无服务权限,请联系小助理开通`" | 
					
						
							|  |  |  |   /> | 
					
						
							| 
									
										
										
										
											2025-01-28 15:25:35 +08:00
										 |  |  |   <van-dialog | 
					
						
							|  |  |  |     v-model:show="showCodeDialog" | 
					
						
							|  |  |  |     title="观看权限提示" | 
					
						
							|  |  |  |     show-cancel-button | 
					
						
							|  |  |  |     @confirm="getLiveLimit" | 
					
						
							|  |  |  |     @cancel="toBack" | 
					
						
							|  |  |  |   > | 
					
						
							|  |  |  |     <div class="code-content"> | 
					
						
							|  |  |  |       <p class="tip-text">当前直播需输入邀请码才可观看</p> | 
					
						
							|  |  |  |       <van-field v-model.trim="code" placeholder="请输入邀请码" /> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |   </van-dialog> | 
					
						
							|  |  |  | </template> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <script setup> | 
					
						
							|  |  |  | import { ref, computed, onBeforeUnmount } from "vue"; | 
					
						
							|  |  |  | import { useRoute, useRouter } from "vue-router"; | 
					
						
							|  |  |  | import { showConfirmDialog, showToast, showDialog } from "vant"; | 
					
						
							|  |  |  | import { queryVideoDetail } from "@/api/video"; | 
					
						
							|  |  |  | import { queryLiveLimit } from "@/api/video"; | 
					
						
							|  |  |  | import { useStore } from "vuex"; | 
					
						
							|  |  |  | import emitter from "@/utils/emitter"; | 
					
						
							|  |  |  | import HScreen from "./HScreen.vue"; | 
					
						
							|  |  |  | import SScreen from "./SScreen.vue"; | 
					
						
							|  |  |  | import NoLookTip from "@/components/NoLookTip.vue"; | 
					
						
							|  |  |  | // import { checkAuthIds } from "@/hooks/useHasAuth";
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const route = useRoute(); | 
					
						
							|  |  |  | const store = useStore(); | 
					
						
							|  |  |  | const router = useRouter(); | 
					
						
							|  |  |  | // 之前是否已经进行邀请码校验且通过校验
 | 
					
						
							|  |  |  | const codeVerify = localStorage.getItem( | 
					
						
							|  |  |  |   `${store.state.userInfo.account}-${route.query.id}-code` | 
					
						
							|  |  |  | ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const showCodeDialog = computed(() => { | 
					
						
							|  |  |  |   if (videoDetail.value.limitType === 3 && !isPlay.value && !codeVerify) { | 
					
						
							|  |  |  |     // 邀请码
 | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const videoDetail = ref({}); | 
					
						
							|  |  |  | const isPlay = ref(false); // 当直播限制需要验证码登录的时候,验证码校验通过才能播放
 | 
					
						
							|  |  |  | const noAuth = ref(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const getVideoDetail = async () => { | 
					
						
							|  |  |  |   // await sendBrowseInfo({ id: route.query.id });
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   let ret = await queryVideoDetail({ | 
					
						
							|  |  |  |     videoId: route.query.id, | 
					
						
							|  |  |  |     saleUserId: route.query.saleUserId ? route.query.saleUserId : "", | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   if (ret.code === 6013) { | 
					
						
							|  |  |  |     noAuth.value = true; | 
					
						
							|  |  |  |   } else if (ret.code === 0) { | 
					
						
							| 
									
										
										
										
											2025-02-11 21:47:01 +08:00
										 |  |  |     document.title = ret.data.title; | 
					
						
							| 
									
										
										
										
											2025-01-28 15:25:35 +08:00
										 |  |  |     // limitType	直播限制 1不限制 2手机号 3邀请码 4微信授权 5产品专属直播 6 权限号
 | 
					
						
							|  |  |  |     if ( | 
					
						
							|  |  |  |       [1].includes(ret.data.limitType) || | 
					
						
							|  |  |  |       (ret.data.limitType === 3 && codeVerify) || | 
					
						
							|  |  |  |       (ret.data.limitType === 2 && store.state.token) | 
					
						
							|  |  |  |     ) { | 
					
						
							|  |  |  |       isPlay.value = true; | 
					
						
							|  |  |  |     } else if (ret.data.limitType === 6) { | 
					
						
							|  |  |  |       const authResultVo = ret.data.authResultVo || {}; | 
					
						
							|  |  |  |       isPlay.value = !!authResultVo.auth; | 
					
						
							|  |  |  |       noAuth.value = !authResultVo.auth; | 
					
						
							|  |  |  |       // if (checkAuthIds(ret.data.authIds, store.getters.authorityIdList)) {
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // } else {
 | 
					
						
							|  |  |  |       //   noAuth.value = true;
 | 
					
						
							|  |  |  |       // }
 | 
					
						
							|  |  |  |       if (authResultVo.auth) { | 
					
						
							|  |  |  |         if (authResultVo.riskUrl) { | 
					
						
							|  |  |  |           showDialog({ | 
					
						
							|  |  |  |             title: "提示", | 
					
						
							|  |  |  |             message: `您当前订单尚未完成风险测评,无法查看产品服务内容,请点击完成风险测评`, | 
					
						
							|  |  |  |             confirmButtonText: "去测评", | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |             .then(() => { | 
					
						
							|  |  |  |               location.href = | 
					
						
							|  |  |  |                 authResultVo.riskUrl + | 
					
						
							|  |  |  |                 `&callbackUrl=${encodeURIComponent(location.href)}`; | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             .catch(() => { | 
					
						
							|  |  |  |               router.go(-1); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |         } else if (authResultVo.contractUrl) { | 
					
						
							|  |  |  |           showDialog({ | 
					
						
							|  |  |  |             title: "提示", | 
					
						
							|  |  |  |             message: `您当前订单尚未完成合同签署,无法查看产品服务内容,请点击完成合同签署`, | 
					
						
							|  |  |  |             confirmButtonText: "去签署", | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |             .then(() => { | 
					
						
							|  |  |  |               location.href = | 
					
						
							|  |  |  |                 authResultVo.contractUrl + | 
					
						
							|  |  |  |                 `&contractCallbackUrl=${encodeURIComponent(location.href)}`; | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             .catch(() => { | 
					
						
							|  |  |  |               router.go(-1); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else if (ret.data.limitType === 5) { | 
					
						
							|  |  |  |       getLiveLimit(); | 
					
						
							|  |  |  |     } else if (ret.data.limitType === 2 && !store.state.token) { | 
					
						
							|  |  |  |       router.push({ | 
					
						
							|  |  |  |         path: "/login", | 
					
						
							|  |  |  |         query: { | 
					
						
							|  |  |  |           redirect: route.fullPath, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     videoDetail.value = ret.data; | 
					
						
							|  |  |  |     window.shareApi.initWxH5({ | 
					
						
							|  |  |  |       env: window.config.shareEnv, | 
					
						
							|  |  |  |       shareusername: store.state.userInfo.account, | 
					
						
							|  |  |  |       title: videoDetail.value.title, | 
					
						
							|  |  |  |       summary: videoDetail.value.viewPoint, | 
					
						
							|  |  |  |       linkurl: location.href, | 
					
						
							|  |  |  |       img: videoDetail.value.imgUrl, | 
					
						
							|  |  |  |       business: "wzfxgkd", | 
					
						
							|  |  |  |       type: "wechat", | 
					
						
							|  |  |  |       id: videoDetail.value.id, | 
					
						
							|  |  |  |       source: "40156", | 
					
						
							|  |  |  |       authorname: videoDetail.value.advisorBasic?.showName, | 
					
						
							|  |  |  |       authornickname: "h5分享", | 
					
						
							|  |  |  |       successFun: function (res) { | 
					
						
							|  |  |  |         // option.url = res.shorturl;
 | 
					
						
							|  |  |  |         // window.shareApi.init(option);
 | 
					
						
							|  |  |  |         console.log("分享成功", res); | 
					
						
							|  |  |  |         emitter.emit("onShareInform"); | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // let extRet = await queryVideoExt({
 | 
					
						
							|  |  |  |     //   videoId: route.query.id,
 | 
					
						
							|  |  |  |     //   saleUserId: route.query.saleUserId ? route.query.saleUserId : "",
 | 
					
						
							|  |  |  |     // }).catch((error) => {
 | 
					
						
							|  |  |  |     //   console.log("queryVideoExt", error);
 | 
					
						
							|  |  |  |     // });
 | 
					
						
							|  |  |  |     // if (extRet.code === 0) {
 | 
					
						
							|  |  |  |     //   Object.assign(videoDetail.value, ret.data);
 | 
					
						
							|  |  |  |     // }
 | 
					
						
							|  |  |  |     // liveCustomerSave({
 | 
					
						
							|  |  |  |     //   channel: route.query.saleUserId ? 2 : 1,
 | 
					
						
							|  |  |  |     //   comId: "",
 | 
					
						
							|  |  |  |     //   deptId: "",
 | 
					
						
							|  |  |  |     //   riskLevel: videoDetail.value.riskLevel,
 | 
					
						
							|  |  |  |     //   saleUserId: route.query.saleUserId ? route.query.saleUserId : "",
 | 
					
						
							|  |  |  |     //   userId: store.state.userInfo.account,
 | 
					
						
							|  |  |  |     //   userName: store.state.userInfo.userName,
 | 
					
						
							|  |  |  |     //   zjzh: store.state.userInfo.account,
 | 
					
						
							|  |  |  |     //   imgUrl: store.state.userInfo.imgUrl,
 | 
					
						
							|  |  |  |     //   videoId: videoDetail.value.id,
 | 
					
						
							|  |  |  |     // });
 | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | getVideoDetail(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const code = ref(""); | 
					
						
							|  |  |  | const getLiveLimit = async () => { | 
					
						
							|  |  |  |   let ret = await queryLiveLimit({ | 
					
						
							|  |  |  |     videoId: route.query.id, | 
					
						
							|  |  |  |     code: code.value, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   if (ret.code === 0) { | 
					
						
							|  |  |  |     if (ret.data.res) { | 
					
						
							|  |  |  |       // 检验通过
 | 
					
						
							|  |  |  |       if (ret.data.limitType === 3) { | 
					
						
							|  |  |  |         localStorage.setItem( | 
					
						
							|  |  |  |           `${store.state.userInfo.account}-${route.query.id}-code`, | 
					
						
							|  |  |  |           true | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       isPlay.value = true; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       if (ret.data.limitType === 5) { | 
					
						
							|  |  |  |         showConfirmDialog({ | 
					
						
							|  |  |  |           title: "提示", | 
					
						
							|  |  |  |           message: `该直播为【${videoDetail.value.infoVO?.productName}】专属直播服务,订阅产品后即可观看。`, | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |           .then(() => { | 
					
						
							|  |  |  |             location.href = `${location.origin}/tgh5/viewpackageDetail/${videoDetail.value.infoVO?.productId}`; | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |           .catch(() => { | 
					
						
							|  |  |  |             router.go(-1); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |       } else if (ret.data.limitType === 3) { | 
					
						
							|  |  |  |         showToast("邀请码输入错误!"); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // 更新视频详情对象
 | 
					
						
							|  |  |  | const updateVideoDetail = (obj = {}) => { | 
					
						
							|  |  |  |   Object.assign(videoDetail.value, obj); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | emitter.on("updateVideoDetail", updateVideoDetail); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | onBeforeUnmount(() => { | 
					
						
							|  |  |  |   emitter.off("updateVideoDetail"); | 
					
						
							|  |  |  |   store.commit("resetInteractMsgObj"); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const toBack = () => { | 
					
						
							|  |  |  |   if (route.query.sdk) { | 
					
						
							| 
									
										
										
										
											2025-02-11 21:47:01 +08:00
										 |  |  |     console.log("sdk返回"); | 
					
						
							| 
									
										
										
										
											2025-01-28 15:25:35 +08:00
										 |  |  |   } else if (route.query.source === "c") { | 
					
						
							|  |  |  |     router.go(-1); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     if (window.history.state.back) { | 
					
						
							|  |  |  |       router.go(-1); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       if ( | 
					
						
							|  |  |  |         typeof window.WeixinJSBridge == "object" && | 
					
						
							|  |  |  |         typeof window.WeixinJSBridge.invoke == "function" | 
					
						
							|  |  |  |       ) { | 
					
						
							|  |  |  |         window.WeixinJSBridge.invoke("closeWindow", {}, function (res) { | 
					
						
							|  |  |  |           console.log(res); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         window.close(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | </script> | 
					
						
							|  |  |  | <style scoped lang="scss"> | 
					
						
							|  |  |  | .code-content { | 
					
						
							|  |  |  |   padding: 30px 50px 30px; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   p { | 
					
						
							|  |  |  |     margin-bottom: 20px; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ::v-deep .tcp-skin .vjs-big-play-button { | 
					
						
							|  |  |  |   z-index: 3; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | </style> |