feat(csms): 充电桩添加 deviceName 字段,区别于 identifier 用于区分设备

This commit is contained in:
2026-03-16 13:43:46 +08:00
parent 0118dd2e15
commit 654a2a66d9
14 changed files with 2095 additions and 40 deletions

View File

@@ -97,6 +97,7 @@ const registrationColorMap: Record<string, "success" | "warning" | "danger"> = {
type FormData = {
chargePointIdentifier: string;
deviceName: string;
chargePointVendor: string;
chargePointModel: string;
registrationStatus: "Accepted" | "Pending" | "Rejected";
@@ -106,6 +107,7 @@ type FormData = {
const EMPTY_FORM: FormData = {
chargePointIdentifier: "",
deviceName: "",
chargePointVendor: "",
chargePointModel: "",
registrationStatus: "Pending",
@@ -141,6 +143,7 @@ export default function ChargePointsPage() {
setFormTarget(cp);
setFormData({
chargePointIdentifier: cp.chargePointIdentifier,
deviceName: cp.deviceName ?? "",
chargePointVendor: cp.chargePointVendor ?? "",
chargePointModel: cp.chargePointModel ?? "",
registrationStatus: cp.registrationStatus as FormData["registrationStatus"],
@@ -163,6 +166,7 @@ export default function ChargePointsPage() {
registrationStatus: formData.registrationStatus,
pricingMode: formData.pricingMode,
feePerKwh: formData.pricingMode === "fixed" ? fee : 0,
deviceName: formData.deviceName.trim() || null,
});
} else {
// Create
@@ -173,6 +177,7 @@ export default function ChargePointsPage() {
registrationStatus: formData.registrationStatus,
pricingMode: formData.pricingMode,
feePerKwh: formData.pricingMode === "fixed" ? fee : 0,
deviceName: formData.deviceName.trim() || undefined,
});
}
await refetchList();
@@ -258,8 +263,18 @@ export default function ChargePointsPage() {
}
/>
</TextField>
<TextField fullWidth>
<Label className="text-sm font-medium"></Label>
<Input
placeholder="1号楼A区01号桩"
value={formData.deviceName}
onChange={(e) =>
setFormData((f) => ({ ...f, deviceName: e.target.value }))
}
/>
</TextField>
<div className="grid grid-cols-2 gap-3">
<TextField fullWidth>
<TextField fullWidth isReadOnly={isEdit}>
<Label className="text-sm font-medium"></Label>
<Input
placeholder="ABB"
@@ -269,7 +284,7 @@ export default function ChargePointsPage() {
}
/>
</TextField>
<TextField fullWidth>
<TextField fullWidth isReadOnly={isEdit}>
<Label className="text-sm font-medium"></Label>
<Input
placeholder="Terra AC"
@@ -381,7 +396,9 @@ export default function ChargePointsPage() {
<Modal.Dialog className="sm:max-w-lg">
<Modal.CloseTrigger />
<Modal.Header>
<Modal.Heading>{qrTarget?.chargePointIdentifier} </Modal.Heading>
<Modal.Heading>
{qrTarget?.deviceName ?? qrTarget?.chargePointIdentifier}
</Modal.Heading>
</Modal.Header>
<Modal.Body className="space-y-4">
<p className="text-sm text-muted">
@@ -431,7 +448,7 @@ export default function ChargePointsPage() {
<Table.ScrollContainer>
<Table.Content aria-label="充电桩列表" className="min-w-200">
<Table.Header>
<Table.Column isRowHeader></Table.Column>
<Table.Column isRowHeader></Table.Column>
{isAdmin && <Table.Column> / </Table.Column>}
{isAdmin && <Table.Column></Table.Column>}
<Table.Column></Table.Column>
@@ -469,12 +486,19 @@ export default function ChargePointsPage() {
: "bg-gray-300"
}`}
/>
<Link
href={`/dashboard/charge-points/${cp.id}`}
className="font-medium text-accent"
>
{cp.chargePointIdentifier}
</Link>
<div className="flex flex-col">
<Link
href={`/dashboard/charge-points/${cp.id}`}
className="font-medium text-accent"
>
{cp.deviceName ?? cp.chargePointIdentifier}
</Link>
{isAdmin && cp.deviceName && (
<span className="font-mono text-xs text-muted">
{cp.chargePointIdentifier}
</span>
)}
</div>
</div>
</Tooltip.Trigger>
<Tooltip.Content placement="start">
@@ -594,9 +618,14 @@ export default function ChargePointsPage() {
<Modal.Body>
<p className="text-sm text-muted">
{" "}
<span className="font-mono font-medium text-foreground">
{cp.chargePointIdentifier}
<span className="font-medium text-foreground">
{cp.deviceName ?? cp.chargePointIdentifier}
</span>
{cp.deviceName && (
<span className="font-mono ml-1 text-xs text-muted">
({cp.chargePointIdentifier})
</span>
)}
</p>
</Modal.Body>