feat(csms, web): add charge point status and error code to charge point details, hide the connector 0 from connectors view

This commit is contained in:
2026-03-11 11:00:16 +08:00
parent 48d9580d36
commit f74939917b
4 changed files with 98 additions and 15 deletions

View File

@@ -17,15 +17,25 @@ app.get("/", async (c) => {
.where(isAdmin ? undefined : eq(chargePoint.registrationStatus, "Accepted"))
.orderBy(desc(chargePoint.createdAt));
// Attach connectors (connectorId > 0 only, excludes the main-controller row)
const connectors = cps.length
? await db
.select()
.from(connector)
.where(
sql`${connector.chargePointId} = any(${sql.raw(`array[${cps.map((cp) => `'${cp.id}'`).join(",")}]`)}) and ${connector.connectorId} > 0`,
)
: [];
if (!cps.length) return c.json([]);
const cpIdList = sql.raw(`array[${cps.map((cp) => `'${cp.id}'`).join(",")}]`);
// connectorId > 0: real connectors to display
const connectors = await db
.select()
.from(connector)
.where(sql`${connector.chargePointId} = any(${cpIdList}) and ${connector.connectorId} > 0`);
// connectorId = 0: whole-station status row
const cpStatusRows = await db
.select({
chargePointId: connector.chargePointId,
status: connector.status,
errorCode: connector.errorCode,
})
.from(connector)
.where(sql`${connector.chargePointId} = any(${cpIdList}) and ${connector.connectorId} = 0`);
const connectorsByCP: Record<string, typeof connectors> = {};
for (const conn of connectors) {
@@ -33,10 +43,17 @@ app.get("/", async (c) => {
connectorsByCP[conn.chargePointId].push(conn);
}
const cpStatusByCP: Record<string, { status: string; errorCode: string }> = {};
for (const row of cpStatusRows) {
cpStatusByCP[row.chargePointId] = { status: row.status, errorCode: row.errorCode };
}
return c.json(
cps.map((cp) => ({
...cp,
connectors: connectorsByCP[cp.id] ?? [],
chargePointStatus: cpStatusByCP[cp.id]?.status ?? null,
chargePointErrorCode: cpStatusByCP[cp.id]?.errorCode ?? null,
})),
);
});
@@ -88,9 +105,16 @@ app.get("/:id", async (c) => {
if (!cp) return c.json({ error: "Not found" }, 404);
const connectors = await db.select().from(connector).where(eq(connector.chargePointId, id));
const allConnectors = await db.select().from(connector).where(eq(connector.chargePointId, id));
const cpStatus = allConnectors.find((conn) => conn.connectorId === 0);
const displayConnectors = allConnectors.filter((conn) => conn.connectorId > 0);
return c.json({ ...cp, connectors });
return c.json({
...cp,
connectors: displayConnectors,
chargePointStatus: cpStatus?.status ?? null,
chargePointErrorCode: cpStatus?.errorCode ?? null,
});
});
/** PATCH /api/charge-points/:id — update charge point fields */
@@ -136,8 +160,16 @@ app.patch("/:id", async (c) => {
if (!updated) return c.json({ error: "Not found" }, 404);
const connectors = await db.select().from(connector).where(eq(connector.chargePointId, id));
return c.json({ ...updated, connectors });
const allConnectors = await db.select().from(connector).where(eq(connector.chargePointId, id));
const cpStatus = allConnectors.find((conn) => conn.connectorId === 0);
const displayConnectors = allConnectors.filter((conn) => conn.connectorId > 0);
return c.json({
...updated,
connectors: displayConnectors,
chargePointStatus: cpStatus?.status ?? null,
chargePointErrorCode: cpStatus?.errorCode ?? null,
});
});
/** DELETE /api/charge-points/:id — delete a charge point (cascades to connectors, transactions, meter values) */