Commit c64dd4e742f4eaf23e59a5653b6b12f167c1865d

Authored by ww
2 parents e832e1f8 3c344ce5

chore: merge code && resolve conflict

@@ -46,7 +46,7 @@ @@ -46,7 +46,7 @@
46 }, 46 },
47 ]); 47 ]);
48 const getLogo = computed(() => { 48 const getLogo = computed(() => {
49 - return userStore.platInfo?.logo; 49 + return userStore.platInfo?.background;
50 }); 50 });
51 const getTitle = computed(() => { 51 const getTitle = computed(() => {
52 // 设置icon 52 // 设置icon
@@ -69,10 +69,13 @@ export function checkStatus( @@ -69,10 +69,13 @@ export function checkStatus(
69 } 69 }
70 70
71 if (errMessage) { 71 if (errMessage) {
72 - if (errorMessageMode === 'modal') {  
73 - createErrorModal({ title: t('sys.api.errorTip'), content: errMessage });  
74 - } else if (errorMessageMode === 'message') { 72 + if (errorMessageMode === 'message') {
75 error({ content: errMessage, key: `global_error_message_status_${status}` }); 73 error({ content: errMessage, key: `global_error_message_status_${status}` });
76 } 74 }
  75 + // if (errorMessageMode === 'modal') {
  76 + // createErrorModal({ title: t('sys.api.errorTip'), content: errMessage });
  77 + // } else if (errorMessageMode === 'message') {
  78 + // error({ content: errMessage, key: `global_error_message_status_${status}` });
  79 + // }
77 } 80 }
78 } 81 }
@@ -4,6 +4,35 @@ import { Rule } from 'ant-design-vue/lib/form/interface'; @@ -4,6 +4,35 @@ import { Rule } from 'ant-design-vue/lib/form/interface';
4 * 4 *
5 */ 5 */
6 6
  7 +//正整数并且可以是英文
  8 +export const numberAndEngLishRule: Rule[] = [
  9 + {
  10 + validator: (_, value: string) => {
  11 + const reg1 = /^[0-9]*[1-9][0-9]*$/;
  12 + const reg2 = /^[A-Za-z0-9]+$/;
  13 + if (!reg1.test(value) && !reg2.test(value)) {
  14 + return Promise.reject('不能为负数');
  15 + }
  16 + return Promise.resolve();
  17 + },
  18 + validateTrigger: 'blur',
  19 + },
  20 +];
  21 +
  22 +//数字和非负数
  23 +export const numberAndNonegativeRule: Rule[] = [
  24 + {
  25 + validator: (_, value: string) => {
  26 + const reg = /^[+]{0,1}(\d+)$|^[+]{0,1}(\d+\.\d+)$/;
  27 + if (!reg.test(value)) {
  28 + return Promise.reject('不能为负数或者不能输入非数字');
  29 + }
  30 + return Promise.resolve();
  31 + },
  32 + validateTrigger: 'blur',
  33 + },
  34 +];
  35 +
7 // 数字验证 36 // 数字验证
8 export const numberRule: Rule[] = [ 37 export const numberRule: Rule[] = [
9 { 38 {
1 <script lang="ts" setup> 1 <script lang="ts" setup>
2 - import icon from '../assets/command.svg'; 2 + import icon from '/src/assets/icons/command.svg';
3 3
4 const props = defineProps<{ 4 const props = defineProps<{
5 value?: boolean; 5 value?: boolean;
@@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
8 <div class="flex" style="align-items: center"> 8 <div class="flex" style="align-items: center">
9 <div>设备信息</div> 9 <div>设备信息</div>
10 <Tooltip 10 <Tooltip
11 - title="帮助" 11 + title="复制或查看设备topic"
12 @click="openTopicModal" 12 @click="openTopicModal"
13 placement="right" 13 placement="right"
14 v-if="deviceDetail.deviceType !== DeviceTypeEnum.SENSOR" 14 v-if="deviceDetail.deviceType !== DeviceTypeEnum.SENSOR"
@@ -10,7 +10,9 @@ @@ -10,7 +10,9 @@
10 baseColProps: { 10 baseColProps: {
11 span: 5, 11 span: 5,
12 }, 12 },
13 - fieldMapToTime: [[SchemaFiled.DATE_RANGE, [SchemaFiled.START_TS, SchemaFiled.END_TS]]], 13 + fieldMapToTime: [
  14 + [SchemaFiled.DATE_RANGE, [SchemaFiled.START_TS, SchemaFiled.END_TS], 'YYYY-MM-DD HH:mm:ss'],
  15 + ],
14 }); 16 });
15 onMounted(() => { 17 onMounted(() => {
16 emit('register', method); 18 emit('register', method);
1 -import { Moment } from 'moment'; 1 +import moment, { Moment } from 'moment';
2 import { getPacketIntervalByRange, getPacketIntervalByValue, intervalOption } from './helper'; 2 import { getPacketIntervalByRange, getPacketIntervalByValue, intervalOption } from './helper';
3 import { FormSchema } from '/@/components/Form'; 3 import { FormSchema } from '/@/components/Form';
4 import { ColEx } from '/@/components/Form/src/types'; 4 import { ColEx } from '/@/components/Form/src/types';
@@ -86,7 +86,9 @@ export const defaultSchemas: FormSchema[] = [ @@ -86,7 +86,9 @@ export const defaultSchemas: FormSchema[] = [
86 const { setFieldsValue } = formActionType; 86 const { setFieldsValue } = formActionType;
87 let dates: Moment[] = []; 87 let dates: Moment[] = [];
88 return { 88 return {
89 - showTime: true, 89 + showTime: {
  90 + defaultValue: [moment('00:00:00', 'HH:mm:ss'), moment('23:59:59', 'HH:mm:ss')],
  91 + },
90 onCalendarChange(value: Moment[]) { 92 onCalendarChange(value: Moment[]) {
91 dates = value; 93 dates = value;
92 }, 94 },
@@ -112,7 +112,7 @@ @@ -112,7 +112,7 @@
112 const wrapRef = ref<HTMLDivElement | null>(null); 112 const wrapRef = ref<HTMLDivElement | null>(null);
113 const chartRef = ref<HTMLDivElement | null>(null); 113 const chartRef = ref<HTMLDivElement | null>(null);
114 const deviceAttrs = ref<string[]>([]); 114 const deviceAttrs = ref<string[]>([]);
115 - const { setOptions, getInstance, resize } = useECharts(chartRef as Ref<HTMLDivElement>); 115 + const { setOptions, getInstance } = useECharts(chartRef as Ref<HTMLDivElement>);
116 const isNull = ref(true); 116 const isNull = ref(true);
117 const { toPromise } = useScript({ src: BAI_DU_MAP_URL }); 117 const { toPromise } = useScript({ src: BAI_DU_MAP_URL });
118 const [registerDetailDrawer, { openDrawer }] = useDrawer(); 118 const [registerDetailDrawer, { openDrawer }] = useDrawer();
@@ -141,9 +141,25 @@ @@ -141,9 +141,25 @@
141 const BMap = (window as any).BMap; 141 const BMap = (window as any).BMap;
142 if (!wrapEl) return; 142 if (!wrapEl) return;
143 const map = new BMap.Map(wrapEl); 143 const map = new BMap.Map(wrapEl);
144 - const point = new BMap.Point(104.04666605565338, 30.543516387560476);  
145 - map.centerAndZoom(point, 15);  
146 - map.enableScrollWheelZoom(true); 144 +
  145 + const getLocation = new BMap.Geolocation();
  146 + getLocation.getCurrentPosition((position) => {
  147 + if (position) {
  148 + let preMarker = null;
  149 + const point = new BMap.Point(position.point.lng, position.point.lat);
  150 + let marker = new BMap.Marker(point, { size: 30 });
  151 + if (marker) {
  152 + map.removeOverlay(preMarker);
  153 + }
  154 + map.addOverlay(marker);
  155 + map.centerAndZoom(point, 15);
  156 + map.enableScrollWheelZoom(true);
  157 + } else {
  158 + const point = new BMap.Point(104.04666605565338, 30.543516387560476);
  159 + map.centerAndZoom(point, 15);
  160 + map.enableScrollWheelZoom(true);
  161 + }
  162 + });
147 } 163 }
148 // 点击表格某一行触发 164 // 点击表格某一行触发
149 const deviceRowClick = async (record) => { 165 const deviceRowClick = async (record) => {
@@ -254,7 +270,6 @@ @@ -254,7 +270,6 @@
254 // 发送请求 270 // 发送请求
255 loading.value = true; 271 loading.value = true;
256 const res = await getDeviceHistoryInfo(searchParams); 272 const res = await getDeviceHistoryInfo(searchParams);
257 - loading.value = false;  
258 // 判断数据对象是否为空 273 // 判断数据对象是否为空
259 if (!Object.keys(res).length) { 274 if (!Object.keys(res).length) {
260 isNull.value = false; 275 isNull.value = false;
@@ -263,6 +278,7 @@ @@ -263,6 +278,7 @@
263 isNull.value = true; 278 isNull.value = true;
264 } 279 }
265 setChartOptions(res, value.keys); 280 setChartOptions(res, value.keys);
  281 + loading.value = false;
266 }, 282 },
267 }); 283 });
268 284
@@ -316,7 +332,6 @@ @@ -316,7 +332,6 @@
316 startTs: Date.now() - 1 * 24 * 60 * 60 * 1000, 332 startTs: Date.now() - 1 * 24 * 60 * 60 * 1000,
317 endTs: Date.now(), 333 endTs: Date.now(),
318 agg: AggregateDataEnum.NONE, 334 agg: AggregateDataEnum.NONE,
319 - limit: 7,  
320 }); 335 });
321 336
322 // 判断对象是否为空 337 // 判断对象是否为空
@@ -356,7 +371,6 @@ @@ -356,7 +371,6 @@
356 data: dataArray.filter((item1) => item1[2] === item), 371 data: dataArray.filter((item1) => item1[2] === item),
357 }; 372 };
358 }); 373 });
359 - resize();  
360 // 设置数据 374 // 设置数据
361 setOptions(eChartOptions(series, keys)); 375 setOptions(eChartOptions(series, keys));
362 } 376 }
@@ -403,10 +417,12 @@ @@ -403,10 +417,12 @@
403 <style scoped lang="less"> 417 <style scoped lang="less">
404 .wrapper { 418 .wrapper {
405 position: relative; 419 position: relative;
  420 +
406 :deep(.BMap_shadow) { 421 :deep(.BMap_shadow) {
407 display: none; 422 display: none;
408 } 423 }
409 } 424 }
  425 +
