memberCheckStatistics.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. <template>
  2. <div class="table-box">
  3. <el-tabs v-model="activeName">
  4. <el-tab-pane name="enterAreaTime">
  5. <span
  6. slot="label">
  7. 来园次数统计<Tip msg="一个会员卡一天进出多次,在来园统计中仅算一次,多人卡一天也仅计算一次"></Tip>
  8. </span>
  9. <EnterAreaTimeCount v-show="activeName==='enterAreaTime'"></EnterAreaTimeCount>
  10. </el-tab-pane>
  11. <el-tab-pane name="checkTicketsTime">
  12. <span slot="label">
  13. 检票次数统计<Tip msg="会员一次进出算一次,一天进出多次计算为多次"></Tip>
  14. </span>
  15. <div
  16. class="form-wrap"
  17. v-show="activeName==='checkTicketsTime'">
  18. <el-form
  19. class="search-box"
  20. ref="form"
  21. :model="form"
  22. :inline="true"
  23. label-width="70px">
  24. <div class="block-title">
  25. 查询条件
  26. </div>
  27. <el-form-item
  28. label="起始时间"
  29. prop="startDate">
  30. <el-date-picker
  31. v-model="form.startDate"
  32. type="datetime"
  33. placeholder="选择日期时间">
  34. </el-date-picker>
  35. </el-form-item>
  36. <el-form-item
  37. label="截止时间"
  38. prop="endDate">
  39. <el-date-picker
  40. default-time="23:59:59"
  41. v-model="form.endDate"
  42. type="datetime"
  43. placeholder="选择日期时间">
  44. </el-date-picker>
  45. </el-form-item>
  46. <el-form-item
  47. label="检票方式"
  48. prop="keyWords2">
  49. <el-select
  50. v-model="form.keyWords2"
  51. clearable
  52. placeholder="请选择">
  53. <el-option
  54. label="全部"
  55. value="">
  56. </el-option>
  57. <el-option
  58. v-for="item in checkType"
  59. :key="item.value"
  60. :label="item.name"
  61. :value="item.value">
  62. </el-option>
  63. </el-select>
  64. </el-form-item>
  65. <el-form-item
  66. label="统计方式"
  67. prop="keyWords3">
  68. <el-select
  69. v-model="form.keyWords3"
  70. clearable
  71. placeholder="请选择">
  72. <el-option
  73. v-for="item in statistType"
  74. :key="item.value"
  75. :label="item.name"
  76. :value="item.value">
  77. </el-option>
  78. </el-select>
  79. </el-form-item>
  80. <div class="btn-wrap">
  81. <el-button
  82. @click="exportMemberCheckStatistics">
  83. 导出
  84. </el-button>
  85. <el-button
  86. @click="reset">
  87. 重置
  88. </el-button>
  89. <el-button
  90. :disabled="loading"
  91. type="primary"
  92. @click="getList">
  93. 搜索
  94. </el-button>
  95. </div>
  96. </el-form>
  97. <div
  98. style="width:100%">
  99. <div class="block-title">
  100. 统计信息
  101. <el-radio-group
  102. style="float:right"
  103. size="mini"
  104. v-model="viewType">
  105. <el-tooltip
  106. content="图表视图"
  107. placement="top"
  108. effect="dark">
  109. <el-radio-button label="chart">
  110. <i class="el-icon-s-data"></i>
  111. </el-radio-button>
  112. </el-tooltip>
  113. <el-tooltip
  114. content="表格视图"
  115. placement="top"
  116. effect="dark">
  117. <el-radio-button label="table">
  118. <i class="el-icon-tickets"></i>
  119. </el-radio-button>
  120. </el-tooltip>
  121. </el-radio-group>
  122. </div>
  123. <v-chart
  124. autoresize
  125. style="width:100%"
  126. :options="dayOption"
  127. v-if="tableData && viewType==='chart'" />
  128. <el-table
  129. v-else
  130. :data="tableData.data"
  131. border
  132. stripe>
  133. <el-table-column
  134. prop="date"
  135. label="日期"
  136. >
  137. </el-table-column>
  138. <el-table-column
  139. v-for="col in columns"
  140. :prop="col"
  141. :key="col"
  142. :label="col">
  143. </el-table-column>
  144. </el-table>
  145. </div>
  146. </div>
  147. </el-tab-pane>
  148. </el-tabs>
  149. </div>
  150. </template>
  151. <script>
  152. import dayOption from './memberCheckStatistics/dayOption'
  153. import EnterAreaTimeCount from './memberCheckStatistics/EnterAreaTimeCount'
  154. import { getMemberCheckStatistics, exportMemberCheckStatistics } from '@/api/member'
  155. import moment from 'moment'
  156. const statistType = [
  157. {
  158. name: '天',
  159. value: 'day'
  160. }, {
  161. name: '周',
  162. value: 'week'
  163. }, {
  164. name: '月',
  165. value: 'month'
  166. }, {
  167. name: '年',
  168. value: 'year'
  169. }
  170. ]
  171. const checkType = [
  172. {
  173. name: '指纹',
  174. value: 'finger'
  175. }, {
  176. name: '人脸',
  177. value: 'face'
  178. }, {
  179. name: 'IC卡',
  180. value: 'iccard'
  181. }, {
  182. name: '身份证',
  183. value: 'idcard'
  184. }, {
  185. name: '人工检票',
  186. value: 'person'
  187. }
  188. ]
  189. export default {
  190. name: 'memberCheckStatistics',
  191. components: {
  192. EnterAreaTimeCount
  193. },
  194. data () {
  195. return {
  196. dayOption,
  197. statistType,
  198. checkType,
  199. ticketTypeList: [],
  200. activeName: 'enterAreaTime',
  201. viewType: 'chart',
  202. columns: [],
  203. form: {
  204. startDate: new Date(moment().format('YYYY-MM-DD') + ' 00:00:00'),
  205. endDate: new Date(moment().format('YYYY-MM-DD') + ' 23:59:59'),
  206. keyWords1: '', // 会员种类id
  207. keyWords2: '', // 检票方式
  208. keyWords3: 'day' // 统计方式
  209. },
  210. tableData: [],
  211. loading: false
  212. }
  213. },
  214. created () {
  215. this.getList()
  216. },
  217. methods: {
  218. reset () {
  219. this.$refs.form.resetFields()
  220. },
  221. getList () {
  222. this.loading = true
  223. getMemberCheckStatistics(this.form).then(res => {
  224. this.tableData = res
  225. let cols = res.memberTypeList
  226. let totalIndex = cols.findIndex(i => i === '总计')
  227. cols[totalIndex] = cols.splice(cols.length - 1, 1, cols[totalIndex])[0]
  228. this.columns = cols
  229. }).finally(() => {
  230. this.loading = false
  231. })
  232. },
  233. exportMemberCheckStatistics () {
  234. exportMemberCheckStatistics(this.form).then(res => {
  235. this.$message.success('导出成功。')
  236. this.goToDownload()
  237. })
  238. }
  239. },
  240. watch: {
  241. tableData (val) {
  242. let dayOption = JSON.parse(JSON.stringify(this.dayOption))
  243. dayOption.xAxis[0].data = val.data.map(i => i.date)
  244. dayOption.legend.data = val.memberTypeList
  245. dayOption.series = val.memberTypeList.map(item => {
  246. return {
  247. name: item,
  248. type: 'bar',
  249. barGap: 0,
  250. data: val.data.map(i => {
  251. return i[item] || 0
  252. })
  253. }
  254. })
  255. this.dayOption = dayOption
  256. }
  257. }
  258. }
  259. </script>
  260. <style lang="scss" scoped>
  261. .table-box{
  262. border: 0;
  263. ::v-deep .el-tabs__nav-wrap{
  264. padding: 0 24px;
  265. }
  266. }
  267. </style>