From 028fd44490f98c10f723708ce93e0fe6c234e1cf Mon Sep 17 00:00:00 2001 From: guanj Date: Thu, 20 Nov 2025 15:12:01 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/favicon.ico | Bin 21351 -> 6791 bytes public/favicon1.ico | Bin 6791 -> 0 bytes public/favicon3.ico | Bin 0 -> 21351 bytes .../baInput/components/remoteSelect.vue | 620 +-- src/components/echarts/waveForm.vue | 380 +- src/components/table/index.vue | 62 +- src/components/tree/pqs/Terminal.vue | 394 +- src/layouts/admin/container/classic.vue | 66 +- src/utils/auth.ts | 141 +- src/utils/echartMethod.ts | 461 +- src/utils/router.ts | 590 +-- src/views/cockpit/TerminalLog.vue | 2 +- .../pollutionReport/SubstationTab.vue | 2 +- .../online/shishishuju/index.vue | 22 +- .../online/wentaishujufenxi/index.vue | 3913 +++++++++-------- .../reportForms/statistics/index.vue | 342 +- src/views/user/login.vue | 676 +-- 17 files changed, 3910 insertions(+), 3761 deletions(-) delete mode 100644 public/favicon1.ico create mode 100644 public/favicon3.ico diff --git a/public/favicon.ico b/public/favicon.ico index 029a1f39ec9ebba2997c214deff5fb5c644eefa1..fe16b5adb805be552e37da2e99cd37b95b7dd0e3 100644 GIT binary patch literal 6791 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 z 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 O>e8`ihjZ;lefxilbd_rW diff --git a/public/favicon1.ico b/public/favicon1.ico deleted file mode 100644 index fe16b5adb805be552e37da2e99cd37b95b7dd0e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6791 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 z zt4qmPrbh;H1*x^@X+0T1ar7iPkz^tX8R_ehi9$~1aziqb$wzmm}Lo$S8LhU z=#8YTY>AP+{E1v&zZ-Vh1WG`65DF@U9Xwl0Kfu<+`(}cFEB}c?D#qzhoaGGQP&f;) z104cbDSYc)m1?zdQAx=~G=6Q7x^$vkBGWTPg*5Zv z9twK?jAX_}1m%$g`aILyaTX@8qu((iuktf{TEyV=QO`VgO&DD_E0VRJcv0 z(X1AW#lsXbnVAW!0!pGa*RPTsua|Y^-To!Pi3v1(;~IMRA(lKEHlg%V73HCEFptkW z!CSCmFsy!25Y8tnDIpUhBl4=-fc$*AQ>&^Tq=EACii)VXv^2Q5R6W7j!Xn&2pN(2j z1~>iz;1gE?>~vcKC(sjcDF2m6mM>ras}FwjhMg66Z8N|McntXDY%Lt`pA?mr3_I*wU-?H0ry;pF*P|Y59<`74ER!*2pMyLliSqyl^1mTEK?Gx7@- zU_^LZ8Jmy}18LX2AnG}H29;%H)3H_SsfmLlb}g60+*}&CWdpr^_L!QsXi1$tn^9o! zQ_5p&fbaNyR$g%=5wh`4X`t z04gnl*-Cx{OF#k`3e@0t@>dF}IN%Om6o9S369lT%rI#`a3s++NwzN05p!C85 zntk*jt=Y4yJX>0{f_&>Y#IEI1f)5j? z-)-SL1cB9%r4}YGt}2hH#0Cqa1tHB*^U8D3o4XR6R%AGZsK3^mkQxq{X7@pA-*xIuwZM6 zMtx2$m3i5ln^1Co9t~W(lAcDt#l+o?tl{{U_UKKL@~OOVrTw>W(1wd=1%FVZN>v)= z)tV;m+Cn+(C)feK3@h02tEX!oSJ|BOxWO#{#;lYn1{fbsVEoToJ8WaP)2uagtuZuf#K`c(9@T2 zEpAm1-LuH6ej{pKot0lMk#Ml$=ykNRvMMMk@y#nL4pD2g-1rI^g%|E10Q|}*{zxI5Y#jxaf#CRY zN%XiF_pX}*1JvohU*O3qVMK+!Kk=~`j55sBJaB-!M zjhfKDJGbz-8ux)j?SEDXUx}51WQ|OrU|8T1BzvcxJwY-kC8YYDbY(ifd}WbD#}-wd zt!}{f31I)S8Mp#Leyb34vk;%NvE2<;@hLb%#I}}7tDT_JYRC}g`Tgbd^y8)TL}(;& z(v_P-wW?MlpE~t$M7dlH525`xkj7Xd+ecP9w?|(}#(u$YriA=NXh_A*|Lc~Og4r~2 zRD)kyy#EJ^{*+E8NDlGMJhevCRfBtnu=%o+%>;`8f0z#h`K>}a<5ReAN&y^Ah9f2J zhRhQ=QrTFUL{gL{?}hPs}i!^svuB&!#w}T=FqNJM{B~@(ffeCUZmt zAI~Oq^6>-uSb*!Z?$LG;>jj#CZ36edkr#epEePIM1w4@LqX za1QhYRzR3q@U}v3;YABDA8Y~WN_vfCrzvKfew=}_tUY>&l5=w4;T?G75FyJnF*B!5 z4Oxffax)^FE+9uBCl|~+^Jsd9PGk#{zW*W|Du>Q7#=p8k*h(~?(+gP2R#@kqw{Oa) z4I+_esYcxhcb5m)i;n}-!F|vLu*LjNA@A^6A28|jcZV>UN+?m4PSBG|MEYpRxv&tr z9Qq6q1@{Hfj@HQIx?)2eN6R{O2+5GJ&#T0EI)k1e%v1@J zxQ6gE?P}MdYY{K#6VF-L(!Ta^5w86Ck8o}%9FxE!Pae^u=qNJ8{mb>`-SdkI?6B8! zupd+dC%`PgZU2=*Jn(@p2mzeP6dFFz| zuA>VMfid7_E(Jd$9Wqy;;Yio(*QgCs6j5+eBCHC1z!B!3R0vxi?hB5K%HUJ(!>Un7 z;R%?DQU`xgp7(GMI|8g9t-~FI=i7TMG-SX=^L&lb)ALH!7ltS|bdr*41kW-@T86b7xCqOZq1j!dI&} zKZfV|H!mp-(aplZK+oOIagcB`Wo0m7!H;mHxdL24M^;32z&mXK2{4Dy#(e@#bS1MdQA>I#;4nHq0q1>;@keg^Qy>G#l^`x&_*>LW)2( z;32aL7=Vc&3a;2PPg!ikCKQb} zPE#Gl9YD9tH9!%0r4Tp|V~;tbqO#$9p$M*O2_`8bdyYsDc4+0N|A#fg%HVP&Pe3tDETM!W zv;C>5vkUS=9SmGXC8edJQnjYs>0#jvZmbz#f1+Xq8~_;j!jgj@upJKUQ1BK511Wq7 zH-?A9FWoD&2^Z#zLqU2n)+?S%pvFmfJmI;4A`kb_z{C(9em6`C46q~40hbe zm#p!O=jgIk)ZU}oFIPnA0{4wagsM^wCP=6RML1%c3^KVTe8=oK(E_1X3g1^2S*$8i zVV0YwrzdqTR+Ykipoe+LAp8mq<9tGcLxcvFH!=r92EGUTLC@@Opb&i_svwtR#qb~& zl=zjcq(aGD%w}H|9*XizRXV(66?wrjDg+Z%3<18^GR#G_PI$qN^aMx(p}>_bWH4|6 ztw1jjjzgq)T85g6Hb=~-zz1a-R)`o*(wYo7tRevu94s!P608Th;_Q$WQEm!?0ytW+ zm|{H3c(}3Ud`;n-<6h@5&vloOXXM%3n{KY#@+)QVB{2;_AzXxh5vlMvG#(#0fcAj> zfdyE>cUu>91nmH)?#R#a zBvmfg|A4(<>H?gH@r^3E1^gk-Dm=aKf^8}avkvA)MmmJu2WZ$_E+0DD*ut=Ks0@!C zgA)@e3u*X(ww=gr&=7Qz93uf2Vt>Jn zcy?@XA7_dGyr&sqBzVnb-n|H z1gDvk3yKgTQgTg%=R};(R0z6E5LQwJ?5r_CM0J=X2&ayy&9?HcO}#NZTX}d87S&W7 zEo=)=5IXVbK5aO67W1woO#e-hWjG_CCQ<#$l?11rRgka7qm+*(3PaRL^ec|%Nv$BP z5LUtqFi-ddeZkr@#2AG_QsfGGe6dF3f+bLdCt7sGAkfML|4c0IDi=3I!xBM^;PuH6SR$I)V~D!KSGhxJa!$d&5a>=A#u+G7hkkfZm!CYQ z3z4rVKOae<9+bsp2T>U*v}I&(VMU3_$>a{DUSGJ3Y*F_`uJj1cp}lZ7Jdxc6=7Q@$ zkUvrg=i&80sz#$pC@3!KsuhW@aMZBCoaKwLC!FB)i!fTbcbCwRi{E}vOOG9*E$5Ky zSYQrQq@=3ITlP+#L9OdG5cX%ER0Pwugat_1`TmJ;r(gjN6(Yakxlk;IW;m=XG%k)p zVxmxE!TgGI5Llhy#Pjk=hR&$Q3vJ-UQ{Zo&K6*flF=UsF7)`lKrB+?4T4rZyh2I+r z1u<`2p2O`C@C5uu{pGcgo%muTc#iPvEs;oqRi)|&>N1^oiL``LF{d%aaNr6$OMg7j zZnu65UBCk?1;%-O6oV)S4`h(VD3{DI9ANf*ypW>9V)UeXpsCRFvAs%k4dPn=E;*4C6=P@uunfyoNFA`MnQ6>VDxSo52}&)_-8 z{H+h^j}K=7&g;>ILTT*-$^cQQL(WAwURN1C^cdy1eiKJi8YX>qHEU7Zy7j3m)_ygs zUW43tJbxirYDJG?qET}-raGS&&lJM*4_&c@uD^~TEu6LRh>=4urq|`!Ki?+=c?{1^ zt&I)I9=U`gEUZ2fu@<{?#4dG?f+j~q+OMvM_= z>IKT;)5iMpQ3i5(Gwe7FJOCpBkCJu(=FG+_m?ys!gl%>&;4sA2G6+lqE~trE!XaKU zkn1-!g%4SA`UEZCy906F25!GtFmMmtPN;krTDFH)Kuq4!N zg)OJ_!Oy86HTIU)3&{C*Q%e{_#_!kG@~ z-H%*Rb#pMapf005@$kh#7$rE*u3}nif->$^;V}+TaAp)j|m2eZpf;{jZ_ya_OKUN4Q8@B+u zURdMF?*)zKDT~sv%6Kk%Zykrt43q$T7S5-z)C82JYY1bTQd4PU%T_eryA5@iHv_BO zV8$53l#ocHyZ52ZezUP`0zLy0`u;u5KeU(3U;%REAcdt$gjg*VWB#KmDZ(V#YMg`zi}8iZi2NG~i4P5mOw zcf#4e2dQ8NVC4w%+abdrBCrc%3f@c@EYpv%ZA3$Wra3)QouSbjN-Ym^ZQ2{dTU z3X015gkQOM2$o`9P)H}{EvDD#QNNu5ST0)!m&Ud6`9&)EgoP6r=}40g!s<#hd4 zAQs%Xm(OvyX2OLieyqWbhoXdBgXcb+bFgBNYY34DnW*rd9WQDjl8+y0$IJyZ!KW*} z)=_+BW-NwCKO|%kLd8zF>MwuTRM|zamHZ;VjWYZN4`enY9%HNwv{ERq1;O-c;>73S zDDR+()*e+5duKf0ZjS~&cojkENSfFhiqW&_F!iw=eCQ<!gW|fz_nT~39>R+SP>P<;P;&3vd>6PB*Xkd+T}N& z#&zx@ECv6VmzSAUR5;AW#Pk`KRQX|VAMgxl01G?O@~OD+w*1c@DWu}-BD_Gi3Uz|> z*di?yp6b;{L!QA}?&m6t+aQIg5t`^l);at4|&g*1RImK*9$HTOMv;0qpdD?f8Y`gxrLeKA;mE z%&h46yhYT{%Uj57lX9}On7mDPvb4H{2^^NYiCW>HE+7J=l%L>_|NfamFa`u`d5-N{ z&=Pop-5?v&{VQ-(*APOzC1R1C6?)YNvt0?=9s1@CsWD6ake*83unaR}a|*+Qa)Pgb z`A}+7GIeXxjEp(gfVg1JVu~no`QBahIC>o`83o@UeEaziCulsJSXe>uUlJ(2E3SEL z<~(W&2daXCQgd?)Fy|VCMR%t#IrV@t*nwg^3JZ{jV9N>E2k?jTXA0p1*sPMl3BU?r zZ@dw}DUbvewI>+E?0}nLsip&4K~FTaZQXhliwWPG*RSb0au!eIDy3*kS|)Ui@R$-G zhnc@x$X~F)7KalxLN>{3*KXa${qry|#gJhi!ATh_gM}@K>n#Y`uBgC$j~rwD=x@jn ziCn%gM=H%kX5HV$#N-RFO;AU|Kny=nZ|eSMtjChq}H|S2t}-{ zf&%uAPhmLy6#Dv4@hgd;I3+ilz4vT@0*oNv;_q32(DcXhR|=^(3La0;c09ITU;@|* z!nCjogtJU6s5y;}OhvV-E_{nQ|2(Xbt1C_D)`J}2Gca?;Y7{9IA~Y)1C8R+r{`2Ge z)t&~xAL%3SW9+z-=tbin%b=wt%p_gZtRJPq=K@c zD5UHuC>;ct85xbkvW-+IV>s?>Jm5~N0y+Zj%yHlahy(vt{wVDJyPe_gfB9AR9K7bC zQz7Ues)4Nc1M(CDINbH9rM6LN)y`H%CSs${l_?#v(%XnecjIH}J@SipAL?OKJ1qz2HmEjiyWf$OE7@_!sHKJt$P}TA^ zl^e(usD<*AzzWGzsVO4<1JZK?VF5pXuECr}4^;^+7_pQA_8?r}Mdq5Ck(2e-*wFC0 zfkJUwUo1_)PeCm4H8MY;gQ{Z7%Gd_j|6K(&!BUU}{!;#1h5XS8yW+zmU^_4eTxaM2 z8iRMRlmfLzH4?v79*By!6pE^+Cze*SMtJ4M;uj3uP~jmGSNE}gLwHJ939Fp7c%7b` zn~h&%J;N`w!t71W&*c^5hnXM>AzZUbjRHLZ`-Pn#6dVGZ!Ck-|$C2evLoL4lMZShY zZsKg*c=nFmE9_tDf^HZ>cM&0$z~RPlsN@G;m>||G)s;2EuQ0s|mBj|RN<8n=Y2DO1 zjT#T2^-vX;IG9_!z>gDO=Bi3Eu}1b)PF~(S{5D401ljE81Ry&{kCHQ*ZZi!O!=g;pWg z4@3d`7D@^o@cAfk4BP=c1o{5#;3rbSIJ_jN!6*;|c)wHN zHdqeWf>^lz!coBnun$=ZngjMvYES^?0aNe^up|F!@<&mI69v8*zIf(WxRMO#;G~Wl z!VZ!BNd>F%njNAoSO-`Eae$S;!(=>I0+724!{{ZpJUsZ`{t-dWQ&whh+Q;$8^mOh` O>e8`ihjZ;lefxilbd_rW literal 0 HcmV?d00001 diff --git a/src/components/baInput/components/remoteSelect.vue b/src/components/baInput/components/remoteSelect.vue index 6c71a374..a101f604 100644 --- a/src/components/baInput/components/remoteSelect.vue +++ b/src/components/baInput/components/remoteSelect.vue @@ -1,310 +1,310 @@ - - - - - + + + + + diff --git a/src/components/echarts/waveForm.vue b/src/components/echarts/waveForm.vue index 84727ef4..acd047d5 100644 --- a/src/components/echarts/waveForm.vue +++ b/src/components/echarts/waveForm.vue @@ -1,190 +1,190 @@ - - - + + + diff --git a/src/components/table/index.vue b/src/components/table/index.vue index 54817a52..18b96052 100644 --- a/src/components/table/index.vue +++ b/src/components/table/index.vue @@ -1,43 +1,24 @@ @@ -80,13 +56,13 @@ const key = ref(0) interface Props extends /* @vue-ignore */ Partial> { isGroup?: boolean showOverflow?: boolean - height?: string | boolean + height?: string | number } const props = withDefaults(defineProps(), { isGroup: false, showOverflow: true, - height: false + height: undefined }) onMounted(() => { tableStore.table.ref = tableRef.value as VxeTableInstance diff --git a/src/components/tree/pqs/Terminal.vue b/src/components/tree/pqs/Terminal.vue index dab14c13..3a797509 100644 --- a/src/components/tree/pqs/Terminal.vue +++ b/src/components/tree/pqs/Terminal.vue @@ -1,197 +1,197 @@ - - - - + + + + diff --git a/src/layouts/admin/container/classic.vue b/src/layouts/admin/container/classic.vue index 8cffe645..a0afa101 100644 --- a/src/layouts/admin/container/classic.vue +++ b/src/layouts/admin/container/classic.vue @@ -1,33 +1,33 @@ - - - - - + + + + + diff --git a/src/utils/auth.ts b/src/utils/auth.ts index c68a67a9..237ea3d1 100644 --- a/src/utils/auth.ts +++ b/src/utils/auth.ts @@ -1,71 +1,70 @@ -import { useCache, CACHE_KEY } from '@/hooks/web/useCache' -import { TokenType } from '@/api/login/types' -import { decrypt, encrypt } from '@/utils/jsencrypt' - -const { wsCache } = useCache() - -const AccessTokenKey = 'ACCESS_TOKEN' -const RefreshTokenKey = 'REFRESH_TOKEN' - -// 获取token -export const getAccessToken = () => { - // 此处与TokenKey相同,此写法解决初始化时Cookies中不存在TokenKey报错 - return wsCache.get(AccessTokenKey) ? wsCache.get(AccessTokenKey) : wsCache.get('ACCESS_TOKEN') -} - -// 刷新token -export const getRefreshToken = () => { - return wsCache.get(RefreshTokenKey) -} - -// 设置token -export const setToken = (token: TokenType) => { - wsCache.set(RefreshTokenKey, token.refreshToken) - wsCache.set(AccessTokenKey, token.accessToken) -} - -// 删除token -export const removeToken = () => { - wsCache.delete(AccessTokenKey) - wsCache.delete(RefreshTokenKey) -} - -/** 格式化token(jwt格式) */ -export const formatToken = (token: string): string => { - return 'Bearer ' + token -} -// ========== 账号相关 ========== - -export type LoginFormType = { - tenantName: string - username: string - password: string - rememberMe: boolean -} - -export const getLoginForm = () => { - const loginForm: LoginFormType = wsCache.get(CACHE_KEY.LoginForm) - if (loginForm) { - loginForm.password = decrypt(loginForm.password) as string - } - return loginForm -} - -export const setLoginForm = (loginForm: LoginFormType) => { - loginForm.password = encrypt(loginForm.password) as string - wsCache.set(CACHE_KEY.LoginForm, loginForm, { exp: 30 * 24 * 60 * 60 }) -} - -export const removeLoginForm = () => { - wsCache.delete(CACHE_KEY.LoginForm) -} - -// ========== 租户相关 ========== - -export const getTenantId = () => { - return wsCache.get(CACHE_KEY.TenantId) -} - -export const setTenantId = (username: string) => { - wsCache.set(CACHE_KEY.TenantId, username) -} +import { useCache, CACHE_KEY } from '@/hooks/web/useCache' +import { decrypt, encrypt } from '@/utils/jsencrypt' + +const { wsCache } = useCache() + +const AccessTokenKey = 'ACCESS_TOKEN' +const RefreshTokenKey = 'REFRESH_TOKEN' + +// 获取token +export const getAccessToken = () => { + // 此处与TokenKey相同,此写法解决初始化时Cookies中不存在TokenKey报错 + return wsCache.get(AccessTokenKey) ? wsCache.get(AccessTokenKey) : wsCache.get('ACCESS_TOKEN') +} + +// 刷新token +export const getRefreshToken = () => { + return wsCache.get(RefreshTokenKey) +} + +// 设置token +export const setToken = (token: any) => { + wsCache.set(RefreshTokenKey, token.refreshToken) + wsCache.set(AccessTokenKey, token.accessToken) +} + +// 删除token +export const removeToken = () => { + wsCache.delete(AccessTokenKey) + wsCache.delete(RefreshTokenKey) +} + +/** 格式化token(jwt格式) */ +export const formatToken = (token: string): string => { + return 'Bearer ' + token +} +// ========== 账号相关 ========== + +export type LoginFormType = { + tenantName: string + username: string + password: string + rememberMe: boolean +} + +export const getLoginForm = () => { + const loginForm: LoginFormType = wsCache.get(CACHE_KEY.LoginForm) + if (loginForm) { + loginForm.password = decrypt(loginForm.password) as string + } + return loginForm +} + +export const setLoginForm = (loginForm: LoginFormType) => { + loginForm.password = encrypt(loginForm.password) as string + wsCache.set(CACHE_KEY.LoginForm, loginForm, { exp: 30 * 24 * 60 * 60 }) +} + +export const removeLoginForm = () => { + wsCache.delete(CACHE_KEY.LoginForm) +} + +// ========== 租户相关 ========== + +export const getTenantId = () => { + return wsCache.get(CACHE_KEY.TenantId) +} + +export const setTenantId = (username: string) => { + wsCache.set(CACHE_KEY.TenantId, username) +} diff --git a/src/utils/echartMethod.ts b/src/utils/echartMethod.ts index 8af8e287..408d7ddf 100644 --- a/src/utils/echartMethod.ts +++ b/src/utils/echartMethod.ts @@ -1,159 +1,302 @@ -const dataProcessing = (arr: any[]) => { - return arr - .filter(item => typeof item === 'number' || (typeof item === 'string' && !isNaN(parseFloat(item)))) - .map(item => (typeof item === 'number' ? item : parseFloat(item))) -} -const calculateValue = (o: number, value: number, num: number, isMin: boolean) => { - if (value === 0) { - return 0 - } else if (value > 0 && Math.abs(value) < 1 && isMin == true) { - return 0 - } else if (value > -1 && value < 0 && isMin == false) { - return 0 - } - let base - if (Math.abs(o) >= 100) { - base = 100 - } else if (Math.abs(o) >= 10) { - base = 10 - } else if (Math.abs(o) >= 1) { - base = 1 - } else { - base = 0.1 - } - let calculatedValue - if (isMin) { - if (value < 0) { - calculatedValue = value + num * value - } else { - calculatedValue = value - num * value - } - } else { - if (value < 0) { - calculatedValue = value - num * value - } else { - calculatedValue = value + num * value - } - } - if (base === 0.1) { - return parseFloat(calculatedValue.toFixed(1)) - } else if (isMin) { - return Math.floor(calculatedValue / base) * base - } else { - return Math.ceil(calculatedValue / base) * base - } -} - -// 处理y轴最大最小值 -export const yMethod = (arr: any) => { - let num = 0.1 - let numList = dataProcessing(arr) - let maxValue = 0 - let minValue = 0 - let max = 0 - let min = 0 - maxValue = Math.max(...numList) - minValue = Math.min(...numList) - const o = maxValue - minValue - if (Math.abs(o) >= 300) { - num = 0.02 - } - - min = calculateValue(o, minValue, num, true) - max = calculateValue(o, maxValue, num, false) - // if (-100 >= minValue) { - // min = Math.floor((minValue + num * minValue) / 100) * 100 - // } else if (-10 >= minValue && minValue > -100) { - // min = Math.floor((minValue + num * minValue) / 10) * 10 - // } else if (-1 >= minValue && minValue > -10) { - // min = Math.floor(minValue + num * minValue) - // } else if (0 > minValue && minValue > -1) { - // min = parseFloat((minValue + num * minValue).toFixed(1)) - // } else if (minValue == 0) { - // min = 0 - // } else if (0 < minValue && minValue < 1) { - // min = parseFloat((minValue - num * minValue).toFixed(1)) - // } else if (1 <= minValue && minValue < 10) { - // min = Math.floor(minValue - num * minValue) - // } else if (10 <= minValue && minValue < 100) { - // min = Math.floor((minValue - num * minValue) / 10) * 10 - // } else if (100 <= minValue) { - // min = Math.floor((minValue - num * minValue) / 100) * 100 - // } - - // if (-100 >= maxValue) { - // max = Math.ceil((maxValue - num * maxValue) / 100) * 100 - // } else if (-10 >= maxValue && maxValue > -100) { - // max = Math.ceil((maxValue - num * maxValue) / 10) * 10 - // } else if (-1 >= maxValue && maxValue > -10) { - // max = Math.ceil(maxValue - num * maxValue) - // } else if (0 > maxValue && maxValue > -1) { - // max = parseFloat((maxValue - num * maxValue).toFixed(1)) - // } else if (maxValue == 0) { - // max = 0 - // } else if (0 < maxValue && maxValue < 1) { - // max = parseFloat((maxValue + num * maxValue).toFixed(1)) - // } else if (1 <= maxValue && maxValue < 10) { - // max = Math.ceil(maxValue + num * maxValue) - // } else if (10 <= maxValue && maxValue < 100) { - // max = Math.ceil((maxValue + num * maxValue) / 10) * 10 - // } else if (100 <= maxValue) { - // max = Math.ceil((maxValue + num * maxValue) / 100) * 100 - // } - - // if (maxValue > 1000 || minValue < -1000) { - // max = Math.ceil(maxValue / 100) * 100 - // if (minValue == 0) { - // min = 0 - // } else { - // min = Math.floor(minValue / 100) * 100 - // } - // } else if (maxValue < 60 && minValue > 40) { - // max = 60 - // min = 40 - // } else if (maxValue == minValue && maxValue < 10 && minValue > 0) { - // max = Math.ceil(maxValue / 10) * 10 - // min = Math.floor(minValue / 10) * 10 - // } else if (maxValue == minValue && maxValue != 0 && minValue != 0) { - // max = Math.ceil(maxValue / 10 + 1) * 10 - // min = Math.floor(minValue / 10 - 1) * 10 - // } else { - // max = Math.ceil(maxValue / 10) * 10 - // min = Math.floor(minValue / 10) * 10 - // } - - // if (maxValue > 0 && maxValue < 1) { - // max = 1 - // } else if (max == 0 && minValue > -1 && minValue < 0) { - // min = -1 - // } - - return [min, max] -} - -/** - * title['A相','B相',] - * data[[1,2],[3,4]] - */ -// 导出csv文件 -const convertToCSV = (title: object, data: any) => { - console.log('🚀 ~ convertToCSV ~ data:', data) - let csv = '' - // 添加列头 - csv += ',' + title.join(',') + '\n' - // 遍历数据并添加到CSV字符串中 - data?.map(item => { - csv += item.join(',') + '\n' - }) - return csv -} -export const exportCSV = (title: object, data: any, filename: string) => { - const csv = convertToCSV(title, data) - const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }) - const link = document.createElement('a') - link.href = URL.createObjectURL(blob) - link.download = filename - link.click() - // 释放URL对象 - URL.revokeObjectURL(link.href) -} +const dataProcessing = (arr: any[]) => { + return arr + .filter(item => typeof item === 'number' || (typeof item === 'string' && !isNaN(parseFloat(item)))) + .map(item => (typeof item === 'number' ? item : parseFloat(item))) +} +const calculateValue = (o: number, value: number, num: number, isMin: boolean) => { + if (value === 0) { + return 0 + } else if (value > 0 && Math.abs(value) < 1 && isMin == true) { + return 0 + } else if (value > -1 && value < 0 && isMin == false) { + return 0 + } + let base + if (Math.abs(o) >= 100) { + base = 100 + } else if (Math.abs(o) >= 10) { + base = 10 + } else if (Math.abs(o) >= 1) { + base = 1 + } else { + base = 0.1 + } + let calculatedValue + if (isMin) { + if (value < 0) { + calculatedValue = value + num * value + } else { + calculatedValue = value - num * value + } + } else { + if (value < 0) { + calculatedValue = value - num * value + } else { + calculatedValue = value + num * value + } + } + if (base === 0.1) { + return parseFloat(calculatedValue.toFixed(1)) + } else if (isMin) { + return Math.floor(calculatedValue / base) * base + } else { + return Math.ceil(calculatedValue / base) * base + } +} + +// 处理y轴最大最小值 +export const yMethod = (arr: any) => { + let num = 0.1 + let numList = dataProcessing(arr) + let maxValue = 0 + let minValue = 0 + let max = 0 + let min = 0 + maxValue = Math.max(...numList) + minValue = Math.min(...numList) + const o = maxValue - minValue + if (Math.abs(o) >= 300) { + num = 0.02 + } + + min = calculateValue(o, minValue, num, true) + max = calculateValue(o, maxValue, num, false) + // if (-100 >= minValue) { + // min = Math.floor((minValue + num * minValue) / 100) * 100 + // } else if (-10 >= minValue && minValue > -100) { + // min = Math.floor((minValue + num * minValue) / 10) * 10 + // } else if (-1 >= minValue && minValue > -10) { + // min = Math.floor(minValue + num * minValue) + // } else if (0 > minValue && minValue > -1) { + // min = parseFloat((minValue + num * minValue).toFixed(1)) + // } else if (minValue == 0) { + // min = 0 + // } else if (0 < minValue && minValue < 1) { + // min = parseFloat((minValue - num * minValue).toFixed(1)) + // } else if (1 <= minValue && minValue < 10) { + // min = Math.floor(minValue - num * minValue) + // } else if (10 <= minValue && minValue < 100) { + // min = Math.floor((minValue - num * minValue) / 10) * 10 + // } else if (100 <= minValue) { + // min = Math.floor((minValue - num * minValue) / 100) * 100 + // } + + // if (-100 >= maxValue) { + // max = Math.ceil((maxValue - num * maxValue) / 100) * 100 + // } else if (-10 >= maxValue && maxValue > -100) { + // max = Math.ceil((maxValue - num * maxValue) / 10) * 10 + // } else if (-1 >= maxValue && maxValue > -10) { + // max = Math.ceil(maxValue - num * maxValue) + // } else if (0 > maxValue && maxValue > -1) { + // max = parseFloat((maxValue - num * maxValue).toFixed(1)) + // } else if (maxValue == 0) { + // max = 0 + // } else if (0 < maxValue && maxValue < 1) { + // max = parseFloat((maxValue + num * maxValue).toFixed(1)) + // } else if (1 <= maxValue && maxValue < 10) { + // max = Math.ceil(maxValue + num * maxValue) + // } else if (10 <= maxValue && maxValue < 100) { + // max = Math.ceil((maxValue + num * maxValue) / 10) * 10 + // } else if (100 <= maxValue) { + // max = Math.ceil((maxValue + num * maxValue) / 100) * 100 + // } + + // if (maxValue > 1000 || minValue < -1000) { + // max = Math.ceil(maxValue / 100) * 100 + // if (minValue == 0) { + // min = 0 + // } else { + // min = Math.floor(minValue / 100) * 100 + // } + // } else if (maxValue < 60 && minValue > 40) { + // max = 60 + // min = 40 + // } else if (maxValue == minValue && maxValue < 10 && minValue > 0) { + // max = Math.ceil(maxValue / 10) * 10 + // min = Math.floor(minValue / 10) * 10 + // } else if (maxValue == minValue && maxValue != 0 && minValue != 0) { + // max = Math.ceil(maxValue / 10 + 1) * 10 + // min = Math.floor(minValue / 10 - 1) * 10 + // } else { + // max = Math.ceil(maxValue / 10) * 10 + // min = Math.floor(minValue / 10) * 10 + // } + + // if (maxValue > 0 && maxValue < 1) { + // max = 1 + // } else if (max == 0 && minValue > -1 && minValue < 0) { + // min = -1 + // } + + return [min, max] +} + +/** + * title['A相','B相',] + * data[[1,2],[3,4]] + */ +// 导出csv文件 +const convertToCSV = (title: object, data: any) => { + console.log('🚀 ~ convertToCSV ~ data:', data) + let csv = '' + // 添加列头 + csv += ',' + title.join(',') + '\n' + // 遍历数据并添加到CSV字符串中 + data?.map(item => { + csv += item.join(',') + '\n' + }) + return csv +} +export const exportCSV = (title: object, data: any, filename: string) => { + const csv = convertToCSV(title, data) + const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }) + const link = document.createElement('a') + link.href = URL.createObjectURL(blob) + link.download = filename + link.click() + // 释放URL对象 + URL.revokeObjectURL(link.href) +} + + + +/** + * 补全时间序列数据中缺失的条目 + * @param rawData 原始数据,格式为 [["时间字符串", "数值", "单位", "类型"], ...] + * @returns 补全后的数据,缺失条目数值为 null + */ +export const completeTimeSeries = (rawData: string[][]): (string | null)[][] => { + // 步骤1:校验原始数据并解析时间 + if (rawData.length < 2) { + console.warn('数据量不足2条,无法计算时间间隔,直接返回原始数据') + return rawData.map(item => [...item]) + } + + // 解析所有时间为Date对象,过滤无效时间并按时间排序 + const validData = rawData + .map(item => { + // 确保至少有时间和数值字段 + if (!item[0]) { + return { time: new Date(0), item, isValid: false } + } + const time = new Date(item[0]) + return { time, item, isValid: !isNaN(time.getTime()) } + }) + .filter(data => data.isValid) + .sort((a, b) => a.time.getTime() - b.time.getTime()) // 确保数据按时间排序 + .map(data => data.item) + + if (validData.length < 2) { + throw new Error('有效时间数据不足2条,无法继续处理') + } + + // 步骤2:计算时间间隔(分析前几条数据确定最可能的间隔) + const intervals: number[] = [] + // 分析前10条数据来确定间隔,避免单一间隔出错 + const analyzeCount = Math.min(10, validData.length - 1) + for (let i = 0; i < analyzeCount; i++) { + const currentTime = new Date(validData[i][0]!).getTime() + const nextTime = new Date(validData[i + 1][0]!).getTime() + const interval = nextTime - currentTime + if (interval > 0) { + intervals.push(interval) + } + } + + // 取最常见的间隔作为标准间隔 + const timeInterval = getMostFrequentValue(intervals) + if (timeInterval <= 0) { + throw new Error('无法确定有效的时间间隔') + } + + // 步骤3:生成完整的时间序列范围(从第一条到最后一条) + const startTime = new Date(validData[0][0]!).getTime() + const endTime = new Date(validData[validData.length - 1][0]!).getTime() + const completeTimes: Date[] = [] + + // 生成从 startTime 到 endTime 的所有间隔时间点 + for (let time = startTime; time <= endTime; time += timeInterval) { + completeTimes.push(new Date(time)) + } + + // 步骤4:将原始数据转为时间映射表,使用精确的时间字符串匹配 + const timeDataMap = new Map() + validData.forEach(item => { + // 使用原始时间字符串作为键,避免格式转换导致的匹配问题 + if (item[0]) { + timeDataMap.set(item[0], item) + } + }) + + // 提取模板数据(从第一条有效数据中提取单位和类型,处理可能的缺失) + const template = validData[0] + + // 步骤5:对比补全数据,缺失条目数值为 null + const completedData = completeTimes.map(time => { + // 保持与原始数据相同的时间格式 + const timeStr = formatTime(time) + const existingItem = timeDataMap.get(timeStr) + + if (existingItem) { + // 存在该时间,返回原始数据 + return [...existingItem] + } else { + // 缺失该时间,数值设为 null,其他字段沿用第一个有效数据的格式 + // 处理可能缺失的单位和类型字段 + const result: (string | null | undefined)[] = [timeStr, '/'] + // 仅在原始数据有单位字段时才添加 + if (template.length > 2) { + result.push(template[2]) + } + // 仅在原始数据有类型字段时才添加 + if (template.length > 3) { + result.push(template[3]) + } + return result + } + }) + + return completedData +} + +/** + * 格式化时间为 "YYYY-MM-DD HH:mm:ss" 格式 + * @param date 日期对象 + * @returns 格式化后的时间字符串 + */ +function formatTime(date: Date): string { + const year = date.getFullYear() + const month = String(date.getMonth() + 1).padStart(2, '0') + const day = String(date.getDate()).padStart(2, '0') + const hours = String(date.getHours()).padStart(2, '0') + const minutes = String(date.getMinutes()).padStart(2, '0') + const seconds = String(date.getSeconds()).padStart(2, '0') + + return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}` +} + +/** + * 获取数组中出现频率最高的值 + * @param arr 数字数组 + * @returns 出现频率最高的值 + */ +function getMostFrequentValue(arr: number[]): number { + if (arr.length === 0) return 0 + + const frequencyMap = new Map() + arr.forEach(num => { + frequencyMap.set(num, (frequencyMap.get(num) || 0) + 1) + }) + + let maxFrequency = 0 + let mostFrequent = arr[0] + + frequencyMap.forEach((frequency, num) => { + if (frequency > maxFrequency) { + maxFrequency = frequency + mostFrequent = num + } + }) + + return mostFrequent +} diff --git a/src/utils/router.ts b/src/utils/router.ts index a9ea05ff..65610d61 100644 --- a/src/utils/router.ts +++ b/src/utils/router.ts @@ -1,295 +1,295 @@ -import router from '@/router/index' -import { isNavigationFailure, NavigationFailureType } from 'vue-router' -import type { RouteRecordRaw, RouteLocationRaw } from 'vue-router' -import { ElNotification } from 'element-plus' -import { useConfig } from '@/stores/config' -import { useNavTabs } from '@/stores/navTabs' -import { closeShade } from '@/utils/pageShade' -import { adminBaseRoute } from '@/router/static' -import { compact, isEmpty, reverse } from 'lodash-es' -import { isAdminApp } from '@/utils/common' - -/** - * 导航失败有错误消息的路由push - * @param to — 导航位置,同 router.push - */ -export const routePush = async (to: RouteLocationRaw) => { - try { - const failure = await router.push(to) - if (isNavigationFailure(failure, NavigationFailureType.aborted)) { - ElNotification({ - message: 'utils.Navigation failed, navigation guard intercepted!', - type: 'error' - }) - } else if (isNavigationFailure(failure, NavigationFailureType.duplicated)) { - // ElNotification({ - // message: '已在目标页', - // type: 'warning' - // }) - } - } catch (error) { - ElNotification({ - message: '导航失败,路由无效', - type: 'error' - }) - console.error(error) - } -} - -/** - * 获取第一个菜单 - */ -export const getFirstRoute = (routes: RouteRecordRaw[], menuType = 'tab'): false | RouteRecordRaw => { - const routerPaths: string[] = [] - const routers = router.getRoutes() - routers.forEach(item => { - if (item.path) routerPaths.push(item.path) - }) - let find: boolean | RouteRecordRaw = false - for (const key in routes) { - if ( - routes[key].meta?.type == 'menu' && - routes[key].meta?.menu_type == menuType && - routerPaths.indexOf(routes[key].path) !== -1 - ) { - return routes[key] - } else if (routes[key].children && routes[key].children?.length) { - find = getFirstRoute(routes[key].children!) - if (find) return find - } - } - return find -} - -/** - * 打开侧边菜单 - * @param menu 菜单数据 - */ -export const onClickMenu = (menu: RouteRecordRaw) => { - switch (menu.meta?.menu_type) { - case 'iframe': - case 'tab': - routePush({ path: menu.path }) - break - case 'link': - window.open(menu.path, '_blank') - break - - default: - ElNotification({ - message: 'utils.Navigation failed, the menu type is unrecognized!', - type: 'error' - }) - break - } - - const config = useConfig() - if (config.layout.shrink) { - closeShade(() => { - config.setLayout('menuCollapse', true) - }) - } -} - -/** - * 处理后台的路由 - */ -export const handleAdminRoute = (routes: any) => { - const viewsComponent = import.meta.glob('/src/views/**/*.vue') - addRouteAll(viewsComponent, routes, adminBaseRoute.name as string) - const menuAdminBaseRoute = (adminBaseRoute.path as string) + '/' - // 更新stores中的路由菜单数据 - const navTabs = useNavTabs() - navTabs.setTabsViewRoutes(handleMenuRule(routes, menuAdminBaseRoute)) - navTabs.fillAuthNode(handleAuthNode(routes, menuAdminBaseRoute)) -} - -/** - * 获取菜单的paths - */ -export const getMenuPaths = (menus: RouteRecordRaw[]): string[] => { - let menuPaths: string[] = [] - menus.forEach(item => { - menuPaths.push(item.path) - if (item.children && item.children.length > 0) { - menuPaths = menuPaths.concat(getMenuPaths(item.children)) - } - }) - return menuPaths -} - -/** - * 后台的菜单处理 - */ -const handleMenuRule = (routes: any, pathPrefix = '/', type = ['menu', 'menu_dir']) => { - const menuRule: RouteRecordRaw[] = [] - for (const key in routes) { - if (routes[key].extend == 'add_rules_only') { - continue - } - if (!type.includes(routes[key].type)) { - continue - } - if (routes[key].type == 'menu_dir' && routes[key].children && !routes[key].children.length) { - continue - } - if ( - ['route', 'menu', 'nav_user_menu', 'nav'].includes(routes[key].type) && - ((routes[key].menu_type == 'tab' && !routes[key].component) || - (['link', 'iframe'].includes(routes[key].menu_type) && !routes[key].url)) - ) { - continue - } - const currentPath = ['link', 'iframe'].includes(routes[key].menu_type) - ? routes[key].url - : pathPrefix + routes[key].path - let children: RouteRecordRaw[] = [] - if (routes[key].children && routes[key].children.length > 0) { - children = handleMenuRule(routes[key].children, pathPrefix, type) - } - menuRule.push({ - path: currentPath, - name: routes[key].name, - component: routes[key].component, - meta: { - id: routes[key].id, - title: routes[key].title, - icon: routes[key].icon, - keepalive: routes[key].keepalive, - menu_type: routes[key].menu_type, - type: routes[key].type - }, - children: children - }) - } - return menuRule -} - -/** - * 处理权限节点 - * @param routes 路由数据 - * @param prefix 节点前缀 - * @returns 组装好的权限节点 - */ -const handleAuthNode = (routes: any, prefix = '/') => { - const authNode: Map = new Map([]) - assembleAuthNode(routes, authNode, prefix, prefix) - return authNode -} -const assembleAuthNode = (routes: any, authNode: Map, prefix = '/', parent = '/') => { - const authNodeTemp = [] - for (const key in routes) { - if (routes[key].type == 'button') authNodeTemp.push(prefix + routes[key].name) - if (routes[key].children && routes[key].children.length > 0) { - assembleAuthNode(routes[key].children, authNode, prefix, prefix + routes[key].name) - } - } - if (authNodeTemp && authNodeTemp.length > 0) { - authNode.set(parent, authNodeTemp) - } -} - -/** - * 动态添加路由-带子路由 - * @param viewsComponent - * @param routes - * @param parentName - * @param analyticRelation 根据 name 从已注册路由分析父级路由 - */ -export const addRouteAll = ( - viewsComponent: Record, - routes: any, - parentName: string, - analyticRelation = false -) => { - for (const idx in routes) { - if (routes[idx].extend == 'add_menu_only') { - continue - } - if ( - (routes[idx].menu_type == 'tab' && viewsComponent[routes[idx].component]) || - routes[idx].menu_type == 'iframe' - ) { - addRouteItem(viewsComponent, routes[idx], parentName, analyticRelation) - } - - if (routes[idx].children && routes[idx].children.length > 0) { - addRouteAll(viewsComponent, routes[idx].children, parentName, analyticRelation) - } - } -} - -/** - * 动态添加路由 - * @param viewsComponent - * @param route - * @param parentName - * @param analyticRelation 根据 name 从已注册路由分析父级路由 - */ -export const addRouteItem = ( - viewsComponent: Record, - route: any, - parentName: string, - analyticRelation: boolean -) => { - let path = '', - component - if (route.menu_type == 'iframe') { - path = (isAdminApp() ? adminBaseRoute.path : '') + '/iframe/' + encodeURIComponent(route.url) - component = () => import('@/layouts/common/router-view/iframe.vue') - } else { - path = parentName ? route.path : '/' + route.path - component = viewsComponent[route.component] - } - - if (route.menu_type == 'tab' && analyticRelation) { - const parentNames = getParentNames(route.name) - if (parentNames.length) { - for (const key in parentNames) { - if (router.hasRoute(parentNames[key])) { - parentName = parentNames[key] - break - } - } - } - } - - const routeBaseInfo: RouteRecordRaw = { - path: path, - name: route.name, - component: component, - meta: { - ...route, - title: route.title, - extend: route.extend, - icon: route.icon, - keepalive: route.keepalive, - menu_type: route.menu_type, - type: route.type, - url: route.url, - addtab: true - } - } - if (parentName) { - router.addRoute(parentName, routeBaseInfo) - } else { - router.addRoute(routeBaseInfo) - } -} - -/** - * 根据name字符串,获取父级name组合的数组 - * @param name - */ -const getParentNames = (name: string) => { - const names = compact(name.split('/')) - const tempNames = [] - const parentNames = [] - for (const key in names) { - tempNames.push(names[key]) - if (parseInt(key) != names.length - 1) { - parentNames.push(tempNames.join('/')) - } - } - return reverse(parentNames) -} +import router from '@/router/index' +import { isNavigationFailure, NavigationFailureType } from 'vue-router' +import type { RouteRecordRaw, RouteLocationRaw } from 'vue-router' +import { ElNotification } from 'element-plus' +import { useConfig } from '@/stores/config' +import { useNavTabs } from '@/stores/navTabs' +import { closeShade } from '@/utils/pageShade' +import { adminBaseRoute } from '@/router/static' +import { compact, isEmpty, reverse } from 'lodash-es' +import { isAdminApp } from '@/utils/common' + +/** + * 导航失败有错误消息的路由push + * @param to — 导航位置,同 router.push + */ +export const routePush = async (to: RouteLocationRaw) => { + try { + const failure = await router.push(to) + if (isNavigationFailure(failure, NavigationFailureType.aborted)) { + ElNotification({ + message: 'utils.Navigation failed, navigation guard intercepted!', + type: 'error' + }) + } else if (isNavigationFailure(failure, NavigationFailureType.duplicated)) { + // ElNotification({ + // message: '已在目标页', + // type: 'warning' + // }) + } + } catch (error) { + ElNotification({ + message: '导航失败,路由无效', + type: 'error' + }) + console.error(error) + } +} + +/** + * 获取第一个菜单 + */ +export const getFirstRoute = (routes: RouteRecordRaw[], menuType = 'tab'): false | RouteRecordRaw => { + const routerPaths: string[] = [] + const routers = router.getRoutes() + routers.forEach(item => { + if (item.path) routerPaths.push(item.path) + }) + let find: boolean | RouteRecordRaw = false + for (const key in routes) { + if ( + routes[key].meta?.type == 'menu' && + routes[key].meta?.menu_type == menuType && + routerPaths.indexOf(routes[key].path) !== -1 + ) { + return routes[key] + } else if (routes[key].children && routes[key].children?.length) { + find = getFirstRoute(routes[key].children!) + if (find) return find + } + } + return find +} + +/** + * 打开侧边菜单 + * @param menu 菜单数据 + */ +export const onClickMenu = (menu: RouteRecordRaw) => { + switch (menu.meta?.menu_type) { + case 'iframe': + case 'tab': + routePush({ path: menu.path }) + break + case 'link': + window.open(menu.path, '_blank') + break + + default: + ElNotification({ + message: 'utils.Navigation failed, the menu type is unrecognized!', + type: 'error' + }) + break + } + + const config = useConfig() + if (config.layout.shrink) { + closeShade(() => { + config.setLayout('menuCollapse', true) + }) + } +} + +/** + * 处理后台的路由 + */ +export const handleAdminRoute = (routes: any) => { + const viewsComponent = import.meta.glob('/src/views/**/*.vue') + addRouteAll(viewsComponent, routes, adminBaseRoute.name as string) + const menuAdminBaseRoute = (adminBaseRoute.path as string) + '/' + // 更新stores中的路由菜单数据 + const navTabs = useNavTabs() + navTabs.setTabsViewRoutes(handleMenuRule(routes, menuAdminBaseRoute)) + navTabs.fillAuthNode(handleAuthNode(routes, menuAdminBaseRoute)) +} + +/** + * 获取菜单的paths + */ +export const getMenuPaths = (menus: RouteRecordRaw[]): string[] => { + let menuPaths: string[] = [] + menus.forEach(item => { + menuPaths.push(item.path) + if (item.children && item.children.length > 0) { + menuPaths = menuPaths.concat(getMenuPaths(item.children)) + } + }) + return menuPaths +} + +/** + * 后台的菜单处理 + */ +const handleMenuRule = (routes: any, pathPrefix = '/', type = ['menu', 'menu_dir']) => { + const menuRule: RouteRecordRaw[] = [] + for (const key in routes) { + if (routes[key].extend == 'add_rules_only') { + continue + } + if (!type.includes(routes[key].type)) { + continue + } + if (routes[key].type == 'menu_dir' && routes[key].children && !routes[key].children.length) { + continue + } + if ( + ['route', 'menu', 'nav_user_menu', 'nav'].includes(routes[key].type) && + ((routes[key].menu_type == 'tab' && !routes[key].component) || + (['link', 'iframe'].includes(routes[key].menu_type) && !routes[key].url)) + ) { + continue + } + const currentPath = ['link', 'iframe'].includes(routes[key].menu_type) + ? routes[key].url + : pathPrefix + routes[key].path + let children: RouteRecordRaw[] = [] + if (routes[key].children && routes[key].children.length > 0) { + children = handleMenuRule(routes[key].children, pathPrefix, type) + } + menuRule.push({ + path: currentPath, + name: routes[key].name, + component: routes[key].component, + meta: { + id: routes[key].id, + title: routes[key].title, + icon: routes[key].icon, + keepalive: routes[key].keepalive, + menu_type: routes[key].menu_type, + type: routes[key].type + }, + children: children + }) + } + return menuRule +} + +/** + * 处理权限节点 + * @param routes 路由数据 + * @param prefix 节点前缀 + * @returns 组装好的权限节点 + */ +const handleAuthNode = (routes: any, prefix = '/') => { + const authNode: Map = new Map([]) + assembleAuthNode(routes, authNode, prefix, prefix) + return authNode +} +const assembleAuthNode = (routes: any, authNode: Map, prefix = '/', parent = '/') => { + const authNodeTemp = [] + for (const key in routes) { + if (routes[key].type == 'button') authNodeTemp.push(prefix + routes[key].name) + if (routes[key].children && routes[key].children.length > 0) { + assembleAuthNode(routes[key].children, authNode, prefix, prefix + routes[key].name) + } + } + if (authNodeTemp && authNodeTemp.length > 0) { + authNode.set(parent, authNodeTemp) + } +} + +/** + * 动态添加路由-带子路由 + * @param viewsComponent + * @param routes + * @param parentName + * @param analyticRelation 根据 name 从已注册路由分析父级路由 + */ +export const addRouteAll = ( + viewsComponent: Record, + routes: any, + parentName: string, + analyticRelation = false +) => { + for (const idx in routes) { + if (routes[idx].extend == 'add_menu_only') { + continue + } + if ( + (routes[idx].menu_type == 'tab' && viewsComponent[routes[idx].component]) || + routes[idx].menu_type == 'iframe' + ) { + addRouteItem(viewsComponent, routes[idx], parentName, analyticRelation) + } + + if (routes[idx].children && routes[idx].children.length > 0) { + addRouteAll(viewsComponent, routes[idx].children, parentName, analyticRelation) + } + } +} + +/** + * 动态添加路由 + * @param viewsComponent + * @param route + * @param parentName + * @param analyticRelation 根据 name 从已注册路由分析父级路由 + */ +export const addRouteItem = ( + viewsComponent: Record, + route: any, + parentName: string, + analyticRelation: boolean +) => { + let path = '', + component + if (route.menu_type == 'iframe') { + path = (isAdminApp() ? adminBaseRoute.path : '') + '/iframe/' + encodeURIComponent(route.url) + component = () => import('@/layouts/common/router-view/iframe.vue') + } else { + path = parentName ? route.path : '/' + route.path + component = viewsComponent[route.component] + } + + if (route.menu_type == 'tab' && analyticRelation) { + const parentNames = getParentNames(route.name) + if (parentNames.length) { + for (const key in parentNames) { + if (router.hasRoute(parentNames[key])) { + parentName = parentNames[key] + break + } + } + } + } + + const routeBaseInfo: RouteRecordRaw = { + path: path, + name: route.name, + component: component, + meta: { + ...route, + title: route.title, + extend: route.extend, + icon: route.icon, + keepalive: route.keepalive, + menu_type: route.menu_type, + type: route.type, + url: route.url, + addtab: true + } + } + if (parentName) { + router.addRoute(parentName, routeBaseInfo) + } else { + router.addRoute(routeBaseInfo) + } +} + +/** + * 根据name字符串,获取父级name组合的数组 + * @param name + */ +const getParentNames = (name: string) => { + const names = compact(name.split('/')) + const tempNames = [] + const parentNames = [] + for (const key in names) { + tempNames.push(names[key]) + if (parseInt(key) != names.length - 1) { + parentNames.push(tempNames.join('/')) + } + } + return reverse(parentNames) +} diff --git a/src/views/cockpit/TerminalLog.vue b/src/views/cockpit/TerminalLog.vue index 0754c047..ff05fda3 100644 --- a/src/views/cockpit/TerminalLog.vue +++ b/src/views/cockpit/TerminalLog.vue @@ -23,7 +23,7 @@ const prop = defineProps({ const dictData = useDictData() const fontdveoption = dictData.getBasicData('Dev_Ops') -const tableStore = new TableStore({ +const tableStore:any = new TableStore({ url: '/device-boot/pqsTerminalLogs/getList', method: 'POST', column: [ diff --git a/src/views/pqs/harmonicMonitoring/detailed/pollutionReport/SubstationTab.vue b/src/views/pqs/harmonicMonitoring/detailed/pollutionReport/SubstationTab.vue index 81af3a2c..d0c8cb81 100644 --- a/src/views/pqs/harmonicMonitoring/detailed/pollutionReport/SubstationTab.vue +++ b/src/views/pqs/harmonicMonitoring/detailed/pollutionReport/SubstationTab.vue @@ -399,7 +399,7 @@ const handleCurrentChange = (val: number) => { const exportEvent = () => { const allFilteredData = filteredData.value tableRef.value.exportData({ - filename: '场战级评估-污染值报告', + filename: '场站级评估-污染值报告', sheetName: 'Sheet1', type: 'xlsx', useStyle: true, diff --git a/src/views/pqs/harmonicMonitoring/monitoringPoint/online/shishishuju/index.vue b/src/views/pqs/harmonicMonitoring/monitoringPoint/online/shishishuju/index.vue index cdd3b83e..66352189 100644 --- a/src/views/pqs/harmonicMonitoring/monitoringPoint/online/shishishuju/index.vue +++ b/src/views/pqs/harmonicMonitoring/monitoringPoint/online/shishishuju/index.vue @@ -652,7 +652,7 @@ const initRadioCharts = () => { echartsData1.value.options.series[i].center = ['50%', '50%'] } } -const initEcharts = (color: string, key: number) => { +const initEcharts = (color: string, key: number, name: string) => { return { options: { tooltip: {}, @@ -731,7 +731,7 @@ const initEcharts = (color: string, key: number) => { data: [ { value: 0, - name: 'A相', + name: name, itemStyle: { color: color } @@ -744,14 +744,14 @@ const initEcharts = (color: string, key: number) => { } //渲染echarts const init = () => { -const url = (localStorage.getItem('WebSocketUrl') || 'ws://192.168.1.68:10407/api/pushMessage/') - echartsDataV1.value = initEcharts('#DAA520', 0) - echartsDataV2.value = initEcharts('#2E8B57', 0) - echartsDataV3.value = initEcharts('#A52a2a', 0) + const url = localStorage.getItem('WebSocketUrl') || 'ws://192.168.1.68:10407/api/pushMessage/' + echartsDataV1.value = initEcharts('#DAA520', 0, 'A相') + echartsDataV2.value = initEcharts('#2E8B57', 0, 'B相') + echartsDataV3.value = initEcharts('#A52a2a', 0, 'C相') - echartsDataA1.value = initEcharts('#DAA520', 1) - echartsDataA2.value = initEcharts('#2E8B57', 1) - echartsDataA3.value = initEcharts('#A52a2a', 1) + echartsDataA1.value = initEcharts('#DAA520', 1, 'A相') + echartsDataA2.value = initEcharts('#2E8B57', 1, 'B相') + echartsDataA3.value = initEcharts('#A52a2a', 1, 'C相') if (!dataSocket.socketServe) { console.error('WebSocket 客户端实例不存在') @@ -764,9 +764,7 @@ const url = (localStorage.getItem('WebSocketUrl') || 'ws://192.168.1.68:10407/ap }) } let pids = monitoringPoint.state.pid.split(',') - dataSocket.socketServe.connect( - `${url}${adminInfo.id},${monitoringPoint.state.lineId},${pids[pids.length - 2]}` - ) + dataSocket.socketServe.connect(`${url}${adminInfo.id},${monitoringPoint.state.lineId},${pids[pids.length - 2]}`) dataSocket.socketServe.registerCallBack('message', (res: any) => { txtContent.value = res.value let data = JSON.parse(res.value) diff --git a/src/views/pqs/harmonicMonitoring/monitoringPoint/online/wentaishujufenxi/index.vue b/src/views/pqs/harmonicMonitoring/monitoringPoint/online/wentaishujufenxi/index.vue index 1e521b49..8153283d 100644 --- a/src/views/pqs/harmonicMonitoring/monitoringPoint/online/wentaishujufenxi/index.vue +++ b/src/views/pqs/harmonicMonitoring/monitoringPoint/online/wentaishujufenxi/index.vue @@ -1,1941 +1,1972 @@ - - - - + + + + diff --git a/src/views/pqs/harmonicMonitoring/reportForms/statistics/index.vue b/src/views/pqs/harmonicMonitoring/reportForms/statistics/index.vue index a1aee4db..6cf5145f 100644 --- a/src/views/pqs/harmonicMonitoring/reportForms/statistics/index.vue +++ b/src/views/pqs/harmonicMonitoring/reportForms/statistics/index.vue @@ -1,170 +1,172 @@ - - - + + + diff --git a/src/views/user/login.vue b/src/views/user/login.vue index 9bfe9635..5c14d803 100644 --- a/src/views/user/login.vue +++ b/src/views/user/login.vue @@ -1,338 +1,338 @@ - - - - - + + + + +