industryOverdueStatistics.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. <template>
  2. <div class="scroll-wrapper" v-show="isShow">
  3. <div class="title-name">
  4. <!-- <el-icon><TrendCharts /></el-icon> -->
  5. <span>{{ titleName }}</span>
  6. </div>
  7. <div class="statistics-container">
  8. <!-- 固定首列 -->
  9. <div class="fixed-first start-card card-border-total">
  10. <div class="card-title card-title-total">
  11. <div>{{ dataList?.[0]?.title }}</div>
  12. </div>
  13. <div class="card-body">
  14. <div class="card-body-left">
  15. <div class="card-count">{{ dataList?.[0]?.count }}</div>
  16. <div class="card-text">{{ dataList?.[0]?.countName }}</div>
  17. </div>
  18. <div class="card-body-right">
  19. <div class="card-count">{{ dataList?.[0]?.percent }}%</div>
  20. <div class="card-text">{{ dataList?.[0]?.percentName }}</div>
  21. </div>
  22. </div>
  23. </div>
  24. <!-- 可滚动内容 -->
  25. <div class="scroll-content-wrapper">
  26. <div class="scroll-content">
  27. <div
  28. v-for="(item, index) in dataList?.slice(1)"
  29. :key="index"
  30. class="start-card"
  31. :class="item.isMain ? 'card-border-total' : 'card-border-point'"
  32. >
  33. <div class="card-title" :class="item.isMain ? 'card-title-total' : 'card-title-point'">
  34. <div>{{ item.title }}</div>
  35. </div>
  36. <div class="card-body">
  37. <div class="card-body-left">
  38. <div class="card-count">{{ item.count }}</div>
  39. <div class="card-text">{{ item.countName }}</div>
  40. </div>
  41. <div class="card-body-right">
  42. <div class="card-count">{{ item.percent }}%</div>
  43. <div class="card-text">{{ item.percentName }}</div>
  44. </div>
  45. </div>
  46. </div>
  47. </div>
  48. </div>
  49. </div>
  50. </div>
  51. </template>
  52. <script setup lang="ts">
  53. import useSystemStore from '@/store/main';
  54. import { getTimeLimitTotalCardApi } from '@/api/notificationAnalysis/situationOverdue';
  55. interface DataList {
  56. title: string;
  57. count: number;
  58. countName: string;
  59. percent: number;
  60. percentName: string;
  61. isMain?: boolean;
  62. }
  63. // 使用pinia数据
  64. const systemStore = useSystemStore();
  65. const { pageList, resDate, searchObj } = storeToRefs(systemStore);
  66. watch(
  67. [() => pageList, () => searchObj.value],
  68. ([newPageList, newSearchObj], [oldPageList, oldSearchObj]) => {
  69. getTimeLimitTotalCardData();
  70. },
  71. { deep: true }
  72. );
  73. // onMounted(() => {
  74. // getTimeLimitTotalCardData();
  75. // });
  76. const isShow = ref<any>(false);
  77. const dataList = ref<DataList[]>();
  78. const titleName = '行业外超期情况总览';
  79. async function getTimeLimitTotalCardData() {
  80. const res: any = await getTimeLimitTotalCardApi();
  81. if (res.code === 200) {
  82. isShow.value = true;
  83. dataList.value = res.data[1];
  84. } else {
  85. return [];
  86. }
  87. }
  88. </script>
  89. <style scoped lang="scss">
  90. /* 外层容器 */
  91. .scroll-wrapper {
  92. margin-top: 20px;
  93. background-color: #fff;
  94. }
  95. .title-name {
  96. padding: 20px 15px;
  97. font-weight: 700;
  98. span {
  99. padding-left: 10px;
  100. }
  101. }
  102. :deep(.el-icon) {
  103. vertical-align: -14%;
  104. color: #2350aa;
  105. }
  106. /* 主容器 */
  107. .statistics-container {
  108. display: flex;
  109. width: 100%;
  110. position: relative;
  111. }
  112. /* 固定首列 */
  113. .fixed-first {
  114. position: sticky;
  115. left: 0;
  116. z-index: 2;
  117. margin-left: 0;
  118. .stat-card {
  119. margin-left: 0;
  120. }
  121. }
  122. /* 可滚动内容的外层容器 */
  123. .scroll-content-wrapper {
  124. flex: 1;
  125. overflow-x: auto;
  126. -webkit-overflow-scrolling: touch;
  127. }
  128. /* 可滚动内容 */
  129. .scroll-content {
  130. display: flex;
  131. width: max-content;
  132. }
  133. /* 卡片通用样式 */
  134. .start-card {
  135. display: flex;
  136. flex-direction: column;
  137. flex-shrink: 0;
  138. width: 250px;
  139. height: 150px;
  140. margin-left: 12px;
  141. background: white;
  142. border-radius: 14px;
  143. border: 2px solid #2350aa;
  144. overflow: hidden;
  145. }
  146. .card-border-total {
  147. border-color: #2350aa;
  148. color: #fff;
  149. }
  150. .card-border-point {
  151. border-color: #b7cbe5;
  152. color: #2350aa;
  153. }
  154. .card-title {
  155. flex: 1;
  156. display: flex;
  157. justify-content: center;
  158. align-items: center;
  159. height: 40px;
  160. font-size: 14px;
  161. text-align: center;
  162. padding: 6px;
  163. & > div {
  164. text-align: left;
  165. display: -webkit-box;
  166. -webkit-box-orient: vertical;
  167. -webkit-line-clamp: 3;
  168. overflow: hidden;
  169. text-overflow: ellipsis;
  170. }
  171. }
  172. .card-title-total {
  173. background-color: #2350aa;
  174. }
  175. .card-title-point {
  176. background-color: #eff4fa;
  177. }
  178. .card-body {
  179. flex: 1.5;
  180. display: flex;
  181. flex-direction: row;
  182. align-items: center;
  183. justify-content: space-around;
  184. font-size: 14px;
  185. & > div:last-child {
  186. margin-left: 10px;
  187. }
  188. }
  189. .card-body-left,
  190. .card-body-right {
  191. display: flex;
  192. flex-direction: column;
  193. align-items: center;
  194. }
  195. .card-count {
  196. font-size: 24px;
  197. color: #2350aa;
  198. font-weight: bold;
  199. margin-right: 10px;
  200. }
  201. .card-text {
  202. color: #666666;
  203. }
  204. </style>