Просмотр исходного кода

Merge branch 'master' of http://1.94.244.160:3000/shuzhihua/pms-iot-vue

Zimo 14 часов назад
Родитель
Сommit
c2d0d28968

+ 10 - 0
src/api/pms/stat/index.ts

@@ -213,6 +213,16 @@ export const IotStatApi = {
     return await request.get({ url: `/pms/iot-prod-inventory-aging/inventoryStatus`, params })
   },
 
+  // 瑞恒最近6个月的运维成本
+  getMaintainCost: async (params: any) => {
+    return await request.get({ url: `/rq/stat/rh/month-ywcb/rh`, params })
+  },
+
+  // 瑞都看板-最近6个月的运维成本
+  getRdMaintainCost: async (params: any) => {
+    return await request.get({ url: `/rq/stat/rh/month-ywcb/rd`, params })
+  },
+
   // 积压趋势
   getInventoryAging: async (params: any) => {
     return await request.get({ url: `/pms/iot-prod-inventory-aging/inventoryTrend`, params })

+ 10 - 0
src/views/pms/stat/rdkb.vue

@@ -26,11 +26,14 @@ const pageTabs = [
 
 const wrapperRef = ref<HTMLDivElement>()
 const scale = ref(1)
+const initialDevicePixelRatio = window.devicePixelRatio || 1
+const browserZoom = ref(1)
 
 let resizeObserver: ResizeObserver | null = null
 let resizeRaf = 0
 
 provide('rdKbScale', scale)
+provide('rdBrowserZoom', browserZoom)
 
 const targetWrapperStyle = computed(() => ({
   width: `${DESIGN_WIDTH * scale.value}px`,
@@ -66,13 +69,19 @@ function updateScale() {
   })
 }
 
+function updateBrowserZoom() {
+  browserZoom.value = (window.devicePixelRatio || initialDevicePixelRatio) / initialDevicePixelRatio
+}
+
 onMounted(() => {
   nextTick(updateScale)
+  updateBrowserZoom()
   resizeObserver = new ResizeObserver(updateScale)
   if (wrapperRef.value) {
     resizeObserver.observe(wrapperRef.value)
   }
   window.addEventListener('resize', updateScale)
+  window.addEventListener('resize', updateBrowserZoom)
 })
 
 watch(activePage, () => {
@@ -82,6 +91,7 @@ watch(activePage, () => {
 onUnmounted(() => {
   resizeObserver?.disconnect()
   window.removeEventListener('resize', updateScale)
+  window.removeEventListener('resize', updateBrowserZoom)
   cancelAnimationFrame(resizeRaf)
 })
 </script>

+ 70 - 9
src/views/pms/stat/rdkb/rd-cost.vue

@@ -7,16 +7,26 @@ import {
   createTooltip,
   FONT_FAMILY,
   formatDateLabel,
+  formatMonthLabel,
   THEME
 } from '@/utils/kb'
 import { IotStatApi } from '@/api/pms/stat'
 
+type CostRange = 'week' | 'sixMonth'
+
 const chartData = ref<ChartItem[]>([])
+const activeRange = ref<CostRange>('week')
+const loading = ref(false)
+const rangeOptions: Array<{ label: string; value: CostRange }> = [
+  { label: '近一周', value: 'week' },
+  { label: '近六个月', value: 'sixMonth' }
+]
 
 const router = useRouter()
 const chartRef = ref<HTMLDivElement>()
 let chart: echarts.ECharts | null = null
 let chartClickBound = false
+let loadRequestId = 0
 
 function getChartOption(data: ChartItem[]): echarts.EChartsOption {
   const names = data.map((item) => item.name)
@@ -32,6 +42,9 @@ function getChartOption(data: ChartItem[]): echarts.EChartsOption {
         shadowStyle: {
           color: THEME.split
         }
+      },
+      valueFormatter(value: number) {
+        return activeRange.value === 'sixMonth' ? `${Number(value).toFixed(2)} 万元` : `${value}`
       }
     }),
     xAxis: {
@@ -49,13 +62,13 @@ function getChartOption(data: ChartItem[]): echarts.EChartsOption {
         fontWeight: 500,
         fontFamily: FONT_FAMILY,
         formatter(value: string) {
-          return formatDateLabel(value)
+          return activeRange.value === 'sixMonth' ? formatMonthLabel(value) : formatDateLabel(value)
         }
       }
     },
     yAxis: {
       type: 'value',
-      name: '运维成本(元)',
+      name: activeRange.value === 'sixMonth' ? '运维成本(万元)' : '运维成本(元)',
       nameTextStyle: {
         color: THEME.text.regular,
         fontSize: 13,
@@ -108,7 +121,10 @@ function getChartOption(data: ChartItem[]): echarts.EChartsOption {
           color: THEME.color.orange.strong,
           fontSize: 16,
           fontWeight: 700,
-          fontFamily: FONT_FAMILY
+          fontFamily: FONT_FAMILY,
+          formatter(params: any) {
+            return activeRange.value === 'sixMonth' ? Number(params.value).toFixed(2) : params.value
+          }
         },
         emphasis: {
           itemStyle: {
@@ -175,21 +191,41 @@ function destroyChart() {
   }
 }
 
-async function loadChart() {
+async function loadChart(range: CostRange = activeRange.value) {
+  const requestId = ++loadRequestId
+  loading.value = true
+
   try {
-    const res = await IotStatApi.getOrderYwcb('rd')
+    const res =
+      range === 'sixMonth'
+        ? await IotStatApi.getRdMaintainCost({})
+        : await IotStatApi.getOrderYwcb('rd')
+    if (requestId !== loadRequestId) return
+
     chartData.value = res.xAxis.map((item, index) => ({
       name: item,
-      value: res.series[index]
+      value:
+        range === 'sixMonth'
+          ? Number((Number(res.series[index] || 0) / 10000).toFixed(2))
+          : res.series[index]
     }))
     renderChart()
   } catch (error) {
+    if (requestId !== loadRequestId) return
     console.error('运维成本:', error)
     chartData.value = []
     renderChart()
+  } finally {
+    if (requestId === loadRequestId) {
+      loading.value = false
+    }
   }
 }
 
+watch(activeRange, (range) => {
+  loadChart(range)
+})
+
 onMounted(() => {
   initChart()
   chart?.getZr().on('click', handleChartClick)
@@ -208,17 +244,42 @@ onUnmounted(() => {
 
 <template>
   <div class="panel flex flex-col">
-    <div class="panel-title">
+    <div class="panel-title flex items-center justify-between">
       <div class="icon-decorator">
         <span></span>
         <span></span>
       </div>
-      运维成本
+      <div class="kb-panel-title-text">运维成本</div>
+      <el-segmented
+        v-model="activeRange"
+        :options="rangeOptions"
+        size="small"
+        class="cost-range-switch" />
     </div>
-    <div ref="chartRef" class="flex-1 min-h-0"></div>
+    <div ref="chartRef" v-loading="loading" class="flex-1 min-h-0"></div>
   </div>
 </template>
 
 <style lang="scss" scoped>
 @import url('@/styles/kb.scss');
+
+.cost-range-switch {
+  --el-segmented-item-selected-color: #03409b;
+  --el-segmented-item-selected-bg-color: rgb(255 255 255 / 86%);
+  --el-segmented-bg-color: rgb(31 91 184 / 10%);
+  --el-segmented-item-hover-bg-color: rgb(255 255 255 / 56%);
+
+  min-height: calc(26px * var(--kb-scale, 1));
+  padding: calc(2px * var(--kb-scale, 1));
+  border: 1px solid rgb(31 91 184 / 12%);
+  transform: translateY(calc(-2px * var(--kb-scale, 1)));
+
+  :deep(.el-segmented__item) {
+    min-height: calc(22px * var(--kb-scale, 1));
+    padding: 0 calc(7px * var(--kb-scale, 1));
+    font-size: calc(13px * var(--kb-scale, 1));
+    font-weight: 600;
+    color: #29527f;
+  }
+}
 </style>

+ 18 - 4
src/views/pms/stat/rdkb/rdProductionBriefs.vue

@@ -42,6 +42,7 @@ const loading = ref(false)
 const list = ref<RdProductionBriefRow[]>([])
 const router = useRouter()
 const kbScale = inject<Ref<number>>('rdKbScale', ref(1))
+const browserZoom = inject<Ref<number>>('rdBrowserZoom', ref(1))
 const tableHeight = computed<number | string>(() =>
   props.pageMode === 'full' ? '100%' : Math.round(TABLE_HEIGHT * kbScale.value)
 )
@@ -167,6 +168,7 @@ onMounted(() => {
 <template>
   <div
     class="panel device-list-panel production-brief-panel w-full min-h-0 flex flex-col"
+    :style="{ '--rd-production-brief-browser-zoom': browserZoom }"
     :class="{ 'production-brief-panel--full': props.pageMode === 'full' }">
     <div class="panel-title device-list-panel__title flex items-center justify-between">
       <div class="kb-panel-title-text flex items-center">
@@ -201,7 +203,9 @@ onMounted(() => {
         @row-click="handleRowClick">
         <el-table-column prop="projectName" label="项目" min-width="150" align="center">
           <template #default="{ row }">
-            {{ formatText(row.projectName) }}
+            <div class="production-brief-table__summary">
+              {{ formatText(row.projectName) }}
+            </div>
           </template>
         </el-table-column>
         <el-table-column prop="deptName" label="队伍" min-width="110" align="center">
@@ -216,12 +220,16 @@ onMounted(() => {
         </el-table-column>
         <el-table-column prop="taskName" label="井号" min-width="120" align="center">
           <template #default="{ row }">
-            {{ formatText(row.taskName) }}
+            <div class="production-brief-table__summary">
+              {{ formatText(row.taskName) }}
+            </div>
           </template>
         </el-table-column>
         <el-table-column prop="techniqueNames" label="工艺" min-width="130" align="center">
           <template #default="{ row }">
-            {{ formatText(row.techniqueNames) }}
+            <div class="production-brief-table__summary">
+              {{ formatText(row.techniqueNames) }}
+            </div>
           </template>
         </el-table-column>
         <el-table-column
@@ -304,7 +312,7 @@ onMounted(() => {
   width: 100%;
 
   :deep(.el-table__header-wrapper th.el-table__cell) {
-    font-size: calc(16px * var(--kb-scale, 1));
+    font-size: calc(16px * var(--rd-production-brief-browser-zoom, 1));
     line-height: 1.2;
     color: #0e3f8a;
     background: #7fb5ff;
@@ -312,6 +320,10 @@ onMounted(() => {
     font-weight: 600;
   }
 
+  :deep(.el-table__body td.el-table__cell) {
+    font-size: calc(16px * var(--rd-production-brief-browser-zoom, 1));
+  }
+
   // :deep(.el-table__body td.el-table__cell) {
   //   padding: calc(7px * var(--kb-scale, 1)) 0;
   //   font-size: calc(14px * var(--kb-scale, 1));
@@ -335,12 +347,14 @@ onMounted(() => {
 
 .production-brief-table__device-names {
   display: block;
+  font-size: calc(16px * var(--rd-production-brief-browser-zoom, 1));
   overflow: hidden;
   text-overflow: ellipsis;
   white-space: nowrap;
 }
 
 .production-brief-table__summary {
+  font-size: calc(16px * var(--rd-production-brief-browser-zoom, 1));
   line-height: 1.5;
   white-space: pre-wrap;
   overflow-wrap: anywhere;

+ 10 - 0
src/views/pms/stat/rhkb.vue

@@ -27,11 +27,14 @@ const pageTabs = [
 
 const wrapperRef = ref<HTMLDivElement>()
 const scale = ref(1)
+const initialDevicePixelRatio = window.devicePixelRatio || 1
+const browserZoom = ref(1)
 
 let resizeObserver: ResizeObserver | null = null
 let resizeRaf = 0
 
 provide('rhKbScale', scale)
+provide('rhBrowserZoom', browserZoom)
 
 const targetWrapperStyle = computed(() => ({
   width: `${DESIGN_WIDTH * scale.value}px`,
@@ -65,13 +68,19 @@ function updateScale() {
   })
 }
 
+function updateBrowserZoom() {
+  browserZoom.value = (window.devicePixelRatio || initialDevicePixelRatio) / initialDevicePixelRatio
+}
+
 onMounted(() => {
   nextTick(updateScale)
+  updateBrowserZoom()
   resizeObserver = new ResizeObserver(updateScale)
   if (wrapperRef.value) {
     resizeObserver.observe(wrapperRef.value)
   }
   window.addEventListener('resize', updateScale)
+  window.addEventListener('resize', updateBrowserZoom)
 })
 
 watch(activePage, () => {
@@ -83,6 +92,7 @@ watch(activePage, () => {
 onUnmounted(() => {
   resizeObserver?.disconnect()
   window.removeEventListener('resize', updateScale)
+  window.removeEventListener('resize', updateBrowserZoom)
   cancelAnimationFrame(resizeRaf)
 })
 </script>

+ 14 - 2
src/views/pms/stat/rhkb/deviceList.vue

@@ -50,6 +50,7 @@ const teamLoading = ref(false)
 const currentProjectDeptName = ref('')
 const teamList = ref<RhTeamRateRow[]>([])
 const kbScale = inject<Ref<number>>('rhKbScale', ref(1))
+const browserZoom = inject<Ref<number>>('rhBrowserZoom', ref(1))
 
 const tableData = computed(() => list.value)
 const createTime = computed(() => [
@@ -134,6 +135,7 @@ onMounted(() => {
 <template>
   <div
     class="panel device-list-panel w-full min-h-0 flex flex-col"
+    :style="{ '--rh-device-list-browser-zoom': browserZoom }"
     :class="{ 'device-list-panel--full': props.pageMode === 'full' }">
     <div class="panel-title device-list-panel__title flex items-center justify-between">
       <div class="kb-panel-title-text flex items-center">
@@ -168,7 +170,11 @@ onMounted(() => {
         class="device-list-table"
         :class="{ 'device-list-table--full': props.pageMode === 'full' }"
         @row-click="handleRowClick">
-        <el-table-column prop="projectDeptName" label="项目部" width="140" align="center" />
+        <el-table-column prop="projectDeptName" label="项目部" width="140" align="center">
+          <template #default="{ row }">
+            <div class="device-list-table__summary">{{ row.projectDeptName || '--' }}</div>
+          </template>
+        </el-table-column>
         <el-table-column prop="teamCount" label="队伍总数" width="124" align="center" />
         <el-table-column prop="dmTeamCount" label="待命" width="124" align="center" />
         <el-table-column prop="zbTeamCount" label="施工准备" width="124" align="center" />
@@ -272,7 +278,7 @@ onMounted(() => {
 
 .device-list-table {
   :deep(.el-table__header-wrapper th.el-table__cell) {
-    font-size: calc(16px * var(--kb-scale, 1));
+    font-size: calc(16px * var(--rh-device-list-browser-zoom, 1));
     line-height: 1.2;
     color: #0e3f8a;
     background: #7fb5ff;
@@ -280,6 +286,10 @@ onMounted(() => {
     font-weight: 600;
   }
 
+  :deep(.el-table__body td.el-table__cell) {
+    font-size: calc(16px * var(--rh-device-list-browser-zoom, 1));
+  }
+
   // :deep(.el-table__body td.el-table__cell) {
   //   color: #07192c;
   //   background: rgba(137, 179, 222);
@@ -299,10 +309,12 @@ onMounted(() => {
   display: flex;
   flex-direction: column;
   gap: calc(4px * var(--kb-scale, 1));
+  font-size: calc(16px * var(--rh-device-list-browser-zoom, 1));
   line-height: 1.35;
 }
 
 .device-list-table__summary {
+  font-size: calc(16px * var(--rh-device-list-browser-zoom, 1));
   line-height: 1.5;
   white-space: pre-wrap;
   overflow-wrap: anywhere;

+ 70 - 9
src/views/pms/stat/rhkb/operation.vue

@@ -7,16 +7,26 @@ import {
   createTooltip,
   FONT_FAMILY,
   formatDateLabel,
+  formatMonthLabel,
   THEME
 } from '@/utils/kb'
 import { IotStatApi } from '@/api/pms/stat'
 
+type CostRange = 'week' | 'sixMonth'
+
 const chartData = ref<ChartItem[]>([])
+const activeRange = ref<CostRange>('week')
+const loading = ref(false)
+const rangeOptions: Array<{ label: string; value: CostRange }> = [
+  { label: '近一周', value: 'week' },
+  { label: '近六个月', value: 'sixMonth' }
+]
 
 const router = useRouter()
 const chartRef = ref<HTMLDivElement>()
 let chart: echarts.ECharts | null = null
 let chartClickBound = false
+let loadRequestId = 0
 
 function getChartOption(data: ChartItem[]): echarts.EChartsOption {
   const names = data.map((item) => item.name)
@@ -32,6 +42,9 @@ function getChartOption(data: ChartItem[]): echarts.EChartsOption {
         shadowStyle: {
           color: THEME.split
         }
+      },
+      valueFormatter(value: number) {
+        return activeRange.value === 'sixMonth' ? `${Number(value).toFixed(2)} 万元` : `${value}`
       }
     }),
     xAxis: {
@@ -49,13 +62,13 @@ function getChartOption(data: ChartItem[]): echarts.EChartsOption {
         fontWeight: 500,
         fontFamily: FONT_FAMILY,
         formatter(value: string) {
-          return formatDateLabel(value)
+          return activeRange.value === 'sixMonth' ? formatMonthLabel(value) : formatDateLabel(value)
         }
       }
     },
     yAxis: {
       type: 'value',
-      name: '运维成本(元)',
+      name: activeRange.value === 'sixMonth' ? '运维成本(万元)' : '运维成本(元)',
       nameTextStyle: {
         color: THEME.text.regular,
         fontSize: 13,
@@ -108,7 +121,10 @@ function getChartOption(data: ChartItem[]): echarts.EChartsOption {
           color: THEME.color.orange.strong,
           fontSize: 16,
           fontWeight: 700,
-          fontFamily: FONT_FAMILY
+          fontFamily: FONT_FAMILY,
+          formatter(params: any) {
+            return activeRange.value === 'sixMonth' ? Number(params.value).toFixed(2) : params.value
+          }
         },
         emphasis: {
           itemStyle: {
@@ -175,21 +191,41 @@ function destroyChart() {
   }
 }
 
-async function loadChart() {
+async function loadChart(range: CostRange = activeRange.value) {
+  const requestId = ++loadRequestId
+  loading.value = true
+
   try {
-    const res = await IotStatApi.getOrderYwcb('rh')
+    const res =
+      range === 'sixMonth'
+        ? await IotStatApi.getMaintainCost({})
+        : await IotStatApi.getOrderYwcb('rh')
+    if (requestId !== loadRequestId) return
+
     chartData.value = res.xAxis.map((item, index) => ({
       name: item,
-      value: res.series[index]
+      value:
+        range === 'sixMonth'
+          ? Number((Number(res.series[index] || 0) / 10000).toFixed(2))
+          : res.series[index]
     }))
     renderChart()
   } catch (error) {
+    if (requestId !== loadRequestId) return
     console.error('运维成本:', error)
     chartData.value = []
     renderChart()
+  } finally {
+    if (requestId === loadRequestId) {
+      loading.value = false
+    }
   }
 }
 
+watch(activeRange, (range) => {
+  loadChart(range)
+})
+
 onMounted(() => {
   initChart()
   chart?.getZr().on('click', handleChartClick)
@@ -208,17 +244,42 @@ onUnmounted(() => {
 
 <template>
   <div class="panel flex flex-col">
-    <div class="panel-title">
+    <div class="panel-title flex items-center justify-between">
       <div class="icon-decorator">
         <span></span>
         <span></span>
       </div>
-      运维成本
+      <div class="kb-panel-title-text">运维成本</div>
+      <el-segmented
+        v-model="activeRange"
+        :options="rangeOptions"
+        size="small"
+        class="cost-range-switch" />
     </div>
-    <div ref="chartRef" class="flex-1 min-h-0"></div>
+    <div ref="chartRef" v-loading="loading" class="flex-1 min-h-0"></div>
   </div>
 </template>
 
 <style lang="scss" scoped>
 @import url('@/styles/kb.scss');
+
+.cost-range-switch {
+  --el-segmented-item-selected-color: #03409b;
+  --el-segmented-item-selected-bg-color: rgb(255 255 255 / 86%);
+  --el-segmented-bg-color: rgb(31 91 184 / 10%);
+  --el-segmented-item-hover-bg-color: rgb(255 255 255 / 56%);
+
+  min-height: calc(26px * var(--kb-scale, 1));
+  padding: calc(2px * var(--kb-scale, 1));
+  border: 1px solid rgb(31 91 184 / 12%);
+  transform: translateY(calc(-2px * var(--kb-scale, 1)));
+
+  :deep(.el-segmented__item) {
+    min-height: calc(22px * var(--kb-scale, 1));
+    padding: 0 calc(7px * var(--kb-scale, 1));
+    font-size: calc(13px * var(--kb-scale, 1));
+    font-weight: 600;
+    color: #29527f;
+  }
+}
 </style>

+ 10 - 0
src/views/pms/stat/rykb.vue

@@ -26,11 +26,14 @@ const pageTabs = [
 
 const wrapperRef = ref<HTMLDivElement>()
 const scale = ref(1)
+const initialDevicePixelRatio = window.devicePixelRatio || 1
+const browserZoom = ref(1)
 
 let resizeObserver: ResizeObserver | null = null
 let resizeRaf = 0
 
 provide('ryKbScale', scale)
+provide('ryBrowserZoom', browserZoom)
 
 const targetWrapperStyle = computed(() => ({
   width: `${DESIGN_WIDTH * scale.value}px`,
@@ -64,13 +67,19 @@ function updateScale() {
   })
 }
 
+function updateBrowserZoom() {
+  browserZoom.value = (window.devicePixelRatio || initialDevicePixelRatio) / initialDevicePixelRatio
+}
+
 onMounted(() => {
   nextTick(updateScale)
+  updateBrowserZoom()
   resizeObserver = new ResizeObserver(updateScale)
   if (wrapperRef.value) {
     resizeObserver.observe(wrapperRef.value)
   }
   window.addEventListener('resize', updateScale)
+  window.addEventListener('resize', updateBrowserZoom)
 })
 
 watch(activePage, () => {
@@ -82,6 +91,7 @@ watch(activePage, () => {
 onUnmounted(() => {
   resizeObserver?.disconnect()
   window.removeEventListener('resize', updateScale)
+  window.removeEventListener('resize', updateBrowserZoom)
   cancelAnimationFrame(resizeRaf)
 })
 </script>

+ 23 - 12
src/views/pms/stat/rykb/ryProductionBriefs.vue

@@ -44,6 +44,7 @@ const selectedDate = ref(DEFAULT_DATE)
 const loading = ref(false)
 const list = ref<RyProductionBriefRow[]>([])
 const kbScale = inject<Ref<number>>('ryKbScale', ref(1))
+const browserZoom = inject<Ref<number>>('ryBrowserZoom', ref(1))
 const tableHeight = computed<number | string>(() =>
   props.pageMode === 'full' ? '100%' : Math.round(TABLE_HEIGHT * kbScale.value)
 )
@@ -179,6 +180,7 @@ onMounted(() => {
 <template>
   <div
     class="panel device-list-panel production-brief-panel w-full min-h-0 flex flex-col"
+    :style="{ '--production-brief-browser-zoom': browserZoom }"
     :class="{ 'production-brief-panel--full': props.pageMode === 'full' }">
     <div class="panel-title device-list-panel__title flex items-center justify-between">
       <div class="kb-panel-title-text flex items-center">
@@ -211,8 +213,16 @@ onMounted(() => {
         class="device-list-table production-brief-table"
         :class="{ 'device-list-table--full': props.pageMode === 'full' }">
         <el-table-column prop="projectClassification" label="公司" min-width="72" align="center" />
-        <el-table-column prop="projectName" label="项目" min-width="150" align="center" />
-        <el-table-column prop="deptName" label="队伍" min-width="94" align="center" />
+        <el-table-column prop="projectName" label="项目" min-width="150" align="center">
+          <template #default="{ row }">
+            <div class="production-brief-table__summary">{{ row.projectName || '--' }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="deptName" label="队伍" min-width="94" align="center">
+          <template #default="{ row }">
+            <div class="production-brief-table__summary">{{ row.deptName || '--' }}</div>
+          </template>
+        </el-table-column>
         <el-table-column prop="taskName" label="生产任务" min-width="130" align="center" />
         <el-table-column
           prop="constructionStatusName"
@@ -220,7 +230,6 @@ onMounted(() => {
           min-width="88"
           align="center" />
 
-        <el-table-column prop="nextPlan" label="下步任务" min-width="130" align="center" />
         <el-table-column
           prop="constructionBrief"
           label="当日生产简况"
@@ -231,6 +240,12 @@ onMounted(() => {
           </template>
         </el-table-column>
 
+        <el-table-column prop="nextPlan" label="下步任务" min-width="130" align="center">
+          <template #default="{ row }">
+            <div class="production-brief-table__summary">{{ row.nextPlan || '--' }}</div>
+          </template>
+        </el-table-column>
+
         <el-table-column label="当日进尺(m)/当日井次" min-width="150" align="center">
           <template #default="{ row }">
             {{ formatFootageOrWell(row) }}
@@ -294,7 +309,7 @@ onMounted(() => {
   width: 100%;
 
   :deep(.el-table__header-wrapper th.el-table__cell) {
-    font-size: calc(16px * var(--kb-scale, 1));
+    font-size: calc(16px * var(--production-brief-browser-zoom, 1));
     line-height: 1.2;
     color: #0e3f8a;
     background: #7fb5ff;
@@ -302,14 +317,9 @@ onMounted(() => {
     font-weight: 600;
   }
 
-  // :deep(.el-table__body td.el-table__cell) {
-  //   height: calc(58px * var(--kb-scale, 1));
-  //   padding: calc(7px * var(--kb-scale, 1)) 0;
-  //   font-size: calc(14px * var(--kb-scale, 1));
-  //   color: #07192c !important;
-  //   background: #89b3de !important;
-  //   border-color: #fff !important;
-  // }
+  :deep(.el-table__body td.el-table__cell) {
+    font-size: calc(16px * var(--production-brief-browser-zoom, 1));
+  }
 
   // :deep(.el-table__body tr:nth-child(2n) td.el-table__cell) {
   //   background: #b8cee5 !important;
@@ -321,6 +331,7 @@ onMounted(() => {
 }
 
 .production-brief-table__summary {
+  font-size: calc(16px * var(--production-brief-browser-zoom, 1));
   line-height: 1.5;
   white-space: pre-wrap;
   overflow-wrap: anywhere;