home.vue 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. <template>
  2. <div class="dashboard">
  3. <el-container>
  4. <el-main>
  5. <el-row :gutter="20">
  6. <el-col :span="8">
  7. <el-card class="box-card">
  8. <template #header>
  9. <div class="card-header">
  10. <span>{{lastYear+'年'}}贷款总额</span>
  11. </div>
  12. </template>
  13. <div class="card-content">
  14. <h2>¥ {{ formatNumber(loanAmount) }}万元</h2>
  15. </div>
  16. </el-card>
  17. </el-col>
  18. <el-col :span="8">
  19. <el-card class="box-card">
  20. <template #header>
  21. <div class="card-header">
  22. <span>{{lastYear+'年'}}税收总额</span>
  23. </div>
  24. </template>
  25. <div class="card-content">
  26. <h2>¥ {{ formatNumber(taxAmount) }}</h2>
  27. </div>
  28. </el-card>
  29. </el-col>
  30. <el-col :span="8">
  31. <el-card class="box-card">
  32. <template #header>
  33. <div class="card-header">
  34. <span>企业总数</span>
  35. </div>
  36. </template>
  37. <div class="card-content">
  38. <h2>{{ formatNumber(totalCompanies)+"家" }}</h2>
  39. </div>
  40. </el-card>
  41. </el-col>
  42. </el-row>
  43. <el-row :gutter="20" class="mt-4">
  44. <el-col :span="12">
  45. <el-card class="box-card">
  46. <template #header>
  47. <div class="card-header">
  48. <span>企业评级分布</span>
  49. </div>
  50. </template>
  51. <div class="chart-container" ref="pieChartContainer"></div>
  52. </el-card>
  53. </el-col>
  54. <el-col :span="12">
  55. <el-card class="box-card">
  56. <template #header>
  57. <div class="card-header">
  58. <span>企业评级数量</span>
  59. </div>
  60. </template>
  61. <el-descriptions :column="1" border>
  62. <el-descriptions-item label="AAA">
  63. {{ companyRatings.AAA || 0 }}
  64. </el-descriptions-item>
  65. <el-descriptions-item label="AA">
  66. {{ companyRatings.AA || 0 }}
  67. </el-descriptions-item>
  68. <el-descriptions-item label="A">
  69. {{ companyRatings.A || 0 }}
  70. </el-descriptions-item>
  71. <el-descriptions-item label="B">
  72. {{ companyRatings.B || 0 }}
  73. </el-descriptions-item>
  74. <el-descriptions-item label="C">
  75. {{ companyRatings.C || 0 }}
  76. </el-descriptions-item>
  77. <el-descriptions-item label="D">
  78. {{ companyRatings.D || 0 }}
  79. </el-descriptions-item>
  80. </el-descriptions>
  81. </el-card>
  82. </el-col>
  83. </el-row>
  84. <el-row :gutter="20" class="mt-4">
  85. <el-col :span="24">
  86. <el-card class="box-card">
  87. <template #header>
  88. <div class="card-header">
  89. <span>快速链接</span>
  90. </div>
  91. </template>
  92. <div class="quick-links">
  93. <el-link @click="()=>{router.push('/qyxypj/xypjdj')}">
  94. <el-image src="/信用报告.png" fit="cover" class="link-image">
  95. <template #error>
  96. <div class="image-slot">
  97. 企业信用评价等级图片
  98. </div>
  99. </template>
  100. </el-image>
  101. <span>企业信用评价等级</span>
  102. </el-link>
  103. <el-link @click="()=>{router.push('/qyxypj/qypjdf')}">
  104. <el-image src="/得分记录.png" fit="cover" class="link-image">
  105. <template #error>
  106. <div class="image-slot">
  107. 企业评价得分图片
  108. </div>
  109. </template>
  110. </el-image>
  111. <span>企业评价得分</span>
  112. </el-link>
  113. <el-link @click="()=>{router.push('/qyjydtfx/dkfx')}">
  114. <el-image src="/委托贷款放款.png" fit="cover" class="link-image">
  115. <template #error>
  116. <div class="image-slot">
  117. 贷款分析图片
  118. </div>
  119. </template>
  120. </el-image>
  121. <span>贷款分析</span>
  122. </el-link>
  123. <el-link @click="()=>{router.push('/qyjydtfx/ssfx')}">
  124. <el-image src="/总税收.png" fit="cover" class="link-image">
  125. <template #error>
  126. <div class="image-slot">
  127. 税收分析图片
  128. </div>
  129. </template>
  130. </el-image>
  131. <span>税收分析</span>
  132. </el-link>
  133. </div>
  134. </el-card>
  135. </el-col>
  136. </el-row>
  137. </el-main>
  138. </el-container>
  139. </div>
  140. </template>
  141. <script setup>
  142. import { ref, onMounted } from 'vue'
  143. import * as echarts from 'echarts'
  144. import request from "@/utils/request.js";
  145. import {useRouter} from "vue-router";
  146. const lastYear = new Date().getFullYear() - 1;
  147. const currentYear = new Date().getFullYear()
  148. const router = useRouter();
  149. // 静态数据
  150. const loanAmount = ref(0)
  151. const taxAmount = ref(0)
  152. const companyRatings = ref({
  153. AAA: 0,
  154. AA: 0,
  155. A: 0,
  156. B: 0,
  157. C: 0,
  158. D: 0
  159. })
  160. const totalCompanies = ref(0)
  161. // 格式化数字
  162. const formatNumber = (num) => {
  163. return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")
  164. }
  165. // 初始化图表
  166. let pieChart
  167. onMounted(() => {
  168. })
  169. const initPieChart = () => {
  170. const chartDom = document.querySelector('.chart-container')
  171. pieChart = echarts.init(chartDom)
  172. const option = {
  173. tooltip: {
  174. trigger: 'item'
  175. },
  176. legend: {
  177. orient: 'horizontal',
  178. left: 'center',
  179. top: 'bottom'
  180. },
  181. series: [
  182. {
  183. name: '企业评级',
  184. type: 'pie',
  185. radius: '50%',
  186. data: Object.entries(companyRatings.value).map(([key, value]) => ({ name: key, value })),
  187. emphasis: {
  188. itemStyle: {
  189. shadowBlur: 10,
  190. shadowOffsetX: 0,
  191. shadowColor: 'rgba(0, 0, 0, 0.5)'
  192. }
  193. }
  194. }
  195. ]
  196. }
  197. pieChart.setOption(option)
  198. }
  199. const getDkze =async ()=>{
  200. const res = await request.get('/basicData/xcrSummaryLoanDetails/annual-statistics',{
  201. params:{
  202. year:lastYear
  203. }
  204. });
  205. loanAmount.value = res.data.totalLoanAmount;
  206. }
  207. const getSsze =async ()=>{
  208. const res = await request.get('/basicData/xcrPayTaxes/of-year-list');
  209. taxAmount.value = res.data.ofYearDetail.reduce((acc, cur) => acc + cur.lastYearTaxesTotal, 0).toFixed(2);
  210. }
  211. const getQypf = async ()=>{
  212. const res = await request.get('/basicData/xcrEBaseinfo/getCreditScoreList',{
  213. params:{
  214. pageNum: 1,
  215. pageSize: 9999,
  216. condition: ['AAA', 'AA', 'A', 'B', 'C', 'D'].join(',')
  217. }
  218. });
  219. totalCompanies.value = res.data.totalSize;
  220. // res.data.result是数组将其中的grade属性=AAA AA A B C D 的企业拿出来赋值出去
  221. companyRatings.value = res.data.result.reduce((acc, cur) => {
  222. acc[cur.grade] = (acc[cur.grade] || 0) + 1;
  223. return acc;
  224. }, {});
  225. initPieChart()
  226. }
  227. const getData = ()=>{
  228. getDkze()
  229. getSsze()
  230. getQypf()
  231. }
  232. onMounted(()=>{
  233. getData();
  234. })
  235. </script>
  236. <style scoped>
  237. .dashboard {
  238. font-family: 'Arial', sans-serif;
  239. background-color: #f0f2f5;
  240. min-height: 100vh;
  241. }
  242. .el-header {
  243. background-color: #1890ff;
  244. color: white;
  245. line-height: 60px;
  246. text-align: center;
  247. }
  248. .el-main {
  249. padding: 20px;
  250. }
  251. .box-card {
  252. margin-bottom: 20px;
  253. transition: all 0.3s;
  254. height: 100%;
  255. }
  256. .box-card:hover {
  257. box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
  258. transform: translateY(-5px);
  259. }
  260. .card-header {
  261. display: flex;
  262. justify-content: space-between;
  263. align-items: center;
  264. }
  265. .card-content {
  266. text-align: center;
  267. font-size: 24px;
  268. color: #1890ff;
  269. }
  270. .chart-container {
  271. height: 400px;
  272. }
  273. h1 {
  274. margin: 0;
  275. font-size: 24px;
  276. }
  277. h2 {
  278. margin: 0;
  279. font-size: 36px;
  280. color: #1890ff;
  281. }
  282. .quick-links {
  283. display: flex;
  284. justify-content: space-around;
  285. flex-wrap: wrap;
  286. gap: 20px;
  287. }
  288. .el-link {
  289. display: flex;
  290. flex-direction: column;
  291. align-items: center;
  292. text-decoration: none;
  293. color: #1890ff;
  294. transition: all 0.3s;
  295. }
  296. .el-link:hover {
  297. transform: translateY(-5px);
  298. }
  299. .link-image {
  300. width: 100px;
  301. height: 100px;
  302. border-radius: 10px;
  303. margin-bottom: 10px;
  304. overflow: hidden;
  305. }
  306. .image-slot {
  307. display: flex;
  308. justify-content: center;
  309. align-items: center;
  310. width: 100%;
  311. height: 100%;
  312. background: #f5f7fa;
  313. color: #909399;
  314. font-size: 14px;
  315. }
  316. </style>