知与行后台管理端

UserBehavior.jsx 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. import React, { Component, useState, useEffect } from 'react';
  2. import EChart from '../../../components/EchartsTest/EChart';
  3. import request from '../../../utils/request';
  4. import apis from '../../../services/apis';
  5. import moment from 'moment';
  6. import router from 'umi/router';
  7. import 'echarts/lib/component/dataZoom'
  8. import { Table, Select, Row, Col, Menu, Dropdown, Button, Icon, message, Modal } from 'antd';
  9. import BuildSelect from '../../../components/SelectButton/BuildSelect'
  10. const { Option } = Select;
  11. const eventcolumns = [
  12. {
  13. title: '编号',
  14. dataIndex: 'recordId',
  15. key: 'recordId',
  16. align: 'center',
  17. width: '16%',
  18. },
  19. {
  20. title: '访问时间',
  21. dataIndex: 'visitTime',
  22. key: 'visitTime',
  23. align: 'center',
  24. width: '18%',
  25. render: (x, row) => (
  26. <>
  27. <span>{ moment(row.visitTime).format('YYYY-MM-DD hh:mm:ss') }</span>
  28. </>
  29. ),
  30. },
  31. {
  32. title: '离开时间',
  33. dataIndex: 'leaveTime',
  34. key: 'leaveTime',
  35. align: 'center',
  36. width: '18%',
  37. render: (x, row) => (
  38. <>
  39. <span>{ row.leaveTime && moment(row.leaveTime).format('YYYY-MM-DD hh:mm:ss') }</span>
  40. </>
  41. ),
  42. },
  43. ]
  44. class EventcoModal extends React.Component {
  45. constructor(props) {
  46. super(props)
  47. this.state = {
  48. eventList: [],
  49. visibleData: { visible: false, row: {} },
  50. }
  51. }
  52. componentDidUpdate(prevProps) {
  53. if (this.props.visibleData.visible !== prevProps.visibleData.visible) {
  54. // eslint-disable-next-line react/no-did-update-set-state
  55. this.setState({ visibleData: this.props.visibleData }, () => {
  56. this.showDetails(this.props.visibleData.row)
  57. })
  58. }
  59. }
  60. showDetails = row => {
  61. request({
  62. ...apis.indexEcharts.userBehavior.profile,
  63. params: { event: row.event, personId: row.personId },
  64. }).then(data => {
  65. this.setState({ eventList: data })
  66. })
  67. }
  68. handleOk = e => {
  69. this.props.onSuccess()
  70. };
  71. handleCancel = e => {
  72. this.props.onSuccess()
  73. };
  74. render() {
  75. return (
  76. <>
  77. <Modal
  78. title="访问详情"
  79. visible={this.state.visibleData.visible}
  80. onOk={() => this.handleOk()}
  81. onCancel={() => this.handleCancel()}
  82. footer={null}
  83. >
  84. <Table rowKey="UserBehavior" dataSource={this.state.eventList} columns={eventcolumns} pagination={false} rowKey="eventall" scroll={{ y: 400 }} />
  85. </Modal>
  86. </>
  87. )
  88. }
  89. }
  90. const formatDate = (start, end) => {
  91. const startDate = `${moment(start).format('YYYY-MM-DDT00:00:00.000')}Z`
  92. const endDate = `${moment(end).format('YYYY-MM-DDT23:59:59.999')}Z`
  93. return { startDate, endDate }
  94. }
  95. const UserBehavior = props => {
  96. const [data, setData] = useState({ records: [] })
  97. const [visibleData, setVisibleData] = useState({ visible: false, row: {} })
  98. // 柱图
  99. useEffect(() => {
  100. const date = formatDate(props.startDate, props.endDate)
  101. getUserBehaviorSummary({
  102. ...date,
  103. activity: props.activity,
  104. event: props.event,
  105. eventType: props.eventType,
  106. buildingId: props.buildingId,
  107. })
  108. // getUserBehaviorProfile(formatDate(props.startDate, props.endDate))
  109. }, [props.startDate, props.endDate, props.activity, props.event, props.eventType, props.buildingId])
  110. const [recordList, setList] = useState([])
  111. function getUserBehaviorSummary(params) {
  112. request({
  113. ...apis.indexEcharts.userBehavior.summary,
  114. params,
  115. }).then(data => {
  116. setData(data || {})
  117. setList((data.data.records || []).filter(e => e.activity !== '客户'))
  118. })
  119. }
  120. const seriesMaker = (data.selectUserBehavior || []).filter(e => e.activity !== '客户' && e.activity !== '首页').reduce((series, item) => {
  121. let { date, activityCount, activity } = item
  122. date = moment(date).format('YYYY-MM-DD')
  123. if (!activityCount) activityCount = 0
  124. // 使用对象, 可以去重
  125. series[`${activity}`] = (series[`${activity}`] || []).concat([[date, activityCount]])
  126. return series;
  127. }, {})
  128. const dataZoom = props.dataZoom ? [
  129. {
  130. type: 'inside',
  131. start: 0,
  132. end: 100,
  133. },
  134. {
  135. type: 'slider',
  136. start: 0,
  137. end: 100,
  138. },
  139. ] : undefined
  140. const options = {
  141. title: {},
  142. icon: 'rect',
  143. legend: {
  144. show: true,
  145. zlevel: 10,
  146. itemGap: 100,
  147. },
  148. color: ['#F12B3E', '#FE929C', '#647CE1', '#A2B9FF', '#FF844F', '#FFBB9D'],
  149. tooltip: {
  150. trigger: 'axis',
  151. },
  152. xAxis: { type: 'category' },
  153. yAxis: {},
  154. dataZoom,
  155. series: Object.keys(seriesMaker).map(x => ({
  156. type: 'line',
  157. smooth: true,
  158. name: x,
  159. data: seriesMaker[x],
  160. })),
  161. }
  162. function handleBuildingChange(e) {
  163. getUserBehaviorSummary({ buildingId: e })
  164. }
  165. function showDetails(row) {
  166. setVisibleData({ visible: true, row })
  167. }
  168. function onSuccess() {
  169. setVisibleData({ visible: false, row: {} })
  170. }
  171. const style = {
  172. width: '100%',
  173. height: '400px',
  174. }
  175. const columns = [
  176. {
  177. title: '访问事件',
  178. dataIndex: 'eventName',
  179. key: 'eventName',
  180. align: 'center',
  181. width: '16%',
  182. },
  183. {
  184. title: '访问用户',
  185. dataIndex: 'userName',
  186. key: 'userName',
  187. align: 'center',
  188. width: '15%',
  189. },
  190. {
  191. title: '访问次数',
  192. dataIndex: 'accessCount',
  193. key: 'accessCount',
  194. align: 'center',
  195. width: '17%',
  196. render: (x, row) => (
  197. <>
  198. <span style={{ color: '#EF273A', cursor: 'pointer' }} onClick={() => showDetails(row)}> {row.accessCount}</span>
  199. </>
  200. ),
  201. },
  202. {
  203. title: '首次访问时间',
  204. dataIndex: 'visitTime',
  205. key: 'visitTime',
  206. align: 'center',
  207. width: '18%',
  208. render: (x, row) => (
  209. <>
  210. <span>{ row.visitTime && moment(row.visitTime).format('YYYY-MM-DD hh:mm:ss') }</span>
  211. </>
  212. ),
  213. },
  214. {
  215. title: '离开时间',
  216. dataIndex: 'leaveTime',
  217. key: 'leaveTime',
  218. width: '18%',
  219. align: 'center',
  220. render: (x, row) => (
  221. <>
  222. <span>{ row.leaveTime && moment(row.leaveTime).format('YYYY-MM-DD hh:mm:ss') }</span>
  223. </>
  224. ),
  225. },
  226. ]
  227. return (
  228. <>
  229. <div>
  230. <p onClick={() => router.push('/indexEcharts/userBehavior')} style={{cursor: 'pointer'}}>
  231. <span style={{ borderBottom: '1px solid #f02d40', color: '#333', fontSize: '0.12rem', fontWeight: '600' }}>用户行为</span>
  232. {!props.BuildSelectHide && <span style={{ fontSize: '0.09rem', color: '#888', marginLeft: '0.06rem' }}>最近七天</span>}
  233. </p>
  234. <div style={{ float: 'right', marginTop: '-40px', marginBottom: '20px' }}>
  235. {!props.BuildSelectHide && <BuildSelect slot="action" onChange={(e => handleBuildingChange(e))} one="true"></BuildSelect>}
  236. </div>
  237. <EChart options={options} style={style} />
  238. {props.tableShow &&
  239. <Table rowKey="UserBehaviorTwo" dataSource={recordList} columns={columns} pagination={false} rowKey="userbehavior" scroll={{ y: 500 }} />
  240. }
  241. </div>
  242. <EventcoModal visibleData={visibleData} onSuccess={() => onSuccess()} />
  243. </>
  244. )
  245. }
  246. export default UserBehavior