已添加3个文件
已修改7个文件
620 ■■■■■ 文件已修改
src/api/productionManagement/productionProcess.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/BI/SCbg.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/BI/SCbgleft.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/BI/SCbgright.png 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicData/customerFile/index.vue 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicData/product/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/index.vue 406 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/productionProcess/index.vue 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionPlan/productionPlan/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/reportAnalysis/productionStatistics/index.vue 157 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/productionManagement/productionProcess.js
@@ -69,10 +69,11 @@
}
// 获取工序参数列表
export function getProcessParamList(processId) {
export function getProcessParamList(processId,params) {
  return request({
    url: `/productProcessParam/list/${processId}`,
    method: "get",
    params,
  });
}
src/assets/BI/SCbg.png
src/assets/BI/SCbgleft.png
src/assets/BI/SCbgright.png
src/views/basicData/customerFile/index.vue
@@ -745,16 +745,16 @@
      prop: "customerType",
      width: 120,
    },
    {
      label: "跟进进度",
      prop: "followUpLevel",
      width: 120,
    },
    {
      label: "跟进时间",
      prop: "followUpTime",
      width: 120,
    },
    // {
    //   label: "跟进进度",
    //   prop: "followUpLevel",
    //   width: 120,
    // },
    // {
    //   label: "跟进时间",
    //   prop: "followUpTime",
    //   width: 120,
    // },
    {
      label: "银行基本户",
      prop: "basicBankAccount",
src/views/basicData/product/index.vue
@@ -373,11 +373,11 @@
  };
  const tableColumn = ref([
    {
      label: "规格型号",
      label: "产品",
      prop: "productName",
    },
    {
      label: "规格",
      label: "规格型号",
      prop: "model",
    },
    {
src/views/index.vue
@@ -715,102 +715,100 @@
  };
  const loadHomeTodos = async () => {
    try {
      const res = await homeTodos();
      const list = Array.isArray(res?.data) ? res.data : [];
      const mapped = list.slice(0, 4).map((item, idx) => {
        const text =
          item?.approveReason || item?.approveTypeName || `待处理事项 ${idx + 1}`;
        const levelType = idx === 0 ? "danger" : idx <= 2 ? "warning" : "success";
        const level = idx === 0 ? "高" : idx <= 2 ? "中" : "低";
        return { level, title: text, type: levelType };
      });
      updateArray(todos, mapped);
      const pendingMapped = list.slice(0, 4).map((item, idx) => {
        const title =
          item?.approveReason || item?.approveTypeName || `待处理事项 ${idx + 1}`;
        const path = inferTodoPath(item);
        return {
          id: item?.id || `${idx}-${title}`,
          title,
          level: idx === 0 ? "高" : idx <= 2 ? "中" : "低",
          type: idx === 0 ? "danger" : idx <= 2 ? "warning" : "success",
          path,
          ownerId: item?.approveUserId || item?.userId || "",
          ownerName: item?.approveUserName || item?.userName || "",
        };
      });
      updateArray(pendingTasks, pendingMapped);
    } catch (error) {
      console.error("homeTodos接口获取失败:", error);
    }
    // try {
    //   const res = await homeTodos();
    //   const list = Array.isArray(res?.data) ? res.data : [];
    //   const mapped = list.slice(0, 4).map((item, idx) => {
    //     const text =
    //       item?.approveReason || item?.approveTypeName || `待处理事项 ${idx + 1}`;
    //     const levelType = idx === 0 ? "danger" : idx <= 2 ? "warning" : "success";
    //     const level = idx === 0 ? "高" : idx <= 2 ? "中" : "低";
    //     return { level, title: text, type: levelType };
    //   });
    //   updateArray(todos, mapped);
    //   const pendingMapped = list.slice(0, 4).map((item, idx) => {
    //     const title =
    //       item?.approveReason || item?.approveTypeName || `待处理事项 ${idx + 1}`;
    //     const path = inferTodoPath(item);
    //     return {
    //       id: item?.id || `${idx}-${title}`,
    //       title,
    //       level: idx === 0 ? "高" : idx <= 2 ? "中" : "低",
    //       type: idx === 0 ? "danger" : idx <= 2 ? "warning" : "success",
    //       path,
    //       ownerId: item?.approveUserId || item?.userId || "",
    //       ownerName: item?.approveUserName || item?.userName || "",
    //     };
    //   });
    //   updateArray(pendingTasks, pendingMapped);
    // } catch (error) {
    //   console.error("homeTodos接口获取失败:", error);
    // }
  };
  const loadOrderAndProgress = async () => {
    try {
      const [orderRes, progressRes] = await Promise.allSettled([
        orderCount(),
        getProgressStatistics(),
      ]);
      if (orderRes.status === "fulfilled") {
        const items = Array.isArray(orderRes.value?.data)
          ? orderRes.value.data
          : [];
        const byName = Object.fromEntries(
          items.map(i => [String(i?.name || "").replace(/\s/g, ""), i?.value])
        );
        businessFocus[0].value = `${
          pickFirstNumber(byName, ["生产订单数", "生产订单总数", "总订单数"]) || 0
        } 单`;
        businessFocus[1].value = `${
          pickFirstNumber(byName, ["已完成订单数"]) || 0
        } 单`;
        businessFocus[2].value = `${
          pickFirstNumber(byName, ["待生产订单数", "未完成订单数"]) || 0
        } 单`;
        businessFocus[3].value = `${
          pickFirstNumber(byName, ["部分完成订单数"]) || 0
        } 单`;
      }
      if (progressRes.status === "fulfilled") {
        const p = progressRes.value?.data || {};
        const detail = Array.isArray(p.completedOrderDetails)
          ? p.completedOrderDetails
          : [];
        const rows = detail.slice(0, 6).map((item, index) => {
          const qty = pickFirstNumber(item, ["quantity", "planQuantity"]);
          const done = pickFirstNumber(item, [
            "completeQuantity",
            "completedQuantity",
          ]);
          return {
            planNo: item.npsNo || item.productionPlanNo || `NO-${index + 1}`,
            product: item.productCategory || item.productName || "-",
            qty,
            issued: done,
            status:
              qty > 0 && done >= qty ? "已完成" : done > 0 ? "执行中" : "待下发",
          };
        });
        updateArray(planTable, rows);
        setTrendCard(
          "planIssued",
          detail
            .slice(-7)
            .map(i =>
              pickFirstNumber(i, [
                "completeQuantity",
                "completedQuantity",
                "issueNum",
              ])
            )
        );
      }
    } catch (error) {
      console.error("orderCount/getProgressStatistics接口获取失败:", error);
    }
    // try {
    //   const [orderRes, progressRes] = await Promise.allSettled([
    //     orderCount(),
    //     getProgressStatistics(),
    //   ]);
    //   if (orderRes.status === "fulfilled") {
    //     const items = Array.isArray(orderRes.value?.data)
    //       ? orderRes.value.data
    //       : [];
    //     const byName = Object.fromEntries(
    //       items.map(i => [String(i?.name || "").replace(/\s/g, ""), i?.value])
    //     );
    //     businessFocus[0].value = `${
    //       pickFirstNumber(byName, ["生产订单数", "生产订单总数", "总订单数"]) || 0
    //     } 单`;
    //     businessFocus[1].value = `${
    //       pickFirstNumber(byName, ["已完成订单数"]) || 0
    //     } 单`;
    //     businessFocus[2].value = `${
    //       pickFirstNumber(byName, ["待生产订单数", "未完成订单数"]) || 0
    //     } 单`;
    //     businessFocus[3].value = `${
    //       pickFirstNumber(byName, ["部分完成订单数"]) || 0
    //     } 单`;
    //   }
    //   if (progressRes.status === "fulfilled") {
    //     const p = progressRes.value?.data || {};
    //     const detail = Array.isArray(p.completedOrderDetails)
    //       ? p.completedOrderDetails
    //       : [];
    //     const rows = detail.slice(0, 6).map((item, index) => {
    //       const qty = pickFirstNumber(item, ["quantity", "planQuantity"]);
    //       const done = pickFirstNumber(item, [
    //         "completeQuantity",
    //         "completedQuantity",
    //       ]);
    //       return {
    //         planNo: item.npsNo || item.productionPlanNo || `NO-${index + 1}`,
    //         product: item.productCategory || item.productName || "-",
    //         qty,
    //         issued: done,
    //         status:
    //           qty > 0 && done >= qty ? "已完成" : done > 0 ? "执行中" : "待下发",
    //       };
    //     });
    //     updateArray(planTable, rows);
    //     setTrendCard(
    //       "planIssued",
    //       detail
    //         .slice(-7)
    //         .map(i =>
    //           pickFirstNumber(i, [
    //             "completeQuantity",
    //             "completedQuantity",
    //             "issueNum",
    //           ])
    //         )
    //     );
    //   }
    // } catch (error) {
    //   console.error("orderCount/getProgressStatistics接口获取失败:", error);
    // }
  };
  const inferTodoPath = todo => {
@@ -827,112 +825,112 @@
  };
  const loadPlanTrend = async () => {
    try {
      const res = await processDataProductionStatistics({
        type: chartRangePlan.value,
      });
      const list = Array.isArray(res?.data) ? res.data : [];
      planXAxis[0].data = list.map(
        (i, index) => i.processName || `工序${index + 1}`
      );
      planSeries[0].data = list.map(i =>
        pickFirstNumber(i, ["totalInput", "input", "planNum"])
      );
      planSeries[1].data = list.map(i =>
        pickFirstNumber(i, ["totalOutput", "output", "issueNum"])
      );
      planSeries[2].data = list.map(i =>
        pickFirstNumber(i, ["totalScrap", "scrap", "completeNum"])
      );
    } catch (error) {
      console.error("processDataProductionStatistics接口获取失败:", error);
    }
    // try {
    //   const res = await processDataProductionStatistics({
    //     type: chartRangePlan.value,
    //   });
    //   const list = Array.isArray(res?.data) ? res.data : [];
    //   planXAxis[0].data = list.map(
    //     (i, index) => i.processName || `工序${index + 1}`
    //   );
    //   planSeries[0].data = list.map(i =>
    //     pickFirstNumber(i, ["totalInput", "input", "planNum"])
    //   );
    //   planSeries[1].data = list.map(i =>
    //     pickFirstNumber(i, ["totalOutput", "output", "issueNum"])
    //   );
    //   planSeries[2].data = list.map(i =>
    //     pickFirstNumber(i, ["totalScrap", "scrap", "completeNum"])
    //   );
    // } catch (error) {
    //   console.error("processDataProductionStatistics接口获取失败:", error);
    // }
  };
  const loadQualityData = async () => {
    try {
      const res = await qualityInspectionStatistics({
        type: chartRangeQuality.value,
      });
      const data = res?.data || {};
      const items = Array.isArray(data.item) ? data.item : [];
      if (items.length > 0) {
        qualityXAxis[0].data = items.map(i => i.date || i.name || "-");
        qualitySeries[0].data = items.map(i =>
          pickFirstNumber(i, [
            "supplierNum",
            "processNum",
            "factoryNum",
            "totalNum",
          ])
        );
        setTrendCard(
          "qualityRaw",
          items.map(i => pickFirstNumber(i, ["supplierNum"]))
        );
        setTrendCard(
          "qualityProcess",
          items.map(i => pickFirstNumber(i, ["processNum"]))
        );
        setTrendCard(
          "qualityFactory",
          items.map(i => pickFirstNumber(i, ["factoryNum"]))
        );
      } else {
        qualityXAxis[0].data = ["来料检", "过程检", "成品检"];
        qualitySeries[0].data = [
          pickFirstNumber(data, ["supplierNum"]),
          pickFirstNumber(data, ["processNum"]),
          pickFirstNumber(data, ["factoryNum"]),
        ];
        setTrendCard("qualityRaw", [pickFirstNumber(data, ["supplierNum"])]);
        setTrendCard("qualityProcess", [pickFirstNumber(data, ["processNum"])]);
        setTrendCard("qualityFactory", [pickFirstNumber(data, ["factoryNum"])]);
      }
      businessFocus[4].value = `${pickFirstNumber(data, [
        "supplierNum",
        "totalNum",
      ])} 条`;
      businessFocus[5].value = `${pickFirstNumber(data, ["processNum"])} 条`;
    } catch (error) {
      console.error("qualityInspectionStatistics接口获取失败:", error);
    }
    // try {
    //   const res = await qualityInspectionStatistics({
    //     type: chartRangeQuality.value,
    //   });
    //   const data = res?.data || {};
    //   const items = Array.isArray(data.item) ? data.item : [];
    //   if (items.length > 0) {
    //     qualityXAxis[0].data = items.map(i => i.date || i.name || "-");
    //     qualitySeries[0].data = items.map(i =>
    //       pickFirstNumber(i, [
    //         "supplierNum",
    //         "processNum",
    //         "factoryNum",
    //         "totalNum",
    //       ])
    //     );
    //     setTrendCard(
    //       "qualityRaw",
    //       items.map(i => pickFirstNumber(i, ["supplierNum"]))
    //     );
    //     setTrendCard(
    //       "qualityProcess",
    //       items.map(i => pickFirstNumber(i, ["processNum"]))
    //     );
    //     setTrendCard(
    //       "qualityFactory",
    //       items.map(i => pickFirstNumber(i, ["factoryNum"]))
    //     );
    //   } else {
    //     qualityXAxis[0].data = ["来料检", "过程检", "成品检"];
    //     qualitySeries[0].data = [
    //       pickFirstNumber(data, ["supplierNum"]),
    //       pickFirstNumber(data, ["processNum"]),
    //       pickFirstNumber(data, ["factoryNum"]),
    //     ];
    //     setTrendCard("qualityRaw", [pickFirstNumber(data, ["supplierNum"])]);
    //     setTrendCard("qualityProcess", [pickFirstNumber(data, ["processNum"])]);
    //     setTrendCard("qualityFactory", [pickFirstNumber(data, ["factoryNum"])]);
    //   }
    //   businessFocus[4].value = `${pickFirstNumber(data, [
    //     "supplierNum",
    //     "totalNum",
    //   ])} 条`;
    //   businessFocus[5].value = `${pickFirstNumber(data, ["processNum"])} 条`;
    // } catch (error) {
    //   console.error("qualityInspectionStatistics接口获取失败:", error);
    // }
  };
  const loadWarningCenter = async () => {
    try {
      const res = await nonComplianceWarning();
      const list = Array.isArray(res?.data) ? res.data : [];
      const mapped = list.slice(0, 6).map((item, idx) => {
        const levelNum = toNumber(item.level ?? item.warningLevel ?? 2);
        const levelType =
          levelNum >= 3 ? "danger" : levelNum === 2 ? "warning" : "info";
        const levelText = levelNum >= 3 ? "高" : levelNum === 2 ? "中" : "低";
        const title =
          item.name || item.title || item.paramName || `异常预警 ${idx + 1}`;
        const text = `${title}${item.processName || ""}${
          item.orderNo || ""
        }`.toLowerCase();
        const path = text.includes("质检")
          ? routePathMap.processInspection
          : text.includes("订单")
          ? routePathMap.order
          : routePathMap.processInspection ||
            routePathMap.order ||
            routePathMap.plan;
        return {
          id: item.id || `${idx}-${title}`,
          levelType,
          levelText,
          title,
          path,
        };
      });
      updateArray(warningList, mapped);
    } catch (error) {
      console.error("nonComplianceWarning接口获取失败:", error);
      updateArray(warningList, []);
    }
    // try {
    //   const res = await nonComplianceWarning();
    //   const list = Array.isArray(res?.data) ? res.data : [];
    //   const mapped = list.slice(0, 6).map((item, idx) => {
    //     const levelNum = toNumber(item.level ?? item.warningLevel ?? 2);
    //     const levelType =
    //       levelNum >= 3 ? "danger" : levelNum === 2 ? "warning" : "info";
    //     const levelText = levelNum >= 3 ? "高" : levelNum === 2 ? "中" : "低";
    //     const title =
    //       item.name || item.title || item.paramName || `异常预警 ${idx + 1}`;
    //     const text = `${title}${item.processName || ""}${
    //       item.orderNo || ""
    //     }`.toLowerCase();
    //     const path = text.includes("质检")
    //       ? routePathMap.processInspection
    //       : text.includes("订单")
    //       ? routePathMap.order
    //       : routePathMap.processInspection ||
    //         routePathMap.order ||
    //         routePathMap.plan;
    //     return {
    //       id: item.id || `${idx}-${title}`,
    //       levelType,
    //       levelText,
    //       title,
    //       path,
    //     };
    //   });
    //   updateArray(warningList, mapped);
    // } catch (error) {
    //   console.error("nonComplianceWarning接口获取失败:", error);
    //   updateArray(warningList, []);
    // }
  };
  const initSectionConfig = () => {
@@ -964,17 +962,17 @@
  };
  const loadCostComposition = async () => {
    try {
      const res = await expenseCompositionAnalysis({ type: 1 });
      const list = Array.isArray(res?.data) ? res.data : [];
      const mapped = list.map(i => ({
        name: i.name || "未命名",
        value: pickFirstNumber(i, ["value", "amount", "cost"]),
      }));
      costSeries[0].data = mapped;
    } catch (error) {
      console.error("expenseCompositionAnalysis接口获取失败:", error);
    }
    // try {
    //   const res = await expenseCompositionAnalysis({ type: 1 });
    //   const list = Array.isArray(res?.data) ? res.data : [];
    //   const mapped = list.map(i => ({
    //     name: i.name || "未命名",
    //     value: pickFirstNumber(i, ["value", "amount", "cost"]),
    //   }));
    //   costSeries[0].data = mapped;
    // } catch (error) {
    //   console.error("expenseCompositionAnalysis接口获取失败:", error);
    // }
  };
  const refreshDashboardData = () => {
src/views/productionManagement/productionProcess/index.vue
@@ -81,7 +81,7 @@
                    rowKey="id"
                    :column="paramColumn"
                    :tableData="paramList"
                    :page="paramPage"
                    :page="paramPage2"
                    height="calc(100vh - 280px)"
                    :isSelection="false"
                    @pagination="handleParamPagination" />
@@ -562,8 +562,8 @@
      label: "是否必填",
      prop: "isRequired",
      dataType: "tag",
      formatType: row => (row.isRequired === true ? "success" : "info"),
      formatData: row => (row.isRequired === true ? "是" : "否"),
      formatType: params => (params == true ? "success" : "info"),
      formatData: params => (params == true ? "是" : "否"),
    },
    {
      label: "操作",
@@ -596,14 +596,23 @@
        processLoading.value = false;
      });
  };
  const paramPage2 = ref({
    current: 1,
    size: 10,
    total: 0,
  });
  // 获取参数列表
  const getParamList = processId => {
    paramLoading.value = true;
    getProcessParamList(processId)
    console.log(paramPage2.value, "paramPage2.value");
    getProcessParamList(processId, {
      current: paramPage2.value.current,
      size: paramPage2.value.size,
    })
      .then(res => {
        paramList.value = res.data || [];
        paramPage.total = paramList.value.length;
        paramList.value = res.data.records || [];
        paramPage2.value.total = res.data.total;
      })
      .catch(() => {
        ElMessage.error("获取参数列表失败");
@@ -844,8 +853,9 @@
  };
  const handleParamPagination = obj => {
    paramPage.current = obj.page;
    paramPage.size = obj.limit;
    console.log(obj, "obj");
    paramPage2.value.current = obj.page;
    paramPage2.value.size = obj.limit;
    getParamList(selectedProcess.value.id);
  };
src/views/productionPlan/productionPlan/index.vue
@@ -292,9 +292,9 @@
                     placeholder="请选择强度"
                     style="width: 100%">
            <el-option v-for="item in block_strength"
                       :key="item.id"
                       :key="item.label"
                       :label="item.label"
                       :value="item.id" />
                       :value="item.label" />
          </el-select>
        </el-form-item>
        <el-form-item label="备注 1"
src/views/reportAnalysis/productionStatistics/index.vue
@@ -118,28 +118,29 @@
      </div>
      <!-- 中间中心环 -->
      <div class="center-ring">
        <!-- <div class="center-ring-box">
          <div class="center-metric m1">
            <div class="center-metric-label">项目产量</div>
            <div class="center-metric-value">{{ projectProduction }}</div>
            <div class="center-metric-unit">件</div>
        <div class="center-ring-box">
          <div class="ring-box-topright">
            <div class="topright-label">固废处理量</div>
          </div>
          <div class="center-metric m2">
            <div class="center-metric-label">固体处理量</div>
            <div class="center-metric-value">{{ solidWaste处理量 }}</div>
            <div class="center-metric-unit">吨</div>
          <div class="ring-box-left">
            <div class="left-label">粉煤灰</div>
            <div class="left-value">月处理 <span style="font-weight: bold;font-size: 1.3vh;">7812</span> 吨 年处理 <span style="font-weight: bold;font-size: 1.3vh;">7812</span> 吨</div>
            <div class="left-label"
                 style="margin-top: 2vh;">石膏</div>
            <div class="left-value">月处理 <span style="font-weight: bold;font-size: 1.3vh;">7812</span> 吨 年处理 <span style="font-weight: bold;font-size: 1.3vh;">7812</span> 吨</div>
          </div>
          <div class="center-metric m3">
            <div class="center-metric-label">砌块产量</div>
            <div class="center-metric-value">{{ blockProduction }}</div>
            <div class="center-metric-unit">件</div>
          <div class="ring-box-topleft">
            <div class="topleft-label">项目产量</div>
          </div>
          <div class="center-metric m4">
            <div class="center-metric-label">板材产量</div>
            <div class="center-metric-value">{{ boardProduction }}</div>
            <div class="center-metric-unit">件</div>
          <div class="ring-box-right">
            <div class="right-label">砌块产量</div>
            <div class="right-value">月产量 <span style="font-weight: bold;font-size: 1.3vh;">7812</span> 吨 年产量 <span style="font-weight: bold;font-size: 1.3vh;">7812
              </span> 吨</div>
            <div class="right-label"
                 style="margin-top: 2vh;">板材产量</div>
            <div class="right-value">月产量 <span style="font-weight: bold;font-size: 1.3vh;">7812</span> 吨 年产量 <span style="font-weight: bold;font-size: 1.3vh;">7812</span> 吨</div>
          </div>
        </div> -->
        </div>
      </div>
      <!-- 左下:生产成本单耗统计(板材) -->
      <div class="bi-panel bi-panel-bottom-left">
@@ -208,6 +209,8 @@
                :class="{ active: customerTimeDimension === 'month' }"
                @click="handleCustomerTimeDimensionChange('month')">月</span>
        </div>
        <div ref="customerTrendChart"
             class="echart-fill"></div>
        <!-- <div class="bi-panel-body">
          <div class="chart-unit-row chart-unit-single">
            <span>单位:家</span>
@@ -639,8 +642,8 @@
  // 新增客户趋势图表配置
  const customerTrendChartOption = computed(() => {
    const customerTypes = ["全部", "石灰", "水泥", "铝粉膏", "脱模剂"];
    const colors = ["#00A4ED", "#34D8F7", "#4A8BFF", "#8A6BFF", "#C8C447"];
    const customerTypes = ["全部", "粉煤灰", "石膏", "石灰"];
    const colors = ["#00A4ED", "#4A8BFF", "#8A6BFF", "#C8C447"];
    const year = 2024;
    const periodType = customerTimeDimension.value;
@@ -1357,12 +1360,12 @@
  }
  /* .scroll-table tbody tr:nth-child(odd) {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      background-color: rgba(64, 158, 255, 0.05);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              background-color: rgba(64, 158, 255, 0.05);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    .scroll-table tbody tr:nth-child(even) {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        background-color: rgba(64, 158, 255, 0.1);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          } */
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            .scroll-table tbody tr:nth-child(even) {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                background-color: rgba(64, 158, 255, 0.1);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  } */
  .oddTableTr {
    background-color: rgba(64, 158, 255, 0.05);
  }
@@ -1534,11 +1537,11 @@
    grid-row: 1 / span 2;
    position: absolute;
    background: url("@/assets/BI/imageSS@2x.png") no-repeat bottom center;
    background-size: 100% 30%;
    background-size: 80% 30%;
    left: 25%;
    top: 25%;
    transform: translate(-50%, -50%);
    width: 60vh;
    transform: translate(-50%, -45%);
    width: 50%;
    height: 40.5vh;
    z-index: 3;
    pointer-events: none;
@@ -1546,11 +1549,103 @@
  .center-ring-box {
    position: absolute;
    /* inset: 0; */
    height: 100%;
    height: 88%;
    width: 100%;
    margin-top: 3%;
    /* background-color: #fff; */
    background: url("@/assets/BI/imageSStop.png") no-repeat center center;
    background-size: 80% 90%;
    background: url("@/assets/BI/SCbg.png") no-repeat center center;
    background-size: 100% 100%;
  }
  .ring-box-topright {
    position: absolute;
    top: 6vh;
    right: 0;
    width: 25%;
    height: 15%;
    background: url("@/assets/BI/SCbgright.png") no-repeat center center;
    background-size: 100% 100%;
    text-align: right;
  }
  .ring-box-topleft {
    position: absolute;
    top: 6vh;
    left: 0;
    width: 25%;
    height: 15%;
    background: url("@/assets/BI/SCbgleft.png") no-repeat center center;
    background-size: 100% 100%;
    text-align: left;
  }
  .topright-label {
    font-size: 1.8vh;
    font-weight: 500;
    color: rgba(234, 246, 255, 0.9);
    margin-top: 0;
    position: relative;
    bottom: 3vh;
    right: 1vh;
  }
  .topleft-label {
    font-size: 1.8vh;
    font-weight: 500;
    color: rgba(234, 246, 255, 0.9);
    margin-top: 0;
    position: relative;
    bottom: 3vh;
    left: 1vh;
  }
  .ring-box-left {
    /* background-color: #ebebeb; */
    width: 30%;
    position: absolute;
    left: 1vh;
    top: 56%;
    transform: translateY(-50%);
  }
  .left-label {
    font-size: 1.4vh;
    font-weight: 500;
    color: #0effef;
    margin-top: 0;
    position: relative;
    bottom: 3vh;
  }
  .left-value {
    font-size: 1.2vh;
    font-weight: 500;
    color: rgba(234, 246, 255, 0.9);
    margin-top: 0;
    position: relative;
    bottom: 3vh;
    margin-top: 0.4vh;
  }
  .ring-box-right {
    /* background-color: #ebebeb; */
    width: 30%;
    float: right;
    position: absolute;
    right: -1vh;
    top: 56%;
    transform: translateY(-50%);
  }
  .right-label {
    font-size: 1.4vh;
    font-weight: 500;
    color: #ffa60e;
    margin-top: 0;
    position: relative;
    bottom: 3vh;
  }
  .right-value {
    font-size: 1.2vh;
    font-weight: 500;
    color: rgba(234, 246, 255, 0.9);
    margin-top: 0;
    position: relative;
    bottom: 3vh;
    margin-top: 0.4vh;
  }
  .center-ring-bg {