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

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 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 一致) */
const FREEZE_START_TIME_MARKER_SERVICES = new Set([
'DayFreezeService',
@ -1183,12 +1206,14 @@ const [ServiceCallModal, serviceCallModalApi] = useVbenModal({
serviceCallFormValues.value = {};
valveCommandTypeOptions.value = [];
valveCommandTypeLoading.value = false;
clearServiceCallResult();
return true;
},
onOpenChange: async (isOpen: boolean) => {
if (!isOpen) {
return;
}
clearServiceCallResult();
const pid = serviceCallRow.value?.ioTPlatformProductId;
if (!pid) {
Message.warning('设备缺少平台产品信息,无法获取服务列表');
@ -1256,15 +1281,21 @@ async function submitDeviceServiceCall() {
serviceParams,
},
} as any);
if (typeof data === 'string' && data.trim() !== '') {
Message.success(data);
} else {
Message.success('服务调用成功');
}
serviceCallModalApi.close();
} catch (error) {
serviceCallResultOk.value = true;
serviceCallResultText.value = formatServiceCallResultPayload(data);
Message.success('服务调用成功');
} catch (error: any) {
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 {
serviceCallModalApi.setState({ loading: false, confirmLoading: false });
}
@ -1275,6 +1306,7 @@ function openServiceCallModal(row: Record<string, any>) {
Message.warning('设备缺少平台产品信息,无法获取服务列表');
return;
}
clearServiceCallResult();
serviceCallRow.value = row;
serviceCallModalApi.open();
}
@ -2904,7 +2936,7 @@ const toolbarActions = computed(() => [
</CommandModal>
<ServiceCallModal
: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">
<Loading :loading="true" tip="加载物模型服务中..." />
@ -2988,6 +3020,19 @@ const toolbarActions = computed(() => [
>
当前服务无参数thirdValue / secondValue 为空或无法解析
</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>
<template #footer>
<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) {
if (fieldValue == null || fieldValue === '') {
return '';
@ -700,6 +730,7 @@ async function submit() {
: postIoTplatformThingModelInfoCreateAsync;
const { valid } = await formApi.validate();
if (!valid) return;
const formValues = await formApi.getValues();
// ID使
let finalProductId: string | undefined;
@ -711,7 +742,9 @@ async function submit() {
const searchFormValues = gridApi?.formApi
? await gridApi.formApi.getValues()
: {};
// _ioTPlatformProductIdID
finalProductId =
formValues._ioTPlatformProductId ||
searchFormValues.ioTPlatformProductId || productId.value || undefined;
if (finalProductId) {
finalProductId = String(finalProductId);
@ -738,11 +771,13 @@ async function submit() {
? await gridApi.formApi.getValues()
: {};
const platformValue =
searchFormValues.ioTPlatform || ioTPlatform.value || '2';
formValues._ioTPlatform ||
searchFormValues.ioTPlatform ||
ioTPlatform.value ||
'2';
finalPlatform = Number.parseInt(String(platformValue)) as 1 | 2;
}
const formValues = await formApi.getValues();
const ioTPlatformRawFieldExtensionParsed = parseJsonFieldValue(
formValues.ioTPlatformRawFieldExtension,
'平台物模型值类型扩展',
@ -751,26 +786,28 @@ async function submit() {
return;
}
//
const { _ioTPlatform, _ioTPlatformProductId, ...cleanFormValues } = formValues;
const fetchParams: any = {
...formValues,
...cleanFormValues,
//
ioTPlatform: finalPlatform,
ioTPlatform: String(finalPlatform),
ioTPlatformProductId: finalProductId,
//
// "1" / "2"
...(formValues.identifierType !== undefined &&
formValues.identifierType !== null && {
identifierType: Number.parseInt(
String(formValues.identifierType),
) as 1 | 2,
identifierType: String(formValues.identifierType),
}),
// ID
...(isEdit && { id: editRow.value.id }),
// JSON
standardFieldFieldExtension: normalizeFieldExtensionValue(
formValues.standardFieldFieldExtension,
// JSON "{}"
standardFieldFieldExtension: normalizeObjectJsonFieldForSubmit(
normalizeFieldExtensionValue(formValues.standardFieldFieldExtension),
),
ioTPlatformRawFieldExtension: normalizeObjectJsonFieldForSubmit(
ioTPlatformRawFieldExtensionParsed.value,
),
// JSON
ioTPlatformRawFieldExtension: ioTPlatformRawFieldExtensionParsed.value,
};
try {