index.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. <!-- -->
  2. <template>
  3. <div class="chart-show">
  4. <header class="chart-header" @click="openNew">
  5. <span
  6. class="chart-title"
  7. :style="chartInfo.ChartThemeStyle?`
  8. text-align:${JSON.parse(chartInfo.ChartThemeStyle).titleOptions.align};
  9. font-size:${JSON.parse(chartInfo.ChartThemeStyle).titleOptions.style.fontSize}px;
  10. color:${JSON.parse(chartInfo.ChartThemeStyle).titleOptions.style.color}
  11. `:''"
  12. >
  13. {{ language === 'en'?(chartInfo.ChartNameEn||chartInfo.ChartName): chartInfo.ChartName}}
  14. </span>
  15. <div class="copy-icon" @click.stop="copyText">
  16. <img src="@/assets/img/copy.png" alt="" width="20" height="20">
  17. </div>
  18. </header>
  19. <template v-if="haveData">
  20. <div
  21. class="chart-wrapper"
  22. id="chart-wrapper"
  23. v-loading="loading"
  24. element-loading-text="加载中..."
  25. >
  26. <chart
  27. :options="options"
  28. :chartId="chartInfo.ChartInfoId || 0" :chartInfo="chartInfo"
  29. />
  30. <div class="mark"></div>
  31. </div>
  32. </template>
  33. <div class="chart-wrapper notfound" v-else>
  34. <i class="el-icon-warning"></i>哎吆,你的图飞了,赶快去找管理员救命吧~
  35. </div>
  36. <!-- 图表来源说明 -->
  37. <div
  38. class="chart-bottom-info bootom-source"
  39. v-if="chartInfo.Instructions&&JSON.parse(chartInfo.Instructions).isShow
  40. ">
  41. <!-- 图表说明 -->
  42. <div
  43. class="chart-instruction text_oneLine"
  44. v-text="JSON.parse(chartInfo.Instructions).text"
  45. :style="`
  46. color: ${JSON.parse(chartInfo.Instructions).color};
  47. font-size: ${ JSON.parse(chartInfo.Instructions).fontSize }px
  48. `"
  49. ></div>
  50. </div>
  51. <div class="bootom-source">
  52. <!-- 自定义来源 -->
  53. <div>
  54. <div class="chart-source text_oneLine"
  55. v-if="chartInfo.SourcesFrom&&JSON.parse(chartInfo.SourcesFrom).isShow"
  56. :style="`
  57. color: ${ JSON.parse(chartInfo.SourcesFrom).color };
  58. font-size: ${ JSON.parse(chartInfo.SourcesFrom).fontSize }px;
  59. `"
  60. >
  61. source:<em>{{ JSON.parse(chartInfo.SourcesFrom).text}}</em>
  62. </div>
  63. </div>
  64. <ul class="right-action" @click.stop>
  65. <li v-if="$route.query.source==='ybxcx'"><collectBtn/></li>
  66. <!-- eta小程序报告详情中的有收藏 -->
  67. <li v-if="$route.query.source==='etamini'" @click="handleChangeChartCollect">{{IsCollect?'取消收藏':'收藏'}}</li>
  68. <li v-if="$route.query.source==='ht_chart'"><collectBtnHT/></li>
  69. <li @click="copyUrl" class="copy" v-if="isShare"><i class="el-icon-share"/>分享</li>
  70. <li @click="refreshChart" v-if="chartInfo.UniqueCode&&$route.query.source!=='smartReportGetImg'"><i class="el-icon-refresh"/>刷新</li>
  71. </ul>
  72. </div>
  73. </div>
  74. </template>
  75. <script lang="ts">
  76. import { defineComponent, reactive, toRefs, onMounted, ref, nextTick } from 'vue';
  77. import { ElMessage } from 'element-plus';
  78. import _ from 'lodash';
  79. import { useRoute } from 'vue-router';
  80. import chart from '@/components/chart.vue';
  81. import { IState } from './typing';
  82. import { ChartApi } from '@/request/api';
  83. import collectBtn from './components/collectBtn.vue'
  84. import collectBtnHT from './components/collectBtnHT.vue'
  85. import { useChartRender } from '@/hooks/chart/useChartRender';
  86. export default defineComponent({
  87. components: {
  88. chart,
  89. collectBtn,
  90. collectBtnHT
  91. },
  92. setup() {
  93. const route = useRoute();
  94. const state = reactive<IState>({
  95. options: {},
  96. chartInfo: {},
  97. dataList: [],
  98. sourceName: ''
  99. });
  100. onMounted(() => {
  101. getChartInfo();
  102. });
  103. // 打开新窗口
  104. const openNew = (): void => {
  105. window.open(window.location.href,'_blank');
  106. }
  107. /* 获取图表数据信息 */
  108. const loading = ref(false);
  109. const haveData = ref(false);
  110. const code = ref(route.query.code);
  111. const isShare = ref(route.query.fromType === 'share');
  112. // 语言 中英文 ch en 默认中文
  113. const language = ref(route.query.fromPage || route.query.lang || 'zh');
  114. const IsCollect=ref(false)//图表是否收藏
  115. const getChartInfo = async (type='') => {
  116. localStorage.setItem('token', `Bearer ${route.query.token}`)
  117. if(!code.value) {
  118. haveData.value = false;
  119. return
  120. }
  121. loading.value = true;
  122. try {
  123. let params={
  124. UniqueCode: code.value || '',
  125. }
  126. // 如果是来自etamini 也就是eta小程序的报告详情
  127. if(route.query.source==='etamini'){
  128. params.Source=1
  129. params.Token=route.query.token
  130. }
  131. if(route.query.source==='ht_chart'){
  132. params.MiniSource='ht'
  133. }
  134. const { Data } = await ChartApi.getChart(params);
  135. loading.value = false;
  136. state.chartInfo = Data.ChartInfo;
  137. IsCollect.value=Data.IsCollect
  138. state.dataList = Data.ChartInfo.Source === 1 ? Data.EdbInfoList : [Data.EdbInfoList[0]];
  139. //处理英文研报英文设置不全就展示中文
  140. // setLangFromEnReport();
  141. document.title = language.value==='zh'?Data.ChartInfo.ChartName:Data.ChartInfo.ChartNameEn;
  142. state.options = useChartRender(Data,language.value)
  143. haveData.value = true;
  144. type === 'refresh' && ElMessage.success('刷新成功');
  145. //水印配置
  146. nextTick(()=>{
  147. const markDom = document.querySelector('.mark')
  148. Data.WaterMark&&(markDom.style.backgroundImage = `url(${Data.WaterMark})`)
  149. })
  150. }catch (e) {
  151. loading.value = false;
  152. haveData.value = false;
  153. }
  154. };
  155. /* 复制标题 */
  156. const copyText = () => {
  157. const { chartInfo } = state;
  158. let input = document.createElement("input");
  159. input.value = chartInfo.ChartName;
  160. document.body.appendChild(input)
  161. input.select();
  162. document.execCommand('copy');
  163. document.body.removeChild(input);
  164. ElMessage.success('复制标题成功')
  165. }
  166. /* 分享链接 */
  167. const copyUrl = () => {
  168. let input = document.createElement("input");
  169. input.value = location.href;
  170. document.body.appendChild(input)
  171. input.select();
  172. document.execCommand('copy');
  173. document.body.removeChild(input);
  174. ElMessage.success('复制链接成功')
  175. }
  176. const refreshChart = _.debounce(async () => {
  177. loading.value = true;
  178. let res: any=null
  179. if([1,6,7,8,9,10,11,12].includes(state.chartInfo.Source)){
  180. res=await ChartApi.refreshChart({UniqueCode: state.chartInfo.UniqueCode})
  181. }else if([2,5].includes(state.chartInfo.Source)){
  182. res=await ChartApi.refreshCommordityChart({UniqueCode: state.chartInfo.UniqueCode});
  183. }else if([3,4].includes(state.chartInfo.Source)){
  184. res=await ChartApi.refreshRelevanceChart({UniqueCode: state.chartInfo.UniqueCode});
  185. }
  186. loading.value = false;
  187. res.Ret === 200 && getChartInfo('refresh');
  188. },400)
  189. // 点击收藏\取消收藏
  190. const handleChangeChartCollect=async ()=>{
  191. const params={
  192. UniqueCode:code.value || '',
  193. Token:route.query.token,
  194. }
  195. const res=IsCollect.value?await ChartApi.chartCollectCancel(params):await ChartApi.chartCollect(params)
  196. if(res.Ret===200){
  197. ElMessage.success(IsCollect.value?'取消收藏成功':'收藏成功')
  198. IsCollect.value=!IsCollect.value
  199. }
  200. }
  201. return {
  202. ...toRefs(state),
  203. loading,
  204. haveData,
  205. getChartInfo,
  206. openNew,
  207. copyUrl,
  208. isShare,
  209. language,
  210. refreshChart,
  211. copyText,
  212. handleChangeChartCollect,
  213. IsCollect
  214. };
  215. },
  216. });
  217. </script>
  218. <style scoped lang="less">
  219. @import './index.less';
  220. </style>