|
|
@@ -1,22 +1,22 @@
|
|
|
<template>
|
|
|
<div id="cards">
|
|
|
- <div class="card-item" v-for="(card, i) in cards" :key="card.title">
|
|
|
+ <div class="card-item" v-for="card in cardsMore" :key="card.title">
|
|
|
<div class="card-header">
|
|
|
<div class="card-header-left">{{ card.title }}</div>
|
|
|
- <div class="card-header-right">{{ '0' + (i + 1) }}</div>
|
|
|
+ <!-- <div class="card-header-right">{{ '0' + (i + 1) }}</div> -->
|
|
|
</div>
|
|
|
<dv-charts class="ring-charts" :option="card.ring" />
|
|
|
<div class="card-footer">
|
|
|
<div class="card-footer-item">
|
|
|
- <div class="footer-title">累计金额</div>
|
|
|
+ <div class="footer-title">{{ card.leftName }}</div>
|
|
|
<div class="footer-detail">
|
|
|
- <dv-digital-flop :config="card.total" style="width:70%;height:35px;" />元
|
|
|
+ <dv-digital-flop :config="card.total" style="width:70%;height:35px;" />人
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="card-footer-item">
|
|
|
- <div class="footer-title">巡查病害</div>
|
|
|
+ <div class="footer-title">{{ card.rightName }}</div>
|
|
|
<div class="footer-detail">
|
|
|
- <dv-digital-flop :config="card.num" style="width:70%;height:35px;" />处
|
|
|
+ <dv-digital-flop :config="card.num" style="width:70%;height:35px;" />人
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -25,83 +25,200 @@
|
|
|
</template>
|
|
|
|
|
|
<script setup name='cards' lang="ts">
|
|
|
-import { reactive } from 'vue'
|
|
|
+import { watch, nextTick, ref, Ref } from 'vue'
|
|
|
|
|
|
-const randomExtend = (minNum: number, maxNum: number) => {
|
|
|
- if (minNum > 100) {
|
|
|
- return parseInt(Math.random() * minNum + 1 + '', 10)
|
|
|
- } else {
|
|
|
- return parseInt(Math.random() * (maxNum - minNum + 1) + minNum + '', 10)
|
|
|
+const props = defineProps({
|
|
|
+ cardsData: {
|
|
|
+ type: Object,
|
|
|
+ default: {}
|
|
|
}
|
|
|
+})
|
|
|
+
|
|
|
+interface dataInfo {
|
|
|
+ reportId: string,
|
|
|
+ reportName: string,
|
|
|
+ overview: any,
|
|
|
+ unit: string,
|
|
|
}
|
|
|
|
|
|
-const cards = new Array(5).fill(0).map((foo, i) => reactive({
|
|
|
- title: '测试路段' + (i + i),
|
|
|
- total: {
|
|
|
- number: [randomExtend(9000, 10000)],
|
|
|
- content: '{nt}',
|
|
|
- textAlign: 'right',
|
|
|
- style: {
|
|
|
- fill: '#ea6027',
|
|
|
- fontWeight: 'bold'
|
|
|
- }
|
|
|
- },
|
|
|
- num: {
|
|
|
- number: [randomExtend(30, 60)],
|
|
|
- content: '{nt}',
|
|
|
- textAlign: 'right',
|
|
|
- style: {
|
|
|
- fill: '#26fcd8',
|
|
|
- fontWeight: 'bold'
|
|
|
- }
|
|
|
- },
|
|
|
- ring: {
|
|
|
- series: [
|
|
|
- {
|
|
|
- type: 'gauge',
|
|
|
- startAngle: -Math.PI / 2,
|
|
|
- endAngle: Math.PI * 1.5,
|
|
|
- arcLineWidth: 13,
|
|
|
- radius: '80%',
|
|
|
- data: [
|
|
|
- { name: '资金占比', value: randomExtend(40, 60) }
|
|
|
- ],
|
|
|
- axisLabel: {
|
|
|
- show: false
|
|
|
- },
|
|
|
- axisTick: {
|
|
|
- show: false
|
|
|
- },
|
|
|
- pointer: {
|
|
|
- show: false
|
|
|
- },
|
|
|
- backgroundArc: {
|
|
|
+interface arrInfo {
|
|
|
+ title: string,
|
|
|
+ unit: string,
|
|
|
+ total: number,
|
|
|
+ leftName: string,
|
|
|
+ rightName: string,
|
|
|
+ leftNum: number,
|
|
|
+ rightNum: number,
|
|
|
+}
|
|
|
+
|
|
|
+interface cardType {
|
|
|
+ title: string,
|
|
|
+ leftName: string,
|
|
|
+ rightName: string,
|
|
|
+ total: object,
|
|
|
+ num: object,
|
|
|
+ ring: object,
|
|
|
+}
|
|
|
+
|
|
|
+let ctData: Ref<arrInfo> = ref({}) as any
|
|
|
+let drData: Ref<arrInfo> = ref({}) as any
|
|
|
+let cgzData: Ref<arrInfo> = ref({}) as any
|
|
|
+let ccData: Ref<arrInfo> = ref({}) as any
|
|
|
+let csData: Ref<arrInfo> = ref({}) as any
|
|
|
+
|
|
|
+const cardsInfo: Ref<Array<arrInfo>> = ref([])
|
|
|
+const cardsMore: Ref<Array<cardType>> = ref([])
|
|
|
+
|
|
|
+watch(() => props.cardsData, () => {
|
|
|
+ ctData.value = {} as any
|
|
|
+ drData.value = {} as any
|
|
|
+ cgzData.value = {} as any
|
|
|
+ ccData.value = {} as any
|
|
|
+ csData.value = {} as any
|
|
|
+
|
|
|
+ cardsMore.value = []
|
|
|
+ cardsInfo.value = []
|
|
|
+
|
|
|
+ nextTick(() => {
|
|
|
+ props.cardsData.forEach((e: dataInfo) => {
|
|
|
+ if (e.reportId.endsWith('ct')) {
|
|
|
+ if (e.reportId.endsWith('mzct')) {
|
|
|
+ ctData.value.title = 'CT人数'
|
|
|
+ ctData.value.leftName = e.reportName
|
|
|
+ ctData.value.leftNum = Number(e.overview)
|
|
|
+ } else if (e.reportId.endsWith('cyct')) {
|
|
|
+ ctData.value.unit = e.unit
|
|
|
+ ctData.value.rightName = e.reportName
|
|
|
+ ctData.value.rightNum = Number(e.overview)
|
|
|
+ }
|
|
|
+ } else if (e.reportId.endsWith('dr')) {
|
|
|
+ if (e.reportId.endsWith('mzdr')) {
|
|
|
+ drData.value.title = 'DR人数'
|
|
|
+ drData.value.leftName = e.reportName
|
|
|
+ drData.value.leftNum = Number(e.overview)
|
|
|
+ } else if (e.reportId.endsWith('cydr')) {
|
|
|
+ drData.value.unit = e.unit
|
|
|
+ drData.value.rightName = e.reportName
|
|
|
+ drData.value.rightNum = Number(e.overview)
|
|
|
+ }
|
|
|
+ } else if (e.reportId.endsWith('cgz')) {
|
|
|
+ if (e.reportId.endsWith('mzcgz')) {
|
|
|
+ cgzData.value.title = '磁共振人数'
|
|
|
+ cgzData.value.leftName = e.reportName
|
|
|
+ cgzData.value.leftNum = Number(e.overview)
|
|
|
+ } else if (e.reportId.endsWith('cycgz')) {
|
|
|
+ cgzData.value.unit = e.unit
|
|
|
+ cgzData.value.rightName = e.reportName
|
|
|
+ cgzData.value.rightNum = Number(e.overview)
|
|
|
+ }
|
|
|
+ } else if (e.reportId.endsWith('cc')) {
|
|
|
+ if (e.reportId.endsWith('mzcc')) {
|
|
|
+ ccData.value.title = '彩超人数'
|
|
|
+ ccData.value.leftName = e.reportName
|
|
|
+ ccData.value.leftNum = Number(e.overview)
|
|
|
+ } else if (e.reportId.endsWith('cycc')) {
|
|
|
+ ccData.value.unit = e.unit
|
|
|
+ ccData.value.rightName = e.reportName
|
|
|
+ ccData.value.rightNum = Number(e.overview)
|
|
|
+ }
|
|
|
+ } else if (e.reportId.endsWith('cs')) {
|
|
|
+ if (e.reportId.endsWith('mzcs')) {
|
|
|
+ csData.value.title = '超声检查人数'
|
|
|
+ csData.value.leftName = e.reportName
|
|
|
+ csData.value.leftNum = Number(e.overview)
|
|
|
+ } else if (e.reportId.endsWith('cycs')) {
|
|
|
+ csData.value.unit = e.unit
|
|
|
+ csData.value.rightName = e.reportName
|
|
|
+ csData.value.rightNum = Number(e.overview)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ })
|
|
|
+
|
|
|
+ ctData.value.total = Number.isNaN(ctData.value.leftNum + ctData.value.rightNum) ? 0 : ctData.value.leftNum + ctData.value.rightNum
|
|
|
+ drData.value.total = Number.isNaN(drData.value.leftNum + drData.value.rightNum) ? 0 : drData.value.leftNum + drData.value.rightNum
|
|
|
+ cgzData.value.total = Number.isNaN(cgzData.value.leftNum + cgzData.value.rightNum) ? 0 : cgzData.value.leftNum + cgzData.value.rightNum
|
|
|
+ ccData.value.total = Number.isNaN(ccData.value.leftNum + ccData.value.rightNum) ? 0 : ccData.value.leftNum + ccData.value.rightNum
|
|
|
+ csData.value.total = Number.isNaN(csData.value.leftNum + csData.value.rightNum) ? 0 : csData.value.leftNum + csData.value.rightNum
|
|
|
+ cardsInfo.value.push(ctData.value)
|
|
|
+ cardsInfo.value.push(drData.value)
|
|
|
+ cardsInfo.value.push(cgzData.value)
|
|
|
+ cardsInfo.value.push(ccData.value)
|
|
|
+ cardsInfo.value.push(csData.value)
|
|
|
+
|
|
|
+ cardsInfo.value.forEach((f: arrInfo) => {
|
|
|
+ let d = {
|
|
|
+ title: f.title,
|
|
|
+ leftName: f.leftName,
|
|
|
+ rightName: f.rightName,
|
|
|
+ total: {
|
|
|
+ number: [f.leftNum],
|
|
|
+ content: '{nt}',
|
|
|
+ textAlign: 'right',
|
|
|
style: {
|
|
|
- stroke: '#224590'
|
|
|
+ fill: '#ea6027',
|
|
|
+ fontWeight: 'bold'
|
|
|
}
|
|
|
},
|
|
|
- details: {
|
|
|
- show: true,
|
|
|
- formatter: '资金占比{value}%',
|
|
|
+ num: {
|
|
|
+ number: [f.rightNum],
|
|
|
+ content: '{nt}',
|
|
|
+ textAlign: 'right',
|
|
|
style: {
|
|
|
- fill: '#1ed3e5',
|
|
|
- fontSize: 20
|
|
|
+ fill: '#26fcd8',
|
|
|
+ fontWeight: 'bold'
|
|
|
}
|
|
|
+ },
|
|
|
+ ring: {
|
|
|
+ series: [
|
|
|
+ {
|
|
|
+ type: 'gauge',
|
|
|
+ startAngle: -Math.PI / 2,
|
|
|
+ endAngle: Math.PI * 1.5,
|
|
|
+ arcLineWidth: 13,
|
|
|
+ radius: '80%',
|
|
|
+ data: [
|
|
|
+ { name: '总人数', value: f.total }
|
|
|
+ ],
|
|
|
+ axisLabel: {
|
|
|
+ show: false
|
|
|
+ },
|
|
|
+ axisTick: {
|
|
|
+ show: false
|
|
|
+ },
|
|
|
+ pointer: {
|
|
|
+ show: false
|
|
|
+ },
|
|
|
+ backgroundArc: {
|
|
|
+ style: {
|
|
|
+ stroke: '#224590'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ details: {
|
|
|
+ show: true,
|
|
|
+ formatter: '总人数{value}',
|
|
|
+ style: {
|
|
|
+ fill: '#1ed3e5',
|
|
|
+ fontSize: 20
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ color: ['#03d3ec']
|
|
|
}
|
|
|
}
|
|
|
- ],
|
|
|
- color: ['#03d3ec']
|
|
|
- }
|
|
|
-}))
|
|
|
|
|
|
-setInterval(randomExtend, 3000)
|
|
|
+ cardsMore.value.push(d)
|
|
|
+ })
|
|
|
+ })
|
|
|
+}, { deep: true, immediate: true })
|
|
|
</script>
|
|
|
|
|
|
<style lang="scss">
|
|
|
#cards {
|
|
|
display: flex;
|
|
|
justify-content: space-between;
|
|
|
- height: 45%;
|
|
|
+ height: 43%;
|
|
|
|
|
|
.card-item {
|
|
|
background-color: rgba(6, 30, 93, 0.5);
|
|
|
@@ -144,12 +261,13 @@ setInterval(randomExtend, 3000)
|
|
|
.card-footer-item {
|
|
|
padding: 5px 10px 0px 10px;
|
|
|
box-sizing: border-box;
|
|
|
- width: 40%;
|
|
|
+ width: 45%;
|
|
|
background-color: rgba(6, 30, 93, 0.7);
|
|
|
border-radius: 3px;
|
|
|
|
|
|
.footer-title {
|
|
|
font-size: 15px;
|
|
|
+ text-align: center;
|
|
|
margin-bottom: 5px;
|
|
|
}
|
|
|
|