From 35f21a4342dd90afab4248b5ba120209e209bd92 Mon Sep 17 00:00:00 2001 From: zk Date: Mon, 11 Dec 2023 18:29:35 +0800 Subject: [PATCH] update --- package.json | 1 + src/assets/img/watch.png | Bin 0 -> 4660 bytes src/assets/mapUtils/commonFun.ts | 4 + src/assets/mapUtils/map.ts | 15 +- .../secondMap/components/footerDialog.vue | 99 +++++++++++ .../secondaryScreen/secondMap/secondMap.vue | 168 +++++++++++++++++- .../secondaryScreen/secondMap/secondMapApi.ts | 8 +- .../secondMap/secondMapHooks.ts | 78 ++++++-- src/utils/is.ts | 12 ++ src/utils/utils.ts | 4 + src/views/indexSon.vue | 43 ++--- 11 files changed, 380 insertions(+), 52 deletions(-) create mode 100644 src/assets/img/watch.png create mode 100644 src/components/secondaryScreen/secondMap/components/footerDialog.vue create mode 100644 src/utils/is.ts diff --git a/package.json b/package.json index 4f81fce..f2e0826 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "@amap/amap-jsapi-loader": "^1.0.1", "axios": "^1.6.2", "dayjs": "^1.11.10", + "lodash-es": "^4.17.21", "mitt": "^3.0.1", "path": "^0.12.7", "prettier": "^3.1.0", diff --git a/src/assets/img/watch.png b/src/assets/img/watch.png new file mode 100644 index 0000000000000000000000000000000000000000..f6672bdcbf88275393879cff17f5cdc397022b89 GIT binary patch literal 4660 zcmV-463gw0P)Px`?ny*JRA@uxn+KQ`RhGxkx%bvfotsWHp~*SZxhd=l#JvIO_Mt3exY7f-Mint?>%U+L$$p5zL{@}ulv1z zbzar4{^y)~&$(3~{DW-x55fumKS0Iuk-6Ytxgg+X0O$n-k^oQ(c}W<+p%MU&0>U>C zG&keS?>7Hf54KoQu{tLSI8Fw{$w07ei%!hNMG)dGAmS~YvQ=J$?X5+i;?3OIKyfZ0 zB*-&xi*vnB_XoT|Js2b<@VFf0XGXOR_6=`BwqnwGPk%@Ra9G5Tj8&hXq*edK?o2iAPgHJ zl?RrPk`hoL0SPOS5#y5Gv56URiG&ggASyuc+i=R(y-mS32`ZM490Cru5fD8=zoC~D zRF)aKWk^2t4?tL4f+|dqe@8S`N`}OgZ;(nz`8QF#L~~LtEh{O-;ntiWgb#w|O*r$r z-HpLE3M!Tj?+H%lb{UWUnt-qPd{r4Yxn*&|IaluH5>f~h8nalOn|nfPUe#0{+-IO3 z2rwN{gkYtx1PGPDjL`J~3Isx^e2?mt zQ9?61Ca1e%9WD_31e8?t!}&*o*TXgpx@z<*K*(&%u*}OROAB>_8-feVl%SU6L_WY#j@cY!09{=2+rbj6~(nx0k48Im8&h21DC^+RMz4k+ICJ)Nl1xJ zJh<)D@z@yQ@o2(f0TFso7qjqr9-Hyr`h8k`lm>lG5wS{gkl~Y+Rx%CcQ&) zItb7~*L&cs9p~!9{y|Vi& z3x=E5xCj9z52!{e0MHGgqbnXDJ`)aaJ#sSW^#x^YQYzz=Pz6hoDqxDVb>~(Y?l`9# zEU^lwZJyRBsF;6~3(|NgAjTG*skmHQ?f07!QY8^urc^Qn%}p+N*J1tIrKey9m_G=q zYdyytP*zRLj&I$U&%&S~I4Q26lu2l$aS3jBM(5;A5TXuBNGi_X7>FF`8b!s*(GLM7 zYfRk?791^uXe9NZ(hJpP((UrcknRt?m(p6UgUUV-rEZn>c0DjD|s1*UOBgw>2dOW2NMZ_R8oXmH!B(HMzJ z0iVCP@Y`FTo;AW58|P|h|E0ZqFXnIDa9Kh|;H2v{s#IkO$?n+nj>#Fo#bKPfxo;zi z=2in@e8JJ;^M0S9TO3To;9*5o5?O{RtYObA8t8~iaH@kuvL}4Rbu%Y@Gj8E;MmXZ) z-3{&MLEYT8aP}UJAytV)kvgQh8ps@D?ikIP)hoR{2vLJmHml+%a+)h)B;Fch0suX8 zpzy2_v`jM$YML@mLtzlpzPqdc%*Fj0i_Nu9-1GIg-KV|UqcOF<{Q01b zdR3W;AS4vVW_5FqefR5;_3clroPE4}^M6-UCKE}z9VsJ(Y7Ce|DVo_C1eiEwQ@C3Q zMc7r>ug)z4#8w5zO3wT0bbmvjG2OCV{TKhKe@lj?>unD&`L`oA`@XJg2-FknbY=BS z%K{~5Tkeb3yx-*@gvP-AL#ij1G3;fYb! zwQuW=R3i+`;O#hl`}zh!<%eQ*ZXqCMTs~WQxvH$LMrD4eU{>R)s-i5xGj4yhRo4kG zb+yYV?eaf)E&t+YD~r{D$&knyDO5qpSqf-kN^E>)rzAPo7vYr6t?M8Aht<=n(er?i z1-jqR^N$o4n3gbQwg=VpDP1p1JWxe+rwNPNXO8=qHg;f3x2`KXv3y2;s2&BX=6W^Q zBaunPD6)>d)3cniHR1dPoVsOU)1XUok|2?smd#wr#p;r>%QY2JRaJ``styg6d9uPc zg&6kUj)9TE!;zd8nytbc5BSX5vxjTqI`xU)Jvrxl%U8uIs?ttY_*5oTsEPubk{O?z z);1wcHG5UO3+7$h_cvVOuNXBEH1@VEkPD8L7I?iuopUhdplS+LI7?XB*zwkPKG7=U zwns8{PrvyEdzIAhy8*L$h)=5AH)S|E6jp_@j*@zV1FzZK+a8kLoENKx61$_6j{ ztsVW2y*A~f1QTlc0RRaAi%Zh7S8W-ve|qi#%Ui`|_jyIpa4qU|X^sv(Q`>7!rU4i0 zaO&oJ8w#byL061U1%^8Tv7-?%g9Rr_FDO{)dM>zW$^JOhj&z>6GAp*rpjf@UFbIg@ zW>g^a#8NBZwT{iZ|CH=NWwXqr&s8TXsLQQ6+ILTF=WsCx2$2t_7=|;pl(q;|jQ}e~ zb_T}21;ln{&@wNbl~sShCuHdtT72Nb62g(uNsH^76QdgY@L7}s2vB=yt2bDbZy=Q- zORt9-yqI`rOxsS$nan|D-Fg8`b1csI?o4Be+5Ae$%8^-sY#k8nD~pTjGH*rk#p-fH zm)(eLo8_<2+Jjtml4~aFA`#>=j#?@qs!f)!a^Zon^tK7D5>jH4)k+E%hd`M3;I!`w zni@Tt1yv`Ny;Q2T3<#Mh&&(}hRh4Ja??q<8ZO7Lzi3}v#ej@jBQ)&jKSe3vTJ(PPP~zGJ23JKK)3@CRo&U_CPV-P z{1r_8F8=%0FPpW$&cK%I8#}0YXRrqX?s1@@>}>{uzzzVI6|xrvfI==Jd=G{=1TO!2 zoVeH5QoxA)4S_avQnB>j1DadqgR^bmzx*A?(;iAN1*=;}z&DyVlqNuxk^2(Ah(Nu0UVi{YSeHcI=`K zYR=65XL(|_e9xzL0PNaC9aPL5e4kQu`QAUY!q3pIgBMz;_P+uN|fA+C(38QZMY)0g9o16{&fn!9`g;Iv^aAzq?RzQEHRq2uBUFo2ZHc0`Z1wRSx&s8k zx#sc-8y=0AGz)F(NX5NJ$A8q4@CbRvGe+!sO4(i|Q+VJ+KYf z8v?!J?gt*|%{p~+v}R5%)1r`!LL{P~9`yT@0g(!~vkC|rf`gADuM$F3dIMPa{l${P zO&^?7PaQS``=dee$OFAu*8!eh1V|qwppphS6zf7%5(}%i;9g!A@KE`rdt96sDQFG~ z9u6dtQA|P<83Y6o2>H4nj+PXZ9RBcwbHVuyghz9(Z!{Ewi-r!O1aIO(pauMJz#lyR z-Cp12(ZdqEIvL3!hyw}1Brwc0`B*1sq?!n*-~g4Ji-TTMZ2jot%47ffU|fdVqxH}L z`v4KdvT%!I?oL_2G&U-z&#wn-2o%kihu?)l^wBN8Y2&uay&XHT*e;pzvlt~$06->y zIKnyZ5kh#;vf@DqOE4x+;6nsAA`V6bIklE?OMFmJ;(cw;22pv}_?Uh!N^TLr&$7H- zpEUw&3lxKkMr2be#(H(*{io*dt$geG{u!;}+*?6_&oKDXvn9p`4*;~z)PBVXc?395 zQz0R5Eeoi$xL8wM?tR(sBYL~Gu3I!po<@MQYOinfghdC>zdoyXLS}00lN`iOZO*Q3 z4Zzw1HJ1#3RG4t?;dwjM4c1Q<51mU1`RS+o&g3rrQ>iX%y48z^{RgG^XeegG9wb+t zBLrVJDR0-$WZm~zmo8-5Qz`2Oz`lp_cBqH0fB);@*%Vyo1{^E=2Er))&)xr5FVdQlfVA(++BG|0OI-Q`nGGI z7_*)W_~4ZBkfC+0Ke_`kT(RXxV zQ*&GWCqeuv7vfVr$iFBn^Y2Ma^7Qk#@Nojr7YU>Zfn@;Va3IJ(s;Sj?#m6}YIW;hf|0~b$>?cJtzN&;z%lys*A+i-xB zwZ6c&D;FOqY;FRu4H}sy-}u$wq_{ZJ%c)^E6qpGD7)U6A)k1Ku31C`=u)+^sF+_*~ z!~{)_ttcNq!9uTTo~o?Sk3Rdx;j;SmKvWcsfR+MaEda`F&+Gv7kvsdO#(5k`4yQ;Y z$UKZ81F)FIi6saa!~mbqG^^|UdgWhs*OVULe$kZK9|s^(!|@oY1ELNpRfxdKte1b+ q{c!TQQj^4nfn?T4Amz@Mfc_tvuJ6}y+ literal 0 HcmV?d00001 diff --git a/src/assets/mapUtils/commonFun.ts b/src/assets/mapUtils/commonFun.ts index 6891e80..9effefb 100644 --- a/src/assets/mapUtils/commonFun.ts +++ b/src/assets/mapUtils/commonFun.ts @@ -1,4 +1,5 @@ import { mapIcon1, mapIcon2, mapIcon3, mapIcon4 } from '/@/components/chinaMap/chinaHooks.ts'; +import { watchIcon } from '/@/components/secondaryScreen/secondMap/secondMapHooks.ts'; /** * @desc 创建icon @@ -33,6 +34,9 @@ export function typeToIcon(type: string) { if (type == '4') { return createIcon({ icon: mapIcon3, iconSize, imageSize }); } + if (type == '6') { + return createIcon({ icon: watchIcon, iconSize: [21, 44], imageSize: [21, 44] }); + } } /** diff --git a/src/assets/mapUtils/map.ts b/src/assets/mapUtils/map.ts index 1f0fb05..ade6017 100644 --- a/src/assets/mapUtils/map.ts +++ b/src/assets/mapUtils/map.ts @@ -2,6 +2,7 @@ import china from '/@/assets/lngLat/china.ts'; import chinaInner from '/@/assets/lngLat/chinaInner.ts'; import { createCircle, createIcon, typeToIcon } from '/@/assets/mapUtils/commonFun.ts'; import { aircraftContent, alarmIcon } from '/@/components/chinaMap/chinaHooks.ts'; +import { isFunction } from '/@/utils/is.ts'; export const defaultOption = { center: [106.3, 37.87], //地图中心点 @@ -87,7 +88,7 @@ export const Map = { * @desc 创建覆盖物组,用于批量处理点 (控制显隐,点击事件等) * @param result */ - createOverlay(result) { + createOverlay(result, { extOption = {}, content }, callback) { this.removeOverlayGroup(); this.overlayGroup = new AMap.OverlayGroup(); for (let i = 0; i < result.length; i++) { @@ -104,10 +105,12 @@ export const Map = { icon: startIcon, //启用点击事件 如果需要点击事件,必须开启 clickable: true, //点额外携带的数据,用户自定义属性,支持JavaScript API任意数据类型 extData: result[i], + label: { + content: isFunction(content) && content(result[i]), + }, + ...extOption, }); // 可以调用setExtData()设置自定义属性 - //startMarker.setExtData('222') - //将组 挂载到地图上 this.overlayGroup.setMap(this.map); //将需要批量控制的点放到一个组中,通过控制组,就可以操作组内所有所有覆盖物 @@ -115,10 +118,10 @@ export const Map = { } this.overlayGroup.on('click', function (e) { - //e.target触发事件的点对象 - console.log(e.target); //拿到点中携带的数据 - console.log(e.target.getExtData()); + // console.log(e.target.getExtData()); + if (!isFunction(callback)) return; + callback(e.target.getExtData()); }); }, clearOverlay() { diff --git a/src/components/secondaryScreen/secondMap/components/footerDialog.vue b/src/components/secondaryScreen/secondMap/components/footerDialog.vue new file mode 100644 index 0000000..0d0f2c2 --- /dev/null +++ b/src/components/secondaryScreen/secondMap/components/footerDialog.vue @@ -0,0 +1,99 @@ + + + + \ No newline at end of file diff --git a/src/components/secondaryScreen/secondMap/secondMap.vue b/src/components/secondaryScreen/secondMap/secondMap.vue index d59c8ea..9c83a5f 100644 --- a/src/components/secondaryScreen/secondMap/secondMap.vue +++ b/src/components/secondaryScreen/secondMap/secondMap.vue @@ -2,29 +2,109 @@
+
-
+
+ +
+ \ No newline at end of file diff --git a/src/components/secondaryScreen/secondMap/secondMapApi.ts b/src/components/secondaryScreen/secondMap/secondMapApi.ts index 5f51cc7..c02e7b5 100644 --- a/src/components/secondaryScreen/secondMap/secondMapApi.ts +++ b/src/components/secondaryScreen/secondMap/secondMapApi.ts @@ -1,11 +1,7 @@ import { get } from '/@/api/request.ts'; export enum Api { - allList = '/health-emergency/emergency/tblAmbulanceGps/getAllList', - getAmbulanceList = '/health-emergency/emergency/tblAmbulanceGps/getAmbulanceList', + footerStatistic = '/health-watch/watch/deptStatisticData/list', } -// 获取所有资源 -export const getAllList = (params) => get(Api.allList, params); -//获取救护车GPS信息 -export const getAmbulanceList = (params) => get(Api.getAmbulanceList, params); \ No newline at end of file +export const footerApi = (params) => get(Api.footerStatistic, params); \ No newline at end of file diff --git a/src/components/secondaryScreen/secondMap/secondMapHooks.ts b/src/components/secondaryScreen/secondMap/secondMapHooks.ts index e7436e2..9884eee 100644 --- a/src/components/secondaryScreen/secondMap/secondMapHooks.ts +++ b/src/components/secondaryScreen/secondMap/secondMapHooks.ts @@ -12,30 +12,29 @@ // type: TabType.yiLiaoDian, // }, // ]; - -import {onMounted, ref} from "vue"; +import {cloneDeep} from 'lodash-es'; +import {nextTick, onMounted, ref} from "vue"; import {allSecondaryDeparts} from "/@/components/secondaryScreen/commonApi"; -export function useDepart({selectOption = [],}) { +export const watchIcon = new URL('/@/assets/img/watch.png', import.meta.url).href; + +export function useDepart() { const orgCode = ref(); const option = ref([]); const fieldNames = {label: 'departName', value: 'orgCode',} onMounted(() => { - if (selectOption && Array.isArray(selectOption) && selectOption.length > 0) { - setOption(selectOption); - } else { - getOptionData(); - } + getOptionData(); }); - function setOption(option) { - option.value = selectOption || option; + function setOption(data) { + option.value = data; + orgCode.value = data[0]?.orgCode } async function getOptionData() { const {result, code} = await allSecondaryDeparts(); if (code == 200) { - option.value = result; + setOption(result) } } @@ -67,4 +66,61 @@ export function useTimeType(t) { type, timeRangeOption } +} + +export function useFooterTable() { + const footerList = ref([ + { + name: '单位名称', + value: '', + key: 'orgName' + }, + { + name: '单位人数', + value: '', + key: 'userCount' + }, + { + name: '入库设备数量', + value: '', + key: 'deviceNum' + }, + { + name: '佩戴手表人数', + value: '', + key: 'allotDeviceNum' + }, + { + name: '近一周活跃人数', + value: '', + key: 'sevenDayNum' + }, + { + name: '近一月活跃人数', + value: '', + key: 'a' + }, + { + name: '近一年活跃人数', + value: '', + key: 'b' + } + ]) + + function setFooterList(res: any) { + + const arrList = cloneDeep(footerList.value) + if (res) { + arrList.forEach(item => { + item.value = res[item.key] || '' + }) + } + footerList.value = arrList + + } + + return { + footerList, + setFooterList + } } \ No newline at end of file diff --git a/src/utils/is.ts b/src/utils/is.ts new file mode 100644 index 0000000..73a9e6e --- /dev/null +++ b/src/utils/is.ts @@ -0,0 +1,12 @@ +const objectToString = Object.prototype.toString; +const toTypeString = (value: any) => objectToString.call(value); + +export const { isArray } = Array; +export const isMap = (val: any) => toTypeString(val) === '[object Map]'; +export const isSet = (val: any) => toTypeString(val) === '[object Set]'; +export const isDate = (val: any) => val instanceof Date; +export const isFunction = (val: any) => typeof val === 'function'; +export const isString = (val: any) => typeof val === 'string'; +export const isSymbol = (val: any) => typeof val === 'symbol'; +export const isObject = (val: null) => val !== null && typeof val === 'object'; +export const isPromise = (val: any) => isObject(val) && isFunction(val.then) && isFunction(val.catch); diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 3a539b8..cbd9d9c 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -22,4 +22,8 @@ export function useTopTime() { timeLeft, timeRight, }; +} + +export function getToday() { + return dayjs().format('YYYY-MM-DD'); } \ No newline at end of file diff --git a/src/views/indexSon.vue b/src/views/indexSon.vue index 364f20e..f13959a 100644 --- a/src/views/indexSon.vue +++ b/src/views/indexSon.vue @@ -14,17 +14,19 @@
- +
- +