Showing
9 changed files
with
208 additions
and
263 deletions
| ... | ... | @@ -15,10 +15,10 @@ export enum Number_Operation { | 
| 15 | 15 | export enum String_Operation { | 
| 16 | 16 | EQUAL = 'EQUAL', | 
| 17 | 17 | NOT_EQUAL = 'NOT_EQUAL', | 
| 18 | - BEGAN_IN = 'BEGAN_IN', | |
| 19 | - END_IN = 'END_IN', | |
| 20 | - INCLUDE = 'INCLUDE', | |
| 21 | - NOT_INCLUDE = 'NOT_INCLUDE', | |
| 18 | + BEGAN_IN = 'STARTS_WITH', | |
| 19 | + END_IN = 'ENDS_WITH', | |
| 20 | + INCLUDE = 'CONTAINS', | |
| 21 | + NOT_INCLUDE = 'NOT_CONTAINS', | |
| 22 | 22 | } | 
| 23 | 23 | |
| 24 | 24 | export enum Boolean_Operation { | ... | ... | 
| ... | ... | @@ -15,7 +15,8 @@ export interface selectionOptions { | 
| 15 | 15 | rowKey: string; | 
| 16 | 16 | clickToRowSelect: boolean; | 
| 17 | 17 | rowSelection: { | 
| 18 | - onChange: (selectedRowKeys: string[]) => void; | |
| 18 | + onSelect: (_, __, selectedRowKeys: string[]) => void; | |
| 19 | + getCheckboxProps: (record: Recordable) => void; | |
| 19 | 20 | type: 'radio' | 'checkbox'; | 
| 20 | 21 | }; | 
| 21 | 22 | } | 
| ... | ... | @@ -27,7 +28,8 @@ export const useBatchDelete = ( | 
| 27 | 28 | const selectedRowIds = ref<string[]>([]); | 
| 28 | 29 | const hasBatchDelete = computed(() => selectedRowIds.value.length <= 0); | 
| 29 | 30 | // 复选框事件 | 
| 30 | - const onSelectRowChange = (selectedRowKeys: string[]) => { | |
| 31 | + const onSelectRow = (_, __, selectedRows) => { | |
| 32 | + const selectedRowKeys = selectedRows.map((item) => item.id); | |
| 31 | 33 | selectedRowIds.value = selectedRowKeys; | 
| 32 | 34 | }; | 
| 33 | 35 | const handleDeleteOrBatchDelete = async (record: Recordable | null) => { | 
| ... | ... | @@ -41,19 +43,26 @@ export const useBatchDelete = ( | 
| 41 | 43 | try { | 
| 42 | 44 | await deleteFn(selectedRowIds.value); | 
| 43 | 45 | createMessage.success('批量删除成功'); | 
| 44 | - selectedRowIds.value = []; | |
| 46 | + console.log(selectedRowIds.value); | |
| 45 | 47 | handleSuccess(); | 
| 46 | - } catch (e) { | |
| 47 | - selectedRowIds.value = []; | |
| 48 | - } | |
| 48 | + } catch (e) {} | |
| 49 | + selectedRowIds.value = []; | |
| 49 | 50 | } | 
| 50 | 51 | }; | 
| 51 | 52 | const selectionOptions: selectionOptions = { | 
| 52 | 53 | rowKey: 'id', | 
| 53 | 54 | clickToRowSelect: false, | 
| 54 | 55 | rowSelection: { | 
| 55 | - onChange: onSelectRowChange, | |
| 56 | + onSelect: onSelectRow, | |
| 56 | 57 | type: 'checkbox', | 
| 58 | + getCheckboxProps(record: Recordable) { | |
| 59 | + // Demo:status为1的选择框禁用 | |
| 60 | + if (record.status === 1) { | |
| 61 | + return { disabled: true }; | |
| 62 | + } else { | |
| 63 | + return { disabled: false }; | |
| 64 | + } | |
| 65 | + }, | |
| 57 | 66 | }, | 
| 58 | 67 | }; | 
| 59 | 68 | return { hasBatchDelete, selectionOptions, handleDeleteOrBatchDelete }; | ... | ... | 
| ... | ... | @@ -17,11 +17,12 @@ | 
| 17 | 17 | <Divider orientation="left">触发器</Divider> | 
| 18 | 18 | <div> | 
| 19 | 19 | <template v-for="(item, index) in triggerData" :key="item"> | 
| 20 | - <Trigger | |
| 20 | + <TriggerOrCondition | |
| 21 | 21 | class="mt-4" | 
| 22 | - :triggerIndex="index" | |
| 22 | + title="触发器" | |
| 23 | + :index="index" | |
| 23 | 24 | :ref="skipUnwrap.triggerItemRefs" | 
| 24 | - @deleteTrigger="deleteTrigger" | |
| 25 | + @delete="deleteTriggerOrCondition" | |
| 25 | 26 | /> | 
| 26 | 27 | </template> | 
| 27 | 28 | <!-- 按钮 --> | 
| ... | ... | @@ -37,11 +38,12 @@ | 
| 37 | 38 | <Divider orientation="left">执行条件</Divider> | 
| 38 | 39 | <div> | 
| 39 | 40 | <template v-for="(item, index) in conditionData" :key="item"> | 
| 40 | - <Condition | |
| 41 | + <TriggerOrCondition | |
| 41 | 42 | class="mt-4" | 
| 42 | - :conditionIndex="index" | |
| 43 | + title="执行条件" | |
| 44 | + :index="index" | |
| 43 | 45 | :ref="skipUnwrap.conditionItemRefs" | 
| 44 | - @deleteCondition="deleteCondition" | |
| 46 | + @delete="deleteTriggerOrCondition" | |
| 45 | 47 | /> | 
| 46 | 48 | </template> | 
| 47 | 49 | <!-- 按钮 --> | 
| ... | ... | @@ -92,8 +94,7 @@ | 
| 92 | 94 | screenLinkPageByDeptIdGetDevice, | 
| 93 | 95 | getOrganizationAlarmConfig, | 
| 94 | 96 | } from '/@/api/ruleengine/ruleengineApi'; | 
| 95 | - import Trigger from './cpns/Trigger.vue'; | |
| 96 | - import Condition from './cpns/Condition.vue'; | |
| 97 | + import TriggerOrCondition from './cpns/Trigger-Condition.vue'; | |
| 97 | 98 | import Action from './cpns/Action.vue'; | 
| 98 | 99 | import { useUserStore } from '/@/store/modules/user'; | 
| 99 | 100 | import { findOperation } from './config/formatData.ts'; | 
| ... | ... | @@ -182,13 +183,17 @@ | 
| 182 | 183 | triggers.forEach((trigger, index) => { | 
| 183 | 184 | nextTick(async () => { | 
| 184 | 185 | unref(skipUnwrap.triggerItemRefs)[index].setFieldsFormValueFun({ | 
| 185 | - triggered: trigger.triggerCondition.condition.spec.type, | |
| 186 | - device: trigger.entityType, | |
| 187 | - triggerType: trigger.triggerType, | |
| 188 | - type1: trigger.triggerCondition?.condition.condition[0]?.key?.type, | |
| 189 | - type2: trigger.triggerCondition?.condition.condition[0]?.key?.key, | |
| 190 | - operationType: trigger.triggerCondition?.condition.condition[0].valueType, | |
| 191 | - detail: trigger.triggerCondition?.alarmDetails, | |
| 186 | + triggered: trigger?.triggerCondition?.condition?.spec?.type, | |
| 187 | + device: trigger?.entityType, | |
| 188 | + triggerType: trigger?.triggerType, | |
| 189 | + type1: trigger?.triggerCondition?.condition?.condition[0]?.key?.type, | |
| 190 | + type2: trigger?.triggerCondition?.condition?.condition[0]?.key?.key, | |
| 191 | + operationType: trigger?.triggerCondition?.condition?.condition[0]?.valueType, | |
| 192 | + detail: trigger?.triggerCondition?.alarmDetails, | |
| 193 | + entityId: trigger?.entityId, | |
| 194 | + replaceValue: trigger?.triggerCondition?.condition?.spec?.predicate?.defaultValue, | |
| 195 | + time: trigger?.triggerCondition?.condition?.spec?.predicate?.defaultValue, | |
| 196 | + timeUnit: trigger?.triggerCondition?.condition?.spec?.unit, | |
| 192 | 197 | }); | 
| 193 | 198 | // 设置值operationType | 
| 194 | 199 | unref(skipUnwrap.triggerItemRefs)[index].operationType = | 
| ... | ... | @@ -197,7 +202,6 @@ | 
| 197 | 202 | const ConditionScreeningForm = await unref(skipUnwrap.triggerItemRefs)[ | 
| 198 | 203 | index | 
| 199 | 204 | ].getRefItemConditionScreeningRefs(); | 
| 200 | - triggerData.value = [...new Array(triggers.length).keys()]; | |
| 201 | 205 | |
| 202 | 206 | // 设置对应条件筛选的个数 | 
| 203 | 207 | unref(skipUnwrap.triggerItemRefs)[index].setConditionScreeningList([ | 
| ... | ... | @@ -209,7 +213,7 @@ | 
| 209 | 213 | // 循环设置条件筛选值。TODO:此处设置顺序有问题 | 
| 210 | 214 | nextTick(() => { | 
| 211 | 215 | const richTextList = []; | 
| 212 | - trigger.triggerCondition.condition.condition.forEach(async (item, index) => { | |
| 216 | + trigger.triggerCondition.condition.condition.forEach((item, index) => { | |
| 213 | 217 | const formItem = { | 
| 214 | 218 | operation: item.predicate.operation, | 
| 215 | 219 | value: String(item.predicate.value.defaultValue), | 
| ... | ... | @@ -231,13 +235,17 @@ | 
| 231 | 235 | doConditions.forEach((condition, index) => { | 
| 232 | 236 | nextTick(async () => { | 
| 233 | 237 | unref(skipUnwrap.conditionItemRefs)[index].setFieldsFormValueFun({ | 
| 234 | - triggered: condition.triggerCondition.condition.spec.type, | |
| 235 | - device: condition.entityType, | |
| 236 | - triggerType: condition.triggerType, | |
| 237 | - type1: condition.triggerCondition?.condition.condition[0]?.key?.type, | |
| 238 | - type2: condition.triggerCondition?.condition.condition[0]?.key?.key, | |
| 239 | - operationType: condition.triggerCondition?.condition.condition[0].valueType, | |
| 240 | - detail: condition.triggerCondition?.alarmDetails, | |
| 238 | + triggered: condition?.triggerCondition?.condition?.spec?.type, | |
| 239 | + device: condition?.entityType, | |
| 240 | + triggerType: condition?.triggerType, | |
| 241 | + type1: condition?.triggerCondition?.condition?.condition[0]?.key?.type, | |
| 242 | + type2: condition?.triggerCondition?.condition?.condition[0]?.key?.key, | |
| 243 | + operationType: condition?.triggerCondition?.condition?.condition[0]?.valueType, | |
| 244 | + detail: condition?.triggerCondition?.alarmDetails, | |
| 245 | + entityId: condition?.entityId, | |
| 246 | + replaceValue: condition?.triggerCondition?.condition?.spec?.predicate?.defaultValue, | |
| 247 | + time: condition?.triggerCondition?.condition?.spec?.predicate?.defaultValue, | |
| 248 | + timeUnit: condition?.triggerCondition?.condition?.spec?.unit, | |
| 241 | 249 | }); | 
| 242 | 250 | // 设置值operationType | 
| 243 | 251 | unref(skipUnwrap.conditionItemRefs)[index].operationType = | 
| ... | ... | @@ -246,7 +254,6 @@ | 
| 246 | 254 | const ConditionScreeningForm = await unref(skipUnwrap.conditionItemRefs)[ | 
| 247 | 255 | index | 
| 248 | 256 | ].getRefItemConditionScreeningRefs(); | 
| 249 | - triggerData.value = [...new Array(condition.length).keys()]; | |
| 250 | 257 | |
| 251 | 258 | // 设置对应条件筛选的个数 | 
| 252 | 259 | unref(skipUnwrap.conditionItemRefs)[index].setConditionScreeningList([ | 
| ... | ... | @@ -258,7 +265,7 @@ | 
| 258 | 265 | // 循环设置条件筛选值。TODO:此处设置顺序有问题 | 
| 259 | 266 | nextTick(() => { | 
| 260 | 267 | const richTextList = []; | 
| 261 | - condition.triggerCondition.condition.condition.forEach(async (item, index) => { | |
| 268 | + condition.triggerCondition.condition.condition.forEach((item, index) => { | |
| 262 | 269 | const formItem = { | 
| 263 | 270 | operation: item.predicate.operation, | 
| 264 | 271 | value: String(item.predicate.value.defaultValue), | 
| ... | ... | @@ -292,14 +299,25 @@ | 
| 292 | 299 | unref(skipUnwrap.actionItemRefs)[index].checked = true; | 
| 293 | 300 | nextTick(async () => { | 
| 294 | 301 | unref(skipUnwrap.actionItemRefs)[index].clearAlarmRef.setFieldsFormValueFun({ | 
| 295 | - triggered: action.doContext?.clearRule?.triggerCondition?.condition.spec.type, | |
| 296 | - device: action.entityType, | |
| 297 | - triggerType: action.doContext?.clearRule.triggerType, | |
| 298 | - type1: action.doContext.clearRule.triggerCondition.condition.condition[0].key.type, | |
| 299 | - type2: action.doContext.clearRule.triggerCondition.condition.condition[0].key.key, | |
| 302 | + triggered: action.doContext?.clearRule?.triggerCondition?.condition?.spec?.type, | |
| 303 | + device: action?.entityType, | |
| 304 | + triggerType: action?.doContext?.clearRule?.triggerType, | |
| 305 | + type1: | |
| 306 | + action?.doContext?.clearRule?.triggerCondition?.condition?.condition[0]?.key | |
| 307 | + ?.type, | |
| 308 | + type2: | |
| 309 | + action?.doContext?.clearRule?.triggerCondition?.condition?.condition[0]?.key?.key, | |
| 300 | 310 | operationType: | 
| 301 | - action.doContext.clearRule.triggerCondition.condition.condition[0].valueType, | |
| 302 | - detail: action.doContext.clearRule.triggerCondition?.alarmDetails, | |
| 311 | + action?.doContext?.clearRule?.triggerCondition?.condition?.condition[0] | |
| 312 | + ?.valueType, | |
| 313 | + detail: action?.doContext?.clearRule?.triggerCondition?.alarmDetails, | |
| 314 | + entityId: action?.doContext?.clearRule?.entityId, | |
| 315 | + replaceValue: | |
| 316 | + action?.doContext?.clearRule?.triggerCondition?.condition?.spec?.predicate | |
| 317 | + ?.defaultValue, | |
| 318 | + time: action?.doContext?.clearRule?.triggerCondition?.condition?.spec?.predicate | |
| 319 | + ?.defaultValue, | |
| 320 | + timeUnit: action?.doContext?.clearRule?.triggerCondition?.condition?.spec?.unit, | |
| 303 | 321 | }); | 
| 304 | 322 | // 设置值operationType | 
| 305 | 323 | |
| ... | ... | @@ -309,7 +327,6 @@ | 
| 309 | 327 | const ConditionScreeningForm = await unref(skipUnwrap.actionItemRefs)[ | 
| 310 | 328 | index | 
| 311 | 329 | ].getRefItemConditionScreeningRefs(); | 
| 312 | - triggerData.value = [...new Array(action.length).keys()]; | |
| 313 | 330 | |
| 314 | 331 | // // 设置对应条件筛选的个数 | 
| 315 | 332 | unref(skipUnwrap.actionItemRefs)[index].setConditionScreeningList([ | 
| ... | ... | @@ -390,7 +407,6 @@ | 
| 390 | 407 | item.updateFieldDeviceId(deviceList); | 
| 391 | 408 | }); | 
| 392 | 409 | } | 
| 393 | - | |
| 394 | 410 | function setAlarmConfig(linkAge, isOrganizationChange = false) { | 
| 395 | 411 | unref(linkAge).map((item) => { | 
| 396 | 412 | isOrganizationChange && item.resetFieldsValueFunc(); | 
| ... | ... | @@ -463,11 +479,12 @@ | 
| 463 | 479 | }; | 
| 464 | 480 | const userStore = useUserStore(); | 
| 465 | 481 | // 删除 | 
| 466 | - const deleteTrigger = (triggerIndex: number) => { | |
| 467 | - unref(triggerData).splice(triggerIndex, 1); | |
| 468 | - }; | |
| 469 | - const deleteCondition = (conditionIndex: number) => { | |
| 470 | - unref(conditionData).splice(conditionIndex, 1); | |
| 482 | + const deleteTriggerOrCondition = ({ index, title }) => { | |
| 483 | + if (title === '触发器') { | |
| 484 | + unref(triggerData).splice(index, 1); | |
| 485 | + } else if (title === '执行条件') { | |
| 486 | + unref(conditionData).splice(index, 1); | |
| 487 | + } | |
| 471 | 488 | }; | 
| 472 | 489 | const deleteAction = ({ actionIndex, outTarget }) => { | 
| 473 | 490 | unref(actionData).splice(actionIndex, 1); | ... | ... | 
| ... | ... | @@ -182,10 +182,10 @@ export const searchFormSchema: FormSchema[] = [ | 
| 182 | 182 | ]; | 
| 183 | 183 | // 持续时间 | 
| 184 | 184 | const isTimeDuration = (type) => { | 
| 185 | - return type === 'timeDuration'; | |
| 185 | + return type === 'DURATION'; | |
| 186 | 186 | }; | 
| 187 | 187 | const isReplace = (type) => { | 
| 188 | - return type === 'replace'; | |
| 188 | + return type === 'REPEATING'; | |
| 189 | 189 | }; | 
| 190 | 190 | // 部分 | 
| 191 | 191 | const isPart = (type: string) => { | 
| ... | ... | @@ -201,8 +201,8 @@ export const trigger_condition_schema: FormSchema[] = [ | 
| 201 | 201 | placeholder: '请选择触发类型', | 
| 202 | 202 | options: [ | 
| 203 | 203 | { label: '简单', value: 'SIMPLE' }, | 
| 204 | - { label: '持续时长', value: 'timeDuration' }, | |
| 205 | - { label: '重复次数', value: 'replace' }, | |
| 204 | + { label: '持续时长', value: 'DURATION' }, | |
| 205 | + { label: '重复次数', value: 'REPEATING' }, | |
| 206 | 206 | ], | 
| 207 | 207 | }, | 
| 208 | 208 | colProps: { span: 6 }, | 
| ... | ... | @@ -235,21 +235,17 @@ export const trigger_condition_schema: FormSchema[] = [ | 
| 235 | 235 | field: 'time', | 
| 236 | 236 | label: '', | 
| 237 | 237 | component: 'Input', | 
| 238 | - componentProps: { | |
| 239 | - placeholder: '请输入持续时间', | |
| 240 | - }, | |
| 241 | 238 | ifShow: ({ values }) => isTimeDuration(values.triggered), | 
| 242 | 239 | colProps: { span: 6 }, | 
| 240 | + slot: 'time', | |
| 243 | 241 | }, | 
| 244 | 242 | { | 
| 245 | 243 | field: 'timeUnit', | 
| 246 | 244 | label: '', | 
| 247 | - component: 'Input', | |
| 248 | - componentProps: { | |
| 249 | - placeholder: '请输入持续时间单位', | |
| 250 | - }, | |
| 245 | + component: 'Select', | |
| 246 | + defaultValue: 'SECONDS', | |
| 251 | 247 | ifShow: ({ values }) => isTimeDuration(values.triggered), | 
| 252 | - colProps: { span: 6 }, | |
| 248 | + show: false, | |
| 253 | 249 | }, | 
| 254 | 250 | { | 
| 255 | 251 | field: 'replaceValue', | ... | ... | 
| 1 | 1 | import { formatToDateTime } from '/@/utils/dateUtil'; | 
| 2 | - | |
| 2 | +import { Number_Operation, String_Operation, Boolean_Operation } from '/@/enums/operationEnum'; | |
| 3 | 3 | // 生成触发器或执行条件JSON数据 | 
| 4 | 4 | export const genTriggerOrConditionData = (triggerData) => { | 
| 5 | 5 | const { | 
| ... | ... | @@ -13,7 +13,11 @@ export const genTriggerOrConditionData = (triggerData) => { | 
| 13 | 13 | operationType, | 
| 14 | 14 | triggered, | 
| 15 | 15 | schedule, | 
| 16 | + time, | |
| 17 | + timeUnit, | |
| 18 | + replaceValue, | |
| 16 | 19 | } = triggerData; | 
| 20 | + console.log(time, timeUnit, replaceValue); | |
| 17 | 21 | const mapPredicate = predicate?.map((item) => { | 
| 18 | 22 | return { | 
| 19 | 23 | key: { | 
| ... | ... | @@ -21,15 +25,15 @@ export const genTriggerOrConditionData = (triggerData) => { | 
| 21 | 25 | key: type2, | 
| 22 | 26 | }, | 
| 23 | 27 | valueType: operationType, | 
| 24 | - value: null, | |
| 28 | + // value: null, | |
| 25 | 29 | predicate: { | 
| 26 | 30 | type: operationType === 'DATE_TIME' ? 'NUMERIC' : operationType, | 
| 27 | 31 | operation: item.operation, | 
| 28 | 32 | value: { | 
| 29 | 33 | defaultValue: | 
| 30 | 34 | operationType === 'DATE_TIME' ? Number(formatToDateTime(item.value, 'x')) : item.value, | 
| 31 | - userValue: null, | |
| 32 | - dynamicValue: null, | |
| 35 | + // userValue: null, | |
| 36 | + // dynamicValue: null, | |
| 33 | 37 | }, | 
| 34 | 38 | }, | 
| 35 | 39 | }; | 
| ... | ... | @@ -44,12 +48,17 @@ export const genTriggerOrConditionData = (triggerData) => { | 
| 44 | 48 | condition: mapPredicate, | 
| 45 | 49 | spec: { | 
| 46 | 50 | type: triggered, | 
| 47 | - // unit: 'SECONDS', | |
| 48 | - // predicate: { | |
| 49 | - // defaultValue: 30, | |
| 50 | - // userValue: null, | |
| 51 | - // dynamicValue: null, | |
| 52 | - // }, | |
| 51 | + unit: triggered === 'DURATION' ? timeUnit : undefined, | |
| 52 | + predicate: { | |
| 53 | + defaultValue: | |
| 54 | + triggered === 'DURATION' | |
| 55 | + ? time | |
| 56 | + : triggered === 'REPEATING' | |
| 57 | + ? replaceValue | |
| 58 | + : undefined, | |
| 59 | + // userValue: null, | |
| 60 | + // dynamicValue: null, | |
| 61 | + }, | |
| 53 | 62 | }, | 
| 54 | 63 | }, | 
| 55 | 64 | schedule: { | 
| ... | ... | @@ -80,8 +89,10 @@ export const genActionData = (conditionData) => { | 
| 80 | 89 | schedule, | 
| 81 | 90 | entityId, | 
| 82 | 91 | deviceId, | 
| 83 | - checked, | |
| 92 | + time, | |
| 93 | + timeUnit, | |
| 84 | 94 | } = conditionData; | 
| 95 | + | |
| 85 | 96 | const mapPredicate = predicate?.map((item) => { | 
| 86 | 97 | return { | 
| 87 | 98 | key: { | 
| ... | ... | @@ -89,14 +100,14 @@ export const genActionData = (conditionData) => { | 
| 89 | 100 | key: type2, | 
| 90 | 101 | }, | 
| 91 | 102 | valueType: operationType, | 
| 92 | - value: null, | |
| 103 | + // value: null, | |
| 93 | 104 | predicate: { | 
| 94 | 105 | type: operationType, | 
| 95 | 106 | operation: item.operation, | 
| 96 | 107 | value: { | 
| 97 | 108 | defaultValue: item.value, | 
| 98 | - userValue: null, | |
| 99 | - dynamicValue: null, | |
| 109 | + // userValue: null, | |
| 110 | + // dynamicValue: null, | |
| 100 | 111 | }, | 
| 101 | 112 | }, | 
| 102 | 113 | }; | 
| ... | ... | @@ -106,8 +117,7 @@ export const genActionData = (conditionData) => { | 
| 106 | 117 | alarmProfileId: alarm_config, | 
| 107 | 118 | outTarget, | 
| 108 | 119 | entityType: device, | 
| 109 | - entityId: entityId?.length ? entityId : null, | |
| 110 | - deviceId, | |
| 120 | + deviceId: entityId?.length ? entityId : null, | |
| 111 | 121 | doContext: mapPredicate?.length | 
| 112 | 122 | ? { | 
| 113 | 123 | alarmLevel: alarm_level, | 
| ... | ... | @@ -119,12 +129,12 @@ export const genActionData = (conditionData) => { | 
| 119 | 129 | condition: mapPredicate, | 
| 120 | 130 | spec: { | 
| 121 | 131 | type: triggered, | 
| 122 | - // unit: 'SECONDS', | |
| 123 | - // predicate: { | |
| 124 | - // defaultValue: 30, | |
| 125 | - // userValue: null, | |
| 126 | - // dynamicValue: null, | |
| 127 | - // }, | |
| 132 | + unit: timeUnit, | |
| 133 | + predicate: { | |
| 134 | + defaultValue: time, | |
| 135 | + // userValue: null, | |
| 136 | + // dynamicValue: null, | |
| 137 | + }, | |
| 128 | 138 | }, | 
| 129 | 139 | }, | 
| 130 | 140 | schedule: { | 
| ... | ... | @@ -145,8 +155,6 @@ export const genActionData = (conditionData) => { | 
| 145 | 155 | ]; | 
| 146 | 156 | }; | 
| 147 | 157 | |
| 148 | -import { Number_Operation, String_Operation, Boolean_Operation } from '/@/enums/operationEnum'; | |
| 149 | - | |
| 150 | 158 | export const operationNumber_OR_TIME = [ | 
| 151 | 159 | { label: '等于', value: Number_Operation.EQUAL }, | 
| 152 | 160 | { label: '不等于', value: Number_Operation.NOT_EQUAL }, | ... | ... | 
| ... | ... | @@ -17,6 +17,17 @@ | 
| 17 | 17 | allowClear | 
| 18 | 18 | /> | 
| 19 | 19 | </template> | 
| 20 | + <template #time="{ model, field }"> | |
| 21 | + <Input v-model:value="model[field]" placeholder="请输入持续时间"> | |
| 22 | + <template #addonAfter> | |
| 23 | + <Select | |
| 24 | + v-model:value="model[`timeUnit`]" | |
| 25 | + :options="timeUnitOptions" | |
| 26 | + style="width: 60px" | |
| 27 | + /> | |
| 28 | + </template> | |
| 29 | + </Input> | |
| 30 | + </template> | |
| 20 | 31 | </BasicForm> | 
| 21 | 32 | <Card size="small" :bordered="false" style="border: 2px dashed #797979" v-if="operationType"> | 
| 22 | 33 | <ConditionScreening | 
| ... | ... | @@ -31,7 +42,7 @@ | 
| 31 | 42 | import { ref, provide } from 'vue'; | 
| 32 | 43 | import { CollapseContainer } from '/@/components/Container/index'; | 
| 33 | 44 | import { BasicForm, useForm } from '/@/components/Form/index'; | 
| 34 | - import { Radio, Card, Select } from 'ant-design-vue'; | |
| 45 | + import { Radio, Card, Select, Input } from 'ant-design-vue'; | |
| 35 | 46 | import { trigger_condition_schema } from '../config/config.data.ts'; | 
| 36 | 47 | import { getAttribute } from '/@/api/ruleengine/ruleengineApi'; | 
| 37 | 48 | import ConditionScreening from './ConditionScreening.vue'; | 
| ... | ... | @@ -103,6 +114,25 @@ | 
| 103 | 114 | value: 'DATE_TIME', | 
| 104 | 115 | }, | 
| 105 | 116 | ]; | 
| 117 | + | |
| 118 | + const timeUnitOptions = [ | |
| 119 | + { | |
| 120 | + label: '秒', | |
| 121 | + value: 'SECONDS', | |
| 122 | + }, | |
| 123 | + { | |
| 124 | + label: '分', | |
| 125 | + value: 'MINUTES', | |
| 126 | + }, | |
| 127 | + { | |
| 128 | + label: '时', | |
| 129 | + value: 'HOURS', | |
| 130 | + }, | |
| 131 | + { | |
| 132 | + label: '天', | |
| 133 | + value: 'DAYS', | |
| 134 | + }, | |
| 135 | + ]; | |
| 106 | 136 | const childGetFieldsValue = () => getFieldsValue(); | 
| 107 | 137 | provide('operationType', operationType); | 
| 108 | 138 | ... | ... | 
src/views/rule/linkedge/cpns/Trigger-Condition.vue
renamed from
src/views/rule/linkedge/cpns/condition.vue
| 1 | 1 | <template> | 
| 2 | 2 | <div> | 
| 3 | - <CollapseContainer style="background-color: #f2f2f2" :title="`执行条件${conditionIndex + 1}`"> | |
| 3 | + <CollapseContainer style="background-color: #f2f2f2" :title="`${title} ${index + 1}`"> | |
| 4 | 4 | <template #action> | 
| 5 | 5 | <div class="flex"> | 
| 6 | 6 | <div> | 
| 7 | 7 | <span class="mr-2">启用规则</span> | 
| 8 | - <RadioGroup v-model:value="schedule" :options="scheduleOptions" /> | |
| 8 | + <RadioGroup | |
| 9 | + v-model:value="schedule" | |
| 10 | + :options="scheduleOptions" | |
| 11 | + @change="handleRadioGroupChange" | |
| 12 | + /> | |
| 9 | 13 | </div> | 
| 10 | 14 | <Tooltip title="移除" class="ml-4"> | 
| 11 | 15 | <Icon | 
| 12 | 16 | icon="fluent:delete-off-20-regular" | 
| 13 | 17 | size="20" | 
| 14 | 18 | class="mr-2 cursor-pointer" | 
| 15 | - @click="handleDelete(conditionIndex)" | |
| 19 | + @click="handleDelete({ index, title })" | |
| 16 | 20 | /> | 
| 17 | 21 | </Tooltip> | 
| 18 | 22 | </div> | 
| ... | ... | @@ -27,6 +31,17 @@ | 
| 27 | 31 | allowClear | 
| 28 | 32 | /> | 
| 29 | 33 | </template> | 
| 34 | + <template #time="{ model, field }"> | |
| 35 | + <Input v-model:value="model[field]" placeholder="请输入持续时间"> | |
| 36 | + <template #addonAfter> | |
| 37 | + <Select | |
| 38 | + v-model:value="model[`timeUnit`]" | |
| 39 | + :options="timeUnitOptions" | |
| 40 | + style="width: 60px" | |
| 41 | + /> | |
| 42 | + </template> | |
| 43 | + </Input> | |
| 44 | + </template> | |
| 30 | 45 | </BasicForm> | 
| 31 | 46 | <Card size="small" :bordered="false" style="border: 2px dashed #797979" v-if="operationType"> | 
| 32 | 47 | <ConditionScreening | 
| ... | ... | @@ -42,19 +57,23 @@ | 
| 42 | 57 | import { CollapseContainer } from '/@/components/Container/index'; | 
| 43 | 58 | import { BasicForm, useForm } from '/@/components/Form/index'; | 
| 44 | 59 | import { Icon } from '/@/components/Icon'; | 
| 45 | - import { Tooltip, Radio, Card, Select } from 'ant-design-vue'; | |
| 60 | + import { Tooltip, Radio, Card, Select, Input } from 'ant-design-vue'; | |
| 46 | 61 | import { trigger_condition_schema } from '../config/config.data.ts'; | 
| 47 | 62 | import { getAttribute } from '/@/api/ruleengine/ruleengineApi'; | 
| 48 | 63 | import ConditionScreening from './ConditionScreening.vue'; | 
| 49 | 64 | const RadioGroup = Radio.Group; | 
| 50 | 65 | |
| 51 | 66 | defineProps({ | 
| 52 | - conditionIndex: { | |
| 67 | + title: { | |
| 68 | + type: String, | |
| 69 | + required: true, | |
| 70 | + }, | |
| 71 | + index: { | |
| 53 | 72 | type: Number, | 
| 54 | 73 | required: true, | 
| 55 | 74 | }, | 
| 56 | 75 | }); | 
| 57 | - const emit = defineEmits(['deleteCondition']); | |
| 76 | + const emit = defineEmits(['delete']); | |
| 58 | 77 | const conditionScreeningRef = ref(); | 
| 59 | 78 | const [registerForm, { resetFields, getFieldsValue, updateSchema, setFieldsValue }] = useForm({ | 
| 60 | 79 | schemas: trigger_condition_schema, | 
| ... | ... | @@ -104,8 +123,8 @@ | 
| 104 | 123 | }); | 
| 105 | 124 | }; | 
| 106 | 125 | |
| 107 | - const handleDelete = (triggerIndex) => { | |
| 108 | - emit('deleteCondition', triggerIndex); | |
| 126 | + const handleDelete = (params: { index: number; title: string }) => { | |
| 127 | + emit('delete', params); | |
| 109 | 128 | }; | 
| 110 | 129 | |
| 111 | 130 | const schedule = ref('ANY_TIME'); | 
| ... | ... | @@ -115,7 +134,24 @@ | 
| 115 | 134 | { label: '自定义启用', value: 'CUSTOM' }, | 
| 116 | 135 | ]; | 
| 117 | 136 | const operationType = ref<string>(''); | 
| 118 | - | |
| 137 | + const timeUnitOptions = [ | |
| 138 | + { | |
| 139 | + label: '秒', | |
| 140 | + value: 'SECONDS', | |
| 141 | + }, | |
| 142 | + { | |
| 143 | + label: '分', | |
| 144 | + value: 'MINUTES', | |
| 145 | + }, | |
| 146 | + { | |
| 147 | + label: '时', | |
| 148 | + value: 'HOURS', | |
| 149 | + }, | |
| 150 | + { | |
| 151 | + label: '天', | |
| 152 | + value: 'DAYS', | |
| 153 | + }, | |
| 154 | + ]; | |
| 119 | 155 | const options = [ | 
| 120 | 156 | { | 
| 121 | 157 | label: '数字', | 
| ... | ... | @@ -151,6 +187,17 @@ | 
| 151 | 187 | const setRichText = (list) => { | 
| 152 | 188 | conditionScreeningRef.value.otherAttribute = list; | 
| 153 | 189 | }; | 
| 190 | + | |
| 191 | + const handleRadioGroupChange = (e) => { | |
| 192 | + const { value } = e.target; | |
| 193 | + if (value === 'SPECIFIC_TIME') { | |
| 194 | + console.log('定时启用'); | |
| 195 | + // 定时启用 | |
| 196 | + } else if (value === 'CUSTOM') { | |
| 197 | + console.log('自定义启用'); | |
| 198 | + // 自定义启用 | |
| 199 | + } | |
| 200 | + }; | |
| 154 | 201 | defineExpose({ | 
| 155 | 202 | getFieldsValueFunc, | 
| 156 | 203 | updateFieldDeviceId, | ... | ... | 
src/views/rule/linkedge/cpns/trigger.vue
deleted
100644 → 0
| 1 | -<template> | |
| 2 | - <div> | |
| 3 | - <CollapseContainer style="background-color: #f2f2f2" :title="`触发器 ${triggerIndex + 1}`"> | |
| 4 | - <template #action> | |
| 5 | - <div class="flex"> | |
| 6 | - <div> | |
| 7 | - <span class="mr-2">启用规则</span> | |
| 8 | - <RadioGroup v-model:value="schedule" :options="scheduleOptions" /> | |
| 9 | - </div> | |
| 10 | - <Tooltip title="移除" class="ml-4"> | |
| 11 | - <Icon | |
| 12 | - icon="fluent:delete-off-20-regular" | |
| 13 | - size="20" | |
| 14 | - class="mr-2 cursor-pointer" | |
| 15 | - @click="handleDelete(triggerIndex)" | |
| 16 | - /> | |
| 17 | - </Tooltip> | |
| 18 | - </div> | |
| 19 | - </template> | |
| 20 | - <BasicForm @register="registerForm"> | |
| 21 | - <template #operationType="{ model, field }"> | |
| 22 | - <Select | |
| 23 | - :options="options" | |
| 24 | - v-model:value="model[field]" | |
| 25 | - @change="operationType = model[field]" | |
| 26 | - placeholder="请选择比较类型" | |
| 27 | - allowClear | |
| 28 | - /> | |
| 29 | - </template> | |
| 30 | - </BasicForm> | |
| 31 | - <Card size="small" :bordered="false" style="border: 2px dashed #797979" v-if="operationType"> | |
| 32 | - <ConditionScreening | |
| 33 | - :childGetFieldsValue="childGetFieldsValue" | |
| 34 | - ref="conditionScreeningRef" | |
| 35 | - /> | |
| 36 | - </Card> | |
| 37 | - </CollapseContainer> | |
| 38 | - </div> | |
| 39 | -</template> | |
| 40 | -<script lang="ts" setup> | |
| 41 | - import { ref, provide, nextTick } from 'vue'; | |
| 42 | - import { CollapseContainer } from '/@/components/Container/index'; | |
| 43 | - import { BasicForm, useForm } from '/@/components/Form/index'; | |
| 44 | - import { Icon } from '/@/components/Icon'; | |
| 45 | - import { Tooltip, Radio, Card, Select } from 'ant-design-vue'; | |
| 46 | - import { trigger_condition_schema } from '../config/config.data.ts'; | |
| 47 | - import { getAttribute } from '/@/api/ruleengine/ruleengineApi'; | |
| 48 | - import ConditionScreening from './ConditionScreening.vue'; | |
| 49 | - const RadioGroup = Radio.Group; | |
| 50 | - | |
| 51 | - defineProps({ | |
| 52 | - triggerIndex: { | |
| 53 | - type: Number, | |
| 54 | - required: true, | |
| 55 | - }, | |
| 56 | - }); | |
| 57 | - const emit = defineEmits(['deleteTrigger']); | |
| 58 | - const conditionScreeningRef = ref(); | |
| 59 | - const [registerForm, { resetFields, getFieldsValue, updateSchema, setFieldsValue }] = useForm({ | |
| 60 | - schemas: trigger_condition_schema, | |
| 61 | - showActionButtonGroup: false, | |
| 62 | - }); | |
| 63 | - | |
| 64 | - const getFieldsValueFunc = () => { | |
| 65 | - const predicate = conditionScreeningRef?.value?.refItem?.conditionScreeningRefs?.value?.map( | |
| 66 | - (item) => { | |
| 67 | - return item.getFieldsValue(); | |
| 68 | - } | |
| 69 | - ); | |
| 70 | - return { ...getFieldsValue(), predicate, schedule: schedule.value }; | |
| 71 | - }; | |
| 72 | - const updateFieldDeviceId = (deviceList: any[]) => { | |
| 73 | - updateSchema({ | |
| 74 | - field: 'entityId', | |
| 75 | - componentProps: { | |
| 76 | - options: deviceList, | |
| 77 | - onChange(e) { | |
| 78 | - if (e) { | |
| 79 | - updateFieldAttributeFunc(); | |
| 80 | - } | |
| 81 | - }, | |
| 82 | - }, | |
| 83 | - }); | |
| 84 | - }; | |
| 85 | - const resetFieldsValueFunc = () => resetFields(); | |
| 86 | - // 回显数据函数 | |
| 87 | - const setFieldsFormValueFun = (fieldsValue) => { | |
| 88 | - setFieldsValue(fieldsValue); | |
| 89 | - }; | |
| 90 | - const updateFieldAttributeFunc = async () => { | |
| 91 | - const data1 = await getAttribute(); | |
| 92 | - const options = data1.map((m) => { | |
| 93 | - return { | |
| 94 | - label: m, | |
| 95 | - value: m, | |
| 96 | - }; | |
| 97 | - }); | |
| 98 | - updateSchema({ | |
| 99 | - field: 'type2', | |
| 100 | - componentProps: { | |
| 101 | - placeholder: '请选择属性', | |
| 102 | - options, | |
| 103 | - }, | |
| 104 | - }); | |
| 105 | - }; | |
| 106 | - | |
| 107 | - const handleDelete = (triggerIndex) => { | |
| 108 | - emit('deleteTrigger', triggerIndex); | |
| 109 | - }; | |
| 110 | - | |
| 111 | - const schedule = ref('ANY_TIME'); | |
| 112 | - const scheduleOptions = [ | |
| 113 | - { label: '始终启用', value: 'ANY_TIME' }, | |
| 114 | - { label: '定时启用', value: 'SPECIFIC_TIME' }, | |
| 115 | - { label: '自定义启用', value: 'CUSTOM' }, | |
| 116 | - ]; | |
| 117 | - const operationType = ref<string>(''); | |
| 118 | - | |
| 119 | - const options = [ | |
| 120 | - { | |
| 121 | - label: '数字', | |
| 122 | - value: 'NUMERIC', | |
| 123 | - }, | |
| 124 | - { | |
| 125 | - label: '布尔值', | |
| 126 | - value: 'BOOLEAN', | |
| 127 | - }, | |
| 128 | - { | |
| 129 | - label: '字符串', | |
| 130 | - value: 'STRING', | |
| 131 | - }, | |
| 132 | - { | |
| 133 | - label: '时间', | |
| 134 | - value: 'DATE_TIME', | |
| 135 | - }, | |
| 136 | - ]; | |
| 137 | - // 子组件获取父组件的值 | |
| 138 | - const childGetFieldsValue = () => getFieldsValue(); | |
| 139 | - | |
| 140 | - provide('operationType', operationType); | |
| 141 | - | |
| 142 | - // 获取conditionScreeningForm的组件 | |
| 143 | - const getRefItemConditionScreeningRefs = async () => { | |
| 144 | - await nextTick(); | |
| 145 | - return conditionScreeningRef.value.refItem.conditionScreeningRefs; | |
| 146 | - }; | |
| 147 | - | |
| 148 | - const setConditionScreeningList = (list) => { | |
| 149 | - conditionScreeningRef.value.conditionScreeningList = list; | |
| 150 | - }; | |
| 151 | - const setRichText = (list) => { | |
| 152 | - conditionScreeningRef.value.otherAttribute = list; | |
| 153 | - }; | |
| 154 | - defineExpose({ | |
| 155 | - getFieldsValueFunc, | |
| 156 | - updateFieldDeviceId, | |
| 157 | - resetFieldsValueFunc, | |
| 158 | - setFieldsFormValueFun, | |
| 159 | - childGetFieldsValue, | |
| 160 | - operationType, | |
| 161 | - getRefItemConditionScreeningRefs, | |
| 162 | - setConditionScreeningList, | |
| 163 | - setRichText, | |
| 164 | - }); | |
| 165 | -</script> | 
| ... | ... | @@ -13,7 +13,6 @@ | 
| 13 | 13 | { | 
| 14 | 14 | label: '查看', | 
| 15 | 15 | icon: 'ant-design:eye-outlined', | 
| 16 | - ifShow: record.creator !== userId, | |
| 17 | 16 | onClick: handleView.bind(null, record), | 
| 18 | 17 | }, | 
| 19 | 18 | { | 
| ... | ... | @@ -65,6 +64,9 @@ | 
| 65 | 64 | screenLinkPageDeleteApi, | 
| 66 | 65 | handleSuccess | 
| 67 | 66 | ); | 
| 67 | + const handleLog = (log) => { | |
| 68 | + console.log(log); | |
| 69 | + }; | |
| 68 | 70 | const userInfo: any = getAuthCache(USER_INFO_KEY); | 
| 69 | 71 | const userId = userInfo.userId; | 
| 70 | 72 | const role: string = userInfo.roles[0]; | 
| ... | ... | @@ -125,6 +127,7 @@ | 
| 125 | 127 | authBtn, | 
| 126 | 128 | role, | 
| 127 | 129 | userId, | 
| 130 | + handleLog, | |
| 128 | 131 | }; | 
| 129 | 132 | }, | 
| 130 | 133 | }); | ... | ... |