|
|
@ -2,7 +2,13 @@ |
|
|
|
<div class="safety-appraise"> |
|
|
|
<div class="sy-water-cart-second-title">安全鉴定</div> |
|
|
|
<div class="appraise-wrapper"> |
|
|
|
<div class="appraise-item"> |
|
|
|
<div class="appraise-item" v-for="(item, index) in safetyData" :key="index"> |
|
|
|
<div class="count total" :class="[{ wait: item.name === '待鉴定' }, { ok: item.name === '已鉴定' }]"> |
|
|
|
{{ item?.value || '' }} |
|
|
|
</div> |
|
|
|
<div class="name">{{ item?.name || '' }}</div> |
|
|
|
</div> |
|
|
|
<!-- <div class="appraise-item"> |
|
|
|
<div class="count total">456</div> |
|
|
|
<div class="name">任务数</div> |
|
|
|
</div> |
|
|
@ -13,26 +19,101 @@ |
|
|
|
<div class="appraise-item"> |
|
|
|
<div class="count ok">56</div> |
|
|
|
<div class="name">已鉴定</div> |
|
|
|
</div> |
|
|
|
</div> --> |
|
|
|
</div> |
|
|
|
<div class="appraise-progress"> |
|
|
|
<div class="tips"> |
|
|
|
<div>已完成:<span class="ok">23%</span></div> |
|
|
|
<div>进行中:<span class="in">23%</span></div> |
|
|
|
<div>超期未鉴定:<span class="overdue">23%</span></div> |
|
|
|
<div> |
|
|
|
已完成:<span class="ok">{{ okNum }}%</span> |
|
|
|
</div> |
|
|
|
<div> |
|
|
|
进行中:<span class="in">{{ 100 - okNum }}%</span> |
|
|
|
</div> |
|
|
|
<!-- <div>超期未鉴定:<span class="overdue">23%</span></div> --> |
|
|
|
</div> |
|
|
|
<div class="progress"> |
|
|
|
<div class="progress-bar ok" style="width: 23%"></div> |
|
|
|
<div class="progress-bar in" style="width: 23%"></div> |
|
|
|
<div class="progress-bar overdue" style="width: 23%"></div> |
|
|
|
<div class="progress-bar ok" :style="{ width: `${okNum}%` }"></div> |
|
|
|
<div class="progress-bar in" :style="{ width: `${100 - okNum}%` }"></div> |
|
|
|
<!-- <div class="progress-bar overdue" style="width: 23%"></div> --> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
|
|
|
|
<script setup lang="ts"> |
|
|
|
import { ref, onMounted, watch, computed } from 'vue'; |
|
|
|
import { useChartStore } from '@/store/modules/chart'; |
|
|
|
|
|
|
|
const chartStore = useChartStore(); |
|
|
|
|
|
|
|
defineOptions({ |
|
|
|
name: "safety-appraise", |
|
|
|
name: 'safety-appraise' |
|
|
|
}); |
|
|
|
const props = defineProps({ |
|
|
|
timeRange: { |
|
|
|
type: Object, |
|
|
|
default: () => ({ |
|
|
|
startTime: '', |
|
|
|
endTime: '' |
|
|
|
}) |
|
|
|
} |
|
|
|
}); |
|
|
|
const taskCount = ref(0); |
|
|
|
const safetyData: any = ref([]); |
|
|
|
const okNum = computed(() => { |
|
|
|
const num = safetyData.value.find((item: any) => item.name === '任务数'); |
|
|
|
return taskCount.value ? (Number(num?.value || 0) / taskCount.value) * 100 : 0; |
|
|
|
}); |
|
|
|
// const inNum = computed(() => { |
|
|
|
// const num = safetyData.value.find((item: any) => item.name === '已完成'); |
|
|
|
// return taskCount.value ? (Number(num?.value || 0) / taskCount.value) * 100 : 0; |
|
|
|
// }); |
|
|
|
const getChartData = async (time: any) => { |
|
|
|
taskCount.value = 0; |
|
|
|
safetyData.value = []; |
|
|
|
|
|
|
|
const pramas = { |
|
|
|
// endTime: '', |
|
|
|
// startTime: '', |
|
|
|
...time, |
|
|
|
group: 'K4' |
|
|
|
}; |
|
|
|
const data: any = await chartStore.initStatisticChart(pramas); |
|
|
|
if (data?.yaxis?.length) { |
|
|
|
let newArr = data.yaxis.flatMap((v: any) => v.series); |
|
|
|
newArr?.forEach((item: any) => { |
|
|
|
safetyData.value.push({ |
|
|
|
name: item.name || '', |
|
|
|
value: Number(item.sum)?.toFixed(0) || 0, |
|
|
|
unit: item.unit || '' |
|
|
|
}); |
|
|
|
taskCount.value += Number(item.sum) || 0; |
|
|
|
}); |
|
|
|
} else { |
|
|
|
// 默认数据 |
|
|
|
safetyData.value = [ |
|
|
|
{ |
|
|
|
name: '任务数', |
|
|
|
value: 0, |
|
|
|
unit: '' |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: '已完成', |
|
|
|
value: 0, |
|
|
|
unit: '' |
|
|
|
} |
|
|
|
]; |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
watch( |
|
|
|
() => props.timeRange, |
|
|
|
(newVal) => { |
|
|
|
getChartData(newVal); |
|
|
|
} |
|
|
|
); |
|
|
|
onMounted(() => { |
|
|
|
getChartData(props.timeRange); |
|
|
|
}); |
|
|
|
</script> |
|
|
|
|
|
|
@ -51,7 +132,7 @@ defineOptions({ |
|
|
|
.appraise-item { |
|
|
|
width: 104px; |
|
|
|
height: 119px; |
|
|
|
background: url("@/assets/card/safety-item-bg.png") no-repeat; |
|
|
|
background: url('@/assets/card/safety-item-bg.png') no-repeat; |
|
|
|
display: flex; |
|
|
|
flex-direction: column; |
|
|
|
align-items: center; |
|
|
@ -65,8 +146,8 @@ defineOptions({ |
|
|
|
text-align: center; |
|
|
|
letter-spacing: 0em; |
|
|
|
|
|
|
|
font-variation-settings: "opsz" auto; |
|
|
|
font-feature-settings: "kern" on; |
|
|
|
font-variation-settings: 'opsz' auto; |
|
|
|
font-feature-settings: 'kern' on; |
|
|
|
color: #ffffff; |
|
|
|
} |
|
|
|
.count { |
|
|
@ -103,7 +184,7 @@ defineOptions({ |
|
|
|
line-height: 22px; |
|
|
|
letter-spacing: 0px; |
|
|
|
|
|
|
|
font-variation-settings: "opsz" auto; |
|
|
|
font-variation-settings: 'opsz' auto; |
|
|
|
color: rgba(0, 0, 0, 0.55); |
|
|
|
span { |
|
|
|
font-family: DIN; |
|
|
@ -112,7 +193,7 @@ defineOptions({ |
|
|
|
line-height: 22px; |
|
|
|
letter-spacing: 0px; |
|
|
|
|
|
|
|
font-variation-settings: "opsz" auto; |
|
|
|
font-variation-settings: 'opsz' auto; |
|
|
|
&.ok { |
|
|
|
color: #28ce8e; |
|
|
|
} |
|
|
|