Commit 75b071fac8a55d370cf366812dd807016dc302f2

Authored by sqy
1 parent 1527079e

'增加设备网关设备选项,地理位置图表不正确显示'

... ... @@ -179,3 +179,9 @@ export const getGATEWAYdevice = async (params: { organization: string }) => {
179 179 res.map((item) => ({ label: item.name, value: item.id }))
180 180 );
181 181 };
  182 +
  183 +export const getGATEWAY = (tbDeviceId: string) => {
  184 + return defHttp.get({
  185 + url: '/device/gateway/' + tbDeviceId,
  186 + });
  187 +};
... ...
1 1 <template>
2   - <div class="wrapper123">
  2 + <div class="wrapper">
3 3 <div ref="wrapRef" :style="{ height, width }"> </div>
4 4 <div class="right-wrap">
5 5 <BasicTable @register="registerTable" @rowClick="deviceRowClick">
... ... @@ -25,21 +25,19 @@
25 25 </template>
26 26 </BasicTable>
27 27 </div>
28   - <DeviceDetailDrawer @register="registerDetailDrawer" />
29 28 <BasicModal
30   - v-bind="$attrs"
31 29 @register="registerModal"
32 30 title="历史数据"
33 31 width="70%"
34 32 :footer="null"
35 33 @cancel="cancelHistoryModal"
36 34 :canFullscreen="false"
37   - destroyOnClose
38 35 >
39 36 <BasicForm @register="registerForm" />
40 37 <Empty v-show="!isNull" />
41 38 <div v-show="isNull" ref="chartRef" :style="{ height: '600px', width }"></div>
42 39 </BasicModal>
  40 + <DeviceDetailDrawer @register="registerDetailDrawer" />
43 41 </div>
44 42 </template>
45 43 <script lang="ts">
... ... @@ -91,24 +89,101 @@
91 89 },
92 90 },
93 91 setup() {
  92 + let entityId = '';
  93 + let keys = [];
  94 + let globalRecord: any = {};
94 95 const wrapRef = ref<HTMLDivElement | null>(null);
  96 + const chartRef = ref<HTMLDivElement | null>(null);
  97 + const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
  98 + const isNull = ref(true);
95 99 const { toPromise } = useScript({ src: BAI_DU_MAP_URL });
96 100 const [registerDetailDrawer, { openDrawer }] = useDrawer();
97   -
98   - let entityId = '';
99   - let globalRecord: any = {};
100   - async function initMap() {
101   - await toPromise();
102   - await nextTick();
103   - const wrapEl = unref(wrapRef);
104   - const BMap = (window as any).BMap;
105   - if (!wrapEl) return;
106   - const map = new BMap.Map(wrapEl);
107   - const point = new BMap.Point(104.04666605565338, 30.543516387560476);
108   - map.centerAndZoom(point, 15);
109   - map.enableScrollWheelZoom(true);
110   - }
111   -
  101 + const [registerModal, { openModal }] = useModal();
  102 + const [
  103 + registerForm,
  104 + { resetFields, getFieldsValue, setFieldsValue, validate, updateSchema },
  105 + ] = useForm({
  106 + labelWidth: 120,
  107 + schemas,
  108 + async submitFunc() {
  109 + // 表单验证
  110 + await validate();
  111 + let { endTs, interval, agg } = getFieldsValue();
  112 + if (!endTs) return;
  113 + // 数据收集
  114 + const dataArray: any[] = [];
  115 + const startTs = Date.now() - endTs;
  116 + endTs = Date.now();
  117 + // 发送请求
  118 + const res = await getDeviceHistoryInfo({
  119 + entityId,
  120 + keys: keys.join(),
  121 + startTs,
  122 + endTs,
  123 + interval,
  124 + agg,
  125 + });
  126 + // 判断数据对象是否为空
  127 + if (!Object.keys(res).length) {
  128 + isNull.value = false;
  129 + return;
  130 + } else {
  131 + isNull.value = true;
  132 + }
  133 + // 处理数据
  134 + for (const key in res) {
  135 + for (const item1 of res[key]) {
  136 + let { ts, value } = item1;
  137 + const time = moment(ts).format('YYYY-MM-DD HH:mm:ss');
  138 + value = Number(value).toFixed(2);
  139 + dataArray.push([time, value, key]);
  140 + }
  141 + }
  142 + const series: any = keys.map((item) => {
  143 + return {
  144 + name: item,
  145 + type: 'line',
  146 + stack: 'Total',
  147 + data: dataArray.filter((item1) => item1[2] === item),
  148 + };
  149 + });
  150 + // 设置数据
  151 + setOptions({
  152 + tooltip: {
  153 + trigger: 'axis',
  154 + },
  155 + legend: {
  156 + data: keys,
  157 + },
  158 + grid: {
  159 + left: '3%',
  160 + right: '4%',
  161 + bottom: '3%',
  162 + containLabel: true,
  163 + },
  164 + dataZoom: [
  165 + {
  166 + type: 'inside',
  167 + start: 0,
  168 + end: 50,
  169 + },
  170 + {
  171 + start: 20,
  172 + end: 40,
  173 + },
  174 + ],
  175 + xAxis: {
  176 + type: 'time',
  177 + boundaryGap: false,
  178 + },
  179 + yAxis: {
  180 + type: 'value',
  181 + boundaryGap: [0, '100%'],
  182 + },
  183 + series,
  184 + });
  185 + },
  186 + });
112 187 const [registerTable] = useTable({
113 188 api: devicePage,
114 189 columns,
... ... @@ -122,6 +197,18 @@
122 197 showSizeChanger: false,
123 198 },
124 199 });
  200 +
  201 + async function initMap() {
  202 + await toPromise();
  203 + await nextTick();
  204 + const wrapEl = unref(wrapRef);
  205 + const BMap = (window as any).BMap;
  206 + if (!wrapEl) return;
  207 + const map = new BMap.Map(wrapEl);
  208 + const point = new BMap.Point(104.04666605565338, 30.543516387560476);
  209 + map.centerAndZoom(point, 15);
  210 + map.enableScrollWheelZoom(true);
  211 + }
