index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. <template>
  2. <div class="report">
  3. <div class="ins_echart_headers">
  4. <div class="ins_headers_flx">
  5. <div class="nums n4">
  6. 客户需求:{{ dataValue.orderData.orderTotalNum || 0 }}个
  7. </div>
  8. </div>
  9. <div class="ins_headers_flx">
  10. <select-time @handleSelectTime="handleSelectTime($event, 0)" />
  11. </div>
  12. <el-button type="success" @click="handleClubDialog(1)">机构活跃信息</el-button>
  13. <el-button type="success" @click="handleClubDialog(2)">机构资料</el-button>
  14. </div>
  15. <div class="ins_keword">
  16. <hot-tips :keyword-data="keywordData" />
  17. </div>
  18. <div class="ins_rcharts_main">
  19. <div class="ins_rcharts_item">
  20. <div class="ins_echart_headers">
  21. <div class="ins_headers_flx">
  22. <div class="nums">
  23. 订单数量:{{ dataValue.orderData.orderTotalNum || 0 }}个
  24. </div>
  25. </div>
  26. <div class="ins_headers_flx">
  27. <select-time @handleSelectTime="handleSelectTime($event, 1)" />
  28. </div>
  29. </div>
  30. <div class="ins_statistics">
  31. <div class="content">
  32. <pie-echarts :option-data="dataValue.orderData" :title="'订单'" />
  33. </div>
  34. </div>
  35. </div>
  36. <div class="ins_rcharts_item">
  37. <div class="ins_echart_headers">
  38. <div class="ins_headers_flx">
  39. <div class="nums">
  40. 关键词数量:{{ dataValue.keyWordsData.count || 0 }}个
  41. </div>
  42. </div>
  43. <div class="ins_headers_flx">
  44. <select-time @handleSelectTime="handleSelectTime($event, 2)" />
  45. </div>
  46. </div>
  47. <div class="ins_trends">
  48. <bar-echarts :option-data="dataValue.keyWordsData.data" :title="'搜索关键词'" />
  49. </div>
  50. </div>
  51. </div>
  52. <div class="ins_rcharts_main">
  53. <div class="ins_rcharts_item">
  54. <div class="ins_echart_headers">
  55. <div class="ins_headers_flx">
  56. <div class="nums">咨询数量:
  57. <span class="line" @click="handleRouter(1)">{{ dataValue.consultData.count || 0 }}个</span>
  58. </div>
  59. </div>
  60. <div class="ins_headers_flx">
  61. <select-time @handleSelectTime="handleSelectTime($event, 3)" />
  62. </div>
  63. </div>
  64. <div class="ins_trends">
  65. <bar-echarts :option-data="dataValue.consultData.data" :title="'咨询记录'" />
  66. </div>
  67. </div>
  68. <div class="ins_rcharts_item">
  69. <div class="ins_echart_headers">
  70. <div class="ins_headers_flx">
  71. <div class="nums">访问数量:
  72. <span class="line" @click="handleRouter(2)">{{ dataValue.accessData.count || 0 }}个</span>
  73. </div>
  74. </div>
  75. <div class="ins_headers_flx">
  76. <select-time @handleSelectTime="handleSelectTime($event, 4)" />
  77. </div>
  78. </div>
  79. <div class="ins_trends">
  80. <bar-echarts :option-data="dataValue.accessData.data" :title="'访问记录'" />
  81. </div>
  82. </div>
  83. </div>
  84. <!-- 信息弹窗 -->
  85. <club-dialog v-if="dialogVisible" :dialog-type="dialogType" @cancel="handleCancel" />
  86. </div>
  87. </template>
  88. <script>
  89. import SelectTime from './components/select-time'
  90. import PieEcharts from './components/pei-echarts.vue'
  91. import BarEcharts from './components/bar-echarts.vue'
  92. import HotTips from './components/hot-tips.vue'
  93. import ClubDialog from './components/club-dialog.vue'
  94. import {
  95. getIns_statistics,
  96. getIns_orderTrends,
  97. getIns_accessStatistics
  98. } from '@/api/mallPortrait/disitrib'
  99. export default {
  100. components: {
  101. ClubDialog,
  102. SelectTime,
  103. PieEcharts,
  104. BarEcharts,
  105. HotTips
  106. },
  107. data() {
  108. return {
  109. clubId: '',
  110. clubName: '',
  111. dialogVisible: false,
  112. dialogType: 1,
  113. keywordData: [
  114. { text: '品牌logo', label: 1 },
  115. { text: '品牌logo', label: 1 },
  116. { text: '品牌logo', label: 1 },
  117. { text: '品牌logo', label: 1 },
  118. { text: '品牌logo', label: 1 },
  119. { text: '品牌logo', label: 1 },
  120. { text: '品牌logo', label: 1 },
  121. { text: '品牌logo', label: 1 },
  122. { text: '品牌logo', label: 1 },
  123. { text: '品牌logo', label: 1 },
  124. { text: '品牌logo', label: 1 },
  125. { text: '品牌名称', label: 1 },
  126. { text: '品牌名称', label: 1 },
  127. { text: '品牌名称', label: 1 },
  128. { text: 'TOP', label: 0 },
  129. { text: 'TOP', label: 0 },
  130. { text: 'TOP', label: 0 }
  131. ],
  132. storeColumns: [
  133. { text: '商品图片', label: 'image', labelWidth: 80 },
  134. { text: '商品名称', label: 'name' },
  135. { text: 'TOP', label: 'TOP', labelWidth: 80 }
  136. ],
  137. keyColumns: [
  138. { text: '搜索词', labelWidth: 120 },
  139. { text: 'TOP', label: 'TOP' }
  140. ],
  141. dataValue: {
  142. // 机构活跃度统计
  143. clubActivityCount: {
  144. data: {
  145. 不活跃机构: 0,
  146. 活跃机构: 0
  147. }
  148. },
  149. // 订单统计
  150. orderData: {
  151. orderTotalNum: 1,
  152. name: '订单总量',
  153. color: ['#3aa0ff', '#36cbcb', '#fad337', '#4dcb73', '#f2637b', '#975fe4'],
  154. seriesData: [
  155. {
  156. name: '普通订单 【100%】 【1个】',
  157. value: 1
  158. },
  159. {
  160. name: '二手订单 【 0 %】 【0个】',
  161. value: 0
  162. }
  163. ]
  164. },
  165. // 咨询记录
  166. consultData: {
  167. data: {
  168. name: '咨询记录',
  169. yAxisData: [
  170. '撒肯德基阿拉基',
  171. '水阿斯达四大光',
  172. '士大夫撒多发生的',
  173. 'asdas阿瑟的',
  174. '奥术大师大所多',
  175. '第三方士大夫',
  176. '从VB餐补v',
  177. '水电费'
  178. ],
  179. xAxisData: [1, 1, 2, 2, 2, 3, 5, 6],
  180. color: '#FF5B00'
  181. },
  182. count: 11
  183. },
  184. keyWordsData: {
  185. data: {
  186. name: '搜索关键词',
  187. yAxisData: [
  188. '热玛吉',
  189. '水光',
  190. '超清秀',
  191. '黄金微针',
  192. 'LDM',
  193. '皮秒',
  194. '检测',
  195. '水光仪'
  196. ],
  197. xAxisData: [1, 1, 2, 2, 2, 3, 5, 6],
  198. color: '#07c160'
  199. },
  200. count: 11
  201. },
  202. // 访问记录
  203. accessData: {
  204. data: {
  205. name: '访问记录',
  206. yAxisData: [
  207. '玩儿玩儿',
  208. '让他也让他也让他',
  209. '日也同样',
  210. '水电费',
  211. '发挂号费',
  212. 'CVBS',
  213. '不你们部门',
  214. '电饭锅电饭锅'
  215. ],
  216. xAxisData: [1, 1, 2, 2, 2, 3, 5, 6],
  217. color: '#6585fa'
  218. },
  219. count: 11
  220. },
  221. // 机构新增趋势
  222. addClubCount: {},
  223. // 机构订单趋势
  224. clubOrder: {},
  225. // 机构访问统计
  226. record: {},
  227. // 机构咨询统计
  228. remarks: {
  229. data: {
  230. 游客咨询: 0,
  231. 机构咨询: 0
  232. }
  233. },
  234. // 热门品牌
  235. brandProductSalesRecords: [],
  236. // 热门商品
  237. productSalesRecords: [],
  238. // 热搜词
  239. keywords: []
  240. },
  241. timeList: [
  242. {
  243. id: 5,
  244. content: '近一周'
  245. },
  246. {
  247. id: 2,
  248. content: '近1月'
  249. },
  250. {
  251. id: 3,
  252. content: '近6月'
  253. },
  254. {
  255. id: 4,
  256. content: '近1年'
  257. }
  258. ]
  259. }
  260. },
  261. created() {
  262. this.clubId = this.$route.query.clubId
  263. this.clubName = this.$route.query.clubName
  264. },
  265. methods: {
  266. handleRouter(type) {
  267. switch (type) {
  268. case 1: // 咨询记录
  269. this.$router.push({
  270. path: '/user/consult/list',
  271. query: { clubName: this.clubName, clubId: this.clubId }
  272. })
  273. break
  274. case 2: // 行为记录
  275. this.$router.push({
  276. path: '/user/record-list',
  277. query: { type: 'first', corporateName: this.clubName, clubId: this.clubId }
  278. })
  279. break
  280. }
  281. },
  282. handleClubDialog(type) {
  283. this.dialogType = type
  284. this.dialogVisible = true
  285. },
  286. handleCancel() {
  287. this.dialogVisible = false
  288. },
  289. /**
  290. * 获取机构需求
  291. */
  292. async getCulbDemand(e) {
  293. const { data } = await getIns_orderTrends({
  294. startCreateTime: e[0],
  295. endCreateTime: e[1]
  296. })
  297. this.dataValue.clubActivityCount = data.clubActivityCount
  298. this.dataValue.clubCount = data.clubCount
  299. },
  300. /**
  301. * 机构订单数据
  302. */
  303. async getIns_statistics(e) {
  304. const { data } = await getIns_statistics({
  305. startCreateTime: e[0],
  306. endCreateTime: e[1]
  307. })
  308. this.dataValue.clubActivityCount = data.clubActivityCount
  309. this.dataValue.clubCount = data.clubCount
  310. },
  311. /**
  312. * 获取机构搜索词
  313. */
  314. async getIns_orderTrends(e) {
  315. const { data } = await getIns_orderTrends({
  316. startCreateTime: e[0],
  317. endCreateTime: e[1]
  318. })
  319. this.dataValue.addClubCount = data.clubCount
  320. this.dataValue.clubOrder = data.clubOrder
  321. },
  322. /**
  323. * 获取机构咨询数据
  324. */
  325. async getIns_accessS(e) {
  326. const { data } = await getIns_accessStatistics({
  327. startCreateTime: e[0],
  328. endCreateTime: e[1]
  329. })
  330. this.dataValue.record = data.record
  331. this.dataValue.remarks = data.remarks
  332. this.dataValue.brandProductSalesRecords = data.brandProductSalesRecords
  333. this.dataValue.productSalesRecords = data.productSalesRecords
  334. this.dataValue.keywords = data.keywords
  335. },
  336. /**
  337. * 获取机构访问记录数据
  338. */
  339. async getIns_accessStatistics(e) {
  340. const { data } = await getIns_accessStatistics({
  341. startCreateTime: e[0],
  342. endCreateTime: e[1]
  343. })
  344. this.dataValue.record = data.record
  345. this.dataValue.remarks = data.remarks
  346. this.dataValue.brandProductSalesRecords = data.brandProductSalesRecords
  347. this.dataValue.productSalesRecords = data.productSalesRecords
  348. this.dataValue.keywords = data.keywords
  349. },
  350. handleSelectTime(e, num) {
  351. const obj = {
  352. 0: () => this.getCulbDemand(e), // 机构需求
  353. 1: () => this.getIns_statistics(e),
  354. 2: () => this.getIns_orderTrends(e),
  355. 3: () => this.getIns_accessStatistics(e),
  356. 4: () => this.getIns_accessStatistics(e)
  357. }
  358. obj[num]()
  359. }
  360. }
  361. }
  362. </script>
  363. <style lang="scss" scoped>
  364. .report {
  365. padding: 20px;
  366. background-size: contain;
  367. .ins_header {
  368. width: 100%;
  369. height: auto;
  370. box-sizing: border-box;
  371. .flex-header-main {
  372. width: 100%;
  373. height: 100%;
  374. box-sizing: border-box;
  375. padding: 10px 0;
  376. text-align: right;
  377. }
  378. }
  379. .ins_echart_headers {
  380. width: 100%;
  381. height: auto;
  382. display: flex;
  383. flex-direction: row;
  384. align-items: center;
  385. .ins_headers_flx {
  386. display: flex;
  387. flex-direction: row;
  388. align-items: center;
  389. margin: 0 10px;
  390. .line{
  391. text-decoration: underline;
  392. cursor: pointer;
  393. }
  394. }
  395. }
  396. .ins_rcharts_main {
  397. display: grid;
  398. align-items: center;
  399. grid-template-columns: 1fr 1fr;
  400. grid-gap: 1vw;
  401. margin-bottom: 14px;
  402. }
  403. .ins_keword {
  404. display: grid;
  405. align-items: center;
  406. grid-template-columns: 1fr;
  407. grid-gap: 1vw;
  408. margin-bottom: 14px;
  409. }
  410. .ins_statistics {
  411. display: grid;
  412. align-items: center;
  413. grid-template-columns: 1fr;
  414. grid-gap: 1vw;
  415. margin-bottom: 14px;
  416. }
  417. .ins_deStatistics {
  418. display: grid;
  419. align-items: center;
  420. grid-template-columns: 1fr 1fr;
  421. grid-gap: 1vw;
  422. margin-bottom: 14px;
  423. }
  424. }
  425. .label {
  426. font-size: 16px;
  427. font-weight: 600;
  428. margin-right: 20px;
  429. }
  430. .nums {
  431. font-size: 16px;
  432. color: #00aeff;
  433. font-weight: 600;
  434. }
  435. .tips {
  436. font-size: 14px;
  437. color: #ccc;
  438. }
  439. .e-title {
  440. font-size: 14px;
  441. color: #ccc;
  442. text-align: center;
  443. }
  444. .hot-content {
  445. display: grid;
  446. grid-template-columns: 2fr 2fr 1.5fr;
  447. grid-gap: 14px;
  448. }
  449. </style>