scene-report.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. import * as echarts from '../ec-canvas/echarts'
  2. import { mergeOptions } from '../ec-canvas/defaultOption'
  3. var util = require('../../../utils/util');
  4. var api = require('../../../config/api.js');
  5. let ecXdata, ecYdata, rateXdata, rateYdata, ec2Xdata, ec2Ydata, ec3Xdata, ec3Ydata
  6. const dayLength = 7
  7. Component({
  8. /**
  9. * 组件的初始数据
  10. */
  11. data: {
  12. userInfo: {},
  13. detail: {},
  14. activeType: 0,
  15. brandNameList: [],
  16. index: 0,
  17. // ec2: {
  18. // onInit: init2Chart
  19. // },
  20. // barEc: {
  21. // onInit: initBarChart
  22. // },
  23. dataNumList: [
  24. {
  25. value: 0,
  26. label: '店铺浏览量',
  27. key: 'pvTotalNum',
  28. bgColor: 'rgba(255, 205, 60, 0.1)',
  29. color: '#FFCD3C'
  30. },
  31. {
  32. value: 0,
  33. label: '用户访问量',
  34. key: 'uvTotalNum',
  35. bgColor: 'rgba(77,174,255,0.1)',
  36. color: '#4DAEFF'
  37. },
  38. {
  39. value: 0,
  40. label: '用户咨询量',
  41. bgColor: 'rgba(23,210,210,0.1)',
  42. color: '#17D2D2',
  43. key: 'totalTalkNum'
  44. },
  45. {
  46. value: 0,
  47. label: '店铺商品数',
  48. bgColor: 'rgba(246,151,88,0.1)',
  49. color: '#F69758',
  50. key: 'goodsNum'
  51. }
  52. ],
  53. chartTypes: [
  54. {
  55. icon: 'data_booth',
  56. name: '店铺数据',
  57. value: 0
  58. },
  59. {
  60. icon: 'data_visitor',
  61. name: '访客数据',
  62. value: 1
  63. },
  64. {
  65. icon: 'data_wares',
  66. name: '商品数据',
  67. value: 2
  68. },
  69. ]
  70. },
  71. lifetimes: {
  72. },
  73. async ready () {
  74. this.userInfo = wx.getStorageSync('userinfoDetail')
  75. this.brandList = this.userInfo.brandList
  76. this.setData({
  77. userInfo: this.userInfo,
  78. brandNameList: [this.userInfo.brandName]
  79. })
  80. await this.getBrandList()
  81. this.getData()
  82. },
  83. methods: {
  84. changeActiveType (e) {
  85. const { value } = e.currentTarget.dataset
  86. this.setData({
  87. activeType: value
  88. })
  89. },
  90. async getData () {
  91. let userInfo = this.userInfo
  92. if (!userInfo || !userInfo.userId) {
  93. return
  94. }
  95. let res = await util.request(api.SceneReport ,{
  96. guideId: userInfo.userId,
  97. brandId: this.brandList[this.data.index].brandId,
  98. startDate: fotmatDate(new Date(new Date().getTime() - 86000000), 'yyyy-MM-dd'),
  99. size: dayLength
  100. }, 'get')
  101. if (res.code !== 0) {
  102. wx.showModal({
  103. title: '未查询到店铺统计信息',
  104. })
  105. return
  106. }
  107. let data = res.data
  108. let hotVisitHistory = this.formatData(data.hotVisitHistory)
  109. ec3Xdata = hotVisitHistory.xaxis
  110. ec3Ydata = hotVisitHistory.result
  111. let sceneVisit = this.formatData(data.pvHistory)
  112. ecXdata = sceneVisit.xaxis
  113. ecYdata = sceneVisit.result
  114. let uvVisit = this.formatData(data.uvHistory)
  115. ec2Xdata = uvVisit.xaxis
  116. ec2Ydata = [uvVisit.result]
  117. let dealHistory = this.formatData(data.dealHistory)
  118. let goodsDetailVisitHistory = this.formatData(data.goodsDetailVisitHistory)
  119. rateXdata = goodsDetailVisitHistory.xaxis
  120. rateYdata = goodsDetailVisitHistory.result.map((item, index) => ((dealHistory.result[index] || 0) * 100 / (item || 1)).toFixed(1))
  121. let talkHistory = this.formatData(data.talkHistory)
  122. ec2Ydata[1] = talkHistory.result
  123. let dataNumList = this.data.dataNumList.map(item => {
  124. if (data[item.key]) {
  125. item.value = formatNum(data[item.key])
  126. }
  127. return item
  128. })
  129. this.setData({
  130. // detail: data,
  131. dataNumList,
  132. ec: {
  133. onInit: initChart
  134. },
  135. ec2: {
  136. onInit: init2Chart
  137. },
  138. ec3: {
  139. onInit: init3Chart
  140. },
  141. rateEc: {
  142. onInit: initRateChart
  143. }
  144. })
  145. },
  146. formatData (data) {
  147. if (typeof data === 'string') {
  148. data = JSON.parse(data)
  149. }
  150. if (!(data instanceof Array)) {
  151. data = []
  152. }
  153. let originData = []
  154. if (data.length < dayLength) {
  155. let today = new Date(fotmatDate(new Date(), 'yyyy-MM-dd')).getTime()
  156. for (let i =0; i < dayLength; i++) {
  157. let theDay = today - (dayLength - i) * 86400000
  158. let inData = {}
  159. let date = fotmatDate(new Date(theDay), 'yyyy-MM-dd')
  160. inData[date] = data.find(item => item[`${date} 00:00:00`]) ? data.find(item => item[`${date} 00:00:00`])[`${date} 00:00:00`] : 0
  161. originData.push(inData)
  162. }
  163. } else {
  164. originData = data
  165. }
  166. let xaxis = originData.map(item => Object.keys(item)[0].slice(5,10))
  167. let result = originData.map(item => item[Object.keys(item)[0]])
  168. return {
  169. result,
  170. xaxis,
  171. }
  172. },
  173. async getBrandList () {
  174. let res = await util.request(api.GetAdminBrands ,{
  175. userId: this.userInfo.userId,
  176. })
  177. let list = res.data
  178. let brandNameList = list.map(item => item.brandName.slice(0,15))
  179. this.brandList = list
  180. this.setData({
  181. brandNameList
  182. })
  183. },
  184. bindPickerChange (e) {
  185. let index = e.detail.value
  186. let brand = this.brandList[index]
  187. console.log(e)
  188. this.setData({
  189. index
  190. })
  191. this.reset()
  192. wx.nextTick(() => {
  193. this.getData()
  194. })
  195. },
  196. reset() {
  197. this.setData({
  198. ec: '',
  199. ec2: '',
  200. ec3: '',
  201. rateEc: '',
  202. dataNumList: [
  203. {
  204. value: 0,
  205. label: '店铺浏览量',
  206. key: 'pvTotalNum',
  207. bgColor: 'rgba(255, 205, 60, 0.1)',
  208. color: '#FFCD3C'
  209. },
  210. {
  211. value: 0,
  212. label: '用户访问量',
  213. key: 'uvTotalNum',
  214. bgColor: 'rgba(77,174,255,0.1)',
  215. color: '#4DAEFF'
  216. },
  217. {
  218. value: 0,
  219. label: '用户咨询量',
  220. bgColor: 'rgba(23,210,210,0.1)',
  221. color: '#17D2D2',
  222. key: 'totalTalkNum'
  223. },
  224. {
  225. value: 0,
  226. label: '店铺商品数',
  227. bgColor: 'rgba(246,151,88,0.1)',
  228. color: '#F69758',
  229. key: 'goodsNum'
  230. }
  231. ],
  232. })
  233. }
  234. }
  235. })
  236. function initChart(canvas, width, height, dpr) {
  237. const chart = echarts.init(canvas, null, {
  238. width: width,
  239. height: height,
  240. devicePixelRatio: dpr // new
  241. });
  242. canvas.setChart(chart);
  243. var option = {
  244. title: {
  245. text: ''
  246. },
  247. tooltip: {
  248. formatter: `{a}: {c} \n${new Date().getFullYear()}-{b}`,
  249. axisPointer: {
  250. lineStyle: {
  251. color: '#FFCD3C'
  252. }
  253. }
  254. },
  255. color: ['#FFCD3C'],
  256. xAxis: {
  257. boundaryGap: false,
  258. data: ecXdata
  259. },
  260. series: [
  261. {
  262. data: ecYdata,
  263. type: 'line',
  264. name: '浏览量',
  265. symbolSize: 2,
  266. showSymbol: false,
  267. symbol: 'circle',
  268. smooth: 0.5,
  269. areaStyle: {
  270. opacity: 0.1
  271. },
  272. },
  273. ]
  274. };
  275. chart.setOption(mergeOptions(option));
  276. return chart;
  277. }
  278. function init3Chart(canvas, width, height, dpr, xdata,) {
  279. const chart = echarts.init(canvas, null, {
  280. width: width,
  281. height: height,
  282. devicePixelRatio: dpr // new
  283. });
  284. canvas.setChart(chart);
  285. var option = {
  286. title: {
  287. text: ''
  288. },
  289. color: ['#ED5D18'],
  290. tooltip: {
  291. formatter: `{a}: {c} \n${new Date().getFullYear()}-{b}`,
  292. axisPointer: {
  293. type: 'shadow',
  294. shadowStyle: {
  295. color: 'rgba(255, 205, 60, 0.1)'
  296. },
  297. lineStyle: {
  298. color: 'rgba(255, 205, 60, 0.1)'
  299. }
  300. }
  301. },
  302. xAxis: {
  303. data: ec3Xdata,
  304. boundaryGap: true
  305. },
  306. series: [
  307. {
  308. data: ec3Ydata,
  309. type: 'bar',
  310. name: '浏览量',
  311. itemStyle: {
  312. barBorderRadius: [5,5,0,0],
  313. },
  314. barWidth: 10,
  315. emphasis: {
  316. itemStyle: {
  317. opacity: 1
  318. }
  319. }
  320. },
  321. ]
  322. };
  323. chart.setOption(mergeOptions(option));
  324. return chart;
  325. }
  326. function init2Chart(canvas, width, height, dpr) {
  327. const chart = echarts.init(canvas, null, {
  328. width: width,
  329. height: height,
  330. devicePixelRatio: dpr // new
  331. });
  332. canvas.setChart(chart);
  333. var option = {
  334. xAxis: {
  335. data: ec2Xdata
  336. },
  337. tooltip: {
  338. formatter: `访问量: {c0} \n咨询量: {c1} \n${new Date().getFullYear()}-{b}`,
  339. axisPointer: {
  340. lineStyle: {
  341. color: '#FFCD3C'
  342. }
  343. }
  344. },
  345. series: [
  346. {
  347. data: ec2Ydata[0] || [],
  348. type: 'line',
  349. name: '客户访问量',
  350. symbolSize: 2,
  351. showSymbol: false,
  352. symbol: 'circle',
  353. smooth: 0.5,
  354. color: '#ED5D18',
  355. areaStyle: {
  356. opacity: 0.1
  357. },
  358. },
  359. {
  360. data: ec2Ydata[1] || [],
  361. type: 'line',
  362. name: '客户咨询量',
  363. symbolSize: 2,
  364. showSymbol: false,
  365. symbol: 'circle',
  366. color: '#FFCD3C',
  367. smooth: 0.5,
  368. areaStyle: {
  369. opacity: 0.1
  370. },
  371. },
  372. ]
  373. };
  374. chart.setOption(mergeOptions(option));
  375. return chart;
  376. }
  377. function initRateChart(canvas, width, height, dpr,) {
  378. const chart = echarts.init(canvas, null, {
  379. width: width,
  380. height: height,
  381. devicePixelRatio: dpr // new
  382. });
  383. canvas.setChart(chart);
  384. var option = {
  385. title: {
  386. text: ''
  387. },
  388. color: ['#FFCD3C'],
  389. tooltip: {
  390. formatter: `{a}: {c}% \n ${new Date().getFullYear()}-{b}`
  391. },
  392. xAxis: {
  393. data: rateXdata,
  394. axisLine: {
  395. show: true
  396. }
  397. },
  398. // yAxis: {
  399. // max: 100
  400. // },
  401. series: [
  402. {
  403. data: rateYdata,
  404. type: 'line',
  405. name: '转化率',
  406. symbolSize: 2,
  407. showSymbol: false,
  408. symbol: 'circle'
  409. },
  410. ]
  411. };
  412. chart.setOption(mergeOptions(option));
  413. return chart;
  414. }
  415. function fotmatDate (date, fmt='yyyy.MM.dd') {
  416. if (!(date instanceof Date)) {
  417. date = changeDateFormat(date)
  418. }
  419. var o = {
  420. "M+" : date.getMonth()+1, //月份
  421. "d+" : date.getDate(), //日
  422. "h+" : date.getHours(), //小时
  423. "m+" : date.getMinutes(), //分
  424. "s+" : date.getSeconds(), //秒
  425. "q+" : Math.floor((date.getMonth()+3)/3), //季度
  426. "S" : date.getMilliseconds() //毫秒
  427. };
  428. if(/(y+)/.test(fmt))
  429. fmt=fmt.replace(RegExp.$1, (date.getFullYear()+"").substr(4 - RegExp.$1.length));
  430. for(var k in o)
  431. if(new RegExp("("+ k +")").test(fmt))
  432. fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
  433. return fmt;
  434. }
  435. // 转格式 否则IOS下会有问题
  436. function changeDateFormat(cellval) {
  437. var dateVal = cellval + "";
  438. if (cellval != null) {
  439. dateVal = dateVal.slice(0, 19)
  440. dateVal = dateVal.replace("T"," ").replace("Z","").replace(/-/g, "/");
  441. var date = new Date(dateVal);
  442. date = new Date(date.setHours(date.getHours()));
  443. return date
  444. }
  445. }
  446. // 数值太大转为带万的文字
  447. function formatNum (num) {
  448. return num >= 10000 ? num >= 1000000 ? `99W+` : `${(num/10000).toFixed(2).replace(/[.]?0+$/g,"")}W` : num
  449. }