电力企业设备管理用什么系统好低代码搭台账和点检模块实测

4 阅读12分钟

电力企业的设备台账和点检管理是设备管理的核心功能。用低代码搭建设备管理系统,不需要从零写代码,也不需要购买昂贵的EAM软件。本文记录实际搭建和测试的过程。

一、电力企业设备管理的特点

1. 设备分类和管理要求

电力企业的设备种类多、价值高、安全性要求严格。主要的设备类别包括:

  • 一次设备:变压器、断路器、隔离开关、互感器、避雷器

  • 二次设备:继电保护装置、自动装置、通信设备、计量装置

  • 辅助设备:消防设备、安防设备、环境监测设备

每类设备的管理侧重点不同。一次设备关注运行状态和检修周期,二次设备关注定值管理和动作记录,辅助设备关注巡检合格率。

2. 设备台账的基本要素

一份完整的设备台账至少包含以下信息:

  • 基本信息:设备编号、名称、型号、制造商、出厂日期

  • 技术参数:额定电压、额定电流、额定容量等(不同设备类型参数不同)

  • 安装信息:安装位置、所属变电站/线路、投运日期

  • 运行信息:当前状态(运行/备用/检修/故障)、累计运行小时数

  • 检修信息:上次检修日期、下次检修计划、检修周期

  • 文档资料:说明书、图纸、试验报告、验收记录

3. 为什么选择低代码

传统做法是买现成的EAM(企业资产管理)系统,但存在几个问题:

  • 价格高,一套系统动辄几十万上百万

  • 功能固化,电力企业特有的管理需求难以定制

  • 部署周期长,从采购到上线动辄半年

搭贝AI低代码平台搭建设备管理系统的好处是灵活度高。设备台账需要哪些字段、点检表单怎么设计、工单流程怎么走,都可以自己配置。对于电力企业特有的设备分类和检修规程,低代码的适配性比通用EAM更好。

二、设备台账模块的搭建

1. 设备分类和数据模型

电力设备需要按分类管理,不同类型的设备有不同的技术参数字段。数据模型设计:

-- 设备分类表
CREATE TABLE equipment_category (
    id BIGINT PRIMARY KEY,
    category_code VARCHAR(32) NOT NULL COMMENT '分类编号',
    category_name VARCHAR(64) NOT NULL COMMENT '分类名称',
    parent_id BIGINT COMMENT '上级分类',
    level INT COMMENT '层级',
    icon VARCHAR(64),
    sort_order INT DEFAULT 0,
    UNIQUE KEY uk_category_code (category_code)
);

-- 设备台账主表
CREATE TABLE equipment_account (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    equipment_code VARCHAR(64) NOT NULL COMMENT '设备编号(KKS编码或自定义)',
    equipment_name VARCHAR(128) NOT NULL COMMENT '设备名称',
    category_id BIGINT NOT NULL COMMENT '设备分类',
    model_spec VARCHAR(128) COMMENT '型号规格',
    manufacturer VARCHAR(128) COMMENT '制造商',
    manufacture_date DATE COMMENT '出厂日期',
    voltage_level VARCHAR(16) COMMENT '电压等级',
    install_location VARCHAR(256) COMMENT '安装位置',
    substation_id BIGINT COMMENT '所属变电站',
    commission_date DATE COMMENT '投运日期',
    status VARCHAR(16) DEFAULT 'RUNNING' COMMENT '运行/备用/检修/故障/退役',
    run_hours DECIMAL(12,1) DEFAULT 0 COMMENT '累计运行小时',
    last_maintain_date DATE COMMENT '上次检修日期',
    next_maintain_date DATE COMMENT '下次计划检修日期',
    maintain_cycle INT COMMENT '检修周期(天)',
    remark TEXT,
    qr_code VARCHAR(256) COMMENT '设备二维码',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_equipment_code (equipment_code),
    INDEX idx_category (category_id),
    INDEX idx_status (status),
    INDEX idx_substation (substation_id)
);

-- 设备技术参数表(动态字段)
CREATE TABLE equipment_parameter (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    equipment_id BIGINT NOT NULL COMMENT '设备ID',
    param_name VARCHAR(64) NOT NULL COMMENT '参数名',
    param_value VARCHAR(256) COMMENT '参数值',
    param_unit VARCHAR(32) COMMENT '单位',
    INDEX idx_equipment (equipment_id)
);

