houzekong 2 дней назад
Родитель
Сommit
1089fa7b03

+ 1 - 1
public/js/global.js

@@ -336,7 +336,7 @@ const __STATIC_ROUTES__ = [
           internalOrExternal: false,
           icon: '',
           componentName: 'index',
-          title: '测风点管理',
+          title: '测风点管理',
         },
         name: 'warningAnalysis-wind-point-manage',
       },

+ 7 - 7
src/views/analysis/warningAnalysis/globalAlarm/globalAlarm.data.ts

@@ -28,7 +28,7 @@ export const columns: BasicColumn[] = [
     width: 180,
   },
   {
-    title: '测风点名称',
+    title: '测风点名称',
     dataIndex: 'mineAreaName',
     width: 160,
   },
@@ -74,7 +74,7 @@ export const historyColumns: BasicColumn[] = [
     width: 180,
   },
   {
-    title: '测风点名称',
+    title: '测风点名称',
     dataIndex: 'mineAreaName',
     width: 160,
   },
@@ -89,11 +89,11 @@ export const historyColumns: BasicColumn[] = [
     dataIndex: 'expectVal',
     width: 100,
   },
-  // {
-  //   title: '风速波动',
-  //   dataIndex: 'vaChange',
-  //   width: 100,
-  // },
+  {
+    title: '单位',
+    dataIndex: 'unit',
+    width: 100,
+  },
   {
     title: '报警时间',
     dataIndex: 'createTime',

+ 4 - 1
src/views/analysis/warningAnalysis/globalAlarm/index.vue

@@ -259,7 +259,10 @@
           data: data.dates || [],
           axisLabel: { fontSize: 12 },
         },
-        yAxis: { type: 'value', minInterval: 1 },
+        yAxis: [
+          { type: 'value', minInterval: 1, name: 'm/s' },
+          { type: 'value', minInterval: 1, name: 'm³/min' },
+        ],
         series,
         color: ['#f5222d', '#fa8c16', '#1890ff', '#722ed1'],
       });

+ 10 - 10
src/views/analysis/warningAnalysis/windPointManage/index.vue

@@ -2,8 +2,8 @@
 <template>
   <div class="wind-point-manage">
     <Tabs v-model:activeKey="activeTab" type="line" class="common-page-tabs" :destroyInactiveTabPane="true">
-      <!-- 测风点管理 -->
-      <TabPane tab="测风点管理" key="pointManage">
+      <!-- 测风点管理 -->
+      <TabPane tab="测风点管理" key="pointManage">
         <a-row :gutter="12" class="tab-content">
           <a-col :span="14">
             <BasicTable @register="registerPointTable" :scroll="{ x: 'max-content', y: 420 }" :style="{ padding: 0 }">
@@ -104,10 +104,10 @@
   // 激活的Tab页签
   const activeTab = ref('pointManage');
 
