diff --git a/src/api/rule-engine/scene.ts b/src/api/rule-engine/scene.ts new file mode 100644 index 00000000..28cd4b71 --- /dev/null +++ b/src/api/rule-engine/scene.ts @@ -0,0 +1,8 @@ +import server from '@/utils/request'; + + +export const modify = (id: string, data: any) => server.put(`/scene/${id}`, data) + +export const save = (data: any) => server.post(`/scene`, data) + +export const detail = (id: string) => server.get(`/scene/${id}`) \ No newline at end of file diff --git a/src/components/Ellipsis/index.vue b/src/components/Ellipsis/index.vue new file mode 100644 index 00000000..b2e91c49 --- /dev/null +++ b/src/components/Ellipsis/index.vue @@ -0,0 +1,168 @@ + + + + \ No newline at end of file diff --git a/src/components/index.ts b/src/components/index.ts index 49f9d91d..2c47f28a 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -10,6 +10,7 @@ import NormalUpload from './NormalUpload/index.vue' import FileFormat from './FileFormat/index.vue' import JUpload from './JUpload/index.vue' import { BasicLayoutPage, BlankLayoutPage, PageContainer } from './Layout' +import Ellipsis from './Ellipsis/index.vue' export default { install(app: App) { @@ -26,5 +27,6 @@ export default { .component('BasicLayoutPage', BasicLayoutPage) .component('BlankLayoutPage', BlankLayoutPage) .component('PageContainer', PageContainer) + .component('Ellipsis', Ellipsis) } } diff --git a/src/store/menu.ts b/src/store/menu.ts index 6d77d988..44c0d9fe 100644 --- a/src/store/menu.ts +++ b/src/store/menu.ts @@ -2,6 +2,7 @@ import { defineStore } from 'pinia' import { queryOwnThree } from '@/api/system/menu' import { filterAsnycRouter, MenuItem } from '@/utils/menu' import { isArray } from 'lodash-es' +import { usePermissionStore } from './permission' import router from '@/router' const defaultOwnParams = [ @@ -45,26 +46,15 @@ export const useMenuStore = defineStore({ }), getters: { hasPermission(state) { - return (code: string | string[]) => { - if (!code) { + return (menuCode: string | string[]) => { + if (!menuCode) { return true } if (!!Object.keys(state.menus).length) { - let codes: string[] = [] - - if (typeof code === 'string') { - codes.push(code) - } else { - codes = code + if (typeof menuCode === 'string') { + return !!this.menus[menuCode] } - - return codes.some(_c => { - const menu_code = _c.split(':') - if (menu_code.length > 1) { - return !!this.menus[menu_code[0]]?.buttons?.includes(menu_code[1]) - } - return false - }) + return menuCode.some(code => !!this.menus[code]) } return false } @@ -95,6 +85,8 @@ export const useMenuStore = defineStore({ //过滤非集成的菜单 const resp = await queryOwnThree({ paging: false, terms: defaultOwnParams }) if (resp.success) { + const permission = usePermissionStore() + permission.permissions = {} const { menusData, silderMenus } = filterAsnycRouter(resp.result) this.menus = {} const handleMenuItem = (menu: any) => { @@ -104,6 +96,7 @@ export const useMenuStore = defineStore({ path: menuItem.path, buttons: menuItem.meta.buttons } + permission.permissions[menuItem.name] = menuItem.meta.buttons if (menuItem.children && menuItem.children.length) { handleMenuItem(menuItem.children) } diff --git a/src/store/scene.ts b/src/store/scene.ts new file mode 100644 index 00000000..3a57aaa2 --- /dev/null +++ b/src/store/scene.ts @@ -0,0 +1,132 @@ +import { defineStore } from 'pinia' +import type { BranchesType, FormModelType, SceneItem } from '@/views/rule-engine/Scene/typings' +import { detail } from '@/api/rule-engine/scene' +import { cloneDeep, isArray } from 'lodash-es' +import { randomString } from '@/utils/utils' + +type DataType = { + data: FormModelType | any + productCache: any +} + +const assignmentKey = (data: any[]): any[] => { + const onlyKey = ['when', 'then', 'terms', 'actions']; + if (!data) return []; + + return data.map((item: any) => { + if (item) { + item.key = randomString(); + Object.keys(item).some((key) => { + if (onlyKey.includes(key) && isArray(item[key])) { + item[key] = assignmentKey(item[key]); + } + }); + } + return item; + }); +}; + +export const defaultBranches = [ + { + when: [ + { + terms: [ + { + column: undefined, + value: undefined, + termType: undefined, + key: 'params_1', + type: 'and', + }, + ], + type: 'and', + key: 'terms_1', + }, + ], + key: 'branches_1', + shakeLimit: { + enabled: false, + time: 1, + threshold: 1, + alarmFirst: false, + }, + then: [], + }, +]; + +const defaultOptions = { + trigger: {}, + when: [ + { + terms: [ + { + terms: [], + }, + ], + }, + ], +}; + +export const useSceneStore = defineStore({ + id: 'scene', + state: (): DataType => { + return { + data: { + trigger: { type: ''}, + options: defaultOptions, + branches: defaultBranches, + description: '' + }, + productCache: {} + } + }, + actions: { + /** + * 初始化数据 + */ + initData() { + + }, + /** + * 获取详情 + * @param id + */ + async getDetail(id: string) { + const resp = await detail(id) + if (resp.success) { + const result = resp.result as SceneItem + const triggerType = result.triggerType + let branches: any[] = result.branches + + if (!branches) { + branches = cloneDeep(defaultBranches) + if (triggerType === 'device') { + branches.push(null) + } + } else { + const branchesLength = branches.length; + if ( + triggerType === 'device' && + ((branchesLength === 1 && !!branches[0]?.when?.length) || // 有一组数据并且when有值 + (branchesLength > 1 && !branches[branchesLength - 1]?.when?.length)) // 有多组否则数据,并且最后一组when有值 + ) { + branches.push(null); + } + } + + this.data = { + ...result, + trigger: result.trigger || {}, + branches: cloneDeep(assignmentKey(branches)), + options: {...defaultOptions, ...result.options }, + } + } + }, + getProduct() { + + } + }, + getters: { + + } +}) \ No newline at end of file diff --git a/src/views/notice/Config/Detail/index.vue b/src/views/notice/Config/Detail/index.vue index 01a9d729..de172688 100644 --- a/src/views/notice/Config/Detail/index.vue +++ b/src/views/notice/Config/Detail/index.vue @@ -13,6 +13,7 @@ v-model:value="formData.type" placeholder="请选择通知方式" :disabled="!!formData.id" + @change="handleTypeChange" > @@ -331,22 +333,24 @@ watch( (val) => { msgType.value = MSG_TYPE[val]; - formData.value.provider = msgType.value[0].value; + formData.value.provider = + formData.value.provider !== ':id' + ? formData.value.provider + : msgType.value[0].value; - formData.value.configuration = - CONFIG_FIELD_MAP[val][formData.value.provider]; + // formData.value.configuration = + // CONFIG_FIELD_MAP[val][formData.value.provider]; - clearValid(); + // clearValid(); }, ); watch( () => formData.value.provider, (val) => { - formData.value.configuration = - CONFIG_FIELD_MAP[formData.value.type][val]; - - clearValid(); + // formData.value.configuration = + // CONFIG_FIELD_MAP[formData.value.type][val]; + // clearValid(); }, ); @@ -429,10 +433,31 @@ const getDetail = async () => { const res = await configApi.detail(route.params.id as string); // formData.value = res.result; Object.assign(formData.value, res.result); + // console.log('res.result: ', res.result); // console.log('formData.value: ', formData.value); }; getDetail(); +/** + * 通知方式改变 + */ +const handleTypeChange = () => { + setTimeout(() => { + formData.value.configuration = + CONFIG_FIELD_MAP[formData.value.type][formData.value.provider]; + // resetPublicFiles(); + }, 0); +}; + +/** + * 通知类型改变 + */ +const handleProviderChange = () => { + formData.value.configuration = + CONFIG_FIELD_MAP[formData.value.type][formData.value.provider]; + // resetPublicFiles(); +}; + /** * 表单提交 */ diff --git a/src/views/notice/Config/index.vue b/src/views/notice/Config/index.vue index 3615919c..139f9473 100644 --- a/src/views/notice/Config/index.vue +++ b/src/views/notice/Config/index.vue @@ -48,10 +48,10 @@ @@ -429,3 +429,9 @@ const getActions = ( } }; + diff --git a/src/views/notice/Template/index.vue b/src/views/notice/Template/index.vue index 4edb02b8..36f24c9f 100644 --- a/src/views/notice/Template/index.vue +++ b/src/views/notice/Template/index.vue @@ -51,6 +51,7 @@ :src=" getLogo(slotProps.type, slotProps.provider) " + class="logo" /> @@ -388,3 +389,10 @@ const getActions = ( return actions; }; + + diff --git a/src/views/rule-engine/Scene/Save/asstes.ts b/src/views/rule-engine/Scene/Save/asstes.ts new file mode 100644 index 00000000..6c42b67a --- /dev/null +++ b/src/views/rule-engine/Scene/Save/asstes.ts @@ -0,0 +1,14 @@ +import { getImage } from '@/utils/comm' + +export const TriggerHeaderIcon = { + time: getImage('/scene/trigger-type-icon/timing.png'), + manual: getImage('/scene/trigger-type-icon/manual.png'), + device: getImage('/scene/trigger-type-icon/device.png') +} + +export const TriggerListIcon = { + time: getImage('/scene/scene-timer.png'), + manual: getImage('/scene/scene-hand.png'), + device: getImage('/scene/scene-device.png') +} + diff --git a/src/views/rule-engine/Scene/Save/components/TriggerWay.vue b/src/views/rule-engine/Scene/Save/components/TriggerWay.vue new file mode 100644 index 00000000..51d4aa5f --- /dev/null +++ b/src/views/rule-engine/Scene/Save/components/TriggerWay.vue @@ -0,0 +1,119 @@ + + + + + \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/index.vue b/src/views/rule-engine/Scene/Save/index.vue index 593b1d44..61e300f5 100644 --- a/src/views/rule-engine/Scene/Save/index.vue +++ b/src/views/rule-engine/Scene/Save/index.vue @@ -1,13 +1,62 @@ - - \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/save.vue b/src/views/rule-engine/Scene/Save/save.vue new file mode 100644 index 00000000..ffb36c4f --- /dev/null +++ b/src/views/rule-engine/Scene/Save/save.vue @@ -0,0 +1,104 @@ + + + + + \ No newline at end of file diff --git a/src/views/rule-engine/Scene/index.vue b/src/views/rule-engine/Scene/index.vue index 71ae1f6c..e317f0ce 100644 --- a/src/views/rule-engine/Scene/index.vue +++ b/src/views/rule-engine/Scene/index.vue @@ -5,13 +5,24 @@ /> + > + + +