-- 设备文档附件表
CREATE TABLE equipment_document (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    equipment_id BIGINT NOT NULL,
    doc_type VARCHAR(32) COMMENT '说明书/图纸/试验报告/照片',
    file_name VARCHAR(256),
    file_path VARCHAR(512),
    upload_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_equipment (equipment_id)
);

2. 动态参数的实现

不同类型的设备有不同的技术参数。比如变压器有"额定容量""阻抗电压""联结组别",而断路器有"额定电流""开断容量""操作机构类型"。用动态参数表可以解决这个问题:

// 按分类定义参数模板
public class EquipmentParameterTemplate {
    
    private static final Map<String, List<ParamField>> templates = new HashMap<>();
    
    static {
        // 变压器参数模板
        templates.put("TRANSFORMER", Arrays.asList(
            new ParamField("ratedCapacity", "额定容量", "number", "kVA"),
            new ParamField("ratedVoltage", "额定电压", "text", "kV"),
            new ParamField("impedanceVoltage", "阻抗电压", "number", "%"),
            new ParamField("connectionGroup", "联结组别", "text", ""),
            new ParamField("coolingType", "冷却方式", "select", 
                Arrays.asList("ONAN", "ONAF", "OFAF")),
            new ParamField("tapRange", "调压范围", "text", "")
        ));
        
        // 断路器参数模板
        templates.put("BREAKER", Arrays.asList(
            new ParamField("ratedCurrent", "额定电流", "number", "A"),
            new ParamField("breakingCapacity", "开断容量", "number", "MVA"),
            new ParamField("operateMechanism", "操作机构", "text", ""),
            new ParamField("insulationMedium", "绝缘介质", "select",
                Arrays.asList("SF6", "真空", "油")),
            new ParamField("mechanicalLife", "机械寿命", "number", "次")
        ));
    }
    
    public static List<ParamField> getTemplate(String categoryCode) {
        return templates.getOrDefault(categoryCode, Collections.emptyList());
    }
    
    // 参数字段定义
    public static class ParamField {
        private String name;
        private String label;
        private String type;  // text/number/select/date
        private String unit;
        private List<String> options;  // select类型的选项
        
        // constructor, getters...
    }
}

低代码平台的表单设计器支持动态字段。在配置设备台账表单的时候,选择设备分类后自动显示对应的参数字段,不需要为每种设备类型做单独的表单。

3. 设备二维码

每台设备生成一个二维码,贴在设备上。巡检人员扫码就能查看设备信息和填报点检记录:

import qrcode
import os

def generate_equipment_qrcode(equipment_code, equipment_name, save_dir):
    """生成设备二维码"""
    
    # 二维码内容:跳转到设备详情页的URL
    qr_content = f"https://device.example.com/equipment/{equipment_code}"
    
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_M,
        box_size=10,
        border=4,
    )
    qr.add_data(qr_content)
    qr.make(fit=True)
    
    img = qr.make_image(fill_color="black", back_color="white")
    
    # 在二维码下方添加设备编号和名称
    from PIL import Image, ImageDraw, ImageFont
    
    final_img = Image.new('RGB', (img.size[0], img.size[1] + 60), 'white')
    final_img.paste(img, (0, 0))
    
    draw = ImageDraw.Draw(final_img)
    try:
        font = ImageFont.truetype("simhei.ttf", 16)
    except:
        font = ImageFont.load_default()
    
    draw.text((10, img.size[1] + 5), equipment_code, fill='black', font=font)
    draw.text((10, img.size[1] + 30), equipment_name[:20], fill='black', font=font)
    
    file_path = os.path.join(save_dir, f"{equipment_code}.png")
    final_img.save(file_path)
    
    return file_path

# 批量生成
def batch_generate_qrcodes(equipment_list):
    for eq in equipment_list:
        generate_equipment_qrcode(
            eq['equipment_code'],
            eq['equipment_name'],
            '/data/qrcodes/'
        )
    print(f"共生成 {len(equipment_list)} 个二维码")