410 .right-wrap { 426 .right-wrap {
411 padding-top: 10px; 427 padding-top: 10px;
412 width: 28%; 428 width: 28%;
1 <template> 1 <template>
2 <div> 2 <div>
3 - <BasicModal  
4 - v-bind="$attrs"  
5 - width="55rem"  
6 - @register="register"  
7 - :title="getTitle"  
8 - @ok="handleSubmit"  
9 - @cancel="handleCancel"  
10 - :showOkBtn="isShowOkBtnFalse"  
11 - > 3 + <BasicModal v-bind="$attrs" width="55rem" @register="register" :title="getTitle" @ok="handleSubmit"
  4 + @cancel="handleCancel" :showOkBtn="isShowOkBtnFalse">
12 <div class="step-form-form"> 5 <div class="step-form-form">
13 <a-steps :current="current"> 6 <a-steps :current="current">
14 <a-step title="设备配置" /> 7 <a-step title="设备配置" />
@@ -18,281 +11,289 @@ @@ -18,281 +11,289 @@
18 <div class="mt-5"> 11 <div class="mt-5">
19 <!-- 设备配置 --> 12 <!-- 设备配置 -->
20 <div v-show="current === 0"> 13 <div v-show="current === 0">
21 - <DeviceProfileStep1 ref="DeviceProfileStep1Ref" @next="handleStepNext1"  
22 - /></div> 14 + <DeviceProfileStep1 ref="DeviceProfileStep1Ref" @next="handleStepNext1" />
  15 + </div>
23 <!-- 设备配置 --> 16 <!-- 设备配置 -->
24 <!-- 传输配置 --> 17 <!-- 传输配置 -->
25 <div v-show="current === 1"> 18 <div v-show="current === 1">
26 - <DeviceProfileStep2 ref="DeviceProfileStep2Ref" @prev="handleStepPrev"  
27 - /></div> 19 + <DeviceProfileStep2 ref="DeviceProfileStep2Ref" @prev="handleStepPrev" />
  20 + </div>
28 <!-- 传输配置 --> 21 <!-- 传输配置 -->
29 </div> 22 </div>
30 </BasicModal> 23 </BasicModal>
31 </div> 24 </div>
32 </template> 25 </template>
33 <script lang="ts"> 26 <script lang="ts">
34 - import {  
35 - defineComponent,  
36 - nextTick,  
37 - ref,  
38 - computed,  
39 - unref,  
40 - getCurrentInstance,  
41 - reactive,  
42 - } from 'vue';  
43 - import { BasicModal, useModalInner } from '/@/components/Modal';  
44 - import DeviceProfileStep1 from '/@/views/device/profiles/step/DeviceProfileStep1.vue';  
45 - import DeviceProfileStep2 from '/@/views/device/profiles/step/DeviceProfileStep2.vue';  
46 - import { Steps } from 'ant-design-vue';  
47 - import { deviceConfigAddOrEdit, deviceConfigGetDetail } from '/@/api/device/deviceConfigApi';  
48 - import { useMessage } from '/@/hooks/web/useMessage'; 27 +import {
  28 + defineComponent,
  29 + nextTick,
  30 + ref,
  31 + computed,
  32 + unref,
  33 + getCurrentInstance,
  34 + reactive,
  35 +} from 'vue';
  36 +import { BasicModal, useModalInner } from '/@/components/Modal';
  37 +import DeviceProfileStep1 from '/@/views/device/profiles/step/DeviceProfileStep1.vue';
  38 +import DeviceProfileStep2 from '/@/views/device/profiles/step/DeviceProfileStep2.vue';
  39 +import { Steps } from 'ant-design-vue';
  40 +import { deviceConfigAddOrEdit, deviceConfigGetDetail } from '/@/api/device/deviceConfigApi';
  41 +import { useMessage } from '/@/hooks/web/useMessage';
  42 +
  43 +export default defineComponent({
  44 + name: 'DeviceModal',
  45 + components: {
  46 + BasicModal,
  47 + DeviceProfileStep1,
  48 + DeviceProfileStep2,
  49 + [Steps.name]: Steps,
  50 + [Steps.Step.name]: Steps.Step,
  51 + },
  52 + props: {
  53 + userData: { type: Object },
  54 + },
  55 + emits: ['success', 'register', 'handleStepPrev', 'handleStep3Next', 'handleRedo'],
  56 + setup(_, { emit }) {
  57 + const { proxy } = getCurrentInstance() as any;
  58 + const DeviceProfileStep1Ref = ref(null);
  59 + const DeviceProfileStep2Ref = ref(null);
  60 + const { createMessage } = useMessage();
  61 + let postDeviceConfogData: any = reactive({});
  62 + let getStepOneData: any = reactive({});
  63 + let getStepTwoData: any = reactive({});
  64 + const editData: any = ref({});
  65 + const postEditId = ref('');
  66 + const createTime = ref('');
  67 + const current = ref(0);
  68 + const isUpdate = ref(0);
  69 + const isShowOkBtnFalse = ref(true);
  70 + const isNextStatus = ref(false);
  71 + let transportTypeObj = reactive({
  72 + transportType: '',
  73 + });
  74 + let profileDataObj: any = reactive({
  75 + profileData: null,
  76 + });
  77 + let isEdit = ref(true);
  78 + let noEditObj: any = reactive({});
  79 + const getTitle = computed(() =>
  80 + isUpdate.value == 1 ? '新增设备配置' : isUpdate.value == 2 ? '编辑设备配置' : '设备配置详情'
  81 + );
  82 + const editTransportType = ref('');
  83 + const getViewTitle = computed(() => (!unref(isShowOkBtnFalse) ? '设备配置详情' : ''));
  84 + const [register, { closeModal }] = useModalInner(async (data) => {
  85 + isUpdate.value = data.isUpdate;
  86 + if (isUpdate.value == 1) {
  87 + handleCancel();
  88 + isShowOkBtnFalse.value = true;
  89 + current.value = 0;
  90 + isEdit.value = false;
  91 + proxy.$refs.DeviceProfileStep1Ref.editOrAddNameStatus(false)
  92 + } else if (isUpdate.value == 2) {
  93 + isEdit.value = true;
  94 + handleCancel();
  95 + isShowOkBtnFalse.value = true;
  96 + current.value = 0;
  97 + postEditId.value = data.record.id;
  98 + createTime.value = data.record.createTime;
  99 + editTransportType.value = data.record.transportType;
  100 + editData.value = await deviceConfigGetDetail(postEditId.value);
  101 + proxy.$refs.DeviceProfileStep1Ref.setStepOneFieldsValueFunc({
  102 + name: editData.value.name,
  103 + defaultRuleChainId: editData.value.defaultRuleChainId,
  104 + defaultQueueName: editData.value.defaultQueueName,
  105 + description: editData.value.description,
  106 + image: editData.value.image,
  107 + });
  108 + if (editData.value.default) {
  109 + proxy.$refs.DeviceProfileStep1Ref.editOrAddNameStatus(true)
  110 +
  111 + } else {
  112 + proxy.$refs.DeviceProfileStep1Ref.editOrAddNameStatus(false)
49 113
50 - export default defineComponent({  
51 - name: 'DeviceModal',  
52 - components: {  
53 - BasicModal,  
54 - DeviceProfileStep1,  
55 - DeviceProfileStep2,  
56 - [Steps.name]: Steps,  
57 - [Steps.Step.name]: Steps.Step,  
58 - },  
59 - props: {  
60 - userData: { type: Object },  
61 - },  
62 - emits: ['success', 'register', 'handleStepPrev', 'handleStep3Next', 'handleRedo'],  
63 - setup(_, { emit }) {  
64 - const { proxy } = getCurrentInstance() as any;  
65 - const DeviceProfileStep1Ref = ref(null);  
66 - const DeviceProfileStep2Ref = ref(null);  
67 - const { createMessage } = useMessage();  
68 - let postDeviceConfogData: any = reactive({});  
69 - let getStepOneData: any = reactive({});  
70 - let getStepTwoData: any = reactive({});  
71 - const editData: any = ref({});  
72 - const postEditId = ref('');  
73 - const createTime = ref('');  
74 - const current = ref(0);  
75 - const isUpdate = ref(0);  
76 - const isShowOkBtnFalse = ref(true);  
77 - const isNextStatus = ref(false);  
78 - let transportTypeObj = reactive({  
79 - transportType: '',  
80 - });  
81 - let profileDataObj: any = reactive({  
82 - profileData: null,  
83 - });  
84 - let isEdit = ref(true);  
85 - let noEditObj: any = reactive({});  
86 - const getTitle = computed(() =>  
87 - isUpdate.value == 1 ? '新增设备配置' : isUpdate.value == 2 ? '编辑设备配置' : '设备配置详情'  
88 - );  
89 - const editTransportType = ref('');  
90 - const getViewTitle = computed(() => (!unref(isShowOkBtnFalse) ? '设备配置详情' : ''));  
91 - const [register, { closeModal }] = useModalInner(async (data) => {  
92 - isUpdate.value = data.isUpdate;  
93 - if (isUpdate.value == 1) {  
94 - handleCancel();  
95 - isShowOkBtnFalse.value = true;  
96 - current.value = 0;  
97 - isEdit.value = false;  
98 - } else if (isUpdate.value == 2) {  
99 - isEdit.value = true;  
100 - handleCancel();  
101 - isShowOkBtnFalse.value = true;  
102 - current.value = 0;  
103 - postEditId.value = data.record.id;  
104 - createTime.value = data.record.createTime;  
105 - editTransportType.value = data.record.transportType;  
106 - editData.value = await deviceConfigGetDetail(postEditId.value);  
107 - proxy.$refs.DeviceProfileStep1Ref.setStepOneFieldsValueFunc({  
108 - name: editData.value.name,  
109 - defaultRuleChainId: editData.value.defaultRuleChainId,  
110 - defaultQueueName: editData.value.defaultQueueName,  
111 - description: editData.value.description,  
112 - image: editData.value.image,  
113 - });  
114 - noEditObj = {  
115 - id: editData.value.id,  
116 - name: editData.value?.name,  
117 - createTime: createTime.value,  
118 - transportType: editTransportType.value,  
119 - type: editData.value?.type,  
120 - profileData: editData.value?.profileData,  
121 - defaultQueueName: editData.value.defaultQueueName,  
122 - image: editData.value.image,  
123 - defaultRuleChainId: editData.value.defaultRuleChainId,  
124 - description: editData.value.description,  
125 - tenantId: editData.value.tenantId,  
126 - };  
127 - } else if (isUpdate.value == 3) {  
128 - handleCancel();  
129 - isShowOkBtnFalse.value = false;  
130 - current.value = 0;  
131 - postEditId.value = data.record.id;  
132 - createTime.value = data.record.createTime;  
133 - editData.value = await deviceConfigGetDetail(postEditId.value);  
134 - proxy.$refs.DeviceProfileStep1Ref.setStepOneFieldsValueFunc({  
135 - name: editData.value.name,  
136 - defaultRuleChainId: editData.value.defaultRuleChainId,  
137 - defaultQueueName: editData.value.defaultQueueName,  
138 - description: editData.value.description,  
139 - image: editData.value.image,  
140 - });  
141 - }  
142 - });  
143 - function handleStepPrev() {  
144 - current.value--;  
145 - if (isUpdate.value == 2) {  
146 - isEdit.value = true;  
147 - noEditObj = {  
148 - id: editData.value.id,  
149 - name: editData.value?.name,  
150 - createTime: createTime.value,  
151 - transportType: editTransportType.value,  
152 - type: editData.value?.type,  
153 - profileData: editData.value?.profileData,  
154 - defaultQueueName: editData.value.defaultQueueName,  
155 - image: editData.value.image,  
156 - defaultRuleChainId: editData.value.defaultRuleChainId,  
157 - description: editData.value.description,  
158 - tenantId: editData.value.tenantId,  
159 - };  
160 - nextTick(async () => {  
161 - let getPic = null;  
162 - const getStep1Obj = await proxy.$refs.DeviceProfileStep1Ref?.getStep1Func();  
163 - getPic = getStep1Obj.icon;  
164 - Object.assign(noEditObj, { image: getPic }, getStep1Obj.key);  
165 - });  
166 - }  
167 - }  
168 - //第一步  
169 - function handleStepNext1(v, v1) {  
170 - isNextStatus.value = true;  
171 - if (isNextStatus.value) {  
172 - getStepOneData = {  
173 - ...v,  
174 - ...{ image: v1 },  
175 - };  
176 - }  
177 - current.value++;  
178 - if (isUpdate.value == 2) {  
179 - isEdit.value = false;  
180 - proxy.$refs.DeviceProfileStep2Ref?.setStepTwoFieldsValueFunc(editData.value);  
181 - } else if (isUpdate.value == 3) {  
182 - proxy.$refs.DeviceProfileStep2Ref?.setStepTwoFieldsValueFunc(editData.value);  
183 } 114 }
  115 + noEditObj = {
  116 + id: editData.value.id,
  117 + name: editData.value?.name,
  118 + createTime: createTime.value,
  119 + transportType: editTransportType.value,
  120 + type: editData.value?.type,
  121 + profileData: editData.value?.profileData,
  122 + defaultQueueName: editData.value.defaultQueueName,
  123 + image: editData.value.image,
  124 + defaultRuleChainId: editData.value.defaultRuleChainId,
  125 + description: editData.value.description,
  126 + tenantId: editData.value.tenantId,
  127 + };
  128 + } else if (isUpdate.value == 3) {
  129 + handleCancel();
  130 + isShowOkBtnFalse.value = false;
  131 + current.value = 0;
  132 + postEditId.value = data.record.id;
  133 + createTime.value = data.record.createTime;
  134 + editData.value = await deviceConfigGetDetail(postEditId.value);
  135 + proxy.$refs.DeviceProfileStep1Ref.setStepOneFieldsValueFunc({
  136 + name: editData.value.name,
  137 + defaultRuleChainId: editData.value.defaultRuleChainId,
  138 + defaultQueueName: editData.value.defaultQueueName,
  139 + description: editData.value.description,
  140 + image: editData.value.image,
  141 + });
184 } 142 }
185 - const handleSubmit = async () => {  
186 - let getPic = null;  
187 - getStepTwoData = await proxy.$refs.DeviceProfileStep2Ref?.getStep2DataFunc();  
188 - profileDataObj.profileData = getStepTwoData;  
189 - transportTypeObj.transportType = getStepTwoData?.transportConfiguration?.transportType;  
190 - delete profileDataObj?.profileData?.transportConfiguration?.transportType;  
191 - //没有点击下一步  
192 - if (!isNextStatus.value) { 143 + });
  144 + function handleStepPrev() {
  145 + current.value--;
  146 + if (isUpdate.value == 2) {
  147 + isEdit.value = true;
  148 + noEditObj = {
  149 + id: editData.value.id,
  150 + name: editData.value?.name,
  151 + createTime: createTime.value,
  152 + transportType: editTransportType.value,
  153 + type: editData.value?.type,
  154 + profileData: editData.value?.profileData,
  155 + defaultQueueName: editData.value.defaultQueueName,
  156 + image: editData.value.image,
  157 + defaultRuleChainId: editData.value.defaultRuleChainId,
  158 + description: editData.value.description,
  159 + tenantId: editData.value.tenantId,
  160 + };
  161 + nextTick(async () => {
  162 + let getPic = null;
193 const getStep1Obj = await proxy.$refs.DeviceProfileStep1Ref?.getStep1Func(); 163 const getStep1Obj = await proxy.$refs.DeviceProfileStep1Ref?.getStep1Func();
194 getPic = getStep1Obj.icon; 164 getPic = getStep1Obj.icon;
195 - getStepOneData = {  
196 - ...getStep1Obj.key,  
197 - ...{ image: getPic },  
198 - };  
199 Object.assign(noEditObj, { image: getPic }, getStep1Obj.key); 165 Object.assign(noEditObj, { image: getPic }, getStep1Obj.key);
200 - }  
201 - const id = isUpdate.value == 1 ? '' : postEditId.value;  
202 - const createTimePost = isUpdate.value == 1 ? {} : { createTime: createTime.value };  
203 -  
204 - if (Object.keys(getStepTwoData?.transportConfiguration).length == 0) {  
205 - profileDataObj.profileData = null;  
206 - }  
207 - postDeviceConfogData = {  
208 - ...getStepOneData,  
209 - ...profileDataObj,  
210 - ...transportTypeObj,  
211 - id,  
212 - ...createTimePost, 166 + });
  167 + }
  168 + }
  169 + //第一步
  170 + function handleStepNext1(v, v1) {
  171 + isNextStatus.value = true;
  172 + if (isNextStatus.value) {
  173 + getStepOneData = {
  174 + ...v,
  175 + ...{ image: v1 },
213 }; 176 };
214 - if (isUpdate.value == 1) {  
215 - delete postDeviceConfogData.id;  
216 - }  
217 - let isMappingsKey = ref(false);  
218 - let isMappingValue = ref(false);  
219 - let isQueryings = ref(false);  
220 - let isOIDRepet = ref(false);  
221 - postDeviceConfogData?.profileData?.transportConfiguration?.communicationConfigs?.forEach(  
222 - (f: any) => {  
223 - if (f.spec == 'TELEMETRY_QUERYING' || f.spec == 'CLIENT_ATTRIBUTES_QUERYING') {  
224 - if (f.queryingFrequencyMs == null) {  
225 - isQueryings.value = true;  
226 - return createMessage.error('请填写查询频率');  
227 - } else {  
228 - isQueryings.value = false;  
229 - }  
230 - }  
231 - if (f.mappings.length == 0) {  
232 - isMappingsKey.value = true;  
233 - isMappingValue.value = true; 177 + }
  178 + current.value++;
  179 + if (isUpdate.value == 2) {
  180 + isEdit.value = false;
  181 + proxy.$refs.DeviceProfileStep2Ref?.setStepTwoFieldsValueFunc(editData.value);
  182 + } else if (isUpdate.value == 3) {
  183 + proxy.$refs.DeviceProfileStep2Ref?.setStepTwoFieldsValueFunc(editData.value);
  184 + }
  185 + }
  186 + const handleSubmit = async () => {
  187 + let getPic = null;
  188 + getStepTwoData = await proxy.$refs.DeviceProfileStep2Ref?.getStep2DataFunc();
  189 + profileDataObj.profileData = getStepTwoData;
  190 + transportTypeObj.transportType = getStepTwoData?.transportConfiguration?.transportType;
  191 + delete profileDataObj?.profileData?.transportConfiguration?.transportType;
  192 + //没有点击下一步
  193 + if (!isNextStatus.value) {
  194 + const getStep1Obj = await proxy.$refs.DeviceProfileStep1Ref?.getStep1Func();
  195 + getPic = getStep1Obj.icon;
  196 + getStepOneData = {
  197 + ...getStep1Obj.key,
  198 + ...{ image: getPic },
  199 + };
  200 + Object.assign(noEditObj, { image: getPic }, getStep1Obj.key);
  201 + }
  202 + const id = isUpdate.value == 1 ? '' : postEditId.value;
  203 + const createTimePost = isUpdate.value == 1 ? {} : { createTime: createTime.value };
  204 +
  205 + if (Object.keys(getStepTwoData?.transportConfiguration).length == 0) {
  206 + profileDataObj.profileData = null;
  207 + }
  208 + postDeviceConfogData = {
  209 + ...getStepOneData,
  210 + ...profileDataObj,
  211 + ...transportTypeObj,
  212 + id,
  213 + ...createTimePost,
  214 + };
  215 + if (isUpdate.value == 1) {
  216 + delete postDeviceConfogData.id;
  217 + }
  218 + let isMappingsKey = ref(false);
  219 + let isMappingValue = ref(false);
  220 + let isQueryings = ref(false);
  221 + let isOIDRepet = ref(false);
  222 + postDeviceConfogData?.profileData?.transportConfiguration?.communicationConfigs?.forEach(
  223 + (f: any) => {
  224 + if (f.spec == 'TELEMETRY_QUERYING' || f.spec == 'CLIENT_ATTRIBUTES_QUERYING') {
  225 + if (f.queryingFrequencyMs == null) {
  226 + isQueryings.value = true;
  227 + return createMessage.error('请填写查询频率');
234 } else { 228 } else {
235 - f.mappings.forEach((f1) => {  
236 - const findNoneKey = Object.keys(f1).includes('');  
237 - if (findNoneKey) {  
238 - isMappingsKey.value = true;  
239 - }  
240 - });  
241 - f.mappings.forEach((f2) => {  
242 - const findNoneVal = Object.values(f2).includes('');  
243 - if (findNoneVal) {  
244 - isMappingValue.value = true;  
245 - }  
246 - });  
247 - //新增OID不能重复=====同一层级的OID不能重复  
248 - f.mappings.forEach((item, _) => {  
249 - if (f.mappings.some((citem) => citem !== item && citem.oid === item.oid)) {  
250 - isOIDRepet.value = true;  
251 - }  
252 - }); 229 + isQueryings.value = false;
253 } 230 }
254 } 231 }
255 - );  
256 - if (isQueryings.value) return createMessage.error('请填写查询频率');  
257 - if (isMappingsKey.value) return createMessage.error('请填写Date key和OID');  
258 - if (isMappingValue.value) return createMessage.error('请填写Date key和OID');  
259 - if (isOIDRepet.value) return createMessage.error('OID不能重复');  
260 - deviceConfigAddOrEdit(isEdit.value ? noEditObj : postDeviceConfogData)  
261 - .then((res) => {  
262 - if (!res) return;  
263 - createMessage.success(isUpdate.value == 1 ? '新增' + '成功' : '编辑' + '成功');  
264 - closeModal();  
265 - emit('success');  
266 - isNextStatus.value = false;  
267 - })  
268 - .catch((e) => {  
269 - createMessage.error(e);  
270 - });  
271 - };  
272 - const handleCancel = () => {  
273 - nextTick(() => {  
274 - proxy.$refs.DeviceProfileStep1Ref?.customResetStepOneFunc();  
275 - proxy.$refs.DeviceProfileStep2Ref?.customClearStepTwoValueFunc(); 232 + if (f.mappings.length == 0) {
  233 + isMappingsKey.value = true;
  234 + isMappingValue.value = true;
  235 + } else {
  236 + f.mappings.forEach((f1) => {
  237 + const findNoneKey = Object.keys(f1).includes('');
  238 + if (findNoneKey) {
  239 + isMappingsKey.value = true;
  240 + }
  241 + });
  242 + f.mappings.forEach((f2) => {
  243 + const findNoneVal = Object.values(f2).includes('');
  244 + if (findNoneVal) {
  245 + isMappingValue.value = true;
  246 + }
  247 + });
  248 + //新增OID不能重复=====同一层级的OID不能重复
  249 + f.mappings.forEach((item, _) => {
  250 + if (f.mappings.some((citem) => citem !== item && citem.oid === item.oid)) {
  251 + isOIDRepet.value = true;
  252 + }
  253 + });
  254 + }
  255 + }
  256 + );
  257 + if (isQueryings.value) return createMessage.error('请填写查询频率');
  258 + if (isMappingsKey.value) return createMessage.error('请填写Date key和OID');
  259 + if (isMappingValue.value) return createMessage.error('请填写Date key和OID');
  260 + if (isOIDRepet.value) return createMessage.error('OID不能重复');
  261 + deviceConfigAddOrEdit(isEdit.value ? noEditObj : postDeviceConfogData)
  262 + .then((res) => {
  263 + if (!res) return;
  264 + createMessage.success(isUpdate.value == 1 ? '新增' + '成功' : '编辑' + '成功');
  265 + closeModal();
  266 + emit('success');
  267 + isNextStatus.value = false;
  268 + })
  269 + .catch((e) => {
  270 + // createMessage.error(e);
276 }); 271 });
277 - };  
278 - function handleRedo() {  
279 - current.value = 0;  
280 - }  
281 - return {  
282 - isShowOkBtnFalse,  
283 - DeviceProfileStep2Ref,  
284 - DeviceProfileStep1Ref,  
285 - editData,  
286 - handleSubmit,  
287 - handleCancel,  
288 - register,  
289 - getTitle,  
290 - getViewTitle,  
291 - current,  
292 - handleStepPrev,  
293 - handleStepNext1,  
294 - handleRedo,  
295 - };  
296 - },  
297 - }); 272 + };
  273 + const handleCancel = () => {
  274 + nextTick(() => {
  275 + proxy.$refs.DeviceProfileStep1Ref?.customResetStepOneFunc();
  276 + proxy.$refs.DeviceProfileStep2Ref?.customClearStepTwoValueFunc();
  277 + });
  278 + };
  279 + function handleRedo() {
  280 + current.value = 0;
  281 + }
  282 + return {
  283 + isShowOkBtnFalse,
  284 + DeviceProfileStep2Ref,
  285 + DeviceProfileStep1Ref,
  286 + editData,
  287 + handleSubmit,
  288 + handleCancel,
  289 + register,
  290 + getTitle,
  291 + getViewTitle,
  292 + current,
  293 + handleStepPrev,
  294 + handleStepNext1,
  295 + handleRedo,
  296 + };
  297 + },
  298 +});
298 </script> 299 </script>
@@ -4,21 +4,9 @@ @@ -4,21 +4,9 @@
4 <div> 4 <div>
5 <BasicForm @register="register"> 5 <BasicForm @register="register">
6 <template #imageSelect> 6 <template #imageSelect>
7 - <Upload  
8 - style="width: 20vw"  
9 - name="avatar"  
10 - list-type="picture-card"  
11 - class="avatar-uploader"  
12 - :show-upload-list="false"  
13 - :customRequest="customUploadqrcodePic"  
14 - :before-upload="beforeUploadqrcodePic"  
15 - >  
16 - <img  
17 - v-if="peresonalPic"  
18 - :src="peresonalPic"  
19 - alt="avatar"  
20 - style="width: 6.25rem; height: 6.25rem"  
21 - /> 7 + <Upload style="width: 20vw" name="avatar" list-type="picture-card" class="avatar-uploader"
  8 + :show-upload-list="false" :customRequest="customUploadqrcodePic" :before-upload="beforeUploadqrcodePic">
  9 + <img v-if="peresonalPic" :src="peresonalPic" alt="avatar" style="width: 6.25rem; height: 6.25rem" />
22 <div v-else> 10 <div v-else>
23 <LoadingOutlined v-if="loading" /> 11 <LoadingOutlined v-if="loading" />
24 <PlusOutlined v-else /> 12 <PlusOutlined v-else />
@@ -32,154 +20,161 @@ @@ -32,154 +20,161 @@
32 </div> 20 </div>
33 </template> 21 </template>
34 <script lang="ts"> 22 <script lang="ts">
35 - import { defineComponent, ref } from 'vue';  
36 - import { BasicForm, useForm } from '/@/components/Form';  
37 - import { step1Schemas } from './data';  
38 - import { Select, Input, Divider } from 'ant-design-vue';  
39 - import { uploadApi } from '/@/api/personal/index';  
40 - import { Upload } from 'ant-design-vue';  
41 - import { PlusOutlined, LoadingOutlined } from '@ant-design/icons-vue';  
42 - import { useMessage } from '/@/hooks/web/useMessage';  
43 - import type { FileItem } from '/@/components/Upload/src/typing'; 23 +import { defineComponent, ref } from 'vue';
  24 +import { BasicForm, useForm } from '/@/components/Form';
  25 +import { step1Schemas } from './data';
  26 +import { Select, Input, Divider } from 'ant-design-vue';
  27 +import { uploadApi } from '/@/api/personal/index';
  28 +import { Upload } from 'ant-design-vue';
  29 +import { PlusOutlined, LoadingOutlined } from '@ant-design/icons-vue';
  30 +import { useMessage } from '/@/hooks/web/useMessage';
  31 +import type { FileItem } from '/@/components/Upload/src/typing';
44 32
45 - export default defineComponent({  
46 - components: {  
47 - BasicForm,  
48 - [Select.name]: Select,  
49 - [Input.name]: Input,  
50 - [Input.Group.name]: Input.Group,  
51 - [Divider.name]: Divider,  
52 - Upload,  
53 - PlusOutlined,  
54 - LoadingOutlined,  
55 - },  
56 - emits: ['next', 'resetFunc', 'register'],  
57 - setup(_, { emit }) {  
58 - const loading = ref(false); 33 +export default defineComponent({
  34 + components: {
  35 + BasicForm,
  36 + [Select.name]: Select,
  37 + [Input.name]: Input,
  38 + [Input.Group.name]: Input.Group,
  39 + [Divider.name]: Divider,
  40 + Upload,
  41 + PlusOutlined,
  42 + LoadingOutlined,
  43 + },
  44 + emits: ['next', 'resetFunc', 'register'],
  45 + setup(_, { emit }) {
  46 + const loading = ref(false);
59 47
60 - const { createMessage } = useMessage();  
61 - const peresonalPic = ref(''); 48 + const { createMessage } = useMessage();
  49 + const peresonalPic = ref('');
62 50
63 - const [register, { validate, setFieldsValue, resetFields }] = useForm({  
64 - labelWidth: 100,  
65 - schemas: step1Schemas,  
66 - actionColOptions: {  
67 - span: 14,  
68 - },  
69 - showResetButton: false,  
70 - submitButtonOptions: {  
71 - text: '下一步',  
72 - },  
73 - submitFunc: customSubmitFunc,  
74 - });  
75 - //回显数据  
76 - const setStepOneFieldsValueFunc = (v) => {  
77 - setFieldsValue(v);  
78 - peresonalPic.value = v.image;  
79 - };  
80 - const customUploadqrcodePic = async ({ file }) => {  
81 - if (beforeUploadqrcodePic(file)) {  
82 - peresonalPic.value = '';  
83 - loading.value = true;  
84 - const formData = new FormData();  
85 - formData.append('file', file);  
86 - const response = await uploadApi(formData);  
87 - if (response.fileStaticUri) {  
88 - peresonalPic.value = response.fileStaticUri;  
89 - loading.value = false;  
90 - }  
91 - }  
92 - };  
93 - const beforeUploadqrcodePic = (file: FileItem) => {  
94 - const isJpgOrPng =  
95 - file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/jpg';  
96 - if (!isJpgOrPng) {  
97 - createMessage.error('只能上传图片文件!');  
98 - }  
99 - const isLt2M = (file.size as number) / 1024 / 1024 < 5;  
100 - if (!isLt2M) {  
101 - createMessage.error('图片大小不能超过5MB!');  
102 - }  
103 - return isJpgOrPng && isLt2M;  
104 - };  
105 -  
106 - async function customSubmitFunc() {  
107 - const values = await validate();  
108 - emit('next', values, peresonalPic.value); 51 + const [register, { validate, setFieldsValue, resetFields, updateSchema }] = useForm({
  52 + labelWidth: 100,
  53 + schemas: step1Schemas,
  54 + actionColOptions: {
  55 + span: 14,
  56 + },
  57 + showResetButton: false,
  58 + submitButtonOptions: {
  59 + text: '下一步',
  60 + },
  61 + submitFunc: customSubmitFunc,
  62 + });
  63 + const editOrAddNameStatus = (nameStatus) => updateSchema({
  64 + field: 'name', componentProps: {
  65 + disabled: nameStatus
109 } 66 }
110 - //清空数据  
111 - const customResetStepOneFunc = () => {  
112 - resetFields(); 67 + })
  68 + //回显数据
  69 + const setStepOneFieldsValueFunc = (v) => {
  70 + setFieldsValue(v);
  71 + peresonalPic.value = v.image;
  72 + };
  73 + const customUploadqrcodePic = async ({ file }) => {
  74 + if (beforeUploadqrcodePic(file)) {
113 peresonalPic.value = ''; 75 peresonalPic.value = '';
114 - };  
115 - const getStep1Func = async () => {  
116 - const valueStep1 = await validate();  
117 - const pic = peresonalPic.value;  
118 - return {  
119 - key: valueStep1,  
120 - icon: pic,  
121 - };  
122 - }; 76 + loading.value = true;
  77 + const formData = new FormData();
  78 + formData.append('file', file);
  79 + const response = await uploadApi(formData);
  80 + if (response.fileStaticUri) {
  81 + peresonalPic.value = response.fileStaticUri;
  82 + loading.value = false;
  83 + }
  84 + }
  85 + };
  86 + const beforeUploadqrcodePic = (file: FileItem) => {
  87 + const isJpgOrPng =
  88 + file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/jpg';
  89 + if (!isJpgOrPng) {
  90 + createMessage.error('只能上传图片文件!');
  91 + }
  92 + const isLt2M = (file.size as number) / 1024 / 1024 < 5;
  93 + if (!isLt2M) {
  94 + createMessage.error('图片大小不能超过5MB!');
  95 + }
  96 + return isJpgOrPng && isLt2M;
  97 + };
  98 +
  99 + async function customSubmitFunc() {
  100 + const values = await validate();
  101 + emit('next', values, peresonalPic.value);
  102 + }
  103 + //清空数据
  104 + const customResetStepOneFunc = () => {
  105 + resetFields();
  106 + peresonalPic.value = '';
  107 + };
  108 + const getStep1Func = async () => {
  109 + const valueStep1 = await validate();
  110 + const pic = peresonalPic.value;
123 return { 111 return {
124 - register,  
125 - setStepOneFieldsValueFunc,  
126 - customResetStepOneFunc,  
127 - uploadApi,  
128 - peresonalPic,  
129 - beforeUploadqrcodePic,  
130 - customUploadqrcodePic,  
131 - getStep1Func,  
132 - loading, 112 + key: valueStep1,
  113 + icon: pic,
133 }; 114 };
134 - },  
135 - }); 115 + };
  116 + return {
  117 + register,
  118 + setStepOneFieldsValueFunc,
  119 + customResetStepOneFunc,
  120 + uploadApi,
  121 + peresonalPic,
  122 + beforeUploadqrcodePic,
  123 + customUploadqrcodePic,
  124 + getStep1Func,
  125 + loading,
  126 + editOrAddNameStatus
  127 + };
  128 + },
  129 +});
136 </script> 130 </script>
137 <style lang="less" scoped> 131 <style lang="less" scoped>
138 - .step1 {  
139 - &-form {  
140 - width: 500px;  
141 - margin: 0 auto;  
142 - }  
143 -  
144 - h3 {  
145 - margin: 0 0 12px;  
146 - font-size: 16px;  
147 - line-height: 32px;  
148 - color: @text-color;  
149 - } 132 +.step1 {
  133 + &-form {
  134 + width: 500px;
  135 + margin: 0 auto;
  136 + }
150 137
151 - h4 {  
152 - margin: 0 0 4px;  
153 - font-size: 14px;  
154 - line-height: 22px;  
155 - color: @text-color;  
156 - } 138 + h3 {
  139 + margin: 0 0 12px;
  140 + font-size: 16px;
  141 + line-height: 32px;
  142 + color: @text-color;
  143 + }
157 144
158 - p {  
159 - color: @text-color;  
160 - }  
161 - .device-icon-style {  
162 - :deep .ant-upload-select-picture-card {  
163 - display: inherit;  
164 - float: none;  
165 - width: 4.9vw;  
166 - height: 9.5vh;  
167 - margin-right: 8px;  
168 - text-align: center;  
169 - vertical-align: top;  
170 - background-color: #fafafa;  
171 - border: 1px dashed #d9d9d9;  
172 - cursor: pointer;  
173 - transition: border-color 0.3s ease;  
174 - }  
175 - } 145 + h4 {
  146 + margin: 0 0 4px;
  147 + font-size: 14px;
  148 + line-height: 22px;
  149 + color: @text-color;
176 } 150 }
177 151
178 - .pay-select {  
179 - width: 20%; 152 + p {
  153 + color: @text-color;
180 } 154 }
181 155
182 - .pay-input {  
183 - width: 70%; 156 + .device-icon-style {
  157 + :deep .ant-upload-select-picture-card {
  158 + display: inherit;
  159 + float: none;
  160 + width: 4.9vw;
  161 + height: 9.5vh;
  162 + margin-right: 8px;
  163 + text-align: center;
  164 + vertical-align: top;
  165 + background-color: #fafafa;
  166 + border: 1px dashed #d9d9d9;
  167 + cursor: pointer;
  168 + transition: border-color 0.3s ease;
  169 + }
184 } 170 }
  171 +}
  172 +
  173 +.pay-select {
  174 + width: 20%;
  175 +}
  176 +
  177 +.pay-input {
  178 + width: 70%;
  179 +}
185 </style> 180 </style>
@@ -4,7 +4,7 @@ import { findDictItemByCode } from '/@/api/system/dict'; @@ -4,7 +4,7 @@ import { findDictItemByCode } from '/@/api/system/dict';
4 4
5 export const step1Schemas: FormSchema[] = [ 5 export const step1Schemas: FormSchema[] = [
6 { 6 {
7 - field: 'name', 7 + field: 'image',
8 label: '上传图片', 8 label: '上传图片',
9 component: 'Input', 9 component: 'Input',
10 slot: 'imageSelect', 10 slot: 'imageSelect',
@@ -14,9 +14,12 @@ export const step1Schemas: FormSchema[] = [ @@ -14,9 +14,12 @@ export const step1Schemas: FormSchema[] = [
14 label: '配置名称', 14 label: '配置名称',
15 required: true, 15 required: true,
16 component: 'Input', 16 component: 'Input',
17 - componentProps: {  
18 - maxLength: 255,  
19 - placeholder: '请输入配置名称', 17 + componentProps() {
  18 + return {
  19 + disabled: false,
  20 + ength: 255,
  21 + placeholder: '请输入配置名称',
  22 + };
20 }, 23 },
21 }, 24 },
22 { 25 {
@@ -36,11 +36,6 @@ export const columns: BasicColumn[] = [ @@ -36,11 +36,6 @@ export const columns: BasicColumn[] = [
36 width: 160, 36 width: 160,
37 }, 37 },
38 { 38 {
39 - title: '备注',  
40 - dataIndex: 'remark',  
41 - width: 160,  
42 - },  
43 - {  
44 title: '发送时间', 39 title: '发送时间',
45 dataIndex: 'sendTime', 40 dataIndex: 'sendTime',
46 width: 180, 41 width: 180,
@@ -36,11 +36,6 @@ export const columns: BasicColumn[] = [ @@ -36,11 +36,6 @@ export const columns: BasicColumn[] = [
36 }, 36 },
37 }, 37 },
38 { 38 {
39 - title: '备注',  
40 - dataIndex: 'remark',  
41 - width: 160,  
42 - },  
43 - {  
44 title: '发送时间', 39 title: '发送时间',
45 dataIndex: 'sendTime', 40 dataIndex: 'sendTime',
46 width: 160, 41 width: 160,
@@ -54,7 +54,7 @@ export const columns: BasicColumn[] = [ @@ -54,7 +54,7 @@ export const columns: BasicColumn[] = [
54 title: '配置状态', 54 title: '配置状态',
55 dataIndex: 'status', 55 dataIndex: 'status',
56 width: 120, 56 width: 120,
57 - slots: { customRender: 'status' }, 57 + slots: { customRender: 'configStatus' },
58 }, 58 },
59 { 59 {
60 title: '执行方式', 60 title: '执行方式',
@@ -431,30 +431,6 @@ export const formSchema: QFormSchema[] = [ @@ -431,30 +431,6 @@ export const formSchema: QFormSchema[] = [
431 defaultValue: [moment('00:00:00', 'HH:mm:ss'), moment('23:59:59', 'HH:mm:ss')], 431 defaultValue: [moment('00:00:00', 'HH:mm:ss'), moment('23:59:59', 'HH:mm:ss')],
432 }, 432 },
433 }, 433 },
434 - // componentProps({ formActionType }) {  
435 - // const { setFieldsValue } = formActionType;  
436 - // let dates: Moment[] = [];  
437 - // return {  
438 - // placeholder: ['请选择开始时间', '请选择结束时间'],  
439 - // showTime: {  
440 - // defaultValue: [moment('00:00:00', 'HH:mm:ss'), moment('23:59:59', 'HH:mm:ss')],  
441 - // },  
442 - // // onCalendarChange(value: Moment[]) {  
443 - // // dates = value;  
444 - // // },  
445 - // // disabledDate(current: Moment) {  
446 - // // if (!dates || dates.length === 0 || !current) {  
447 - // // return false;  
448 - // // }  
449 - // // const diffDate = current.diff(dates[0], 'years', true);  
450 - // // return Math.abs(diffDate) > 1;  
451 - // // },  
452 - // onChange() {  
453 - // dates = [];  
454 - // setFieldsValue({ [SchemaFiled.INTERVAL]: null });  
455 - // },  
456 - // };  
457 - // },  
458 colProps: { 434 colProps: {
459 span: 10, 435 span: 10,
460 }, 436 },
@@ -29,7 +29,7 @@ @@ -29,7 +29,7 @@
29 :actions="[ 29 :actions="[
30 { 30 {
31 label: '查看', 31 label: '查看',
32 - icon: 'clarity:note-edit-line', 32 + icon: 'ant-design:eye-outlined',
33 onClick: handleViewDetail.bind(null, record), 33 onClick: handleViewDetail.bind(null, record),
34 ifShow: record.status === 1, 34 ifShow: record.status === 1,
35 }, 35 },
@@ -54,7 +54,7 @@ @@ -54,7 +54,7 @@
54 ]" 54 ]"
55 /> 55 />
56 </template> 56 </template>
57 - <template #status="{ record }"> 57 + <template #configStatus="{ record }">
58 <Switch 58 <Switch
59 :disabled="disabledSwitch" 59 :disabled="disabledSwitch"
60 :checked="record.status === 1" 60 :checked="record.status === 1"
@@ -92,7 +92,7 @@ @@ -92,7 +92,7 @@
92 const searchInfo = reactive<Recordable>({}); 92 const searchInfo = reactive<Recordable>({});
93 const disabledSwitch = ref(false); 93 const disabledSwitch = ref(false);
94 94
95 - const [registerTable, { reload, setProps }] = useTable({ 95 + const [registerTable, { reload, setProps, setSelectedRowKeys }] = useTable({
96 title: '报表列表', 96 title: '报表列表',
97 api: reportPage, 97 api: reportPage,
98 columns, 98 columns,
@@ -125,11 +125,8 @@ @@ -125,11 +125,8 @@
125 reload(); 125 reload();
126 }; 126 };
127 127
128 - const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions } = useBatchDelete(  
129 - deleteReportManage,  
130 - handleSuccess,  
131 - setProps  
132 - ); 128 + const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions, resetSelectedRowKeys } =
  129 + useBatchDelete(deleteReportManage, handleSuccess, setProps);
133 selectionOptions.rowSelection.getCheckboxProps = (record: Recordable) => { 130 selectionOptions.rowSelection.getCheckboxProps = (record: Recordable) => {
134 // Demo:status为1的选择框禁用 131 // Demo:status为1的选择框禁用
135 if (record.status === 1) { 132 if (record.status === 1) {
@@ -181,6 +178,8 @@ @@ -181,6 +178,8 @@
181 setProps({ 178 setProps({
182 loading: true, 179 loading: true,
183 }); 180 });
  181 + setSelectedRowKeys([]);
  182 + resetSelectedRowKeys();
184 disabledSwitch.value = true; 183 disabledSwitch.value = true;
185 const newStatus = checked ? 1 : 0; 184 const newStatus = checked ? 1 : 0;
186 const res = await putReportByidAndStatusManage(record.id, newStatus); 185 const res = await putReportByidAndStatusManage(record.id, newStatus);
@@ -108,8 +108,7 @@ @@ -108,8 +108,7 @@
108 let myOption = { 108 let myOption = {
109 title: { 109 title: {
110 text: `${item.attr}趋势图`, 110 text: `${item.attr}趋势图`,
111 - subtext: `${item.attr}`,  
112 - left: 'left', 111 + left: 'center',
113 }, 112 },
114 tooltip: { 113 tooltip: {
115 trigger: 'axis', 114 trigger: 'axis',
@@ -296,6 +296,7 @@ @@ -296,6 +296,7 @@
296 return createMessage.error('请填写属性'); 296 return createMessage.error('请填写属性');
297 } 297 }
298 } 298 }
  299 + Object.assign(noEditObj, getTypeObj);
299 const res = await postAddConvertApi(isEdit.value ? noEditObj : allPostForm); 300 const res = await postAddConvertApi(isEdit.value ? noEditObj : allPostForm);
300 if (res) { 301 if (res) {
301 closeModal(); 302 closeModal();
1 <template> 1 <template>
2 <div> 2 <div>
3 - <BasicDrawer  
4 - v-bind="$attrs"  
5 - @register="registerDrawer"  
6 - @ok="handleSubmit"  
7 - width="50%"  
8 - showFooter  
9 - @close="handleClose"  
10 - :title="title"  
11 - > 3 + <BasicDrawer v-bind="$attrs" @register="registerDrawer" @ok="handleSubmit" width="50%" showFooter
  4 + @close="handleClose" :title="title">
12 <div> 5 <div>
13 <!-- 基础表单 --> 6 <!-- 基础表单 -->
14 <BasicForm @register="registerForm" /> 7 <BasicForm @register="registerForm" />
@@ -17,20 +10,14 @@ @@ -17,20 +10,14 @@
17 <Divider orientation="left">触发器</Divider> 10 <Divider orientation="left">触发器</Divider>
18 <div> 11 <div>
19 <template v-for="(item, index) in triggerData" :key="item"> 12 <template v-for="(item, index) in triggerData" :key="item">
20 - <TriggerOrCondition  
21 - class="mt-4"  
22 - title="触发器"  
23 - :index="index"  
24 - :provideOrgid="provideOrgid"  
25 - :ref="skipUnwrap.triggerItemRefs"  
26 - @delete="deleteTriggerOrCondition"  
27 - /> 13 + <TriggerOrCondition class="mt-4" title="触发器" :index="index" :provideOrgid="provideOrgid"
  14 + :ref="skipUnwrap.triggerItemRefs" @delete="deleteTriggerOrCondition" />
28 </template> 15 </template>
29 <!-- 按钮 --> 16 <!-- 按钮 -->
30 <a-button type="primary" class="mt-4" @click="addTrigger" v-if="isView"> 17 <a-button type="primary" class="mt-4" @click="addTrigger" v-if="isView">
31 <PlusOutlined /> 18 <PlusOutlined />
32 - 新增触发器</a-button  
33 - > 19 + 新增触发器
  20 + </a-button>
34 <!-- 按钮 --> 21 <!-- 按钮 -->
35 </div> 22 </div>
36 <!-- 触发器-end --> 23 <!-- 触发器-end -->
@@ -39,20 +26,14 @@ @@ -39,20 +26,14 @@
39 <Divider orientation="left">执行条件</Divider> 26 <Divider orientation="left">执行条件</Divider>
40 <div> 27 <div>
41 <template v-for="(item, index) in conditionData" :key="item"> 28 <template v-for="(item, index) in conditionData" :key="item">
42 - <TriggerOrCondition  
43 - class="mt-4"  
44 - title="执行条件"  
45 - :index="index"  
46 - :provideOrgid="provideOrgid"  
47 - :ref="skipUnwrap.conditionItemRefs"  
48 - @delete="deleteTriggerOrCondition"  
49 - /> 29 + <TriggerOrCondition class="mt-4" title="执行条件" :index="index" :provideOrgid="provideOrgid"
  30 + :ref="skipUnwrap.conditionItemRefs" @delete="deleteTriggerOrCondition" />
50 </template> 31 </template>
51 <!-- 按钮 --> 32 <!-- 按钮 -->
52 <a-button type="primary" class="mt-4" @click="addCondition" v-if="isView"> 33 <a-button type="primary" class="mt-4" @click="addCondition" v-if="isView">
53 <PlusOutlined /> 34 <PlusOutlined />
54 - 新增执行条件</a-button  
55 - > 35 + 新增执行条件
  36 + </a-button>
56 <!-- 按钮 --> 37 <!-- 按钮 -->
57 </div> 38 </div>
58 <!-- 执行条件-end --> 39 <!-- 执行条件-end -->
@@ -61,24 +42,15 @@ @@ -61,24 +42,15 @@
61 <Divider orientation="left">执行动作</Divider> 42 <Divider orientation="left">执行动作</Divider>
62 <div> 43 <div>
63 <template v-for="(item, index) in actionData" :key="item"> 44 <template v-for="(item, index) in actionData" :key="item">
64 - <Action  
65 - class="mt-4"  
66 - :actionIndex="index"  
67 - :actionData="actionData"  
68 - :triggerData="triggerData"  
69 - :ref="skipUnwrap.actionItemRefs"  
70 - :provideOrgid="provideOrgid"  
71 - :deviceList="getMasterDeviceList"  
72 - :arr="arr"  
73 - @deleteAction="deleteAction"  
74 - @getActionFormArr="getActionFormArr"  
75 - /> 45 + <Action class="mt-4" :actionIndex="index" :actionData="actionData" :triggerData="triggerData"
  46 + :ref="skipUnwrap.actionItemRefs" :provideOrgid="provideOrgid" :deviceList="getMasterDeviceList" :arr="arr"
  47 + @deleteAction="deleteAction" @getActionFormArr="getActionFormArr" />
76 </template> 48 </template>
77 <!-- 按钮 --> 49 <!-- 按钮 -->
78 <a-button type="primary" class="mt-4" @click="addAction" v-if="isView"> 50 <a-button type="primary" class="mt-4" @click="addAction" v-if="isView">
79 <PlusOutlined /> 51 <PlusOutlined />
80 - 新增执行动作</a-button  
81 - > 52 + 新增执行动作
  53 + </a-button>
82 <!-- 按钮 --> 54 <!-- 按钮 -->
83 </div> 55 </div>
84 <!-- 执行动作-end --> 56 <!-- 执行动作-end -->
@@ -87,587 +59,591 @@ @@ -87,587 +59,591 @@
87 </div> 59 </div>
88 </template> 60 </template>
89 <script lang="ts" setup> 61 <script lang="ts" setup>
90 - import { ref, watch, unref, computed, nextTick } from 'vue';  
91 - import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';  
92 - import { formSchema, organizationId } from './config/config.data.ts';  
93 - import { BasicForm, useForm } from '/@/components/Form';  
94 - import { genTriggerOrConditionData, genActionData } from './config/formatData.ts';  
95 - import { Divider } from 'ant-design-vue';  
96 - import { PlusOutlined } from '@ant-design/icons-vue';  
97 - import { useMessage } from '/@/hooks/web/useMessage';  
98 - import {  
99 - screenLinkPageAddApi,  
100 - screenLinkPageByDeptIdGetDevice,  
101 - getOrganizationAlarmConfig,  
102 - byOganizationIdGetMasterDevice,  
103 - } from '/@/api/ruleengine/ruleengineApi';  
104 - import TriggerOrCondition from './cpns/Trigger-Condition.vue';  
105 - import Action from './cpns/Action.vue';  
106 - import { findOperation } from './config/formatData.ts';  
107 - import { formatToDateTime } from '/@/utils/dateUtil'; 62 +import { ref, watch, unref, computed, nextTick } from 'vue';
  63 +import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
  64 +import { formSchema, organizationId } from './config/config.data.ts';
  65 +import { BasicForm, useForm } from '/@/components/Form';
  66 +import { genTriggerOrConditionData, genActionData } from './config/formatData.ts';
  67 +import { Divider } from 'ant-design-vue';
  68 +import { PlusOutlined } from '@ant-design/icons-vue';
  69 +import { useMessage } from '/@/hooks/web/useMessage';
  70 +import {
  71 + screenLinkPageAddApi,
  72 + screenLinkPageByDeptIdGetDevice,
  73 + getOrganizationAlarmConfig,
  74 + byOganizationIdGetMasterDevice,
  75 +} from '/@/api/ruleengine/ruleengineApi';
  76 +import TriggerOrCondition from './cpns/Trigger-Condition.vue';
  77 +import Action from './cpns/Action.vue';
  78 +import { findOperation } from './config/formatData.ts';
  79 +import { formatToDateTime } from '/@/utils/dateUtil';
108 80
109 - const emit = defineEmits(['register', 'success']);  
110 - const provideOrgid = ref(''); 81 +const emit = defineEmits(['register', 'success']);
  82 +const provideOrgid = ref('');
111 83
112 - const { createMessage } = useMessage();  
113 - const triggerData = ref([]);  
114 - const conditionData = ref([]);  
115 - const actionData = ref([]);  
116 - const skipUnwrap = {  
117 - triggerItemRefs: ref([]),  
118 - conditionItemRefs: ref([]),  
119 - actionItemRefs: ref([]),  
120 - };  
121 - const title = computed(  
122 - () => `${isUpdate.value === 3 ? '查看' : isUpdate.value ? '编辑' : '新增'}场景联动`  
123 - );  
124 - let getTriggerFormValue = ref([]);  
125 - let getConditionFormValue = ref([]);  
126 - let getActionFormValue = ref([]);  
127 - const editEntryIdData = ref([]);  
128 - const editAlarmConfigData = ref([]);  
129 - const isUpdate = ref(false);  
130 - const id = ref(undefined);  
131 - const tenantId = ref(undefined);  
132 - const isView = ref(true);  
133 - const [registerForm, { resetFields, validate, setFieldsValue }] = useForm({  
134 - labelWidth: 120,  
135 - schemas: formSchema,  
136 - showActionButtonGroup: false,  
137 - });  
138 - const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {  
139 - setDrawerProps({ confirmLoading: false, loading: true });  
140 - isUpdate.value = data.isUpdate;  
141 - if (!unref(isUpdate)) {  
142 - resetFields();  
143 - //初始化执行动作  
144 - actionData.value = [Date.now()];  
145 - } else {  
146 - // 取值  
147 - const {  
148 - id: recordId,  
149 - tenantId: recordTenantId,  
150 - organizationId,  
151 - triggers,  
152 - doConditions,  
153 - doActions,  
154 - } = data.record;  
155 - // 赋值  
156 - await setFieldsValue(data.record);  
157 - id.value = recordId;  
158 - tenantId.value = recordTenantId;  
159 - //TODO-fengtao-把组织id传给子组件  
160 - provideOrgid.value = organizationId;  
161 - //TODO-fengtao获取当前执行动作下的设备(master那个接口)  
162 - getMasterDeviceList.value = await byOganizationIdGetMasterDevice(organizationId);  
163 - //TODO-fengtao  
164 - // 获取当前组织下的设备列表  
165 - const options = await screenLinkPageByDeptIdGetDevice({  
166 - organizationId,  
167 - });  
168 - // 获取当前组织下的告警配置  
169 - const alarmConfig = await getOrganizationAlarmConfig({ organizationId });  
170 -  
171 - // 生成回显时对应得组件数量  
172 - triggerData.value = [...new Array(triggers.length).keys()];  
173 - conditionData.value = [...new Array(doConditions.length).keys()];  
174 - actionData.value = [...new Array(doActions.length).keys()];  
175 - // 回显设备列表  
176 - editEntryIdData.value = options.items.map((item) => {  
177 - return {  
178 - value: item.tbDeviceId,  
179 - label: item.name,  
180 - };  
181 - });  
182 - editAlarmConfigData.value = alarmConfig.map((item) => {  
183 - return {  
184 - value: item.id,  
185 - label: item.name,  
186 - };  
187 - });  
188 - deviceList.value = editEntryIdData.value;  
189 - nextTick(() => {  
190 - setEditFields(skipUnwrap.triggerItemRefs, editEntryIdData);  
191 - setEditFields(skipUnwrap.conditionItemRefs, editEntryIdData);  
192 - setEditFields(skipUnwrap.actionItemRefs, getMasterDeviceList);  
193 - setEditAlarmConfig(skipUnwrap.actionItemRefs, editAlarmConfigData);  
194 - }); 84 +const { createMessage } = useMessage();
  85 +const triggerData = ref([]);
  86 +const conditionData = ref([]);
  87 +const actionData = ref([]);
  88 +const skipUnwrap = {
  89 + triggerItemRefs: ref([]),
  90 + conditionItemRefs: ref([]),
  91 + actionItemRefs: ref([]),
  92 +};
  93 +const title = computed(
  94 + () => `${isUpdate.value === 3 ? '查看' : isUpdate.value ? '编辑' : '新增'}场景联动`
  95 +);
  96 +let getTriggerFormValue = ref([]);
  97 +let getConditionFormValue = ref([]);
  98 +let getActionFormValue = ref([]);
  99 +const editEntryIdData = ref([]);
  100 +const editAlarmConfigData = ref([]);
  101 +const isUpdate = ref(false);
  102 +const id = ref(undefined);
  103 +const tenantId = ref(undefined);
  104 +const isView = ref(true);
  105 +const [registerForm, { resetFields, validate, setFieldsValue }] = useForm({
  106 + labelWidth: 120,
  107 + schemas: formSchema,
  108 + showActionButtonGroup: false,
  109 +});
  110 +const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
  111 + setDrawerProps({ confirmLoading: false, loading: true });
  112 + isUpdate.value = data.isUpdate;
  113 + if (!unref(isUpdate)) {
  114 + resetFields();
  115 + //初始化执行动作
  116 + actionData.value = [Date.now()];
  117 + } else {
  118 + // 取值
  119 + const {
  120 + id: recordId,
  121 + tenantId: recordTenantId,
  122 + organizationId,
  123 + triggers,
  124 + doConditions,
  125 + doActions,
  126 + } = data.record;
  127 + // 赋值
  128 + await setFieldsValue(data.record);
  129 + id.value = recordId;
  130 + tenantId.value = recordTenantId;
  131 + //TODO-fengtao-把组织id传给子组件
  132 + provideOrgid.value = organizationId;
  133 + //TODO-fengtao获取当前执行动作下的设备(master那个接口)
  134 + getMasterDeviceList.value = await byOganizationIdGetMasterDevice(organizationId);
  135 + //TODO-fengtao
  136 + // 获取当前组织下的设备列表
  137 + const options = await screenLinkPageByDeptIdGetDevice({
  138 + organizationId,
  139 + });
  140 + // 获取当前组织下的告警配置
  141 + const alarmConfig = await getOrganizationAlarmConfig({ organizationId });
195 142
196 - const map = {  
197 - ANY_TIME: 0,  
198 - SPECIFIC_TIME: 1,  
199 - CUSTOM: 2, 143 + // 生成回显时对应得组件数量
  144 + triggerData.value = [...new Array(triggers.length).keys()];
  145 + conditionData.value = [...new Array(doConditions.length).keys()];
  146 + actionData.value = [...new Array(doActions.length).keys()];
  147 + // 回显设备列表
  148 + editEntryIdData.value = options.items.map((item) => {
  149 + return {
  150 + value: item.tbDeviceId,
  151 + label: item.name,
200 }; 152 };
201 - // 回显触发器数据---此处是个闭包!  
202 - triggers.forEach((trigger, index) => {  
203 - nextTick(async () => {  
204 - const selectDeviceId = ref('');  
205 - // 回显启用规则  
206 - unref(skipUnwrap.triggerItemRefs)[index].currentIndex =  
207 - map[trigger.triggerCondition.schedule.type];  
208 - unref(skipUnwrap.triggerItemRefs)[index].scheduleData = trigger.triggerCondition.schedule;  
209 - unref(skipUnwrap.triggerItemRefs)[index].isUpdate = true;  
210 - unref(skipUnwrap.triggerItemRefs)[index].alarmScheduleRef.scheduleData =  
211 - trigger.triggerCondition.schedule;  
212 - unref(skipUnwrap.triggerItemRefs)[index].setFieldsFormValueFun({  
213 - triggered: trigger?.triggerCondition?.condition?.spec?.type,  
214 - device: trigger?.entityType,  
215 - triggerType: trigger?.triggerType,  
216 - type1: trigger?.triggerCondition?.condition?.condition[0]?.key?.type,  
217 - type2: trigger?.triggerCondition?.condition?.condition[0]?.key?.key,  
218 - operationType: trigger?.triggerCondition?.condition?.condition[0]?.valueType,  
219 - detail: trigger?.triggerCondition?.alarmDetails,  
220 - entityId: trigger?.entityId,  
221 - replaceValue: trigger?.triggerCondition?.condition?.spec?.predicate?.defaultValue,  
222 - time: trigger?.triggerCondition?.condition?.spec?.predicate?.defaultValue,  
223 - timeUnit: trigger?.triggerCondition?.condition?.spec?.unit,  
224 - });  
225 - if (trigger.entityId != undefined) {  
226 - selectDeviceId.value = trigger?.entityId;  
227 - }  
228 - //fengtao-把设备id回传给子组件  
229 - unref(skipUnwrap.triggerItemRefs)[index].updateFieldAttributeFunc(  
230 - selectDeviceId.value,  
231 - provideOrgid.value  
232 - );  
233 - //fengtao  
234 - // 设置值operationType  
235 - unref(skipUnwrap.triggerItemRefs)[index].operationType =  
236 - trigger.triggerCondition?.condition.condition[0].valueType; 153 + });
  154 + editAlarmConfigData.value = alarmConfig.map((item) => {
  155 + return {
  156 + value: item.id,
  157 + label: item.name,
  158 + };
  159 + });
  160 + deviceList.value = editEntryIdData.value;
  161 + nextTick(() => {
  162 + setEditFields(skipUnwrap.triggerItemRefs, editEntryIdData);
  163 + setEditFields(skipUnwrap.conditionItemRefs, editEntryIdData);
  164 + setEditFields(skipUnwrap.actionItemRefs, getMasterDeviceList);
  165 + setEditAlarmConfig(skipUnwrap.actionItemRefs, editAlarmConfigData);
  166 + });
  167 +
  168 + const map = {
  169 + ANY_TIME: 0,
  170 + SPECIFIC_TIME: 1,
  171 + CUSTOM: 2,
  172 + };
  173 + // 回显触发器数据---此处是个闭包!
  174 + triggers.forEach((trigger, index) => {
  175 + nextTick(async () => {
  176 + const selectDeviceId = ref('');
  177 + // 回显启用规则
  178 + unref(skipUnwrap.triggerItemRefs)[index].currentIndex =
  179 + map[trigger.triggerCondition.schedule.type];
  180 + unref(skipUnwrap.triggerItemRefs)[index].scheduleData = trigger.triggerCondition.schedule;
  181 + unref(skipUnwrap.triggerItemRefs)[index].isUpdate = true;
  182 + unref(skipUnwrap.triggerItemRefs)[index].alarmScheduleRef.scheduleData =
  183 + trigger.triggerCondition.schedule;
  184 + 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,
  192 + entityId: trigger?.entityId,
  193 + replaceValue: trigger?.triggerCondition?.condition?.spec?.predicate?.defaultValue,
  194 + time: trigger?.triggerCondition?.condition?.spec?.predicate?.defaultValue,
  195 + timeUnit: trigger?.triggerCondition?.condition?.spec?.unit,
  196 + });
  197 + if (trigger.entityId != undefined) {
  198 + selectDeviceId.value = trigger?.entityId;
  199 + }
  200 + //fengtao-把设备id回传给子组件
  201 + unref(skipUnwrap.triggerItemRefs)[index].updateFieldAttributeFunc(
  202 + selectDeviceId.value,
  203 + provideOrgid.value
  204 + );
  205 + //fengtao
  206 + // 设置值operationType
  207 + unref(skipUnwrap.triggerItemRefs)[index].operationType =
  208 + trigger.triggerCondition?.condition.condition[0].valueType;
237 209
238 - const ConditionScreeningForm = await unref(skipUnwrap.triggerItemRefs)[  
239 - index  
240 - ].getRefItemConditionScreeningRefs(); 210 + const ConditionScreeningForm = await unref(skipUnwrap.triggerItemRefs)[
  211 + index
  212 + ].getRefItemConditionScreeningRefs();
241 213
242 - // 设置对应条件筛选的个数  
243 - unref(skipUnwrap.triggerItemRefs)[index].setConditionScreeningList([  
244 - ...new Array(trigger.triggerCondition.condition.condition.length).keys(),  
245 - ]);  
246 - // 操作符类型 NUMERIC|String|Boolean|DATE_TIME  
247 - const valueType = trigger.triggerCondition?.condition.condition[0].valueType; 214 + // 设置对应条件筛选的个数
  215 + unref(skipUnwrap.triggerItemRefs)[index].setConditionScreeningList([
  216 + ...new Array(trigger.triggerCondition.condition.condition.length).keys(),
  217 + ]);
  218 + // 操作符类型 NUMERIC|String|Boolean|DATE_TIME
  219 + const valueType = trigger.triggerCondition?.condition.condition[0].valueType;
248 220
249 - // 循环设置条件筛选值。TODO:此处设置顺序有问题  
250 - nextTick(() => {  
251 - const richTextList = [];  
252 - trigger.triggerCondition.condition.condition.forEach((item, index) => {  
253 - const formItem = {  
254 - operation: item.predicate.operation,  
255 - value:  
256 - valueType === 'DATE_TIME'  
257 - ? formatToDateTime(  
258 - Number(item.predicate.value.defaultValue),  
259 - 'YYYY-MM-DD HH:mm:ss'  
260 - )  
261 - : String(item.predicate.value.defaultValue),  
262 - ignoreCase: item.valueType === 'STRING' ? item.predicate.ignoreCase : undefined,  
263 - };  
264 - richTextList.push({  
265 - // 查询中文操作符  
266 - operation: findOperation(valueType, item.predicate.operation).label,  
267 - value:  
268 - valueType === 'DATE_TIME'  
269 - ? formatToDateTime(  
270 - Number(item.predicate.value.defaultValue),  
271 - 'YYYY-MM-DD HH:mm:ss'  
272 - )  
273 - : String(item.predicate.value.defaultValue),  
274 - attribute: trigger.triggerCondition?.condition.condition[0]?.key?.key,  
275 - });  
276 - ConditionScreeningForm.value[index].setFieldsValue(formItem); 221 + // 循环设置条件筛选值。TODO:此处设置顺序有问题
  222 + nextTick(() => {
  223 + const richTextList = [];
  224 + trigger.triggerCondition.condition.condition.forEach((item, index) => {
  225 + const formItem = {
  226 + operation: item.predicate.operation,
  227 + value:
  228 + valueType === 'DATE_TIME'
  229 + ? formatToDateTime(
  230 + Number(item.predicate.value.defaultValue),
  231 + 'YYYY-MM-DD HH:mm:ss'
  232 + )
  233 + : String(item.predicate.value.defaultValue),
  234 + ignoreCase: item.valueType === 'STRING' ? item.predicate.ignoreCase : undefined,
  235 + };
  236 + richTextList.push({
  237 + // 查询中文操作符
  238 + operation: findOperation(valueType, item.predicate.operation).label,
  239 + value:
  240 + valueType === 'DATE_TIME'
  241 + ? formatToDateTime(
  242 + Number(item.predicate.value.defaultValue),
  243 + 'YYYY-MM-DD HH:mm:ss'
  244 + )
  245 + : String(item.predicate.value.defaultValue),
  246 + attribute: trigger.triggerCondition?.condition.condition[0]?.key?.key,
277 }); 247 });
278 - unref(skipUnwrap.triggerItemRefs)[index].setRichText(richTextList); 248 + ConditionScreeningForm.value[index].setFieldsValue(formItem);
279 }); 249 });
  250 + unref(skipUnwrap.triggerItemRefs)[index].setRichText(richTextList);
280 }); 251 });
281 }); 252 });
  253 + });
282 254
283 - doConditions.forEach((condition, index) => {  
284 - nextTick(async () => {  
285 - const selectDeviceId = ref('');  
286 - // 回显启用规则  
287 - unref(skipUnwrap.conditionItemRefs)[index].currentIndex =  
288 - map[condition.triggerCondition.schedule.type];  
289 - unref(skipUnwrap.conditionItemRefs)[index].scheduleData =  
290 - condition.triggerCondition.schedule;  
291 - unref(skipUnwrap.conditionItemRefs)[index].isUpdate = true;  
292 - unref(skipUnwrap.conditionItemRefs)[index].alarmScheduleRef.scheduleData =  
293 - condition.triggerCondition.schedule;  
294 - unref(skipUnwrap.conditionItemRefs)[index].setFieldsFormValueFun({  
295 - triggered: condition?.triggerCondition?.condition?.spec?.type,  
296 - device: condition?.entityType,  
297 - triggerType: condition?.triggerType,  
298 - type1: condition?.triggerCondition?.condition?.condition[0]?.key?.type,  
299 - type2: condition?.triggerCondition?.condition?.condition[0]?.key?.key,  
300 - operationType: condition?.triggerCondition?.condition?.condition[0]?.valueType,  
301 - detail: condition?.triggerCondition?.alarmDetails,  
302 - entityId: condition?.entityId,  
303 - replaceValue: condition?.triggerCondition?.condition?.spec?.predicate?.defaultValue,  
304 - time: condition?.triggerCondition?.condition?.spec?.predicate?.defaultValue,  
305 - timeUnit: condition?.triggerCondition?.condition?.spec?.unit,  
306 - });  
307 - if (condition?.entityId != undefined) {  
308 - selectDeviceId.value = condition?.entityId;  
309 - }  
310 - //fengtao-把设备id回传给子组件  
311 - unref(skipUnwrap.conditionItemRefs)[index].updateFieldAttributeFunc(  
312 - selectDeviceId.value,  
313 - provideOrgid.value  
314 - );  
315 - //fengtao  
316 - // 设置值operationType  
317 - unref(skipUnwrap.conditionItemRefs)[index].operationType =  
318 - condition.triggerCondition?.condition.condition[0].valueType; 255 + doConditions.forEach((condition, index) => {
  256 + nextTick(async () => {
  257 + const selectDeviceId = ref('');
  258 + // 回显启用规则
  259 + unref(skipUnwrap.conditionItemRefs)[index].currentIndex =
  260 + map[condition.triggerCondition.schedule.type];
  261 + unref(skipUnwrap.conditionItemRefs)[index].scheduleData =
  262 + condition.triggerCondition.schedule;
  263 + unref(skipUnwrap.conditionItemRefs)[index].isUpdate = true;
  264 + unref(skipUnwrap.conditionItemRefs)[index].alarmScheduleRef.scheduleData =
  265 + condition.triggerCondition.schedule;
  266 + unref(skipUnwrap.conditionItemRefs)[index].setFieldsFormValueFun({
  267 + triggered: condition?.triggerCondition?.condition?.spec?.type,
  268 + device: condition?.entityType,
  269 + triggerType: condition?.triggerType,
  270 + type1: condition?.triggerCondition?.condition?.condition[0]?.key?.type,
  271 + type2: condition?.triggerCondition?.condition?.condition[0]?.key?.key,
  272 + operationType: condition?.triggerCondition?.condition?.condition[0]?.valueType,
  273 + detail: condition?.triggerCondition?.alarmDetails,
  274 + entityId: condition?.entityId,
  275 + replaceValue: condition?.triggerCondition?.condition?.spec?.predicate?.defaultValue,
  276 + time: condition?.triggerCondition?.condition?.spec?.predicate?.defaultValue,
  277 + timeUnit: condition?.triggerCondition?.condition?.spec?.unit,
  278 + });
  279 + if (condition?.entityId != undefined) {
  280 + selectDeviceId.value = condition?.entityId;
  281 + }
  282 + //fengtao-把设备id回传给子组件
  283 + unref(skipUnwrap.conditionItemRefs)[index].updateFieldAttributeFunc(
  284 + selectDeviceId.value,
  285 + provideOrgid.value
  286 + );
  287 + //fengtao
  288 + // 设置值operationType
  289 + unref(skipUnwrap.conditionItemRefs)[index].operationType =
  290 + condition.triggerCondition?.condition.condition[0].valueType;
319 291
320 - const ConditionScreeningForm = await unref(skipUnwrap.conditionItemRefs)[  
321 - index  
322 - ].getRefItemConditionScreeningRefs(); 292 + const ConditionScreeningForm = await unref(skipUnwrap.conditionItemRefs)[
  293 + index
  294 + ].getRefItemConditionScreeningRefs();
323 295
324 - // 设置对应条件筛选的个数  
325 - unref(skipUnwrap.conditionItemRefs)[index].setConditionScreeningList([  
326 - ...new Array(condition.triggerCondition.condition.condition.length).keys(),  
327 - ]);  
328 - // 操作符类型 NUMERIC|String|Boolean|DATE_TIME  
329 - const valueType = condition.triggerCondition?.condition.condition[0].valueType; 296 + // 设置对应条件筛选的个数
  297 + unref(skipUnwrap.conditionItemRefs)[index].setConditionScreeningList([
  298 + ...new Array(condition.triggerCondition.condition.condition.length).keys(),
  299 + ]);
  300 + // 操作符类型 NUMERIC|String|Boolean|DATE_TIME
  301 + const valueType = condition.triggerCondition?.condition.condition[0].valueType;
330 302
331 - // 循环设置条件筛选值。TODO:此处设置顺序有问题  
332 - nextTick(() => {  
333 - const richTextList = [];  
334 - condition.triggerCondition.condition.condition.forEach((item, index) => {  
335 - const formItem = {  
336 - operation: item.predicate.operation,  
337 - value:  
338 - valueType === 'DATE_TIME'  
339 - ? formatToDateTime(  
340 - Number(item.predicate.value.defaultValue),  
341 - 'YYYY-MM-DD HH:mm:ss'  
342 - )  
343 - : String(item.predicate.value.defaultValue),  
344 - ignoreCase: item.valueType === 'STRING' ? item.predicate.ignoreCase : undefined,  
345 - };  
346 - richTextList.push({  
347 - // 查询中文操作符  
348 - operation: findOperation(valueType, item.predicate.operation).label,  
349 - value:  
350 - valueType === 'DATE_TIME'  
351 - ? formatToDateTime(  
352 - Number(item.predicate.value.defaultValue),  
353 - 'YYYY-MM-DD HH:mm:ss'  
354 - )  
355 - : String(item.predicate.value.defaultValue),  
356 - attribute: condition.triggerCondition?.condition.condition[0]?.key?.key,  
357 - });  
358 - ConditionScreeningForm.value[index].setFieldsValue(formItem); 303 + // 循环设置条件筛选值。TODO:此处设置顺序有问题
  304 + nextTick(() => {
  305 + const richTextList = [];
  306 + condition.triggerCondition.condition.condition.forEach((item, index) => {
  307 + const formItem = {
  308 + operation: item.predicate.operation,
  309 + value:
  310 + valueType === 'DATE_TIME'
  311 + ? formatToDateTime(
  312 + Number(item.predicate.value.defaultValue),
  313 + 'YYYY-MM-DD HH:mm:ss'
  314 + )
  315 + : String(item.predicate.value.defaultValue),
  316 + ignoreCase: item.valueType === 'STRING' ? item.predicate.ignoreCase : undefined,
  317 + };
  318 + richTextList.push({
  319 + // 查询中文操作符
  320 + operation: findOperation(valueType, item.predicate.operation).label,
  321 + value:
  322 + valueType === 'DATE_TIME'
  323 + ? formatToDateTime(
  324 + Number(item.predicate.value.defaultValue),
  325 + 'YYYY-MM-DD HH:mm:ss'
  326 + )
  327 + : String(item.predicate.value.defaultValue),
  328 + attribute: condition.triggerCondition?.condition.condition[0]?.key?.key,
359 }); 329 });
360 - unref(skipUnwrap.conditionItemRefs)[index].setRichText(richTextList); 330 + ConditionScreeningForm.value[index].setFieldsValue(formItem);
361 }); 331 });
  332 + unref(skipUnwrap.conditionItemRefs)[index].setRichText(richTextList);
362 }); 333 });
363 }); 334 });
  335 + });
364 336
365 - doActions.forEach((action, index) => {  
366 - nextTick(() => {  
367 - const selectDeviceId = ref('');  
368 - // 设置执行动作外层值  
369 - unref(skipUnwrap.actionItemRefs)[index].setFieldsFormValueFun({  
370 - outTarget: action.outTarget,  
371 - device: action.entityType,  
372 - deviceId: action.deviceId,  
373 - alarm_config: action.alarmProfileId,  
374 - alarm_level: action.doContext.alarmLevel,  
375 - });  
376 - // 如果是设备输出设置脚本值  
377 - if (action.outTarget === 'DEVICE_OUT') {  
378 - unref(skipUnwrap.actionItemRefs)[index].setJsonValue(action.doContext.params);  
379 - }  
380 - // 清除告警有值?{数组}  
381 - if (action?.doContext?.clearRule?.length) {  
382 - unref(skipUnwrap.actionItemRefs)[index].checked = true;  
383 - // 生成对应清除告警的数组长度  
384 - unref(skipUnwrap.actionItemRefs)[index].clearRuleList = [  
385 - ...new Array(action?.doContext?.clearRule?.length).keys(),  
386 - ];  
387 - // 推迟执行时机-DOM渲染完毕在执行  
388 - nextTick(async () => {  
389 - unref(skipUnwrap.actionItemRefs)[index].refItem.clearRuleRefs.value.map(  
390 - (item, index) => {  
391 - // 回显启用规则  
392 - item.currentIndex =  
393 - map[action.doContext.clearRule[index].triggerCondition.schedule.type];  
394 - item.scheduleData = action.doContext.clearRule[index].triggerCondition.schedule;  
395 - item.isUpdate = true;  
396 - item.alarmScheduleRef.scheduleData =  
397 - action.doContext.clearRule[index].triggerCondition.schedule;  
398 - item.setFieldsFormValueFun({  
399 - triggered:  
400 - action.doContext.clearRule[index].triggerCondition.condition.spec.type,  
401 - device: action.doContext.clearRule[index].entityType,  
402 - triggerType: action.doContext.clearRule[index].triggerType,  
403 - type1:  
404 - action.doContext.clearRule[index].triggerCondition.condition.condition[0].key  
405 - .type,  
406 - type2:  
407 - action.doContext.clearRule[index].triggerCondition.condition.condition[0].key  
408 - .key,  
409 - operationType:  
410 - action.doContext.clearRule[index].triggerCondition.condition.condition[0]  
411 - .valueType,  
412 - detail: action.doContext.clearRule[index].triggerCondition.alarmDetails,  
413 - entityId: action.doContext.clearRule[index].entityId,  
414 - replaceValue:  
415 - action.doContext.clearRule[index].triggerCondition.condition.spec.predicate  
416 - .defaultValue,  
417 - time: action.doContext.clearRule[index].triggerCondition.condition.spec  
418 - .predicate.defaultValue,  
419 - timeUnit:  
420 - action.doContext.clearRule[index].triggerCondition.condition.spec.unit,  
421 - });  
422 - if (action.doContext.clearRule[index].entityId != undefined) {  
423 - selectDeviceId.value = action.doContext.clearRule[index].entityId;  
424 - }  
425 - //fengtao-把设备id回传给子组件  
426 - item.updateFieldAttributeFunc(selectDeviceId.value, provideOrgid.value);  
427 - item.updateFieldDeviceId(  
428 - deviceList.value,  
429 - provideOrgid.value,  
430 - isUpdate.value,  
431 - getMasterDeviceList.value  
432 - );  
433 - //fengtao  
434 - // 单独设置operationType值 操作符类型 NUMERIC|String|Boolean|DATE_TIME  
435 - item.operationType =  
436 - action.doContext.clearRule[  
437 - index  
438 - ].triggerCondition.condition.condition[0].valueType; 337 + doActions.forEach((action, index) => {
  338 + nextTick(() => {
  339 + const selectDeviceId = ref('');
  340 + // 设置执行动作外层值
  341 + unref(skipUnwrap.actionItemRefs)[index].setFieldsFormValueFun({
  342 + outTarget: action.outTarget,
  343 + device: action.entityType,
  344 + deviceId: action.deviceId,
  345 + alarm_config: action.alarmProfileId,
  346 + alarm_level: action.doContext.alarmLevel,
  347 + });
  348 + // 如果是设备输出设置脚本值
  349 + if (action.outTarget === 'DEVICE_OUT') {
  350 + unref(skipUnwrap.actionItemRefs)[index].setJsonValue(action.doContext.params);
  351 + }
  352 + // 清除告警有值?{数组}
  353 + if (action?.doContext?.clearRule?.length) {
  354 + unref(skipUnwrap.actionItemRefs)[index].checked = true;
  355 + // 生成对应清除告警的数组长度
  356 + unref(skipUnwrap.actionItemRefs)[index].clearRuleList = [
  357 + ...new Array(action?.doContext?.clearRule?.length).keys(),
  358 + ];
  359 + // 推迟执行时机-DOM渲染完毕在执行
  360 + nextTick(async () => {
  361 + unref(skipUnwrap.actionItemRefs)[index].refItem.clearRuleRefs.value.map(
  362 + (item, index) => {
  363 + // 回显启用规则
  364 + item.currentIndex =
  365 + map[action.doContext.clearRule[index].triggerCondition.schedule.type];
  366 + item.scheduleData = action.doContext.clearRule[index].triggerCondition.schedule;
  367 + item.isUpdate = true;
  368 + item.alarmScheduleRef.scheduleData =
  369 + action.doContext.clearRule[index].triggerCondition.schedule;
  370 + item.setFieldsFormValueFun({
  371 + triggered:
  372 + action.doContext.clearRule[index].triggerCondition.condition.spec.type,
  373 + device: action.doContext.clearRule[index].entityType,
  374 + triggerType: action.doContext.clearRule[index].triggerType,
  375 + type1:
  376 + action.doContext.clearRule[index].triggerCondition.condition.condition[0].key
  377 + .type,
  378 + type2:
  379 + action.doContext.clearRule[index].triggerCondition.condition.condition[0].key
  380 + .key,
  381 + operationType:
  382 + action.doContext.clearRule[index].triggerCondition.condition.condition[0]
  383 + .valueType,
  384 + detail: action.doContext.clearRule[index].triggerCondition.alarmDetails,
  385 + entityId: action.doContext.clearRule[index].entityId,
  386 + replaceValue:
  387 + action.doContext.clearRule[index].triggerCondition.condition.spec.predicate
  388 + .defaultValue,
  389 + time: action.doContext.clearRule[index].triggerCondition.condition.spec
  390 + .predicate.defaultValue,
  391 + timeUnit:
  392 + action.doContext.clearRule[index].triggerCondition.condition.spec.unit,
  393 + });
  394 + if (action.doContext.clearRule[index].entityId != undefined) {
  395 + selectDeviceId.value = action.doContext.clearRule[index].entityId;
439 } 396 }
440 - ); 397 + //fengtao-把设备id回传给子组件
  398 + item.updateFieldAttributeFunc(selectDeviceId.value, provideOrgid.value);
  399 + item.updateFieldDeviceId(
  400 + deviceList.value,
  401 + provideOrgid.value,
  402 + isUpdate.value,
  403 + getMasterDeviceList.value
  404 + );
  405 + //fengtao
  406 + // 单独设置operationType值 操作符类型 NUMERIC|String|Boolean|DATE_TIME
  407 + item.operationType =
  408 + action.doContext.clearRule[
  409 + index
  410 + ].triggerCondition.condition.condition[0].valueType;
  411 + }
  412 + );
441 413
442 - const ConditionScreeningForm = await unref(skipUnwrap.actionItemRefs)[  
443 - index  
444 - ].getRefItemConditionScreeningRefs(); 414 + const ConditionScreeningForm = await unref(skipUnwrap.actionItemRefs)[
  415 + index
  416 + ].getRefItemConditionScreeningRefs();
445 417
446 - // 循环设置条件筛选值。TODO:此处设置顺序有问题  
447 - action.doContext.clearRule.map((rule, ruleIndex) => {  
448 - // 生成对应条件筛选的数组个数  
449 - unref(skipUnwrap.actionItemRefs)[index].setConditionScreeningList([  
450 - ...new Array(  
451 - action.doContext.clearRule[  
452 - ruleIndex  
453 - ].triggerCondition.condition.condition.length  
454 - ).keys(),  
455 - ]);  
456 - nextTick(() => {  
457 - const richTextList = [];  
458 - rule.triggerCondition.condition.condition.forEach((item, conditionIndex) => {  
459 - //TODO-fengtao之前是Number( item.predicate.value.defaultValue)-发现回显是Invalide Time  
460 - const formItem = {  
461 - operation: item.predicate.operation,  
462 - value:  
463 - item.valueType === 'DATE_TIME'  
464 - ? formatToDateTime(  
465 - Number(item.predicate.value.defaultValue),  
466 - 'YYYY-MM-DD HH:mm:ss'  
467 - )  
468 - : String(item.predicate.value.defaultValue),  
469 - ignoreCase:  
470 - item.valueType === 'STRING' ? item.predicate.ignoreCase : undefined,  
471 - };  
472 - //TODO-fengtao之前是Number( item.predicate.value.defaultValue)-发现回显是Invalide Time  
473 - richTextList.push({  
474 - // 查询中文操作符  
475 - operation: findOperation(item.valueType, item.predicate.operation).label,  
476 - value:  
477 - item.valueType === 'DATE_TIME'  
478 - ? formatToDateTime(  
479 - item.predicate.value.defaultValue,  
480 - 'YYYY-MM-DD HH:mm:ss'  
481 - )  
482 - : String(item.predicate.value.defaultValue),  
483 - attribute: item?.key?.key,  
484 - });  
485 - //TODO-fengtao之前是Number( item.predicate.value.defaultValue)-发现回显是Invalide Time  
486 - ConditionScreeningForm[ruleIndex].value[conditionIndex].setFieldsValue(  
487 - formItem  
488 - ); 418 + // 循环设置条件筛选值。TODO:此处设置顺序有问题
  419 + action.doContext.clearRule.map((rule, ruleIndex) => {
  420 + // 生成对应条件筛选的数组个数
  421 + unref(skipUnwrap.actionItemRefs)[index].setConditionScreeningList([
  422 + ...new Array(
  423 + action.doContext.clearRule[
  424 + ruleIndex
  425 + ].triggerCondition.condition.condition.length
  426 + ).keys(),
  427 + ]);
  428 + nextTick(() => {
  429 + const richTextList = [];
  430 + rule.triggerCondition.condition.condition.forEach((item, conditionIndex) => {
  431 + //TODO-fengtao之前是Number( item.predicate.value.defaultValue)-发现回显是Invalide Time
  432 + const formItem = {
  433 + operation: item.predicate.operation,
  434 + value:
  435 + item.valueType === 'DATE_TIME'
  436 + ? formatToDateTime(
  437 + Number(item.predicate.value.defaultValue),
  438 + 'YYYY-MM-DD HH:mm:ss'
  439 + )
  440 + : String(item.predicate.value.defaultValue),
  441 + ignoreCase:
  442 + item.valueType === 'STRING' ? item.predicate.ignoreCase : undefined,
  443 + };
  444 + //TODO-fengtao之前是Number( item.predicate.value.defaultValue)-发现回显是Invalide Time
  445 + richTextList.push({
  446 + // 查询中文操作符
  447 + operation: findOperation(item.valueType, item.predicate.operation).label,
  448 + value:
  449 + item.valueType === 'DATE_TIME'
  450 + ? formatToDateTime(
  451 + item.predicate.value.defaultValue,
  452 + 'YYYY-MM-DD HH:mm:ss'
  453 + )
  454 + : String(item.predicate.value.defaultValue),
  455 + attribute: item?.key?.key,
489 }); 456 });
490 - unref(skipUnwrap.actionItemRefs)[index].setRichText(richTextList, ruleIndex); 457 + //TODO-fengtao之前是Number( item.predicate.value.defaultValue)-发现回显是Invalide Time
  458 + ConditionScreeningForm[ruleIndex].value[conditionIndex].setFieldsValue(
  459 + formItem
  460 + );
491 }); 461 });
  462 + unref(skipUnwrap.actionItemRefs)[index].setRichText(richTextList, ruleIndex);
492 }); 463 });
493 }); 464 });
494 - }  
495 - nextTick(() => {  
496 - setEditFields(skipUnwrap.actionItemRefs, editEntryIdData);  
497 }); 465 });
  466 + }
  467 + nextTick(() => {
  468 + setEditFields(skipUnwrap.actionItemRefs, editEntryIdData);
498 }); 469 });
499 }); 470 });
500 - }  
501 - if (unref(isUpdate) === 3) isView.value = false;  
502 - setDrawerProps({  
503 - showFooter: unref(isView),  
504 - loading: false,  
505 }); 471 });
  472 + }
  473 + if (unref(isUpdate) === 3) isView.value = false;
  474 + setDrawerProps({
  475 + showFooter: unref(isView),
  476 + loading: false,
506 }); 477 });
  478 +});
507 479
508 - // 设置设备的options  
509 - const setEditFields = (linkAge, deviceList) => {  
510 - unref(linkAge).map((item) => {  
511 - //TODO-fengtao  
512 - item.updateFieldDeviceId(deviceList, orgId, isUpdate, getMasterDeviceList);  
513 - //TODO-fengtao  
514 - });  
515 - };  
516 - // 设置告警配置options  
517 - const setEditAlarmConfig = (linkAge, alarmConfigList) => {  
518 - unref(linkAge).map((item) => {  
519 - item.updateEditFieldAlarmConfig(alarmConfigList);  
520 - });  
521 - };  
522 - // 监听组织变化更新设备列表  
523 - const deviceList = ref([]);  
524 - const getMasterDeviceList = ref([]);  
525 - const orgId = ref('');  
526 - const alarmConfigList = ref([]);  
527 - watch(organizationId, async (newValue: string) => {  
528 - if (!newValue) return;  
529 - const { items } = await screenLinkPageByDeptIdGetDevice({ organizationId: newValue });  
530 - //TODO fengtao  
531 - getMasterDeviceList.value = await byOganizationIdGetMasterDevice(newValue);  
532 - //TODO fengtao  
533 - deviceList.value = items.map((item) => ({ label: item.name, value: item.tbDeviceId })); 480 +
  481 +// 设置设备的options
  482 +const setEditFields = (linkAge, deviceList) => {
  483 + unref(linkAge).map((item) => {
  484 + //TODO-fengtao
  485 + item.updateFieldDeviceId(deviceList, orgId, isUpdate, getMasterDeviceList);
  486 + //TODO-fengtao
  487 + });
  488 +};
  489 +// 设置告警配置options
  490 +const setEditAlarmConfig = (linkAge, alarmConfigList) => {
  491 + unref(linkAge).map((item) => {
  492 + item.updateEditFieldAlarmConfig(alarmConfigList);
  493 + });
  494 +};
  495 +// 监听组织变化更新设备列表
  496 +const deviceList = ref([]);
  497 +const getMasterDeviceList = ref([]);
  498 +const orgId = ref('');
  499 +const alarmConfigList = ref([]);
  500 +watch(organizationId, async (newValue: string) => {
  501 + if (!newValue) return;
  502 + const { items } = await screenLinkPageByDeptIdGetDevice({ organizationId: newValue });
  503 + //TODO fengtao
  504 + getMasterDeviceList.value = await byOganizationIdGetMasterDevice(newValue);
  505 + //TODO fengtao
  506 + deviceList.value = items.map((item) => ({ label: item.name, value: item.tbDeviceId }));
  507 + //TODO fengtao
  508 + orgId.value = newValue;
  509 + //TODO fengtao
  510 + setFields(skipUnwrap.triggerItemRefs, true);
  511 + setFields(skipUnwrap.conditionItemRefs, true);
  512 + setFields(skipUnwrap.actionItemRefs, true);
  513 + const data = await getOrganizationAlarmConfig({ organizationId: newValue });
  514 + alarmConfigList.value = data.map((item) => ({ label: item.name, value: item.id }));
  515 + setAlarmConfig(skipUnwrap.actionItemRefs, true);
  516 +});
  517 +
  518 +// 根据上面组织变化动态改变触发器,执行条件,执行动作的设备值
  519 +function setFields(linkAge, isOrganizationChange = false) {
  520 + unref(linkAge).map((item) => {
  521 + isOrganizationChange && item.resetFieldsValueFunc();
534 //TODO fengtao 522 //TODO fengtao
535 - orgId.value = newValue; 523 + item.updateFieldDeviceId(deviceList, orgId, isUpdate, getMasterDeviceList);
536 //TODO fengtao 524 //TODO fengtao
537 - setFields(skipUnwrap.triggerItemRefs, true);  
538 - setFields(skipUnwrap.conditionItemRefs, true);  
539 - setFields(skipUnwrap.actionItemRefs, true);  
540 - const data = await getOrganizationAlarmConfig({ organizationId: newValue });  
541 - alarmConfigList.value = data.map((item) => ({ label: item.name, value: item.id }));  
542 - setAlarmConfig(skipUnwrap.actionItemRefs, true);  
543 }); 525 });
  526 +}
  527 +function setAlarmConfig(linkAge, isOrganizationChange = false) {
  528 + unref(linkAge).map((item) => {
  529 + isOrganizationChange && item.resetFieldsValueFunc();
  530 + item.updateFieldAlarmConfig(alarmConfigList);
  531 + });
  532 +}
  533 +// 添加触发器
  534 +const addTrigger = () => {
  535 + unref(triggerData).push(Date.now());
  536 + nextTick(() => {
  537 + setFields(skipUnwrap.triggerItemRefs);
  538 + });
  539 +};
  540 +// 添加执行条件
  541 +const addCondition = () => {
  542 + unref(conditionData).push(Date.now());
  543 + nextTick(() => {
  544 + setFields(skipUnwrap.conditionItemRefs);
  545 + });
  546 +};
  547 +// 添加执行动作
  548 +const addAction = () => {
  549 + unref(actionData).push(Date.now());
  550 + nextTick(() => {
  551 + setFields(skipUnwrap.actionItemRefs);
  552 + });
  553 +};
544 554
545 - // 根据上面组织变化动态改变触发器,执行条件,执行动作的设备值  
546 - function setFields(linkAge, isOrganizationChange = false) {  
547 - unref(linkAge).map((item) => {  
548 - isOrganizationChange && item.resetFieldsValueFunc();  
549 - //TODO fengtao  
550 - item.updateFieldDeviceId(deviceList, orgId, isUpdate, getMasterDeviceList);  
551 - //TODO fengtao  
552 - }); 555 +/**
  556 + * 获取触发器、执行条件、执行动作表单值--多个
  557 + */
  558 +const getFormValueFunc = () => {
  559 + getTriggerFormValue.value = unref(skipUnwrap.triggerItemRefs)?.map((item) =>
  560 + genTriggerOrConditionData(item.getFieldsValueFunc())
  561 + );
  562 + getConditionFormValue.value = unref(skipUnwrap.conditionItemRefs)?.map((item) =>
  563 + genTriggerOrConditionData(item.getFieldsValueFunc())
  564 + );
  565 + getActionFormValue.value = unref(skipUnwrap.actionItemRefs)?.map((item) =>
  566 + genActionData(item.getFieldsValueFunc())
  567 + );
  568 +};
  569 +const handleSubmit = async () => {
  570 + let basicFormValue = await validate();
  571 + if (!basicFormValue) return;
  572 + for (const item of unref(skipUnwrap.actionItemRefs)) {
  573 + const valid = await item.validateForm();
  574 + if (!valid) return;
553 } 575 }
554 - function setAlarmConfig(linkAge, isOrganizationChange = false) {  
555 - unref(linkAge).map((item) => {  
556 - isOrganizationChange && item.resetFieldsValueFunc();  
557 - item.updateFieldAlarmConfig(alarmConfigList);  
558 - }); 576 + try {
  577 + setDrawerProps({ confirmLoading: true });
  578 + getFormValueFunc();
  579 + const postAddOrEditData = {
  580 + ...basicFormValue,
  581 + triggers: !unref(getTriggerFormValue).length ? null : unref(getTriggerFormValue),
  582 + doConditions: !unref(getConditionFormValue).length ? null : unref(getConditionFormValue),
  583 + doActions: unref(getActionFormValue).flat(),
  584 + id: unref(id),
  585 + tenantId: unref(tenantId),
  586 + };
  587 + await screenLinkPageAddApi(postAddOrEditData, unref(isUpdate));
  588 + createMessage.success(`${unref(isUpdate) ? '编辑' : '新增'}成功`);
  589 + closeDrawer();
  590 + handleClose();
  591 + emit('success');
  592 + } finally {
  593 + setDrawerProps({ confirmLoading: false });
559 } 594 }
560 - // 添加触发器  
561 - const addTrigger = () => {  
562 - unref(triggerData).push(Date.now());  
563 - nextTick(() => {  
564 - setFields(skipUnwrap.triggerItemRefs);  
565 - });  
566 - };  
567 - // 添加执行条件  
568 - const addCondition = () => {  
569 - unref(conditionData).push(Date.now());  
570 - nextTick(() => {  
571 - setFields(skipUnwrap.conditionItemRefs);  
572 - });  
573 - };  
574 - // 添加执行动作  
575 - const addAction = () => {  
576 - unref(actionData).push(Date.now());  
577 - nextTick(() => {  
578 - setFields(skipUnwrap.actionItemRefs);  
579 - });  
580 - };  
581 -  
582 - /**  
583 - * 获取触发器、执行条件、执行动作表单值--多个  
584 - */  
585 - const getFormValueFunc = () => {  
586 - getTriggerFormValue.value = unref(skipUnwrap.triggerItemRefs)?.map((item) =>  
587 - genTriggerOrConditionData(item.getFieldsValueFunc())  
588 - );  
589 - getConditionFormValue.value = unref(skipUnwrap.conditionItemRefs)?.map((item) =>  
590 - genTriggerOrConditionData(item.getFieldsValueFunc())  
591 - );  
592 - getActionFormValue.value = unref(skipUnwrap.actionItemRefs)?.map((item) =>  
593 - genActionData(item.getFieldsValueFunc())  
594 - );  
595 - };  
596 - const handleSubmit = async () => {  
597 - let basicFormValue = await validate();  
598 - if (!basicFormValue) return;  
599 - for (const item of unref(skipUnwrap.actionItemRefs)) {  
600 - const valid = await item.validateForm();  
601 - if (!valid) return;  
602 - }  
603 - try {  
604 - setDrawerProps({ confirmLoading: true });  
605 - getFormValueFunc();  
606 - const postAddOrEditData = {  
607 - ...basicFormValue,  
608 - triggers: !unref(getTriggerFormValue).length ? null : unref(getTriggerFormValue),  
609 - doConditions: !unref(getConditionFormValue).length ? null : unref(getConditionFormValue),  
610 - doActions: unref(getActionFormValue).flat(),  
611 - id: unref(id),  
612 - tenantId: unref(tenantId),  
613 - };  
614 - await screenLinkPageAddApi(postAddOrEditData, unref(isUpdate));  
615 - createMessage.success(`${unref(isUpdate) ? '编辑' : '新增'}成功`);  
616 - closeDrawer();  
617 - handleClose();  
618 - emit('success');  
619 - } finally {  
620 - setDrawerProps({ confirmLoading: false });  
621 - }  
622 - };  
623 - // 删除  
624 - const deleteTriggerOrCondition = ({ index, title }) => {  
625 - if (title === '触发器') {  
626 - unref(triggerData).splice(index, 1);  
627 - } else if (title === '执行条件') {  
628 - unref(conditionData).splice(index, 1);  
629 - }  
630 - };  
631 - const deleteAction = (actionIndex) => {  
632 - unref(actionData).splice(actionIndex, 1);  
633 - unref(arr).splice(actionIndex, 1);  
634 - };  
635 - const arr = ref([]);  
636 - const getActionFormArr = () => {  
637 - arr.value = unref(skipUnwrap.actionItemRefs).map((item) => item.getFieldsValue());  
638 - };  
639 - const handleClose = () => {  
640 - id.value = undefined;  
641 - tenantId.value = undefined;  
642 - organizationId.value = undefined;  
643 - isView.value = true;  
644 - getTriggerFormValue.value = [];  
645 - getConditionFormValue.value = [];  
646 - getActionFormValue.value = [];  
647 - triggerData.value = [];  
648 - conditionData.value = [];  
649 - actionData.value = [];  
650 - unref(skipUnwrap.triggerItemRefs).map((item) => {  
651 - item.resetFieldsValueFunc();  
652 - });  
653 - unref(skipUnwrap.conditionItemRefs).map((item) => {  
654 - item.resetFieldsValueFunc();  
655 - });  
656 - unref(skipUnwrap.actionItemRefs).map((item) => {  
657 - item.resetFieldsValueFunc();  
658 - });  
659 - }; 595 +};
  596 +// 删除
  597 +const deleteTriggerOrCondition = ({ index, title }) => {
  598 + if (title === '触发器') {
  599 + unref(triggerData).splice(index, 1);
  600 + } else if (title === '执行条件') {
  601 + unref(conditionData).splice(index, 1);
  602 + }
  603 +};
  604 +const deleteAction = (actionIndex) => {
  605 + unref(actionData).splice(actionIndex, 1);
  606 + unref(arr).splice(actionIndex, 1);
  607 +};
  608 +const arr = ref([]);
  609 +const getActionFormArr = () => {
  610 + arr.value = unref(skipUnwrap.actionItemRefs).map((item) => item.getFieldsValue());
  611 +};
  612 +const handleClose = () => {
  613 + id.value = undefined;
  614 + tenantId.value = undefined;
  615 + organizationId.value = undefined;
  616 + isView.value = true;
  617 + getTriggerFormValue.value = [];
  618 + getConditionFormValue.value = [];
  619 + getActionFormValue.value = [];
  620 + triggerData.value = [];
  621 + conditionData.value = [];
  622 + actionData.value = [];
  623 + unref(skipUnwrap.triggerItemRefs).map((item) => {
  624 + item.resetFieldsValueFunc();
  625 + });
  626 + unref(skipUnwrap.conditionItemRefs).map((item) => {
  627 + item.resetFieldsValueFunc();
  628 + });
  629 + unref(skipUnwrap.actionItemRefs).map((item) => {
  630 + item.resetFieldsValueFunc();
  631 + });
  632 + window.localStorage.removeItem('isViewDisabledBtn')
  633 + // window.localStorage.setItem('isViewDisabledBtn', 'no')
  634 +};
660 </script> 635 </script>
661 636
662 <style lang="less" scoped> 637 <style lang="less" scoped>
663 - //TODO-fengtao  
664 - ///移除选择框默认样式(24px)否则超出默认宽度会造成页面样式错乱  
665 - :deep(.ant-select-selector) {  
666 - padding-right: 0px !important;  
667 - } 638 +//TODO-fengtao
  639 +///移除选择框默认样式(24px)否则超出默认宽度会造成页面样式错乱
  640 +:deep(.ant-select-selector) {
  641 + padding-right: 0px !important;
  642 +}
668 643
669 - :deep(.ant-select-selection-overflow) {  
670 - max-width: 10vw !important;  
671 - }  
672 - //TODO-fengtao 644 +:deep(.ant-select-selection-overflow) {
  645 + max-width: 10vw !important;
  646 +}
  647 +
  648 +//TODO-fengtao
673 </style> 649 </style>
@@ -2,8 +2,8 @@ import { ref } from 'vue'; @@ -2,8 +2,8 @@ import { ref } from 'vue';
2 import { BasicColumn, FormSchema } from '/@/components/Table'; 2 import { BasicColumn, FormSchema } from '/@/components/Table';
3 import { screenLinkOrganizationGetApi } from '/@/api/ruleengine/ruleengineApi'; 3 import { screenLinkOrganizationGetApi } from '/@/api/ruleengine/ruleengineApi';
4 import { scheduleOptions } from './formatData'; 4 import { scheduleOptions } from './formatData';
5 -  
6 import { copyTransFun } from '/@/utils/fnUtils'; 5 import { copyTransFun } from '/@/utils/fnUtils';
  6 +import { numberAndNonegativeRule,numberAndEngLishRule } from '/@/utils/rules';
7 7
8 /** 8 /**
9 * 所使用的枚举值 9 * 所使用的枚举值
@@ -208,6 +208,7 @@ export const trigger_condition_schema: FormSchema[] = [ @@ -208,6 +208,7 @@ export const trigger_condition_schema: FormSchema[] = [
208 ifShow: ({ values }) => isTimeDuration(values.triggered), 208 ifShow: ({ values }) => isTimeDuration(values.triggered),
209 colProps: { span: 6 }, 209 colProps: { span: 6 },
210 slot: 'time', 210 slot: 'time',
  211 + rules: numberAndNonegativeRule,
211 }, 212 },
212 { 213 {
213 field: 'timeUnit', 214 field: 'timeUnit',
@@ -226,6 +227,7 @@ export const trigger_condition_schema: FormSchema[] = [ @@ -226,6 +227,7 @@ export const trigger_condition_schema: FormSchema[] = [
226 }, 227 },
227 ifShow: ({ values }) => isReplace(values.triggered), 228 ifShow: ({ values }) => isReplace(values.triggered),
228 colProps: { span: 6 }, 229 colProps: { span: 6 },
  230 + rules: numberAndNonegativeRule,
229 }, 231 },
230 { 232 {
231 field: 'triggerType', 233 field: 'triggerType',
@@ -263,6 +265,7 @@ export const trigger_condition_schema: FormSchema[] = [ @@ -263,6 +265,7 @@ export const trigger_condition_schema: FormSchema[] = [
263 }, 265 },
264 ifShow: ({ values }) => isDevice(values.triggerType), 266 ifShow: ({ values }) => isDevice(values.triggerType),
265 colProps: { span: 6 }, 267 colProps: { span: 6 },
  268 + rules: numberAndEngLishRule,
266 }, 269 },
267 { 270 {
268 field: 'operationType', 271 field: 'operationType',
1 import { formatToDateTime } from '/@/utils/dateUtil'; 1 import { formatToDateTime } from '/@/utils/dateUtil';
2 import { Number_Operation, String_Operation, Boolean_Operation } from '/@/enums/operationEnum'; 2 import { Number_Operation, String_Operation, Boolean_Operation } from '/@/enums/operationEnum';
  3 +import { numberAndNonegativeRule } from '/@/utils/rules';
  4 +
3 // 生成触发器或执行条件JSON数据 5 // 生成触发器或执行条件JSON数据
4 export const genTriggerOrConditionData = (triggerData) => { 6 export const genTriggerOrConditionData = (triggerData) => {
5 const { 7 const {
@@ -244,6 +246,10 @@ export function isType(operationType) { @@ -244,6 +246,10 @@ export function isType(operationType) {
244 label: '操作值', 246 label: '操作值',
245 required: true, 247 required: true,
246 component: 'InputNumber', 248 component: 'InputNumber',
  249 + componentProps: {
  250 + min: 0,
  251 + max: 99999999999,
  252 + },
247 colProps: { 253 colProps: {
248 span: 8, 254 span: 8,
249 }, 255 },
@@ -256,7 +262,7 @@ export function isType(operationType) { @@ -256,7 +262,7 @@ export function isType(operationType) {
256 label: '忽略大小写', 262 label: '忽略大小写',
257 component: 'Checkbox', 263 component: 'Checkbox',
258 colProps: { 264 colProps: {
259 - span: 6, 265 + span: 4,
260 }, 266 },
261 }, 267 },
262 { 268 {
@@ -264,22 +270,20 @@ export function isType(operationType) { @@ -264,22 +270,20 @@ export function isType(operationType) {
264 label: '执行操作', 270 label: '执行操作',
265 component: 'Select', 271 component: 'Select',
266 required: true, 272 required: true,
267 -  
268 componentProps: { 273 componentProps: {
269 options: operationString, 274 options: operationString,
270 }, 275 },
271 colProps: { 276 colProps: {
272 - span: 7, 277 + span: 8,
273 }, 278 },
274 }, 279 },
275 { 280 {
276 field: 'value', 281 field: 'value',
277 label: '操作值', 282 label: '操作值',
278 required: true, 283 required: true,
279 -  
280 component: 'Input', 284 component: 'Input',
281 colProps: { 285 colProps: {
282 - span: 7, 286 + span: 9,
283 }, 287 },
284 }, 288 },
285 ]; 289 ];
@@ -330,7 +334,7 @@ export function isType(operationType) { @@ -330,7 +334,7 @@ export function isType(operationType) {
330 options: operationNumber_OR_TIME, 334 options: operationNumber_OR_TIME,
331 }, 335 },
332 colProps: { 336 colProps: {
333 - span: 7, 337 + span: 8,
334 }, 338 },
335 }, 339 },
336 { 340 {
1 <template> 1 <template>
2 - <BasicModal  
3 - v-bind="$attrs"  
4 - :width="600"  
5 - title="编辑报警日程"  
6 - centered  
7 - @register="registerModal"  
8 - @ok="handleOk"  
9 - @cancel="handleCancel"  
10 - > 2 + <BasicModal v-bind="$attrs" :width="600" title="编辑报警日程" centered @register="registerModal" @ok="handleOk"
  3 + @cancel="handleCancel">
11 <BasicForm @register="registerForm" ref="basicFormRef"> 4 <BasicForm @register="registerForm" ref="basicFormRef">
12 <template #customEnable> 5 <template #customEnable>
13 <template v-for="(item, optionIndex) in options" :key="item.flag"> 6 <template v-for="(item, optionIndex) in options" :key="item.flag">
@@ -15,230 +8,222 @@ @@ -15,230 +8,222 @@
15 <div class="ml-4 mr-4 flex items-center"> 8 <div class="ml-4 mr-4 flex items-center">
16 <Checkbox v-model:checked="item.enabled">星期{{ item.flag }}</Checkbox> 9 <Checkbox v-model:checked="item.enabled">星期{{ item.flag }}</Checkbox>
17 </div> 10 </div>
18 - <TimePicker  
19 - placeholder="开始时间"  
20 - v-model:value="item.startsOn"  
21 - value-format="x"  
22 - format="HH:mm"  
23 - :disabled="!item.enabled"  
24 - /> 11 + <TimePicker placeholder="开始时间" v-model:value="item.startsOn" value-format="x" format="HH:mm"
  12 + :disabled="!item.enabled" />
25 <span class="ml-4 mr-4 flex items-center">~</span> 13 <span class="ml-4 mr-4 flex items-center">~</span>
26 - <TimePicker  
27 - placeholder="结束时间"  
28 - v-model:value="item.endsOn"  
29 - value-format="x"  
30 - format="HH:mm"  
31 - :disabled="!item.enabled"  
32 - /> </div  
33 - ></template> 14 + <TimePicker @change="handleBlur(item.startsOn,item.endsOn)" placeholder="结束时间" v-model:value="item.endsOn"
  15 + value-format="x" format="HH:mm" :disabled="!item.enabled" />
  16 + </div>
  17 + </template>
34 </template> 18 </template>
35 <template #timing> 19 <template #timing>
36 - <TimePicker  
37 - placeholder="开始时间"  
38 - v-model:value="timeState.startsOn"  
39 - value-format="x"  
40 - format="HH:mm"  
41 - /> 20 + <TimePicker placeholder="开始时间" v-model:value="timeState.startsOn" value-format="x" format="HH:mm" />
42 <span class="ml-4 mr-4">~</span> 21 <span class="ml-4 mr-4">~</span>
43 - <TimePicker  
44 - placeholder="结束时间"  
45 - v-model:value="timeState.endsOn"  
46 - value-format="x"  
47 - format="HH:mm"  
48 - /> 22 + <TimePicker @change="handleTimeBlur(timeState.startsOn,timeState.endsOn)" placeholder="结束时间"
  23 + v-model:value="timeState.endsOn" value-format="x" format="HH:mm" />
49 </template> 24 </template>
50 </BasicForm> 25 </BasicForm>
51 </BasicModal> 26 </BasicModal>
52 </template> 27 </template>
53 28
54 <script lang="ts" setup> 29 <script lang="ts" setup>
55 - import { reactive, ref, watch, nextTick } from 'vue';  
56 - import { useModalInner, BasicModal } from '/@/components/Modal';  
57 - import { BasicForm, useForm } from '/@/components/Form';  
58 - import { alarmScheduleSchemas } from '../config/config.data.ts';  
59 - import { Checkbox, TimePicker } from 'ant-design-vue'; 30 +import { reactive, ref, watch, nextTick } from 'vue';
  31 +import { useModalInner, BasicModal } from '/@/components/Modal';
  32 +import { BasicForm, useForm } from '/@/components/Form';
  33 +import { alarmScheduleSchemas } from '../config/config.data.ts';
  34 +import { Checkbox, TimePicker } from 'ant-design-vue';
  35 +import { useMessage } from '/@/hooks/web/useMessage';
60 36
61 - const emit = defineEmits(['register', 'cancel']);  
62 - const [registerForm, { setFieldsValue, getFieldsValue }] = useForm({  
63 - showActionButtonGroup: false,  
64 - schemas: alarmScheduleSchemas,  
65 - });  
66 - const timeState = reactive({ 37 +const emit = defineEmits(['register', 'cancel']);
  38 +const { createMessage } = useMessage();
  39 +const [registerForm, { setFieldsValue, getFieldsValue }] = useForm({
  40 + showActionButtonGroup: false,
  41 + schemas: alarmScheduleSchemas,
  42 +});
  43 +const timeState = reactive({
  44 + startsOn: null,
  45 + endsOn: null,
  46 +});
  47 +
  48 +const options = ref([
  49 + {
  50 + enabled: false,
  51 + dayOfWeek: 1,
  52 + flag: '一',
  53 + endsOn: null,
67 startsOn: null, 54 startsOn: null,
  55 + },
  56 + {
  57 + enabled: false,
  58 + dayOfWeek: 2,
  59 + flag: '二',
68 endsOn: null, 60 endsOn: null,
69 - });  
70 -  
71 - const options = ref([  
72 - {  
73 - enabled: false,  
74 - dayOfWeek: 1,  
75 - flag: '一',  
76 - endsOn: null,  
77 - startsOn: null,  
78 - },  
79 - {  
80 - enabled: false,  
81 - dayOfWeek: 2,  
82 - flag: '二',  
83 - endsOn: null,  
84 - startsOn: null,  
85 - },  
86 - {  
87 - enabled: false,  
88 - dayOfWeek: 3,  
89 - flag: '三',  
90 - endsOn: null,  
91 - startsOn: null,  
92 - },  
93 - {  
94 - enabled: false,  
95 - dayOfWeek: 4,  
96 - flag: '四',  
97 - endsOn: null,  
98 - startsOn: null,  
99 - },  
100 - {  
101 - enabled: false,  
102 - dayOfWeek: 5,  
103 - flag: '五',  
104 - endsOn: null,  
105 - startsOn: null,  
106 - },  
107 - {  
108 - enabled: false,  
109 - dayOfWeek: 6,  
110 - flag: '六',  
111 - endsOn: null,  
112 - startsOn: null,  
113 - },  
114 - {  
115 - enabled: false,  
116 - dayOfWeek: 7,  
117 - flag: '日',  
118 - endsOn: null,  
119 - startsOn: null,  
120 - },  
121 - ]);  
122 - const basicFormRef = ref<InstanceType<typeof BasicForm>>();  
123 - let index = ref(null);  
124 - watch(  
125 - options,  
126 - (newValue) => {  
127 - const arr = [];  
128 - for (let item of newValue) {  
129 - if (item.enabled && item.startsOn && item.endsOn) {  
130 - arr.push(true);  
131 - } else if ((!item.enabled && item.startsOn && item.endsOn) || item.enabled) {  
132 - arr.push(false);  
133 - } 61 + startsOn: null,
  62 + },
  63 + {
  64 + enabled: false,
  65 + dayOfWeek: 3,
  66 + flag: '三',
  67 + endsOn: null,
  68 + startsOn: null,
  69 + },
  70 + {
  71 + enabled: false,
  72 + dayOfWeek: 4,
  73 + flag: '四',
  74 + endsOn: null,
  75 + startsOn: null,
  76 + },
  77 + {
  78 + enabled: false,
  79 + dayOfWeek: 5,
  80 + flag: '五',
  81 + endsOn: null,
  82 + startsOn: null,
  83 + },
  84 + {
  85 + enabled: false,
  86 + dayOfWeek: 6,
  87 + flag: '六',
  88 + endsOn: null,
  89 + startsOn: null,
  90 + },
  91 + {
  92 + enabled: false,
  93 + dayOfWeek: 7,
  94 + flag: '日',
  95 + endsOn: null,
  96 + startsOn: null,
  97 + },
  98 +]);
  99 +const basicFormRef = ref<InstanceType<typeof BasicForm>>();
  100 +let index = ref(null);
  101 +watch(
  102 + options,
  103 + (newValue) => {
  104 + const arr = [];
  105 + for (let item of newValue) {
  106 + if (item.enabled && item.startsOn && item.endsOn) {
  107 + arr.push(true);
  108 + } else if ((!item.enabled && item.startsOn && item.endsOn) || item.enabled) {
  109 + arr.push(false);
134 } 110 }
135 - console.log(arr);  
136 - const flag = arr.length ? !arr.every((item) => item) : true;  
137 - console.log(flag);  
138 - nextTick(() => {  
139 - setModalProps({  
140 - okButtonProps: {  
141 - disabled: flag,  
142 - },  
143 - });  
144 - });  
145 - },  
146 - {  
147 - deep: true,  
148 } 111 }
149 - );  
150 -  
151 - const [registerModal, { closeModal, setModalProps }] = useModalInner((data) => {  
152 - watch([timeState, basicFormRef.value.formModel], ([timeState, formModel]) => { 112 + const flag = arr.length ? !arr.every((item) => item) : true;
  113 + nextTick(() => {
153 setModalProps({ 114 setModalProps({
154 okButtonProps: { 115 okButtonProps: {
155 - disabled:  
156 - timeState.startsOn === null ||  
157 - timeState.endsOn === null ||  
158 - !formModel.daysOfWeek?.length, 116 + disabled: flag,
159 }, 117 },
160 }); 118 });
161 - watch(  
162 - () => formModel.schedule,  
163 - () => {  
164 - timeState.startsOn = null;  
165 - timeState.endsOn = null;  
166 - }  
167 - );  
168 }); 119 });
169 - const { value, currentIndex, isUpdate, scheduleData } = data;  
170 - index.value = currentIndex;  
171 - const dayZenoTime = Math.round(new Date(new Date().toLocaleDateString()).getTime());  
172 - // 编辑  
173 - setFieldsValue({  
174 - schedule: value, 120 + },
  121 + {
  122 + deep: true,
  123 + }
  124 +);
  125 +
  126 +const [registerModal, { closeModal, setModalProps }] = useModalInner((data) => {
  127 + watch([timeState, basicFormRef.value.formModel], ([timeState, formModel]) => {
  128 + setModalProps({
  129 + okButtonProps: {
  130 + disabled:
  131 + timeState.startsOn === null ||
  132 + timeState.endsOn === null ||
  133 + !formModel.daysOfWeek?.length,
  134 + },
175 }); 135 });
176 - if (isUpdate) {  
177 - nextTick(() => {  
178 - // 回显定时启用  
179 - if (scheduleData.type === 'SPECIFIC_TIME') {  
180 - setFieldsValue({  
181 - daysOfWeek: scheduleData.daysOfWeek,  
182 - });  
183 - timeState.startsOn = scheduleData.startsOn + dayZenoTime + '';  
184 - timeState.endsOn = scheduleData.endsOn + dayZenoTime + '';  
185 - }  
186 - // 回显自定义启用  
187 - if (scheduleData.type === 'CUSTOM') {  
188 - for (let [index, item] of scheduleData?.items.entries()) {  
189 - if (item.enabled) {  
190 - options.value[index].enabled = item.enabled;  
191 - options.value[index].startsOn = item.startsOn + dayZenoTime + '';  
192 - options.value[index].endsOn = item.endsOn + dayZenoTime + '';  
193 - }  
194 - }  
195 - }  
196 - });  
197 - } 136 + watch(
  137 + () => formModel.schedule,
  138 + () => {
  139 + timeState.startsOn = null;
  140 + timeState.endsOn = null;
  141 + }
  142 + );
198 }); 143 });
199 - const scheduleData = ref({  
200 - type: 'ANY_TIME', 144 + const { value, currentIndex, isUpdate, scheduleData } = data;
  145 + index.value = currentIndex;
  146 + const dayZenoTime = Math.round(new Date(new Date().toLocaleDateString()).getTime());
  147 + // 编辑
  148 + setFieldsValue({
  149 + schedule: value,
201 }); 150 });
202 - const handleOk = () => {  
203 - const { schedule: type, timezone, daysOfWeek } = getFieldsValue();  
204 - // 获取当天0时时间戳  
205 - const dayZenoTime = Math.round(new Date(new Date().toLocaleDateString()).getTime());  
206 - if (type === 'CUSTOM') {  
207 - const items = options.value.map((item) => {  
208 - return {  
209 - startsOn: item.startsOn ? item.startsOn - dayZenoTime : 0,  
210 - endsOn: item.endsOn ? item.endsOn - dayZenoTime : 0,  
211 - dayOfWeek: item.dayOfWeek,  
212 - enabled: item.enabled,  
213 - };  
214 - });  
215 - scheduleData.value = {  
216 - type,  
217 - timezone,  
218 - items,  
219 - };  
220 - } else if (type === 'SPECIFIC_TIME') {  
221 - scheduleData.value = {  
222 - type,  
223 - timezone,  
224 - daysOfWeek,  
225 - startsOn: timeState.startsOn - dayZenoTime,  
226 - endsOn: timeState.endsOn - dayZenoTime, 151 + if (isUpdate) {
  152 + nextTick(() => {
  153 + // 回显定时启用
  154 + if (scheduleData.type === 'SPECIFIC_TIME') {
  155 + setFieldsValue({
  156 + daysOfWeek: scheduleData.daysOfWeek,
  157 + });
  158 + timeState.startsOn = scheduleData.startsOn + dayZenoTime + '';
  159 + timeState.endsOn = scheduleData.endsOn + dayZenoTime + '';
  160 + }
  161 + // 回显自定义启用
  162 + if (scheduleData.type === 'CUSTOM') {
  163 + for (let [index, item] of scheduleData?.items.entries()) {
  164 + if (item.enabled) {
  165 + options.value[index].enabled = item.enabled;
  166 + options.value[index].startsOn = item.startsOn + dayZenoTime + '';
  167 + options.value[index].endsOn = item.endsOn + dayZenoTime + '';
  168 + }
  169 + }
  170 + }
  171 + });
  172 + }
  173 +});
  174 +const scheduleData = ref({
  175 + type: 'ANY_TIME',
  176 +});
  177 +const handleBlur = (eS, eE) => {
  178 + if (eS > eE) {
  179 + return createMessage.error('开始时间不能大于结束时间')
  180 + }
  181 +}
  182 +const handleTimeBlur = (eS, eE) => {
  183 + if (eS > eE) {
  184 + return createMessage.error('开始时间不能大于结束时间')
  185 + }
  186 +}
  187 +const handleOk = () => {
  188 + const { schedule: type, timezone, daysOfWeek } = getFieldsValue();
  189 + // 获取当天0时时间戳
  190 + const dayZenoTime = Math.round(new Date(new Date().toLocaleDateString()).getTime());
  191 + if (type === 'CUSTOM') {
  192 + const items = options.value.map((item) => {
  193 + return {
  194 + startsOn: item.startsOn ? item.startsOn - dayZenoTime : 0,
  195 + endsOn: item.endsOn ? item.endsOn - dayZenoTime : 0,
  196 + dayOfWeek: item.dayOfWeek,
  197 + enabled: item.enabled,
227 }; 198 };
228 - }  
229 - closeModal();  
230 - };  
231 - const handleCancel = () => {  
232 - emit('cancel', index.value);  
233 - }; 199 + });
  200 + scheduleData.value = {
  201 + type,
  202 + timezone,
  203 + items,
  204 + };
  205 + } else if (type === 'SPECIFIC_TIME') {
  206 + scheduleData.value = {
  207 + type,
  208 + timezone,
  209 + daysOfWeek,
  210 + startsOn: timeState.startsOn - dayZenoTime,
  211 + endsOn: timeState.endsOn - dayZenoTime,
  212 + };
  213 + }
  214 + closeModal();
  215 +};
  216 +const handleCancel = () => {
  217 + emit('cancel', index.value);
  218 +};
234 219
235 - defineExpose({  
236 - scheduleData,  
237 - }); 220 +defineExpose({
  221 + scheduleData,
  222 +});
238 </script> 223 </script>
239 224
240 <style lang="less" scoped> 225 <style lang="less" scoped>
241 - :deep(.ant-time-picker) {  
242 - width: 12rem;  
243 - } 226 +:deep(.ant-time-picker) {
  227 + width: 12rem;
  228 +}
244 </style> 229 </style>
@@ -3,96 +3,94 @@ @@ -3,96 +3,94 @@
3 <CollapseContainer ref="collapseContainerRef" @expand="handleExpand"> 3 <CollapseContainer ref="collapseContainerRef" @expand="handleExpand">
4 <template #title> 4 <template #title>
5 <div>条件筛选</div> 5 <div>条件筛选</div>
6 - <RichText :otherAttribute="otherAttribute" @resetFilter="resetFilter"  
7 - /></template> 6 + <RichText :otherAttribute="otherAttribute" @resetFilter="resetFilter" />
  7 + </template>
8 8
9 <template v-for="(item, index) in conditionScreeningList" :key="item"> 9 <template v-for="(item, index) in conditionScreeningList" :key="item">
10 - <ConditionScreeningForm  
11 - :conditionScreeningList="conditionScreeningList"  
12 - :ref="refItem.conditionScreeningRefs"  
13 - :index="index"  
14 - @deleteConditionForm="deleteConditionForm"  
15 - /> 10 + <ConditionScreeningForm :conditionScreeningList="conditionScreeningList" :ref="refItem.conditionScreeningRefs"
  11 + :index="index" @deleteConditionForm="deleteConditionForm" />
16 </template> 12 </template>
17 </CollapseContainer> 13 </CollapseContainer>
18 14
19 <div class="flex justify-between"> 15 <div class="flex justify-between">
20 - <a-button type="primary" class="mt-4 ml-2" @click="addConditionForm">新增条件筛选</a-button>  
21 - <a-button type="primary" class="mt-4 mr-2" @click="preView" v-if="isPreview">保存</a-button> 16 + <a-button :disabled="isViewDisabledBtn=='isView'?true:false" type="primary" class="mt-4 ml-2"
  17 + @click="addConditionForm">新增条件筛选</a-button>
  18 + <a-button :disabled="isViewDisabledBtn=='isView'?true:false" type="primary" class="mt-4 mr-2" @click="preView"
  19 + v-if="isPreview">保存</a-button>
22 </div> 20 </div>
23 </div> 21 </div>
24 </template> 22 </template>
25 23
26 <script lang="ts" setup> 24 <script lang="ts" setup>
27 - import { unref, ref } from 'vue';  
28 - import ConditionScreeningForm from './ConditionScreeningForm.vue';  
29 - import { conditionPreView } from '../config/formatData.ts';  
30 - import { CollapseContainer } from '/@/components/Container/index';  
31 - import RichText from './RichText.vue';  
32 - const props = defineProps({  
33 - childGetFieldsValue: {  
34 - type: Function,  
35 - required: true, 25 +import { unref, ref } from 'vue';
  26 +import ConditionScreeningForm from './ConditionScreeningForm.vue';
  27 +import { conditionPreView } from '../config/formatData.ts';
  28 +import { CollapseContainer } from '/@/components/Container/index';
  29 +import RichText from './RichText.vue';
  30 +const props = defineProps({
  31 + childGetFieldsValue: {
  32 + type: Function,
  33 + required: true,
  34 + },
  35 +});
  36 +const refItem = {
  37 + conditionScreeningRefs: ref([]),
  38 +};
  39 +const isViewDisabledBtn = window.localStorage.getItem('isViewDisabledBtn')
  40 +const isPreview = ref(true);
  41 +const collapseContainerRef = ref();
  42 +const conditionScreeningList = ref([Date.now()]);
  43 +const addConditionForm = () => {
  44 + if (!unref(isPreview)) {
  45 + collapseContainerRef.value.handleExpand();
  46 + }
  47 + unref(conditionScreeningList).push(Date.now());
  48 + const lastIndex = refItem.conditionScreeningRefs.value.length - 1;
  49 + refItem.conditionScreeningRefs.value[lastIndex]?.appendSchemaByField(
  50 + {
  51 + field: 'AND',
  52 + label: '和',
  53 + component: 'Input',
  54 + slot: 'and',
  55 + // labelWidth: 50,
  56 + colProps: { span: 3 },
36 }, 57 },
37 - });  
38 - const refItem = {  
39 - conditionScreeningRefs: ref([]),  
40 - }; 58 + 'value'
  59 + );
  60 +};
  61 +const handleExpand = (show) => {
  62 + isPreview.value = show;
  63 +};
41 64
42 - const isPreview = ref(true);  
43 - const collapseContainerRef = ref();  
44 - const conditionScreeningList = ref([Date.now()]);  
45 - const addConditionForm = () => {  
46 - if (!unref(isPreview)) {  
47 - collapseContainerRef.value.handleExpand();  
48 - }  
49 - unref(conditionScreeningList).push(Date.now());  
50 - const lastIndex = refItem.conditionScreeningRefs.value.length - 1;  
51 - refItem.conditionScreeningRefs.value[lastIndex]?.appendSchemaByField(  
52 - {  
53 - field: 'AND',  
54 - label: '和',  
55 - component: 'Input',  
56 - slot: 'and',  
57 - // labelWidth: 50,  
58 - colProps: { span: 3 },  
59 - },  
60 - 'value'  
61 - );  
62 - };  
63 - const handleExpand = (show) => {  
64 - isPreview.value = show;  
65 - };  
66 -  
67 - const otherAttribute = ref([]);  
68 - // 预览条件筛选结果  
69 - const preView = async () => {  
70 - const attributes = [];  
71 - const fieldsValue = props.childGetFieldsValue();  
72 - for (let i = 0; i < unref(refItem.conditionScreeningRefs).length; i++) {  
73 - const valid = await unref(refItem.conditionScreeningRefs)[i].validate();  
74 - if (!valid) return;  
75 - attributes.push({  
76 - ...unref(refItem.conditionScreeningRefs)[i].getFieldsValue(),  
77 - attribute: fieldsValue.type2,  
78 - });  
79 - }  
80 - otherAttribute.value = conditionPreView(attributes, fieldsValue.operationType);  
81 - collapseContainerRef.value.handleExpand();  
82 - }; 65 +const otherAttribute = ref([]);
  66 +// 预览条件筛选结果
  67 +const preView = async () => {
  68 + const attributes = [];
  69 + const fieldsValue = props.childGetFieldsValue();
  70 + for (let i = 0; i < unref(refItem.conditionScreeningRefs).length; i++) {
  71 + const valid = await unref(refItem.conditionScreeningRefs)[i].validate();
  72 + if (!valid) return;
  73 + attributes.push({
  74 + ...unref(refItem.conditionScreeningRefs)[i].getFieldsValue(),
  75 + attribute: fieldsValue.type2,
  76 + });
  77 + }
  78 + otherAttribute.value = conditionPreView(attributes, fieldsValue.operationType);
  79 + collapseContainerRef.value.handleExpand();
  80 +};
83 81
84 - const resetFilter = () => {  
85 - otherAttribute.value = [];  
86 - };  
87 - const deleteConditionForm = (index) => {  
88 - unref(conditionScreeningList).splice(index, 1);  
89 - const lastIndex = refItem.conditionScreeningRefs.value.length - 2;  
90 - refItem.conditionScreeningRefs.value[lastIndex]?.removeSchemaByFiled('AND');  
91 - }; 82 +const resetFilter = () => {
  83 + otherAttribute.value = [];
  84 +};
  85 +const deleteConditionForm = (index) => {
  86 + unref(conditionScreeningList).splice(index, 1);
  87 + const lastIndex = refItem.conditionScreeningRefs.value.length - 2;
  88 + refItem.conditionScreeningRefs.value[lastIndex]?.removeSchemaByFiled('AND');
  89 +};
92 90
93 - defineExpose({  
94 - refItem,  
95 - conditionScreeningList,  
96 - otherAttribute,  
97 - }); 91 +defineExpose({
  92 + refItem,
  93 + conditionScreeningList,
  94 + otherAttribute,
  95 +});
98 </script> 96 </script>
@@ -6,158 +6,149 @@ @@ -6,158 +6,149 @@
6 <a-button type="primary" @click="handleAdd"> 新增场景联动 </a-button> 6 <a-button type="primary" @click="handleAdd"> 新增场景联动 </a-button>
7 </Authority> 7 </Authority>
8 <Authority value="api:yt:sceneLinkage:delete"> 8 <Authority value="api:yt:sceneLinkage:delete">
9 - <Popconfirm  
10 - title="您确定要批量删除数据"  
11 - ok-text="确定"  
12 - cancel-text="取消"  
13 - @confirm="handleDeleteOrBatchDelete(null)"  
14 - > 9 + <Popconfirm title="您确定要批量删除数据" ok-text="确定" cancel-text="取消" @confirm="handleDeleteOrBatchDelete(null)">
15 <a-button color="error" :disabled="hasBatchDelete"> 批量删除 </a-button> 10 <a-button color="error" :disabled="hasBatchDelete"> 批量删除 </a-button>
16 </Popconfirm> 11 </Popconfirm>
17 </Authority> 12 </Authority>
18 </template> 13 </template>
19 <template #action="{ record }"> 14 <template #action="{ record }">
20 - <TableAction  
21 - :actions="[  
22 - {  
23 - label: '查看',  
24 - auth: 'api:yt:sceneLinkage:get',  
25 - icon: 'ant-design:eye-outlined',  
26 - onClick: handleView.bind(null, record), 15 + <TableAction :actions="[
  16 + {
  17 + label: '查看',
  18 + auth: 'api:yt:sceneLinkage:get',
  19 + icon: 'ant-design:eye-outlined',
  20 + onClick: handleView.bind(null, record),
  21 + },
  22 + {
  23 + label: '编辑',
  24 + auth: 'api:yt:sceneLinkage:update',
  25 + icon: 'clarity:note-edit-line',
  26 + onClick: handleEdit.bind(null, record),
  27 + ifShow: record.creator === userId && record.status !== 1,
  28 + },
  29 + {
  30 + label: '删除',
  31 + auth: 'api:yt:sceneLinkage:delete',
  32 + icon: 'ant-design:delete-outlined',
  33 + color: 'error',
  34 + ifShow: record.creator === userId && record.status !== 1,
  35 + popConfirm: {
  36 + title: '是否确认删除',
  37 + confirm: handleDeleteOrBatchDelete.bind(null, record),
27 }, 38 },
28 - {  
29 - label: '编辑',  
30 - auth: 'api:yt:sceneLinkage:update',  
31 - icon: 'clarity:note-edit-line',  
32 - onClick: handleEdit.bind(null, record),  
33 - ifShow: record.creator === userId && record.status !== 1,  
34 - },  
35 - {  
36 - label: '删除',  
37 - auth: 'api:yt:sceneLinkage:delete',  
38 - icon: 'ant-design:delete-outlined',  
39 - color: 'error',  
40 - ifShow: record.creator === userId && record.status !== 1,  
41 - popConfirm: {  
42 - title: '是否确认删除',  
43 - confirm: handleDeleteOrBatchDelete.bind(null, record),  
44 - },  
45 - },  
46 - ]"  
47 - /> 39 + },
  40 + ]" />
48 </template> 41 </template>
49 42
50 <template #status="{ record }"> 43 <template #status="{ record }">
51 - <Switch  
52 - :checked="record.status === 1"  
53 - :loading="record.pendingStatus"  
54 - checkedChildren="启用"  
55 - unCheckedChildren="禁用"  
56 - @change="(checked:boolean)=>statusChange(checked,record)"  
57 - /> 44 + <Switch :checked="record.status === 1" :loading="record.pendingStatus" checkedChildren="启用"
  45 + unCheckedChildren="禁用" @change="(checked:boolean)=>statusChange(checked,record)" />
58 </template> 46 </template>
59 </BasicTable> 47 </BasicTable>
60 <SceneLinkAgeDrawer @register="registerDrawer" @success="handleSuccess" /> 48 <SceneLinkAgeDrawer @register="registerDrawer" @success="handleSuccess" />
61 </div> 49 </div>
62 </template> 50 </template>
63 <script lang="ts" setup> 51 <script lang="ts" setup>
64 - import { nextTick } from 'vue';  
65 - import { BasicTable, useTable, TableAction } from '/@/components/Table';  
66 - import { useDrawer } from '/@/components/Drawer';  
67 - import {  
68 - screenLinkPageGetApi,  
69 - screenLinkPageDeleteApi,  
70 - screenLinkPagePutApi,  
71 - } from '/@/api/ruleengine/ruleengineApi';  
72 - import { useBatchDelete } from '/@/hooks/web/useBatchDelete';  
73 - import { Switch, Popconfirm } from 'ant-design-vue';  
74 - import { columns, searchFormSchema } from './config/config.data.ts';  
75 - import { USER_INFO_KEY } from '/@/enums/cacheEnum';  
76 - import { getAuthCache } from '/@/utils/auth';  
77 - import SceneLinkAgeDrawer from './SceneLinkAgeDrawer.vue';  
78 - import { useMessage } from '/@/hooks/web/useMessage';  
79 - import { Authority } from '/@/components/Authority'; 52 +import { nextTick } from 'vue';
  53 +import { BasicTable, useTable, TableAction } from '/@/components/Table';
  54 +import { useDrawer } from '/@/components/Drawer';
  55 +import {
  56 + screenLinkPageGetApi,
  57 + screenLinkPageDeleteApi,
  58 + screenLinkPagePutApi,
  59 +} from '/@/api/ruleengine/ruleengineApi';
  60 +import { useBatchDelete } from '/@/hooks/web/useBatchDelete';
  61 +import { Switch, Popconfirm } from 'ant-design-vue';
  62 +import { columns, searchFormSchema } from './config/config.data.ts';
  63 +import { USER_INFO_KEY } from '/@/enums/cacheEnum';
  64 +import { getAuthCache } from '/@/utils/auth';
  65 +import SceneLinkAgeDrawer from './SceneLinkAgeDrawer.vue';
  66 +import { useMessage } from '/@/hooks/web/useMessage';
  67 +import { Authority } from '/@/components/Authority';
80 68
81 - const userInfo: any = getAuthCache(USER_INFO_KEY);  
82 - const userId = userInfo.userId; 69 +const userInfo: any = getAuthCache(USER_INFO_KEY);
  70 +const userId = userInfo.userId;
83 71
84 - const [registerDrawer, { openDrawer }] = useDrawer();  
85 - const [registerTable, { reload, setProps, setSelectedRowKeys }] = useTable({  
86 - title: '场景联动列表',  
87 - api: screenLinkPageGetApi,  
88 - columns,  
89 - formConfig: {  
90 - labelWidth: 120,  
91 - schemas: searchFormSchema,  
92 - },  
93 - useSearchForm: true,  
94 - showTableSetting: true,  
95 - bordered: true,  
96 - showIndexColumn: false,  
97 - actionColumn: {  
98 - width: 200,  
99 - title: '操作',  
100 - dataIndex: 'action',  
101 - slots: { customRender: 'action' },  
102 - fixed: 'right',  
103 - },  
104 - });  
105 - const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions, resetSelectedRowKeys } =  
106 - useBatchDelete(screenLinkPageDeleteApi, handleSuccess, setProps);  
107 - selectionOptions.rowSelection.getCheckboxProps = (record: Recordable) => {  
108 - // Demo:status为1的选择框禁用  
109 - if (record.status === 1) {  
110 - return { disabled: true };  
111 - } else {  
112 - return { disabled: false };  
113 - }  
114 - };  
115 - nextTick(() => {  
116 - setProps(selectionOptions); 72 +const [registerDrawer, { openDrawer }] = useDrawer();
  73 +const [registerTable, { reload, setProps, setSelectedRowKeys }] = useTable({
  74 + title: '场景联动列表',
  75 + api: screenLinkPageGetApi,
  76 + columns,
  77 + formConfig: {
  78 + labelWidth: 120,
  79 + schemas: searchFormSchema,
  80 + },
  81 + useSearchForm: true,
  82 + showTableSetting: true,
  83 + bordered: true,
  84 + showIndexColumn: false,
  85 + actionColumn: {
  86 + width: 200,
  87 + title: '操作',
  88 + dataIndex: 'action',
  89 + slots: { customRender: 'action' },
  90 + fixed: 'right',
  91 + },
  92 +});
  93 +const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions, resetSelectedRowKeys } =
  94 + useBatchDelete(screenLinkPageDeleteApi, handleSuccess, setProps);
  95 +selectionOptions.rowSelection.getCheckboxProps = (record: Recordable) => {
  96 + // Demo:status为1的选择框禁用
  97 + if (record.status === 1) {
  98 + return { disabled: true };
  99 + } else {
  100 + return { disabled: false };
  101 + }
  102 +};
  103 +nextTick(() => {
  104 + setProps(selectionOptions);
  105 +});
  106 +
  107 +function handleAdd() {
  108 + window.localStorage.setItem('isViewDisabledBtn', 'noView')
  109 + openDrawer(true, {
  110 + isUpdate: false,
117 }); 111 });
  112 +}
118 113
119 - function handleAdd() {  
120 - openDrawer(true, {  
121 - isUpdate: false,  
122 - });  
123 - } 114 +function handleEdit(record: Recordable) {
  115 + window.localStorage.setItem('isViewDisabledBtn', 'noView')
  116 + openDrawer(true, {
  117 + record,
  118 + isUpdate: true,
  119 + });
  120 +}
  121 +function handleView(record: Recordable) {
  122 + window.localStorage.setItem('isViewDisabledBtn', 'isView')
  123 + openDrawer(true, {
  124 + record,
  125 + isUpdate: 3,
  126 + });
  127 +}
  128 +function handleSuccess() {
  129 + reload();
  130 +}
124 131
125 - function handleEdit(record: Recordable) {  
126 - openDrawer(true, {  
127 - record,  
128 - isUpdate: true,  
129 - });  
130 - }  
131 - function handleView(record: Recordable) {  
132 - openDrawer(true, {  
133 - record,  
134 - isUpdate: 3, 132 +const statusChange = async (checked, record) => {
  133 + setProps({
  134 + loading: true,
  135 + });
  136 + setSelectedRowKeys([]);
  137 + resetSelectedRowKeys();
  138 + const newStatus = checked ? 1 : 0;
  139 + const { createMessage } = useMessage();
  140 + try {
  141 + await screenLinkPagePutApi({ id: record.id, status: newStatus });
  142 + if (newStatus) {
  143 + createMessage.success(`启用成功`);
  144 + } else {
  145 + createMessage.success('禁用成功');
  146 + }
  147 + } finally {
  148 + setProps({
  149 + loading: false,
135 }); 150 });
136 - }  
137 - function handleSuccess() {  
138 reload(); 151 reload();
139 } 152 }
140 -  
141 - const statusChange = async (checked, record) => {  
142 - setProps({  
143 - loading: true,  
144 - });  
145 - setSelectedRowKeys([]);  
146 - resetSelectedRowKeys();  
147 - const newStatus = checked ? 1 : 0;  
148 - const { createMessage } = useMessage();  
149 - try {  
150 - await screenLinkPagePutApi({ id: record.id, status: newStatus });  
151 - if (newStatus) {  
152 - createMessage.success(`启用成功`);  
153 - } else {  
154 - createMessage.success('禁用成功');  
155 - }  
156 - } finally {  
157 - setProps({  
158 - loading: false,  
159 - });  
160 - reload();  
161 - }  
162 - }; 153 +};
163 </script> 154 </script>
1 <template> 1 <template>
2 <div :class="prefixCls" class="relative w-full h-full px-4"> 2 <div :class="prefixCls" class="relative w-full h-full px-4">
3 - <AppLocalePicker  
4 - class="absolute text-white top-4 right-4 enter-x xl:text-gray-600"  
5 - :showText="false"  
6 - v-if="!sessionTimeout && showLocale"  
7 - /> 3 + <AppLocalePicker class="absolute text-white top-4 right-4 enter-x xl:text-gray-600" :showText="false"
  4 + v-if="!sessionTimeout && showLocale" />
8 <AppDarkModeToggle class="absolute top-3 right-7 enter-x" v-if="!sessionTimeout" /> 5 <AppDarkModeToggle class="absolute top-3 right-7 enter-x" v-if="!sessionTimeout" />
9 6
10 <span class="-enter-x xl:hidden"> 7 <span class="-enter-x xl:hidden">
11 - <AppLogo :alwaysShowTitle="true" /> 8 + <!-- <AppLogo :alwaysShowTitle="true" /> -->
12 </span> 9 </span>
13 10
14 <div class="container relative h-full py-2 mx-auto sm:px-10"> 11 <div class="container relative h-full py-2 mx-auto sm:px-10">
15 <div class="flex h-full"> 12 <div class="flex h-full">
16 <div class="hidden min-h-full pl-4 mr-4 xl:flex xl:flex-col xl:w-6/12"> 13 <div class="hidden min-h-full pl-4 mr-4 xl:flex xl:flex-col xl:w-6/12">
17 - <AppLogo class="-enter-x" /> 14 + <!-- <AppLogo class="-enter-x" /> -->
  15 + <div style="display:flex;margin-top: 10px;">
  16 + <img v-if="getLogo" :src="getLogo" style="width: 48px;height:48px" />
  17 + <img style="width: 48px;height:48px" v-else src="/src/assets/images/logo.png" />
  18 + <div class="ml-2 truncate md:opacity-100"
  19 + style="line-height: 45px;margin-left: 5px;font-size: 24px;color: #fff;font-weight: 700;">
  20 + {{ getTitle }}
  21 + </div>
  22 + </div>
18 <div class="my-auto"> 23 <div class="my-auto">
19 - <img  
20 - :alt="title"  
21 - src="../../../assets/svg/thingskit-login-background.svg"  
22 - class="w-1/2 -mt-16 -enter-x"  
23 - /> 24 + <img :alt="title" src="../../../assets/svg/thingskit-login-background.svg" class="w-1/2 -mt-16 -enter-x" />
24 <div class="mt-10 font-medium text-white -enter-x"> 25 <div class="mt-10 font-medium text-white -enter-x">
25 <span class="inline-block mt-4 text-3xl"> {{ t('sys.login.signInTitle') }}</span> 26 <span class="inline-block mt-4 text-3xl"> {{ t('sys.login.signInTitle') }}</span>
26 </div> 27 </div>
@@ -30,10 +31,8 @@ @@ -30,10 +31,8 @@
30 </div> 31 </div>
31 </div> 32 </div>
32 <div class="flex w-full h-full py-5 xl:h-auto xl:py-0 xl:my-0 xl:w-6/12"> 33 <div class="flex w-full h-full py-5 xl:h-auto xl:py-0 xl:my-0 xl:w-6/12">
33 - <div  
34 - :class="`${prefixCls}-form`"  
35 - class="relative w-full px-5 py-8 mx-auto my-auto rounded-md shadow-md xl:ml-16 xl:bg-transparent sm:px-8 xl:p-4 xl:shadow-none sm:w-3/4 lg:w-2/4 xl:w-auto enter-x"  
36 - > 34 + <div :class="`${prefixCls}-form`"
  35 + class="relative w-full px-5 py-8 mx-auto my-auto rounded-md shadow-md xl:ml-16 xl:bg-transparent sm:px-8 xl:p-4 xl:shadow-none sm:w-3/4 lg:w-2/4 xl:w-auto enter-x">
37 <LoginForm /> 36 <LoginForm />
38 <ForgetPasswordForm /> 37 <ForgetPasswordForm />
39 <RegisterForm /> 38 <RegisterForm />
@@ -45,168 +44,188 @@ @@ -45,168 +44,188 @@
45 </div> 44 </div>
46 </template> 45 </template>
47 <script lang="ts" setup> 46 <script lang="ts" setup>
48 - import { computed } from 'vue';  
49 - import { AppLogo } from '/@/components/Application';  
50 - import { AppLocalePicker, AppDarkModeToggle } from '/@/components/Application';  
51 - import LoginForm from './LoginForm.vue';  
52 - import ForgetPasswordForm from './ForgetPasswordForm.vue';  
53 - import RegisterForm from './RegisterForm.vue';  
54 - import MobileForm from './MobileForm.vue';  
55 - import { useGlobSetting } from '/@/hooks/setting';  
56 - import { useI18n } from '/@/hooks/web/useI18n';  
57 - import { useDesign } from '/@/hooks/web/useDesign';  
58 - import { useLocaleStore } from '/@/store/modules/locale';  
59 - defineProps({  
60 - sessionTimeout: {  
61 - type: Boolean,  
62 - },  
63 - });  
64 -  
65 - const globSetting = useGlobSetting();  
66 - const { prefixCls } = useDesign('login');  
67 - const { t } = useI18n();  
68 - const localeStore = useLocaleStore();  
69 - const showLocale = localeStore.getShowPicker;  
70 - const title = computed(() => globSetting?.title ?? ''); 47 +import { computed } from 'vue';
  48 +import { AppLogo } from '/@/components/Application';
  49 +import { AppLocalePicker, AppDarkModeToggle } from '/@/components/Application';
  50 +import LoginForm from './LoginForm.vue';
  51 +import ForgetPasswordForm from './ForgetPasswordForm.vue';
  52 +import RegisterForm from './RegisterForm.vue';
  53 +import MobileForm from './MobileForm.vue';
  54 +import { useGlobSetting } from '/@/hooks/setting';
  55 +import { useI18n } from '/@/hooks/web/useI18n';
  56 +import { useDesign } from '/@/hooks/web/useDesign';
  57 +import { useLocaleStore } from '/@/store/modules/locale';
  58 +import { useUserStore } from '/@/store/modules/user';
  59 +
  60 +defineProps({
  61 + sessionTimeout: {
  62 + type: Boolean,
  63 + },
  64 +});
  65 +
  66 +const userStore = useUserStore();
  67 +
  68 +const getLogo = computed(() => {
  69 + return userStore.platInfo?.logo;
  70 +});
  71 +const { title } = useGlobSetting();
  72 +const getTitle = computed(() => {
  73 + // 设置icon
  74 + let link = (document.querySelector("link[rel*='icon']") ||
  75 + document.createElement('link')) as HTMLLinkElement;
  76 + link.type = 'image/x-icon';
  77 + link.rel = 'shortcut icon';
  78 + link.href = userStore.platInfo?.icon ?? '/favicon.ico';
  79 + document.getElementsByTagName('head')[0].appendChild(link);
  80 + return userStore.platInfo?.name ?? title;
  81 +});
  82 +// const globSetting = useGlobSetting();
  83 +const { prefixCls } = useDesign('login');
  84 +const { t } = useI18n();
  85 +const localeStore = useLocaleStore();
  86 +const showLocale = localeStore.getShowPicker;
  87 +// const title = computed(() => globSetting?.title ?? '');
71 </script> 88 </script>
72 <style lang="less"> 89 <style lang="less">
73 - @prefix-cls: ~'@{namespace}-login';  
74 - @logo-prefix-cls: ~'@{namespace}-app-logo';  
75 - @countdown-prefix-cls: ~'@{namespace}-countdown-input';  
76 - @dark-bg: #293146; 90 +@prefix-cls: ~'@{namespace}-login';
  91 +@logo-prefix-cls: ~'@{namespace}-app-logo';
  92 +@countdown-prefix-cls: ~'@{namespace}-countdown-input';
  93 +@dark-bg: #293146;
77 94
78 - html[data-theme='dark'] {  
79 - .@{prefix-cls} {  
80 - background-color: @dark-bg; 95 +html[data-theme='dark'] {
  96 + .@{prefix-cls} {
  97 + background-color: @dark-bg;
81 98
82 - &::before {  
83 - background-image: url(/@/assets/svg/login-bg-dark.svg);  
84 - } 99 + &::before {
  100 + background-image: url(/@/assets/svg/login-bg-dark.svg);
  101 + }
85 102
86 - .ant-input,  
87 - .ant-input-password {  
88 - background-color: #232a3b;  
89 - } 103 + .ant-input,
  104 + .ant-input-password {
  105 + background-color: #232a3b;
  106 + }
90 107
91 - .ant-btn:not(.ant-btn-link):not(.ant-btn-primary) {  
92 - border: 1px solid #4a5569;  
93 - } 108 + .ant-btn:not(.ant-btn-link):not(.ant-btn-primary) {
  109 + border: 1px solid #4a5569;
  110 + }
94 111
95 - &-form {  
96 - background: transparent !important;  
97 - } 112 + &-form {
  113 + background: transparent !important;
  114 + }
98 115
99 - .app-iconify {  
100 - color: #fff;  
101 - } 116 + .app-iconify {
  117 + color: #fff;
102 } 118 }
  119 + }
  120 +
  121 + input.fix-auto-fill,
  122 + .fix-auto-fill input {
  123 + -webkit-text-fill-color: #c9d1d9 !important;
  124 + box-shadow: inherit !important;
  125 + }
  126 +}
  127 +
  128 +.@{prefix-cls} {
  129 + min-height: 100%;
  130 + overflow: hidden;
103 131
104 - input.fix-auto-fill,  
105 - .fix-auto-fill input {  
106 - -webkit-text-fill-color: #c9d1d9 !important;  
107 - box-shadow: inherit !important; 132 + @media (max-width: @screen-xl) {
  133 + background-color: #293146;
  134 +
  135 + .@{prefix-cls}-form {
  136 + background-color: #fff;
108 } 137 }
109 } 138 }
110 139
111 - .@{prefix-cls} {  
112 - min-height: 100%;  
113 - overflow: hidden; 140 + &::before {
  141 + position: absolute;
  142 + top: 0;
  143 + left: 0;
  144 + width: 100%;
  145 + height: 100%;
  146 + margin-left: -48%;
  147 + background-image: url(/@/assets/svg/login-bg.svg);
  148 + background-position: 100%;
  149 + background-repeat: no-repeat;
  150 + background-size: auto 100%;
  151 + content: '';
  152 +
114 @media (max-width: @screen-xl) { 153 @media (max-width: @screen-xl) {
115 - background-color: #293146; 154 + display: none;
  155 + }
  156 + }
116 157
117 - .@{prefix-cls}-form {  
118 - background-color: #fff;  
119 - } 158 + .@{logo-prefix-cls} {
  159 + position: absolute;
  160 + top: 12px;
  161 + height: 30px;
  162 +
  163 + &__title {
  164 + font-size: 16px;
  165 + color: #fff;
120 } 166 }
121 167
122 - &::before {  
123 - position: absolute;  
124 - top: 0;  
125 - left: 0;  
126 - width: 100%;  
127 - height: 100%;  
128 - margin-left: -48%;  
129 - background-image: url(/@/assets/svg/login-bg.svg);  
130 - background-position: 100%;  
131 - background-repeat: no-repeat;  
132 - background-size: auto 100%;  
133 - content: '';  
134 - @media (max-width: @screen-xl) {  
135 - display: none;  
136 - } 168 + img {
  169 + width: 32px;
137 } 170 }
  171 + }
138 172
  173 + .container {
139 .@{logo-prefix-cls} { 174 .@{logo-prefix-cls} {
140 - position: absolute;  
141 - top: 12px;  
142 - height: 30px; 175 + display: flex;
  176 + width: 60%;
  177 + height: 80px;
143 178
144 &__title { 179 &__title {
145 - font-size: 16px; 180 + font-size: 24px;
146 color: #fff; 181 color: #fff;
147 } 182 }
148 183
149 img { 184 img {
150 - width: 32px; 185 + width: 48px;
151 } 186 }
152 } 187 }
  188 + }
153 189
154 - .container {  
155 - .@{logo-prefix-cls} {  
156 - display: flex;  
157 - width: 60%;  
158 - height: 80px;  
159 -  
160 - &__title {  
161 - font-size: 24px;  
162 - color: #fff;  
163 - } 190 + &-sign-in-way {
  191 + .anticon {
  192 + font-size: 22px;
  193 + color: #888;
  194 + cursor: pointer;
164 195
165 - img {  
166 - width: 48px;  
167 - } 196 + &:hover {
  197 + color: @primary-color;
168 } 198 }
169 } 199 }
  200 + }
170 201
171 - &-sign-in-way {  
172 - .anticon {  
173 - font-size: 22px;  
174 - color: #888;  
175 - cursor: pointer; 202 + input:not([type='checkbox']) {
  203 + min-width: 360px;
176 204
177 - &:hover {  
178 - color: @primary-color;  
179 - }  
180 - } 205 + @media (max-width: @screen-xl) {
  206 + min-width: 320px;
181 } 207 }
182 208
183 - input:not([type='checkbox']) {  
184 - min-width: 360px;  
185 -  
186 - @media (max-width: @screen-xl) {  
187 - min-width: 320px;  
188 - }  
189 -  
190 - @media (max-width: @screen-lg) {  
191 - min-width: 260px;  
192 - }  
193 -  
194 - @media (max-width: @screen-md) {  
195 - min-width: 240px;  
196 - }  
197 -  
198 - @media (max-width: @screen-sm) {  
199 - min-width: 160px;  
200 - } 209 + @media (max-width: @screen-lg) {
  210 + min-width: 260px;
201 } 211 }
202 212
203 - .@{countdown-prefix-cls} input {  
204 - min-width: unset; 213 + @media (max-width: @screen-md) {
  214 + min-width: 240px;
205 } 215 }
206 216
207 - .ant-divider-inner-text {  
208 - font-size: 12px;  
209 - color: @text-color-secondary; 217 + @media (max-width: @screen-sm) {
  218 + min-width: 160px;
210 } 219 }
211 } 220 }
  221 +
  222 + .@{countdown-prefix-cls} input {
  223 + min-width: unset;
  224 + }
  225 +
  226 + .ant-divider-inner-text {
  227 + font-size: 12px;
  228 + color: @text-color-secondary;
  229 + }
  230 +}
212 </style> 231 </style>
@@ -116,9 +116,14 @@ @@ -116,9 +116,14 @@
116 mode: 'modal', //不要默认的错误提示 116 mode: 'modal', //不要默认的错误提示
117 }) 117 })
118 .catch((data) => { 118 .catch((data) => {
119 - //登录失败返回的html,所以提示框什么都没有  
120 - //去掉提示框  
121 - // createMessage.error(data.message); 119 + //登录失败如果是502,返回的html,那么提示框什么都没有
  120 + if (data.message == 'Invalid username or password' && typeof data.message == 'string') {
  121 + createMessage.error(data.message);
  122 + } else if (data.message == '账号已过期,请联系管理员') {
  123 + createMessage.error(data.message);
  124 + } else {
  125 + createMessage.error(data.message);
  126 + }
122 }); 127 });
123 if (userInfo) { 128 if (userInfo) {
124 notification.success({ 129 notification.success({
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 <div> 2 <div>
3 <BasicModal 3 <BasicModal
4 v-bind="$attrs" 4 v-bind="$attrs"
5 - width="110rem" 5 + width="1460px"
6 :height="heightNum" 6 :height="heightNum"
7 @register="register" 7 @register="register"
8 title="调度日志" 8 title="调度日志"
@@ -47,7 +47,7 @@ @@ -47,7 +47,7 @@
47 format="YYYY-MM-DD HH:mm:ss" 47 format="YYYY-MM-DD HH:mm:ss"
48 /> 48 />
49 </a-col> 49 </a-col>
50 - <a-col :span="4" style="margin-left: 10rem"> 50 + <a-col :span="4" style="margin-left: 12rem">
51 <a-button type="primary" @click="handleClearData">重置</a-button> 51 <a-button type="primary" @click="handleClearData">重置</a-button>
52 <a-button style="margin-left: 10px" @click="handleSearchInfo">查询</a-button> 52 <a-button style="margin-left: 10px" @click="handleSearchInfo">查询</a-button>
53 </a-col> 53 </a-col>
@@ -27,10 +27,25 @@ @@ -27,10 +27,25 @@
27 showActionButtonGroup: false, 27 showActionButtonGroup: false,
28 fieldMapToTime: [['timeZone', ['startTime', 'endTime'], 'YYYY-MM-DD HH:mm:ss']], 28 fieldMapToTime: [['timeZone', ['startTime', 'endTime'], 'YYYY-MM-DD HH:mm:ss']],
29 }); 29 });
  30 + const isViewDetail = ref(false);
30 const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { 31 const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
31 await resetFields(); 32 await resetFields();
32 setDrawerProps({ confirmLoading: false }); 33 setDrawerProps({ confirmLoading: false });
33 isUpdate.value = !!data?.isUpdate; 34 isUpdate.value = !!data?.isUpdate;
  35 + isViewDetail.value = !!data?.isView;
  36 +
  37 + if (unref(isViewDetail)) {
  38 + setDrawerProps({ showFooter: true });
  39 + if (unref(isUpdate)) {
  40 + setDrawerProps({ title: '编辑定时任务' });
  41 + } else {
  42 + setDrawerProps({ title: '新增定时任务' });
  43 + }
  44 + } else {
  45 + setDrawerProps({ showFooter: false });
  46 + setDrawerProps({ title: '查看定时任务' });
  47 + }
  48 +
34 if (unref(isUpdate)) { 49 if (unref(isUpdate)) {
35 //回显基础数据 50 //回显基础数据
36 editId.value = data.record.id; 51 editId.value = data.record.id;
@@ -67,6 +67,10 @@ export const searchSchedueFormSchema: FormSchema[] = [ @@ -67,6 +67,10 @@ export const searchSchedueFormSchema: FormSchema[] = [
67 label: '系统', 67 label: '系统',
68 value: EJobGroup.SYSTEM, 68 value: EJobGroup.SYSTEM,
69 }, 69 },
  70 + {
  71 + label: '报表',
  72 + value: EJobGroup.REPORT,
  73 + },
70 ], 74 ],
71 placeholder: '请选择任务组名', 75 placeholder: '请选择任务组名',
72 }, 76 },
@@ -40,6 +40,12 @@ @@ -40,6 +40,12 @@
40 confirm: handleDeleteOrBatchDelete.bind(null, record), 40 confirm: handleDeleteOrBatchDelete.bind(null, record),
41 }, 41 },
42 }, 42 },
  43 + {
  44 + label: '查看',
  45 + icon: 'ant-design:eye-outlined',
  46 + onClick: handleViewDetail.bind(null, record),
  47 + ifShow: record.status === 1,
  48 + },
43 ]" 49 ]"
44 :dropDownActions="[ 50 :dropDownActions="[
45 { 51 {
@@ -101,7 +107,7 @@ @@ -101,7 +107,7 @@
101 107
102 const disabledSwitch = ref(false); 108 const disabledSwitch = ref(false);
103 const { createMessage } = useMessage(); 109 const { createMessage } = useMessage();
104 - const [registerTable, { setProps, reload }] = useTable({ 110 + const [registerTable, { setProps, reload, setSelectedRowKeys }] = useTable({
105 title: '定时任务列表', 111 title: '定时任务列表',
106 api: scheduePage, 112 api: scheduePage,
107 columns: columnSchedue, 113 columns: columnSchedue,
@@ -128,11 +134,8 @@ @@ -128,11 +134,8 @@
128 const handleSuccess = () => { 134 const handleSuccess = () => {
129 reload(); 135 reload();
130 }; 136 };
131 - const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions } = useBatchDelete(  
132 - deleteSchedueManage,  
133 - handleSuccess,  
134 - setProps  
135 - ); 137 + const { hasBatchDelete, handleDeleteOrBatchDelete, selectionOptions, resetSelectedRowKeys } =
  138 + useBatchDelete(deleteSchedueManage, handleSuccess, setProps);
136 selectionOptions.rowSelection.getCheckboxProps = (record: Recordable) => { 139 selectionOptions.rowSelection.getCheckboxProps = (record: Recordable) => {
137 // Demo:status为1的选择框禁用 140 // Demo:status为1的选择框禁用
138 if (record.status === 1) { 141 if (record.status === 1) {
@@ -166,10 +169,12 @@ @@ -166,10 +169,12 @@
166 openDrawer(true, { 169 openDrawer(true, {
167 isUpdate: true, 170 isUpdate: true,
168 record, 171 record,
  172 + isView: true,
169 }); 173 });
170 } else { 174 } else {
171 openDrawer(true, { 175 openDrawer(true, {
172 isUpdate: false, 176 isUpdate: false,
  177 + isView: true,
173 }); 178 });
174 } 179 }
175 }; 180 };
@@ -179,6 +184,8 @@ @@ -179,6 +184,8 @@
179 setProps({ 184 setProps({
180 loading: true, 185 loading: true,
181 }); 186 });
  187 + setSelectedRowKeys([]);
  188 + resetSelectedRowKeys();
182 disabledSwitch.value = true; 189 disabledSwitch.value = true;
183 const newStatus = checked ? 1 : 0; 190 const newStatus = checked ? 1 : 0;
184 const res = await putSchedueByidAndStatusManage(record.id, newStatus); 191 const res = await putSchedueByidAndStatusManage(record.id, newStatus);
@@ -203,5 +210,14 @@ @@ -203,5 +210,14 @@
203 createMessage.success(`执行一次任务"${record.jobName}"成功`); 210 createMessage.success(`执行一次任务"${record.jobName}"成功`);
204 } 211 }
205 }; 212 };
  213 + const handleViewDetail = (record: Recordable) => {
  214 + if (record) {
  215 + openDrawer(true, {
  216 + isUpdate: true,
  217 + record,
  218 + isView: false,
  219 + });
  220 + }
  221 + };
206 </script> 222 </script>
207 <style lang="less" scoped></style> 223 <style lang="less" scoped></style>
@@ -18,14 +18,20 @@ @@ -18,14 +18,20 @@
18 icon: 'ant-design:send-outlined', 18 icon: 'ant-design:send-outlined',
19 tooltip: '发送通知短信', 19 tooltip: '发送通知短信',
20 ifShow: record.phoneNumber != null && !record.hasPassword, 20 ifShow: record.phoneNumber != null && !record.hasPassword,
21 - onClick: handleSendMsg.bind(null, record), 21 + popConfirm: {
  22 + title: '是否需要发送通知短信',
  23 + confirm: handleSendMsg.bind(null, record),
  24 + },
22 }, 25 },
23 { 26 {
24 label: '清除密码', 27 label: '清除密码',
25 icon: 'ant-design:clear-outlined', 28 icon: 'ant-design:clear-outlined',
26 tooltip: '清除密码', 29 tooltip: '清除密码',
27 ifShow: record.hasPassword, 30 ifShow: record.hasPassword,
28 - onClick: handleResetPassword.bind(null, record), 31 + popConfirm: {
  32 + title: '是否需要清除密码',
  33 + confirm: handleResetPassword.bind(null, record),
  34 + },
29 }, 35 },
30 { 36 {
31 label: '编辑', 37 label: '编辑',