-  // ====== 注册测风点表格 ======
+  // ====== 注册测风点表格 ======
   const { tableContext: pointCtx } = useListPage({
     tableProps: {
-      title: '注册测风点',
+      title: '注册测风点',
       formConfig: {
         autoSearch: true,
         labelWidth: 120,
@@ -137,7 +137,7 @@
           },
         ],
         showAdvancedButton: false,
-        schemaGroupNames: ['注册测风点查询'],
+        schemaGroupNames: ['测风点查询'],
         actionColOptions: {
           lg: 16,
           xl: 14,
@@ -165,10 +165,10 @@
   // 组织树 store(fax↔部门 id 换算)
   const mineStore = useMineDepartmentStore();
 
-  // ====== 上传数据布点表格(getWindrectList)======
+  // ====== 上传测风装置表格(getWindrectList)======
   const { tableContext: windrectCtx } = useListPage({
     tableProps: {
-      title: '上传数据布点',
+      title: '测风装置',
       formConfig: {
         autoSearch: true,
         labelWidth: 120,
@@ -181,7 +181,7 @@
           },
         ],
         showAdvancedButton: false,
-        schemaGroupNames: ['上传数据布点查询'],
+        schemaGroupNames: ['测风装置查询'],
         actionColOptions: {
           lg: 14,
           xl: 12,
@@ -192,7 +192,7 @@
       immediate: true,
       columns: windrectColumns,
       api: getWindrectList,
-      pagination: false,
+      pagination: true,
       striped: true,
       bordered: true,
       showIndexColumn: true,
@@ -279,7 +279,7 @@
 
   // ====== 新增/编辑点位弹窗 ======
   const isUpdate = ref(true);
-  const modalTitle = computed(() => (!isUpdate.value ? '新增测风点' : '编辑测风点'));
+  const modalTitle = computed(() => (!isUpdate.value ? '新增测风点' : '编辑测风点'));
 
   const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
     schemas: formSchema,

+ 19 - 19
src/views/analysis/warningAnalysis/windPointManage/windTopology/hooks/useTopology.ts

@@ -25,7 +25,7 @@ export function useTopology() {
   const chartRef = ref<HTMLDivElement | null>(null);
   let chartInstance: echarts.ECharts | null = null;
   let topologyData: TopologyData = { nodes: [], links: [] };
-  /** 数据布点显示名映射(rawId → devicePos/deviceCode/id,取自全量 windrectList):
+  /** 测风装置显示名映射(rawId → devicePos/deviceCode/id,取自全量 windrectList):
    *  已绑定设备不再绘制节点,其名称由该映射写入巷道连线 edgeLabel 及解绑确认文案 */
   let deviceNameMap: Record<string, string> = {};
   let resizeObserver: ResizeObserver | null = null;
@@ -35,7 +35,7 @@ export function useTopology() {
   const mode = ref<TopoMode>('relation');
   /** 绑定模式选中的关联源节点(双击节点选中,再单击另一节点建立关系;红色描边高亮) */
   const armedSource = ref<TopoNodeData | null>(null);
-  /** 布点模式绑定弹窗:双击未绑定布点的连线后弹出选择数据布点 */
+  /** 布点模式绑定弹窗:双击未绑定布点的连线后弹出选择测风装置 */
   const bindVisible = ref(false);
   const bindPoint = ref<TopoNodeData | null>(null);
   const bindDeviceId = ref<string | undefined>(undefined);
@@ -91,7 +91,7 @@ export function useTopology() {
       // 此处直接消费全量数据;接口异常时 bundle 为备用空数据(仍可绘制总进地面节点)
       const bundle = await getTopologyData({ deptId: mine.id });
       armedSource.value = null;
-      // 数据布点显示名映射(全量列表 → 已绑定设备的 edgeLabel/解绑文案展示用)
+      // 测风装置显示名映射(全量列表 → 已绑定设备的 edgeLabel/解绑文案展示用)
       deviceNameMap = {};
       for (const d of bundle.windrectList) {
         if (d.id) deviceNameMap[String(d.id)] = d.devicePos || d.deviceCode || String(d.id);
@@ -99,7 +99,7 @@ export function useTopology() {
       renderTopology(bundle.topology);
       // 数据为空时给出诊断信息(总进地面节点仍会渲染)
       if (!bundle.topology.nodes.some((n) => n.category !== 0)) {
-        console.warn('拓扑数据为空:未获取到测风点(deptId=' + mine.id + ')');
+        console.warn('拓扑数据为空:未获取到测风点(deptId=' + mine.id + ')');
         message.warning('未获取到拓扑数据,请检查接口或稍后刷新');
       }
     } catch (e) {
@@ -154,13 +154,13 @@ export function useTopology() {
       }
       seenIds.add(n.id);
       const cat = categories[n.category] || categories[0];
-      // 节点配色:测风点统一灰色小圆点(层级/类型区分转移到连线颜色);地面节点使用分类色
+      // 节点配色:测风点统一灰色小圆点(层级/类型区分转移到连线颜色);地面节点使用分类色
       let nodeColor = cat.color;
       if (n.category === 1) {
         nodeColor = POINT_COLOR;
       }
       const itemStyle: any = { color: nodeColor };
-      // 测风点统一为灰色小圆点(白描边衬底,避免与彩色连线粘连)
+      // 测风点统一为灰色小圆点(白描边衬底,避免与彩色连线粘连)
       if (n.category === 1) {
         itemStyle.borderColor = '#ffffff';
         itemStyle.borderWidth = 1.5;
@@ -188,7 +188,7 @@ export function useTopology() {
       if (pos) {
         en.x = pos.x;
         en.y = pos.y;
-        // 地面节点固定不可拖;测风点可拖动(配合"保存布局"持久化位置)
+        // 地面节点固定不可拖;测风点可拖动(配合"保存布局"持久化位置)
         if (n.category === 0) {
           en.fixed = true;
         }
@@ -269,7 +269,7 @@ export function useTopology() {
         return;
       }
       if (params.dataType === 'edge') {
-        // 单击巷道连线 → 显示其主要数据测风点详情(进风/用风为子节点、回风为父节点)
+        // 单击巷道连线 → 显示其主要数据测风点详情(进风/用风为子节点、回风为父节点)
         const mainId = params.data.mainPointId || params.data.pointId;
         if (params.data.kind === 'roadway' && mainId) {
           const point = topologyData.nodes.find((n) => n.id === mainId);
@@ -287,7 +287,7 @@ export function useTopology() {
           // 绑定模式:双击连线 → 解除巷道关系(传关系 id)
           handleRemoveRelation(params.data);
         } else {
-          // 布点模式:双击连线 → 对其主要数据点位解绑/绑定数据布点
+          // 布点模式:双击连线 → 对其主要数据点位解绑/绑定测风装置
           const mainId = params.data.mainPointId || params.data.pointId;
           const point = mainId ? topologyData.nodes.find((n) => n.id === mainId) : undefined;
           if (point) handleDeviceAction(point);
@@ -389,12 +389,12 @@ export function useTopology() {
 
   // ==================== 布点模式:设备绑定/解绑 ====================
 
-  /** 按数据布点原始 id 解析其显示名(用于确认文案,避免直接展示 id) */
+  /** 按测风装置原始 id 解析其显示名(用于确认文案,避免直接展示 id) */
   function deviceNameOf(rawId?: string) {
     return (rawId && deviceNameMap[rawId]) || rawId || '';
   }
 
-  /** 布点模式:双击连线 → 已有数据布点则解绑,否则弹窗选择绑定 */
+  /** 布点模式:双击连线 → 已有测风装置则解绑,否则弹窗选择绑定 */
   function handleDeviceAction(point: TopoNodeData) {
     if (point.windrectId) {
       confirmUnbindDevice(point);
@@ -410,11 +410,11 @@ export function useTopology() {
     bindVisible.value = false;
   }
 
-  /** 布点模式:弹窗选择数据布点后调用(updateMineArea 更新 windrectId 字段) */
+  /** 布点模式:弹窗选择测风装置后调用(updateMineArea 更新 windrectId 字段) */
   async function confirmBind(deviceId?: string) {
     const point = bindPoint.value;
     if (!point?.rawId) {
-      message.warning('缺少测风点原始 id,无法绑定');
+      message.warning('缺少测风点原始 id,无法绑定');
       return;
     }
     if (!deviceId) {
@@ -431,17 +431,17 @@ export function useTopology() {
     }
   }
 
-  /** 布点模式:解绑数据布点(清空 windrectId 字段,updateMineArea) */
+  /** 布点模式:解绑测风装置(清空 windrectId 字段,updateMineArea) */
   function confirmUnbindDevice(point: TopoNodeData) {
     const deviceName = deviceNameOf(point.windrectId);
     Modal.confirm({
       title: '确认解绑',
-      content: `确定解除"${point.name}"与数据布点"${deviceName}"的绑定关系?`,
+      content: `确定解除"${point.name}"与测风装置"${deviceName}"的绑定关系?`,
       okText: '确认解绑',
       cancelText: '取消',
       onOk: async () => {
         if (!point.rawId) {
-          message.warning('缺少测风点原始 id,无法解绑');
+          message.warning('缺少测风点原始 id,无法解绑');
           return;
         }
         try {
@@ -507,7 +507,7 @@ export function useTopology() {
   }
 
   /**
-   * 保存当前拓扑布局:将全部测风点(含 level 0/6)当前位置写入
+   * 保存当前拓扑布局:将全部测风点(含 level 0/6)当前位置写入
    * updateMineAreaTopology 的 topologyX/topologyY 字段(ECharts 画布像素坐标)。
    * 坐标在点击保存时一次性从 ECharts 实例读取,并按 LAYOUT.snapGrid(对齐像素值)取整。
    * 返回是否全部保存成功。
@@ -515,7 +515,7 @@ export function useTopology() {
   async function saveTopologyLayout(): Promise<boolean> {
     const points = topologyData.nodes.filter((n) => n.category === 1 && n.rawId);
     if (points.length === 0) {
-      message.warning('当前无可保存的测风点');
+      message.warning('当前无可保存的测风点');
       return false;
     }
     const positions = getChartNodePositions();
@@ -587,7 +587,7 @@ export function useTopology() {
     if (m === 'relation') {
       message.info('双击连线解除关系;双击节点并选中另一节点以建立关系');
     } else {
-      message.info('双击连线解绑或绑定数据布点');
+      message.info('双击连线解绑或绑定测风装置');
     }
   }
 

+ 4 - 4
src/views/analysis/warningAnalysis/windPointManage/windTopology/index.vue

@@ -40,7 +40,7 @@
         </a-button-group>
         <a-divider type="vertical" />
         <span v-if="mode === 'relation'" class="select-text">双击连线解除关系;双击节点并选中另一节点以建立关系</span>
-        <span v-else class="select-text">双击连线解绑或绑定数据布点</span>
+        <span v-else class="select-text">双击连线解绑或绑定测风装置</span>
       </div>
 
       <!-- 图例 -->
@@ -86,7 +86,7 @@
     <!-- 布点模式绑定弹窗(双击未绑定布点的连线弹出;destroyOnClose 保证每次打开重建表单刷新下拉数据) -->
     <BasicModal
       @register="registerBindModal"
-      :title="`绑定数据布点至:${bindPoint?.name}`"
+      :title="`绑定测风装置至:${bindPoint?.name}`"
       ok-text="确认"
       cancel-text="取消"
       destroyOnClose
@@ -127,7 +127,7 @@
     return { level, text: levelTextMap[level], color: levelColorMap[level] };
   });
 
-  /** 与 renderTopology 一致的节点配色:测风点灰色、地面用分类色 */
+  /** 与 renderTopology 一致的节点配色:测风点灰色、地面用分类色 */
   function nodeColor(node: any): string {
     if (node?.category === 1) return POINT_COLOR;
     return categories[node?.category]?.color || '#333';
@@ -181,7 +181,7 @@
     }
   });
 
-  /** 绑定弹窗下拉参数:按当前选中矿(deptId)查询未使用数据布点 */
+  /** 绑定弹窗下拉参数:按当前选中矿(deptId)查询未使用测风装置 */
   const bindDeviceParams = computed(() => ({ deptId: selectedDeptId.value }));
 
   function handleBindOk() {

+ 5 - 5
src/views/analysis/warningAnalysis/windPointManage/windTopology/windTopology.api.ts

@@ -16,8 +16,8 @@ enum Api {
 
 /**
  * 获取测风网络拓扑全量数据(接口获取 → 代码处理 → 返回完整数据供消费):
- *   getMineAreaRelation -> 测风点列表 + 巷道关系列表(按矿编码 mineCode=fax 查询)
- *   getWindrectList     -> 数据布点全量列表(按 deptId 查询,用于解析已绑定设备显示名)
+ *   getMineAreaRelation -> 测风点列表 + 巷道关系列表(按矿编码 mineCode=fax 查询)
+ *   getWindrectList     -> 测风装置全量列表(按 deptId 查询,用于解析已绑定设备显示名)
  * 所有接口并行请求(allSettled),单个失败不影响整体;整体异常时返回备用空数据
  * (总进地面节点 + 空列表),保证拓扑图总能绘制。
  */
@@ -39,7 +39,7 @@ export const getTopologyData = async (params?: any): Promise<TopologyBundle> =>
     const areaList = Array.isArray(relData.mineAreaList) ? (relData.mineAreaList as MineAreaNode[]) : [];
     const relationList = Array.isArray(relData.mineAreaRelationList) ? (relData.mineAreaRelationList as MineAreaRelationNode[]) : [];
     const windrectList =
-      windrectRes.status === 'fulfilled' ? toList(windrectRes.value) : (console.error('获取数据布点失败:', windrectRes.reason), []);
+      windrectRes.status === 'fulfilled' ? toList(windrectRes.value) : (console.error('获取测风装置失败:', windrectRes.reason), []);
 
     return buildTopologyBundle(areaList, relationList, windrectList as WindrectNode[]);
   } catch (e) {
@@ -49,12 +49,12 @@ export const getTopologyData = async (params?: any): Promise<TopologyBundle> =>
   }
 };
 
-/** 编辑测风点位(绑定/解绑数据布点通过字段:id=测风点位主键、windrectId=绑定数据布点 id) */
+/** 编辑测风地点(绑定/解绑测风装置通过字段:id=测风地点主键、windrectId=绑定测风装置 id) */
 export const updateArea = (params?: any, opts?: RequestOptions) => defHttp.post({ url: Api.updateMineArea, params }, opts);
 
 export const updateMineAreaTopology = (params?: any) => defHttp.post({ url: Api.updateMineAreaTopology, params });
 
-/** 查询未使用数据布点列表(按 deptId 查询,供布点模式绑定弹窗选择) */
+/** 查询未使用测风装置列表(按 deptId 查询,供布点模式绑定弹窗选择) */
 export const getWindrectListNoUsed = (params?: any) => defHttp.post({ url: Api.getWindrectListNoUsed, params }, { joinParamsToUrl: true });
 
 /** 绑定 MineArea 关联关系(RequestBody:mineCode/parentId/childId;双击节点+单击节点关联时调用) */

+ 12 - 12
src/views/analysis/warningAnalysis/windPointManage/windTopology/windTopology.data.ts

@@ -9,13 +9,13 @@ export interface CategoryDef {
   symbolSize: number; // 节点大小
 }
 
-/** 2 类节点:地面(前端生成,只读)、测风点 */
+/** 2 类节点:地面(前端生成,只读)、测风点 */
 export const categories: CategoryDef[] = [
   { name: '地面', color: '#722ed1', symbol: 'diamond', symbolSize: 26 },
-  { name: '测风点', color: '#fa8c16', symbol: 'circle', symbolSize: 30 },
+  { name: '测风点', color: '#fa8c16', symbol: 'circle', symbolSize: 30 },
 ];
 
-/** 测风点统一节点样式:灰色小圆点(层级/类型区分转移到连线颜色) */
+/** 测风点统一节点样式:灰色小圆点(层级/类型区分转移到连线颜色) */
 export const POINT_COLOR = '#8c8c8c';
 export const POINT_SIZE = 16;
 
@@ -23,9 +23,9 @@ export const POINT_SIZE = 16;
 export const JUDGE_COLOR = '#e53935';
 export const JUDGE_WIDTH = 6;
 
-// ==================== 测风点层级映射 ====================
+// ==================== 测风点层级映射 ====================
 
-/** 测风点通风类型层级(level 字段语义),用于按层级分列绘制拓扑 */
+/** 测风点通风类型层级(level 字段语义),用于按层级分列绘制拓扑 */
 export const levelTextMap: Record<number, string> = {
   0: '进风井',
   1: '矿井进风',
@@ -36,7 +36,7 @@ export const levelTextMap: Record<number, string> = {
   6: '回风井',
 };
 
-/** 测风点层级配色(7 级互不混淆,避开地面紫 #722ed1),用于按层级区分巷道连线颜色 */
+/** 测风点层级配色(7 级互不混淆,避开地面紫 #722ed1),用于按层级区分巷道连线颜色 */
 export const levelColorMap: Record<number, string> = {
   0: '#52c41a', // 进风井
   1: '#f5222d', // 矿井进风
@@ -138,7 +138,7 @@ export interface DetailField {
 
 export const nodeDetailFields: Record<string, DetailField[]> = {
   地面: [{ label: '节点名称', key: 'name' }],
-  测风点: [
+  测风点: [
     { label: '层级', key: 'levelText' },
     { label: '需风量(m³/min)', key: 'airVolume' },
   ],
@@ -157,7 +157,7 @@ export interface TopoNodeData {
   isLeafText?: string;
   /** 矿井编码(部门叶子节点(矿点)的 fax) */
   fax?: string;
-  /** 测风点通风类型层级(1=矿井进风 2=采区进风 3=采区用风 4=采区回风 5=矿井回风),用于按层级分列 */
+  /** 测风点通风类型层级(1=矿井进风 2=采区进风 3=采区用风 4=采区回风 5=矿井回风),用于按层级分列 */
   level?: number;
   /** 层级显示名(levelTextMap 映射) */
   levelText?: string;
@@ -178,7 +178,7 @@ export interface TopoLinkData {
   label?: string;
   /** 连线类型:roadway=巷道连线(父巷道 → 子巷道 直线,或 地面→lv1 / lv5→地面 根边) */
   kind?: 'roadway';
-  /** 连线子测风点 id(roadway 边指向子级点位) */
+  /** 连线子测风点 id(roadway 边指向子级点位) */
   pointId?: string;
   /**
    * 连线主要数据点位 id:进风/用风连线取子节点、回风连线取父节点。
@@ -198,7 +198,7 @@ export interface TopologyData {
 
 // ==================== API 响应类型 ====================
 
-/** API -> MineArea(测风点,level 为通风类型层级) */
+/** API -> MineArea(测风点,level 为通风类型层级) */
 export interface MineAreaNode {
   id: string;
   mineCode: string;
@@ -217,7 +217,7 @@ export interface MineAreaNode {
   [key: string]: any;
 }
 
-/** API -> Windrect(数据布点/测风装置) */
+/** API -> Windrect(测风装置/测风装置) */
 export interface WindrectNode {
   id: string;
   mineCode: string;
@@ -258,7 +258,7 @@ export const ROOT_OUT_ID = 'root:out';
 export interface TopologyBundle {
   /** 可直接渲染的拓扑数据(含总进地面节点、疑似标红所需信息) */
   topology: TopologyData;
-  /** 数据布点全量列表(getWindrectList,用于解析已绑定设备显示名写入连线标注) */
+  /** 测风装置全量列表(getWindrectList,用于解析已绑定设备显示名写入连线标注) */
   windrectList: WindrectNode[];
 }
 

+ 2 - 2
src/views/dashboard/HiddenSurface/configurable.data.ts

@@ -39,7 +39,7 @@ export const testConfigProvinceMonitor: Config[] = [
               to: '/basicinfo/mines-info?accessStatus=1',
             },
             {
-              label: '测风装置总数',
+              label: '测风地点总数',
               value: '${areaNum}',
               to: '/warningAnalysis/wind-point-manage',
             },
@@ -228,7 +228,7 @@ export const testConfigVentilationMonitor: Config[] = [
           readFrom: '',
           items: [
             {
-              label: '测风装置总数',
+              label: '测风地点总数',
               value: '${areaNum}',
               to: '/warningAnalysis/wind-point-manage',
             },

+ 27 - 7
src/views/monitor/sensorMonitor/sensorMonitor.data.ts

@@ -36,11 +36,11 @@ export const columns: BasicColumn[] = [
     dataIndex: 'mineAreaName',
     width: 140,
   },
-  {
-    title: '设备编码',
-    dataIndex: 'deviceCode',
-    width: 140,
-  },
+  // {
+  //   title: '设备编码',
+  //   dataIndex: 'deviceCode',
+  //   width: 140,
+  // },
   {
     title: '设备位置',
     dataIndex: 'devicePos',
@@ -81,11 +81,21 @@ export const historyColumns: BasicColumn[] = [
     fixed: 'left',
     width: 180,
   },
+  // {
+  //   title: '矿编码',
+  //   dataIndex: 'mineCode',
+  //   width: 110,
+  // },
   {
-    title: '设备编码',
-    dataIndex: 'deviceCode',
+    title: '测风地点',
+    dataIndex: 'mineAreaName',
     width: 140,
   },
+  // {
+  //   title: '设备编码',
+  //   dataIndex: 'deviceCode',
+  //   width: 140,
+  // },
   {
     title: '设备位置',
     dataIndex: 'devicePos',
@@ -101,6 +111,16 @@ export const historyColumns: BasicColumn[] = [
     dataIndex: 'm3',
     width: 120,
   },
+  {
+    title: '数据状态',
+    dataIndex: 'status',
+    width: 110,
+    customRender: ({ text }) => {
+      const label = statusMap[String(text)] ?? '-';
+      const color = String(text) === '1' ? StatusColorEnum.green : StatusColorEnum.red;
+      return h('span', { style: { color, fontWeight: 'bold' } }, label);
+    },
+  },
   {
     title: '创建时间',
     dataIndex: 'createTime',

+ 60 - 24
src/views/monitor/surfaceMonitor/surfaceMonitor.data.ts

@@ -43,16 +43,6 @@ export const columns: BasicColumn[] = [
   //   width: 220,
   //   ellipsis: true,
   // },
-  {
-    title: '接入状态',
-    dataIndex: 'accessStatus',
-    width: 110,
-    customRender: ({ text }) => {
-      const label = accessStatusMap[String(text)] ?? '-';
-      const color = String(text) === '1' ? StatusColorEnum.green : StatusColorEnum.red;
-      return h('span', { style: { color, fontWeight: 'bold' } }, label);
-    },
-  },
   {
     title: '煤矿状态',
     dataIndex: 'mkMineStatus',
@@ -64,16 +54,6 @@ export const columns: BasicColumn[] = [
   //   width: 120,
   //   ellipsis: true,
   // },
-  {
-    title: '判识结果',
-    dataIndex: 'judgeResult',
-    width: 110,
-    customRender: ({ text }) => {
-      const label = judgeResultMap[String(text)] ?? '-';
-      const color = String(text) === '1' ? StatusColorEnum.red : String(text) === '2' ? StatusColorEnum.green : StatusColorEnum.gray;
-      return h('span', { style: { color, fontWeight: 'bold' } }, label);
-    },
-  },
   {
     title: '风量不足数',
     dataIndex: 'm3Exception',
@@ -91,6 +71,26 @@ export const columns: BasicColumn[] = [
     width: 110,
     customRender: ({ text }) => (Array.isArray(text) ? text.length : '-'),
   },
+  {
+    title: '接入状态',
+    dataIndex: 'accessStatus',
+    width: 110,
+    customRender: ({ text }) => {
+      const label = accessStatusMap[String(text)] ?? '-';
+      const color = String(text) === '1' ? StatusColorEnum.green : StatusColorEnum.red;
+      return h('span', { style: { color, fontWeight: 'bold' } }, label);
+    },
+  },
+  {
+    title: '判识结果',
+    dataIndex: 'judgeResult',
+    width: 110,
+    customRender: ({ text }) => {
+      const label = judgeResultMap[String(text)] ?? '-';
+      const color = String(text) === '1' ? StatusColorEnum.red : String(text) === '2' ? StatusColorEnum.green : StatusColorEnum.gray;
+      return h('span', { style: { color, fontWeight: 'bold' } }, label);
+    },
+  },
   {
     title: '上次实时数据上传时间',
     dataIndex: 'lastCdssTime',
@@ -109,18 +109,34 @@ export const historyColumns: BasicColumn[] = [
     title: '矿井名称',
     dataIndex: 'mineName',
     fixed: 'left',
-    width: 180,
+    width: 220,
   },
   // {
   //   title: '矿编码',
   //   dataIndex: 'mineCode',
   //   width: 110,
   // },
+  // {
+  //   title: '矿井全称',
+  //   dataIndex: 'corpName',
+  //   width: 220,
+  //   ellipsis: true,
+  // },
   {
-    title: '接入状态',
-    dataIndex: 'accessStatus',
+    title: '煤矿状态',
+    dataIndex: 'mkMineStatus',
+    width: 110,
+  },
+  // {
+  //   title: '父级组织',
+  //   dataIndex: 'parentArea',
+  //   width: 120,
+  //   ellipsis: true,
+  // },
+  {
+    title: '风量不足数',
+    dataIndex: 'm3Exception',
     width: 110,
-    customRender: ({ text }) => accessStatusMap[String(text)] ?? '-',
   },
   {
     title: '测风地点数',
@@ -134,6 +150,26 @@ export const historyColumns: BasicColumn[] = [
     width: 110,
     customRender: ({ text }) => (Array.isArray(text) ? text.length : '-'),
   },
+  {
+    title: '接入状态',
+    dataIndex: 'accessStatus',
+    width: 110,
+    customRender: ({ text }) => {
+      const label = accessStatusMap[String(text)] ?? '-';
+      const color = String(text) === '1' ? StatusColorEnum.green : StatusColorEnum.red;
+      return h('span', { style: { color, fontWeight: 'bold' } }, label);
+    },
+  },
+  {
+    title: '判识结果',
+    dataIndex: 'judgeResult',
+    width: 110,
+    customRender: ({ text }) => {
+      const label = judgeResultMap[String(text)] ?? '-';
+      const color = String(text) === '1' ? StatusColorEnum.red : String(text) === '2' ? StatusColorEnum.green : StatusColorEnum.gray;
+      return h('span', { style: { color, fontWeight: 'bold' } }, label);
+    },
+  },
   {
     title: '上次实时数据上传时间',
     dataIndex: 'lastCdssTime',

+ 1 - 1
src/views/system/cadFile/components/MapView.vue

@@ -3,7 +3,7 @@
     <div ref="map3dContainer"></div>
     <!-- 操作按钮面板 -->
     <div class="map-operation-panel">
-      <a-button :loading="loading" @click="drawerVisible = true" class="">测风点列表</a-button>
+      <a-button :loading="loading" @click="drawerVisible = true" class="">测风点列表</a-button>
       <a-button @click="emit('close')" class="ml-5px">返回列表</a-button>
     </div>
     <SideDrawer v-model:open="drawerVisible" :mineCode="mineCode" :getContainer="() => map3dContainer" />

+ 1 - 1
src/views/system/cadFile/components/SideDrawer.vue

@@ -14,7 +14,7 @@
   >
     <!-- 抽屉头部:标题 + 关闭按钮 -->
     <template #title>
-      测风点管理
+      测风点管理
       <!-- <span class="custom-drawer-title"></span> -->
     </template>
     <template #extra>

+ 7 - 23
tests/useTopologyLayout.spec.ts

@@ -8,7 +8,7 @@ import {
 import type { TopologyData } from '../src/views/analysis/warningAnalysis/windPointManage/windTopology/windTopology.data';
 import { computeLayout } from '../src/views/analysis/warningAnalysis/windPointManage/windTopology/hooks/useTopologyLayout';
 
-/** 构造测风点(MineArea) */
+/** 构造测风点(MineArea) */
 const area = (id: string, level: number, airVolume = 100, extra: Record<string, any> = {}) => ({
   id,
   name: id,
@@ -30,10 +30,7 @@ const rel = (id: string, parentId: string, childId: string, extra: Record<string
 /** 构造一个完整巷道模型拓扑(5 级巷道、4 条巷道关系) */
 function laneTopo(): TopologyData {
   const areas = [area('a1', 1), area('b1', 2, 90), area('c1', 3), area('d1', 4), area('e1', 5)];
-  const relations = buildRelationArray(
-    areas,
-    [rel('r1', 'a1', 'b1'), rel('r2', 'b1', 'c1'), rel('r3', 'c1', 'd1'), rel('r4', 'd1', 'e1')],
-  );
+  const relations = buildRelationArray(areas, [rel('r1', 'a1', 'b1'), rel('r2', 'b1', 'c1'), rel('r3', 'c1', 'd1'), rel('r4', 'd1', 'e1')]);
   return transformToTopologyData(areas, relations);
 }
 
@@ -80,7 +77,7 @@ describe('transformToTopologyData 巷道线模型', () => {
     const rootOut = data.links.find((x) => x.source === 'point:e1' && x.target === ROOT_OUT_ID);
     expect(rootOut?.relationId).toBeUndefined();
     expect(rootOut?.mainPointId).toBe('point:e1');
-    // 无数据布点节点
+    // 无测风装置节点
     expect(data.nodes.some((n) => n.category === 2)).toBe(false);
     // 流向:子节点 level ≤3 进风、>3 回风
     expect(data.links.find((x) => x.relationId === 'r1')?.flow).toBe('intake');
@@ -102,10 +99,7 @@ describe('transformToTopologyData 巷道线模型', () => {
   });
 
   test('topologyX/topologyY 透传到节点(数字与字符串输入)', () => {
-    const areas = [
-      area('a1', 1, 100, { topologyX: 123.5, topologyY: 456 }),
-      area('b1', 2, 90, { topologyX: '200', topologyY: '300' }),
-    ];
+    const areas = [area('a1', 1, 100, { topologyX: 123.5, topologyY: 456 }), area('b1', 2, 90, { topologyX: '200', topologyY: '300' })];
     const data = transformToTopologyData(areas, []);
     expect(data.nodes.find((n) => n.id === 'point:a1')?.topologyX).toBe(123.5);
     expect(data.nodes.find((n) => n.id === 'point:a1')?.topologyY).toBe(456);
@@ -206,18 +200,8 @@ describe('computeLayout 列式布局(固定间距)', () => {
   });
 
   test('多条进风-用风关系数据:全部点位有合法坐标、无 NaN、不越界', () => {
-    const areas = [
-      area('a1', 1, 500),
-      area('a2', 1, 400),
-      area('c1', 3, 300),
-      area('c2', 3, 200),
-      area('e1', 5, 100),
-      area('e2', 5, 90),
-    ];
-    const relations = buildRelationArray(
-      areas,
-      [rel('r1', 'a1', 'c1'), rel('r2', 'a2', 'c2'), rel('r3', 'c1', 'e1'), rel('r4', 'c2', 'e2')],
-    );
+    const areas = [area('a1', 1, 500), area('a2', 1, 400), area('c1', 3, 300), area('c2', 3, 200), area('e1', 5, 100), area('e2', 5, 90)];
+    const relations = buildRelationArray(areas, [rel('r1', 'a1', 'c1'), rel('r2', 'a2', 'c2'), rel('r3', 'c1', 'e1'), rel('r4', 'c2', 'e2')]);
     const data = transformToTopologyData(areas, relations);
     const layout = computeLayout(data, 1200, 700);
     for (const a of areas) {
@@ -290,7 +274,7 @@ describe('computeLayout 列式布局(固定间距)', () => {
         links: [],
       },
       1200,
-      700,
+      700
     );
     expect(layout.positions[ROOT_IN_ID]).toBeDefined();
     expect(layout.positions[ROOT_OUT_ID]).toBeDefined();

+ 35 - 40
tests/useTopologyOrdering.spec.ts

@@ -13,7 +13,7 @@ import {
 } from '../src/views/analysis/warningAnalysis/windPointManage/windTopology/hooks/useTopologyOrdering';
 import { computeLayout } from '../src/views/analysis/warningAnalysis/windPointManage/windTopology/hooks/useTopologyLayout';
 
-/** 构造测风点(MineArea) */
+/** 构造测风点(MineArea) */
 const area = (id: string, level: number, airVolume = 100, extra: Record<string, any> = {}) => ({
   id,
   name: id,
@@ -65,10 +65,25 @@ describe('countCrossings 交叉数统计', () => {
       ['x', 0],
       ['y', 1],
     ]);
-    expect(countCrossings(rankA, rankB, [['a', 'y'], ['b', 'x']])).toBe(1);
-    expect(countCrossings(rankA, rankB, [['a', 'x'], ['b', 'y']])).toBe(0);
+    expect(
+      countCrossings(rankA, rankB, [
+        ['a', 'y'],
+        ['b', 'x'],
+      ])
+    ).toBe(1);
+    expect(
+      countCrossings(rankA, rankB, [
+        ['a', 'x'],
+        ['b', 'y'],
+      ])
+    ).toBe(0);
     // 无公共端点秩(防御:缺失端点跳过不计数)
-    expect(countCrossings(rankA, rankB, [['a', 'y'], ['unknown', 'x']])).toBe(0);
+    expect(
+      countCrossings(rankA, rankB, [
+        ['a', 'y'],
+        ['unknown', 'x'],
+      ])
+    ).toBe(0);
   });
 });
 
@@ -86,16 +101,13 @@ describe('orderNodesByLevel median 扫描法', () => {
 
   test('确定性:同一输入两次调用结果完全一致(含 barycenter 方法)', () => {
     const areas = [area('a1', 1), area('a2', 1), area('a3', 1), area('b1', 2), area('b2', 2), area('b3', 2)];
-    const relations = buildRelationArray(
-      areas,
-      [
-        rel('r1', 'a1', 'b2'),
-        rel('r2', 'a2', 'b3'),
-        rel('r3', 'a3', 'b1'),
-        rel('r1b', 'a1', 'b3'),
-        rel('r2b', 'a2', 'b1'),
-      ],
-    );
+    const relations = buildRelationArray(areas, [
+      rel('r1', 'a1', 'b2'),
+      rel('r2', 'a2', 'b3'),
+      rel('r3', 'a3', 'b1'),
+      rel('r1b', 'a1', 'b3'),
+      rel('r2b', 'a2', 'b1'),
+    ]);
     const data = transformToTopologyData(areas, relations);
     for (const method of ['median', 'barycenter'] as const) {
       const o1 = orderNodesByLevel(data, { method });
@@ -164,15 +176,7 @@ describe('orderNodesByLevel median 扫描法', () => {
     // lv0=[a0,a1]、lv1=[b1,b2]:边 a0→b2、a1→b1 → 初始 1 交叉
     // lv5=[e1,e2]、lv6=[f1,f2]:边 e1→f2、e2→f1 → 初始 1 交叉
     const areas = [area('a0', 0), area('a1', 0), area('b1', 1), area('b2', 1), area('e1', 5), area('e2', 5), area('f1', 6), area('f2', 6)];
-    const relations = buildRelationArray(
-      areas,
-      [
-        rel('r1', 'a0', 'b2'),
-        rel('r2', 'a1', 'b1'),
-        rel('r3', 'e1', 'f2'),
-        rel('r4', 'e2', 'f1'),
-      ],
-    );
+    const relations = buildRelationArray(areas, [rel('r1', 'a0', 'b2'), rel('r2', 'a1', 'b1'), rel('r3', 'e1', 'f2'), rel('r4', 'e2', 'f1')]);
     const data = transformToTopologyData(areas, relations);
     const order = orderNodesByLevel(data);
     expect(order.get('0')).toHaveLength(2);
@@ -214,10 +218,7 @@ describe('computeLayout 与排序集成', () => {
 
   test('5 层线状模型(laneTopo 等价):全部坐标合法,交叉数为 0', () => {
     const areas = [area('a1', 1), area('b1', 2), area('c1', 3), area('d1', 4), area('e1', 5)];
-    const relations = buildRelationArray(
-      areas,
-      [rel('r1', 'a1', 'b1'), rel('r2', 'b1', 'c1'), rel('r3', 'c1', 'd1'), rel('r4', 'd1', 'e1')],
-    );
+    const relations = buildRelationArray(areas, [rel('r1', 'a1', 'b1'), rel('r2', 'b1', 'c1'), rel('r3', 'c1', 'd1'), rel('r4', 'd1', 'e1')]);
     const data = transformToTopologyData(areas, relations);
     const order = orderNodesByLevel(data);
     expect(countTotalCrossings(data, order)).toBe(0);
@@ -233,10 +234,7 @@ describe('computeLayout 与排序集成', () => {
 
   test('排序不改变列序与总进/总回地面节点位置', () => {
     const areas = [area('a1', 1), area('b1', 2), area('c1', 3), area('d1', 4), area('e1', 5)];
-    const relations = buildRelationArray(
-      areas,
-      [rel('r1', 'a1', 'b1'), rel('r2', 'b1', 'c1'), rel('r3', 'c1', 'd1'), rel('r4', 'd1', 'e1')],
-    );
+    const relations = buildRelationArray(areas, [rel('r1', 'a1', 'b1'), rel('r2', 'b1', 'c1'), rel('r3', 'c1', 'd1'), rel('r4', 'd1', 'e1')]);
     const data = transformToTopologyData(areas, relations);
     const pos = computeLayout(data, 1200, 700).positions;
     expect(pos[ROOT_IN_ID].x).toBe(laneX(0));
@@ -249,15 +247,12 @@ describe('computeLayout 与排序集成', () => {
 
   test('pairEdgesOf 复算与 countTotalCrossings 一致(防实现漂移)', () => {
     const areas = [area('a1', 1), area('a2', 1), area('b1', 2), area('b2', 2), area('c1', 3)];
-    const relations = buildRelationArray(
-      areas,
-      [
-        rel('r1', 'a1', 'b2'),
-        rel('r2', 'a2', 'b1'),
-        rel('r3', 'b2', 'c1'),
-        rel('r4', 'a1', 'c1'), // 跨层边:不参与
-      ],
-    );
+    const relations = buildRelationArray(areas, [
+      rel('r1', 'a1', 'b2'),
+      rel('r2', 'a2', 'b1'),
+      rel('r3', 'b2', 'c1'),
+      rel('r4', 'a1', 'c1'), // 跨层边:不参与
+    ]);
     const data = transformToTopologyData(areas, relations);
     const order = orderNodesByLevel(data);
     // 独立复算相邻层边,再统计交叉数,应与 countTotalCrossings 一致