From a8478617cdc13a288ace8e37a72eacdd1d1e812a Mon Sep 17 00:00:00 2001 From: xieyonghong <18010623010@163.com> Date: Wed, 22 Mar 2023 23:01:22 +0800 Subject: [PATCH 01/16] =?UTF-8?q?fix:=20bug#10763=E3=80=8110750=E3=80=8110?= =?UTF-8?q?732=E3=80=8110686?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 4 +- src/components/Layout/BasicLayoutPage.vue | 5 ++ src/components/ValueItem/index.vue | 2 +- src/router/menu.ts | 2 +- src/utils/request.ts | 5 +- .../DashBoard/components/TimeSelect.vue | 3 +- .../iot-card/CardManagement/Detail/index.vue | 5 ++ src/views/iot-card/CardManagement/Save.vue | 4 +- src/views/iot-card/CardManagement/index.vue | 18 +++++- src/views/iot-card/Home/index.vue | 22 +++---- src/views/iot-card/Platform/Detail/index.vue | 1 + src/views/iot-card/Platform/index.vue | 2 +- src/views/iot-card/components/TimeSelect.vue | 47 +++++++-------- .../Scene/Save/Device/AddModal.vue | 2 +- .../Scene/Save/Device/DeviceList.vue | 2 +- .../Scene/Save/Device/InvokeFunction.vue | 29 ++++++++-- .../rule-engine/Scene/Save/Device/Product.vue | 2 +- .../rule-engine/Scene/Save/Timer/AddModal.vue | 19 +++--- .../rule-engine/Scene/Save/Timer/Title.vue | 58 +++++++++++++++++++ .../rule-engine/Scene/Save/Timer/index.vue | 4 +- .../Scene/Save/action/Device/Product.vue | 2 +- .../Save/action/Device/actions/index.vue | 22 ++++++- .../Save/action/Device/device/Device.vue | 2 +- .../components/FunctionCall/FunctionCall.vue | 1 + .../Save/components/Timer/WhenOption.vue | 2 + .../Scene/Save/components/Timer/index.vue | 36 +++++++----- src/views/rule-engine/Scene/Save/index.vue | 3 + src/views/rule-engine/Scene/Save/style.less | 3 + src/views/system/Department/device/index.vue | 18 +++--- src/views/system/Department/product/index.vue | 10 ++-- src/views/system/User/index.vue | 19 +++++- yarn.lock | 4 +- 32 files changed, 255 insertions(+), 103 deletions(-) create mode 100644 src/views/rule-engine/Scene/Save/Timer/Title.vue create mode 100644 src/views/rule-engine/Scene/Save/style.less diff --git a/src/App.vue b/src/App.vue index b61b8ee9..815d1240 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,6 +1,8 @@ diff --git a/src/components/Layout/BasicLayoutPage.vue b/src/components/Layout/BasicLayoutPage.vue index 7a7ca687..1119f7f6 100644 --- a/src/components/Layout/BasicLayoutPage.vue +++ b/src/components/Layout/BasicLayoutPage.vue @@ -6,6 +6,7 @@ v-model:selectedKeys="state.selectedKeys" :pure="state.pure" :breadcrumb="{ routes: breadcrumb }" + @back='routerBack' > - diff --git a/src/views/iot-card/components/TimeSelect.vue b/src/views/iot-card/components/TimeSelect.vue index de656b5e..6e785fff 100644 --- a/src/views/iot-card/components/TimeSelect.vue +++ b/src/views/iot-card/components/TimeSelect.vue @@ -16,8 +16,9 @@ diff --git a/src/views/rule-engine/Scene/Save/Device/AddModal.vue b/src/views/rule-engine/Scene/Save/Device/AddModal.vue index 7566f936..9f06c747 100644 --- a/src/views/rule-engine/Scene/Save/Device/AddModal.vue +++ b/src/views/rule-engine/Scene/Save/Device/AddModal.vue @@ -3,7 +3,7 @@ title='触发规则' visible :width='820' - @click='save' + @ok='save' @cancel='cancel' :maskClosable="false" > diff --git a/src/views/rule-engine/Scene/Save/Device/DeviceList.vue b/src/views/rule-engine/Scene/Save/Device/DeviceList.vue index 28b61408..b3d493a7 100644 --- a/src/views/rule-engine/Scene/Save/Device/DeviceList.vue +++ b/src/views/rule-engine/Scene/Save/Device/DeviceList.vue @@ -3,7 +3,7 @@ :columns="columns" type='simple' @search="handleSearch" - class='search' + class="scene-search" target="scene-triggrt-device-device" /> diff --git a/src/views/rule-engine/Scene/Save/Device/InvokeFunction.vue b/src/views/rule-engine/Scene/Save/Device/InvokeFunction.vue index 4e0aaa39..0973539b 100644 --- a/src/views/rule-engine/Scene/Save/Device/InvokeFunction.vue +++ b/src/views/rule-engine/Scene/Save/Device/InvokeFunction.vue @@ -22,11 +22,16 @@ 定时调用所选功能 + + @@ -66,9 +71,9 @@ const props = defineProps({ const emit = defineEmits() const invokeForm = ref() const formModel = reactive({ - functionId: props.functionId + functionId: props.functionId, + functionData: props.functionParameters }) -const _value = ref(props.functionParameters) /** * 获取当前选择功能属性 @@ -94,13 +99,29 @@ const functionData = computed(() => { return arrCache }) +const rules = [{ + validator(_: string, value: any) { + if (!value?.length && functionData.value.length) { + return Promise.reject('请输入功能值') + } else { + let hasValue = value.find((item: { name: string, value: any}) => !item.value) + if (hasValue) { + const functionItem = functionData.value.find((item: any) => item.id === hasValue.name) + return Promise.reject(functionItem?.name ? `请输入${functionItem?.name}值` : '请输入功能值') + } + } + return Promise.resolve(); + } +}] + const onSelect = (v: string, item: any) => { + formModel.functionData = [] emit('update:action', `执行${item.name}`) emit('update:functionId', v) + emit('update:functionParameters', []) } const callDataChange = (v: any[]) => { - _value.value = v emit('update:functionParameters', v) } diff --git a/src/views/rule-engine/Scene/Save/Device/Product.vue b/src/views/rule-engine/Scene/Save/Device/Product.vue index 73c2a386..b8b42a27 100644 --- a/src/views/rule-engine/Scene/Save/Device/Product.vue +++ b/src/views/rule-engine/Scene/Save/Device/Product.vue @@ -3,7 +3,7 @@ :columns="columns" type='simple' @search="handleSearch" - class='search' + class="scene-search" target="scene-triggrt-device-device" /> diff --git a/src/views/rule-engine/Scene/Save/Timer/AddModal.vue b/src/views/rule-engine/Scene/Save/Timer/AddModal.vue index db8b21a9..cf5afd85 100644 --- a/src/views/rule-engine/Scene/Save/Timer/AddModal.vue +++ b/src/views/rule-engine/Scene/Save/Timer/AddModal.vue @@ -3,7 +3,7 @@ title='触发规则' visible :width='820' - @click='save' + @ok='save' @cancel='cancel' > import Timer from '../components/Timer' import type { OperationTimer } from '@/views/rule-engine/Scene/typings' -import {nextTick, PropType} from "vue"; -import {TriggerDevice} from "@/views/rule-engine/Scene/typings"; +import { PropType} from "vue"; import {handleTimerOptions} from "@/views/rule-engine/Scene/Save/components/Timer/util"; type Emit = { (e: 'cancel'): void - (e: 'save', data: TriggerDevice, options: Record): void + (e: 'save', data: OperationTimer, options: Record): void } const props = defineProps({ - timer: { + value: { type: Object as PropType, default: () => ({}) } @@ -39,14 +38,14 @@ interface AddModelType { } const addModel = reactive({ - timer: props.timer + timer: props.value }) const save = async () => { const timerData = await timerRef.value?.validateFields() if (timerData) { - const options = handleTimerOptions(timerData) - emit("save", timerData, options) + const options = handleTimerOptions(addModel.timer) + emit("save", addModel.timer, options) } } @@ -54,8 +53,8 @@ const cancel = () => { emit("cancel") } -nextTick(() => { - Object.assign(addModel, props.timer) +watchEffect(() => { + addModel.timer = props.value }) diff --git a/src/views/rule-engine/Scene/Save/Timer/Title.vue b/src/views/rule-engine/Scene/Save/Timer/Title.vue new file mode 100644 index 00000000..b37d035c --- /dev/null +++ b/src/views/rule-engine/Scene/Save/Timer/Title.vue @@ -0,0 +1,58 @@ + + + + + \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/Timer/index.vue b/src/views/rule-engine/Scene/Save/Timer/index.vue index 6d750bb6..30edd897 100644 --- a/src/views/rule-engine/Scene/Save/Timer/index.vue +++ b/src/views/rule-engine/Scene/Save/Timer/index.vue @@ -29,8 +29,7 @@ v-if="visible" @cancel='visible = false' @save="save" - :value="data.trigger.device" - :options="data.options.trigger" + :value="data.trigger.timer" /> @@ -41,6 +40,7 @@ import { storeToRefs } from 'pinia'; import Action from '../action/index.vue'; import AddModel from './AddModal.vue' import AddButton from '../components/AddButton.vue' +import Title from './Title.vue' import type { OperationTimer, BranchesThen } from '@/views/rule-engine/Scene/typings' const sceneStore = useSceneStore(); diff --git a/src/views/rule-engine/Scene/Save/action/Device/Product.vue b/src/views/rule-engine/Scene/Save/action/Device/Product.vue index a487395f..a59386ad 100644 --- a/src/views/rule-engine/Scene/Save/action/Device/Product.vue +++ b/src/views/rule-engine/Scene/Save/action/Device/Product.vue @@ -3,7 +3,7 @@ :columns="columns" type="simple" @search="handleSearch" - class="search" + class="scene-search" target="scene-trigger-device-product" /> diff --git a/src/views/rule-engine/Scene/Save/action/Device/actions/index.vue b/src/views/rule-engine/Scene/Save/action/Device/actions/index.vue index ff7cdbb5..f935083e 100644 --- a/src/views/rule-engine/Scene/Save/action/Device/actions/index.vue +++ b/src/views/rule-engine/Scene/Save/action/Device/actions/index.vue @@ -22,6 +22,7 @@ showSearch placeholder="请选择功能" v-model:value="modelRef.message.functionId" + @select='functionSelect' > { + modelRef.message.inputs = [] +} + +const functionRules = [{ + validator(_: string, value: any) { + if (!value?.length && functions.value.length) { + return Promise.reject('请输入功能值') + } else { + const hasValue = value.find((item: { name: string, value: any}) => !item.value) + if (hasValue) { + const functionItem = functions.value.find((item: any) => item.id === hasValue.name) + return Promise.reject(functionItem?.name ? `请输入${functionItem.name}值` : '请输入功能值') + } + } + return Promise.resolve(); + } +}] + const metadata = ref<{ functions: any[]; properties: any[]; diff --git a/src/views/rule-engine/Scene/Save/action/Device/device/Device.vue b/src/views/rule-engine/Scene/Save/action/Device/device/Device.vue index b5d35ad2..d3a07b0e 100644 --- a/src/views/rule-engine/Scene/Save/action/Device/device/Device.vue +++ b/src/views/rule-engine/Scene/Save/action/Device/device/Device.vue @@ -3,7 +3,7 @@ :columns="columns" type="simple" @search="handleSearch" - class="search" + class="scene-search" target="scene-trigger-device-device" /> diff --git a/src/views/rule-engine/Scene/Save/components/FunctionCall/FunctionCall.vue b/src/views/rule-engine/Scene/Save/components/FunctionCall/FunctionCall.vue index 25a9270a..1dda6f53 100644 --- a/src/views/rule-engine/Scene/Save/components/FunctionCall/FunctionCall.vue +++ b/src/views/rule-engine/Scene/Save/components/FunctionCall/FunctionCall.vue @@ -101,6 +101,7 @@ const valueChange = debounce(() => { const _value = dataSource.value.map(item => ({ name: item.id, value: item.value })) + console.log(_value) emit('change', _value) emit('update:value', _value) }, 500) diff --git a/src/views/rule-engine/Scene/Save/components/Timer/WhenOption.vue b/src/views/rule-engine/Scene/Save/components/Timer/WhenOption.vue index 345f3fb1..3e7782a1 100644 --- a/src/views/rule-engine/Scene/Save/components/Timer/WhenOption.vue +++ b/src/views/rule-engine/Scene/Save/components/Timer/WhenOption.vue @@ -17,6 +17,7 @@ import { numberToString } from './util' type Emit = { (e: 'update:value', data: Array):void + (e: 'change', data: Array):void } const props = defineProps({ @@ -48,6 +49,7 @@ const change = (number: number) => { } rowKeys.value = [..._keys.values()] emit('update:value', rowKeys.value) + emit('change', rowKeys.value) } const allActive = computed(() => { diff --git a/src/views/rule-engine/Scene/Save/components/Timer/index.vue b/src/views/rule-engine/Scene/Save/components/Timer/index.vue index 84eb7e26..7b902b18 100644 --- a/src/views/rule-engine/Scene/Save/components/Timer/index.vue +++ b/src/views/rule-engine/Scene/Save/components/Timer/index.vue @@ -15,6 +15,7 @@ ]' option-type='button' button-style='solid' + @change='updateValue' /> - + - + 执行一次 @@ -68,6 +75,7 @@ @change='(v) => { formModel.period.from = v[0] formModel.period.to = v[1] + updateValue() }' /> @@ -83,6 +91,7 @@ :min='1' :max='59' v-model:value='formModel.period.every' + @change='updateValue' > @@ -103,7 +113,7 @@ diff --git a/src/views/rule-engine/Scene/Save/index.vue b/src/views/rule-engine/Scene/Save/index.vue index d66d8a7c..12d93a3c 100644 --- a/src/views/rule-engine/Scene/Save/index.vue +++ b/src/views/rule-engine/Scene/Save/index.vue @@ -114,4 +114,7 @@ onUnmounted(() => { } } } + + \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/style.less b/src/views/rule-engine/Scene/Save/style.less new file mode 100644 index 00000000..27da287d --- /dev/null +++ b/src/views/rule-engine/Scene/Save/style.less @@ -0,0 +1,3 @@ +.scene-search { + padding: 24px 0 0 0; +} \ No newline at end of file diff --git a/src/views/system/Department/device/index.vue b/src/views/system/Department/device/index.vue index 1d1f076e..4ca49771 100644 --- a/src/views/system/Department/device/index.vue +++ b/src/views/system/Department/device/index.vue @@ -70,7 +70,7 @@ :status="slotProps.state?.value" :statusText="slotProps.state?.text" :statusNames="{ - online: 'success', + online: 'processing', offline: 'error', notActive: 'warning', }" @@ -147,7 +147,7 @@ :status="slotProps.state.value" :text="slotProps.state.text" :statusNames="{ - online: 'success', + online: 'processing', offline: 'error', notActive: 'warning', }" @@ -247,6 +247,9 @@ const columns = [ search: { rename: 'productId$product-info', type: 'select', + handleValue(value: string) { + return `id is ${value}` + }, options: () => new Promise((resolve) => { const params = { @@ -288,14 +291,9 @@ const columns = [ search: { type: 'select', options: [ - { - label: '正常', - value: 1, - }, - { - label: '禁用', - value: 0, - }, + { label: '禁用', value: 'notActive' }, + { label: '离线', value: 'offline' }, + { label: '在线', value: 'online' }, ], }, scopedSlots: true, diff --git a/src/views/system/Department/product/index.vue b/src/views/system/Department/product/index.vue index 9537f7ff..0a113a4c 100644 --- a/src/views/system/Department/product/index.vue +++ b/src/views/system/Department/product/index.vue @@ -68,9 +68,8 @@ :status="slotProps.state?.value" :statusText="slotProps.state?.text" :statusNames="{ - online: 'success', - offline: 'error', - notActive: 'warning', + 1: 'processing', + 0: 'error', }" > diff --git a/src/views/system/User/index.vue b/src/views/system/User/index.vue index 8fe8b0a6..2283af2d 100644 --- a/src/views/system/User/index.vue +++ b/src/views/system/User/index.vue @@ -4,7 +4,7 @@ { + + const newParams = (params?.terms as any[])?.map(item1 => { + item1.terms = item1.terms.map((item2: any) => { + if (['telephone', 'email'].includes(item2.column)) { + return { + column: 'id$user-detail', + value: [item2] + } + } + return item2 + }) + return item1 + }) + queryParams.value = { terms: newParams || [] } +} \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/Timer/AddModal.vue b/src/views/rule-engine/Scene/Save/Timer/AddModal.vue index cf5afd85..82631c0f 100644 --- a/src/views/rule-engine/Scene/Save/Timer/AddModal.vue +++ b/src/views/rule-engine/Scene/Save/Timer/AddModal.vue @@ -53,9 +53,9 @@ const cancel = () => { emit("cancel") } -watchEffect(() => { - addModel.timer = props.value -}) +// watchEffect(() => { +// addModel.timer = props.value +// }) diff --git a/src/views/rule-engine/Scene/Save/Timer/index.vue b/src/views/rule-engine/Scene/Save/Timer/index.vue index 30edd897..81d29554 100644 --- a/src/views/rule-engine/Scene/Save/Timer/index.vue +++ b/src/views/rule-engine/Scene/Save/Timer/index.vue @@ -2,7 +2,7 @@