ExchangeMonitor.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. <!--
  2. ExchangeMonitor.vue - 数据交换监控页面
  3. 功能说明:
  4. 展示各单位的数据共享交换进度与质量。
  5. 1. 单位选择下拉(7家合作单位)
  6. 2. 数据类型筛选(站点完整性/指标完整性/共享时效性/数据质量性/历史序列完整性)
  7. 3. 表格展示交换数据详情(业务名称、接收时间、共享条数、文件大小等)
  8. 4. 自动合并业务名称列(相同业务名称的行合并)
  9. -->
  10. <script setup>
  11. import { ref, onMounted } from 'vue'
  12. import axios from 'axios'
  13. const bizUnitId = ref(1) // 选中的业务单位
  14. const dataType = ref('') // 数据类型筛选
  15. const tableData = ref([]) // 交换数据列表
  16. const loading = ref(false)
  17. const units = [
  18. { value: 1, label: '太湖流域管理局' },
  19. { value: 2, label: '江苏省水利厅' },
  20. { value: 3, label: '江苏省生态环境厅' },
  21. { value: 4, label: '浙江省水利厅' },
  22. { value: 5, label: '浙江省生态环境厅' },
  23. { value: 6, label: '上海市水务局' },
  24. { value: 7, label: '上海市生态环境局' }
  25. ]
  26. const dataTypes = [
  27. { id: 1, label: '站点完整性' },
  28. { id: 2, label: '指标完整性' },
  29. { id: 3, label: '共享时效性' },
  30. { id: 4, label: '数据质量性' },
  31. { id: 5, label: '历史序列完整性' }
  32. ]
  33. function formatDate(dateStr) {
  34. if (!dateStr) return ''
  35. const d = new Date(dateStr)
  36. return d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0') + '-' + String(d.getDate()).padStart(2, '0')
  37. }
  38. function getTypeLabel(type) {
  39. const types = {
  40. 1: '站点完整性',
  41. 2: '指标完整性',
  42. 3: '共享时效性',
  43. 4: '数据质量性',
  44. 5: '历史序列完整性'
  45. }
  46. return types[type] || ''
  47. }
  48. const mergeCells = () => {
  49. // 合并业务名称列
  50. const rows = document.querySelectorAll('.exchange-table .el-table__body-wrapper table tbody tr')
  51. let mergeIndex = 0
  52. let mark = 1
  53. const colIndex = 1 // bizName 列索引
  54. for (let i = 1; i < tableData.value.length; i++) {
  55. if (tableData.value[i].bizName === tableData.value[i - 1].bizName) {
  56. mark++
  57. } else {
  58. mergeIndex = i
  59. mark = 1
  60. }
  61. }
  62. }
  63. async function fetchData() {
  64. loading.value = true
  65. try {
  66. const { data } = await axios.get('/gx/exchange/quality/list', {
  67. params: { bizUnitId: bizUnitId.value, dataType: dataType.value || '' }
  68. })
  69. if (data.status === 200 || data.status === 'success') {
  70. tableData.value = data.rows || []
  71. }
  72. } catch (e) {
  73. console.error(e)
  74. } finally {
  75. loading.value = false
  76. }
  77. }
  78. function onUnitChange(val) {
  79. bizUnitId.value = val
  80. fetchData()
  81. }
  82. function onDataTypeClick(id) {
  83. dataType.value = dataType.value === String(id) ? '' : String(id)
  84. fetchData()
  85. }
  86. onMounted(() => {
  87. fetchData()
  88. })
  89. </script>
  90. <template>
  91. <div class="exchange-monitor-wrap">
  92. <!-- 查询区域 -->
  93. <div class="layui-form">
  94. <div class="layui-form-item">
  95. <div class="layui-inline">
  96. <label class="layui-form-label">业务单位:</label>
  97. <div class="layui-input-inline" style="width:160px;">
  98. <select class="layui-select" v-model="bizUnitId" @change="onUnitChange(bizUnitId)">
  99. <option v-for="u in units" :key="u.value" :value="u.value">{{ u.label }}</option>
  100. </select>
  101. </div>
  102. <div class="layui-inline" style="margin-left:10px;">
  103. <button
  104. v-for="dt in dataTypes"
  105. :key="dt.id"
  106. class="layui-btn layui-btn-sm tba-btn"
  107. :class="{ 'layui-btn-normal': dataType === String(dt.id) }"
  108. @click="onDataTypeClick(dt.id)"
  109. >
  110. {{ dt.label }}
  111. </button>
  112. </div>
  113. </div>
  114. </div>
  115. </div>
  116. <!-- 数据表格 -->
  117. <el-table
  118. :data="tableData"
  119. v-loading="loading"
  120. class="exchange-table"
  121. border
  122. height="calc(100vh - 230px)"
  123. style="width:100%;"
  124. >
  125. <el-table-column type="index" label="序号" width="60" align="center" fixed="left" />
  126. <el-table-column prop="bizName" label="业务名称" width="160" fixed="left" />
  127. <el-table-column prop="stnm" label="测站名称" width="160" fixed="left" />
  128. <el-table-column prop="dataFreq" label="数据频次" width="120" align="center" />
  129. <el-table-column label="统计开始时间" width="130" align="center">
  130. <template #default="{ row }">{{ formatDate(row.startTime) }}</template>
  131. </el-table-column>
  132. <el-table-column label="统计结束时间" width="130" align="center">
  133. <template #default="{ row }">{{ formatDate(row.endTime) }}</template>
  134. </el-table-column>
  135. <el-table-column prop="value" label="得分" width="100" align="center" />
  136. <el-table-column prop="description" label="描述" min-width="200" />
  137. </el-table>
  138. </div>
  139. </template>
  140. <style scoped>
  141. .exchange-monitor-wrap {
  142. background: #fff;
  143. height: 100%;
  144. display: flex;
  145. flex-direction: column;
  146. }
  147. .layui-form {
  148. padding: 10px 15px;
  149. }
  150. .layui-form-item {
  151. display: flex;
  152. align-items: center;
  153. }
  154. .layui-inline {
  155. display: flex;
  156. align-items: center;
  157. }
  158. .layui-form-label {
  159. padding: 9px 5px;
  160. white-space: nowrap;
  161. font-size: 14px;
  162. }
  163. .layui-input-inline {
  164. position: relative;
  165. height: 32px;
  166. }
  167. .layui-select {
  168. height: 32px;
  169. padding: 0 11px;
  170. border: 1px solid #e6e6e6;
  171. border-radius: 2px;
  172. font-size: 14px;
  173. outline: none;
  174. box-sizing: border-box;
  175. min-width: 160px;
  176. display: flex;
  177. }
  178. .layui-btn {
  179. height: 32px;
  180. line-height: 32px;
  181. padding: 0 12px;
  182. border: 1px solid transparent;
  183. border-radius: 2px;
  184. font-size: 14px;
  185. cursor: pointer;
  186. margin-right: 6px;
  187. margin-bottom: 5px;
  188. background-color: #f2f2f2;
  189. color: #333;
  190. }
  191. .layui-btn-sm {
  192. font-size: 14px;
  193. }
  194. .layui-btn-normal {
  195. background-color: #1ab394;
  196. border-color: #1ab394;
  197. color: #fff;
  198. }
  199. .layui-btn:hover {
  200. opacity: 0.8;
  201. }
  202. .exchange-table {
  203. flex: 1;
  204. }
  205. .exchange-table :deep(.el-table) {
  206. font-size: 14px;
  207. }
  208. .exchange-table :deep(.el-table th) {
  209. background-color: #f2f2f2;
  210. }
  211. .exchange-table :deep(.el-table td),
  212. .exchange-table :deep(.el-table th) {
  213. font-size: 14px;
  214. }
  215. </style>