修复平台端物模型新增和修改失败的问题
This commit is contained in:
parent
095b521259
commit
8fd4aba658
@ -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">
|
||||
|
||||
@ -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()
|
||||
: {};
|
||||
// 新增弹窗里会保存 _ioTPlatformProductId,作为重要兜底,避免搜索表单值丢失导致未传产品ID
|
||||
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 {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user