三、点检计划模块的搭建

1. 点检标准配置

点检标准定义了每类设备需要检查哪些项目、什么标准:

-- 点检标准表
CREATE TABLE inspection_standard (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    category_id BIGINT NOT NULL COMMENT '设备分类',
    standard_name VARCHAR(128) NOT NULL COMMENT '标准名称',
    inspection_type VARCHAR(16) COMMENT '日常点检/定期巡检/专业检查',
    cycle_days INT NOT NULL COMMENT '检查周期(天)',
    enabled TINYINT DEFAULT 1,
    INDEX idx_category (category_id)
);

-- 点检项目表
CREATE TABLE inspection_item (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    standard_id BIGINT NOT NULL COMMENT '所属标准',
    item_name VARCHAR(256) NOT NULL COMMENT '检查项目',
    check_method VARCHAR(128) COMMENT '检查方法',
    standard_value VARCHAR(128) COMMENT '标准值/范围',
    upper_limit DECIMAL(12,2) COMMENT '上限',
    lower_limit DECIMAL(12,2) COMMENT '下限',
    unit VARCHAR(32) COMMENT '单位',
    item_type VARCHAR(16) COMMENT '定性/定量',
    is_required TINYINT DEFAULT 1,
    sort_order INT DEFAULT 0,
    INDEX idx_standard (standard_id)
);

点检项目示例:

设备类型检查项目检查方法标准
变压器油位目视在正常范围内
变压器油温温度计≤85℃
变压器声音听诊无异常响声
变压器硅胶颜色目视蓝色或浅蓝
断路器SF6压力压力表≥0.45MPa
断路器分合闸指示目视位置正确

2. 点检计划的自动生成

public class InspectionPlanGenerator {
    
    /**
     * 生成下一周期的点检计划
     */
    @Scheduled(cron = "0 0 6 * * ?")  // 每天早上6点执行
    public void generateDailyInspectionTasks() {
        // 查询今天需要点检的设备
        List<EquipmentAccount> dueEquipments = equipmentMapper.findInspectionDueToday();
        
        for (EquipmentAccount equipment : dueEquipments) {
            // 根据设备分类获取点检标准
            List<InspectionStandard> standards = standardMapper.findByCategory(
                equipment.getCategoryId()
            );
            
            for (InspectionStandard standard : standards) {
                if (!isStandardEnabled(standard)) continue;
                
                // 检查是否已生成
                boolean exists = taskMapper.existsByDateAndStandard(
                    LocalDate.now(), equipment.getId(), standard.getId()
                );
                if (exists) continue;
                
                // 创建点检任务
                InspectionTask task = new InspectionTask();
                task.setTaskCode(generateTaskCode());
                task.setEquipmentId(equipment.getId());
                task.setEquipmentCode(equipment.getEquipmentCode());
                task.setEquipmentName(equipment.getEquipmentName());
                task.setLocation(equipment.getInstallLocation());
                task.setStandardId(standard.getId());
                task.setInspectionType(standard.getInspectionType());
                task.setPlanDate(LocalDate.now());
                task.setDueTime(LocalTime.of(18, 0));  // 18点前完成
                task.setStatus("PENDING");
                
                // 指定点检人
                task.setAssignee(getAssignee(equipment));
                
                // 生成点检项目列表
                List<InspectionItem> items = itemMapper.findByStandard(standard.getId());
                task.setItemCount(items.size());
                
                taskMapper.insert(task);
            }
        }
        
        log.info("生成点检任务完成: {} 台设备", dueEquipments.size());
    }
    
    /**
     * 获取指定设备的点检人
     */
    private String getAssignee(EquipmentAccount equipment) {
        // 根据变电站和设备类型分配点检人
        // 可以配置映射关系
        return assigneeMapping.getOrDefault(
            equipment.getSubstationId(),
            defaultInspector
        );
    }
}

3. 移动端点检填报

点检人员在现场用手机扫描设备二维码后,弹出点检表单:

