operationalAnalysis.vue 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. <!-- 运营分析 -->
  2. <template>
  3. <view class="operation">
  4. <view class="operation-header">
  5. <view class="operation-header-left" @click="typePicker = true">
  6. <u-icon name="arrow-down" color="#000" size="15"></u-icon>
  7. <text>{{ currentType.text }}</text>
  8. </view>
  9. <view class="operation-header-right">
  10. <view class="tab">
  11. <view class="tab-item" v-for="(item, index) in tabList" :key="index"
  12. :class="{'active': tabCur === item.value}" @click="tabClick(item)">{{ item.label }}</view>
  13. </view>
  14. </view>
  15. </view>
  16. <view class="operation-main">
  17. <template v-if="currentType.value === 1">
  18. <RevenueAnalysis :type="currentType.type" :chartData="currentType.data" :title="title"/>
  19. </template>
  20. <template v-else-if="currentType.value === 2">
  21. <RevenueAnalysis :type="currentType.type" :chartData="currentType.data" :title="title"/>
  22. </template>
  23. <template v-else-if="currentType.value === 3">
  24. <RevenueRanking :tableTh="currentType.tableTh" :tableData="currentType.tableData" :title="title"/>
  25. </template>
  26. <template v-else-if="currentType.value === 4">
  27. <TrafficFlow :chartData="currentType.data" :title="title"/>
  28. </template>
  29. <template v-else-if="currentType.value === 5">
  30. <TollCollectorPerformance type="table" :tableTh="currentType.tableTh" :tableData="currentType.tableData" :title="title"/>
  31. </template>
  32. <template v-else-if="currentType.value === 6">
  33. <TollCollectorPerformance type="line" :chartData="currentType.data" :title="title"/>
  34. </template>
  35. </view>
  36. <!-- 分析类型 -->
  37. <u-picker :show="typePicker" :columns="typeList" @confirm="typeConfirm" @cancel="typePicker = false"></u-picker>
  38. <!-- 年 -->
  39. <u-picker :show="yearPicker" :columns="yearList" :defaultIndex="defaultYear" @confirm="yearConfirm"
  40. @cancel="yearPicker = false"></u-picker>
  41. <!-- 月 -->
  42. <u-picker :show="monthPicker" :columns="monthList" :defaultIndex="defaultMonth" @confirm="monthConfirm"
  43. @cancel="monthPicker = false"></u-picker>
  44. <!-- 日 -->
  45. <u-picker :show="dayPicker" :columns="dayList" :defaultIndex="defaultDay" @confirm="dayConfirm"
  46. @cancel="dayPicker = false"></u-picker>
  47. </view>
  48. </template>
  49. <script>
  50. import RevenueAnalysis from './components/revenueAnalysis.vue'
  51. import RevenueRanking from './components/revenueRanking.vue'
  52. import TrafficFlow from './components/trafficFlow.vue'
  53. import TollCollectorPerformance from './components/tollCollectorPerformance.vue'
  54. export default {
  55. components: {
  56. RevenueAnalysis,
  57. RevenueRanking,
  58. TrafficFlow,
  59. TollCollectorPerformance
  60. },
  61. data() {
  62. return {
  63. tabList: [{
  64. label: '年',
  65. value: 1
  66. },
  67. {
  68. label: '月',
  69. value: 2
  70. },
  71. {
  72. label: '日',
  73. value: 3
  74. }
  75. ],
  76. tabCur: 1,
  77. // 类型
  78. typePicker: false,
  79. currentType: {},
  80. typeList: [
  81. [{
  82. text: '营收分析(折线)',
  83. value: 1,
  84. type: 'line',
  85. data: {
  86. categories: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
  87. series: [{
  88. name: '',
  89. data: [10, 10, 20, 30, 40, 0, 0, 0, 0, 0, 0, 0]
  90. }]
  91. }
  92. },
  93. {
  94. text: '营收分析(柱状)',
  95. value: 2,
  96. type: 'column',
  97. data: {
  98. categories: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
  99. series: [{
  100. name: '',
  101. data: [10, 10, 20, 30, 40, 0, 0, 0, 0, 0, 0, 0]
  102. }]
  103. }
  104. },
  105. {
  106. text: '路段/停车场营收排行',
  107. value: 3,
  108. tableTh: [
  109. { width: 100, field: '路段编号', key: 'roadNum' },
  110. { width: 100, field: '路段名称', key: 'roadName' },
  111. { width: 100, field: '收益(元)', key: 'income' },
  112. ],
  113. tableData: {
  114. current: 1,
  115. total: 10,
  116. list: [
  117. { roadNum: 'RN00000009', roadName: '可处路1', income: 100.36 },
  118. { roadNum: 'RN00000010', roadName: '可处路2', income: 101.03 },
  119. { roadNum: 'RN00000011', roadName: '可处路3', income: 102.01 },
  120. { roadNum: 'RN00000012', roadName: '可处路4', income: 103.02 }
  121. ]
  122. }
  123. },
  124. {
  125. text: '车流量分析',
  126. value: 4,
  127. data: {
  128. categories: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
  129. series: [{
  130. name: '',
  131. data: [10, 10, 20, 30, 40, 0, 0, 0, 0, 0, 0, 0]
  132. }]
  133. }
  134. },
  135. {
  136. text: '收费员业绩排行',
  137. value: 5,
  138. tableTh: [
  139. { width: 100, field: '工号', key: 'workNum' },
  140. { width: 100, field: '姓名', key: 'name' },
  141. { width: 100, field: '收益(元)', key: 'income' },
  142. ],
  143. tableData: {
  144. current: 1,
  145. total: 10,
  146. list: [
  147. { workNum: '5001', name: '李四', income: 100.36 },
  148. { workNum: '5001', name: '张三', income: 100.36 },
  149. { workNum: '5001', name: '王五', income: 100.36 },
  150. { workNum: '5001', name: '刘刘', income: 100.36 },
  151. { workNum: '5001', name: '李四', income: 100.36 }
  152. ]
  153. }
  154. },
  155. {
  156. text: '收费员业绩分析',
  157. value: 6,
  158. data: {
  159. categories: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
  160. series: [{
  161. name: '',
  162. data: [10, 10, 20, 30, 40, 0, 0, 0, 0, 0, 0, 0]
  163. }]
  164. }
  165. },
  166. {
  167. text: '路段分析',
  168. value: 7
  169. },
  170. {
  171. text: '欠费分析',
  172. value: 8
  173. },
  174. {
  175. text: '收入分析',
  176. value: 9
  177. },
  178. {
  179. text: '支付方式占比',
  180. value: 10
  181. },
  182. {
  183. text: '支付来源分析',
  184. value: 11
  185. }
  186. ]
  187. ],
  188. // 年
  189. yearPicker: false,
  190. yearList: this.getYearList(),
  191. defaultYear: [4],
  192. title: '2022年',
  193. // 月
  194. monthPicker: false,
  195. monthList: this.getMonthList(),
  196. defaultMonth: [],
  197. // 日
  198. dayPicker: false,
  199. dayList: this.getDayList(),
  200. defaultDay: []
  201. }
  202. },
  203. onShow() {
  204. this.currentType = this.typeList[0][0]
  205. },
  206. methods: {
  207. getYearList() {
  208. const date = new Date()
  209. const year = date.getFullYear();
  210. const list = [
  211. []
  212. ]
  213. for (let i = year - 4; i < year + 1; i++) {
  214. const obj = {
  215. text: i + '年',
  216. value: i
  217. }
  218. list[0].push(obj)
  219. }
  220. return list
  221. },
  222. getMonthList() {
  223. const date = new Date()
  224. const month = date.getMonth()
  225. const list = [
  226. []
  227. ]
  228. for (let i = 1; i < 13; i++) {
  229. const obj = {
  230. text: i + '月',
  231. value: i
  232. }
  233. list[0].push(obj)
  234. }
  235. setTimeout(() => {
  236. this.defaultMonth = [month]
  237. }, 1000)
  238. return list
  239. },
  240. getDayList() {
  241. const date = new Date()
  242. const year = date.getFullYear()
  243. const month = date.getMonth()
  244. const day = date.getDate()
  245. const dayLen = (new Date(year, month, 0)).getDate()
  246. const list = [
  247. []
  248. ]
  249. for (let i = 1; i < dayLen + 1; i++) {
  250. const obj = {
  251. text: i + '日',
  252. value: i
  253. }
  254. list[0].push(obj)
  255. }
  256. setTimeout(() => {
  257. this.defaultDay = [day - 1]
  258. }, 1000)
  259. return list
  260. },
  261. /**
  262. * 点击tab
  263. * @param {Object} item
  264. */
  265. tabClick(item) {
  266. this.tabCur = item.value
  267. switch (item.value) {
  268. case 1:
  269. this.yearPicker = true
  270. break
  271. case 2:
  272. this.monthPicker = true
  273. break
  274. case 3:
  275. this.dayPicker = true
  276. break
  277. }
  278. },
  279. /**
  280. * 选择器确认
  281. * @param {Object} e
  282. */
  283. typeConfirm(e) {
  284. this.currentType = e.value[0]
  285. this.typePicker = false
  286. },
  287. yearConfirm(e) {
  288. this.defaultYear = [e.indexs[0]]
  289. this.title = e.value[0].text
  290. this.yearPicker = false
  291. },
  292. monthConfirm(e) {
  293. this.defaultMonth = [e.indexs[0]]
  294. this.title = e.value[0].text
  295. this.monthPicker = false
  296. },
  297. dayConfirm(e) {
  298. this.defaultDay = [e.indexs[0]]
  299. this.title = e.value[0].text
  300. this.dayPicker = false
  301. }
  302. }
  303. }
  304. </script>
  305. <style lang="scss">
  306. page {
  307. background-color: #1767F2;
  308. min-height: calc(100vh - 44px);
  309. }
  310. </style>
  311. <style lang="scss" scoped>
  312. @import './operationalAnalysis.scss';
  313. </style>