125 212 // 点击表格某一行触发
126 213 const deviceRowClick = async (record) => {
127 214 entityId = record.tbDeviceId;
... ... @@ -130,6 +217,7 @@
130 217 const wrapEl = unref(wrapRef);
131 218 const map = new BMap.Map(wrapEl);
132 219 if (record.deviceInfo.address) {
  220 + keys = await getDeviceDataKeys(entityId);
133 221 const { name, organizationDTO, deviceState, deviceProfile } = record;
134 222 const { longitude, latitude, address } = record.deviceInfo;
135 223 const point = new BMap.Point(longitude, latitude);
... ... @@ -191,99 +279,7 @@
191 279 map.openInfoWindow(infoWindow, map.getCenter());
192 280 }
193 281 };
194   - let keys = [];
195   - const [registerModal, { openModal }] = useModal();
196   - const [
197   - registerForm,
198   - { resetFields, getFieldsValue, setFieldsValue, validate, updateSchema },
199   - ] = useForm({
200   - labelWidth: 120,
201   - schemas,
202   - async submitFunc() {
203   - // 表单验证
204   - await validate();
205   - let { endTs, interval, agg } = getFieldsValue();
206   - if (!endTs) return;
207   - // 数据收集
208   - const dataArray: any[] = [];
209   - const startTs = Date.now() - endTs;
210   - endTs = Date.now();
211   - // 判断对象是否为空
212   - if (Object.keys(keys).length === 0) {
213   - isNull.value = false;
214   - return;
215   - } else {
216   - isNull.value = true;
217   - }
218   - // 发送请求
219   - const res = await getDeviceHistoryInfo({
220   - entityId,
221   - keys: keys.join(),
222   - startTs,
223   - endTs,
224   - interval,
225   - agg,
226   - });
227 282
228   - // 处理数据
229   - for (const key in res) {
230   - for (const item1 of res[key]) {
231   - let { ts, value } = item1;
232   - const time = moment(ts).format('YYYY-MM-DD HH:mm:ss');
233   - value = Number(value).toFixed(2);
234   - dataArray.push([time, value, key]);
235   - }
236   - }
237   -
238   - const series: any = keys.map((item) => {
239   - return {
240   - name: item,
241   - type: 'line',
242   - stack: 'Total',
243   - data: dataArray.filter((item1) => item1[2] === item),
244   - };
245   - });
246   - // 设置数据
247   - setOptions({
248   - tooltip: {
249   - trigger: 'axis',
250   - },
251   - legend: {
252   - data: keys,
253   - },
254   - grid: {
255   - left: '3%',
256   - right: '4%',
257   - bottom: '3%',
258   - containLabel: true,
259   - },
260   - dataZoom: [
261   - {
262   - type: 'inside',
263   - start: 0,
264   - end: 50,
265   - },
266   - {
267   - start: 20,
268   - end: 40,
269   - },
270   - ],
271   - xAxis: {
272   - type: 'time',
273   - boundaryGap: false,
274   - },
275   - yAxis: {
276   - type: 'value',
277   - boundaryGap: [0, '100%'],
278   - },
279   - series,
280   - });
281   - },
282   - });
283   -
284   - const chartRef = ref<HTMLDivElement | null>(null);
285   - const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
286   - const isNull = ref(true);
287 283 // 设备信息
288 284 const openDeviceInfoDrawer = async () => {
289 285 const { id, tbDeviceId } = globalRecord;
... ... @@ -299,10 +295,7 @@
299 295 const startTs = Date.now() - 86400000; //最近一天
300 296 const endTs = Date.now();
301 297 // 发送请求
302   - keys = await getDeviceDataKeys(entityId);
303   - // 判断keys是否为空
304   - if (!Object.keys(keys).length) {
305   - console.log(keys);
  298 + if (!keys.length) {
306 299 isNull.value = false;
307 300 return;
308 301 } else {
... ... @@ -316,7 +309,13 @@
316 309 interval: 7200000, //间隔两小时
317 310 agg: 'AVG',
318 311 });
319   -
  312 + // 判断对象是否为空
  313 + if (!Object.keys(res).length) {
  314 + isNull.value = false;
  315 + return;
  316 + } else {
  317 + isNull.value = true;
  318 + }
320 319 // 处理数据
321 320 for (const key in res) {
322 321 for (const item1 of res[key]) {
... ... @@ -370,19 +369,16 @@
370 369 },
371 370 series,
372 371 });
373   -
374   - await setFieldsValue({
  372 + setFieldsValue({
375 373 endTs: 86400000,
376 374 interval: 7200000,
377 375 agg: 'AVG',
378 376 });
379 377 };
380   -
381 378 const cancelHistoryModal = () => {
382 379 resetFields();
383 380 updateSchema({
384 381 field: 'interval',
385   -
386 382 componentProps: {
387 383 placeholder: '请选择分组间隔',
388 384 options: [
... ...
... ... @@ -27,7 +27,6 @@
27 27
28 28 emits: ['select'],
29 29 setup(_, { emit }) {
30   - // const { proxy } = getCurrentInstance();
31 30 const getTreeRef: any = ref(null);
32 31 const treeData = ref<TreeItem[]>([]);
33 32 const selectedKeys = ref<string[]>();
... ...
... ... @@ -60,6 +60,7 @@
60 60 租户消息量TOP10</h1
61 61 >
62 62 <Empty v-if="!tenantTop10.length" />
  63 +
63 64 <Descriptions :column="1">
64 65 <template v-for="(item, index) in tenantTop10" :key="item.name">
65 66 <DescriptionsItem>
... ...
... ... @@ -53,12 +53,21 @@ export const step1Schemas: FormSchema[] = [
53 53 required: true,
54 54 label: '所属组织',
55 55 component: 'ApiTreeSelect',
56   - componentProps: {
57   - api: async () => {
58   - const data = await getOrganizationList();
59   - copyTransFun(data as any as any[]);
60   - return data;
61   - },
  56 + componentProps({ formActionType }) {
  57 + const { setFieldsValue } = formActionType;
  58 + return {
  59 + api: async () => {
  60 + const data = await getOrganizationList();
  61 + copyTransFun(data as any as any[]);
  62 + return data;
  63 + },
  64 +
  65 + onChange() {
  66 + setFieldsValue({
  67 + gateWayDeviceId: null,
  68 + });
  69 + },
  70 + };
62 71 },
63 72 },
64 73 {
... ... @@ -69,9 +78,9 @@ export const step1Schemas: FormSchema[] = [
69 78 ifShow: ({ values }) => values.deviceType === 'SENSOR' && values.organizationId,
70 79 componentProps: ({ formModel }) => {
71 80 const { organizationId } = formModel;
72   - console.log(formModel);
73 81 return {
74 82 api: getGATEWAYdevice,
  83 + showSearch: true,
75 84 params: {
76 85 organizationId,
77 86 },
... ...
... ... @@ -105,7 +105,12 @@
105 105 import { columns, searchFormSchema } from './config/device.data';
106 106 import { Tag } from 'ant-design-vue';
107 107 import { useMessage } from '/@/hooks/web/useMessage';
108   - import { deleteDevice, devicePage, cancelDispatchCustomer } from '/@/api/device/deviceManager';
  108 + import {
  109 + deleteDevice,
  110 + devicePage,
  111 + cancelDispatchCustomer,
  112 + getGATEWAY,
  113 + } from '/@/api/device/deviceManager';
109 114 import { PageEnum } from '/@/enums/pageEnum';
110 115 import { useGo } from '/@/hooks/web/usePage';
111 116 import { PageWrapper } from '/@/components/Page';
... ... @@ -191,7 +196,11 @@
191 196 });
192 197 }
193 198
194   - function handleEdit(record: Recordable) {
  199 + async function handleEdit(record: Recordable) {
  200 + if (record.deviceType === 'SENSOR') {
  201 + const res = await getGATEWAY(record.tbDeviceId);
  202 + Reflect.set(record, 'gateWayDeviceId', res.id);
  203 + }
195 204 openModal(true, {
196 205 isUpdate: true,
197 206 record,
... ...
... ... @@ -10,13 +10,14 @@
10 10 <BasicForm @register="registerForm">
11 11 <template #organizationId="{ model, field }">
12 12 <BasicTree
  13 + v-if="organizationTreeData.length"
13 14 v-model:value="model[field]"
14 15 :treeData="organizationTreeData"
15 16 :checked-keys="checkGroup"
16   - :defaultExpandAll="true"
  17 + default-expand-all
  18 + ref="basicTreeRef"
17 19 checkable
18 20 toolbar
19   - title="所属组织"
20 21 />
21 22 </template>
22 23 </BasicForm>
... ... @@ -42,6 +43,7 @@
42 43 const isUpdate = ref(true);
43 44 const rowId = ref('');
44 45 const organizationTreeData = ref<TreeItem[]>([]);
  46 + const basicTreeRef = ref();
45 47 const checkGroup = ref<string[]>([]);
46 48 const [registerForm, { setFieldsValue, updateSchema, resetFields, validate }] = useForm({
47 49 labelWidth: 100,
... ... @@ -57,7 +59,7 @@
57 59 setModalProps({ confirmLoading: false });
58 60 isUpdate.value = !!data?.isUpdate;
59 61 const groupListModel = await findCurrentUserGroups();
60   - if (unref(organizationTreeData).length === 0) {
  62 + if (!unref(organizationTreeData).length) {
61 63 copyTransTreeFun(groupListModel);
62 64 organizationTreeData.value = groupListModel;
63 65 }
... ... @@ -106,6 +108,7 @@
106 108 getTitle,
107 109 organizationTreeData,
108 110 checkGroup,
  111 + basicTreeRef,
109 112 };
110 113 },
111 114 });
... ...
... ... @@ -104,7 +104,7 @@ export const accountFormSchema: FormSchema[] = [
104 104 dynamicDisabled: false,
105 105 componentProps: {
106 106 maxLength: 36,
107   - placeholder: '请输入账号',
  107 + placeholder: '请输入用户名',
108 108 },
109 109 dynamicRules: ({ values }) => {
110 110 return [
... ... @@ -122,7 +122,7 @@ export const accountFormSchema: FormSchema[] = [
122 122 if (values.username != undefined && values.id == undefined) {
123 123 isAccountExist(value).then((data) => {
124 124 if (data.data != null) {
125   - reject('用户已存在');
  125 + reject('用户已存在');
126 126 } else {
127 127 resolve();
128 128 }
... ... @@ -217,7 +217,7 @@ export const accountFormSchema: FormSchema[] = [
217 217 },
218 218 {
219 219 field: 'accountExpireTime',
220   - label: '有效期: ',
  220 + label: '有效期',
221 221 component: 'DatePicker',
222 222 colProps: { span: 12 },
223 223 componentProps: {
... ... @@ -246,11 +246,9 @@ export const accountFormSchema: FormSchema[] = [
246 246 },
247 247 {
248 248 field: 'organizationIds',
249   - label: ' ',
  249 + label: '所属组织',
250 250 component: 'Input',
251 251 slot: 'organizationId',
252   - componentProps: {
253   - maxLength: 36,
254   - },
  252 + required: true,
255 253 },
256 254 ];
... ...