// 低代码平台的移动端点检表单配置
{
  "formCode": "inspection_record",
  "title": "设备点检记录",
  "scanField": "equipment_code",
  "fields": [
    {
      "name": "equipment_code",
      "label": "设备编号",
      "type": "scan",
      "readonly": true
    },
    {
      "name": "equipment_name",
      "label": "设备名称",
      "type": "text",
      "readonly": true
    },
    {
      "name": "inspector",
      "label": "点检人",
      "type": "current_user",
      "readonly": true
    },
    {
      "name": "inspection_time",
      "label": "点检时间",
      "type": "datetime",
      "default": "now",
      "readonly": true
    },
    {
      "name": "items",
      "label": "检查项目",
      "type": "subform",
      "dataSource": "/api/inspection/items?standardId=${standard_id}",
      "columns": [
        {"name": "item_name", "label": "项目", "type": "text", "readonly": true},
        {"name": "result", "label": "检查结果", "type": "radio", 
         "options": ["正常", "异常"]},
        {"name": "measured_value", "label": "测量值", "type": "number",
         "showWhen": "result === '异常'"},
        {"name": "abnormal_desc", "label": "异常描述", "type": "textarea",
         "showWhen": "result === '异常'", "required": true},
        {"name": "photo", "label": "现场照片", "type": "image", "multiple": true}
      ]
    },
    {
      "name": "overall_status",
      "label": "总体状态",
      "type": "compute",
      "formula": "items.filter(i => i.result === '异常').length > 0 ? '异常' : '正常'"
    },
    {
      "name": "signature",
      "label": "签名确认",
      "type": "signature",
      "required": true
    }
  ],
  "events": {
    "onSubmit": {
      "api": "/api/inspection/submit",
      "success": {"message": "点检完成", "redirect": "/inspection/list"},
      "onAbnormal": {
        "api": "/api/workorder/create-from-inspection",
        "message": "检测到异常项,已自动创建缺陷工单"
      }
    }
  }
}

搭贝AI低代码平台在低代码行业应用中支持上述移动端表单配置。点检人员在现场扫码后直接看到该设备的点检项目,逐项检查填报,发现异常可以拍照上传,系统自动生成缺陷工单。

四、工单管理模块

1. 缺陷工单的处理流程

点检发现的异常自动转化为缺陷工单:

点检异常 → 创建缺陷工单 → 工单派发 → 检修处理 → 验收闭环 → 更新设备状态
public class WorkOrderService {
    
    /**
     * 从点检记录创建缺陷工单
     */
    public WorkOrder createFromInspection(InspectionTask task, InspectionItem abnormalItem) {
        WorkOrder wo = new WorkOrder();
        wo.setOrderCode(generateOrderCode("WX"));  // 维修工单
        wo.setOrderType("DEFECT");
        wo.setEquipmentId(task.getEquipmentId());
        wo.setSource("INSPECTION");
        wo.setSourceId(task.getId());
        wo.setPriority(determinePriority(abnormalItem));
        wo.setDescription(abnormalItem.getItemName() + ": " + abnormalItem.getAbnormalDesc());
        wo.setStatus("OPEN");
        wo.setCreateTime(new Date());
        
        // 自动分配处理人
        wo.setAssignee(getAvailableMaintainer(task.getEquipmentId()));
        
        // 设置期望完成时间
        int slaHours = getSLA(wo.getPriority());
        wo.setDueTime(LocalDateTime.now().plusHours(slaHours));
        
        workOrderMapper.insert(wo);
        
        // 发送通知
        notificationService.send(wo.getAssignee(), 
            "新工单: " + wo.getOrderCode() + " - " + wo.getDescription());
        
        return wo;
    }
    
    private String determinePriority(InspectionItem item) {
        // 根据异常类型判断优先级
        if (item.getItemName().contains("SF6") || 
            item.getItemName().contains("压力")) {
            return "URGENT";
        }
        if (item.getItemName().contains("温度") || 
            item.getItemName().contains("声音")) {
            return "HIGH";
        }
        return "NORMAL";
    }
    
    private int getSLA(String priority) {
        switch (priority) {
            case "URGENT": return 4;   // 紧急工单4小时
            case "HIGH": return 24;     // 高优工单24小时
            default: return 72;         // 普通工单72小时
        }
    }
}

2. 工单状态流转统计

