|
|
@@ -0,0 +1,154 @@
|
|
|
+<script setup lang="ts">
|
|
|
+import { computed } from 'vue';
|
|
|
+import type { S8QdcSummaryItem } from '../../api/s8MonitoringApi';
|
|
|
+
|
|
|
+const props = defineProps<{
|
|
|
+ items: S8QdcSummaryItem[];
|
|
|
+ minHeight?: number;
|
|
|
+}>();
|
|
|
+
|
|
|
+const cardStyle = computed(() => ({
|
|
|
+ minHeight: `${Math.max(120, props.minHeight ?? 160)}px`,
|
|
|
+}));
|
|
|
+
|
|
|
+function fmtHours(val: number | null | undefined): string {
|
|
|
+ if (val === null || val === undefined) return '--';
|
|
|
+ return `${val.toFixed(1)}h`;
|
|
|
+}
|
|
|
+
|
|
|
+function fmtRate(val: number | null | undefined): string {
|
|
|
+ if (val === null || val === undefined) return '--';
|
|
|
+ return `${val.toFixed(0)}%`;
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<template>
|
|
|
+ <article class="s9-qdc-card" :style="cardStyle">
|
|
|
+ <div class="s9-qdc-card__header">
|
|
|
+ <span class="s9-qdc-card__code">S9</span>
|
|
|
+ <span class="s9-qdc-card__title">QDC 运营指标</span>
|
|
|
+ <span class="s9-qdc-card__sub">质量 / 交付 / 成本 / 库存</span>
|
|
|
+ </div>
|
|
|
+ <div class="s9-qdc-card__tracks">
|
|
|
+ <div v-for="item in items" :key="item.code" class="s9-qdc-track">
|
|
|
+ <div class="s9-qdc-track__name">{{ item.title }}</div>
|
|
|
+ <div class="s9-qdc-track__metrics">
|
|
|
+ <div class="s9-qdc-track__metric">
|
|
|
+ <span class="s9-qdc-track__metric-val">{{ item.total }}</span>
|
|
|
+ <span class="s9-qdc-track__metric-lbl">异常总数</span>
|
|
|
+ </div>
|
|
|
+ <div class="s9-qdc-track__metric">
|
|
|
+ <span class="s9-qdc-track__metric-val">{{ fmtHours(item.avgProcessHours) }}</span>
|
|
|
+ <span class="s9-qdc-track__metric-lbl">平均处理</span>
|
|
|
+ </div>
|
|
|
+ <div class="s9-qdc-track__metric">
|
|
|
+ <span class="s9-qdc-track__metric-val">{{ fmtRate(item.onTimeCloseRate) }}</span>
|
|
|
+ <span class="s9-qdc-track__metric-lbl">及时关闭率</span>
|
|
|
+ </div>
|
|
|
+ <div class="s9-qdc-track__metric">
|
|
|
+ <span class="s9-qdc-track__metric-val">{{ fmtRate(item.closeRate) }}</span>
|
|
|
+ <span class="s9-qdc-track__metric-lbl">总关闭率</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-if="item.remark" class="s9-qdc-track__remark">{{ item.remark }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </article>
|
|
|
+</template>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.s9-qdc-card {
|
|
|
+ position: relative;
|
|
|
+ overflow: hidden;
|
|
|
+ border-radius: 18px;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ box-sizing: border-box;
|
|
|
+ padding: 14px 16px 12px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 8px;
|
|
|
+ background: rgba(22, 26, 36, 0.85);
|
|
|
+ border: 1px solid rgba(123, 208, 255, 0.14);
|
|
|
+}
|
|
|
+
|
|
|
+.s9-qdc-card__header {
|
|
|
+ display: flex;
|
|
|
+ align-items: baseline;
|
|
|
+ gap: 6px;
|
|
|
+ flex-shrink: 0;
|
|
|
+}
|
|
|
+
|
|
|
+.s9-qdc-card__code {
|
|
|
+ font-size: 11px;
|
|
|
+ font-weight: 700;
|
|
|
+ color: rgba(123, 208, 255, 0.7);
|
|
|
+ letter-spacing: 0.08em;
|
|
|
+}
|
|
|
+
|
|
|
+.s9-qdc-card__title {
|
|
|
+ font-size: 13px;
|
|
|
+ font-weight: 700;
|
|
|
+ color: #e1e2eb;
|
|
|
+}
|
|
|
+
|
|
|
+.s9-qdc-card__sub {
|
|
|
+ font-size: 10px;
|
|
|
+ color: #909097;
|
|
|
+ margin-left: 2px;
|
|
|
+}
|
|
|
+
|
|
|
+.s9-qdc-card__tracks {
|
|
|
+ display: grid;
|
|
|
+ grid-template-columns: 1fr 1fr;
|
|
|
+ gap: 6px;
|
|
|
+ flex: 1;
|
|
|
+ min-height: 0;
|
|
|
+}
|
|
|
+
|
|
|
+.s9-qdc-track {
|
|
|
+ background: rgba(255, 255, 255, 0.03);
|
|
|
+ border: 1px solid rgba(255, 255, 255, 0.06);
|
|
|
+ border-radius: 10px;
|
|
|
+ padding: 7px 8px 6px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 4px;
|
|
|
+}
|
|
|
+
|
|
|
+.s9-qdc-track__name {
|
|
|
+ font-size: 11px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: rgba(123, 208, 255, 0.75);
|
|
|
+}
|
|
|
+
|
|
|
+.s9-qdc-track__metrics {
|
|
|
+ display: grid;
|
|
|
+ grid-template-columns: 1fr 1fr;
|
|
|
+ gap: 3px 6px;
|
|
|
+}
|
|
|
+
|
|
|
+.s9-qdc-track__metric {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 1px;
|
|
|
+}
|
|
|
+
|
|
|
+.s9-qdc-track__metric-val {
|
|
|
+ font-size: 13px;
|
|
|
+ font-weight: 700;
|
|
|
+ color: #c6c6cd;
|
|
|
+ line-height: 1.2;
|
|
|
+}
|
|
|
+
|
|
|
+.s9-qdc-track__metric-lbl {
|
|
|
+ font-size: 9px;
|
|
|
+ color: #909097;
|
|
|
+}
|
|
|
+
|
|
|
+.s9-qdc-track__remark {
|
|
|
+ font-size: 9px;
|
|
|
+ color: rgba(144, 144, 151, 0.55);
|
|
|
+ margin-top: 2px;
|
|
|
+}
|
|
|
+</style>
|