ZENERGY 众壹能源
运维知识2026-06-17

N 型双面组件增发 10% 的底层逻辑:智能跟踪支架与避阴算法

光伏施工现场管理是 EPC 公司核心。**多项目 + 多施工队 + 多设备 → 容易乱**。这篇用 Next.js + Drizzle 搭一套。

#N 型双面#跟踪支架#发电增益

光伏施工现场管理是 EPC 公司核心。多项目 + 多施工队 + 多设备 → 容易乱。这篇用 Next.js + Drizzle 搭一套。

一、核心模块

graph TB
    A["施工管理"] --> B["项目"]
    A --> C["进度"]
    A --> D["质量"]
    A --> E["设备"]
    A --> F["人员"]
    A --> G["照片 + 验收"]

二、Drizzle Schema

import { pgTable, uuid, varchar, integer, timestamp, jsonb } from "drizzle-orm/pg-core";

export const projects = pgTable("projects", {
  id: uuid("id").primaryKey().defaultRandom(),
  code: varchar("code", { length: 64 }).unique(),
  name: varchar("name", { length: 256 }),
  capacity_kw: integer("capacity_kw"),
  status: varchar("status", { length: 32 }),  // planning / construction / completed
  start_date: timestamp("start_date"),
  target_complete: timestamp("target_complete"),
  client_id: uuid("client_id"),
});

export const milestones = pgTable("milestones", {
  id: uuid("id").primaryKey().defaultRandom(),
  project_id: uuid("project_id").references(() => projects.id),
  name: varchar("name", { length: 128 }),
  order_num: integer("order_num"),
  planned_date: timestamp("planned_date"),
  actual_date: timestamp("actual_date"),
  status: varchar("status", { length: 32 }),  // pending / in_progress / completed
});

export const inspections = pgTable("inspections", {
  id: uuid("id").primaryKey().defaultRandom(),
  project_id: uuid("project_id"),
  milestone_id: uuid("milestone_id"),
  inspection_type: varchar("inspection_type", { length: 64 }),  // 隐蔽 / 自检 / 监理 / 业主
  result: varchar("result", { length: 32 }),  // pass / fail / pending
  inspector: varchar("inspector"),
  photos: jsonb("photos"),
  notes: text("notes"),
  inspected_at: timestamp("inspected_at"),
});

配图

三、API(tRPC)

import { router, protectedProcedure } from "../trpc";
import { z } from "zod";
import { projects, milestones } from "@/db/schema";
import { eq } from "drizzle-orm";

export const projectRouter = router({
  list: protectedProcedure
    .input(z.object({ status: z.string().optional() }))
    .query(async ({ input }) => {
      return await db.query.projects.findMany({
        where: input.status ? eq(projects.status, input.status) : undefined,
      });
    }),

  detail: protectedProcedure
    .input(z.string().uuid())
    .query(async ({ input }) => {
      return await db.query.projects.findFirst({
        where: eq(projects.id, input),
        with: { milestones: true, inspections: true }
      });
    }),

  updateMilestone: protectedProcedure
    .input(z.object({
      milestoneId: z.string().uuid(),
      status: z.enum(["pending", "in_progress", "completed"]),
      actualDate: z.date().optional(),
    }))
    .mutation(async ({ input }) => {
      await db.update(milestones)
        .set({ status: input.status, actual_date: input.actualDate })
        .where(eq(milestones.id, input.milestoneId));
    }),
});

四、进度仪表盘

export default async function ProjectDetailPage({ params }) {
  const project = await api.projects.detail.fetch(params.id);
  const completedMs = project.milestones.filter(m => m.status === "completed").length;
  const progress = (completedMs / project.milestones.length) * 100;

  return (
    <div>
      <h1>{project.name}</h1>
      <ProgressBar value={progress} max={100} />
      <Timeline>
        {project.milestones.map(m => (
          <TimelineItem
            key={m.id}
            title={m.name}
            date={m.actual_date ?? m.planned_date}
            status={m.status}
          />
        ))}
      </Timeline>
    </div>
  );
}

五、施工照片上传(自动地理标记)

"use client";
import { useState } from "react";

export function PhotoUploader({ inspectionId }) {
  async function handleUpload(file: File) {
    // 提取 EXIF 地理信息
    const exif = await parseExif(file);
    const formData = new FormData();
    formData.append("file", file);
    formData.append("inspection_id", inspectionId);
    formData.append("location", JSON.stringify(exif.location));
    formData.append("timestamp", exif.timestamp.toString());
    await fetch("/api/upload-photo", { method: "POST", body: formData });
  }
  return <input type="file" accept="image/*" onChange={(e) => handleUpload(e.target.files![0])} />;
}

六、质量验收 5 个关键节点

□ 隐蔽工程验收(电缆 / 桥架 / 接地)
□ 组件安装验收
□ 逆变器调试验收
□ 联调试运行
□ 业主最终验收

每个节点要拍照 + 签字 + 时间戳 + 地理位置。

配图

七、移动端工人 APP

// React Native 或 Flutter
function FieldWorkerApp() {
  return (
    <View>
      <Text>今日任务</Text>
      <TaskList tasks={todaysTasks} onComplete={completeTask} />
      <Button title="拍照 + 上报" onPress={uploadPhoto} />
    </View>
  );
}

八、ZenovaOS 视角

ZenovaOS 给 EPC 提供项目管理 + 资产运营一体化平台,验收完即转运营。

总结

光伏施工管理 SaaS 用 Next.js + Drizzle + tRPC 全栈。进度 + 质量 + 照片 + 移动端全套就绪。

FAQ

这套方案需要替换现有系统吗?+

不需要。ZenovaOS 支持渐进式接入 — ZEL 采集器可以并联到现有逆变器,数据双发到原系统和 ZenovaOS,验证后再决定迁移节奏。

N 型双面组件增发 10% 的底层逻辑:智能跟踪支架与避阴算... 适用于什么规模的电站?+

1MW 以上的工商业 / 分布式 / 集中式都适用。从单站到 50+ 站点的集团资产都有落地案例。具体方案根据 N 型双面 实际情况调整。

怎么衡量 ROI?+

建议 3 个量化指标:1) 告警闭环时间通常 -40-60%;2) 真实损失发现率从 30% 提升到 80%+;3) 运营人时 -50%+。

Next step

If you are operating distributed PV / C&I solar / multi-site assets, we can prepare a tailored ZenovaOS demo based on your scenario.

Related