Commit c64231b090575f5df3eb63005cdc7720b635d358

Authored by loveumiko
2 parents 95403b74 9fd33ee3

Merge branch 'main_dev' of http://git.yunteng.com/yunteng/thingskit-front into f…

…ix/board-style-issues
... ... @@ -47,7 +47,7 @@
47 47 transformFile?: (file: File) => string | Blob | Promise<string | Blob | File>;
48 48 api: (file: string | Blob | Promise<string | Blob | File>) => Promise<FileItem>;
49 49 overFileLimitHiddenUploadEntry?: boolean;
50   - beforeUpload: (file: File, fileList: File[]) => boolean;
  50 + beforeUpload?: (file: File, fileList: File[]) => boolean;
51 51 }>(),
52 52 {
53 53 fileList: () => [],
... ... @@ -146,7 +146,7 @@
146 146 :remove="handleRemove"
147 147 >
148 148 <Spin
149   - v-if="!(fileList.length >= getMaxFileLimit) || overFileLimitHiddenUploadEntry"
  149 + v-if="!(fileList.length >= getMaxFileLimit && overFileLimitHiddenUploadEntry)"
150 150 :spinning="loading"
151 151 >
152 152 <div class="w-full h-full flex flex-col justify-center content-center">
... ...
... ... @@ -113,6 +113,10 @@ export const alarmColumns: BasicColumn[] = [
113 113 title: '告警设备',
114 114 dataIndex: 'deviceName',
115 115 width: 100,
  116 + customRender: ({ record }) => {
  117 + const { deviceAlias, deviceName } = record || {};
  118 + return deviceAlias || deviceName;
  119 + },
116 120 },
117 121 {
118 122 title: '告警场景',
... ...
... ... @@ -46,14 +46,16 @@
46 46 const alarmStatus = ref('');
47 47 const [registerDrawer, { closeDrawer }] = useDrawerInner(async (data) => {
48 48 await resetFields();
  49 + const { deviceAlias, deviceName, severity, status, details, id } = data || {};
49 50 await setFieldsValue({
50 51 ...data,
51   - severity: alarmLevel(data.severity),
52   - status: statusType(data.status),
53   - details: JSON.stringify(data.details),
  52 + deviceName: deviceAlias || deviceName,
  53 + severity: alarmLevel(severity),
  54 + status: statusType(status),
  55 + details: JSON.stringify(details),
54 56 });
55   - alarmStatus.value = data.status;
56   - alarmId.value = data.id;
  57 + alarmStatus.value = status;
  58 + alarmId.value = id;
57 59 });
58 60 // 处理报警
59 61 const handleAlarm = async () => {
... ...
... ... @@ -19,14 +19,14 @@
19 19 </a-button>
20 20 </template>
21 21 <template #toolbar>
22   - <Button @click="handleBatchAck" type="primary">批量处理</Button>
  22 + <Button @click="handleBatchAck" type="primary" :disabled="getCanBatchAck">批量处理</Button>
23 23 </template>
24 24 </BasicTable>
25 25 <AlarmDetailDrawer @register="registerDetailDrawer" @success="handleSuccess" />
26 26 </div>
27 27 </template>
28 28 <script lang="ts">
29   - import { defineComponent, nextTick, h } from 'vue';
  29 + import { defineComponent, nextTick, h, computed } from 'vue';
30 30 import { BasicTable, useTable, TableAction } from '/@/components/Table';
31 31 import { alarmColumns, alarmSearchSchemas } from './config/detail.config';
32 32 import { doBatchAckAlarm, getDeviceAlarm } from '/@/api/device/deviceManager';
... ... @@ -55,34 +55,36 @@
55 55 },
56 56
57 57 setup() {
58   - const [registerTable, { reload, getSelectRows, clearSelectedRowKeys }] = useTable({
59   - title: '告警记录列表',
60   - api: getDeviceAlarm,
61   - columns: alarmColumns,
62   - useSearchForm: true,
63   - formConfig: {
64   - labelWidth: 120,
65   - schemas: alarmSearchSchemas,
66   - fieldMapToTime: [['alarmTime', ['startTime', 'endTime'], 'x']],
67   - },
68   - bordered: true,
69   - showIndexColumn: false,
70   - showTableSetting: true,
71   - rowSelection: {
72   - type: 'checkbox',
73   - getCheckboxProps: (record: AlarmLogItem) => {
74   - return {
75   - disabled: record.status === AlarmStatus.CLEARED_ACK,
76   - };
  58 + const [registerTable, { reload, getSelectRows, clearSelectedRowKeys, getRowSelection }] =
  59 + useTable({
  60 + title: '告警记录列表',
  61 + api: getDeviceAlarm,
  62 + columns: alarmColumns,
  63 + useSearchForm: true,
  64 + formConfig: {
  65 + labelWidth: 120,
  66 + schemas: alarmSearchSchemas,
  67 + fieldMapToTime: [['alarmTime', ['startTime', 'endTime'], 'x']],
77 68 },
78   - },
79   - actionColumn: {
80   - width: 200,
81   - title: '操作',
82   - slots: { customRender: 'action' },
83   - fixed: 'right',
84   - },
85   - });
  69 + bordered: true,
  70 + showIndexColumn: false,
  71 + showTableSetting: true,
  72 + clickToRowSelect: false,
  73 + rowSelection: {
  74 + type: 'checkbox',
  75 + getCheckboxProps: (record: AlarmLogItem) => {
  76 + return {
  77 + disabled: record.status === AlarmStatus.CLEARED_ACK,
  78 + };
  79 + },
  80 + },
  81 + actionColumn: {
  82 + width: 200,
  83 + title: '操作',
  84 + slots: { customRender: 'action' },
  85 + fixed: 'right',
  86 + },
  87 + });
86 88 const [registerDetailDrawer, { openDrawer }] = useDrawer();
87 89 const handleDetail = (record: Recordable) => {
88 90 openDrawer(true, record);
... ... @@ -113,7 +115,9 @@
113 115 const value = {
114 116 ['触发属性']: findName,
115 117 ['触发条件']: `${findLogin}${curr.value.logicValue}`,
116   - ['触发值']: `${curr.value.realValue}${findAttribute.detail?.dataType?.specs?.unit?.key}`,
  118 + ['触发值']: `${curr.value.realValue}${
  119 + findAttribute.detail?.dataType?.specs?.unit?.key ?? ''
  120 + }`,
117 121 };
118 122 const data = {
119 123 [item.name]: value,
... ... @@ -151,23 +155,28 @@
151 155 return temp;
152 156 };
153 157 const handleDataFormat = (deviceDetail: any, attributes: any) => {
154   - const { name, tbDeviceId } = deviceDetail;
  158 + const { name, tbDeviceId, alias } = deviceDetail;
155 159 const attribute = attributes.map((item) => ({
156 160 identifier: item.identifier,
157 161 name: item.name,
158 162 detail: item.detail,
159 163 }));
160 164 return {
161   - name,
  165 + name: alias || name,
162 166 tbDeviceId,
163 167 attribute,
164 168 };
165 169 };
166 170
  171 + const getCanBatchAck = computed(() => {
  172 + const rowSelection = getRowSelection();
  173 + return !rowSelection.selectedRowKeys?.length;
  174 + });
  175 +
167 176 const { createMessage } = useMessage();
168 177 const handleBatchAck = async () => {
169 178 const ids = getSelectRows<AlarmLogItem>().map((item) => item.id);
170   -
  179 + if (!ids.length) return;
171 180 await doBatchAckAlarm(ids);
172 181 createMessage.success('操作成功');
173 182 clearSelectedRowKeys();
... ... @@ -181,6 +190,7 @@
181 190 handleSuccess,
182 191 handleViewAlarmDetails,
183 192 handleBatchAck,
  193 + getCanBatchAck,
184 194 };
185 195 },
186 196 });
... ...
... ... @@ -11,6 +11,7 @@
11 11 <template #iconSelect>
12 12 <Upload
13 13 name="avatar"
  14 + accept=".png,.jpg,.jpeg,.gif"
14 15 list-type="picture-card"
15 16 class="avatar-uploader"
16 17 :show-upload-list="false"
... ...
... ... @@ -93,6 +93,7 @@ export const formSchema: FormSchema[] = [
93 93 return {
94 94 listType: 'picture-card',
95 95 maxFileLimit: 1,
  96 + accept: '.png,.jpg,.jpeg,.gif',
96 97 api: async (file: File) => {
97 98 try {
98 99 const formData = new FormData();
... ...
... ... @@ -11,7 +11,7 @@
11 11 import { ConfigurationCenterItemsModal } from '/@/api/configuration/center/model/configurationCenterModal';
12 12 import { PageWrapper } from '/@/components/Page';
13 13 import { BasicForm, useForm } from '/@/components/Form';
14   - import { ConfigurationPermission, searchFormSchema } from './center.data';
  14 + import { ConfigurationPermission, Platform, searchFormSchema } from './center.data';
15 15 import { useMessage } from '/@/hooks/web/useMessage';
16 16 import { Authority } from '/@/components/Authority';
17 17 import { isDevMode } from '/@/utils/env';
... ... @@ -30,6 +30,7 @@
30 30 import { ViewType } from '../../visual/board/config/panelDetail';
31 31 import { useRole } from '/@/hooks/business/useRole';
32 32 import { useClipboard } from '@vueuse/core';
  33 + import { Icon } from '/@/components/Icon';
33 34
34 35 const listColumn = ref(5);
35 36
... ... @@ -187,7 +188,7 @@
187 188
188 189 onMounted(() => {
189 190 const clientHeight = document.documentElement.clientHeight;
190   - const rect = getBoundingClientRect(unref(listEl)!.$el!) as DOMRect;
  191 + const rect = getBoundingClientRect(unref(listEl)!.$el! as HTMLElement) as DOMRect;
191 192 // margin-top 24 height 24
192 193 const paginationHeight = 24 + 24 + 8;
193 194 // list pading top 8 maring-top 8 extra slot 56
... ... @@ -322,7 +323,16 @@
322 323 </template>
323 324 <template #description>
324 325 <div class="truncate h-11">
325   - <div class="truncate">{{ item.organizationDTO.name }}</div>
  326 + <div class="truncate flex justify-between items-center">
  327 + <div>{{ item.organizationDTO.name }}</div>
  328 + <Icon
  329 + :icon="
  330 + item.platform === Platform.PC
  331 + ? 'ri:computer-line'
  332 + : 'clarity:mobile-phone-solid'
  333 + "
  334 + />
  335 + </div>
326 336 <div class="truncate">{{ item.remark || '' }} </div>
327 337 </div>
328 338 </template>
... ...
... ... @@ -59,6 +59,7 @@ export const formSchema: FormSchema[] = [
59 59 return {
60 60 listType: 'picture-card',
61 61 maxFileLimit: 1,
  62 + accept: '.png,.jpg,.jpeg,.gif',
62 63 api: async (file: File) => {
63 64 try {
64 65 const formData = new FormData();
... ...
... ... @@ -175,6 +175,10 @@ export const alarmColumns: BasicColumn[] = [
175 175 title: '告警设备',
176 176 dataIndex: 'deviceName',
177 177 width: 120,
  178 + customRender: ({ record }) => {
  179 + const { deviceAlias, deviceName } = record || {};
  180 + return deviceAlias || deviceName;
  181 + },
178 182 },
179 183 {
180 184 title: '告警场景',
... ...
... ... @@ -52,13 +52,15 @@
52 52 const alarmStatus = ref('');
53 53 const [registerModal, { closeModal }] = useModalInner(async (data) => {
54 54 await resetFields();
  55 + const { deviceAlias, deviceName, severity, status, id } = data || {};
55 56 await setFieldsValue({
56 57 ...data,
57   - severity: alarmLevel(data.severity),
58   - status: statusType(data.status),
  58 + deviceName: deviceAlias || deviceName,
  59 + severity: alarmLevel(severity),
  60 + status: statusType(status),
59 61 });
60   - alarmId.value = data.id;
61   - alarmStatus.value = data.status;
  62 + alarmId.value = id;
  63 + alarmStatus.value = status;
62 64 });
63 65 // 处理报警
64 66 const handleAlarm = async () => {
... ...
... ... @@ -25,6 +25,7 @@
25 25 <template #iconSelect>
26 26 <Upload
27 27 name="avatar"
  28 + accept=".png,.jpg,.jpeg,.gif"
28 29 :show-upload-list="false"
29 30 list-type="picture-card"
30 31 class="avatar-uploader"
... ...
... ... @@ -143,14 +143,14 @@
143 143 return temp;
144 144 };
145 145 const handleDataFormat = (deviceDetail: any, attributes: any) => {
146   - const { name, tbDeviceId } = deviceDetail;
  146 + const { name, alias, tbDeviceId } = deviceDetail;
147 147 const attribute = attributes.map((item) => ({
148 148 identifier: item.identifier,
149 149 name: item.name,
150 150 detail: item.detail,
151 151 }));
152 152 return {
153   - name,
  153 + name: alias || name,
154 154 tbDeviceId,
155 155 attribute,
156 156 };
... ...
... ... @@ -5,6 +5,7 @@
5 5 <Upload
6 6 style="width: 20vw"
7 7 name="avatar"
  8 + accept=".png,.jpg,.jpeg,.gif"
8 9 list-type="picture-card"
9 10 class="avatar-uploader"
10 11 :show-upload-list="false"
... ...
... ... @@ -67,6 +67,9 @@
67 67 for (let i in credentials) Reflect.set(credentialsFile, i, credentials[i]);
68 68 }
69 69 setFieldsValue(value);
  70 + setFieldsValue({
  71 + type: credentials.type,
  72 + });
70 73 };
71 74
72 75 const resetValue = () => resetFields();
... ...
... ... @@ -268,6 +268,7 @@
268 268 //ft-add-2022-11-22
269 269 const type = validate?.outTarget;
270 270 if (type === 'DEVICE_OUT') {
  271 + if (!validate.deviceType) return createMessage.error('请选择类型');
271 272 if (!validate.deviceProfileId) return createMessage.error('请选择产品');
272 273 if (validate.device == 'PART' && validate.deviceId == undefined)
273 274 return createMessage.error('请选择设备');
... ...
... ... @@ -11,6 +11,7 @@
11 11 <template #iconSelect>
12 12 <Upload
13 13 name="avatar"
  14 + accept=".png,.jpg,.jpeg,.gif"
14 15 list-type="picture-card"
15 16 class="avatar-uploader"
16 17 :show-upload-list="false"
... ...