-- 工单统计分析
SELECT 
    DATE(create_time) AS date,
    COUNT(*) AS total_orders,
    SUM(CASE WHEN status = 'CLOSED' THEN 1 ELSE 0 END) AS closed_count,
    SUM(CASE WHEN status = 'OPEN' THEN 1 ELSE 0 END) AS open_count,
    SUM(CASE WHEN status = 'IN_PROGRESS' THEN 1 ELSE 0 END) AS in_progress_count,
    ROUND(AVG(TIMESTAMPDIFF(HOUR, create_time, close_time)), 1) AS avg_handle_hours,
    SUM(CASE WHEN close_time <= due_time THEN 1 ELSE 0 END) AS on_time_count
FROM work_order
WHERE create_time >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
GROUP BY DATE(create_time)
ORDER BY date DESC;

五、设备数据分析

1. 设备健康度评估

class EquipmentHealthAnalyzer:
    
    def calculate_health_score(self, equipment_id):
        """计算设备健康度评分(0-100)"""
        score = 100
        
        # 1. 点检记录扣分
        recent_inspections = self.get_inspections(equipment_id, days=90)
        abnormal_count = sum(1 for i in recent_inspections 
                            if i['overall_status'] == '异常')
        score -= abnormal_count * 5  # 每次异常扣5分
        
        # 2. 工单记录扣分
        recent_orders = self.get_work_orders(equipment_id, days=180)
        urgent_count = sum(1 for o in recent_orders if o['priority'] == 'URGENT')
        score -= urgent_count * 10  # 紧急工单扣10分
        
        # 3. 超期未检修扣分
        equipment = self.get_equipment(equipment_id)
        if equipment['next_maintain_date']:
            days_overdue = (date.today() - equipment['next_maintain_date']).days
            if days_overdue > 0:
                score -= min(days_overdue, 30)  # 每超1天扣1分,最多30分
        
        # 4. 运行年限扣分
        if equipment['commission_date']:
            years = (date.today() - equipment['commission_date']).days / 365
            if years > 15:
                score -= 15
            elif years > 10:
                score -= 10
            elif years > 5:
                score -= 5
        
        # 限值
        score = max(0, min(100, score))
        
        # 等级
        if score >= 85:
            level = '良好'
        elif score >= 70:
            level = '正常'
        elif score >= 60:
            level = '关注'
        else:
            level = '需检修'
        
        return {
            'equipment_id': equipment_id,
            'health_score': score,
            'health_level': level,
            'abnormal_count_90d': abnormal_count,
            'urgent_orders_180d': urgent_count
        }

低代码平台提供了丰富的图表组件,可以把设备健康度评分用仪表盘展示,让管理者一眼看到哪些设备需要重点关注。

常见问题

Q:低代码搭的设备管理系统和专业EAM系统相比有什么差距?

最大的差距在资产财务管理和备件库存管理方面。专业EAM系统通常和ERP的财务模块深度集成,能做资产折旧、报废处置等财务操作。备件管理也更完善,支持多仓库、安全库存自动补货。如果企业的设备资产量大、财务核算要求严格,建议低代码系统做运行管理,财务相关走专业EAM或ERP。

Q:电力企业设备编号怎么设计?

建议遵循KKS编码规则,这是电力行业通用的设备标识系统。KKS编码由几部分组成:机组号+系统码+设备码+组件码,比如"1BBA10CT001"表示1号机组电气系统的某个电流互感器。搭贝AI低代码平台支持自定义编码规则,在设备录入时可以配置自动生成编号。

Q:点检发现的异常怎么自动流转到检修工单?

通过事件触发机制实现。点检表单提交时,系统检查所有检查项目的状态,发现有"异常"项后自动调用工单创建接口。工单的优先级根据异常项目的类型自动判定,比如SF6泄漏类异常设为紧急,外观缺陷类设为普通。这样可以确保异常项在第一时间被响应和处理。

Q:设备点检的完成率怎么保证?

一方面在制度上设定考核要求,另一方面系统层面做好提醒。低代码平台支持定时提醒功能,点检计划生成后自动发送消息通知到点检人。如果到截止时间前2小时还没提交,系统再次提醒。超期未检的设备会在管理看板上标红显示。