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 @@
+
+
+
+
+
{{ item.label }}
+
{{ item.tip}}
+
+
+
![]()
+
+
+
+
+
+
+
+
\ 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 @@
/>
+ >
+
+
+ 新增
+
+
+
+