analysis2.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773
  1. <template>
  2. <view>
  3. <cu-custom bgColor="bg-blue" :isBack="true" backUrl="/pages/index/index">
  4. <block slot="content">数据分析</block>
  5. </cu-custom>
  6. <view class="header-line">
  7. <view @click="changeShow(1)" :class="show == 1 ? 'actClass' : ''">统计报表</view>
  8. </view>
  9. <view class="page-box" v-show="show != 1">
  10. <view class="yqshpmfxBox">
  11. <view class="tab-header">
  12. <view class="header-name">楼宇税收排名分析</view>
  13. </view>
  14. <view class="pmfx-box">
  15. <qiun-data-charts type="column" :opts="opts" :chartData="chartData" :ontouch="true" />
  16. </view>
  17. <view class="line-box"></view>
  18. <view class="ssbox">
  19. <view class="ss-left-box">
  20. <view class="num">{{ssInfo.yearTax}}<text class="unit">万元</text></view>
  21. <view style="height: 20rpx;"></view>
  22. <view class="unit">税收总额</view>
  23. </view>
  24. <view class="ss-right-box">
  25. <view class="right-text-box">
  26. <view class="num">{{ssInfo.monthrTax}}<text class="unit">万元</text></view>
  27. <view style="height: 20rpx;"></view>
  28. <view class="unit">本月税收(占比)</view>
  29. </view>
  30. <view class="pie-box">
  31. <qiun-data-charts type="arcbar" :opts="opts2" :chartData="chartData2" />
  32. </view>
  33. </view>
  34. </view>
  35. </view>
  36. <view class="page-center-box">
  37. <view class="center-left-box">
  38. <view class="center-title">楼宇入住率排名分析</view>
  39. <view class="table-line" v-for="(item, index) in rzList" :key="index">
  40. <view class="index">{{index + 1 }}</view>
  41. <view class="name">{{item.name}}</view>
  42. <view class="percent">{{item.value}}%</view>
  43. </view>
  44. </view>
  45. <view class="center-right-box">
  46. <view class="center-title">楼宇企业数量类型分析</view>
  47. <view class="right-box-in">
  48. <qiun-data-charts type="pie" :opts="opts3" :chartData="chartData3" />
  49. </view>
  50. </view>
  51. </view>
  52. <view class="yqqsBox">
  53. <view class="tab-header">
  54. <view class="header-name">楼宇税收趋势分析</view>
  55. <jp-picker v-model="ssqsLYid" rangeKey="label" rangeValue="value" :range="LYList" :onChangeNew="changeSSLYId">
  56. </jp-picker>
  57. </view>
  58. <view class="pmfx-box">
  59. <qiun-data-charts type="line" :opts="opts4" :chartData="chartDataSSLY" />
  60. </view>
  61. <view style="height: 20rpx;"></view>
  62. </view>
  63. <view class="yqqsBox">
  64. <view class="tab-header">
  65. <view class="header-name">楼宇新增企业月增长量</view>
  66. <jp-picker v-model="yzlLYid" rangeKey="label" rangeValue="value" :range="LYList" :onChangeNew="changeData">
  67. </jp-picker>
  68. </view>
  69. <view class="pmfx-box">
  70. <qiun-data-charts type="line" :opts="opts4" :chartData="chartDataLLXZL" />
  71. </view>
  72. <view style="height: 20rpx;"></view>
  73. </view>
  74. </view>
  75. <view v-show="show == 1">
  76. <view class="page-box">
  77. <view class="yqqsBox">
  78. <view class="tab-header">
  79. <view class="header-name">园区企业总数统计分析</view>
  80. </view>
  81. <view class="pmfx-box">
  82. <qiun-data-charts type="line" :opts="opts4" :chartData="chartDataYQQYZS" />
  83. </view>
  84. <view style="height: 20rpx;"></view>
  85. </view>
  86. </view>
  87. <view class="page-box">
  88. <view class="yqqsBox">
  89. <view class="tab-header">
  90. <view class="header-name">园区企业税收统计分析</view>
  91. </view>
  92. <view class="ssfx-box">
  93. <qiun-data-charts type="pie" :opts="optsSS" :chartData="chartDataYQSS" />
  94. </view>
  95. <view style="height: 20rpx;"></view>
  96. </view>
  97. </view>
  98. <view class="page-box">
  99. <view class="yqqsBox">
  100. <view class="tab-header">
  101. <view class="header-name">园区企业参保人数统计分析</view>
  102. </view>
  103. <view class="pmfx-box">
  104. <qiun-data-charts type="line" :opts="opts4" :chartData="chartDataYQSBRS" />
  105. </view>
  106. <view style="height: 20rpx;"></view>
  107. </view>
  108. </view>
  109. <view class="page-box">
  110. <view class="yqqsBox">
  111. <view class="tab-header">
  112. <view class="header-name">楼宇企业总数统计分析</view>
  113. </view>
  114. <view class="pmfx-box">
  115. <qiun-data-charts type="line" :opts="opts4" :chartData="chartDataLYQYZS" />
  116. </view>
  117. <view style="height: 20rpx;"></view>
  118. </view>
  119. </view>
  120. <view class="page-box">
  121. <view class="yqqsBox">
  122. <view class="tab-header">
  123. <view class="header-name">楼宇企业税收统计分析</view>
  124. </view>
  125. <view class="ssfx-box">
  126. <qiun-data-charts type="pie" :opts="optsSS" :chartData="chartDataSS" />
  127. </view>
  128. <view style="height: 20rpx;"></view>
  129. </view>
  130. </view>
  131. <view class="page-box">
  132. <view class="yqqsBox">
  133. <view class="tab-header">
  134. <view class="header-name">楼宇企业参保人数统计分析</view>
  135. </view>
  136. <view class="pmfx-box">
  137. <qiun-data-charts type="line" :opts="opts4" :chartData="chartDataSBRS" />
  138. </view>
  139. <view style="height: 20rpx;"></view>
  140. </view>
  141. </view>
  142. </view>
  143. </view>
  144. </template>
  145. <script>
  146. import uniFab from '@/components/uni-fab/uni-fab.vue';
  147. import loginService from '@/api/auth/loginService.js'
  148. import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
  149. import MescrollMoreItemMixin from "@/components/mescroll-uni/mixins/mescroll-more-item.js";
  150. export default {
  151. mixins: [MescrollMixin, MescrollMoreItemMixin], // 使用mixin (在main.js注册全局组件)
  152. onShow(option) {
  153. this.$auth.checkLogin()
  154. },
  155. components: {
  156. },
  157. data() {
  158. return {
  159. show: 2,
  160. LYList: [],
  161. ssInfo: {},
  162. rzList: [],
  163. ssqsLYid: '',
  164. yzlLYid: '',
  165. chartData: {},
  166. //您可以通过修改 config-ucharts.js 文件中下标为 ['column'] 的节点来配置全局默认参数,如都是默认参数,此处可以不传 opts 。实际应用过程中 opts 只需传入与全局默认参数中不一致的【某一个属性】即可实现同类型的图表显示不同的样式,达到页面简洁的需求。
  167. opts: {
  168. color: ["#1FD094"],
  169. padding: [15, 15, 0, 5],
  170. touchMoveLimit: 24,
  171. enableScroll: true,
  172. legend: {
  173. show: false
  174. },
  175. xAxis: {
  176. disableGrid: true,
  177. scrollShow: true,
  178. itemCount: 4
  179. },
  180. yAxis: {
  181. data: [{
  182. min: 0
  183. }]
  184. },
  185. extra: {
  186. column: {
  187. type: "group",
  188. width: 30,
  189. activeBgColor: "#000000",
  190. activeBgOpacity: 0.08
  191. }
  192. }
  193. },
  194. chartData2: {},
  195. //您可以通过修改 config-ucharts.js 文件中下标为 ['arcbar'] 的节点来配置全局默认参数,如都是默认参数,此处可以不传 opts 。实际应用过程中 opts 只需传入与全局默认参数中不一致的【某一个属性】即可实现同类型的图表显示不同的样式,达到页面简洁的需求。
  196. opts2: {
  197. color: ["#1890FF"],
  198. title: {
  199. name: '',
  200. fontSize: 0,
  201. },
  202. subtitle: {
  203. name: '',
  204. fontSize: 0,
  205. },
  206. extra: {
  207. arcbar: {
  208. type: "circle",
  209. width: 4,
  210. backgroundColor: "#E9E9E9",
  211. startAngle: 1.5,
  212. endAngle: 0.25,
  213. gap: 2
  214. }
  215. }
  216. },
  217. chartData3: {},
  218. //您可以通过修改 config-ucharts.js 文件中下标为 ['pie'] 的节点来配置全局默认参数,如都是默认参数,此处可以不传 opts 。实际应用过程中 opts 只需传入与全局默认参数中不一致的【某一个属性】即可实现同类型的图表显示不同的样式,达到页面简洁的需求。
  219. opts3: {
  220. color: ["#1890FF", "#91CB74", "#FAC858", "#EE6666", "#73C0DE", "#3CA272", "#FC8452", "#9A60B4",
  221. "#ea7ccc"
  222. ],
  223. padding: [5, 5, 5, 5],
  224. enableScroll: true,
  225. legend: {
  226. show: false
  227. },
  228. dataLabel: false,
  229. extra: {
  230. pie: {
  231. activeOpacity: 0.5,
  232. activeRadius: 10,
  233. offsetAngle: 0,
  234. labelWidth: 15,
  235. border: true,
  236. borderWidth: 3,
  237. borderColor: "#FFFFFF"
  238. }
  239. }
  240. },
  241. chartData4: {},
  242. chartDataSSLY: {},
  243. chartDataLLXZL: {},
  244. //您可以通过修改 config-ucharts.js 文件中下标为 ['line'] 的节点来配置全局默认参数,如都是默认参数,此处可以不传 opts 。实际应用过程中 opts 只需传入与全局默认参数中不一致的【某一个属性】即可实现同类型的图表显示不同的样式,达到页面简洁的需求。
  245. opts4: {
  246. color: ["#1890FF"],
  247. padding: [15, 10, 30, 15],
  248. enableScroll: false,
  249. legend: {
  250. show: false
  251. },
  252. xAxis: {
  253. disableGrid: true,
  254. rotateLabel: true,
  255. rotateAngle: 45,
  256. },
  257. yAxis: {
  258. gridType: "dash",
  259. dashLength: 2
  260. },
  261. extra: {
  262. line: {
  263. type: "straight",
  264. width: 2,
  265. activeType: "hollow"
  266. }
  267. }
  268. },
  269. chartDataLYQYZS: {},
  270. chartDataSS: {},
  271. chartDataSBRS: {},
  272. chartDataYQQYZS: {},
  273. chartDataYQSS: {},
  274. chartDataYQSBRS: {},
  275. optsSS: {
  276. color: ["#1890FF", "#91CB74", "#FAC858", "#EE6666", "#73C0DE", "#3CA272", "#FC8452", "#9A60B4",
  277. "#ea7ccc"
  278. ],
  279. padding: [5, 5, 5, 5],
  280. enableScroll: true,
  281. extra: {
  282. pie: {
  283. activeOpacity: 0.5,
  284. activeRadius: 10,
  285. offsetAngle: 0,
  286. labelWidth: 15,
  287. border: false,
  288. borderWidth: 3,
  289. borderColor: "#FFFFFF"
  290. }
  291. }
  292. }
  293. }
  294. },
  295. created() {
  296. this.getParkList()
  297. },
  298. mounted() {
  299. this.getServerData();
  300. this.getStatisticsForPark()
  301. this.getStatisticsForBuild()
  302. this.AppFirst()
  303. },
  304. methods: {
  305. changeData() {
  306. this.AppFirstAddNwe()
  307. },
  308. changeShow(index) {
  309. this.show = index
  310. },
  311. // 楼宇新增企业月增量
  312. AppFirstAddNwe() {
  313. loginService.AppFirstAddNwe({
  314. searchid: this.yzlLYid
  315. }).then(({
  316. data
  317. }) => {
  318. let keys = Object.keys(data[0]);
  319. let values = Object.values(data[0]);
  320. let res4 = {
  321. categories: keys,
  322. series: [{
  323. name: "新增企业数",
  324. data: values
  325. }]
  326. };
  327. this.chartDataLLXZL = JSON.parse(JSON.stringify(res4));
  328. }).catch(e => {
  329. console.log(e)
  330. })
  331. },
  332. changeSSLYId() {
  333. this.AppFirstAddTotle()
  334. },
  335. // 税收
  336. AppFirstAddTotle() {
  337. loginService.AppFirstAddTotle({
  338. searchid: this.ssqsLYid
  339. }).then(({
  340. data
  341. }) => {
  342. let keys = Object.keys(data[0]);
  343. let values = Object.values(data[0]);
  344. let res4 = {
  345. categories: keys,
  346. series: [{
  347. name: "税收",
  348. data: values
  349. }]
  350. };
  351. this.chartDataSSLY = JSON.parse(JSON.stringify(res4));
  352. }).catch(e => {
  353. console.log(e)
  354. })
  355. },
  356. getParkList() {
  357. loginService.list({
  358. current: 1,
  359. size: 1000000,
  360. }).then(({
  361. data
  362. }) => {
  363. this.LYList = data.records.map((item) => {
  364. return {
  365. label: item.buildingName,
  366. value: item.id
  367. }
  368. })
  369. this.ssqsLYid = this.LYList[0].value
  370. this.yzlLYid = this.LYList[0].value
  371. this.AppFirstAddTotle()
  372. this.AppFirstAddNwe()
  373. }).catch(e => {
  374. console.log(e)
  375. })
  376. },
  377. AppFirst() {
  378. loginService.AppFirst().then(({
  379. data
  380. }) => {
  381. let lyssList = data[0];
  382. let keys = Object.keys(lyssList);
  383. let values = Object.values(lyssList);
  384. let res = {
  385. categories: keys,
  386. series: [{
  387. name: "税收",
  388. data: values
  389. }]
  390. };
  391. this.chartData = JSON.parse(JSON.stringify(res));
  392. this.ssInfo = data[1]
  393. let res2 = {
  394. series: [{
  395. color: "#2fc25b",
  396. data: Number(this.ssInfo.percentage).toFixed(2)
  397. }]
  398. };
  399. this.chartData2 = JSON.parse(JSON.stringify(res2));
  400. let rzList = data[2];
  401. const rzListNew = [];
  402. for (const key in rzList) {
  403. if (rzList.hasOwnProperty(key)) {
  404. rzListNew.push({
  405. name: key,
  406. value: parseFloat(rzList[key]).toFixed(2)
  407. });
  408. }
  409. }
  410. this.rzList = rzListNew.slice(0, 5)
  411. let lyslList = data[3]
  412. let lyslListNew = []
  413. for (const key in lyslList) {
  414. if (lyslList.hasOwnProperty(key)) {
  415. lyslListNew.push({
  416. 'name': this.$dictUtils.getDictLabel("industrial_type", key, '-'),
  417. 'value': parseFloat(lyslList[key]).toFixed(2) * 100
  418. });
  419. }
  420. }
  421. let res3 = {
  422. series: [
  423. {
  424. data: lyslListNew
  425. }
  426. ]
  427. }
  428. this.chartData3 = JSON.parse(JSON.stringify(res3));
  429. }).catch(e => {
  430. console.log(e)
  431. })
  432. },
  433. getStatisticsForBuild() {
  434. loginService.getStatisticsForBuild({}).then(({
  435. data
  436. }) => {
  437. let buildNameArr = data.map(item => item.building_name)
  438. let buildQYZS = data.map(item => item.qycount)
  439. let buildSSZE = data.map(item => item.ssze)
  440. let buildSBRS = data.map(item => item.sbuser)
  441. let res = {
  442. categories: buildNameArr,
  443. series: [{
  444. name: "企业总数",
  445. data: buildQYZS
  446. }]
  447. };
  448. this.chartDataLYQYZS = JSON.parse(JSON.stringify(res));
  449. // chartDataSBRS
  450. let resCB = {
  451. categories: buildNameArr,
  452. series: [{
  453. name: "企业参保人数统计",
  454. data: buildSBRS
  455. }]
  456. };
  457. this.chartDataSBRS = JSON.parse(JSON.stringify(resCB));
  458. let ssList = data.map((item) => {
  459. return {
  460. name: item.building_name,
  461. value: item.ssze
  462. }
  463. })
  464. let res2 = {
  465. series: [{
  466. data: ssList
  467. }]
  468. };
  469. this.chartDataSS = JSON.parse(JSON.stringify(res2));
  470. }).catch(e => {
  471. console.log(e)
  472. })
  473. },
  474. getStatisticsForPark() {
  475. loginService.getStatisticsForPark({
  476. }).then(({
  477. data
  478. }) => {
  479. let buildNameArr = data.map(item => item.park_name)
  480. let buildQYZS = data.map(item => item.qycount)
  481. let buildSSZE = data.map(item => item.ssze)
  482. let buildSBRS = data.map(item => item.sbuser)
  483. let res = {
  484. categories: buildNameArr,
  485. series: [{
  486. name: "企业总数",
  487. data: buildQYZS
  488. }]
  489. };
  490. this.chartDataYQQYZS = JSON.parse(JSON.stringify(res));
  491. // chartDataSBRS
  492. let resCB = {
  493. categories: buildNameArr,
  494. series: [{
  495. name: "企业参保人数统计",
  496. data: buildSBRS
  497. }]
  498. };
  499. this.chartDataYQSBRS = JSON.parse(JSON.stringify(resCB));
  500. let ssList = data.map((item) => {
  501. return {
  502. name: item.park_name,
  503. value: item.ssze
  504. }
  505. })
  506. let res2 = {
  507. series: [{
  508. data: ssList
  509. }]
  510. };
  511. this.chartDataYQSS = JSON.parse(JSON.stringify(res2));
  512. }).catch(e => {
  513. console.log(e)
  514. })
  515. },
  516. getServerData() {
  517. //模拟从服务器获取数据时的延时
  518. setTimeout(() => {
  519. //模拟服务器返回数据,如果数据格式和标准格式不同,需自行按下面的格式拼接
  520. }, 500);
  521. },
  522. },
  523. }
  524. </script>
  525. <style>
  526. @font-face {
  527. font-family: 'DIN';
  528. /* 自定义字体名称 */
  529. src: url('/static/fonts/DINSchrift.ttf');
  530. /* 字体文件路径 */
  531. }
  532. .header-line {
  533. display: flex;
  534. background: #36A7F3;
  535. font-weight: normal;
  536. font-size: 32rpx;
  537. color: #fff;
  538. justify-content: space-around;
  539. height: 240rpx;
  540. line-height: 80rpx;
  541. }
  542. .page-box {
  543. position: relative;
  544. top: -160rpx;
  545. }
  546. .yqshpmfxBox {
  547. width: 706rpx;
  548. border-radius: 40rpx;
  549. background: #fff;
  550. margin-left: auto;
  551. margin-right: auto;
  552. box-shadow: 0px 8px 16px 2px rgba(101, 101, 101, 0.2);
  553. }
  554. .actClass{
  555. color: #FAF82F;
  556. }
  557. .yqqsBox {
  558. margin-top: 30rpx;
  559. width: 706rpx;
  560. border-radius: 40rpx;
  561. background: #fff;
  562. margin-left: auto;
  563. margin-right: auto;
  564. box-shadow: 0px 8px 16px 2px rgba(101, 101, 101, 0.2);
  565. }
  566. .tab-header {
  567. display: flex;
  568. justify-content: space-between;
  569. padding-left: 40rpx;
  570. padding-right: 40rpx;
  571. border-bottom: 1rpx solid #D5D4D0;
  572. align-items: center;
  573. }
  574. .header-name {
  575. font-size: 32rpx;
  576. color: #40547E;
  577. line-height: 102rpx;
  578. }
  579. .pmfx-box {
  580. height: 440rpx;
  581. }
  582. .ssfx-box {
  583. height: 650rpx;
  584. }
  585. .line-box {
  586. height: 30rpx;
  587. border-bottom: 1rpx solid #D5D4D0;
  588. }
  589. .ssbox {
  590. display: flex;
  591. }
  592. .ss-left-box {
  593. flex: 1;
  594. display: flex;
  595. flex-direction: column;
  596. align-items: center;
  597. justify-content: center;
  598. height: 156rpx;
  599. border-right: 1rpx solid #D5D4D0;
  600. }
  601. .ss-right-box {
  602. flex: 1;
  603. display: flex;
  604. justify-content: center;
  605. align-items: center;
  606. }
  607. .num {
  608. font-weight: bold;
  609. font-size: 44rpx;
  610. font-family: 'DIN';
  611. color: #070303;
  612. }
  613. .unit {
  614. font-size: 28rpx;
  615. color: #07245A;
  616. opacity: 0.7;
  617. }
  618. .right-text-box {
  619. flex: 1;
  620. }
  621. .pie-box {
  622. height: 156rpx;
  623. width: 110rpx;
  624. }
  625. .page-center-box {
  626. display: flex;
  627. width: 706rpx;
  628. margin-left: auto;
  629. margin-right: auto;
  630. justify-content: space-between;
  631. margin-top: 30rpx;
  632. }
  633. .center-left-box {
  634. width: 344rpx;
  635. border-radius: 40rpx;
  636. border-radius: 40rpx;
  637. padding-left: 20rpx;
  638. padding-right: 20rpx;
  639. background: #fff;
  640. box-shadow: 0px 8px 16px 2px rgba(101, 101, 101, 0.2);
  641. padding-bottom: 30rpx;
  642. }
  643. .center-right-box {
  644. width: 344rpx;
  645. border-radius: 40rpx;
  646. border-radius: 40rpx;
  647. padding-left: 20rpx;
  648. padding-right: 20rpx;
  649. background: #fff;
  650. box-shadow: 0px 8px 16px 2px rgba(101, 101, 101, 0.2);
  651. padding-bottom: 30rpx;
  652. }
  653. .center-title {
  654. font-size: 24rpx;
  655. color: #064875;
  656. line-height: 18px;
  657. opacity: 0.7;
  658. padding-left: 22rpx;
  659. padding-top: 23rpx;
  660. padding-bottom: 23rpx;
  661. }
  662. .table-line {
  663. display: flex;
  664. line-height: 50rpx;
  665. height: 50rpx;
  666. }
  667. .table-line:nth-child(odd) {
  668. background-color: #fff;
  669. }
  670. .table-line:nth-child(even) {
  671. background-color: #F1F6F9;
  672. }
  673. .index {
  674. width: 15%;
  675. text-align: center;
  676. font-size: 28rpx;
  677. color: #122F64;
  678. font-family: 'DIN';
  679. }
  680. .name {
  681. font-size: 26rpx;
  682. color: #242323;
  683. width: 65%;
  684. overflow: hidden;
  685. text-overflow: ellipsis;
  686. white-space: nowrap;
  687. }
  688. .percent {
  689. font-weight: bold;
  690. font-size: 28rpx;
  691. color: #219BED;
  692. font-family: 'DIN';
  693. }
  694. .right-box-in {
  695. height: 220rpx;
  696. }
  697. </style>