[feat]:[FL-87][ATP模型管理-表单优化]

优化ATP模型新建表单:
1. 去掉状态字段,不再使用状态控制
2. 避雷器装设组合改为必填字段
3. 去掉编码表单,编码值自动生成唯一键(格式:atp-时间戳-随机字符串)
4. 去掉名称表单,名称通过电压等级、塔型、场景、避雷器装设组合自动拼接

简化表单录入流程,减少手动输入错误。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
chengkai3
2026-06-12 22:32:53 +08:00
parent 4d74752746
commit 6f2bb303fe
+19 -63
View File
@@ -34,10 +34,7 @@ import type { AtpAssetListResponse, AtpAssetSummary } from "@/types/auth";
const AntCard = Card as unknown as ComponentType<CardProps>;
type AssetFormValues = {
code: string;
name: string;
description: string;
status: "draft" | "enabled" | "disabled" | "archived";
voltage_level: string;
tower_type: string;
scene_type: string;
@@ -45,10 +42,7 @@ type AssetFormValues = {
};
const EMPTY_FORM: AssetFormValues = {
code: "",
name: "",
description: "",
status: "enabled",
voltage_level: "",
tower_type: "",
scene_type: "",
@@ -68,10 +62,7 @@ function formatDateTime(value: string | null | undefined): string {
function toFormValues(item: AtpAssetSummary): AssetFormValues {
return {
code: item.code,
name: item.name,
description: item.description,
status: item.status,
voltage_level: item.voltage_level ?? "",
tower_type: item.tower_type ?? "",
scene_type: item.scene_type ?? "",
@@ -79,12 +70,25 @@ function toFormValues(item: AtpAssetSummary): AssetFormValues {
};
}
function generateName(values: AssetFormValues): string {
const parts = [
values.voltage_level,
values.tower_type,
values.scene_type,
values.arrester_config,
].filter(Boolean);
return parts.join("-");
}
function generateCode(): string {
return `atp-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
}
function buildPayload(values: AssetFormValues) {
return {
code: values.code.trim(),
name: values.name.trim(),
code: generateCode(),
name: generateName(values),
description: values.description.trim(),
status: values.status,
voltage_level: values.voltage_level.trim() || null,
tower_type: values.tower_type.trim() || null,
scene_type: values.scene_type.trim() || null,
@@ -171,7 +175,6 @@ export default function AtpModelsPage() {
const [keywordInput, setKeywordInput] = useState("");
const [keyword, setKeyword] = useState("");
const [statusFilter, setStatusFilter] = useState<string | undefined>(undefined);
const [editingAsset, setEditingAsset] = useState<AtpAssetSummary | null>(null);
const [modalOpen, setModalOpen] = useState(false);
const [tableScrollY, setTableScrollY] = useState(ATP_TABLE_MIN_SCROLL_Y);
@@ -181,16 +184,13 @@ export default function AtpModelsPage() {
const canManage = hasPermission("atp.manage");
const assetsQuery = useQuery({
queryKey: ["atp-assets", keyword, statusFilter],
queryKey: ["atp-assets", keyword],
enabled: Boolean(user && canRead),
queryFn: async () => {
const searchParams = new URLSearchParams();
if (keyword.trim()) {
searchParams.set("keyword", keyword.trim());
}
if (statusFilter) {
searchParams.set("status", statusFilter);
}
const suffix = searchParams.toString();
const response = await fetchWithAuth(`/api/v1/atp/assets${suffix ? `?${suffix}` : ""}`);
if (!response.ok) {
@@ -343,6 +343,7 @@ export default function AtpModelsPage() {
<Tag>{item.voltage_level || "未设置电压等级"}</Tag>
<Tag>{item.tower_type || "未设置塔型"}</Tag>
<Tag>{item.scene_type || "未设置场景"}</Tag>
<Tag>{item.arrester_config || "未设置避雷器"}</Tag>
</Space>
),
},
@@ -358,14 +359,6 @@ export default function AtpModelsPage() {
</Space>
),
},
{
title: "状态",
dataIndex: "status",
render: (value: string) => {
const display = getAtpAssetStatusDisplay(value);
return <Tag color={display.color}>{display.label}</Tag>;
},
},
{
title: "更新时间",
dataIndex: "update_date",
@@ -467,21 +460,6 @@ export default function AtpModelsPage() {
/>
</Form.Item>
<Form.Item label="状态" className="min-w-[170px]">
<Select
allowClear
value={statusFilter}
placeholder="状态筛选"
onChange={(value) => setStatusFilter(value)}
options={[
{ value: "draft", label: "草稿" },
{ value: "enabled", label: "启用" },
{ value: "disabled", label: "停用" },
{ value: "archived", label: "归档" },
]}
/>
</Form.Item>
<Form.Item>
<Button type="primary" onClick={handleSearch}>
@@ -534,28 +512,6 @@ export default function AtpModelsPage() {
onFinish={(values) => void saveMutation.mutateAsync(values)}
>
<Row gutter={16}>
<Col xs={24} md={12}>
<Form.Item name="code" label="编码" rules={[{ required: true, message: "请输入模型编码" }]}>
<Input disabled={Boolean(editingAsset)} />
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item name="name" label="名称" rules={[{ required: true, message: "请输入模型名称" }]}>
<Input />
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item name="status" label="状态" rules={[{ required: true, message: "请选择状态" }]}>
<Select
options={[
{ value: "draft", label: "草稿" },
{ value: "enabled", label: "启用" },
{ value: "disabled", label: "停用" },
{ value: "archived", label: "归档" },
]}
/>
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item name="voltage_level" label="电压等级" rules={[{ required: true, message: "请选择或新建电压等级" }]}>
<CreatableSingleSelect options={voltageLevelOptions} placeholder="请选择或新建电压等级" />
@@ -572,7 +528,7 @@ export default function AtpModelsPage() {
</Form.Item>
</Col>
<Col xs={24} md={12}>
<Form.Item name="arrester_config" label="避雷器装设组合">
<Form.Item name="arrester_config" label="避雷器装设组合" rules={[{ required: true, message: "请选择或新建避雷器装设组合" }]}>
<CreatableSingleSelect options={arresterConfigOptions} placeholder="请选择或新建避雷器装设组合" />
</Form.Item>
</Col>