index.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <template>
  2. <div class="fasc-card-container">
  3. <el-card
  4. v-for="card in cardInfos"
  5. :key="card.facs_type"
  6. :class="isComplete(card.children)?'completed' : 'incomplete'"
  7. class="fasc-card"
  8. >
  9. <div slot="header" class="clearfix fasc-card-hearder" @click="goToDetailPage(card)">
  10. <span>{{ card.facs_type.split('-')[1] }}</span>
  11. </div>
  12. <el-collapse v-model="card.activeName" accordion>
  13. <el-collapse-item v-for="time in card.children" :key="time.jian_ce_zhou_qi_" :name="time.jian_ce_zhou_qi_">
  14. <template slot="title">
  15. <el-tag size="medium" effect="dark" style="margin-right:10px" :type="isFinish(time.children)?'success':'warning'">{{ time.jian_ce_zhou_qi_ }}</el-tag>
  16. <span style="font-size:16px">{{ todoTitle(time.children) }}</span>
  17. </template>
  18. <div
  19. v-for="item in time.children"
  20. :key="item.name_"
  21. class="card-item"
  22. style="margin-left:20px;"
  23. >
  24. <el-tag size="mini" effect="dark" :type="item.todo===0?'success':'warning'">{{ item.name_ }}</el-tag>
  25. 已监测:{{ item.done }},待监测:{{ item.todo }}
  26. </div>
  27. </el-collapse-item>
  28. </el-collapse>
  29. </el-card>
  30. </div>
  31. </template>
  32. <script>
  33. import { getFacsDaily } from '@/api/platform/system/jbdHome'
  34. export default {
  35. data () {
  36. return {
  37. cardInfos: []
  38. }
  39. },
  40. mounted () {
  41. getFacsDaily().then(res => {
  42. const list = { '每日': 1, '每周': 2, '每月': 3, '每季度': 4, '每半年': 5, '每年': 6 }
  43. const data = res.data || []
  44. // 先按照 日 周 月 季度 半年 年 排序
  45. data.sort((a, b) => {
  46. if (list[a.jian_ce_zhou_qi_] && list[b.jian_ce_zhou_qi_]) {
  47. if (a.jian_ce_zhou_qi_ === b.jian_ce_zhou_qi_) {
  48. // 对部门进行排序
  49. return a.name_.localeCompare(b.name_, 'zh') // 'zh' 指定中文排序
  50. } else {
  51. return list[a.jian_ce_zhou_qi_] - list[b.jian_ce_zhou_qi_]
  52. }
  53. }
  54. })
  55. console.log('接口数据', data)
  56. const result = []
  57. data.forEach(item => {
  58. const { facs_type, jian_ce_zhou_qi_, name_, pagePath } = item
  59. if (facs_type && jian_ce_zhou_qi_ && name_) {
  60. // 查找现有的分类项
  61. let facsTypeObj = result.find(obj => obj.facs_type === facs_type)
  62. if (!facsTypeObj) {
  63. facsTypeObj = { facs_type, children: [], pagePath }
  64. result.push(facsTypeObj)
  65. }
  66. let jianCeObj = facsTypeObj.children.find(obj => obj.jian_ce_zhou_qi_ === jian_ce_zhou_qi_)
  67. if (!jianCeObj) {
  68. jianCeObj = { jian_ce_zhou_qi_, children: [] }
  69. facsTypeObj.children.push(jianCeObj)
  70. }
  71. const name_Obj = jianCeObj.children.find(obj => obj.name_ === item.name_)
  72. if (!name_Obj) {
  73. jianCeObj.children.push({ ...item })
  74. } else {
  75. name_Obj.done += item.done
  76. name_Obj.todo += item.todo
  77. }
  78. }
  79. })
  80. // 对类型进行排序
  81. result.sort((a, b) => {
  82. return a.facs_type.localeCompare(b.facs_type, 'zh')
  83. })
  84. console.log('格式化数据', result)
  85. this.cardInfos = result
  86. })
  87. },
  88. methods: {
  89. goToDetailPage (card) {
  90. if (!card.pagePath) {
  91. this.$message.warning('该卡片暂未配置页面路径')
  92. return
  93. }
  94. this.$router.push(card.pagePath)
  95. },
  96. // 计算已监测总数 和 待监测总数
  97. todoTitle (data) {
  98. let done = 0
  99. let todo = 0
  100. data.forEach(item => {
  101. done += item.done
  102. todo += item.todo
  103. })
  104. return `已监测:${done},待监测:${todo}`
  105. },
  106. // 是否已完成
  107. isFinish (data) {
  108. let todo = 0
  109. data.forEach(item => {
  110. todo += item.todo
  111. })
  112. return todo === 0
  113. },
  114. // 所有年份已完成
  115. isComplete (data) {
  116. let todo = 0
  117. data.forEach(item => {
  118. item.children.forEach(i => {
  119. todo += i.todo
  120. })
  121. })
  122. return todo === 0
  123. }
  124. }
  125. }
  126. </script>
  127. <style lang="scss" scoped>
  128. .fasc-card-container {
  129. display: flex;
  130. flex-wrap: wrap;
  131. justify-content: flex-start;
  132. max-height: calc(100vh - 90px);
  133. overflow: auto;
  134. .fasc-card-hearder{
  135. display: flex;
  136. justify-content: space-between;
  137. align-items: center;
  138. .el-button{
  139. padding: 2px 10px;
  140. }
  141. }
  142. .fasc-card {
  143. width: 300px;
  144. margin: 20px;
  145. transition: all 0.3s ease;
  146. cursor: pointer;
  147. &:hover {
  148. transform: scale(1.05);
  149. box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
  150. }
  151. ::v-deep {
  152. .el-card__header {
  153. padding: 16px 20px;
  154. font-weight: bold;
  155. }
  156. .el-card__body {
  157. padding: 16px;
  158. }
  159. }
  160. .card-item {
  161. margin-bottom: 8px;
  162. }
  163. }
  164. .incomplete {
  165. // box-shadow: 0 2px 12px 0 rgba(230, 162, 60, .1);
  166. ::v-deep {
  167. .el-card__header {
  168. background: #E6A23C;
  169. }
  170. }
  171. }
  172. .completed {
  173. // box-shadow: 0 2px 12px 0 rgba(103, 194, 58, .1);
  174. ::v-deep {
  175. .el-card__header {
  176. background: #67C23A;
  177. }
  178. }
  179. }
  180. }
  181. </style>