feat(master/manager/device): Enhance device management with new detail view, API updates, and improved request handling
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
import { API_LOGS } from '@/constants/api';
|
||||
import { API_READER } from '@/constants/api';
|
||||
import { request } from '@umijs/max';
|
||||
|
||||
export async function apiQueryLogs(
|
||||
params: MasterModel.SearchLogPaginationBody,
|
||||
type: MasterModel.LogTypeRequest,
|
||||
) {
|
||||
return request<MasterModel.LogResponse>(`${API_LOGS}/${type}/messages`, {
|
||||
return request<MasterModel.LogResponse>(`${API_READER}/${type}/messages`, {
|
||||
params: params,
|
||||
});
|
||||
}
|
||||
|
||||
148
src/services/master/MessageController.ts
Normal file
148
src/services/master/MessageController.ts
Normal file
@@ -0,0 +1,148 @@
|
||||
import { API_READER } from '@/constants/api';
|
||||
import { request } from '@umijs/max';
|
||||
|
||||
// Transform functions
|
||||
function transformEntityConfigChildDetail(
|
||||
raw: MasterModel.PurpleC,
|
||||
): MasterModel.EntityConfigChildDetail {
|
||||
return {
|
||||
entityId: raw.eid || '',
|
||||
value: raw.v,
|
||||
operation: raw.op,
|
||||
duration: raw.for,
|
||||
};
|
||||
}
|
||||
|
||||
function transformEntityConfigChild(
|
||||
raw: MasterModel.CElement,
|
||||
): MasterModel.EntityConfigChild {
|
||||
return {
|
||||
type: raw.t || '',
|
||||
children: raw.c ? [transformEntityConfigChildDetail(raw.c)] : undefined,
|
||||
};
|
||||
}
|
||||
|
||||
function transformEntityConfig(raw: MasterModel.EC): MasterModel.EntityConfig {
|
||||
return {
|
||||
level: raw.l as 0 | 1 | 2 | undefined,
|
||||
normalCondition: raw.nc,
|
||||
subType: raw.st,
|
||||
children: raw.c?.map(transformEntityConfigChild),
|
||||
};
|
||||
}
|
||||
|
||||
function transformEntity(raw: MasterModel.E): MasterModel.Entity {
|
||||
return {
|
||||
entityId: raw.eid || '',
|
||||
type: raw.t || '',
|
||||
name: raw.n || '',
|
||||
active: raw.a,
|
||||
value: raw.v,
|
||||
config: raw.c ? [transformEntityConfig(raw.c)] : undefined,
|
||||
};
|
||||
}
|
||||
|
||||
export function transformNodeConfig(
|
||||
raw: MasterModel.RawNodeConfig,
|
||||
): MasterModel.NodeConfig {
|
||||
return {
|
||||
nodeId: raw.nid || '',
|
||||
type: raw.t || '',
|
||||
name: raw.n || '',
|
||||
entities: raw.e?.map(transformEntity) || [],
|
||||
};
|
||||
}
|
||||
|
||||
// Reverse transform functions
|
||||
function reverseTransformEntityConfigChildDetail(
|
||||
detail: MasterModel.EntityConfigChildDetail,
|
||||
): MasterModel.PurpleC {
|
||||
return {
|
||||
eid: detail.entityId,
|
||||
v: detail.value,
|
||||
op: detail.operation,
|
||||
for: detail.duration,
|
||||
};
|
||||
}
|
||||
|
||||
function reverseTransformEntityConfigChild(
|
||||
child: MasterModel.EntityConfigChild,
|
||||
): MasterModel.CElement {
|
||||
return {
|
||||
t: child.type,
|
||||
c: child.children?.[0]
|
||||
? reverseTransformEntityConfigChildDetail(child.children[0])
|
||||
: undefined,
|
||||
};
|
||||
}
|
||||
|
||||
function reverseTransformEntityConfig(
|
||||
raw: MasterModel.EntityConfig,
|
||||
): MasterModel.EC {
|
||||
return {
|
||||
l: raw.level,
|
||||
nc: raw.normalCondition,
|
||||
st: raw.subType,
|
||||
c: raw.children?.map(reverseTransformEntityConfigChild),
|
||||
};
|
||||
}
|
||||
|
||||
function reverseTransformEntity(entity: MasterModel.Entity): MasterModel.E {
|
||||
return {
|
||||
eid: entity.entityId,
|
||||
t: entity.type,
|
||||
n: entity.name,
|
||||
a: entity.active,
|
||||
v: entity.value,
|
||||
c: entity.config?.[0]
|
||||
? reverseTransformEntityConfig(entity.config[0])
|
||||
: undefined,
|
||||
};
|
||||
}
|
||||
|
||||
export function transformRawNodeConfig(
|
||||
node: MasterModel.NodeConfig,
|
||||
): MasterModel.RawNodeConfig {
|
||||
return {
|
||||
nid: node.nodeId,
|
||||
t: node.type,
|
||||
n: node.name,
|
||||
e: node.entities.map(reverseTransformEntity),
|
||||
};
|
||||
}
|
||||
|
||||
export async function apiQueryMessage(
|
||||
dataChanelId: string,
|
||||
authorization: string,
|
||||
params: MasterModel.SearchMessagePaginationBody,
|
||||
) {
|
||||
const resp = await request<MasterModel.MesageReaderResponse>(
|
||||
`${API_READER}/${dataChanelId}/messages`,
|
||||
{
|
||||
method: 'GET',
|
||||
headers: {
|
||||
Authorization: authorization,
|
||||
},
|
||||
params: params,
|
||||
},
|
||||
);
|
||||
|
||||
// Process messages to add string_value_parsed
|
||||
if (resp.messages) {
|
||||
resp.messages = resp.messages.map((message) => {
|
||||
if (message.string_value) {
|
||||
try {
|
||||
const rawNodeConfigs: MasterModel.RawNodeConfig[] = JSON.parse(
|
||||
message.string_value,
|
||||
);
|
||||
message.string_value_parsed = rawNodeConfigs.map(transformNodeConfig);
|
||||
} catch (error) {
|
||||
console.error('Failed to parse string_value:', error);
|
||||
}
|
||||
}
|
||||
return message;
|
||||
});
|
||||
}
|
||||
|
||||
return resp;
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
import {
|
||||
API_SHARE_THING,
|
||||
API_THING,
|
||||
API_THING_POLICY,
|
||||
API_THINGS_SEARCH,
|
||||
} from '@/constants/api';
|
||||
@@ -55,7 +55,7 @@ export async function apiSearchThings(
|
||||
|
||||
export async function apiUpdateThing(value: MasterModel.Thing) {
|
||||
if (!value.id) throw new Error('Thing id is required');
|
||||
return request<MasterModel.Thing>(`${API_SHARE_THING}/${value.id}`, {
|
||||
return request<MasterModel.Thing>(`${API_THING}/${value.id}`, {
|
||||
method: 'PUT',
|
||||
data: value,
|
||||
});
|
||||
@@ -77,7 +77,7 @@ export async function apiDeleteUserThingPolicy(
|
||||
thing_id: string,
|
||||
user_id: string,
|
||||
) {
|
||||
return request(`${API_SHARE_THING}/${thing_id}/share`, {
|
||||
return request(`${API_THING}/${thing_id}/share`, {
|
||||
method: 'DELETE',
|
||||
data: {
|
||||
policies: ['read', 'write', 'delete'],
|
||||
@@ -91,7 +91,7 @@ export async function apiShareThingToUser(
|
||||
user_id: string,
|
||||
policies: string[],
|
||||
) {
|
||||
return request(`${API_SHARE_THING}/${thing_id}/share`, {
|
||||
return request(`${API_THING}/${thing_id}/share`, {
|
||||
method: 'POST',
|
||||
data: {
|
||||
policies: policies,
|
||||
@@ -100,3 +100,7 @@ export async function apiShareThingToUser(
|
||||
getResponse: true,
|
||||
});
|
||||
}
|
||||
|
||||
export async function apiGetThingDetail(thing_id: string) {
|
||||
return request<MasterModel.Thing>(`${API_THING}/${thing_id}`);
|
||||
}
|
||||
|
||||
3
src/services/master/typings/log.d.ts
vendored
3
src/services/master/typings/log.d.ts
vendored
@@ -8,7 +8,7 @@ declare namespace MasterModel {
|
||||
|
||||
type LogTypeRequest = 'user_logs' | undefined;
|
||||
|
||||
interface LogResponse {
|
||||
interface MesageReaderResponse {
|
||||
offset?: number;
|
||||
limit?: number;
|
||||
publisher?: string;
|
||||
@@ -27,5 +27,6 @@ declare namespace MasterModel {
|
||||
name?: string;
|
||||
time?: number;
|
||||
string_value?: string;
|
||||
string_value_parsed?: NodeConfig[];
|
||||
}
|
||||
}
|
||||
|
||||
101
src/services/master/typings/message.d.ts
vendored
Normal file
101
src/services/master/typings/message.d.ts
vendored
Normal file
@@ -0,0 +1,101 @@
|
||||
declare namespace MasterModel {
|
||||
interface SearchMessagePaginationBody extends SearchPaginationBody {
|
||||
subtopic?: string;
|
||||
}
|
||||
|
||||
interface RawNodeConfig {
|
||||
nid?: string;
|
||||
t?: string;
|
||||
n?: string;
|
||||
e?: E[];
|
||||
}
|
||||
interface E {
|
||||
eid?: string;
|
||||
t?: string;
|
||||
n?: string;
|
||||
a?: number;
|
||||
v?: number;
|
||||
c?: EC;
|
||||
vs?: string;
|
||||
}
|
||||
|
||||
interface EC {
|
||||
l?: number;
|
||||
nc?: number;
|
||||
st?: string;
|
||||
c?: CElement[];
|
||||
}
|
||||
|
||||
interface CElement {
|
||||
t?: string;
|
||||
c?: PurpleC;
|
||||
}
|
||||
|
||||
interface PurpleC {
|
||||
eid?: string;
|
||||
v?: number;
|
||||
op?: number;
|
||||
for?: number;
|
||||
}
|
||||
|
||||
// Interface Tranformed RawNodeConfig
|
||||
|
||||
interface NodeConfig {
|
||||
/** Node ID - Định danh duy nhất */
|
||||
nodeId: string;
|
||||
/** Type - Loại thiết bị */
|
||||
type: string;
|
||||
/** Name - Tên hiển thị */
|
||||
name: string;
|
||||
/** Entities - Danh sách cảm biến */
|
||||
entities: Entity[];
|
||||
}
|
||||
interface Entity {
|
||||
/** Entity ID - Định danh duy nhất của cảm biến */
|
||||
entityId: string;
|
||||
/** Type - Loại cảm biến (vd: 'bin' - nhị phân 0/1, 'bin_t' - nhị phân có trigger) */
|
||||
type: string;
|
||||
/** Name - Tên hiển thị */
|
||||
name: string;
|
||||
/** Active - Đã kích hoạt cảm biến này hay chưa (1=đã kích hoạt, 0=chưa kích hoạt) */
|
||||
active?: number;
|
||||
/** Value - Giá trị hiện tại (1=có, 0=không) */
|
||||
value?: number;
|
||||
/** EntityConfig - Cấu hình bổ sung */
|
||||
config?: EntityConfig[];
|
||||
}
|
||||
interface EntityConfig {
|
||||
/** Level - Mức độ cảnh báo
|
||||
0 = info,
|
||||
1 = warning,
|
||||
2 = critical */
|
||||
level?: 0 | 1 | 2;
|
||||
/** Normal Condition - Điều kiện bình thường */
|
||||
normalCondition?: number;
|
||||
/** SubType - Phân loại chi tiết */
|
||||
subType?: string;
|
||||
/** Children - Các cấu hình con */
|
||||
children?: EntityConfigChild[];
|
||||
}
|
||||
interface EntityConfigChild {
|
||||
/** Type - Loại điều kiện */
|
||||
type: string;
|
||||
children?: EntityConfigChildDetail[];
|
||||
}
|
||||
interface EntityConfigChildDetail {
|
||||
/** entity ID - Cảm biến được theo dõi */
|
||||
entityId: string;
|
||||
/** Value - Ngưỡng giá trị */
|
||||
value?: number;
|
||||
/** Operation - Toán tử so sánh:
|
||||
* 0 = == (bằng)
|
||||
* 1 = != (khác)
|
||||
* 2 = > (lớn hơn)
|
||||
* 3 = >= (lớn hơn hoặc bằng)
|
||||
* 4 = < (nhỏ hơn)
|
||||
* 5 = <= (nhỏ hơn hoặc bằng) */
|
||||
operation?: number;
|
||||
/** Duration - Thời gian duy trì (giây) */
|
||||
duration?: number;
|
||||
}
|
||||
}
|
||||
1
src/services/master/typings/thing.d.ts
vendored
1
src/services/master/typings/thing.d.ts
vendored
@@ -30,6 +30,7 @@ declare namespace MasterModel {
|
||||
state_updated_time?: number;
|
||||
type?: string;
|
||||
updated_time?: number;
|
||||
uptime?: number;
|
||||
lat?: string;
|
||||
lng?: string;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user