diff --git a/src/api/product/model.ts b/src/api/product/model.ts new file mode 100644 index 00000000..1ba5f178 --- /dev/null +++ b/src/api/product/model.ts @@ -0,0 +1,58 @@ +import type { GetModelAttributeListParams, ModelAttribute, ModelAttributeWithForm, ModelService } from './types' +import { defHttp } from '@/utils/http/axios' + +export function getAllModelServices(productId: string) { + return defHttp.get({ + url: '/thingModel/select', + params: { + productId, + }, + }) +} + +export function createModelService(data: Partial) { + return defHttp.post({ + url: '/thingModel/save', + data, + }) +} + +export function updateModelService(data: Partial) { + return defHttp.post({ + url: '/thingModel/update', + data, + }) +} + +export function deleteModelService(id: string) { + return defHttp.post({ + url: `/thingModel/remove?id=${id}`, + }) +} + +export function getModelAttributeList(params: GetModelAttributeListParams) { + return defHttp.get>({ + url: '/thingModel/item/page', + params, + }) +} + +export function createModelAttribute(data: ModelAttributeWithForm) { + return defHttp.post({ + url: '/thingModel/item/save', + data, + }) +} + +export function updateModelAttribute(data: ModelAttributeWithForm) { + return defHttp.post({ + url: '/thingModel/item/update', + data, + }) +} + +export function deleteModelAttribute(id: string) { + return defHttp.post({ + url: `/thingModel/item/remove?id=${id}`, + }) +} diff --git a/src/api/product/types.ts b/src/api/product/types.ts index 33424a13..19b11752 100644 --- a/src/api/product/types.ts +++ b/src/api/product/types.ts @@ -43,3 +43,54 @@ export interface Topic { topicDesc: string productId: string } + +export interface ModelService { + id: string + productId: string + serviceId: string + tenantId: string + description: string +} + +export interface GetModelAttributeListParams extends PageParam { + productId?: string + modelId?: string +} + +export interface ModelAttribute { + id: string + name: string + itemType: number + identifier: string + modelId: string + modelName?: string + tenantId: string + method: string + sort: number + dataSpecs?: { + min?: number + max?: number + maxLength?: number + trueDesc?: string + falseDesc?: string + scale?: string + } +} + +export interface ModelAttributeWithForm { + id: string + name: string + itemType: number + identifier: string + dataType: number + min: number + max: number + maxLength: number + scale: number + unit: string + trueDesc: string + falseDesc: string + method: string + sort: number + modelId: string +} diff --git a/src/components/Form/src/hooks/useFormEvents.ts b/src/components/Form/src/hooks/useFormEvents.ts index 4a883e9e..7e3fb37e 100644 --- a/src/components/Form/src/hooks/useFormEvents.ts +++ b/src/components/Form/src/hooks/useFormEvents.ts @@ -351,7 +351,6 @@ export function useFormEvents({ else _nameList = nameList === Array.isArray(nameList) ? nameList : undefined - const values = await unref(formElRef)?.validate(_nameList) return handleFormValues(values) } diff --git a/src/views/product/components/Model.vue b/src/views/product/components/Model.vue new file mode 100644 index 00000000..76b0e674 --- /dev/null +++ b/src/views/product/components/Model.vue @@ -0,0 +1,133 @@ + + + diff --git a/src/views/product/components/ModelAttributeFormModal.vue b/src/views/product/components/ModelAttributeFormModal.vue new file mode 100644 index 00000000..5acf7a81 --- /dev/null +++ b/src/views/product/components/ModelAttributeFormModal.vue @@ -0,0 +1,241 @@ + + + + + diff --git a/src/views/product/components/ModelServiceFormModal.vue b/src/views/product/components/ModelServiceFormModal.vue new file mode 100644 index 00000000..3d211eae --- /dev/null +++ b/src/views/product/components/ModelServiceFormModal.vue @@ -0,0 +1,79 @@ + + + diff --git a/src/views/product/components/composables/useModelAttribute.ts b/src/views/product/components/composables/useModelAttribute.ts new file mode 100644 index 00000000..2968333e --- /dev/null +++ b/src/views/product/components/composables/useModelAttribute.ts @@ -0,0 +1,73 @@ +import { unref, watch } from 'vue' +import type { MaybeRef, Ref } from 'vue' +import { useTable } from '@/components/Table' +import { deleteModelAttribute, getModelAttributeList } from '@/api/product/model' +import { useModal } from '@/components/Modal' +import type { ModelAttribute } from '@/api/product/types' +import { useMessage } from '@/hooks/web/useMessage' + +export function useModelAttribute(productId: MaybeRef, modelId: Ref) { + const [registerModelAttributeTable, { reload, setPagination }] = useTable({ + async api(params) { + if (!unref(modelId)) + return [] + + return getModelAttributeList({ + ...params, + productId: unref(productId), + modelId: unref(modelId), + }) + }, + columns: [ + { + title: '功能类型', + dataIndex: 'itemType', + customRender: ({ value }) => ({ 1: '属性', 2: '命令' }[value]), + }, + { + title: '功能名称', + dataIndex: 'name', + }, + { + title: '标识符', + dataIndex: 'identifier', + }, + { + title: '数据类型', + dataIndex: 'dataType', + }, + ], + bordered: true, + inset: true, + canResize: false, + actionColumn: { + width: 150, + title: '操作', + dataIndex: 'action', + fixed: 'right', + }, + }) + watch(modelId, () => { + setPagination({ current: 1 }) + reload() + }) + + const [registerModelAttributeModal, { openModal: openModelAttributeModal }] = useModal() + + async function handleDeleteModelAttribute(id: string) { + try { + await deleteModelAttribute(id) + useMessage().createMessage.success('删除成功') + reload() + } + catch {} + } + + return { + registerModelAttributeTable, + registerModelAttributeModal, + openModelAttributeModal, + reloadModalAttribute: reload, + handleDeleteModelAttribute, + } +} diff --git a/src/views/product/components/composables/useModelService.ts b/src/views/product/components/composables/useModelService.ts new file mode 100644 index 00000000..a3692d84 --- /dev/null +++ b/src/views/product/components/composables/useModelService.ts @@ -0,0 +1,39 @@ +import { useAsyncState, watchOnce } from '@vueuse/core' +import type { MaybeRef } from 'vue' +import { ref, unref } from 'vue' +import { deleteModelService, getAllModelServices } from '@/api/product/model' +import { useMessage } from '@/hooks/web/useMessage' +import { useModal } from '@/components/Modal' +import type { ModelService } from '@/api/product/types' + +export function useModelService(productId: MaybeRef) { + const selectedModelId = ref() + + const { state, execute } = useAsyncState(() => getAllModelServices(unref(productId)), [], { resetOnExecute: false }) + + watchOnce(state, () => { + if (state.value.length > 0) + selectedModelId.value = state.value[0].id + }) + + const [registerModelServiceModal, { openModal }] = useModal() + + async function handleDeleteModelService(id: string) { + try { + await deleteModelService(id) + useMessage().createMessage.success('删除成功') + execute() + } + catch {} + } + + return { + selectedModelId, + setSelectedModelId: (id: string) => selectedModelId.value = id, + reloadModelService: execute, + modelServiceList: state, + handleDeleteModelService, + registerModelServiceModal, + openModelServiceModal: openModal, + } +} diff --git a/src/views/product/components/index.ts b/src/views/product/components/index.ts index 2defe262..a7ab4299 100644 --- a/src/views/product/components/index.ts +++ b/src/views/product/components/index.ts @@ -1 +1,2 @@ export { default as TopicManage } from './TopicManage.vue' +export { default as Model } from './Model.vue' diff --git a/src/views/product/detail.vue b/src/views/product/detail.vue index d04ce55e..ce597ffa 100644 --- a/src/views/product/detail.vue +++ b/src/views/product/detail.vue @@ -2,7 +2,7 @@ import { Card, Tabs } from 'ant-design-vue' import { useAsyncState } from '@vueuse/core' import { useRoute } from 'vue-router' -import { TopicManage } from './components' +import { Model, TopicManage } from './components' import { Description } from '@/components/Description' import { getProductDetail } from '@/api/product' import type { DescItem } from '@/components/Description' @@ -78,7 +78,7 @@ const schema: DescItem[] = [ - 物模型 + 消息解析