Commit 7c676bd0c6636952a4bcc11a36bca34666861320
Merge branch 'ww' into 'main'
fix: BUG in teambition See merge request huang/yun-teng-iot-front!299
Showing
8 changed files
with
93 additions
and
25 deletions
src/assets/svg/component.svg
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<svg width="54px" height="54px" viewBox="0 0 54 54" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> | |
3 | + <title>组件图标</title> | |
4 | + <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> | |
5 | + <g id="看板管理" transform="translate(-322.000000, -326.000000)" fill="#377DFF"> | |
6 | + <g id="1" transform="translate(302.000000, 234.000000)"> | |
7 | + <g id="组件图标" transform="translate(20.000000, 92.000000)"> | |
8 | + <rect id="矩形" opacity="0.1" x="0" y="0" width="54" height="54" rx="22"></rect> | |
9 | + <g id="组件" transform="translate(13.500000, 15.000000)" fill-rule="nonzero"> | |
10 | + <path d="M25.2323972,16.1837421 C25.0692247,16.1837421 24.9060522,16.2163766 24.7577136,16.2816456 L24.7517801,16.2846123 L24.7458465,16.2846123 L13.2377373,21.1886867 L1.72666139,16.2875791 L1.72072785,16.2875791 L1.7147943,16.2846123 C1.5664557,16.2223101 1.40921677,16.1867089 1.24011076,16.1867089 C0.554786392,16.1867089 0,16.7592959 0,17.4653877 C0,17.9994066 0.31744462,18.4533228 0.765427215,18.646163 L12.7482199,23.7519778 L12.760087,23.7549446 C13.0626978,23.8854826 13.4068434,23.8854826 13.7094541,23.7549446 L13.7153877,23.7519778 C13.7183544,23.7519778 13.7183544,23.7490111 13.7213212,23.7490111 L25.7041139,18.6431962 C26.1520965,18.450356 26.469553,17.9964399 26.469553,17.4624209 C26.4725079,16.7563291 25.9177215,16.1837421 25.2323972,16.1837421 Z M25.2323972,10.650712 C24.9980222,10.6447785 24.7577136,10.7456487 24.7577136,10.7456487 L13.2377373,15.6526899 L1.7147943,10.7456487 C1.7147943,10.7456487 1.40921677,10.650712 1.24011076,10.650712 C0.554786392,10.650712 0,11.2203323 0,11.9264241 C0,12.4574763 0.31744462,12.9143592 0.765427215,13.1042326 L12.7482199,18.2070807 C12.7511867,18.2070807 12.7511867,18.2100475 12.7541535,18.2100475 L12.7571203,18.2130142 C12.9054589,18.2753165 13.0626978,18.3109177 13.2318038,18.3109177 C13.4009098,18.3109177 13.5611155,18.2753165 13.7064873,18.2130142 L13.7124209,18.2100475 C13.7153877,18.2100475 13.7153877,18.2100475 13.7183544,18.2070807 L25.7011472,13.1042326 C26.1491297,12.9143592 26.4665744,12.4574763 26.469553,11.9264241 C26.4725079,11.2203323 25.9177215,10.650712 25.2323972,10.650712 L25.2323972,10.650712 Z M0.765427215,7.57120253 L12.7482199,12.6770174 C12.7511867,12.6770174 12.7511867,12.6770174 12.7541535,12.6799842 L12.7571203,12.6829509 C12.9054589,12.7452532 13.0626978,12.7778877 13.2318038,12.7778877 C13.3949763,12.7778877 13.555182,12.7452532 13.7064873,12.6829509 L13.7124209,12.6799842 L13.7183544,12.6770174 L25.7011472,7.5741693 C26.1491297,7.38132911 26.4665744,6.92741297 26.4695411,6.39636076 C26.4695411,5.86234177 26.1520965,5.40842563 25.7041139,5.21558544 L13.7213212,0.106803797 C13.7183544,0.106803797 13.7183544,0.106803797 13.7153877,0.103837025 L13.7094541,0.100870253 C13.4068434,-0.0296677215 13.0626978,-0.0296677215 12.760087,0.100870253 L12.7571203,0.103837025 L0.765427215,5.21261867 C0.31744462,5.40249209 0,5.859375 0,6.39339399 C0,6.9244462 0.31744462,7.37836234 0.765427215,7.57120253 Z" id="形状"></path> | |
11 | + </g> | |
12 | + </g> | |
13 | + </g> | |
14 | + </g> | |
15 | + </g> | |
16 | +</svg> | |
\ No newline at end of file | ... | ... |
... | ... | @@ -89,6 +89,16 @@ |
89 | 89 | } |
90 | 90 | ); |
91 | 91 | |
92 | + watch( | |
93 | + () => props.radio, | |
94 | + () => { | |
95 | + const option = beforeUpdateFn(props.layout.componentType); | |
96 | + setTimeout(() => { | |
97 | + unref(chartRef)?.setOption((option(unref(getRadio)) as unknown as EChartsOption) || {}); | |
98 | + }); | |
99 | + } | |
100 | + ); | |
101 | + | |
92 | 102 | let timeout: Nullable<number> = null; |
93 | 103 | |
94 | 104 | function handleRandomValue() { |
... | ... | @@ -101,6 +111,7 @@ |
101 | 111 | initChart(); |
102 | 112 | props.add && props.add(props.value.id, update); |
103 | 113 | if (props.random) timeout = setInterval(handleRandomValue, 2000) as unknown as number; |
114 | + console.log(unref(chartRef)); | |
104 | 115 | }); |
105 | 116 | |
106 | 117 | onUnmounted(() => { | ... | ... |
... | ... | @@ -107,10 +107,9 @@ export const instrumentComponent1 = (params?: Partial<ComponentInfo>): EChartsOp |
107 | 107 | lineHeight: 30, |
108 | 108 | borderRadius: 8, |
109 | 109 | offsetCenter: [0, '-15%'], |
110 | - // fontSize: 16, | |
111 | 110 | fontSize: 14, |
112 | 111 | fontWeight: 'bolder', |
113 | - formatter: `{value} ${unit ?? '°C'}`, | |
112 | + formatter: `{value} ${unit ?? ''}`, | |
114 | 113 | color: params?.fontColor || 'inherit', |
115 | 114 | }, |
116 | 115 | data: [ |
... | ... | @@ -219,7 +218,7 @@ export const instrumentComponent2 = (params?: Partial<ComponentInfo>): EChartsOp |
219 | 218 | }, |
220 | 219 | detail: { |
221 | 220 | valueAnimation: true, |
222 | - formatter: `{value} ${unit}`, | |
221 | + formatter: `{value} ${unit ?? ''}`, | |
223 | 222 | color: params?.fontColor || 'inherit', |
224 | 223 | fontSize: 14, |
225 | 224 | }, | ... | ... |
... | ... | @@ -46,12 +46,18 @@ |
46 | 46 | getAllDataSourceFieldValue: Fn<any, Recordable>; |
47 | 47 | }>(); |
48 | 48 | |
49 | + const resetForm = () => { | |
50 | + isEdit.value = false; | |
51 | + frontId.value = ''; | |
52 | + componentRecord.value = {} as unknown as DataBoardLayoutInfo; | |
53 | + componentDefaultConfig.value = {}; | |
54 | + }; | |
55 | + | |
49 | 56 | const handleSubmit = () => { |
50 | 57 | const { getAllDataSourceFieldValue } = unref(basicConfigurationEl)!; |
51 | 58 | const value = getAllDataSourceFieldValue(); |
52 | 59 | unref(isEdit) ? handleUpdateComponent(value) : handleAddComponent(value); |
53 | - isEdit.value = false; | |
54 | - frontId.value = ''; | |
60 | + resetForm(); | |
55 | 61 | }; |
56 | 62 | |
57 | 63 | const handleAddComponent = async (value: Recordable) => { |
... | ... | @@ -111,6 +117,7 @@ |
111 | 117 | width="70%" |
112 | 118 | :destroy-on-close="true" |
113 | 119 | @ok="handleSubmit" |
120 | + @cancel="resetForm" | |
114 | 121 | > |
115 | 122 | <section> |
116 | 123 | <Tabs type="card"> | ... | ... |
... | ... | @@ -228,6 +228,12 @@ |
228 | 228 | // dataBoardList.value = []; |
229 | 229 | loading.value = true; |
230 | 230 | const data = await getDataBoradDetail(); |
231 | + | |
232 | + if (!data.data.componentData) { | |
233 | + dataBoardList.value = []; | |
234 | + console.log(unref(dataBoardList)); | |
235 | + return; | |
236 | + } | |
231 | 237 | dataBoardList.value = data.data.componentData.map((item) => { |
232 | 238 | const index = data.data.componentLayout.findIndex((each) => item.id === each.id); |
233 | 239 | let layout; |
... | ... | @@ -350,9 +356,9 @@ |
350 | 356 | </template> |
351 | 357 | <template #extra> |
352 | 358 | <Authority value="api:yt:data_component:add:post"> |
353 | - <Button v-if="!getIsSharePage" type="primary" @click="handleOpenCreatePanel" | |
354 | - >创建组件</Button | |
355 | - > | |
359 | + <Button v-if="!getIsSharePage" type="primary" @click="handleOpenCreatePanel"> | |
360 | + 创建组件 | |
361 | + </Button> | |
356 | 362 | </Authority> |
357 | 363 | </template> |
358 | 364 | <div> | ... | ... |
... | ... | @@ -77,6 +77,7 @@ export function useSocketConnect(dataSourceRef: Ref<DataBoardLayoutInfo[]>) { |
77 | 77 | // console.log({ dataSource: unref(dataSourceRef), cmdIdMapping }); |
78 | 78 | const res: ResponseMessage = JSON.parse(message.data); |
79 | 79 | const { subscriptionId, data = {} } = res; |
80 | + if (!subscriptionId) return; | |
80 | 81 | const mappingRecord = cmdIdMapping.get(subscriptionId); |
81 | 82 | if (!mappingRecord) return; |
82 | 83 | const { attribute, recordIndex, dataSourceIndex } = mappingRecord; |
... | ... | @@ -102,8 +103,14 @@ export function useSocketConnect(dataSourceRef: Ref<DataBoardLayoutInfo[]>) { |
102 | 103 | let index = 0; |
103 | 104 | unref(dataSourceRef).forEach((record, recordIndex) => { |
104 | 105 | const componentId = record.record.id; |
105 | - record.record.dataSource.forEach((dataSource, dataSourceIndex) => { | |
106 | + for ( | |
107 | + let dataSourceIndex = 0; | |
108 | + dataSourceIndex < record.record.dataSource.length; | |
109 | + dataSourceIndex++ | |
110 | + ) { | |
111 | + const dataSource = record.record.dataSource[dataSourceIndex]; | |
106 | 112 | const { deviceId, attribute, slaveDeviceId, gatewayDevice } = dataSource; |
113 | + if (!attribute) continue; | |
107 | 114 | const cmdId = index; |
108 | 115 | index++; |
109 | 116 | setCmdId(cmdId, { |
... | ... | @@ -117,7 +124,7 @@ export function useSocketConnect(dataSourceRef: Ref<DataBoardLayoutInfo[]>) { |
117 | 124 | messageList.push( |
118 | 125 | generateMessage(gatewayDevice ? slaveDeviceId : deviceId, cmdId, attribute) |
119 | 126 | ); |
120 | - }); | |
127 | + } | |
121 | 128 | }); |
122 | 129 | return { |
123 | 130 | tsSubCmds: messageList, | ... | ... |
... | ... | @@ -160,8 +160,8 @@ |
160 | 160 | |
161 | 161 | <template> |
162 | 162 | <PageWrapper> |
163 | - <div class="flex mb-6 items-center"> | |
164 | - <div class="text-lg mr-6 font-bold">自定义看板</div> | |
163 | + <div class="flex mb-6 items-center bg-light-100 h-78px"> | |
164 | + <div class="text-lg ml-30px mr-9px font-bold">自定义看板</div> | |
165 | 165 | <Authority value="api:yt:data_board:add:post"> |
166 | 166 | <Button type="primary" @click="handleOpenDetailModal">创建看板</Button> |
167 | 167 | </Authority> |
... | ... | @@ -171,11 +171,14 @@ |
171 | 171 | ref="listEL" |
172 | 172 | :pagination="paginationProp" |
173 | 173 | :data-source="dataBoardList" |
174 | - :grid="{ gutter: 5, column: 4, xs: 1, sm: 2, md: 2, lg: 3, xl: 3, xxl: 3 }" | |
174 | + :grid="{ gutter: 20, column: 4, xs: 1, sm: 2, md: 2, lg: 3, xl: 3, xxl: 3 }" | |
175 | 175 | > |
176 | 176 | <template #renderItem="{ item }"> |
177 | 177 | <ListItem> |
178 | 178 | <Card class="data-card cursor-pointer"> |
179 | + <template #title> | |
180 | + <div>{{ item.name }}</div> | |
181 | + </template> | |
179 | 182 | <template #extra> |
180 | 183 | <Dropdown |
181 | 184 | v-if="dropMenuList.length" |
... | ... | @@ -188,17 +191,17 @@ |
188 | 191 | </template> |
189 | 192 | <!-- <template #cover>title</template> --> |
190 | 193 | <section @click="handleViewBoard(item)"> |
191 | - <div class="flex justify-between items-center"> | |
192 | - <div>{{ item.name }}</div> | |
193 | - <div class="flex content-center"> | |
194 | - <Statistic :value="item.componentNum"> | |
194 | + <div class="flex data-card__info"> | |
195 | + <div> | |
196 | + <div>组件数量</div> | |
197 | + <Statistic style="font-size: 22px" :value="item.componentNum"> | |
195 | 198 | <template #suffix> |
196 | - <span class="text-sm">个组件</span> | |
199 | + <span class="text-sm">个</span> | |
197 | 200 | </template> |
198 | 201 | </Statistic> |
199 | 202 | </div> |
200 | 203 | </div> |
201 | - <div class="flex justify-between mt-4"> | |
204 | + <div class="flex justify-between mt-4 text-sm" style="color: #999999"> | |
202 | 205 | <div> |
203 | 206 | <span> |
204 | 207 | {{ item.viewType === ViewType.PRIVATE_VIEW ? '私有看板' : '公共看板' }} |
... | ... | @@ -221,13 +224,30 @@ |
221 | 224 | </PageWrapper> |
222 | 225 | </template> |
223 | 226 | |
224 | -<style scoped> | |
227 | +<style scoped lang="less"> | |
225 | 228 | .data-card:deep(.ant-card-head) { |
229 | + padding: 20px; | |
230 | + } | |
231 | + | |
232 | + .data-card:deep(.ant-card-head-title) { | |
226 | 233 | padding: 0; |
227 | - height: 40px; | |
228 | - min-height: 40px; | |
229 | 234 | } |
230 | 235 | .data-card:deep(.ant-card-extra) { |
231 | - padding: 8px; | |
236 | + padding: 0; | |
237 | + } | |
238 | + .data-card:deep(.ant-card-body) { | |
239 | + padding: 20px; | |
240 | + } | |
241 | + | |
242 | + .data-card__info { | |
243 | + color: #666666; | |
244 | + | |
245 | + &::before { | |
246 | + content: ''; | |
247 | + width: 54px; | |
248 | + height: 54px; | |
249 | + margin-right: 16px; | |
250 | + background-image: url('/@/assets/svg/component.svg'); | |
251 | + } | |
232 | 252 | } |
233 | 253 | </style> | ... | ... |
... | ... | @@ -112,7 +112,7 @@ |
112 | 112 | const wrapRef = ref<HTMLDivElement | null>(null); |
113 | 113 | const chartRef = ref<HTMLDivElement | null>(null); |
114 | 114 | const deviceAttrs = ref<string[]>([]); |
115 | - const { setOptions, getInstance } = useECharts(chartRef as Ref<HTMLDivElement>); | |
115 | + const { setOptions, getInstance, resize } = useECharts(chartRef as Ref<HTMLDivElement>); | |
116 | 116 | const isNull = ref(true); |
117 | 117 | const { toPromise } = useScript({ src: BAI_DU_MAP_URL }); |
118 | 118 | const [registerDetailDrawer, { openDrawer }] = useDrawer(); |
... | ... | @@ -270,6 +270,7 @@ |
270 | 270 | // 发送请求 |
271 | 271 | loading.value = true; |
272 | 272 | const res = await getDeviceHistoryInfo(searchParams); |
273 | + loading.value = false; | |
273 | 274 | // 判断数据对象是否为空 |
274 | 275 | if (!Object.keys(res).length) { |
275 | 276 | isNull.value = false; |
... | ... | @@ -278,7 +279,6 @@ |
278 | 279 | isNull.value = true; |
279 | 280 | } |
280 | 281 | setChartOptions(res, value.keys); |
281 | - loading.value = false; | |
282 | 282 | }, |
283 | 283 | }); |
284 | 284 | |
... | ... | @@ -332,6 +332,7 @@ |
332 | 332 | startTs: Date.now() - 1 * 24 * 60 * 60 * 1000, |
333 | 333 | endTs: Date.now(), |
334 | 334 | agg: AggregateDataEnum.NONE, |
335 | + limit: 7, | |
335 | 336 | }); |
336 | 337 | |
337 | 338 | // 判断对象是否为空 |
... | ... | @@ -371,6 +372,7 @@ |
371 | 372 | data: dataArray.filter((item1) => item1[2] === item), |
372 | 373 | }; |
373 | 374 | }); |
375 | + resize(); | |
374 | 376 | // 设置数据 |
375 | 377 | setOptions(eChartOptions(series, keys)); |
376 | 378 | } | ... | ... |