修复平台端物模型新增和修改失败的问题

This commit is contained in:
ChenYi 2026-04-17 16:59:32 +08:00
parent 095b521259
commit 8fd4aba658
2 changed files with 104 additions and 22 deletions

View File

@ -736,6 +736,29 @@ const serviceCallOptions = ref<
const selectedServiceIndex = ref<number | undefined>(undefined); const selectedServiceIndex = ref<number | undefined>(undefined);
const serviceCallFormValues = ref<Record<string, string>>({}); const serviceCallFormValues = ref<Record<string, string>>({});
/** 服务调用接口返回,展示在弹窗内;不自动关闭弹窗 */
const serviceCallResultText = ref('');
const serviceCallResultOk = ref(true);
function formatServiceCallResultPayload(data: unknown): string {
if (data === undefined || data === null) {
return '(接口无返回体)';
}
if (typeof data === 'string') {
return data.trim() === '' ? '(空字符串)' : data;
}
try {
return JSON.stringify(data, null, 2);
} catch {
return String(data);
}
}
function clearServiceCallResult() {
serviceCallResultText.value = '';
serviceCallResultOk.value = true;
}
/** 需用日期时间选择「起始时标」的冻结/补抄类服务(与物模型服务标识 key 一致) */ /** 需用日期时间选择「起始时标」的冻结/补抄类服务(与物模型服务标识 key 一致) */
const FREEZE_START_TIME_MARKER_SERVICES = new Set([ const FREEZE_START_TIME_MARKER_SERVICES = new Set([
'DayFreezeService', 'DayFreezeService',
@ -1183,12 +1206,14 @@ const [ServiceCallModal, serviceCallModalApi] = useVbenModal({
serviceCallFormValues.value = {}; serviceCallFormValues.value = {};
valveCommandTypeOptions.value = []; valveCommandTypeOptions.value = [];
valveCommandTypeLoading.value = false; valveCommandTypeLoading.value = false;
clearServiceCallResult();
return true; return true;
}, },
onOpenChange: async (isOpen: boolean) => { onOpenChange: async (isOpen: boolean) => {
if (!isOpen) { if (!isOpen) {
return; return;
} }
clearServiceCallResult();
const pid = serviceCallRow.value?.ioTPlatformProductId; const pid = serviceCallRow.value?.ioTPlatformProductId;
if (!pid) { if (!pid) {
Message.warning('设备缺少平台产品信息,无法获取服务列表'); Message.warning('设备缺少平台产品信息,无法获取服务列表');
@ -1256,15 +1281,21 @@ async function submitDeviceServiceCall() {
serviceParams, serviceParams,
}, },
} as any); } as any);
if (typeof data === 'string' && data.trim() !== '') { serviceCallResultOk.value = true;
Message.success(data); serviceCallResultText.value = formatServiceCallResultPayload(data);
} else { Message.success('服务调用成功');
Message.success('服务调用成功'); } catch (error: any) {
}
serviceCallModalApi.close();
} catch (error) {
console.error('调用设备服务失败:', error); console.error('调用设备服务失败:', error);
Message.error('调用设备服务失败'); const backendMessage =
error?.response?.data?.error?.message ??
error?.data?.error?.message ??
error?.error?.message;
const msg =
backendMessage && typeof backendMessage === 'string'
? backendMessage
: (error as Error)?.message || '调用设备服务失败';
serviceCallResultOk.value = false;
serviceCallResultText.value = msg;
} finally { } finally {
serviceCallModalApi.setState({ loading: false, confirmLoading: false }); serviceCallModalApi.setState({ loading: false, confirmLoading: false });
} }
@ -1275,6 +1306,7 @@ function openServiceCallModal(row: Record<string, any>) {
Message.warning('设备缺少平台产品信息,无法获取服务列表'); Message.warning('设备缺少平台产品信息,无法获取服务列表');
return; return;
} }
clearServiceCallResult();
serviceCallRow.value = row; serviceCallRow.value = row;
serviceCallModalApi.open(); serviceCallModalApi.open();
} }
@ -2904,7 +2936,7 @@ const toolbarActions = computed(() => [
</CommandModal> </CommandModal>
<ServiceCallModal <ServiceCallModal
:title="`服务调用 - ${serviceCallRow.deviceName || serviceCallRow.deviceAddress || ''}`" :title="`服务调用 - ${serviceCallRow.deviceName || serviceCallRow.deviceAddress || ''}`"
class="w-[440px] max-w-[92vw]" class="w-[480px] max-w-[92vw]"
> >
<div v-if="serviceCallLoading" class="py-10 text-center"> <div v-if="serviceCallLoading" class="py-10 text-center">
<Loading :loading="true" tip="加载物模型服务中..." /> <Loading :loading="true" tip="加载物模型服务中..." />
@ -2988,6 +3020,19 @@ const toolbarActions = computed(() => [
> >
当前服务无参数thirdValue / secondValue 为空或无法解析 当前服务无参数thirdValue / secondValue 为空或无法解析
</div> </div>
<div v-if="serviceCallResultText" class="mt-2 flex min-h-0 flex-shrink-0 flex-col gap-1">
<div class="text-sm font-medium text-gray-700">调用结果</div>
<div
class="max-h-[min(28vh,200px)] overflow-auto rounded border px-2 py-2 text-xs leading-relaxed"
:class="
serviceCallResultOk
? 'border-green-200 bg-green-50 text-gray-800'
: 'border-red-200 bg-red-50 text-red-800'
"
>
<pre class="m-0 whitespace-pre-wrap break-words font-sans">{{ serviceCallResultText }}</pre>
</div>
</div>
</div> </div>
<template #footer> <template #footer>
<div class="flex w-full items-center justify-end gap-2"> <div class="flex w-full items-center justify-end gap-2">

View File

@ -649,6 +649,36 @@ function normalizeFieldExtensionValue(fieldValue: unknown) {
} }
} }
function normalizeObjectJsonFieldForSubmit(
fieldValue: unknown,
): null | Record<string, unknown> {
if (fieldValue == null) {
return null;
}
if (typeof fieldValue === 'string') {
const trimmed = fieldValue.trim();
if (!trimmed) {
return null;
}
try {
const parsed = JSON.parse(trimmed);
if (parsed == null) {
return null;
}
if (typeof parsed === 'object' && !Array.isArray(parsed)) {
return parsed as Record<string, unknown>;
}
return null;
} catch {
return null;
}
}
if (typeof fieldValue === 'object' && !Array.isArray(fieldValue)) {
return fieldValue as Record<string, unknown>;
}
return null;
}
function formatFieldExtensionForForm(fieldValue: unknown) { function formatFieldExtensionForForm(fieldValue: unknown) {
if (fieldValue == null || fieldValue === '') { if (fieldValue == null || fieldValue === '') {
return ''; return '';
@ -700,6 +730,7 @@ async function submit() {
: postIoTplatformThingModelInfoCreateAsync; : postIoTplatformThingModelInfoCreateAsync;
const { valid } = await formApi.validate(); const { valid } = await formApi.validate();
if (!valid) return; if (!valid) return;
const formValues = await formApi.getValues();
// ID使 // ID使
let finalProductId: string | undefined; let finalProductId: string | undefined;
@ -711,7 +742,9 @@ async function submit() {
const searchFormValues = gridApi?.formApi const searchFormValues = gridApi?.formApi
? await gridApi.formApi.getValues() ? await gridApi.formApi.getValues()
: {}; : {};
// _ioTPlatformProductIdID
finalProductId = finalProductId =
formValues._ioTPlatformProductId ||
searchFormValues.ioTPlatformProductId || productId.value || undefined; searchFormValues.ioTPlatformProductId || productId.value || undefined;
if (finalProductId) { if (finalProductId) {
finalProductId = String(finalProductId); finalProductId = String(finalProductId);
@ -738,11 +771,13 @@ async function submit() {
? await gridApi.formApi.getValues() ? await gridApi.formApi.getValues()
: {}; : {};
const platformValue = const platformValue =
searchFormValues.ioTPlatform || ioTPlatform.value || '2'; formValues._ioTPlatform ||
searchFormValues.ioTPlatform ||
ioTPlatform.value ||
'2';
finalPlatform = Number.parseInt(String(platformValue)) as 1 | 2; finalPlatform = Number.parseInt(String(platformValue)) as 1 | 2;
} }
const formValues = await formApi.getValues();
const ioTPlatformRawFieldExtensionParsed = parseJsonFieldValue( const ioTPlatformRawFieldExtensionParsed = parseJsonFieldValue(
formValues.ioTPlatformRawFieldExtension, formValues.ioTPlatformRawFieldExtension,
'平台物模型值类型扩展', '平台物模型值类型扩展',
@ -751,26 +786,28 @@ async function submit() {
return; return;
} }
//
const { _ioTPlatform, _ioTPlatformProductId, ...cleanFormValues } = formValues;
const fetchParams: any = { const fetchParams: any = {
...formValues, ...cleanFormValues,
// //
ioTPlatform: finalPlatform, ioTPlatform: String(finalPlatform),
ioTPlatformProductId: finalProductId, ioTPlatformProductId: finalProductId,
// // "1" / "2"
...(formValues.identifierType !== undefined && ...(formValues.identifierType !== undefined &&
formValues.identifierType !== null && { formValues.identifierType !== null && {
identifierType: Number.parseInt( identifierType: String(formValues.identifierType),
String(formValues.identifierType),
) as 1 | 2,
}), }),
// ID // ID
...(isEdit && { id: editRow.value.id }), ...(isEdit && { id: editRow.value.id }),
// JSON // JSON "{}"
standardFieldFieldExtension: normalizeFieldExtensionValue( standardFieldFieldExtension: normalizeObjectJsonFieldForSubmit(
formValues.standardFieldFieldExtension, normalizeFieldExtensionValue(formValues.standardFieldFieldExtension),
),
ioTPlatformRawFieldExtension: normalizeObjectJsonFieldForSubmit(
ioTPlatformRawFieldExtensionParsed.value,
), ),
// JSON
ioTPlatformRawFieldExtension: ioTPlatformRawFieldExtensionParsed.value,
}; };
try { try {